@axiom-lattice/core 2.1.26 → 2.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +84 -42
- package/dist/index.d.ts +84 -42
- package/dist/index.js +486 -299
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +505 -319
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/base/BaseLatticeManager.ts","../src/model_lattice/ModelLattice.ts","../src/model_lattice/ModelLatticeManager.ts","../src/tool_lattice/get_current_date_time/index.ts","../src/tool_lattice/ToolLatticeManager.ts","../src/util/genUIMarkdown.ts","../src/tool_lattice/createToolApproveWrapper.ts","../src/tool_lattice/internet_search/index.ts","../src/util/genUICard.ts","../src/tool_lattice/sql/SqlDatabaseManager.ts","../src/tool_lattice/sql/list_tables_sql.ts","../src/tool_lattice/sql/info_sql.ts","../src/tool_lattice/sql/query_checker_sql.ts","../src/tool_lattice/sql/query_sql.ts","../src/tool_lattice/metrics/SemanticMetricsClient.ts","../src/tool_lattice/metrics/MetricsServerManager.ts","../src/tool_lattice/metrics/list_metrics_servers.ts","../src/tool_lattice/metrics/list_metrics_datasources.ts","../src/tool_lattice/metrics/query_metrics_list.ts","../src/tool_lattice/metrics/query_metric_definition.ts","../src/tool_lattice/metrics/query_semantic_metric_data.ts","../src/tool_lattice/metrics/query_tables_list.ts","../src/tool_lattice/metrics/query_table_definition.ts","../src/tool_lattice/code_eval/index.ts","../src/sandbox_lattice/SandboxLatticeManager.ts","../src/sandbox_lattice/utils.ts","../src/tool_lattice/code_execute_file/index.ts","../src/tool_lattice/convert_to_markdown/index.ts","../src/tool_lattice/browser/browser_navigate.ts","../src/tool_lattice/browser/browser_click.ts","../src/tool_lattice/browser/browser_get_text.ts","../src/tool_lattice/browser/browser_get_markdown.ts","../src/tool_lattice/browser/browser_evaluate.ts","../src/tool_lattice/browser/browser_screenshot.ts","../src/tool_lattice/browser/browser_scroll.ts","../src/tool_lattice/browser/browser_form_input_fill.ts","../src/tool_lattice/browser/browser_select.ts","../src/tool_lattice/browser/browser_hover.ts","../src/tool_lattice/browser/browser_go_back.ts","../src/tool_lattice/browser/browser_go_forward.ts","../src/tool_lattice/browser/browser_new_tab.ts","../src/tool_lattice/browser/browser_tab_list.ts","../src/tool_lattice/browser/browser_switch_tab.ts","../src/tool_lattice/browser/browser_close_tab.ts","../src/tool_lattice/browser/browser_close.ts","../src/tool_lattice/browser/browser_press_key.ts","../src/tool_lattice/browser/browser_read_links.ts","../src/tool_lattice/browser/browser_get_clickable_elements.ts","../src/tool_lattice/browser/browser_get_download_list.ts","../src/tool_lattice/browser/get_info.ts","../src/agent_lattice/types.ts","../src/memory_lattice/DefaultMemorySaver.ts","../src/memory_lattice/MemoryLatticeManager.ts","../src/agent_lattice/builders/state.ts","../src/agent_lattice/builders/ReActAgentGraphBuilder.ts","../src/deep_agent_new/backends/sandboxFiles.ts","../src/middlewares/codeEvalMiddleware.ts","../src/middlewares/browserMiddleware.ts","../src/middlewares/sqlMiddleware.ts","../src/middlewares/skillMiddleware.ts","../src/store_lattice/InMemoryThreadStore.ts","../src/store_lattice/InMemoryAssistantStore.ts","../src/store_lattice/FileSystemSkillStore.ts","../src/skill_lattice/skillNameValidator.ts","../src/store_lattice/InMemoryWorkspaceStore.ts","../src/store_lattice/InMemoryProjectStore.ts","../src/store_lattice/InMemoryDatabaseConfigStore.ts","../src/store_lattice/InMemoryMetricsServerConfigStore.ts","../src/store_lattice/InMemoryUserStore.ts","../src/store_lattice/InMemoryTenantStore.ts","../src/store_lattice/InMemoryUserTenantLinkStore.ts","../src/store_lattice/StoreLatticeManager.ts","../src/tool_lattice/skill/load_skills.ts","../src/tool_lattice/skill/load_skill_content.ts","../src/tool_lattice/skill/load_skill_resource.ts","../src/deep_agent_new/middleware/fs.ts","../src/deep_agent_new/backends/utils.ts","../src/deep_agent_new/backends/state.ts","../src/middlewares/metricsMiddleware.ts","../src/agent_lattice/builders/commonMiddleware.ts","../src/deep_agent_new/agent.ts","../src/deep_agent_new/middleware/subagents.ts","../src/agent_worker/agent_worker_graph.ts","../src/constants/agent_task_types.ts","../src/services/event_bus.ts","../src/queue_lattice/QueueLatticeManager.ts","../src/queue_lattice/MemoryQueueClient.ts","../src/services/AgentManager.ts","../src/deep_agent_new/middleware/patch_tool_calls.ts","../src/deep_agent_new/backends/store.ts","../src/deep_agent_new/backends/filesystem.ts","../src/deep_agent_new/backends/composite.ts","../src/deep_agent_new/backends/memory.ts","../src/deep_agent_new/middleware/todos.ts","../src/agent_lattice/builders/filesystemBackend.ts","../src/agent_lattice/builders/DeepAgentGraphBuilder.ts","../src/agent_team/agent_team.ts","../src/agent_team/types.ts","../src/agent_team/stores/InMemoryTaskListStore.ts","../src/agent_team/stores/InMemoryMailboxStore.ts","../src/agent_team/middleware/team.ts","../src/agent_team/middleware/teammate_tools.ts","../src/agent_team/middleware/formatMessages.ts","../src/agent_team/builders/TeamAgentGraphBuilder.ts","../src/agent_lattice/builders/AgentGraphBuilderFactory.ts","../src/agent_lattice/builders/AgentParamsBuilder.ts","../src/agent_lattice/utils/mergeAgentConfig.ts","../src/agent_lattice/AgentLatticeManager.ts","../src/chunk_buffer_lattice/ChunkBuffer.ts","../src/chunk_buffer_lattice/types.ts","../src/chunk_buffer_lattice/InMemoryChunkBuffer.ts","../src/chunk_buffer_lattice/ChunkBufferLatticeManager.ts","../src/schedule_lattice/ScheduleLatticeManager.ts","../src/schedule_lattice/DefaultScheduleClient.ts","../src/schedule_lattice/MemoryScheduleStorage.ts","../src/schedule_lattice/CronParser.ts","../src/embeddings_lattice/EmbeddingsLatticeManager.ts","../src/vectorstore_lattice/VectorStoreLatticeManager.ts","../src/logger_lattice/LoggerLatticeManager.ts","../src/logger_lattice/PinoLoggerClient.ts","../src/logger_lattice/ConsoleLoggerClient.ts","../src/skill_lattice/SkillLatticeManager.ts","../src/mcp_lattice/McpLatticeManager.ts","../src/util/encryption.ts"],"sourcesContent":["// Export core modules\nexport * from \"./model_lattice\";\nexport * from \"./tool_lattice\";\n// Direct export of SQL tools to ensure they are bundled\nexport * from \"./tool_lattice/sql\";\n// Direct export of Metrics tools to ensure they are bundled\nexport * from \"./tool_lattice/metrics\";\nexport * from \"./agent_lattice\";\nexport * from \"./memory_lattice\";\nexport * from \"./chunk_buffer_lattice\";\nexport * from \"./queue_lattice\";\nexport * from \"./schedule_lattice\";\nexport * from \"./store_lattice\";\nexport * from \"./embeddings_lattice\";\nexport * from \"./vectorstore_lattice\";\nexport * from \"./logger_lattice\";\nexport * from \"./skill_lattice\";\nexport * from \"./mcp_lattice\";\nexport * from \"./sandbox_lattice\";\nexport * from \"./agent_team\";\nexport * from \"./deep_agent_new\";\n\n// Export service modules\nexport { eventBus, default as eventBusDefault } from \"./services/event_bus\";\nexport { AgentManager } from \"./services/AgentManager\";\n\n// Export constants\nexport * from \"./constants/agent_task_types\";\n\n// Re-export protocol interfaces - use named exports to avoid conflicts\nimport * as Protocols from \"@axiom-lattice/protocols\";\nexport { Protocols };\n\n// Export utilities\nexport * from \"./util/encryption\";\n","/**\n * BaseLatticeManager - 抽象基类,为各种Lattice管理器提供通用功能\n * 使用统一的Lattice注册表,不同类型的Lattice通过前缀区分\n * @template TItem - 管理的项目类型\n */\nexport abstract class BaseLatticeManager<TItem = any> {\n // 全局统一的Lattice注册表\n protected static registry: Map<string, any> = new Map();\n\n /**\n * 受保护的构造函数,防止外部直接实例化\n */\n protected constructor() {\n // 空实现\n }\n\n /**\n * 获取管理器实例(由子类实现)\n */\n public static getInstance(): BaseLatticeManager<any> {\n throw new Error(\"必须由子类实现\");\n }\n\n /**\n * 获取Lattice类型,用于构造键前缀\n * 子类必须重写此方法以提供唯一的类型标识符\n */\n protected abstract getLatticeType(): string;\n\n /**\n * 构造完整的键名,包含类型前缀\n * @param key 原始键名\n */\n protected getFullKey(key: string): string {\n return `${this.getLatticeType()}.${key}`;\n }\n\n /**\n * 注册项目\n * @param key 项目键名(不含前缀)\n * @param item 项目实例\n */\n public register(key: string, item: TItem): void {\n const fullKey = this.getFullKey(key);\n if (BaseLatticeManager.registry.has(fullKey)) {\n throw new Error(`项目 \"${fullKey}\" 已经存在,无法重复注册`);\n }\n\n BaseLatticeManager.registry.set(fullKey, item);\n }\n\n /**\n * 获取指定项目\n * @param key 项目键名(不含前缀)\n */\n public get(key: string): TItem | undefined {\n const fullKey = this.getFullKey(key);\n return BaseLatticeManager.registry.get(fullKey) as TItem | undefined;\n }\n\n /**\n * 获取所有当前类型的项目\n */\n public getAll(): TItem[] {\n const prefix = `${this.getLatticeType()}.`;\n const result: TItem[] = [];\n\n for (const [key, value] of BaseLatticeManager.registry.entries()) {\n if (key.startsWith(prefix)) {\n result.push(value as TItem);\n }\n }\n\n return result;\n }\n\n /**\n * 检查项目是否存在\n * @param key 项目键名(不含前缀)\n */\n public has(key: string): boolean {\n const fullKey = this.getFullKey(key);\n return BaseLatticeManager.registry.has(fullKey);\n }\n\n /**\n * 移除项目\n * @param key 项目键名(不含前缀)\n */\n public remove(key: string): boolean {\n const fullKey = this.getFullKey(key);\n return BaseLatticeManager.registry.delete(fullKey);\n }\n\n /**\n * 清空当前类型的所有项目\n */\n public clear(): void {\n const prefix = `${this.getLatticeType()}.`;\n const keysToDelete: string[] = [];\n\n for (const key of BaseLatticeManager.registry.keys()) {\n if (key.startsWith(prefix)) {\n keysToDelete.push(key);\n }\n }\n\n for (const key of keysToDelete) {\n BaseLatticeManager.registry.delete(key);\n }\n }\n\n /**\n * 获取当前类型的项目数量\n */\n public count(): number {\n const prefix = `${this.getLatticeType()}.`;\n let count = 0;\n\n for (const key of BaseLatticeManager.registry.keys()) {\n if (key.startsWith(prefix)) {\n count++;\n }\n }\n\n return count;\n }\n\n /**\n * 获取当前类型的项目键名列表(不含前缀)\n */\n public keys(): string[] {\n const prefix = `${this.getLatticeType()}.`;\n const prefixLength = prefix.length;\n const result: string[] = [];\n\n for (const key of BaseLatticeManager.registry.keys()) {\n if (key.startsWith(prefix)) {\n result.push(key.substring(prefixLength));\n }\n }\n\n return result;\n }\n}\n","import {\n AIMessage,\n BaseMessage,\n BaseMessageLike,\n HumanMessage,\n} from \"@langchain/core/messages\";\nimport { ChatDeepSeek } from \"@langchain/deepseek\";\nimport { AzureChatOpenAI, ChatOpenAI } from \"@langchain/openai\";\nimport { z } from \"zod\";\nimport { ZodType as ZodTypeV3 } from \"zod/v3\";\nimport { $ZodType as ZodTypeV4 } from \"zod/v4/core\";\nimport {\n BaseChatModel,\n BaseChatModelCallOptions,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n BaseLanguageModel,\n BaseLanguageModelInput,\n} from \"@langchain/core/language_models/base\";\nimport {\n CallbackManagerForLLMRun,\n Callbacks,\n} from \"@langchain/core/callbacks/manager\";\nimport { ChatResult } from \"@langchain/core/outputs\";\nBaseLanguageModel;\nimport { LLMConfig } from \"@axiom-lattice/protocols\";\n\n/**\n * ModelLattice类,继承自BaseChatModel\n * 简化版本,只保留通过LLMConfig创建LLM实例的功能\n */\nexport class ModelLattice extends BaseChatModel {\n private config: LLMConfig;\n private llm: BaseChatModel;\n\n lc_namespace: string[] = [\"langchain\", \"model_lattice\"];\n\n /**\n * 构造函数\n * @param config LLM配置\n */\n constructor(config: LLMConfig) {\n super({});\n this.config = config;\n this.llm = this.initChatModel(config);\n }\n\n /**\n * 返回模型类型\n */\n _llmType(): string {\n return \"model_lattice\";\n }\n\n /**\n * 返回模型类型\n */\n _modelType(): string {\n return this.llm._modelType();\n }\n\n /**\n * 实现BaseChatModel的_generate方法\n * @param messages 消息数组\n * @param options 调用选项\n * @param runManager 回调管理器\n * @returns 聊天结果\n */\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n return this.llm._generate(messages, options as any, runManager);\n }\n\n /**\n * 将工具绑定到模型\n * @param tools 工具列表\n * @param tool_choice 工具选择选项\n * @returns 绑定工具后的模型\n */\n bindTools(\n tools: any[],\n {\n tool_choice = \"auto\",\n ...kwargs\n }: {\n tool_choice?: \"auto\" | \"none\" | \"required\" | any;\n [key: string]: any;\n } = {}\n ): any {\n // 如果底层LLM实现了bindTools方法,则使用它的实现\n if (typeof this.llm.bindTools === \"function\") {\n return this.llm.bindTools(tools, {\n tool_choice,\n ...kwargs,\n });\n }\n\n // 如果底层LLM没有实现bindTools方法,抛出错误\n throw new Error(\"llm not support bindTools\");\n }\n\n /**\n * 使用结构化输出调用LLM\n * @param input 输入\n * @param schema 结构化输出的schema\n * @param options 调用选项\n * @returns 结构化输出\n */\n async invokeWithStructuredOutput<\n RunOutput extends Record<string, any> = Record<string, any>\n >(\n input: BaseLanguageModelInput,\n schema: ZodTypeV3<RunOutput> | ZodTypeV4<RunOutput> | Record<string, any>,\n options?: BaseChatModelCallOptions & {\n includeRaw?: boolean;\n name?: string;\n method?: \"functionCalling\" | \"jsonMode\";\n }\n ): Promise<RunOutput | { raw: BaseMessage; parsed: RunOutput }> {\n // 使用LLM的withStructuredOutput方法\n if (this.llm.withStructuredOutput) {\n // 使用类型断言解决类型兼容性问题\n const structuredLLM = this.llm.withStructuredOutput(schema, {\n includeRaw: options?.includeRaw ?? false,\n name: options?.name,\n method: options?.method,\n } as any);\n\n return structuredLLM.invoke(input, options);\n }\n\n // 如果LLM没有withStructuredOutput方法,抛出错误\n throw new Error(\"当前LLM不支持结构化输出\");\n }\n\n /**\n * 创建LLM实例\n * @param config LLM配置\n * @returns LLM实例\n */\n private initChatModel(config: LLMConfig): BaseChatModel {\n if (config.provider === \"azure\") {\n return new AzureChatOpenAI({\n azureOpenAIApiKey: config.apiKey || process.env.AZURE_OPENAI_API_KEY,\n azureOpenAIApiInstanceName: \"convertlab-westus\",\n azureOpenAIApiDeploymentName: config.model,\n azureOpenAIApiVersion: \"2024-02-01\",\n temperature: config.temperature || 0,\n maxTokens: config.maxTokens,\n timeout: config.timeout,\n maxRetries: config.maxRetries || 2,\n streaming: config.streaming,\n });\n } else if (config.provider === \"deepseek\") {\n return new ChatDeepSeek({\n model: config.model,\n temperature: config.temperature || 0,\n maxTokens: config.maxTokens,\n timeout: config.timeout,\n maxRetries: config.maxRetries || 2,\n apiKey:\n config.apiKey ||\n process.env[config.apiKeyEnvName || \"DEEPSEEK_API_KEY\"],\n streaming: config.streaming,\n });\n } else if (config.provider === \"siliconcloud\") {\n return new ChatOpenAI({\n model: config.model,\n temperature: config.temperature || 0,\n maxTokens: config.maxTokens,\n timeout: config.timeout,\n maxRetries: config.maxRetries || 2,\n apiKey:\n config.apiKey ||\n process.env[config.apiKeyEnvName || \"SILICONCLOUD_API_KEY\"],\n configuration: {\n baseURL: \"https://api.siliconflow.cn/v1\",\n },\n streaming: config.streaming,\n });\n } else if (config.provider === \"volcengine\") {\n return new ChatOpenAI({\n model: config.model,\n temperature: config.temperature || 0,\n maxTokens: config.maxTokens,\n timeout: config.timeout,\n maxRetries: config.maxRetries || 2,\n apiKey:\n config.apiKey ||\n process.env[config.apiKeyEnvName || \"VOLCENGINE_API_KEY\"],\n configuration: {\n baseURL: \"https://ark.cn-beijing.volces.com/api/v3\",\n },\n streaming: config.streaming,\n });\n } else {\n return new ChatOpenAI({\n model: config.model,\n temperature: config.temperature || 0,\n maxTokens: config.maxTokens,\n timeout: config.timeout,\n maxRetries: config.maxRetries || 2,\n streaming: config.streaming,\n apiKey:\n config.apiKey ||\n process.env[config.apiKeyEnvName || \"OPENAI_API_KEY\"],\n configuration: {\n baseURL: config.baseURL,\n },\n });\n }\n }\n}\n","import { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport { ModelLattice as LLMModelLattice } from \"./ModelLattice\";\nimport { LLMConfig } from \"@axiom-lattice/protocols\";\n\n// 模型配置接口,直接使用 LLMConfig\nexport type ModelConfig = LLMConfig;\n\n// 模型客户端类型,使用 LLMManager\ntype ModelClient = LLMModelLattice;\n\n// 定义接口\nexport interface ModelLatticeInterface {\n key: string;\n client: ModelClient;\n}\n\n/**\n * ModelLatticeManager - 单例模型Lattice管理器\n * 负责注册、管理各种语言模型Lattice\n */\nexport class ModelLatticeManager extends BaseLatticeManager<ModelLatticeInterface> {\n private static _instance: ModelLatticeManager;\n\n /**\n * 获取ModelLatticeManager单例实例\n */\n public static getInstance(): ModelLatticeManager {\n if (!ModelLatticeManager._instance) {\n ModelLatticeManager._instance = new ModelLatticeManager();\n }\n return ModelLatticeManager._instance;\n }\n\n /**\n * 获取Lattice类型前缀\n */\n protected getLatticeType(): string {\n return \"models\";\n }\n\n /**\n * 注册模型Lattice\n * @param key Lattice键名\n * @param config 模型配置\n */\n public registerLattice(key: string, config: ModelConfig): void {\n // 使用 LLMManager 创建客户端\n const client = new LLMModelLattice(config);\n\n // 创建模型Lattice对象\n const modelLattice: ModelLatticeInterface = {\n key,\n client,\n };\n\n // 调用基类的register方法\n this.register(key, modelLattice);\n }\n\n /**\n * 获取ModelLattice\n * @param key Lattice键名\n */\n public getModelLattice(key: string): ModelLatticeInterface {\n const modelLattice = this.get(key);\n if (!modelLattice) {\n throw new Error(`ModelLattice ${key} not found`);\n }\n return modelLattice;\n }\n\n /**\n * 获取所有Lattice\n */\n public getAllLattices(): ModelLatticeInterface[] {\n return this.getAll();\n }\n\n /**\n * 检查Lattice是否存在\n * @param key Lattice键名\n */\n public hasLattice(key: string): boolean {\n return this.has(key);\n }\n\n /**\n * 移除Lattice\n * @param key Lattice键名\n */\n public removeLattice(key: string): boolean {\n return this.remove(key);\n }\n\n /**\n * 清空所有Lattice\n */\n public clearLattices(): void {\n this.clear();\n }\n\n /**\n * 获取Lattice数量\n */\n public getLatticeCount(): number {\n return this.count();\n }\n\n /**\n * 获取Lattice键名列表\n */\n public getLatticeKeys(): string[] {\n return this.keys();\n }\n}\n\n// 导出单例实例\nexport const modelLatticeManager = ModelLatticeManager.getInstance();\n\n// 导出便捷方法\nexport const registerModelLattice = (key: string, config: ModelConfig) =>\n modelLatticeManager.registerLattice(key, config);\n\nexport const getModelLattice = (key: string) =>\n modelLatticeManager.getModelLattice(key);\n","import z from \"zod\";\nimport { registerToolLattice } from \"../ToolLatticeManager\";\n\nregisterToolLattice(\n \"get_current_date_time\",\n {\n name: \"get_current_date_time\",\n description: \"获取当前日期时间\",\n schema: z.object({}),\n },\n async () => {\n return \"当前日期时间:\" + new Date().toLocaleString();\n }\n);\n","import { StructuredTool, tool } from \"@langchain/core/tools\";\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport { ToolConfig, ToolExecutor } from \"@axiom-lattice/protocols\";\nimport { createToolApproveWrapper } from \"./createToolApproveWrapper\";\n\n// 工具定义接口 - 使用协议中的ToolConfig\nexport type ToolDefinition = ToolConfig;\n\n// Lattice 接口定义\nexport interface ToolLattice {\n key: string;\n config: ToolConfig;\n client: StructuredTool;\n}\n\n/**\n * ToolLatticeManager - 单例工具Lattice管理器\n * 负责注册、管理各种工具Lattice\n */\nexport class ToolLatticeManager extends BaseLatticeManager<ToolLattice> {\n private static _instance: ToolLatticeManager;\n\n /**\n * 获取ToolLatticeManager单例实例\n */\n public static getInstance(): ToolLatticeManager {\n if (!ToolLatticeManager._instance) {\n ToolLatticeManager._instance = new ToolLatticeManager();\n }\n return ToolLatticeManager._instance;\n }\n\n /**\n * 获取Lattice类型前缀\n */\n protected getLatticeType(): string {\n return \"tools\";\n }\n\n\n /**\n * 注册工具Lattice\n * @param key Lattice键名\n * @param config 工具配置(定义)\n * @param executor 工具执行函数\n */\n public registerLattice<TInput = any, TOutput = any>(\n key: string,\n config: ToolConfig,\n executor: ToolExecutor<TInput, TOutput>\n ): void {\n // 创建工具Lattice对象\n let toolExecutor;\n\n if (config.needUserApprove) {\n toolExecutor = createToolApproveWrapper<TInput, TOutput>(\n config,\n executor\n );\n } else {\n toolExecutor = async (input: TInput, exe_config: any) => {\n const result = await executor(input, exe_config);\n return result;\n };\n }\n\n const toolLattice: ToolLattice = {\n key,\n config,\n client: tool(toolExecutor as ToolExecutor, config),\n };\n\n // 调用基类的register方法\n this.register(key, toolLattice);\n }\n\n /**\n * 获取ToolLattice\n * @param key Lattice键名\n */\n public getToolLattice(key: string): ToolLattice | undefined {\n return this.get(key);\n }\n\n /**\n * 获取所有Lattice\n */\n public getAllLattices(): ToolLattice[] {\n return this.getAll();\n }\n\n /**\n * 检查Lattice是否存在\n * @param key Lattice键名\n */\n public hasLattice(key: string): boolean {\n return this.has(key);\n }\n\n /**\n * 移除Lattice\n * @param key Lattice键名\n */\n public removeLattice(key: string): boolean {\n return this.remove(key);\n }\n\n /**\n * 清空所有Lattice\n */\n public clearLattices(): void {\n this.clear();\n }\n\n /**\n * 获取Lattice数量\n */\n public getLatticeCount(): number {\n return this.count();\n }\n\n /**\n * 获取Lattice键名列表\n */\n public getLatticeKeys(): string[] {\n return this.keys();\n }\n\n /**\n * 获取工具定义\n * @param key Lattice键名\n */\n public getToolDefinition(key: string): ToolDefinition {\n const toolLattice = this.getToolLattice(key);\n if (!toolLattice) {\n throw new Error(`ToolLattice ${key} not found`);\n }\n return toolLattice.config;\n }\n\n /**\n * 获取工具客户端\n * @param key Lattice键名\n */\n public getToolClient(key: string): StructuredTool {\n const toolLattice = this.getToolLattice(key);\n if (!toolLattice) {\n throw new Error(`ToolLattice ${key} not found`);\n }\n return toolLattice.client;\n }\n\n /**\n * 获取所有工具定义\n */\n public getAllToolDefinitions(): ToolDefinition[] {\n return this.getAllLattices().map((lattice) => lattice.config);\n }\n\n /**\n * 注册已有的StructuredTool到Lattice\n * @param key Lattice键名\n * @param tool 已有的StructuredTool实例\n */\n public registerExistingTool(key: string, tool: StructuredTool): void {\n // 从工具中提取配置信息\n const config: ToolConfig = {\n name: tool.name,\n description: tool.description,\n schema: tool.schema as any, // StructuredTool的schema已经是Zod兼容的\n needUserApprove: false, // MCP工具默认不需要用户批准\n };\n\n const toolLattice: ToolLattice = {\n key,\n config,\n client: tool,\n };\n\n this.register(key, toolLattice);\n }\n\n /**\n * 验证工具输入参数\n * @param key Lattice键名\n * @param input 输入参数\n */\n public validateToolInput(key: string, input: any): boolean {\n const toolLattice = this.getToolLattice(key);\n if (!toolLattice) {\n return false;\n }\n\n try {\n if (toolLattice.config.schema) {\n toolLattice.config.schema.parse(input);\n }\n return true;\n } catch {\n return false;\n }\n }\n}\n\n// 导出单例实例\nexport const toolLatticeManager = ToolLatticeManager.getInstance();\n\n// 导出便捷方法\nexport const registerToolLattice = (\n key: string,\n config: ToolConfig,\n executor: ToolExecutor\n) => toolLatticeManager.registerLattice(key, config, executor);\n\nexport const registerExistingTool = (key: string, tool: StructuredTool) =>\n toolLatticeManager.registerExistingTool(key, tool);\n\nexport const getToolLattice = (key: string) =>\n toolLatticeManager.getToolLattice(key);\n\nexport const getToolDefinition = (key: string) =>\n toolLatticeManager.getToolDefinition(key);\n\nexport const getToolClient = (key: string) =>\n toolLatticeManager.getToolClient(key);\n\nexport const getAllToolDefinitions = () =>\n toolLatticeManager.getAllToolDefinitions();\n\nexport const validateToolInput = (key: string, input: any) =>\n toolLatticeManager.validateToolInput(key, input);\n","export const genUIMarkdown = (type: string, data: any) => {\n return [\"```\" + type, JSON.stringify(data), \"```\"].join(\"\\n\");\n};\n","import { AIMessage, isAIMessage } from \"@langchain/core/messages\";\nimport { ToolLatticeManager } from \"./ToolLatticeManager\";\nimport { ToolLattice } from \"./ToolLatticeManager\";\nimport { genUIMarkdown } from \"../util/genUIMarkdown\";\nimport { ToolCall } from \"@langchain/core/messages/tool\";\nimport { UserFeedbackResponse } from \"../types\";\nimport { END, interrupt } from \"@langchain/langgraph\";\nimport { ToolConfig, ToolExecutor } from \"@axiom-lattice/protocols\";\nexport function createToolApproveWrapper<TInput = any, TOutput = any>(\n tool_config: ToolConfig,\n toolExecutor: ToolExecutor<TInput, TOutput>\n) {\n return async (input: TInput, exe_config: any) => {\n const messagePrefix = \"Tool execution requires approval\";\n const description = `${messagePrefix}\\n\\nTool: ${tool_config.name}\\nArgs: ${JSON.stringify(input, null, 2)}`;\n\n const md = genUIMarkdown(\"confirm\", {\n message: description,\n tool_call: {\n tool_call_id: exe_config.id,\n tool_name: tool_config.name,\n tool_args: input,\n tool_config: tool_config,\n },\n });\n\n const feedback: UserFeedbackResponse = await interrupt(md);\n\n if (feedback.data.action === \"yes\") {\n return await toolExecutor(input, exe_config);\n } else {\n return {\n goto: END,\n };\n }\n };\n}\n","import z from \"zod\";\nimport { registerToolLattice } from \"../ToolLatticeManager\";\nimport { TavilySearch } from \"@langchain/tavily\";\nimport \"dotenv/config\";\nimport { LangGraphRunnableConfig } from \"@langchain/langgraph\";\nimport { genUICard } from \"@util/genUICard\";\n\ntype Topic = \"general\" | \"news\" | \"finance\";\n\nregisterToolLattice(\n \"internet_search\",\n {\n name: \"internet_search\",\n description: \"Run a web search\",\n needUserApprove: false,\n schema: z.object({\n query: z.string().describe(\"The search query\"),\n maxResults: z\n .number()\n .optional()\n .default(5)\n .describe(\"Maximum number of results to return\"),\n topic: z\n .enum([\"general\", \"news\", \"finance\"])\n .optional()\n .default(\"general\")\n .describe(\"Search topic category\"),\n includeRawContent: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Whether to include raw content\"),\n }),\n },\n async (\n {\n query,\n maxResults = 5,\n topic = \"general\" as Topic,\n includeRawContent = false,\n }: {\n query: string;\n maxResults?: number;\n topic?: Topic;\n includeRawContent?: boolean;\n },\n config: LangGraphRunnableConfig\n ) => {\n /**\n * Run a web search\n */\n // console.log(\"[DEBUG][internet_search] Starting search with params:\", {\n // query,\n // maxResults,\n // topic,\n // includeRawContent,\n // });\n\n // Note: You'll need to install and import tavily-js or similar package\n // console.log(\"[DEBUG][internet_search] Creating TavilySearch instance...\");\n const tavilySearch = new TavilySearch({\n maxResults,\n tavilyApiKey: process.env.TAVILY_API_KEY,\n includeRawContent,\n topic,\n });\n\n // console.log(\"[DEBUG][internet_search] Invoking search for query:\", query);\n const tavilyResponse = await tavilySearch.invoke({ query });\n // console.log(\n // \"[DEBUG][internet_search] Search completed. Results count:\",\n // tavilyResponse.results?.length ?? 0\n // );\n\n const result = genUICard(\"Internet Search:\" + query, \"generic_data_table\", {\n dataSource: tavilyResponse.results,\n });\n // console.log(\"[DEBUG][internet_search] Returning UI card result\");\n\n return JSON.stringify(tavilyResponse.results);\n }\n);\n","export const genUICard = (title: string, type: string, data: any) => {\n return [title, \"```\" + type, JSON.stringify(data), \"```\"].join(\"\\n\");\n};\n","/**\n * SQL Database Manager\n * Singleton manager for SQL database connections\n */\n\nimport {\n DatabaseConfig,\n DatabaseType,\n ISqlDatabase,\n TableInfo,\n TableSchema,\n ColumnInfo,\n QueryResult,\n} from \"./types\";\n\n/**\n * PostgreSQL Database Implementation\n * Uses pg library for PostgreSQL connections\n */\nexport class PostgresDatabase implements ISqlDatabase {\n private config: DatabaseConfig;\n private pool: any; // pg.Pool\n private connected: boolean = false;\n\n constructor(config: DatabaseConfig) {\n this.config = config;\n }\n\n async connect(): Promise<void> {\n if (this.connected && this.pool) return;\n\n try {\n // Dynamic import of pg to avoid bundling issues\n const { Pool } = await import(\"pg\");\n\n const poolConfig = this.config.connectionString\n ? { connectionString: this.config.connectionString }\n : {\n host: this.config.host || \"localhost\",\n port: this.config.port || 5432,\n database: this.config.database,\n user: this.config.user,\n password: this.config.password,\n ssl: this.config.ssl ? { rejectUnauthorized: false } : undefined,\n };\n\n this.pool = new Pool(poolConfig);\n \n // Test connection with timeout\n const client = await this.pool.connect();\n try {\n await client.query('SELECT 1');\n } finally {\n client.release();\n }\n this.connected = true;\n } catch (error) {\n this.connected = false;\n throw new Error(`Failed to connect to PostgreSQL: ${error}`);\n }\n }\n\n async disconnect(): Promise<void> {\n if (this.pool) {\n try {\n await this.pool.end();\n } catch (error) {\n console.warn('Warning: Error closing PostgreSQL pool:', error);\n } finally {\n this.pool = null;\n this.connected = false;\n }\n }\n }\n\n async listTables(): Promise<TableInfo[]> {\n await this.ensureConnected();\n\n const query = `\n SELECT table_name, table_schema\n FROM information_schema.tables\n WHERE table_schema NOT IN ('pg_catalog', 'information_schema')\n AND table_type = 'BASE TABLE'\n ORDER BY table_schema, table_name;\n `;\n\n const result = await this.pool.query(query);\n return result.rows.map((row: any) => ({\n name: row.table_name,\n schema: row.table_schema,\n }));\n }\n\n async getTableInfo(tables: string[]): Promise<TableSchema[]> {\n await this.ensureConnected();\n\n const schemas: TableSchema[] = [];\n\n for (const tableName of tables) {\n // Get column information\n const columnQuery = `\n SELECT \n c.column_name,\n c.data_type,\n c.is_nullable,\n c.column_default,\n CASE WHEN pk.column_name IS NOT NULL THEN true ELSE false END as is_primary_key,\n CASE WHEN fk.column_name IS NOT NULL THEN true ELSE false END as is_foreign_key,\n fk.foreign_table_name,\n fk.foreign_column_name\n FROM information_schema.columns c\n LEFT JOIN (\n SELECT ku.column_name, ku.table_name\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage ku\n ON tc.constraint_name = ku.constraint_name\n WHERE tc.constraint_type = 'PRIMARY KEY'\n ) pk ON c.column_name = pk.column_name AND c.table_name = pk.table_name\n LEFT JOIN (\n SELECT \n kcu.column_name,\n kcu.table_name,\n ccu.table_name as foreign_table_name,\n ccu.column_name as foreign_column_name\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n JOIN information_schema.constraint_column_usage ccu\n ON tc.constraint_name = ccu.constraint_name\n WHERE tc.constraint_type = 'FOREIGN KEY'\n ) fk ON c.column_name = fk.column_name AND c.table_name = fk.table_name\n WHERE c.table_name = $1\n ORDER BY c.ordinal_position;\n `;\n\n const columnResult = await this.pool.query(columnQuery, [tableName]);\n\n const columns: ColumnInfo[] = columnResult.rows.map((row: any) => ({\n name: row.column_name,\n type: row.data_type,\n nullable: row.is_nullable === \"YES\",\n default: row.column_default,\n isPrimaryKey: row.is_primary_key,\n isForeignKey: row.is_foreign_key,\n foreignKeyRef: row.is_foreign_key\n ? `${row.foreign_table_name}.${row.foreign_column_name}`\n : undefined,\n }));\n\n // Get sample rows (limit to 3)\n let sampleRows: Record<string, unknown>[] = [];\n try {\n const sampleQuery = `SELECT * FROM \"${tableName}\" LIMIT 3`;\n const sampleResult = await this.pool.query(sampleQuery);\n sampleRows = sampleResult.rows;\n } catch {\n // Ignore errors when getting sample rows\n }\n\n schemas.push({\n tableName,\n columns,\n sampleRows,\n });\n }\n\n return schemas;\n }\n\n async executeQuery(query: string): Promise<QueryResult> {\n await this.ensureConnected();\n\n const result = await this.pool.query(query);\n return {\n rows: result.rows,\n rowCount: result.rowCount || result.rows.length,\n fields: result.fields?.map((f: any) => f.name),\n };\n }\n\n getDatabaseType(): DatabaseType {\n return \"postgres\";\n }\n\n private async ensureConnected(): Promise<void> {\n if (!this.connected) {\n await this.connect();\n }\n }\n}\n\n/**\n * SQL Database Manager\n * Manages database connections and provides a unified interface\n */\nexport class SqlDatabaseManager {\n private static instance: SqlDatabaseManager;\n private databases: Map<string, ISqlDatabase> = new Map();\n private defaultDatabaseKey: string | null = null;\n\n private constructor() {}\n\n /**\n * Get the singleton instance\n */\n static getInstance(): SqlDatabaseManager {\n if (!SqlDatabaseManager.instance) {\n SqlDatabaseManager.instance = new SqlDatabaseManager();\n }\n return SqlDatabaseManager.instance;\n }\n\n /**\n * Register a database connection\n * @param key - Unique identifier for the database\n * @param config - Database configuration\n */\n registerDatabase(key: string, config: DatabaseConfig): void {\n let database: ISqlDatabase;\n\n switch (config.type) {\n case \"postgres\":\n database = new PostgresDatabase(config);\n break;\n case \"mysql\":\n throw new Error(\"MySQL support not yet implemented\");\n case \"sqlite\":\n throw new Error(\"SQLite support not yet implemented\");\n default:\n throw new Error(`Unsupported database type: ${config.type}`);\n }\n\n this.databases.set(key, database);\n\n // Set as default if it's the first database\n if (this.defaultDatabaseKey === null) {\n this.defaultDatabaseKey = key;\n }\n }\n\n /**\n * Set the default database\n * @param key - Database key to set as default\n */\n setDefaultDatabase(key: string): void {\n if (!this.databases.has(key)) {\n throw new Error(`Database '${key}' not found`);\n }\n this.defaultDatabaseKey = key;\n }\n\n /**\n * Get a database by key\n * @param key - Database key (optional, uses default if not provided)\n */\n getDatabase(key?: string): ISqlDatabase {\n const dbKey = key || this.defaultDatabaseKey;\n if (!dbKey) {\n throw new Error(\"No database registered\");\n }\n\n const database = this.databases.get(dbKey);\n if (!database) {\n throw new Error(`Database '${dbKey}' not found`);\n }\n\n return database;\n }\n\n /**\n * Check if a database is registered\n * @param key - Database key\n */\n hasDatabase(key: string): boolean {\n return this.databases.has(key);\n }\n\n /**\n * Get all registered database keys\n */\n getDatabaseKeys(): string[] {\n return Array.from(this.databases.keys());\n }\n\n /**\n * Remove a database connection\n * @param key - Database key\n */\n async removeDatabase(key: string): Promise<void> {\n const database = this.databases.get(key);\n if (database) {\n await database.disconnect();\n this.databases.delete(key);\n\n if (this.defaultDatabaseKey === key) {\n this.defaultDatabaseKey =\n this.databases.size > 0\n ? this.databases.keys().next().value || null\n : null;\n }\n }\n }\n\n /**\n * Disconnect all databases\n */\n async disconnectAll(): Promise<void> {\n for (const database of this.databases.values()) {\n await database.disconnect();\n }\n }\n\n /**\n * Load database configurations from a DatabaseConfigStore\n * and register them with this manager\n * \n * @param store - The database configuration store\n * @param tenantId - Tenant identifier\n */\n async loadConfigsFromStore(\n store: import(\"@axiom-lattice/protocols\").DatabaseConfigStore,\n tenantId: string\n ): Promise<void> {\n const configs = await store.getAllConfigs(tenantId);\n \n for (const entry of configs) {\n this.registerDatabase(entry.key, entry.config);\n }\n }\n\n /**\n * Load all database configurations from a DatabaseConfigStore\n * across all tenants and register them with this manager\n * \n * @param store - The database configuration store\n */\n async loadAllConfigsFromStore(\n store: import(\"@axiom-lattice/protocols\").DatabaseConfigStore\n ): Promise<void> {\n const configs = await store.getAllConfigsWithoutTenant();\n \n for (const entry of configs) {\n this.registerDatabase(entry.key, entry.config);\n }\n }\n}\n\nexport function parseConnectionString(connectionString: string): Omit<DatabaseConfig, \"type\"> {\n const url = new URL(connectionString);\n const protocol = url.protocol.replace(\":\", \"\");\n\n if (protocol !== \"postgres\" && protocol !== \"postgresql\") {\n throw new Error(`Unsupported protocol: ${protocol}. Only postgresql:// is supported.`);\n }\n\n return {\n host: url.hostname || \"localhost\",\n port: parseInt(url.port || \"5432\"),\n database: url.pathname.slice(1) || url.pathname,\n user: url.username,\n password: url.password,\n ssl: url.searchParams.get(\"sslmode\") === \"require\",\n };\n}\n\nexport function parseMysqlConnectionString(connectionString: string): Omit<DatabaseConfig, \"type\"> {\n const url = new URL(connectionString);\n const protocol = url.protocol.replace(\":\", \"\");\n\n if (protocol !== \"mysql\") {\n throw new Error(`Unsupported protocol: ${protocol}. Only mysql:// is supported.`);\n }\n\n return {\n host: url.hostname || \"localhost\",\n port: parseInt(url.port || \"3306\"),\n database: url.pathname.slice(1) || url.pathname,\n user: url.username,\n password: url.password,\n ssl: url.searchParams.get(\"sslmode\") === \"require\",\n };\n}\n\nexport function parseSqliteConnectionString(connectionString: string): Omit<DatabaseConfig, \"type\"> {\n if (connectionString.startsWith(\"sqlite:\")) {\n const path = connectionString.replace(\"sqlite:\", \"\");\n return { database: path };\n }\n return { database: connectionString };\n}\n\n// Export singleton instance\nexport const sqlDatabaseManager = SqlDatabaseManager.getInstance();\n","/**\n * List Tables SQL Tool\n * Tool for listing all tables in the connected database\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { sqlDatabaseManager } from \"./SqlDatabaseManager\";\n\nconst LIST_TABLES_SQL_DESCRIPTION = `List all tables in the connected SQL database. Returns a comma-separated list of table names. Use this tool first to understand what tables are available before querying the database.`;\n\nexport interface CreateSqlToolParams {\n databaseKeys: string[];\n databaseDescriptions?: Record<string, string>;\n}\n\nexport const createListTablesSqlTool = ({ databaseKeys, databaseDescriptions }: CreateSqlToolParams) => {\n const availableDbsText = databaseKeys.length > 0\n ? `\\n\\nAvailable databases:\\n${databaseKeys.map(key => \n `- ${key}${databaseDescriptions?.[key] ? `: ${databaseDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async ({ databaseKey }: { databaseKey: string }, exe_config: any) => {\n try {\n if (!databaseKey) {\n return \"Error: databaseKey parameter is required. Available databases: \" + databaseKeys.join(', ');\n }\n\n if (!databaseKeys.includes(databaseKey)) {\n return `Error: databaseKey \"${databaseKey}\" is not in the allowed list: [${databaseKeys.join(', ')}]`;\n }\n\n const database = sqlDatabaseManager.getDatabase(databaseKey);\n const tables = await database.listTables();\n\n if (tables.length === 0) {\n return \"No tables found in the database.\";\n }\n\n const tableNames = tables.map((t) =>\n t.schema && t.schema !== \"public\" ? `${t.schema}.${t.name}` : t.name\n );\n\n return tableNames.join(\", \");\n } catch (error) {\n return `Error listing tables: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"list_tables_sql\",\n description: `${LIST_TABLES_SQL_DESCRIPTION}${availableDbsText}`,\n schema: z.object({\n databaseKey: z\n .string()\n .describe(`Target database to list tables. Choose from: ${databaseKeys.join(', ')}`),\n }),\n }\n );\n};\n","/**\n * Info SQL Tool\n * Tool for getting schema information about specified tables\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { sqlDatabaseManager } from \"./SqlDatabaseManager\";\nimport { TableSchema } from \"./types\";\n\nconst INFO_SQL_DESCRIPTION = `Get detailed schema information for specified tables, including column names, types, constraints (primary keys, foreign keys), and sample rows. Input should be a comma-separated list of table names.`;\n\nexport interface CreateSqlToolParams {\n databaseKeys: string[];\n databaseDescriptions?: Record<string, string>;\n}\n\nexport const createInfoSqlTool = ({ databaseKeys, databaseDescriptions }: CreateSqlToolParams) => {\n const availableDbsText = databaseKeys.length > 0\n ? `\\n\\nAvailable databases:\\n${databaseKeys.map(key => \n `- ${key}${databaseDescriptions?.[key] ? `: ${databaseDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async (\n {\n tables,\n databaseKey,\n }: {\n tables: string;\n databaseKey: string;\n },\n exe_config: any\n ) => {\n try {\n if (!databaseKey) {\n return \"Error: databaseKey parameter is required. Available databases: \" + databaseKeys.join(', ');\n }\n\n if (!databaseKeys.includes(databaseKey)) {\n return `Error: databaseKey \"${databaseKey}\" is not in the allowed list: [${databaseKeys.join(', ')}]`;\n }\n\n const database = sqlDatabaseManager.getDatabase(databaseKey);\n\n const tableNames = tables\n .split(\",\")\n .map((t) => t.trim())\n .filter((t) => t.length > 0);\n\n if (tableNames.length === 0) {\n return \"Error: No table names provided. Please provide a comma-separated list of table names.\";\n }\n\n const schemas = await database.getTableInfo(tableNames);\n\n if (schemas.length === 0) {\n return `No schema information found for tables: ${tableNames.join(\", \")}`;\n }\n\n const output = schemas.map(formatTableSchema).join(\"\\n\");\n return output;\n } catch (error) {\n return `Error getting table info: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"info_sql\",\n description: `${INFO_SQL_DESCRIPTION}${availableDbsText}`,\n schema: z.object({\n tables: z\n .string()\n .describe(\n \"Comma-separated list of table names to get information for. Example: 'users, orders, products'\"\n ),\n databaseKey: z\n .string()\n .describe(`Target database to get table info. Choose from: ${databaseKeys.join(', ')}`),\n }),\n }\n );\n};\n\nfunction formatTableSchema(schema: TableSchema): string {\n const lines: string[] = [];\n\n lines.push(`\\nTable: ${schema.tableName}`);\n lines.push(\"-\".repeat(40));\n lines.push(\"Columns:\");\n\n for (const col of schema.columns) {\n const constraints: string[] = [];\n if (col.isPrimaryKey) constraints.push(\"PRIMARY KEY\");\n if (col.isForeignKey && col.foreignKeyRef)\n constraints.push(`FK -> ${col.foreignKeyRef}`);\n if (!col.nullable) constraints.push(\"NOT NULL\");\n\n const constraintStr =\n constraints.length > 0 ? ` [${constraints.join(\", \")}]` : \"\";\n lines.push(` - ${col.name}: ${col.type}${constraintStr}`);\n }\n\n if (schema.sampleRows && schema.sampleRows.length > 0) {\n lines.push(\"\\nSample Rows (up to 3):\");\n for (const row of schema.sampleRows) {\n const rowStr = Object.entries(row)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join(\", \");\n lines.push(` ${rowStr}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * Query Checker SQL Tool\n * Tool for validating SQL queries before execution\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { sqlDatabaseManager } from \"./SqlDatabaseManager\";\n\nconst DANGEROUS_KEYWORDS = [\n \"DROP\",\n \"TRUNCATE\",\n \"DELETE\",\n \"ALTER\",\n \"CREATE\",\n \"GRANT\",\n \"REVOKE\",\n];\n\nexport interface CreateSqlToolParams {\n databaseKeys: string[];\n databaseDescriptions?: Record<string, string>;\n}\n\nfunction checkSyntax(query: string): string[] {\n const issues: string[] = [];\n const upperQuery = query.toUpperCase();\n\n let parenCount = 0;\n for (const char of query) {\n if (char === \"(\") parenCount++;\n if (char === \")\") parenCount--;\n if (parenCount < 0) {\n issues.push(\"Unbalanced parentheses: found closing ) without matching (\");\n break;\n }\n }\n if (parenCount > 0) {\n issues.push(\"Unbalanced parentheses: missing closing )\");\n }\n\n const singleQuotes = (query.match(/'/g) || []).length;\n if (singleQuotes % 2 !== 0) {\n issues.push(\"Unbalanced single quotes\");\n }\n\n if (upperQuery.includes(\"SELECT *\") && upperQuery.includes(\"JOIN\")) {\n issues.push(\n \"Warning: SELECT * with JOIN may return duplicate column names. Consider specifying columns explicitly.\"\n );\n }\n\n if (\n (upperQuery.includes(\"UPDATE \") || upperQuery.includes(\"DELETE FROM \")) &&\n !upperQuery.includes(\"WHERE \")\n ) {\n issues.push(\n \"Warning: UPDATE or DELETE without WHERE clause will affect all rows in the table.\"\n );\n }\n\n if (\n upperQuery.includes(\"GROUP BY\") &&\n !upperQuery.match(/\\b(COUNT|SUM|AVG|MAX|MIN|ARRAY_AGG|STRING_AGG)\\s*\\(/i)\n ) {\n issues.push(\n \"Warning: GROUP BY used but no aggregate functions found. Make sure all non-aggregated columns are in GROUP BY.\"\n );\n }\n\n return issues;\n}\n\nfunction checkDangerousOperations(query: string): string[] {\n const warnings: string[] = [];\n const upperQuery = query.toUpperCase();\n\n for (const keyword of DANGEROUS_KEYWORDS) {\n if (upperQuery.includes(keyword)) {\n warnings.push(\n `Warning: Query contains potentially dangerous operation: ${keyword}`\n );\n }\n }\n\n return warnings;\n}\n\nexport const createQueryCheckerSqlTool = ({ databaseKeys, databaseDescriptions }: CreateSqlToolParams) => {\n const availableDbsText = databaseKeys.length > 0\n ? `\\n\\nAvailable databases:\\n${databaseKeys.map(key => \n `- ${key}${databaseDescriptions?.[key] ? `: ${databaseDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async (\n {\n query,\n databaseKey,\n }: {\n query: string;\n databaseKey: string;\n },\n exe_config: any\n ) => {\n try {\n const trimmedQuery = query.trim();\n\n if (!trimmedQuery) {\n return \"Error: Empty query provided. Please provide a SQL query to check.\";\n }\n\n const results: string[] = [];\n results.push(\"SQL Query Check Results:\");\n results.push(\"=\".repeat(40));\n results.push(`\\nQuery:\\n${trimmedQuery}\\n`);\n\n const syntaxIssues = checkSyntax(trimmedQuery);\n if (syntaxIssues.length > 0) {\n results.push(\"Syntax Issues:\");\n for (const issue of syntaxIssues) {\n results.push(` - ${issue}`);\n }\n } else {\n results.push(\"Syntax: No obvious syntax issues found\");\n }\n\n const dangerWarnings = checkDangerousOperations(trimmedQuery);\n if (dangerWarnings.length > 0) {\n results.push(\"\\nSafety Warnings:\");\n for (const warning of dangerWarnings) {\n results.push(` - ${warning}`);\n }\n } else {\n results.push(\"Safety: No dangerous operations detected\");\n }\n\n if (databaseKey && databaseKeys.includes(databaseKey)) {\n try {\n const database = sqlDatabaseManager.getDatabase(databaseKey);\n const dbType = database.getDatabaseType();\n\n if (dbType === \"postgres\") {\n try {\n await database.executeQuery(`EXPLAIN ${trimmedQuery}`);\n results.push(\"Database Validation: Query is valid against database schema\");\n } catch (explainError) {\n results.push(\n `Database Validation: ${explainError instanceof Error ? explainError.message : String(explainError)}`\n );\n }\n }\n } catch {\n results.push(\n \"Database Validation: Skipped (database connection unavailable)\"\n );\n }\n } else {\n results.push(\n \"Database Validation: Skipped (no valid databaseKey provided)\"\n );\n }\n\n const hasErrors =\n syntaxIssues.some((i) => !i.startsWith(\"Warning:\")) ||\n dangerWarnings.length > 0;\n\n results.push(\"\\n\" + \"=\".repeat(40));\n if (hasErrors) {\n results.push(\n \"Overall: Query has potential issues. Review warnings before execution.\"\n );\n } else {\n results.push(\"Overall: Query appears to be safe to execute.\");\n }\n\n return results.join(\"\\n\");\n } catch (error) {\n return `Error checking query: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"query_checker_sql\",\n description: `Check a SQL query for common issues before execution. This tool validates syntax, checks for dangerous operations, and provides suggestions for improvement. Use this before executing queries to ensure they are safe and correct.${availableDbsText}`,\n schema: z.object({\n query: z.string().describe(\"The SQL query to check and validate.\"),\n databaseKey: z\n .string()\n .describe(`Target database to validate query against. Choose from: ${databaseKeys.join(', ')}`),\n }),\n }\n );\n};\n","/**\n * Query SQL Tool\n * Tool for executing SQL queries against the database\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { sqlDatabaseManager } from \"./SqlDatabaseManager\";\n\nconst QUERY_SQL_DESCRIPTION = `Execute a SQL query against the database and return the results. Input should be a valid SQL query. Use this tool to retrieve data from the database. For complex queries, first use list_tables_sql and info_sql to understand the database schema.`;\n\nexport interface CreateSqlToolParams {\n databaseKeys: string[];\n databaseDescriptions?: Record<string, string>;\n}\n\nfunction formatQueryResult(\n rows: Record<string, unknown>[],\n fields?: string[]\n): string {\n if (rows.length === 0) {\n return \"Query executed successfully. No rows returned.\";\n }\n\n const lines: string[] = [];\n\n const columns = fields || Object.keys(rows[0]);\n\n lines.push(columns.join(\" | \"));\n lines.push(\"-\".repeat(columns.join(\" | \").length));\n\n const maxRows = 50;\n const displayRows = rows.slice(0, maxRows);\n\n for (const row of displayRows) {\n const values = columns.map((col) => {\n const val = row[col];\n if (val === null) return \"NULL\";\n if (typeof val === \"object\") return JSON.stringify(val);\n return String(val);\n });\n lines.push(values.join(\" | \"));\n }\n\n if (rows.length > maxRows) {\n lines.push(`\\n... (${rows.length - maxRows} more rows not shown)`);\n }\n\n lines.push(`\\nTotal rows: ${rows.length}`);\n\n return lines.join(\"\\n\");\n}\n\nexport const createQuerySqlTool = ({ databaseKeys, databaseDescriptions }: CreateSqlToolParams) => {\n const availableDbsText = databaseKeys.length > 0\n ? `\\n\\nAvailable databases:\\n${databaseKeys.map(key => \n `- ${key}${databaseDescriptions?.[key] ? `: ${databaseDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async (\n {\n query,\n databaseKey,\n }: {\n query: string;\n databaseKey: string;\n },\n exe_config: any\n ) => {\n try {\n if (!databaseKey) {\n return \"Error: databaseKey parameter is required. Available databases: \" + databaseKeys.join(', ');\n }\n\n if (!databaseKeys.includes(databaseKey)) {\n return `Error: databaseKey \"${databaseKey}\" is not in the allowed list: [${databaseKeys.join(', ')}]`;\n }\n\n const trimmedQuery = query.trim();\n if (!trimmedQuery) {\n return \"Error: Empty query provided. Please provide a valid SQL query.\";\n }\n\n const database = sqlDatabaseManager.getDatabase(databaseKey);\n const result = await database.executeQuery(trimmedQuery);\n\n return formatQueryResult(result.rows, result.fields);\n } catch (error) {\n return `Error executing query: ${\n error instanceof Error ? error.message : String(error)\n }`;\n }\n },\n {\n name: \"query_sql\",\n description: `Execute a SQL query against the database and return the results.${availableDbsText}`,\n schema: z.object({\n query: z\n .string()\n .describe(\n \"The SQL query to execute. Should be a valid SELECT, INSERT, UPDATE, or DELETE statement.\"\n ),\n databaseKey: z\n .string()\n .describe(`Target database to execute the query. Choose from: ${databaseKeys.join(', ')}`),\n }),\n }\n );\n};\n","/**\n * SemanticMetricsClient\n * Client implementation for Semantic Metrics Server\n * Provides datasource-aware metrics querying capabilities\n */\n\nimport {\n MetricsServerConfig,\n MetricMeta,\n MetricQueryResult,\n MetricDataPoint,\n DataSource,\n SemanticMetricsServerConfig,\n SemanticMetricsQueryRequest,\n SemanticMetricsQueryResponse,\n SemanticMetricsFilter,\n} from \"@axiom-lattice/protocols\";\nimport { IMetricsServerClient } from \"./MetricsServerManager\";\n\n/**\n * Semantic Metrics API Response wrapper\n */\ninterface SemanticApiResponse<T> {\n code: number;\n message: string;\n data: T;\n}\n\n/**\n * Metric meta item from datasource meta endpoint\n */\ninterface MetricMetaItem {\n metricName: string;\n displayName: string;\n domain: string;\n shortDesc: string;\n searchKeywords: string[];\n registered: boolean;\n}\n\n/**\n * Table meta item from datasource meta endpoint\n */\ninterface TableMetaItem {\n tableName: string;\n displayName: string;\n docType: string;\n docTypeEn: string;\n mainTable?: string;\n lineTable?: string;\n columnCount: number;\n shortDesc: string;\n}\n\n/**\n * Index data from datasource meta endpoint\n */\ninterface MetricMetaIndex {\n datasourceId: number;\n datasourceName: string;\n catalogVersion: string;\n domainCategories: string[];\n metrics: MetricMetaItem[];\n tables: TableMetaItem[];\n}\n\n/**\n * Table column definition\n */\ninterface TableColumnDetail {\n name: string;\n label: string;\n description?: string;\n type?: string;\n example?: string;\n}\n\n/**\n * Table detail from datasource meta endpoint\n */\ninterface TableMetaDetail {\n tableName: string;\n docType: string;\n docTypeEn: string;\n objTypeCode?: number;\n mainTable?: string;\n lineTable?: string;\n selectSql: string;\n columns: (TableColumnDetail | null)[];\n}\n\n/**\n * Datasource meta response data structure\n */\ninterface DatasourceMetaData {\n index: MetricMetaIndex;\n metricsDetails: MetricMetaDetail[];\n tablesDetails?: TableMetaDetail[];\n}\n\n/**\n * Metric meta detail item from datasource meta endpoint\n */\ninterface MetricMetaDetail {\n datasourceId: number;\n metricName: string;\n displayName: string;\n domain: string;\n description: string;\n dataType: string;\n format: string;\n defaultTimeContext: {\n timeDimension: string;\n label: string;\n granularity: string;\n window: string;\n supportedGrains: string[];\n };\n supportedDimensions: Array<{\n dim_id: string;\n field_name: string;\n type: string;\n filter_operators?: string[];\n filter_example?: object;\n group_by_example?: string;\n }>;\n aiAgentContext: {\n polarity: string;\n synonyms: string[];\n thresholds: Array<{\n metric: string;\n operator: string;\n value: number;\n level: string;\n }>;\n diagnosticWorkflow: {\n trigger: {\n any_of: Array<{\n metric: string;\n operator: string;\n value: number;\n }>;\n };\n actions: Array<{\n type: string;\n metric?: string;\n dimensions?: string[];\n intent: string;\n }>;\n analysis_logic: string;\n };\n humanReadableExplanation: string;\n };\n}\n\n/**\n * Semantic Metrics Client Implementation\n * Uses Semantic Metrics HTTP API for queries\n */\nexport class SemanticMetricsClient implements IMetricsServerClient {\n private config: SemanticMetricsServerConfig;\n private baseUrl: string;\n\n constructor(config: SemanticMetricsServerConfig) {\n this.config = config;\n // Normalize URL: remove trailing slash to avoid double slashes\n this.baseUrl = config.serverUrl.replace(/\\/$/, '');\n }\n\n /**\n * Test connection to the semantic metrics server\n * Attempts to fetch data sources as a connectivity test\n */\n async testConnection(): Promise<{ connected: boolean; latency?: number; error?: string }> {\n const startTime = Date.now();\n try {\n const response = await fetch(`${this.baseUrl}/datasources`, {\n method: \"GET\",\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = (await response.json()) as SemanticApiResponse<DataSource[]>;\n\n if (data.code !== 200) {\n throw new Error(`API error: ${data.message}`);\n }\n\n const latency = Date.now() - startTime;\n return { connected: true, latency };\n } catch (error) {\n return {\n connected: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Get list of available metrics from all selected data sources\n * Aggregates metrics across selected datasources\n */\n async listMetrics(): Promise<MetricMeta[]> {\n const selectedIds = this.config.selectedDataSources || [];\n \n if (selectedIds.length === 0) {\n return [];\n }\n\n const allMetrics: MetricMeta[] = [];\n const seenMetrics = new Set<string>();\n\n for (const datasourceId of selectedIds) {\n try {\n const metaData = await this.getDatasourceMetrics(datasourceId);\n for (const item of metaData.index.metrics) {\n if (!seenMetrics.has(item.metricName)) {\n seenMetrics.add(item.metricName);\n // Find detail for additional info\n const detail = metaData.metricsDetails.find((d: { metricName: string }) => d.metricName === item.metricName);\n allMetrics.push({\n name: item.metricName,\n type: detail?.dataType || 'number',\n description: item.shortDesc || detail?.description,\n labels: [],\n unit: undefined,\n });\n }\n }\n } catch (error) {\n console.warn(`Failed to get metrics for datasource ${datasourceId}:`, error);\n }\n }\n\n return allMetrics;\n }\n\n /**\n * Get metadata for a specific metric\n * Searches across selected datasources for the metric\n */\n async getMetricMeta(metricName: string): Promise<MetricMeta | null> {\n const selectedIds = this.config.selectedDataSources || [];\n \n for (const datasourceId of selectedIds) {\n try {\n const metaData = await this.getDatasourceMetrics(datasourceId);\n const item = metaData.index.metrics.find(m => m.metricName === metricName);\n if (item) {\n const detail = metaData.metricsDetails.find((d: { metricName: string }) => d.metricName === metricName);\n return {\n name: item.metricName,\n type: detail?.dataType || 'number',\n description: item.shortDesc || detail?.description,\n labels: [],\n unit: undefined,\n };\n }\n } catch (error) {\n console.warn(`Failed to get metric meta from datasource ${datasourceId}:`, error);\n }\n }\n\n return null;\n }\n\n /**\n * Query metric data - delegates to semanticQuery\n * Note: For semantic server, use semanticQuery() directly for full functionality\n */\n async queryMetricData(\n metricName: string,\n options: {\n startTime?: number;\n endTime?: number;\n step?: number;\n labels?: Record<string, string>;\n }\n ): Promise<MetricQueryResult> {\n const selectedIds = this.config.selectedDataSources || [];\n \n if (selectedIds.length === 0) {\n throw new Error(\"No data sources selected for this semantic metrics server\");\n }\n\n const datasourceId = selectedIds[0];\n\n const filters: SemanticMetricsFilter[] = [];\n if (options.startTime && options.endTime) {\n filters.push({\n dimension: \"timestamp\",\n operator: \"BETWEEN\",\n values: [\n new Date(options.startTime * 1000).toISOString(),\n new Date(options.endTime * 1000).toISOString(),\n ],\n });\n }\n\n if (options.labels) {\n for (const [key, value] of Object.entries(options.labels)) {\n filters.push({\n dimension: key,\n operator: \"=\",\n values: [value],\n });\n }\n }\n\n const request: SemanticMetricsQueryRequest = {\n datasourceId,\n metrics: [metricName],\n filters,\n limit: 1000,\n };\n\n const result = await this.semanticQuery(request);\n\n // Find the metric result for the requested metric\n const metricResult = result.results.find(r => r.metricName === metricName);\n \n const dataPoints: MetricDataPoint[] = metricResult?.rows.map((row, index) => ({\n timestamp: index * 1000, // Use index as timestamp if not provided\n value: typeof row.value === 'number' ? row.value : 0,\n labels: Object.fromEntries(\n Object.entries(row).map(([k, v]) => [k, String(v)])\n ),\n })) || [];\n\n return {\n metricName,\n dataPoints,\n metadata: {\n startTime: options.startTime ? options.startTime * 1000 : undefined,\n endTime: options.endTime ? options.endTime * 1000 : undefined,\n },\n };\n }\n\n /**\n * Get the server type\n */\n getServerType(): \"semantic\" {\n return \"semantic\";\n }\n\n /**\n * Get all available data sources from the semantic server\n * GET /datasources\n */\n async getDataSources(): Promise<DataSource[]> {\n const response = await fetch(`${this.baseUrl}/datasources`, {\n method: \"GET\",\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = (await response.json()) as SemanticApiResponse<DataSource[]>;\n\n if (data.code !== 200) {\n throw new Error(`API error: ${data.message}`);\n }\n\n return data.data || [];\n }\n\n /**\n * Get metrics meta for a specific data source\n * GET /datasources/{id}/meta\n */\n async getDatasourceMetrics(datasourceId: string): Promise<DatasourceMetaData> {\n const response = await fetch(\n `${this.baseUrl}/datasources/${encodeURIComponent(datasourceId)}/meta`,\n {\n method: \"GET\",\n headers: this.getHeaders(),\n }\n );\n\n if (!response.ok) {\n if (response.status === 404) {\n return { index: { datasourceId: 0, datasourceName: '', catalogVersion: '', domainCategories: [], metrics: [], tables: [] }, metricsDetails: [] };\n }\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = (await response.json()) as SemanticApiResponse<DatasourceMetaData>;\n\n if (data.code !== 200) {\n throw new Error(`API error: ${data.message}`);\n }\n\n // Return raw data directly\n return data.data;\n }\n\n /**\n * Execute a semantic metrics query\n * POST /metrics/query\n */\n async semanticQuery(request: SemanticMetricsQueryRequest): Promise<SemanticMetricsQueryResponse> {\n const response = await fetch(`${this.baseUrl}/metrics/query`, {\n method: \"POST\",\n headers: {\n ...this.getHeaders(),\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = (await response.json()) as SemanticApiResponse<SemanticMetricsQueryResponse>;\n\n if (data.code !== 200) {\n throw new Error(`API error: ${data.message}`);\n }\n\n return data.data;\n }\n\n /**\n * Get selected data sources for this configuration\n */\n getSelectedDataSources(): string[] {\n return this.config.selectedDataSources || [];\n }\n\n /**\n * Build request headers with authentication\n */\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n ...this.config.headers,\n };\n\n if (this.config.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.config.apiKey}`;\n } else if (this.config.username && this.config.password) {\n const auth = Buffer.from(`${this.config.username}:${this.config.password}`).toString(\"base64\");\n headers[\"Authorization\"] = `Basic ${auth}`;\n }\n\n return headers;\n }\n}\n","/**\n * MetricsServerManager\n * Singleton manager for Metrics Server connections\n */\n\nimport {\n MetricsServerConfig,\n MetricsServerType,\n MetricMeta,\n MetricQueryResult,\n MetricDataPoint,\n SemanticMetricsServerConfig,\n} from \"@axiom-lattice/protocols\";\nimport { SemanticMetricsClient } from \"./SemanticMetricsClient\";\n\n/**\n * Metrics Server Client Interface\n * Defines the contract for metrics server implementations\n */\nexport interface IMetricsServerClient {\n /**\n * Test connection to the metrics server\n */\n testConnection(): Promise<{ connected: boolean; latency?: number; error?: string }>;\n\n /**\n * Get list of available metrics\n */\n listMetrics(): Promise<MetricMeta[]>;\n\n /**\n * Get metadata for a specific metric\n * @param metricName - Name of the metric\n */\n getMetricMeta(metricName: string): Promise<MetricMeta | null>;\n\n /**\n * Query metric data\n * @param metricName - Name of the metric\n * @param options - Query options\n */\n queryMetricData(\n metricName: string,\n options: {\n startTime?: number;\n endTime?: number;\n step?: number;\n labels?: Record<string, string>;\n }\n ): Promise<MetricQueryResult>;\n\n /**\n * Get the server type\n */\n getServerType(): MetricsServerType;\n}\n\n/**\n * Prometheus Client Implementation\n * Uses Prometheus HTTP API for queries\n */\nexport class PrometheusClient implements IMetricsServerClient {\n private config: MetricsServerConfig;\n\n constructor(config: MetricsServerConfig) {\n this.config = config;\n }\n\n async testConnection(): Promise<{ connected: boolean; latency?: number; error?: string }> {\n const startTime = Date.now();\n try {\n const response = await fetch(`${this.config.serverUrl}/api/v1/status/buildinfo`, {\n method: \"GET\",\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const latency = Date.now() - startTime;\n return { connected: true, latency };\n } catch (error) {\n return {\n connected: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n async listMetrics(): Promise<MetricMeta[]> {\n try {\n const response = await fetch(`${this.config.serverUrl}/api/v1/label/__name__/values`, {\n method: \"GET\",\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = await response.json() as { status: string; error?: string; data?: string[] };\n\n if (data.status !== \"success\") {\n throw new Error(`Prometheus error: ${data.error || \"Unknown error\"}`);\n }\n\n // Get metadata for each metric\n const metrics: MetricMeta[] = [];\n for (const name of data.data || []) {\n const meta = await this.getMetricMeta(name);\n if (meta) {\n metrics.push(meta);\n } else {\n metrics.push({ name });\n }\n }\n\n return metrics;\n } catch (error) {\n throw new Error(`Failed to list metrics: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n async getMetricMeta(metricName: string): Promise<MetricMeta | null> {\n try {\n const response = await fetch(\n `${this.config.serverUrl}/api/v1/metadata?metric=${encodeURIComponent(metricName)}`,\n {\n method: \"GET\",\n headers: this.getHeaders(),\n }\n );\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = await response.json() as { status: string; data: Record<string, Array<{ type: string; help: string; unit: string }>> };\n\n if (data.status !== \"success\" || !data.data[metricName]) {\n return { name: metricName };\n }\n\n const metadata = data.data[metricName][0];\n return {\n name: metricName,\n type: metadata.type,\n description: metadata.help,\n unit: metadata.unit,\n };\n } catch (error) {\n console.warn(`Failed to get metric metadata for ${metricName}:`, error);\n return { name: metricName };\n }\n }\n\n async queryMetricData(\n metricName: string,\n options: {\n startTime?: number;\n endTime?: number;\n step?: number;\n labels?: Record<string, string>;\n }\n ): Promise<MetricQueryResult> {\n const endTime = options.endTime || Math.floor(Date.now() / 1000);\n const startTime = options.startTime || endTime - 3600; // Default 1 hour\n const step = options.step || 60; // Default 60 seconds\n\n // Build query with labels\n let query = metricName;\n if (options.labels && Object.keys(options.labels).length > 0) {\n const labelSelectors = Object.entries(options.labels)\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(\",\");\n query = `${metricName}{${labelSelectors}}`;\n }\n\n try {\n const response = await fetch(\n `${this.config.serverUrl}/api/v1/query_range?query=${encodeURIComponent(query)}&start=${startTime}&end=${endTime}&step=${step}`,\n {\n method: \"GET\",\n headers: this.getHeaders(),\n }\n );\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = await response.json() as {\n status: string;\n error?: string;\n data?: { result?: Array<{ metric?: Record<string, string>; values?: Array<[string, string]> }> };\n };\n\n if (data.status !== \"success\") {\n throw new Error(`Prometheus error: ${data.error || \"Unknown error\"}`);\n }\n\n // Parse data points\n const dataPoints: MetricDataPoint[] = [];\n const result = data.data?.result || [];\n\n for (const series of result) {\n const labels = series.metric || {};\n for (const [timestamp, value] of series.values || []) {\n dataPoints.push({\n timestamp: parseFloat(timestamp) * 1000, // Convert to milliseconds\n value: parseFloat(value),\n labels,\n });\n }\n }\n\n return {\n metricName,\n dataPoints,\n metadata: {\n startTime: startTime * 1000,\n endTime: endTime * 1000,\n step: step * 1000,\n },\n };\n } catch (error) {\n throw new Error(`Failed to query metric data: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n getServerType(): MetricsServerType {\n return \"prometheus\";\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n ...this.config.headers,\n };\n\n if (this.config.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.config.apiKey}`;\n } else if (this.config.username && this.config.password) {\n const auth = Buffer.from(`${this.config.username}:${this.config.password}`).toString(\"base64\");\n headers[\"Authorization\"] = `Basic ${auth}`;\n }\n\n return headers;\n }\n}\n\n/**\n * Custom/Generic Metrics Client Implementation\n * Uses a generic REST API approach\n */\nexport class CustomMetricsClient implements IMetricsServerClient {\n private config: MetricsServerConfig;\n\n constructor(config: MetricsServerConfig) {\n this.config = config;\n }\n\n async testConnection(): Promise<{ connected: boolean; latency?: number; error?: string }> {\n const startTime = Date.now();\n try {\n const response = await fetch(`${this.config.serverUrl}/health`, {\n method: \"GET\",\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const latency = Date.now() - startTime;\n return { connected: true, latency };\n } catch (error) {\n return {\n connected: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n async listMetrics(): Promise<MetricMeta[]> {\n try {\n const response = await fetch(`${this.config.serverUrl}/api/metrics`, {\n method: \"GET\",\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = await response.json() as { metrics?: MetricMeta[] };\n return data.metrics || [];\n } catch (error) {\n throw new Error(`Failed to list metrics: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n async getMetricMeta(metricName: string): Promise<MetricMeta | null> {\n try {\n const response = await fetch(\n `${this.config.serverUrl}/api/metrics/${encodeURIComponent(metricName)}/meta`,\n {\n method: \"GET\",\n headers: this.getHeaders(),\n }\n );\n\n if (!response.ok) {\n if (response.status === 404) {\n return null;\n }\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n return await response.json() as MetricMeta;\n } catch (error) {\n throw new Error(`Failed to get metric metadata: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n async queryMetricData(\n metricName: string,\n options: {\n startTime?: number;\n endTime?: number;\n step?: number;\n labels?: Record<string, string>;\n }\n ): Promise<MetricQueryResult> {\n try {\n const queryParams = new URLSearchParams();\n if (options.startTime) queryParams.append(\"start\", options.startTime.toString());\n if (options.endTime) queryParams.append(\"end\", options.endTime.toString());\n if (options.step) queryParams.append(\"step\", options.step.toString());\n if (options.labels) {\n queryParams.append(\"labels\", JSON.stringify(options.labels));\n }\n\n const response = await fetch(\n `${this.config.serverUrl}/api/metrics/${encodeURIComponent(metricName)}/data?${queryParams}`,\n {\n method: \"GET\",\n headers: this.getHeaders(),\n }\n );\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n return await response.json() as MetricQueryResult;\n } catch (error) {\n throw new Error(`Failed to query metric data: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n getServerType(): MetricsServerType {\n return \"custom\";\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n ...this.config.headers,\n };\n\n if (this.config.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.config.apiKey}`;\n } else if (this.config.username && this.config.password) {\n const auth = Buffer.from(`${this.config.username}:${this.config.password}`).toString(\"base64\");\n headers[\"Authorization\"] = `Basic ${auth}`;\n }\n\n return headers;\n }\n}\n\n/**\n * Metrics Server Manager\n * Manages metrics server connections and provides a unified interface\n */\nexport class MetricsServerManager {\n private static instance: MetricsServerManager;\n private clients: Map<string, IMetricsServerClient> = new Map();\n private configs: Map<string, MetricsServerConfig> = new Map();\n private defaultServerKey: string | null = null;\n\n private constructor() {}\n\n /**\n * Get the singleton instance\n */\n static getInstance(): MetricsServerManager {\n if (!MetricsServerManager.instance) {\n MetricsServerManager.instance = new MetricsServerManager();\n }\n return MetricsServerManager.instance;\n }\n\n /**\n * Register a metrics server\n * @param key - Unique identifier for the server\n * @param config - Metrics server configuration\n */\n registerServer(key: string, config: MetricsServerConfig): void {\n let client: IMetricsServerClient;\n\n switch (config.type) {\n case \"prometheus\":\n client = new PrometheusClient(config);\n break;\n case \"custom\":\n client = new CustomMetricsClient(config);\n break;\n case \"semantic\":\n client = new SemanticMetricsClient(config as SemanticMetricsServerConfig);\n break;\n default:\n throw new Error(`Unsupported metrics server type: ${config.type}`);\n }\n\n this.clients.set(key, client);\n this.configs.set(key, config);\n\n // Set as default if it's the first server\n if (this.defaultServerKey === null) {\n this.defaultServerKey = key;\n }\n }\n\n /**\n * Set the default metrics server\n * @param key - Server key to set as default\n */\n setDefaultServer(key: string): void {\n if (!this.clients.has(key)) {\n throw new Error(`Metrics server '${key}' not found`);\n }\n this.defaultServerKey = key;\n }\n\n /**\n * Get a metrics server client by key\n * @param key - Server key (optional, uses default if not provided)\n */\n getClient(key?: string): IMetricsServerClient {\n const serverKey = key || this.defaultServerKey;\n if (!serverKey) {\n throw new Error(\"No metrics server registered\");\n }\n\n const client = this.clients.get(serverKey);\n if (!client) {\n throw new Error(`Metrics server '${serverKey}' not found`);\n }\n\n return client;\n }\n\n /**\n * Get metrics server configuration by key\n * @param key - Server key (optional, uses default if not provided)\n */\n getConfig(key?: string): MetricsServerConfig {\n const serverKey = key || this.defaultServerKey;\n if (!serverKey) {\n throw new Error(\"No metrics server registered\");\n }\n\n const config = this.configs.get(serverKey);\n if (!config) {\n throw new Error(`Metrics server '${serverKey}' not found`);\n }\n\n return config;\n }\n\n /**\n * Check if a metrics server is registered\n * @param key - Server key\n */\n hasServer(key: string): boolean {\n return this.clients.has(key);\n }\n\n /**\n * Get all registered metrics server keys with their types\n */\n getServerKeys(): { key: string; type: MetricsServerType; name?: string }[] {\n return Array.from(this.configs.entries()).map(([key, config]) => ({\n key,\n type: config.type,\n }));\n }\n\n /**\n * Remove a metrics server\n * @param key - Server key\n */\n removeServer(key: string): void {\n this.clients.delete(key);\n this.configs.delete(key);\n\n if (this.defaultServerKey === key) {\n this.defaultServerKey =\n this.clients.size > 0 ? this.clients.keys().next().value || null : null;\n }\n }\n\n /**\n * Load metrics server configurations from a store\n * and register them with this manager\n *\n * @param store - The metrics server configuration store\n * @param tenantId - Tenant identifier\n */\n async loadConfigsFromStore(\n store: import(\"@axiom-lattice/protocols\").MetricsServerConfigStore,\n tenantId: string\n ): Promise<void> {\n const configs = await store.getAllConfigs(tenantId);\n\n for (const entry of configs) {\n this.registerServer(entry.key, entry.config);\n }\n }\n\n /**\n * Load all metrics server configurations from a store\n * across all tenants and register them with this manager\n *\n * @param store - The metrics server configuration store\n */\n async loadAllConfigsFromStore(\n store: import(\"@axiom-lattice/protocols\").MetricsServerConfigStore\n ): Promise<void> {\n const configs = await store.getAllConfigsWithoutTenant();\n\n for (const entry of configs) {\n this.registerServer(entry.key, entry.config);\n }\n }\n}\n\n// Export singleton instance\nexport const metricsServerManager = MetricsServerManager.getInstance();\nexport { SemanticMetricsClient } from \"./SemanticMetricsClient\";\n","/**\n * List Metrics Servers Tool\n * Tool for listing all registered metrics servers\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { metricsServerManager } from \"./MetricsServerManager\";\n\nconst LIST_METRICS_SERVERS_DESCRIPTION = `List all registered metrics servers. Returns a list of available metrics servers with their keys and types. Use this tool first to understand what metrics servers are available.`;\n\nexport interface CreateMetricsToolParams {\n serverKeys: string[];\n serverDescriptions?: Record<string, string>;\n}\n\nexport const createListMetricsServersTool = ({ serverKeys, serverDescriptions }: CreateMetricsToolParams) => {\n const availableServersText = serverKeys.length > 0\n ? `\\n\\nAvailable metrics servers:\\n${serverKeys.map(key => \n `- ${key}${serverDescriptions?.[key] ? `: ${serverDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async (_input: {}, _exeConfig: any) => {\n try {\n const servers = metricsServerManager.getServerKeys();\n\n if (servers.length === 0) {\n return \"No metrics servers registered.\";\n }\n\n const lines = servers.map(({ key, type }) => {\n const desc = serverDescriptions?.[key] ? ` - ${serverDescriptions[key]}` : '';\n return `- ${key} (${type})${desc}`;\n });\n\n return `Available metrics servers:\\n${lines.join('\\n')}`;\n } catch (error) {\n return `Error listing metrics servers: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"list_metrics_servers\",\n description: `${LIST_METRICS_SERVERS_DESCRIPTION}${availableServersText}`,\n schema: z.object({}),\n }\n );\n};\n","/**\n * List Metrics DataSources Tool\n * Tool for listing all datasources from all configured metrics servers\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { metricsServerManager, SemanticMetricsClient } from \"./MetricsServerManager\";\n\nconst LIST_METRICS_DATASOURCES_DESCRIPTION = `List all available datasources from all configured metrics servers. Returns a table with Server Key, DataSource ID, and DataSource Name. Use this tool first to discover what datasources are available before querying metrics.`;\n\nexport interface CreateMetricsToolParams {\n serverKeys: string[];\n serverDescriptions?: Record<string, string>;\n}\n\ninterface DataSourceInfo {\n serverKey: string;\n datasourceId: string;\n datasourceName: string;\n}\n\nexport const createListMetricsDataSourcesTool = ({ serverKeys, serverDescriptions }: CreateMetricsToolParams) => {\n const availableServersText = serverKeys.length > 0\n ? `\\n\\nConfigured metrics servers:\\n${serverKeys.map(key => \n `- ${key}${serverDescriptions?.[key] ? `: ${serverDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async (_input: {}, _exeConfig: any) => {\n try {\n if (serverKeys.length === 0) {\n return \"No metrics servers configured.\";\n }\n\n const allDataSources: DataSourceInfo[] = [];\n\n for (const serverKey of serverKeys) {\n try {\n const config = metricsServerManager.getConfig(serverKey);\n \n if (config.type !== \"semantic\") {\n console.warn(`Server \"${serverKey}\" is not a semantic metrics server, skipping.`);\n continue;\n }\n\n const client = metricsServerManager.getClient(serverKey) as SemanticMetricsClient;\n const dataSources = await client.getDataSources();\n \n // Filter by selectedDataSources if configured\n const selectedIds = (config as any).selectedDataSources || [];\n const filteredDataSources = selectedIds.length > 0\n ? dataSources.filter(ds => selectedIds.includes(String(ds.id)))\n : dataSources;\n\n for (const ds of filteredDataSources) {\n allDataSources.push({\n serverKey,\n datasourceId: String(ds.id),\n datasourceName: ds.name || String(ds.id),\n });\n }\n } catch (error) {\n console.warn(`Failed to get datasources from server \"${serverKey}\":`, error);\n }\n }\n\n if (allDataSources.length === 0) {\n return `No datasources found in any configured metrics servers.`;\n }\n\n // Format as table\n const lines: string[] = [];\n lines.push(`Found ${allDataSources.length} datasource(s) from ${serverKeys.length} server(s):\\n`);\n lines.push(\"| Server Key | DataSource ID | Name |\");\n lines.push(\"|------------|---------------|------|\");\n\n for (const ds of allDataSources) {\n lines.push(`| ${ds.serverKey} | ${ds.datasourceId} | ${ds.datasourceName} |`);\n }\n\n lines.push(\"\\nUse the Server Key and DataSource ID when calling other metrics tools.\");\n\n return lines.join('\\n');\n } catch (error) {\n return `Error listing datasources: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"list_metrics_datasources\",\n description: `${LIST_METRICS_DATASOURCES_DESCRIPTION}${availableServersText}`,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Query Metrics List Tool\n * Tool for querying available metrics from semantic metrics server data sources\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { metricsServerManager, SemanticMetricsClient } from \"./MetricsServerManager\";\n\nconst QUERY_METRICS_LIST_DESCRIPTION = `Query Available Metrics - Step 1 of the Metrics Workflow\n\nDiscover what metrics exist in the semantic metrics server. This tool returns a list of available metrics with their domains and descriptions.\n\nWhen to Use This Tool\nUse this tool proactively in these scenarios:\n- When the user asks about business metrics but does not specify exact metric names\n- When you need to find metrics matching a specific domain (e.g., \"sales performance\", \"pricing\")\n- At the start of ANY metrics-related conversation to understand available data\n- When the user asks \"what metrics do we have?\" or \"show me available KPIs\"\n\nWhen NOT to Use This Tool\nSkip using this tool when:\n- The user has already provided exact metric names (proceed directly to query_metric_definition)\n- You have cached metric metadata from a recent call (within the same conversation)\n- The query is purely about retrieving data, not discovering what's available\n\nThe Three-Step Metrics Workflow\n1. query_metrics_list (THIS TOOL) → discover available metrics\n2. query_metric_definition → read metric metadata before querying\n3. query_semantic_metric_data → execute the query with correct parameters\n\nResponse Fields Reference\n| Field | How to Use It |\n|-------|---------------|\n| metricName | The identifier passed to query_metric_definition and query_semantic_metric_data |\n| domain | Groups related metrics (e.g., sales_performance, pricing_and_margin) |\n| shortDesc | One-line description to present to the user |\n| displayName | Human-readable name of the metric |\n\nNext Step\nAfter finding relevant metrics, call query_metric_definition with the metricName to get detailed metadata including time dimensions and supported filters.`;\n\nexport interface CreateMetricsToolParams {\n serverKeys: string[];\n serverDescriptions?: Record<string, string>;\n}\n\nexport const createQueryMetricsListTool = ({ serverKeys, serverDescriptions }: CreateMetricsToolParams) => {\n const availableServersText = serverKeys.length > 0\n ? `\\n\\nAvailable metrics servers:\\n${serverKeys.map(key => \n `- ${key}${serverDescriptions?.[key] ? `: ${serverDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async (\n {\n serverKey,\n datasourceIds,\n }: {\n serverKey: string;\n datasourceIds?: string[];\n },\n _exeConfig: any\n ) => {\n try {\n if (!serverKey) {\n return \"Error: serverKey parameter is required. Available servers: \" + serverKeys.join(', ');\n }\n\n if (!serverKeys.includes(serverKey)) {\n return `Error: serverKey \"${serverKey}\" is not in the allowed list: [${serverKeys.join(', ')}]`;\n }\n\n const config = metricsServerManager.getConfig(serverKey);\n \n if (config.type !== \"semantic\") {\n return `Error: Server \"${serverKey}\" is not a semantic metrics server. This tool only works with semantic servers.`;\n }\n\n const client = metricsServerManager.getClient(serverKey) as SemanticMetricsClient;\n \n const targetDatasourceIds = datasourceIds && datasourceIds.length > 0\n ? datasourceIds\n : client.getSelectedDataSources();\n\n if (targetDatasourceIds.length === 0) {\n return `Error: No data sources specified and no default data sources configured for server \"${serverKey}\".`;\n }\n\n interface MetricInfo {\n metricName: string;\n displayName: string;\n domain: string;\n shortDesc: string;\n datasources: string[];\n }\n\n const allMetrics: Map<string, MetricInfo> = new Map();\n\n for (const datasourceId of targetDatasourceIds) {\n try {\n const metaData = await client.getDatasourceMetrics(datasourceId);\n const index = metaData.index;\n\n for (const item of index.metrics) {\n if (allMetrics.has(item.metricName)) {\n const existing = allMetrics.get(item.metricName)!;\n if (!existing.datasources.includes(datasourceId)) {\n existing.datasources.push(datasourceId);\n }\n } else {\n allMetrics.set(item.metricName, {\n metricName: item.metricName,\n displayName: item.displayName,\n domain: item.domain,\n shortDesc: item.shortDesc,\n datasources: [datasourceId],\n });\n }\n }\n } catch (error) {\n console.warn(`Failed to get metrics for datasource ${datasourceId}:`, error);\n }\n }\n\n // 按 datasourceId 组织指标\n const metricsByDatasource = new Map<string, MetricInfo[]>();\n \n for (const metric of allMetrics.values()) {\n for (const dsId of metric.datasources) {\n if (!metricsByDatasource.has(dsId)) {\n metricsByDatasource.set(dsId, []);\n }\n // 为每个数据源创建一个独立的 metric 对象(不包含 datasources 字段)\n metricsByDatasource.get(dsId)!.push(metric);\n }\n }\n\n if (metricsByDatasource.size === 0) {\n return `未在指定的数据源中找到指标。`;\n }\n\n const lines: string[] = [];\n lines.push(`## 业务指标列表(serverKey: ${serverKey})\\n`);\n\n // 按 datasourceId 排序\n const sortedDatasourceIds = Array.from(metricsByDatasource.keys()).sort();\n\n for (const dsId of sortedDatasourceIds) {\n const metrics = metricsByDatasource.get(dsId)!;\n \n // 按 domain 和 metricName 排序\n const sortedMetrics = metrics.sort((a, b) => {\n if (a.domain !== b.domain) {\n return a.domain.localeCompare(b.domain);\n }\n return a.metricName.localeCompare(b.metricName);\n });\n\n lines.push(`### datasourceId: ${dsId}(${metrics.length} 个指标)\\n`);\n \n // Markdown table header\n lines.push('| metricName | displayName | domain | shortDesc |');\n lines.push('|------------|-------------|--------|-----------|');\n\n // Table rows\n for (const metric of sortedMetrics) {\n const shortDesc = metric.shortDesc || '';\n lines.push(`| ${metric.metricName} | ${metric.displayName} | ${metric.domain} | ${shortDesc} |`);\n }\n\n lines.push('');\n }\n\n lines.push('---');\n lines.push('');\n lines.push('如需查看指标的详细定义,请使用 **query_metric_definition** 工具,传入参数:`serverKey`、`metricName`、`datasourceId`');\n\n return lines.join('\\n');\n } catch (error) {\n return `Error querying metrics list: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"query_metrics_list\",\n description: `${QUERY_METRICS_LIST_DESCRIPTION}${availableServersText}`,\n schema: z.object({\n serverKey: z\n .string()\n .describe(`Target semantic metrics server. Choose from: ${serverKeys.join(', ')}`),\n datasourceIds: z\n .array(z.string())\n .optional()\n .describe(\"Optional array of datasource IDs to query. If not provided, uses all selected datasources.\"),\n }),\n }\n );\n};\n","/**\n * Query Metric Definition Tool\n * Tool for getting detailed definition of a specific semantic metric\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { metricsServerManager, SemanticMetricsClient } from \"./MetricsServerManager\";\n\nconst QUERY_METRIC_DEFINITION_DESCRIPTION = `Get Metric Definition - Step 2 of the Metrics Workflow\n\nRead detailed metadata for a specific metric before querying it.\n\nWhen to Use This Tool\n- BEFORE calling query_semantic_metric_data for any metric\n- When you need to understand time dimensions and supported grains\n- When you need to know which dimensions are available for GROUP BY and filtering\n\nWhen NOT to Use This Tool\n- You have already retrieved the metric definition in this conversation\n- You are only listing available metrics (use query_metrics_list instead)\n\nKey Response Sections\n\n1. defaultTimeContext - Time Configuration\n- timeDimension: Primary date field (e.g., \"DocDate\")\n- supportedGrains: Available grains [\"day\", \"week\", \"month\", \"year\"]\n- Format: Use \"{timeDimension}__{grain}\" for time grouping\n\n2. supportedDimensions - Available Axes\nEach dimension has: dim_id, field_name, type (categorical/datetime)\n\nFilter Patterns by Type:\n- categorical → {\"dimension\": \"dim_id\", \"operator\": \"IN\", \"values\": [\"v1\", \"v2\"]}\n- datetime → {\"dimension\": \"dim_id\", \"operator\": \"BETWEEN\", \"values\": [\"2025-01-01\", \"2025-12-31\"]}\n\nGroupBy Patterns:\n- categorical → Use dim_id directly (e.g., \"org_region\")\n- datetime → Use \"{dim_id}__{grain}\" (e.g., \"DocDate__month\")\n\nRules\n- Use dim_id (never field_name) in filters and groupBy\n- Time grain format: lowercase (day/week/month/year)\n- Categorical: IN for multiple, EQ for single\n- Datetime: BETWEEN for ranges, GT/LT for open-ended\n\nNext Step\nCall query_semantic_metric_data with parameters derived from this definition.`\n\nexport interface CreateMetricsToolParams {\n serverKeys: string[];\n serverDescriptions?: Record<string, string>;\n}\n\ninterface MetricDetail {\n datasourceId: number;\n metricName: string;\n displayName: string;\n domain: string;\n description: string;\n dataType: string;\n format: string;\n defaultTimeContext: {\n timeDimension: string;\n label: string;\n granularity: string;\n window: string;\n supportedGrains: string[];\n };\n supportedDimensions: Array<{\n dim_id: string;\n field_name: string;\n type: string;\n }>;\n aiAgentContext: {\n polarity: string;\n synonyms: string[];\n thresholds: Array<{\n metric: string;\n operator: string;\n value: number;\n level: string;\n }>;\n diagnosticWorkflow: {\n trigger: {\n any_of: Array<{\n metric: string;\n operator: string;\n value: number;\n }>;\n };\n actions: Array<{\n type: string;\n metric?: string;\n dimensions?: string[];\n intent: string;\n }>;\n analysis_logic: string;\n };\n humanReadableExplanation: string;\n };\n}\n\nexport const createQueryMetricDefinitionTool = ({ serverKeys, serverDescriptions }: CreateMetricsToolParams) => {\n const availableServersText = serverKeys.length > 0\n ? `\\n\\nAvailable metrics servers:\\n${serverKeys.map(key => \n `- ${key}${serverDescriptions?.[key] ? `: ${serverDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async (\n {\n serverKey,\n metricName,\n datasourceId,\n }: {\n serverKey: string;\n metricName: string;\n datasourceId?: string;\n },\n _exeConfig: any\n ) => {\n try {\n if (!serverKey) {\n return \"Error: serverKey parameter is required. Available servers: \" + serverKeys.join(', ');\n }\n\n if (!serverKeys.includes(serverKey)) {\n return `Error: serverKey \"${serverKey}\" is not in the allowed list: [${serverKeys.join(', ')}]`;\n }\n\n if (!metricName) {\n return \"Error: metricName parameter is required.\";\n }\n\n const config = metricsServerManager.getConfig(serverKey);\n \n if (config.type !== \"semantic\") {\n return `Error: Server \"${serverKey}\" is not a semantic metrics server. This tool only works with semantic servers.`;\n }\n\n const client = metricsServerManager.getClient(serverKey) as SemanticMetricsClient;\n \n const targetDatasourceIds = datasourceId \n ? [datasourceId]\n : client.getSelectedDataSources();\n\n if (targetDatasourceIds.length === 0) {\n return `Error: No datasourceId specified and no default data sources configured for server \"${serverKey}\".`;\n }\n\n let foundDetail: MetricDetail | null = null;\n let foundDatasourceId: string | null = null;\n\n for (const dsId of targetDatasourceIds) {\n try {\n const metaData = await client.getDatasourceMetrics(dsId);\n const item = metaData.index.metrics.find((m: { metricName: string }) => m.metricName === metricName);\n if (item) {\n const detail = metaData.metricsDetails.find((d: { metricName: string }) => d.metricName === metricName) as MetricDetail | undefined;\n if (detail) {\n foundDetail = detail;\n foundDatasourceId = dsId;\n }\n break;\n }\n } catch (error) {\n console.warn(`Failed to get metrics for datasource ${dsId}:`, error);\n }\n }\n\n if (!foundDetail) {\n return `Metric \"${metricName}\" not found in the specified data sources.`;\n }\n\n const lines: string[] = [];\n \n // 标题\n lines.push(`# ${foundDetail.displayName} (${foundDetail.metricName})`);\n lines.push('');\n \n // 基本信息\n lines.push(`## 基本信息`);\n lines.push('');\n lines.push(`- **指标名称**: ${foundDetail.metricName}`);\n lines.push(`- **显示名称**: ${foundDetail.displayName}`);\n lines.push(`- **所属领域**: ${foundDetail.domain}`);\n lines.push(`- **数据类型**: ${foundDetail.dataType}`);\n lines.push(`- **显示格式**: ${foundDetail.format}`);\n if (foundDatasourceId) {\n lines.push(`- **数据源ID**: ${foundDatasourceId}`);\n }\n lines.push('');\n \n // 描述\n lines.push(`## 指标描述`);\n lines.push('');\n lines.push(foundDetail.description);\n lines.push('');\n \n // 时间上下文\n if (foundDetail.defaultTimeContext) {\n lines.push(`## 时间上下文`);\n lines.push('');\n lines.push(`- **时间维度**: ${foundDetail.defaultTimeContext.timeDimension} (${foundDetail.defaultTimeContext.label})`);\n lines.push(`- **默认粒度**: ${foundDetail.defaultTimeContext.granularity}`);\n lines.push(`- **默认窗口**: ${foundDetail.defaultTimeContext.window}`);\n lines.push(`- **支持的粒度**: ${foundDetail.defaultTimeContext.supportedGrains.join('、')}`);\n lines.push('');\n }\n \n // 支持维度\n if (foundDetail.supportedDimensions && foundDetail.supportedDimensions.length > 0) {\n const categoricalDims = foundDetail.supportedDimensions.filter(d => d.type === 'categorical');\n const datetimeDims = foundDetail.supportedDimensions.filter(d => d.type === 'datetime');\n const timeDimension = foundDetail.defaultTimeContext?.timeDimension;\n \n lines.push(`## 支持的维度`);\n lines.push('');\n \n // 分类维度\n if (categoricalDims.length > 0) {\n lines.push(`### 分类维度 (categorical) - ${categoricalDims.length} 个`);\n lines.push('支持 IN(多选)、EQ(单选)操作符');\n lines.push('');\n \n // 展示前2个作为示例\n const examples = categoricalDims.slice(0, 2);\n for (const dim of examples) {\n lines.push(`**${dim.dim_id}** (${dim.field_name})`);\n lines.push('```json');\n lines.push(`// 分组示例`);\n lines.push(`\"groupBy\": [\"${dim.dim_id}\"]`);\n lines.push('');\n lines.push(`// 过滤示例`);\n lines.push(`{\"dimension\": \"${dim.dim_id}\", \"operator\": \"IN\", \"values\": [\"value1\", \"value2\"]}`);\n lines.push('```');\n lines.push('');\n }\n \n if (categoricalDims.length > 2) {\n const others = categoricalDims.slice(2).map(d => d.dim_id).join('、');\n lines.push(`**其他 ${categoricalDims.length - 2} 个维度**: ${others}`);\n lines.push('');\n }\n }\n \n // 时间维度\n if (datetimeDims.length > 0) {\n lines.push(`### 时间维度 (datetime) - ${datetimeDims.length} 个`);\n lines.push('支持 BETWEEN(范围)、GT/GTE/LT/LTE(比较)操作符');\n lines.push('');\n \n // 展示主时间维度\n const primaryDim = datetimeDims.find(d => d.dim_id === timeDimension) || datetimeDims[0];\n lines.push(`**${primaryDim.dim_id}** (${primaryDim.field_name})`);\n lines.push('```json');\n lines.push(`// 按时间粒度分组`);\n lines.push(`\"groupBy\": [\"${primaryDim.dim_id}__month\"] // 可选: day, week, month, year`);\n lines.push('');\n lines.push(`// 时间范围过滤`);\n lines.push(`{\"dimension\": \"${primaryDim.dim_id}\", \"operator\": \"BETWEEN\", \"values\": [\"2025-01-01\", \"2025-12-31\"]}`);\n lines.push('```');\n lines.push('');\n \n if (datetimeDims.length > 1) {\n const others = datetimeDims.filter(d => d.dim_id !== primaryDim.dim_id).map(d => d.dim_id).join('、');\n lines.push(`**其他时间维度**: ${others}`);\n lines.push('');\n }\n }\n \n // 快速参考\n lines.push('### 快速参考');\n lines.push('');\n lines.push('**时间分组格式**: `{timeDimension}__{grain}`');\n lines.push('- 按天: `DocDate__day`');\n lines.push('- 按周: `DocDate__week`');\n lines.push('- 按月: `DocDate__month`');\n lines.push('- 按年: `DocDate__year`');\n lines.push('');\n }\n \n // AI Agent 上下文\n if (foundDetail.aiAgentContext) {\n const aiContext = foundDetail.aiAgentContext;\n lines.push(`## AI 分析上下文`);\n lines.push('');\n \n // 极性\n lines.push(`### 指标极性`);\n lines.push('');\n lines.push(aiContext.polarity === 'positive' ? '正向指标(越高越好)' : '负向指标(越低越好)');\n lines.push('');\n \n // 同义词\n if (aiContext.synonyms && aiContext.synonyms.length > 0) {\n lines.push(`### 同义词/别名`);\n lines.push('');\n lines.push(aiContext.synonyms.join('、'));\n lines.push('');\n }\n \n // 阈值\n if (aiContext.thresholds && aiContext.thresholds.length > 0) {\n lines.push(`### 预警阈值`);\n lines.push('');\n lines.push('| 指标 | 运算符 | 阈值 | 级别 |');\n lines.push('|------|--------|------|------|');\n for (const t of aiContext.thresholds) {\n lines.push(`| ${t.metric} | ${t.operator} | ${t.value} | ${t.level} |`);\n }\n lines.push('');\n }\n \n // 诊断工作流\n if (aiContext.diagnosticWorkflow) {\n lines.push(`### 诊断工作流`);\n lines.push('');\n \n if (aiContext.diagnosticWorkflow.trigger && aiContext.diagnosticWorkflow.trigger.any_of) {\n lines.push(`**触发条件** (满足任一):`);\n for (const trigger of aiContext.diagnosticWorkflow.trigger.any_of) {\n lines.push(`- ${trigger.metric} ${trigger.operator} ${trigger.value}`);\n }\n lines.push('');\n }\n \n if (aiContext.diagnosticWorkflow.actions && aiContext.diagnosticWorkflow.actions.length > 0) {\n lines.push(`**分析动作**:`);\n for (let i = 0; i < aiContext.diagnosticWorkflow.actions.length; i++) {\n const action = aiContext.diagnosticWorkflow.actions[i];\n lines.push(`${i + 1}. **${action.type}**`);\n if (action.metric) {\n lines.push(` - 对比指标: ${action.metric}`);\n }\n if (action.dimensions && action.dimensions.length > 0) {\n lines.push(` - 下钻维度: ${action.dimensions.join('、')}`);\n }\n lines.push(` - 目的: ${action.intent}`);\n }\n lines.push('');\n }\n \n if (aiContext.diagnosticWorkflow.analysis_logic) {\n lines.push(`**分析逻辑**: ${aiContext.diagnosticWorkflow.analysis_logic}`);\n lines.push('');\n }\n }\n \n // 人类可读解释\n if (aiContext.humanReadableExplanation) {\n lines.push(`### 系统建议`);\n lines.push('');\n lines.push(aiContext.humanReadableExplanation);\n lines.push('');\n }\n }\n \n // 使用示例\n lines.push(`---`);\n lines.push('');\n lines.push(`## 使用示例`);\n lines.push('');\n lines.push(`查询此指标时,使用 query_semantic_metric_data 工具,参数:`);\n lines.push(`- **metricName**: \"${foundDetail.metricName}\"`);\n if (foundDatasourceId) {\n lines.push(`- **datasourceId**: \"${foundDatasourceId}\"`);\n }\n\n return lines.join('\\n');\n } catch (error) {\n return `Error querying metric definition: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"query_metric_definition\",\n description: `${QUERY_METRIC_DEFINITION_DESCRIPTION}${availableServersText}`,\n schema: z.object({\n serverKey: z\n .string()\n .describe(`Target semantic metrics server. Choose from: ${serverKeys.join(', ')}`),\n metricName: z\n .string()\n .describe(\"The name of the metric to get definition for.\"),\n datasourceId: z\n .string()\n .optional()\n .describe(\"Optional specific datasource ID to search in. If not provided, searches all selected datasources.\"),\n }),\n }\n );\n};\n","/**\n * Query Semantic Metric Data Tool\n * Tool for querying metric data from semantic metrics server\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { metricsServerManager, SemanticMetricsClient } from \"./MetricsServerManager\";\nimport type { SemanticMetricsFilter, SemanticMetricsQueryResponse } from \"@axiom-lattice/protocols\";\n\nconst QUERY_SEMANTIC_METRIC_DATA_DESCRIPTION = `Query Metric Data - Step 3 of the Metrics Workflow\n\nExecute queries with the correct parameters derived from metric definitions. This tool requires you to have already discovered and understood the metric metadata.\n\nWhen to Use This Tool\nUse this tool proactively in these scenarios:\n- When you have the metricName and have read its definition via query_metric_definition\n- When executing time trend analysis, dimension breakdowns, or drill-downs\n- When comparing multiple metrics side-by-side\n\nWhen NOT to Use This Tool\nSkip using this tool when:\n- You haven't retrieved the metric definition yet (call query_metric_definition first)\n- You're unsure about supported dimensions or time grains for this metric\n\nPrerequisites - MUST Complete First\n1. Call query_metrics_list to discover available metrics\n2. Call query_metric_definition(metricName) to get:\n - defaultTimeContext.timeDimension (e.g., \"DocDate\")\n - defaultTimeContext.supportedGrains (e.g., [\"day\", \"week\", \"month\", \"year\"])\n - supportedDimensions[].dim_id (use these for groupBy and filters)\n - supportedDimensions[].filter_operators (allowed operators per dimension)\n\nThe Five Query Patterns\n\nPattern A - Time Trend (most common first query)\nGoal: Show how a metric changes over time within a period\n{\n \"metrics\": [\"order_amt_tax_inc\"],\n \"groupBy\": [\"DocDate__month\"],\n \"filters\": [{ \"dimension\": \"DocDate\", \"operator\": \"BETWEEN\", \"values\": [\"2025-01-01\", \"2025-12-31\"] }],\n \"orderBy\": [{ \"field\": \"DocDate__month\", \"direction\": \"ASC\" }]\n}\n\nPattern B - Dimension Breakdown (who/what is top or bottom)\nGoal: Rank performance across a categorical dimension in a fixed period\n{\n \"metrics\": [\"order_amt_tax_inc\"],\n \"groupBy\": [\"org_region\"],\n \"filters\": [{ \"dimension\": \"DocDate\", \"operator\": \"BETWEEN\", \"values\": [\"2025-01-01\", \"2025-03-31\"] }],\n \"orderBy\": [{ \"field\": \"value\", \"direction\": \"DESC\" }],\n \"limit\": 10\n}\n\nPattern C - Drill Down (zoom into an anomaly)\nGoal: After Pattern A reveals a bad month, find which segment caused it\nStep 1 - Monthly trend to find anomaly (Pattern A)\nStep 2 - Drill into that month by adding categorical dimension:\n{\n \"groupBy\": [\"sales_person\"],\n \"filters\": [\n { \"dimension\": \"DocDate\", \"operator\": \"BETWEEN\", \"values\": [\"2025-06-01\", \"2025-06-30\"] },\n { \"dimension\": \"org_region\", \"operator\": \"EQ\", \"values\": [\"华东\"] }\n ],\n \"orderBy\": [{ \"field\": \"value\", \"direction\": \"ASC\" }]\n}\n\nPattern D - Multi-Metric Comparison\nGoal: Query two or more metrics in one call to compare side-by-side\n{\n \"metrics\": [\"order_amt_tax_inc\", \"net_sales_amt\"],\n \"groupBy\": [\"DocDate__month\"],\n \"filters\": [{ \"dimension\": \"DocDate\", \"operator\": \"BETWEEN\", \"values\": [\"2025-01-01\", \"2025-12-31\"] }],\n \"orderBy\": [{ \"field\": \"DocDate__month\", \"direction\": \"ASC\" }]\n}\n\nPattern E - Time x Dimension Cross-Analysis\nGoal: See how a dimension behaves across time (e.g., monthly sales by region)\n{\n \"metrics\": [\"order_amt_tax_inc\"],\n \"groupBy\": [\"DocDate__month\", \"org_region\"],\n \"filters\": [{ \"dimension\": \"DocDate\", \"operator\": \"BETWEEN\", \"values\": [\"2025-01-01\", \"2025-06-30\"] }],\n \"orderBy\": [\n { \"field\": \"DocDate__month\", \"direction\": \"ASC\" },\n { \"field\": \"org_region\", \"direction\": \"ASC\" }\n ]\n}\n\nFilter Operator Reference\n| Operator | Applies To | Values Array |\n|----------|------------|--------------|\n| BETWEEN | datetime, number | [min, max] (inclusive) |\n| IN | categorical | [\"v1\", \"v2\", ...] |\n| EQ | any | [\"v\"] |\n| NEQ | any | [\"v\"] |\n| GT / GTE | datetime, number | [\"v\"] |\n| LT / LTE | datetime, number | [\"v\"] |\n| LIKE | string | [\"%pattern%\"] |\n| NOT_NULL | any | [] |\n\nCommon Mistakes to Avoid\n- Using field_name (e.g., \"SlpName\") instead of dim_id (e.g., \"sales_person\")\n- Writing \"DocDate__Month\" (capital M) - always lowercase: \"DocDate__month\"\n- Omitting date filter entirely - ALWAYS include at least one DocDate filter\n- Querying a metric by an unsupported dimension - only use dim_id from supportedDimensions\n- Putting display name in orderBy.field - must match exactly what's in groupBy\n\nRecommended Analysis Flow\nUser question\n |\n ▼\nStep 1: query_metrics_list - find matching metric(s)\n |\n ▼\nStep 2: query_metric_definition - read defaultTimeContext + supportedDimensions\n |\n ▼\nStep 3a: Pattern A (time trend) - get the big picture\n |\n ├─ anomaly found? ──► Step 3c: Pattern C (drill down)\n ├─ user asks \"who\"? ──► Step 3b: Pattern B (dimension breakdown)\n └─ user asks \"compare X and Y\"? ──► Step 3d: Pattern D (multi-metric)\n\nDebug Mode\nSet \"debug\": true to receive executedSqls in the response to verify generated SQL.`;\n\nexport interface CreateMetricsToolParams {\n serverKeys: string[];\n serverDescriptions?: Record<string, string>;\n}\n\nfunction formatSemanticQueryResult(\n datasourceId: string | number,\n datasourceName: string | undefined,\n results: SemanticMetricsQueryResponse['results']\n): string {\n if (results.length === 0) {\n return `No data found for the specified query.\\nData Source: ${datasourceId}${datasourceName ? ` (${datasourceName})` : ''}`;\n }\n\n const lines: string[] = [];\n lines.push(`# 指标查询结果`);\n lines.push(`\\n**数据源**: ${datasourceId}${datasourceName ? ` (${datasourceName})` : ''}`);\n lines.push(`**指标数**: ${results.length}`);\n lines.push(`\\n---\\n`);\n\n for (const metric of results) {\n // 指标标题\n lines.push(`## ${metric.displayName} (${metric.metricName})`);\n lines.push(`\\n- **数据类型**: ${metric.dataType}`);\n lines.push(`- **格式**: ${metric.format}`);\n lines.push(`- **极性**: ${metric.polarity}`);\n lines.push(`- **执行耗时**: ${metric.executionTimeMs}ms`);\n lines.push(`- **返回行数**: ${metric.rowCount}`);\n\n // 数据表格\n if (metric.columns.length > 0 && metric.rows.length > 0) {\n lines.push(`\\n### 数据\\n`);\n \n // 表头\n lines.push(`| ${metric.columns.join(' | ')} |`);\n lines.push(`|${metric.columns.map(() => '---').join('|')}|`);\n \n // 数据行\n for (const row of metric.rows) {\n const rowValues = metric.columns.map(col => {\n const val = row[col];\n return val !== undefined ? String(val) : '';\n });\n lines.push(`| ${rowValues.join(' | ')} |`);\n }\n }\n\n // AI 分析提示\n if (metric.aiHints) {\n lines.push(`\\n### AI 分析建议\\n`);\n lines.push(`- **指标解释**: ${metric.aiHints.valueInterpretation}`);\n \n if (metric.aiHints.thresholds && metric.aiHints.thresholds.length > 0) {\n lines.push(`- **预警阈值**:`);\n for (const t of metric.aiHints.thresholds) {\n lines.push(` - ${t.metric} ${t.operator} ${t.value} (${t.level})`);\n }\n }\n \n if (metric.aiHints.suggestedFollowup && metric.aiHints.suggestedFollowup.length > 0) {\n lines.push(`- **建议后续分析**:`);\n for (const suggestion of metric.aiHints.suggestedFollowup) {\n lines.push(` - ${suggestion}`);\n }\n }\n }\n\n lines.push(`\\n---\\n`);\n }\n\n return lines.join('\\n');\n}\n\nexport const createQuerySemanticMetricDataTool = ({ serverKeys, serverDescriptions }: CreateMetricsToolParams) => {\n const availableServersText = serverKeys.length > 0\n ? `\\n\\nAvailable metrics servers:\\n${serverKeys.map(key => \n `- ${key}${serverDescriptions?.[key] ? `: ${serverDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async (\n {\n serverKey,\n datasourceId,\n metrics,\n groupBy,\n filters,\n limit,\n }: {\n serverKey: string;\n datasourceId: string;\n metrics: string[];\n groupBy?: string[];\n filters?: Array<{\n dimension: string;\n operator: string;\n values: (string | number | boolean)[];\n }>;\n limit?: number;\n },\n _exeConfig: any\n ) => {\n try {\n if (!serverKey) {\n return \"Error: serverKey parameter is required. Available servers: \" + serverKeys.join(', ');\n }\n\n if (!serverKeys.includes(serverKey)) {\n return `Error: serverKey \"${serverKey}\" is not in the allowed list: [${serverKeys.join(', ')}]`;\n }\n\n if (!datasourceId) {\n return \"Error: datasourceId parameter is required.\";\n }\n\n if (!metrics || metrics.length === 0) {\n return \"Error: metrics parameter is required (at least one metric name).\";\n }\n\n const config = metricsServerManager.getConfig(serverKey);\n \n if (config.type !== \"semantic\") {\n return `Error: Server \"${serverKey}\" is not a semantic metrics server. This tool only works with semantic servers.`;\n }\n\n const client = metricsServerManager.getClient(serverKey) as SemanticMetricsClient;\n\n const semanticFilters: SemanticMetricsFilter[] = (filters || []).map(f => ({\n dimension: f.dimension,\n operator: f.operator,\n values: f.values,\n }));\n\n const result = await client.semanticQuery({\n datasourceId,\n metrics,\n groupBy,\n filters: semanticFilters,\n limit: limit || 1000,\n });\n\n return formatSemanticQueryResult(\n result.datasourceId,\n result.datasourceName,\n result.results\n );\n } catch (error) {\n return `Error querying semantic metric data: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"query_semantic_metric_data\",\n description: `${QUERY_SEMANTIC_METRIC_DATA_DESCRIPTION}${availableServersText}`,\n schema: z.object({\n serverKey: z\n .string()\n .describe(`Target semantic metrics server. Choose from: ${serverKeys.join(', ')}`),\n datasourceId: z\n .string()\n .describe(\"The data source ID to query metrics from.\"),\n metrics: z\n .array(z.string())\n .describe(\"Array of metric names to query (e.g., ['net_sales_amt', 'gross_profit']).\"),\n groupBy: z\n .array(z.string())\n .optional()\n .describe(\"Optional array of dimensions to group by (e.g., ['DocDate__month', 'CustomerCode']).\"),\n filters: z\n .array(z.object({\n dimension: z.string().describe(\"Dimension/column name to filter on\"),\n operator: z.string().describe(\"Operator (e.g., 'BETWEEN', '=', '>', '<')\"),\n values: z.array(z.union([z.string(), z.number(), z.boolean()])).describe(\"Filter values\"),\n }))\n .optional()\n .describe(\"Optional array of filters to apply to the query.\"),\n limit: z\n .number()\n .optional()\n .describe(\"Maximum number of results to return (default: 1000).\"),\n }),\n }\n );\n};\n","/**\n * Query Tables List Tool\n * Tool for querying available tables from semantic metrics server data sources\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { metricsServerManager, SemanticMetricsClient } from \"./MetricsServerManager\";\n\nconst QUERY_TABLES_LIST_DESCRIPTION = `Query available tables from a semantic metrics server. Returns a list of data tables with their schemas and descriptions. Use this tool to discover what tables are available in the data source.`;\n\nexport interface CreateTablesToolParams {\n serverKeys: string[];\n serverDescriptions?: Record<string, string>;\n}\n\nexport const createQueryTablesListTool = ({ serverKeys, serverDescriptions }: CreateTablesToolParams) => {\n const availableServersText = serverKeys.length > 0\n ? `\\n\\nAvailable metrics servers:\\n${serverKeys.map(key => \n `- ${key}${serverDescriptions?.[key] ? `: ${serverDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async (\n {\n serverKey,\n datasourceIds,\n }: {\n serverKey: string;\n datasourceIds?: string[];\n },\n _exeConfig: any\n ) => {\n try {\n if (!serverKey) {\n return \"Error: serverKey parameter is required. Available servers: \" + serverKeys.join(', ');\n }\n\n if (!serverKeys.includes(serverKey)) {\n return `Error: serverKey \"${serverKey}\" is not in the allowed list: [${serverKeys.join(', ')}]`;\n }\n\n const config = metricsServerManager.getConfig(serverKey);\n \n if (config.type !== \"semantic\") {\n return `Error: Server \"${serverKey}\" is not a semantic metrics server. This tool only works with semantic servers.`;\n }\n\n const client = metricsServerManager.getClient(serverKey) as SemanticMetricsClient;\n \n const targetDatasourceIds = datasourceIds && datasourceIds.length > 0\n ? datasourceIds\n : client.getSelectedDataSources();\n\n if (targetDatasourceIds.length === 0) {\n return `Error: No data sources specified and no default data sources configured for server \"${serverKey}\".`;\n }\n\n interface TableInfo {\n tableName: string;\n displayName: string;\n docType: string;\n docTypeEn: string;\n mainTable?: string;\n lineTable?: string;\n columnCount: number;\n shortDesc: string;\n datasources: string[];\n }\n\n const allTables: Map<string, TableInfo> = new Map();\n\n for (const datasourceId of targetDatasourceIds) {\n try {\n const metaData = await client.getDatasourceMetrics(datasourceId);\n const index = metaData.index;\n\n for (const item of index.tables) {\n const tableKey = item.tableName;\n \n if (allTables.has(tableKey)) {\n const existing = allTables.get(tableKey)!;\n if (!existing.datasources.includes(datasourceId)) {\n existing.datasources.push(datasourceId);\n }\n } else {\n allTables.set(tableKey, {\n tableName: item.tableName,\n displayName: item.displayName,\n docType: item.docType,\n docTypeEn: item.docTypeEn,\n mainTable: item.mainTable,\n lineTable: item.lineTable,\n columnCount: item.columnCount,\n shortDesc: item.shortDesc,\n datasources: [datasourceId],\n });\n }\n }\n } catch (error) {\n console.warn(`Failed to get tables for datasource ${datasourceId}:`, error);\n }\n }\n\n if (allTables.size === 0) {\n return `未在指定的数据源中找到数据表。`;\n }\n\n const lines: string[] = [];\n lines.push(`## 数据表列表(共 ${allTables.size} 个)\\n`);\n\n // 转换为数组并按表名排序\n const sortedTables = Array.from(allTables.values()).sort((a, b) => \n a.tableName.localeCompare(b.tableName)\n );\n\n // 表格头部\n lines.push('| 表名 | 显示名称 | 单据类型 | 列数 | 描述 |');\n lines.push('|------|---------|---------|------|------|');\n\n for (const table of sortedTables) {\n const mainTableInfo = table.mainTable ? ` (主表: ${table.mainTable})` : '';\n const lineTableInfo = table.lineTable ? ` (行表: ${table.lineTable})` : '';\n const tableRelation = mainTableInfo + lineTableInfo;\n \n lines.push(`| ${table.tableName} | ${table.displayName} | ${table.docType}${tableRelation} | ${table.columnCount} | ${table.shortDesc} |`);\n }\n\n return lines.join('\\n');\n } catch (error) {\n return `Error querying tables list: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"query_tables_list\",\n description: `${QUERY_TABLES_LIST_DESCRIPTION}${availableServersText}`,\n schema: z.object({\n serverKey: z\n .string()\n .describe(`Target semantic metrics server. Choose from: ${serverKeys.join(', ')}`),\n datasourceIds: z\n .array(z.string())\n .optional()\n .describe(\"Optional array of datasource IDs to query. If not provided, uses all selected datasources.\"),\n }),\n }\n );\n};\n","/**\n * Query Table Definition Tool\n * Tool for getting detailed definition of a specific table\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { metricsServerManager, SemanticMetricsClient } from \"./MetricsServerManager\";\n\nconst QUERY_TABLE_DEFINITION_DESCRIPTION = `Get detailed definition and schema for a specific table from a semantic metrics server. Returns comprehensive information including column definitions, SQL query, and table relationships.`;\n\nexport interface CreateTableToolParams {\n serverKeys: string[];\n serverDescriptions?: Record<string, string>;\n}\n\ninterface TableColumn {\n name: string;\n label: string;\n description?: string;\n type?: string;\n example?: string;\n}\n\ninterface TableDetail {\n tableName: string;\n docType: string;\n docTypeEn: string;\n objTypeCode?: number;\n mainTable?: string;\n lineTable?: string;\n selectSql: string;\n columns: (TableColumn | null)[];\n}\n\nexport const createQueryTableDefinitionTool = ({ serverKeys, serverDescriptions }: CreateTableToolParams) => {\n const availableServersText = serverKeys.length > 0\n ? `\\n\\nAvailable metrics servers:\\n${serverKeys.map(key => \n `- ${key}${serverDescriptions?.[key] ? `: ${serverDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async (\n {\n serverKey,\n tableName,\n datasourceId,\n }: {\n serverKey: string;\n tableName: string;\n datasourceId?: string;\n },\n _exeConfig: any\n ) => {\n try {\n if (!serverKey) {\n return \"Error: serverKey parameter is required. Available servers: \" + serverKeys.join(', ');\n }\n\n if (!serverKeys.includes(serverKey)) {\n return `Error: serverKey \"${serverKey}\" is not in the allowed list: [${serverKeys.join(', ')}]`;\n }\n\n if (!tableName) {\n return \"Error: tableName parameter is required.\";\n }\n\n const config = metricsServerManager.getConfig(serverKey);\n \n if (config.type !== \"semantic\") {\n return `Error: Server \"${serverKey}\" is not a semantic metrics server. This tool only works with semantic servers.`;\n }\n\n const client = metricsServerManager.getClient(serverKey) as SemanticMetricsClient;\n \n const targetDatasourceIds = datasourceId \n ? [datasourceId]\n : client.getSelectedDataSources();\n\n if (targetDatasourceIds.length === 0) {\n return `Error: No datasourceId specified and no default data sources configured for server \"${serverKey}\".`;\n }\n\n let foundTable: TableDetail | null = null;\n let foundDatasourceId: string | null = null;\n\n for (const dsId of targetDatasourceIds) {\n try {\n const metaData = await client.getDatasourceMetrics(dsId);\n const tableDetail = metaData.tablesDetails?.find((t: { tableName: string }) => t.tableName === tableName) as TableDetail | undefined;\n if (tableDetail) {\n foundTable = tableDetail;\n foundDatasourceId = dsId;\n break;\n }\n } catch (error) {\n console.warn(`Failed to get table definition for datasource ${dsId}:`, error);\n }\n }\n\n if (!foundTable) {\n return `Table \"${tableName}\" not found in the specified data sources.`;\n }\n\n const lines: string[] = [];\n \n // 标题\n lines.push(`# ${foundTable.tableName}`);\n lines.push('');\n \n // 基本信息\n lines.push(`## 基本信息`);\n lines.push('');\n lines.push(`- **表名**: ${foundTable.tableName}`);\n lines.push(`- **单据类型**: ${foundTable.docType}`);\n lines.push(`- **单据类型(英文)**: ${foundTable.docTypeEn}`);\n if (foundTable.objTypeCode) {\n lines.push(`- **对象类型代码**: ${foundTable.objTypeCode}`);\n }\n if (foundTable.mainTable) {\n lines.push(`- **主表**: ${foundTable.mainTable}`);\n }\n if (foundTable.lineTable) {\n lines.push(`- **行表**: ${foundTable.lineTable}`);\n }\n if (foundDatasourceId) {\n lines.push(`- **数据源ID**: ${foundDatasourceId}`);\n }\n lines.push('');\n \n // 列定义\n if (foundTable.columns && foundTable.columns.length > 0) {\n const validColumns = foundTable.columns.filter((col): col is TableColumn => col !== null);\n lines.push(`## 列定义 (${validColumns.length} 列)`);\n lines.push('');\n lines.push('| 列名 | 标签 | 类型 | 示例值 |');\n lines.push('|------|------|------|--------|');\n for (const col of validColumns) {\n const type = col.type || '-';\n const example = col.example || '-';\n lines.push(`| ${col.name} | ${col.label} | ${type} | ${example} |`);\n }\n lines.push('');\n }\n \n // SQL 查询\n if (foundTable.selectSql) {\n lines.push(`## SQL 查询`);\n lines.push('');\n lines.push('```sql');\n lines.push(foundTable.selectSql);\n lines.push('```');\n lines.push('');\n }\n\n return lines.join('\\n');\n } catch (error) {\n return `Error querying table definition: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"query_table_definition\",\n description: `${QUERY_TABLE_DEFINITION_DESCRIPTION}${availableServersText}`,\n schema: z.object({\n serverKey: z\n .string()\n .describe(`Target semantic metrics server. Choose from: ${serverKeys.join(', ')}`),\n tableName: z\n .string()\n .describe(\"The name of the table to get definition for.\"),\n datasourceId: z\n .string()\n .optional()\n .describe(\"Optional specific datasource ID to search in. If not provided, searches all selected datasources.\"),\n }),\n }\n );\n};\n","/**\n * Code Execution Tool (code_eval)\n *\n * Executes code in the sandbox for supported languages (Python, JavaScript).\n * Requires a sandbox to be connected (e.g. via params.connectedSandbox when\n * building the agent). Uses the sandbox's code.executeCode API to run the\n * code in isolation.\n */\n\nimport z from \"zod\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { tool } from \"langchain\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst CODE_EVAL_DESCRIPTION = `Execute code in Python or JavaScript runtime.\n\nArgs:\n code: Code to execute\n language: Programming language ('python', 'javascript')\n\nReturns:\n Dict containing output, errors, and execution details`;\n\n\n\n\n\nexport const createCodeEvalTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(async (\n input: { language: \"python\" | \"javascript\"; code: string; timeout_sec?: number },\n exe_config: any\n ) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel })\n\n const result = await sandbox.code.executeCode({\n language: input.language,\n code: input.code,\n timeout: 300,\n });\n\n if (!result.ok) {\n const err = result.error as { content?: { message?: string, errors?: string[] } };\n return `Error executing ${input.language} code: ${err?.content?.message + (err?.content?.errors ? `\\n${err?.content?.errors.join(\"\\n\")}` : \"\")}`;\n }\n\n const data = result.body?.data;\n if (!data) {\n return \"Error: No response data from sandbox code execution.\";\n }\n\n const { stdout = \"\", stderr = \"\", exit_code, traceback } = data;\n const parts: string[] = [];\n\n if (stdout) {\n parts.push(`stdout:\\n${stdout}`);\n }\n if (stderr) {\n parts.push(`stderr:\\n${stderr}`);\n }\n if (traceback && traceback.length > 0) {\n parts.push(`traceback:\\n${traceback.join(\"\\n\")}`);\n }\n parts.push(`exit_code: ${exit_code ?? \"—\"}`);\n\n return parts.length > 0 ? parts.join(\"\\n\\n\") : `exit_code: ${exit_code ?? 0}`;\n } catch (e) {\n return `Error: ${e instanceof Error ? e.message : String(e)}`;\n }\n }, {\n name: \"execute_code\",\n description: CODE_EVAL_DESCRIPTION,\n schema: z.object({\n language: z\n .enum([\"python\", \"javascript\"])\n .describe(\"Programming language: 'python' or 'javascript'\"),\n code: z.string().describe(\"Code to execute\"),\n\n }),\n },);\n\n}","/**\n * SandboxLatticeManager\n *\n * Sandbox Lattice manager for registering and managing sandbox services\n * Supports creating, deleting, and managing sandbox instances\n */\n\nimport { SandboxClient } from \"@agent-infra/sandbox\";\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport { RunSandboxConfig, SandboxManagerProtocol } from \"./SandboxManagerProtocol\";\nimport { normalizeSandboxName } from \"./utils\";\n\n\n\n/**\n * Default implementation of SandboxManagerProtocol\n * Manages sandboxes using SandboxClient instances stored in memory\n */\nclass DefaultSandboxManager implements SandboxManagerProtocol {\n private sandboxes: Map<string, SandboxClient> = new Map();\n /**\n * Track in-flight sandbox creation promises by normalized sandbox name.\n * This ensures that concurrent calls with the same name share the same Promise\n * and we do not trigger multiple creations for the same sandbox.\n */\n private creatingSandboxes: Map<string, Promise<SandboxClient>> = new Map();\n private baseURL: string;\n\n constructor(baseURL: string = \"http://localhost:8080\") {\n this.baseURL = baseURL;\n }\n\n getBaseURL(): string {\n return this.baseURL;\n }\n\n async createSandbox(sandboxName: string): Promise<SandboxClient> {\n\n\n if (sandboxName === \"global\") {\n const client = new SandboxClient({ baseUrl: `${this.baseURL}/sandbox/global`, environment: \"\" });\n this.sandboxes.set(\"global\", client);\n return client;\n }\n\n\n // Normalize sandbox name to be RFC 1123 compliant\n const normalizedName = normalizeSandboxName(sandboxName);\n\n // If sandbox client already exists, return it directly.\n const existingClient = this.sandboxes.get(normalizedName);\n if (existingClient) {\n return existingClient;\n }\n\n // If a creation is already in progress for this sandbox, return the same Promise.\n const inFlight = this.creatingSandboxes.get(normalizedName);\n if (inFlight) {\n return inFlight;\n }\n\n // Start a new creation Promise and store it so concurrent callers share it.\n const creationPromise = (async (): Promise<SandboxClient> => {\n const response = await fetch(`${this.baseURL}/api/v1/sandbox`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n name: normalizedName,\n image: \"enterprise-public-cn-beijing.cr.volces.com/vefaas-public/all-in-one-sandbox:latest\"\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to create sandbox: ${response.statusText}`);\n }\n\n const data = await response.json();\n\n // Create a new SandboxClient for the sandbox\n // The baseURL should point to the specific sandbox endpoint\n const sandboxURL = `${this.baseURL}/sandbox/${normalizedName}`;\n const client = new SandboxClient({ baseUrl: sandboxURL, environment: \"\" });\n this.sandboxes.set(normalizedName, client);\n return client;\n })();\n\n // Ensure we clean up the in-flight map when the Promise settles.\n this.creatingSandboxes.set(normalizedName, creationPromise);\n creationPromise\n .catch(() => {\n // On failure, remove the in-flight entry so future calls can retry.\n this.creatingSandboxes.delete(normalizedName);\n })\n .then(() => {\n // On success, also remove the in-flight entry; the client is now in sandboxes map.\n this.creatingSandboxes.delete(normalizedName);\n });\n\n return creationPromise;\n }\n\n async deleteSandbox(sandboxName: string): Promise<void> {\n // Normalize sandbox name to be RFC 1123 compliant\n const normalizedName = normalizeSandboxName(sandboxName);\n\n if (!this.sandboxes.has(normalizedName)) {\n throw new Error(`Sandbox ${sandboxName} (normalized: ${normalizedName}) not found`);\n }\n const response = await fetch(`${this.baseURL}/api/v1/sandbox/${normalizedName}`, {\n method: \"DELETE\",\n });\n if (!response.ok) {\n throw new Error(`Failed to delete sandbox: ${response.statusText}`);\n }\n this.sandboxes.delete(normalizedName);\n }\n\n async getSandbox(sandboxName: string): Promise<SandboxClient> {\n // Normalize sandbox name to be RFC 1123 compliant\n const normalizedName = normalizeSandboxName(sandboxName);\n\n const client = this.sandboxes.get(normalizedName);\n if (!client) {\n throw new Error(`Sandbox ${sandboxName} (normalized: ${normalizedName}) not found`);\n }\n return client;\n }\n\n async listSandboxes(): Promise<SandboxClient[]> {\n return Array.from(this.sandboxes.values());\n }\n\n async getSandboxStatus(sandboxName: string): Promise<string> {\n // Normalize sandbox name to be RFC 1123 compliant\n const normalizedName = normalizeSandboxName(sandboxName);\n\n if (!this.sandboxes.has(normalizedName)) {\n throw new Error(`Sandbox ${sandboxName} (normalized: ${normalizedName}) not found`);\n }\n // Try to get context to check if sandbox is active\n try {\n const client = this.sandboxes.get(normalizedName)!;\n const context = await client.sandbox.getContext();\n return context.ok ? \"active\" : \"inactive\";\n } catch {\n return \"unknown\";\n }\n }\n async getSandboxFromConfig(config: RunSandboxConfig): Promise<SandboxClient> {\n if (config.isolatedLevel === \"agent\") {\n return this.createSandbox(config.assistant_id);\n } else if (config.isolatedLevel === \"thread\") {\n return this.createSandbox(config.thread_id);\n } else {\n return this.createSandbox(\"global\");\n }\n }\n}\n\n/**\n * SandboxLatticeManager - Singleton sandbox Lattice manager\n * Responsible for registering and managing various sandbox service Lattices\n */\nexport class SandboxLatticeManager extends BaseLatticeManager<SandboxManagerProtocol> {\n private static _instance: SandboxLatticeManager;\n\n /**\n * Get SandboxLatticeManager singleton instance\n */\n public static getInstance(): SandboxLatticeManager {\n if (!SandboxLatticeManager._instance) {\n SandboxLatticeManager._instance = new SandboxLatticeManager();\n }\n return SandboxLatticeManager._instance;\n }\n\n /**\n * Get Lattice type prefix\n */\n protected getLatticeType(): string {\n return \"sandbox_manager\";\n }\n\n /**\n * Register sandbox Lattice\n * @param key Lattice key name\n * @param manager Optional sandbox manager. If not provided, will create a default one.\n * @param baseURL Base URL for sandbox service (used when creating default manager)\n */\n public registerLattice(\n key: string,\n config: { manager?: SandboxManagerProtocol, baseURL?: string }\n ): void {\n const { manager, baseURL } = config;\n // Use provided manager or create default one\n const sandboxManager: SandboxManagerProtocol =\n manager || new DefaultSandboxManager(baseURL);\n\n\n // Call base class register method\n this.register(key, sandboxManager);\n }\n\n /**\n * Get SandboxLattice\n * @param key Lattice key name\n */\n public getSandboxLattice(key: string): SandboxManagerProtocol {\n const sandboxLattice = this.get(key);\n if (!sandboxLattice) {\n throw new Error(`SandboxLattice ${key} not found`);\n }\n return sandboxLattice;\n }\n\n /**\n * Get all Lattices\n */\n public getAllLattices(): SandboxManagerProtocol[] {\n return this.getAll();\n }\n\n /**\n * Check if Lattice exists\n * @param key Lattice key name\n */\n public hasLattice(key: string): boolean {\n return this.has(key);\n }\n\n /**\n * Remove Lattice\n * @param key Lattice key name\n */\n public removeLattice(key: string): boolean {\n return this.remove(key);\n }\n\n /**\n * Clear all Lattices\n */\n public clearLattices(): void {\n this.clear();\n }\n\n /**\n * Get Lattice count\n */\n public getLatticeCount(): number {\n return this.count();\n }\n\n /**\n * Get Lattice key list\n */\n public getLatticeKeys(): string[] {\n return this.keys();\n }\n}\n\n// Export singleton instance\nexport const sandboxLatticeManager =\n SandboxLatticeManager.getInstance();\n\nexport const getSandBoxManager = (key: string = \"default\") => {\n if (!sandboxLatticeManager.hasLattice(key)) {\n throw new Error(`Sandbox ${key} not configured. Ensure the sandbox manager is registered and the agent is built with connectedSandbox.`);\n }\n const sandboxManager = sandboxLatticeManager.getSandboxLattice(key);\n return sandboxManager;\n}","/**\n * Sandbox name normalization utility\n * \n * Normalizes sandbox names to comply with RFC 1123 subdomain naming requirements:\n * - Only lowercase alphanumeric characters, '-' or '.'\n * - Must start and end with an alphanumeric character\n * - No underscores or other special characters\n */\n\n/**\n * Normalize a sandbox name to be RFC 1123 compliant\n * \n * @param name - The sandbox name to normalize\n * @returns Normalized sandbox name that complies with RFC 1123 subdomain rules\n * \n * @example\n * normalizeSandboxName(\"sandbox_agent\") // returns \"sandbox-agent\"\n * normalizeSandboxName(\"My-Sandbox\") // returns \"my-sandbox\"\n * normalizeSandboxName(\"test.sandbox\") // returns \"test.sandbox\"\n * normalizeSandboxName(\"_invalid_\") // returns \"invalid\"\n */\nexport function normalizeSandboxName(name: string): string {\n if (!name || typeof name !== \"string\") {\n throw new Error(\"Sandbox name must be a non-empty string\");\n }\n\n // Convert to lowercase\n let normalized = name.toLowerCase();\n\n // Replace underscores with hyphens\n normalized = normalized.replace(/_/g, \"-\");\n\n // Remove any characters that are not alphanumeric, hyphen, or dot\n normalized = normalized.replace(/[^a-z0-9.-]/g, \"\");\n\n // Remove leading/trailing dots and hyphens (must start/end with alphanumeric)\n normalized = normalized.replace(/^[.-]+|[.-]+$/g, \"\");\n\n // Replace consecutive dots or hyphens with a single hyphen\n normalized = normalized.replace(/[.-]{2,}/g, \"-\");\n\n // Ensure it doesn't start or end with a dot or hyphen after cleanup\n normalized = normalized.replace(/^[.-]+|[.-]+$/g, \"\");\n\n // If the result is empty, throw an error\n if (!normalized) {\n throw new Error(\n `Sandbox name \"${name}\" cannot be normalized to a valid RFC 1123 subdomain name`\n );\n }\n\n // Ensure it starts and ends with alphanumeric\n // If it doesn't start with alphanumeric, prepend 'sandbox-'\n if (!/^[a-z0-9]/.test(normalized)) {\n normalized = `sandbox-${normalized}`;\n }\n\n // If it doesn't end with alphanumeric, append '-0'\n if (!/[a-z0-9]$/.test(normalized)) {\n normalized = `${normalized}-0`;\n }\n\n // Final validation: ensure it matches RFC 1123 pattern\n // Pattern: [a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\n const rfc1123Pattern = /^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$/;\n \n if (!rfc1123Pattern.test(normalized)) {\n // If still invalid, create a safe fallback\n normalized = normalized\n .replace(/[^a-z0-9-]/g, \"-\") // Replace any remaining invalid chars with hyphen\n .replace(/^-+|-+$/g, \"\") // Remove leading/trailing hyphens\n .replace(/-{2,}/g, \"-\"); // Replace consecutive hyphens\n \n // Ensure it starts and ends with alphanumeric\n if (!/^[a-z0-9]/.test(normalized)) {\n normalized = `sandbox-${normalized}`;\n }\n if (!/[a-z0-9]$/.test(normalized)) {\n normalized = `${normalized}0`;\n }\n }\n\n return normalized;\n}\n\n/**\n * Validate if a sandbox name is RFC 1123 compliant\n * \n * @param name - The sandbox name to validate\n * @returns true if the name is valid, false otherwise\n */\nexport function isValidSandboxName(name: string): boolean {\n if (!name || typeof name !== \"string\") {\n return false;\n }\n\n const rfc1123Pattern = /^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$/;\n return rfc1123Pattern.test(name.toLowerCase());\n}\n","/**\n * Code File Execution Tool (code_execute_file)\n *\n * Executes a code file from the sandbox filesystem. Only supports Python (.py) and JavaScript (.js, .mjs) files.\n * Other file types are not supported. The tool reads the file content from the sandbox and executes it\n * using the sandbox's code execution API. Language is automatically inferred from file extension.\n */\n\nimport z from \"zod\";\nimport { tool, type StructuredTool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\nimport * as path from \"path\";\n\nconst CODE_EXECUTE_FILE_DESCRIPTION = `Execute a code file from the sandbox filesystem. Only supports Python (.py) and JavaScript (.js, .mjs) files. Other file types are not supported. The tool reads the file content and executes it in an isolated sandbox environment. Language is automatically inferred from the file extension. Output is returned via stdout; errors appear in stderr and traceback.`;\n\nfunction inferLanguageFromPath(filePath: string): \"python\" | \"javascript\" | null {\n const ext = path.extname(filePath).toLowerCase();\n if (ext === \".py\") {\n return \"python\";\n } else if (ext === \".js\" || ext === \".mjs\") {\n return \"javascript\";\n }\n return null;\n}\n\nexport const createCodeExecuteFileTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }): StructuredTool => {\n return tool(\n async (input: { file_path: string }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const context = await sandbox.sandbox.getContext();\n if (!context.ok) {\n return `Error: ${context.error}`;\n }\n const homeDir = context.body?.home_dir;\n const resolvedFilePath = path.join(homeDir, input.file_path);\n\n const language = inferLanguageFromPath(input.file_path);\n if (!language) {\n return `Error: Unsupported file type. This tool only supports Python (.py) and JavaScript (.js, .mjs) files.`;\n }\n\n const readResult = await sandbox.file.readFile({\n file: resolvedFilePath,\n });\n\n if (!readResult.ok) {\n const err = readResult.error as { content?: { message?: string } };\n return `Error reading file '${input.file_path}': ${err?.content?.message ?? JSON.stringify(readResult.error)}`;\n }\n\n const fileContent = readResult.body?.data?.content;\n if (fileContent === undefined || fileContent === null) {\n return `Error: File '${input.file_path}' is empty or could not be read.`;\n }\n\n const result = await sandbox.code.executeCode({\n language: language,\n code: fileContent,\n timeout: 300,\n });\n\n if (!result.ok) {\n const err = result.error as { content?: { message?: string } };\n return `Error executing ${language} file '${input.file_path}': ${err?.content?.message ?? JSON.stringify(result.error)}`;\n }\n\n const data = result.body?.data;\n if (!data) {\n return \"Error: No response data from sandbox code execution.\";\n }\n\n const { stdout = \"\", stderr = \"\", exit_code, traceback } = data;\n const parts: string[] = [];\n\n if (stdout) {\n parts.push(`stdout:\\n${stdout}`);\n }\n if (stderr) {\n parts.push(`stderr:\\n${stderr}`);\n }\n if (traceback && traceback.length > 0) {\n parts.push(`traceback:\\n${traceback.join(\"\\n\")}`);\n }\n parts.push(`exit_code: ${exit_code ?? \"—\"}`);\n\n return parts.length > 0 ? parts.join(\"\\n\\n\") : `exit_code: ${exit_code ?? 0}`;\n } catch (e) {\n return `Error: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"execute_code_file\",\n description: CODE_EXECUTE_FILE_DESCRIPTION,\n schema: z.object({\n file_path: z.string().describe(\"Path to the code file to execute (absolute path in sandbox filesystem). Only supports .py (Python) and .js/.mjs (JavaScript) files.\"),\n }),\n }\n );\n};\n","/**\n * Convert to Markdown Tool (convert_to_markdown)\n *\n * Convert a resource described by an http:, https:, file: or data: URI to markdown.\n * This tool fetches or reads content from various URI schemes and converts it to markdown format.\n */\n\nimport z from \"zod\";\nimport { registerToolLattice } from \"../ToolLatticeManager\";\nimport { promises as fs } from \"fs\";\nimport path from \"path\";\nimport { getSandBoxManager } from \"@sandbox_lattice/SandboxLatticeManager\";\n\nconst CONVERT_TO_MARKDOWN_DESCRIPTION = `Convert a resource described by an http:, https:, file: or data: URI to markdown.\n\nArgs:\n uri (str): The URI to convert. Supported schemes:\n - http:// or https://: Fetch content from URL\n - file://: Read content from local file\n - data:: Decode data URI content\n\nReturns:\n str: The content converted to markdown format.`;\n\nregisterToolLattice(\n \"convert_to_markdown\",\n {\n name: \"convert_to_markdown\",\n description: CONVERT_TO_MARKDOWN_DESCRIPTION,\n needUserApprove: false,\n schema: z.object({\n uri: z.string().describe(\"The URI to convert.\"),\n }),\n },\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig(runConfig);\n sandbox\n const result = await sandbox.util.convertToMarkdown({\n uri: input.uri,\n });\n if (!result.ok) {\n return `Error converting to markdown: ${result.error}`;\n }\n return result.body.data;\n } catch (e) {\n return `Error converting to markdown: ${e instanceof Error ? e.message : String(e)}`;\n }\n }\n);","/**\n * Browser Navigate Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_NAVIGATE_DESCRIPTION = `Navigate to a URL.\n\nArgs:\n url (str): The URL to navigate to.\n`;\n\nexport const createBrowserNavigateTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: { url: string }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_navigate\", {\n url: input.url,\n });\n if (!result.ok) {\n return `Error navigating to URL: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Navigated to URL\";\n } catch (e) {\n return `Error navigating to URL: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_navigate\",\n description: BROWSER_NAVIGATE_DESCRIPTION,\n schema: z.object({\n url: z.string().describe(\"The URL to navigate to.\"),\n }),\n }\n );\n};\n","/**\n * Browser Click Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_CLICK_DESCRIPTION = `Click an element on the page, before using the tool, use \\`browser_get_clickable_elements\\` to get the index of the element, but not call \\`browser_get_clickable_elements\\` multiple times.\n\nArgs:\n index (int): Index of the element to click\n`;\n\nexport const createBrowserClickTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: { index: number }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_click\", {\n index: input.index,\n });\n if (!result.ok) {\n return `Error clicking element: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Element clicked successfully\";\n } catch (e) {\n return `Error clicking element: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_click\",\n description: BROWSER_CLICK_DESCRIPTION,\n schema: z.object({\n index: z.number().describe(\"Index of the element to click\"),\n }),\n }\n );\n};\n","/**\n * Browser Get Text Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_GET_TEXT_DESCRIPTION = `Get the text content of the current page.\n\nArgs:\n None\n`;\n\nexport const createBrowserGetTextTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_get_text\", {});\n if (!result.ok) {\n return `Error getting text content: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Text content retrieved\";\n } catch (e) {\n return `Error getting text content: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_get_text\",\n description: BROWSER_GET_TEXT_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Browser Get Markdown Tool\n */\n\nimport z from \"zod\";\nimport { tool, type StructuredTool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_GET_MARKDOWN_DESCRIPTION = `Get the markdown content of the current page.\n\nArgs:\n None\n`;\n\nexport const createBrowserGetMarkdownTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }): StructuredTool => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_get_markdown\", {});\n if (!result.ok) {\n return `Error getting markdown: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content ?? \"Markdown content retrieved\";\n } catch (e) {\n return `Error getting markdown: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_get_markdown\",\n description: BROWSER_GET_MARKDOWN_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Browser Evaluate Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_EVALUATE_DESCRIPTION = `Execute JavaScript in the browser console.\n\nArgs:\n script (str): JavaScript code to execute, () => { /* code */ }\n`;\n\nexport const createBrowserEvaluateTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: { script: string }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_evaluate\", {\n script: input.script,\n });\n if (!result.ok) {\n return `Error executing JavaScript: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"JavaScript executed successfully\";\n } catch (e) {\n return `Error executing JavaScript: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_evaluate\",\n description: BROWSER_EVALUATE_DESCRIPTION,\n schema: z.object({\n script: z.string().describe(\"JavaScript code to execute, () => { /* code */ }\"),\n }),\n }\n );\n};\n","/**\n * Browser Screenshot Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_SCREENSHOT_DESCRIPTION = `Take a screenshot of the current page or a specific element.\n\nArgs:\n name (str): Name for the screenshot\n selector (str): CSS selector for element to screenshot\n index (int): index of the element to screenshot\n width (int): Width in pixels (default: viewport width)\n height (int): Height in pixels (default: viewport height)\n fullPage (bool): Full page screenshot (default: false)\n highlight (bool): Highlight the element\n`;\n\nexport const createBrowserScreenshotTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: {\n name?: string;\n selector?: string;\n index?: number;\n width?: number;\n height?: number;\n fullPage?: boolean;\n highlight?: boolean;\n }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_screenshot\", {\n name: input.name,\n selector: input.selector,\n index: input.index,\n width: input.width,\n height: input.height,\n fullPage: input.fullPage,\n highlight: input.highlight,\n });\n if (!result.ok) {\n return `Error taking screenshot: ${JSON.stringify(result.error.content)}`;\n }\n const lines = [];\n for (const item of result.body?.data?.content ?? []) {\n if (item.type === \"image\") {\n const base64Data = item.data;\n const buffer = Buffer.from(base64Data, \"base64\");\n const screenshotPath = `/home/gem/screenshots/screenshot_${input.name}.png`;\n const uploadResult = await sandbox.file.uploadFile({\n file: buffer,\n path: screenshotPath,\n });\n if (uploadResult.ok) {\n const screenshot_md = [\n \"\",\n \"Screenshot saved!\",\n \"```attachments\",\n JSON.stringify([{ id: screenshotPath, name: `screenshot_${input.name}.png` }]),\n \"```\",\n ].join(\"\\n\");\n lines.push(screenshot_md);\n } else {\n lines.push(`Failed to save screenshot: ${JSON.stringify(uploadResult.error)}`);\n }\n } else {\n lines.push(`${item.text}`);\n }\n }\n return lines.length > 0 ? lines.join(\"\\n\") : \"No Content\";\n } catch (e) {\n return `Error taking screenshot: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_screenshot\",\n description: BROWSER_SCREENSHOT_DESCRIPTION,\n schema: z.object({\n name: z.string().optional().describe(\"Name for the screenshot\"),\n selector: z.string().optional().describe(\"CSS selector for element to screenshot\"),\n index: z.number().optional().describe(\"index of the element to screenshot\"),\n width: z.number().optional().describe(\"Width in pixels (default: viewport width)\"),\n height: z.number().optional().describe(\"Height in pixels (default: viewport height)\"),\n fullPage: z.boolean().optional().describe(\"Full page screenshot (default: false)\"),\n highlight: z.boolean().default(false).describe(\"Highlight the element\"),\n }),\n }\n );\n};\n","/**\n * Browser Scroll Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_SCROLL_DESCRIPTION = `Scroll the page.\n\nArgs:\n amount (int): Pixels to scroll (positive for down, negative for up), if the amount is not provided, scroll to the bottom of the page\n`;\n\nexport const createBrowserScrollTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: { amount?: number }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_scroll\", {\n amount: input.amount,\n });\n if (!result.ok) {\n return `Error scrolling page: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Page scrolled successfully\";\n } catch (e) {\n return `Error scrolling page: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_scroll\",\n description: BROWSER_SCROLL_DESCRIPTION,\n schema: z.object({\n amount: z.number().optional().describe(\"Pixels to scroll (positive for down, negative for up)\"),\n }),\n }\n );\n};\n","/**\n * Browser Form Input Fill Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_FORM_INPUT_FILL_DESCRIPTION = `Fill out an input field, before using the tool, Either 'index' or 'selector' must be provided.\n\nArgs:\n selector (str): CSS selector for input field, priority use index, if index is not provided, use selector\n index (int): Index of the element to fill\n value (str): Value to fill\n clear (bool): Whether to clear existing text before filling\n`;\n\nexport const createBrowserFormInputFillTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: {\n selector?: string;\n index?: number;\n value: string;\n clear?: boolean;\n }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_form_input_fill\", {\n selector: input.selector,\n index: input.index,\n value: input.value,\n clear: input.clear,\n });\n if (!result.ok) {\n return `Error filling input field: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Input field filled successfully\";\n } catch (e) {\n return `Error filling input field: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_form_input_fill\",\n description: BROWSER_FORM_INPUT_FILL_DESCRIPTION,\n schema: z.object({\n selector: z.string().optional().describe(\"CSS selector for input field\"),\n index: z.number().optional().describe(\"Index of the element to fill\"),\n value: z.string().describe(\"Value to fill\"),\n clear: z.boolean().default(false).describe(\"Whether to clear existing text before filling\"),\n }),\n }\n );\n};\n","/**\n * Browser Select Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_SELECT_DESCRIPTION = `Select an element on the page with index, Either 'index' or 'selector' must be provided.\n\nArgs:\n index (int): Index of the element to select\n selector (str): CSS selector for element to select\n value (str): Value to select\n`;\n\nexport const createBrowserSelectTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: {\n index?: number;\n selector?: string;\n value: string;\n }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_select\", {\n index: input.index,\n selector: input.selector,\n value: input.value,\n });\n if (!result.ok) {\n return `Error selecting element: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Element selected successfully\";\n } catch (e) {\n return `Error selecting element: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_select\",\n description: BROWSER_SELECT_DESCRIPTION,\n schema: z.object({\n index: z.number().optional().describe(\"Index of the element to select\"),\n selector: z.string().optional().describe(\"CSS selector for element to select\"),\n value: z.string().describe(\"Value to select\"),\n }),\n }\n );\n};\n","/**\n * Browser Hover Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_HOVER_DESCRIPTION = `Hover an element on the page, Either 'index' or 'selector' must be provided.\n\nArgs:\n index (int): Index of the element to hover\n selector (str): CSS selector for element to hover\n`;\n\nexport const createBrowserHoverTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: { index?: number; selector?: string }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_hover\", {\n index: input.index,\n selector: input.selector,\n });\n if (!result.ok) {\n return `Error hovering element: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Element hovered successfully\";\n } catch (e) {\n return `Error hovering element: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_hover\",\n description: BROWSER_HOVER_DESCRIPTION,\n schema: z.object({\n index: z.number().optional().describe(\"Index of the element to hover\"),\n selector: z.string().optional().describe(\"CSS selector for element to hover\"),\n }),\n }\n );\n};\n","/**\n * Browser Go Back Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_GO_BACK_DESCRIPTION = `Go back to the previous page.\n\nArgs:\n None\n`;\n\nexport const createBrowserGoBackTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_go_back\", {});\n if (!result.ok) {\n return `Error going back: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Went back to previous page\";\n } catch (e) {\n return `Error going back: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_go_back\",\n description: BROWSER_GO_BACK_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Browser Go Forward Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_GO_FORWARD_DESCRIPTION = `Go forward to the next page.\n\nArgs:\n None\n`;\n\nexport const createBrowserGoForwardTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_go_forward\", {});\n if (!result.ok) {\n return `Error going forward: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Went forward to next page\";\n } catch (e) {\n return `Error going forward: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_go_forward\",\n description: BROWSER_GO_FORWARD_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Browser New Tab Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_NEW_TAB_DESCRIPTION = `Open a new tab.\n\nArgs:\n url (str): URL to open in the new tab\n`;\n\nexport const createBrowserNewTabTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: { url: string }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_new_tab\", {\n url: input.url,\n });\n if (!result.ok) {\n return `Error opening new tab: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"New tab opened successfully\";\n } catch (e) {\n return `Error opening new tab: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_new_tab\",\n description: BROWSER_NEW_TAB_DESCRIPTION,\n schema: z.object({\n url: z.string().describe(\"URL to open in the new tab\"),\n }),\n }\n );\n};\n","/**\n * Browser Tab List Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_TAB_LIST_DESCRIPTION = `Get the list of tabs.\n\nArgs:\n None\n`;\n\nexport const createBrowserTabListTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_tab_list\", {});\n if (!result.ok) {\n return `Error getting tab list: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Tab list retrieved successfully\";\n } catch (e) {\n return `Error getting tab list: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_tab_list\",\n description: BROWSER_TAB_LIST_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Browser Switch Tab Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_SWITCH_TAB_DESCRIPTION = `Switch to a specific tab.\n\nArgs:\n index (int): Tab index to switch to\n`;\n\nexport const createBrowserSwitchTabTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: { index: number }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_switch_tab\", {\n index: input.index,\n });\n if (!result.ok) {\n return `Error switching tab: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Tab switched successfully\";\n } catch (e) {\n return `Error switching tab: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_switch_tab\",\n description: BROWSER_SWITCH_TAB_DESCRIPTION,\n schema: z.object({\n index: z.number().describe(\"Tab index to switch to\"),\n }),\n }\n );\n};\n","/**\n * Browser Close Tab Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_CLOSE_TAB_DESCRIPTION = `Close the current tab.\n\nArgs:\n None\n`;\n\nexport const createBrowserCloseTabTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_close_tab\", {});\n if (!result.ok) {\n return `Error closing tab: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Current tab closed successfully\";\n } catch (e) {\n return `Error closing tab: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_close_tab\",\n description: BROWSER_CLOSE_TAB_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Browser Close Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_CLOSE_DESCRIPTION = `Close the browser when the task is done and the browser is not needed anymore.\n\nArgs:\n None\n`;\n\nexport const createBrowserCloseTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_close\", {});\n if (!result.ok) {\n return `Error closing browser: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Browser closed successfully\";\n } catch (e) {\n return `Error closing browser: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_close\",\n description: BROWSER_CLOSE_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Browser Press Key Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_PRESS_KEY_DESCRIPTION = `Press a key on the keyboard.\n\nArgs:\n key (str): Name of the key to press or a character to generate, such as Enter, Tab, Escape, Backspace, Delete, Insert, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, ArrowLeft, ArrowRight, ArrowUp, ArrowDown, PageUp, PageDown, Home, End, ShiftLeft, ShiftRight, ControlLeft, ControlRight, AltLeft, AltRight, MetaLeft, MetaRight, CapsLock, PrintScreen, ScrollLock, Pause, ContextMenu\n`;\n\nexport const createBrowserPressKeyTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: { key: \"Enter\" | \"Tab\" | \"Escape\" | \"Backspace\" | \"Delete\" | \"Insert\" | \"F1\" | \"F2\" | \"F3\" | \"F4\" | \"F5\" | \"F6\" | \"F7\" | \"F8\" | \"F9\" | \"F10\" | \"F11\" | \"F12\" | \"ArrowLeft\" | \"ArrowRight\" | \"ArrowUp\" | \"ArrowDown\" | \"PageUp\" | \"PageDown\" | \"Home\" | \"End\" | \"ShiftLeft\" | \"ShiftRight\" | \"ControlLeft\" | \"ControlRight\" | \"AltLeft\" | \"AltRight\" | \"MetaLeft\" | \"MetaRight\" | \"CapsLock\" | \"PrintScreen\" | \"ScrollLock\" | \"Pause\" | \"ContextMenu\" }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_press_key\", {\n key: input.key,\n });\n if (!result.ok) {\n return `Error pressing key: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? `Key ${input.key} pressed successfully`;\n } catch (e) {\n return `Error pressing key: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_press_key\",\n description: BROWSER_PRESS_KEY_DESCRIPTION,\n schema: z.object({\n key: z.enum([\n \"Enter\", \"Tab\", \"Escape\", \"Backspace\", \"Delete\", \"Insert\",\n \"F1\", \"F2\", \"F3\", \"F4\", \"F5\", \"F6\", \"F7\", \"F8\", \"F9\", \"F10\", \"F11\", \"F12\",\n \"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", \"ArrowDown\",\n \"PageUp\", \"PageDown\", \"Home\", \"End\",\n \"ShiftLeft\", \"ShiftRight\", \"ControlLeft\", \"ControlRight\",\n \"AltLeft\", \"AltRight\", \"MetaLeft\", \"MetaRight\",\n \"CapsLock\", \"PrintScreen\", \"ScrollLock\", \"Pause\", \"ContextMenu\"\n ]).describe(\"Name of the key to press\"),\n }),\n }\n );\n};\n","/**\n * Browser Read Links Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_READ_LINKS_DESCRIPTION = `Get all links on the current page.\n\nArgs:\n None\n`;\n\nexport const createBrowserReadLinksTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_read_links\", {});\n if (!result.ok) {\n return `Error reading links: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Links retrieved successfully\";\n } catch (e) {\n return `Error reading links: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_read_links\",\n description: BROWSER_READ_LINKS_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Browser Get Clickable Elements Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_GET_CLICKABLE_ELEMENTS_DESCRIPTION = `Get the clickable or hoverable or selectable elements on the current page, don't call this tool multiple times.\n\nArgs:\n None\n`;\n\nexport const createBrowserGetClickableElementsTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_get_clickable_elements\", {});\n if (!result.ok) {\n return `Error getting clickable elements: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Clickable elements retrieved successfully\";\n } catch (e) {\n return `Error getting clickable elements: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_get_clickable_elements\",\n description: BROWSER_GET_CLICKABLE_ELEMENTS_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Browser Get Download List Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_GET_DOWNLOAD_LIST_DESCRIPTION = `Get the list of downloaded files.\n\nArgs:\n None\n`;\n\nexport const createBrowserGetDownloadListTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_get_download_list\", {});\n if (!result.ok) {\n return `Error getting download list: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Download list retrieved successfully\";\n } catch (e) {\n return `Error getting download list: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_get_download_list\",\n description: BROWSER_GET_DOWNLOAD_LIST_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Browser Get Info Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_GET_INFO_DESCRIPTION = `Get information about browser, like CDP URL, viewport size, etc.\n\nArgs:\n request (Dict): The incoming request context.\n\nReturns:\n Dict containing browser information including CDP URL, viewport dimensions, and other browser metadata.`;\n\nexport const createBrowserGetInfoTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.browser.getInfo();\n if (!result.ok) {\n return `Error getting browser info: ${result.error}`;\n }\n return JSON.stringify(result.body.data, undefined, 2);\n } catch (e) {\n return `Error getting browser info: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_get_info\",\n description: BROWSER_GET_INFO_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Agent Lattice 类型定义\n *\n * 包含Agent Lattice相关的所有类型定义,供其他模块共享使用\n */\n\nimport { z } from \"zod\";\nimport { ModelLattice } from \"@model_lattice/ModelLattice\";\nimport { CompiledStateGraph } from \"@langchain/langgraph\";\nimport {\n AgentType,\n AgentConfig,\n ReactAgentConfig,\n DeepAgentConfig,\n TeamAgentConfig,\n TeamTeammateConfig,\n AgentConfigWithTools,\n GraphBuildOptions,\n hasTools,\n isDeepAgentConfig,\n isTeamAgentConfig,\n getToolsFromConfig,\n getSubAgentsFromConfig,\n MiddlewareType,\n} from \"@axiom-lattice/protocols\";\nimport { ReactAgent } from \"langchain\";\n\n// Re-export types from protocols\nexport {\n AgentType,\n AgentConfig,\n ReactAgentConfig,\n DeepAgentConfig,\n TeamAgentConfig,\n TeamTeammateConfig,\n AgentConfigWithTools,\n GraphBuildOptions,\n hasTools,\n isDeepAgentConfig,\n isTeamAgentConfig,\n getToolsFromConfig,\n getSubAgentsFromConfig,\n};\n\n// Agent客户端类型 - CompiledStateGraph\nexport type AgentClient =\n | CompiledStateGraph<any, any, any, any, any>\n | ReactAgent<any, any, any, any>;\n\n// AgentLattice接口定义\nexport interface AgentLattice {\n config: AgentConfig;\n client?: AgentClient | undefined;\n}\n\n// Middleware configuration\nexport interface MiddlewareConfig {\n id: string;\n type: MiddlewareType;\n name: string;\n description: string;\n enabled: boolean;\n config: Record<string, any>;\n}\n\n// Agent构建参数接口\nexport interface AgentBuildParams {\n middleware?: MiddlewareConfig[];\n skillCategories?: string[];\n tools: Array<{\n key: string;\n definition: any;\n executor: any;\n }>;\n model: ModelLattice;\n subAgents: Array<{\n key: string;\n config: AgentConfig;\n client: AgentClient | undefined;\n }>;\n prompt: string;\n stateSchema?: z.ZodObject<any, any, any, any, any>;\n}\n","import { MemorySaver } from \"@langchain/langgraph\";\nimport { registerCheckpointSaver } from \"./MemoryLatticeManager\";\nconst memory = new MemorySaver();\nregisterCheckpointSaver(\"default\", memory);\n","/**\n * MemoryLatticeManager\n *\n * 记忆Lattice管理器,负责管理和注册检查点保存器\n */\n\nimport { BaseCheckpointSaver } from \"@langchain/langgraph-checkpoint\";\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport { MemoryLatticeProtocol, MemoryType } from \"@axiom-lattice/protocols\";\n\n// Re-export types from protocols\nexport { MemoryType };\n\n/**\n * 记忆Lattice管理器类\n */\nexport class MemoryLatticeManager extends BaseLatticeManager {\n private static instance: MemoryLatticeManager;\n\n // 检查点保存器注册表\n private static checkpointSavers: Map<string, BaseCheckpointSaver> = new Map();\n\n /**\n * 私有构造函数,防止外部直接实例化\n */\n private constructor() {\n super();\n }\n\n /**\n * 获取单例实例\n */\n public static getInstance(): MemoryLatticeManager {\n if (!MemoryLatticeManager.instance) {\n MemoryLatticeManager.instance = new MemoryLatticeManager();\n }\n return MemoryLatticeManager.instance;\n }\n\n /**\n * 获取Lattice类型\n */\n protected getLatticeType(): string {\n return \"memory\";\n }\n\n /**\n * 注册检查点保存器\n * @param key 保存器键名\n * @param saver 检查点保存器实例\n */\n public registerCheckpointSaver(\n key: string,\n saver: BaseCheckpointSaver\n ): void {\n if (MemoryLatticeManager.checkpointSavers.has(key)) {\n console.warn(`检查点保存器 \"${key}\" 已经存在,将会覆盖旧的检查点保存器`);\n }\n\n MemoryLatticeManager.checkpointSavers.set(key, saver);\n }\n\n /**\n * 获取检查点保存器\n * @param key 保存器键名\n */\n public getCheckpointSaver(key: string): BaseCheckpointSaver {\n const saver = MemoryLatticeManager.checkpointSavers.get(key);\n if (!saver) {\n throw new Error(`检查点保存器 \"${key}\" 不存在`);\n }\n return saver;\n }\n\n /**\n * 获取所有已注册的检查点保存器键名\n */\n public getCheckpointSaverKeys(): string[] {\n return Array.from(MemoryLatticeManager.checkpointSavers.keys());\n }\n\n /**\n * 检查检查点保存器是否存在\n * @param key 保存器键名\n */\n public hasCheckpointSaver(key: string): boolean {\n return MemoryLatticeManager.checkpointSavers.has(key);\n }\n\n /**\n * 移除检查点保存器\n * @param key 保存器键名\n */\n public removeCheckpointSaver(key: string): boolean {\n return MemoryLatticeManager.checkpointSavers.delete(key);\n }\n}\n\nexport const getCheckpointSaver = (key: string) =>\n MemoryLatticeManager.getInstance().getCheckpointSaver(key);\n\nexport const registerCheckpointSaver = (\n key: string,\n saver: BaseCheckpointSaver\n) => MemoryLatticeManager.getInstance().registerCheckpointSaver(key, saver);\n","/**\n * State definitions for Deep Agents\n *\n * TypeScript equivalents of the Python state classes using LangGraph's Annotation.Root() pattern.\n * Defines Todo interface and DeepAgentState using MessagesAnnotation as base with proper reducer functions.\n */\n\nimport \"@langchain/langgraph/zod\";\nimport { MessagesZodState } from \"@langchain/langgraph\";\nimport { withLangGraph } from \"@langchain/langgraph/zod\";\nimport { z } from \"zod\";\n\n/**\n * File reducer function that merges file dictionaries\n * Matches the Python file_reducer function behavior exactly\n */\nexport function fileReducer(\n left: Record<string, string> | null | undefined,\n right: Record<string, string> | null | undefined\n): Record<string, string> {\n if (left == null) {\n return right || {};\n } else if (right == null) {\n return left;\n } else {\n return { ...left, ...right };\n }\n}\n\nexport const createReactAgentSchema = (\n schema?: z.ZodObject<any, any, any, any, any>\n) => {\n return schema ? MessagesZodState.extend(schema.shape) : undefined;\n};\n","/**\n * ReAct Agent Graph Builder\n *\n * 实现 ReAct 类型的 Agent Graph 构建\n */\n\nimport { CompiledStateGraph, MessagesZodState } from \"@langchain/langgraph\";\nimport { DynamicTool } from \"@langchain/core/tools\";\nimport { AgentLattice, AgentBuildParams, AgentClient, MiddlewareConfig } from \"../types\";\nimport { AgentGraphBuilder } from \"./AgentGraphBuilder\";\nimport { getToolClient } from \"../../tool_lattice/ToolLatticeManager\";\nimport { createReactAgent } from \"@langchain/langgraph/prebuilt\";\nimport { getCheckpointSaver } from \"@memory_lattice\";\nimport { createReactAgentSchema } from \"./state\";\nimport { createAgent } from \"langchain\";\nimport { sandboxLatticeManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { SandboxFilesystem } from \"../../deep_agent_new/backends/sandboxFiles\";\nimport { createCommonMiddlewares } from \"./commonMiddleware\";\n\nexport class ReActAgentGraphBuilder implements AgentGraphBuilder {\n private createFilesystemBackendFactory(\n middlewareConfigs: MiddlewareConfig[]\n ): ((config: { state: unknown; store?: any }) => Promise<any>) | undefined {\n const filesystemConfig = middlewareConfigs.find(m => m.type === \"filesystem\");\n\n if (!filesystemConfig || !filesystemConfig.enabled) {\n return undefined;\n }\n\n const isolatedLevel = filesystemConfig.config?.isolatedLevel || \"global\";\n\n return async (config: { state: unknown, workspaceId?: string, projectId?: string }) => {\n const { workspaceId, projectId } = config;\n let sandboxName = \"global\";\n\n if (isolatedLevel === \"agent\") {\n sandboxName = \"agent\";\n } else if (isolatedLevel === \"thread\") {\n sandboxName = \"thread\";\n }\n\n const sandboxManager = sandboxLatticeManager.getSandboxLattice(\"default\");\n if (!sandboxManager) {\n throw new Error(\"Sandbox manager not found\");\n }\n\n return new SandboxFilesystem({\n sandboxInstance: await sandboxManager.createSandbox(sandboxName),\n workingDirectory: workspaceId && projectId ? `/${workspaceId}/${projectId}` : \"/\"\n });\n };\n }\n\n private createMiddlewares(middlewareConfigs: MiddlewareConfig[]) {\n return createCommonMiddlewares(middlewareConfigs);\n }\n\n /**\n * 构建ReAct Agent Graph\n *\n * @param agentLattice Agent Lattice对象\n * @param params Agent构建参数\n * @returns 返回CompiledGraph对象\n */\n build(agentLattice: AgentLattice, params: AgentBuildParams): AgentClient {\n const tools = params.tools\n .map((t) => {\n const tool = getToolClient(t.key);\n return tool;\n })\n .filter((tool) => tool !== undefined);\n\n const stateSchema = createReactAgentSchema(params.stateSchema);\n\n const middlewareConfigs = params.middleware || [];\n const filesystemBackend = this.createFilesystemBackendFactory(middlewareConfigs);\n const middlewares = createCommonMiddlewares(middlewareConfigs, filesystemBackend);\n\n return createAgent({\n model: params.model,\n tools: tools,\n systemPrompt: params.prompt,\n name: agentLattice.config.name,\n checkpointer: getCheckpointSaver(\"default\"),\n stateSchema: stateSchema as any,\n middleware: middlewares as any,\n });\n }\n}\n","/**\n * SandboxFilesystem: A sandboxed filesystem backend that connects to a remote sandbox via SDK.\n *\n * This backend provides a secure, isolated filesystem environment by connecting to a remote\n * sandbox service through the @agent-infra/sandbox SDK. It implements the BackendProtocol\n * interface and delegates all file operations to the remote sandbox.\n *\n * Features:\n * - Remote sandbox connection via HTTP API\n * - Virtual path support (all paths start with /)\n * - Path traversal prevention\n * - Full BackendProtocol implementation\n */\n\nimport { SandboxClient } from \"@agent-infra/sandbox\";\nimport * as path from \"path\";\nimport micromatch from \"micromatch\";\nimport type {\n BackendProtocol,\n EditResult,\n FileData,\n FileInfo,\n GrepMatch,\n WriteResult,\n} from \"./protocol.js\";\nimport {\n checkEmptyContent,\n formatContentWithLineNumbers,\n performStringReplacement,\n grepMatchesFromFiles,\n} from \"./utils.js\";\n\n/**\n * Sandboxed filesystem backend that connects to a remote sandbox service.\n *\n * All file operations are delegated to the remote sandbox via the SDK.\n * Paths are treated as virtual absolute paths (starting with /).\n */\nexport class SandboxFilesystem implements BackendProtocol {\n private sandbox: SandboxClient;\n private maxFileSizeBytes: number;\n private workingDirectory: string;\n private baseURL: string;\n private homeDir: string;\n\n /**\n * Create a new SandboxFilesystem instance.\n *\n * @param options - Configuration options\n * @param options.baseURL - Base URL of the sandbox service (default: 'http://localhost:8080')\n * @param options.maxFileSizeMb - Maximum file size in MB (default: 10)\n * @param options.sandboxInstance - Optional Sandbox instance (if provided, baseURL is ignored)\n */\n constructor(\n options: {\n baseURL?: string;\n workingDirectory?: string;\n maxFileSizeMb?: number;\n sandboxInstance?: SandboxClient;\n } = {}\n ) {\n const {\n baseURL = \"http://localhost:8080\",\n workingDirectory = \"/\",\n maxFileSizeMb = 10,\n sandboxInstance,\n } = options;\n\n this.sandbox = sandboxInstance || new SandboxClient({ baseUrl: baseURL, environment: \"\" });\n this.sandbox.mcp.listMcpServers().then((servers) => {\n\n });\n this.sandbox.mcp.listMcpTools(\"browser\").then((tools) => {\n console.log(tools);\n });\n\n // this.sandbox.sandbox.getContext().then((context) => {\n // if (!context.ok) {\n // console.error(context.error);\n // } else {\n // console.log(context?.body);\n // }\n // });\n this.baseURL = baseURL;\n this.maxFileSizeBytes = maxFileSizeMb * 1024 * 1024;\n this.workingDirectory = workingDirectory;\n this.homeDir = \"/home/gem\";\n }\n private resolvePath(virtualPath: string): string {\n return path.join(this.homeDir, this.workingDirectory, virtualPath);\n }\n\n /**\n * Convert a real filesystem path to a virtual path.\n *\n * @param realPath - Real filesystem path\n * @returns Virtual path starting with /\n */\n private toVirtualPath(realPath: string): string {\n const rootPath = path.join(this.homeDir, this.workingDirectory);\n const relative = path.relative(rootPath, realPath);\n const normalized = relative.split(path.sep).join(\"/\");\n return \"/\" + normalized;\n }\n\n /**\n * List files and directories in the specified directory (non-recursive).\n *\n * @param dirPath - Virtual directory path (must start with /)\n * @returns List of FileInfo objects for files and directories directly in the directory.\n * Directories have a trailing / in their path and is_dir=true.\n */\n async lsInfo(dirPath: string): Promise<FileInfo[]> {\n try {\n const resolvedPath = this.resolvePath(dirPath);\n\n const result = await this.sandbox.file.listPath({\n path: resolvedPath,\n recursive: false,\n show_hidden: false,\n max_depth: 0,\n include_size: false,\n include_permissions: false,\n sort_by: \"name\",\n sort_desc: false,\n });\n if (!result.ok) {\n throw result.error;\n }\n const files: FileInfo[] = result.body?.data?.files?.map((file) => ({\n path: this.toVirtualPath(file.path),\n is_dir: file.is_directory,\n size: file.size,\n modified_at: file.modified_time\n })) || [];\n return files;\n } catch (e: any) {\n console.error(`Error listing files in ${dirPath}:`, e);\n return [];\n }\n }\n\n /**\n * Read file content with line numbers.\n *\n * @param filePath - Virtual file path (must start with /)\n * @param offset - Line offset to start reading from (0-indexed)\n * @param limit - Maximum number of lines to read\n * @returns Formatted file content with line numbers, or error message\n */\n async read(\n filePath: string,\n offset: number = 0,\n limit: number = 10000\n ): Promise<string> {\n try {\n const resolvedPath = this.resolvePath(filePath);\n\n let content: string;\n const result = await this.sandbox.file.readFile({\n file: resolvedPath,\n start_line: offset,\n end_line: limit,\n });\n if (!result.ok) {\n throw result.error;\n }\n content = result.body?.data?.content || \"\";\n return content;\n\n } catch (e: any) {\n return `Error: File '${filePath}' not found`;\n }\n }\n\n /**\n * Read file content as raw FileData.\n *\n * @param filePath - Virtual file path (must start with /)\n * @returns Raw file content as FileData\n */\n async readRaw(filePath: string): Promise<FileData> {\n try {\n const content = await this.read(filePath);\n return {\n content: content.split(\"\\n\"),\n created_at: new Date().toISOString(),\n modified_at: new Date().toISOString(),\n };\n\n } catch (e: any) {\n throw new Error(`Error reading file '${filePath}': ${e.message}`);\n }\n\n }\n\n /**\n * Create a new file with content.\n * Returns WriteResult. External storage sets filesUpdate=null.\n *\n * @param filePath - Virtual file path (must start with /)\n * @param content - File content as string\n * @returns WriteResult with error populated on failure\n */\n async write(filePath: string, content: string): Promise<WriteResult> {\n try {\n\n const resolvedPath = this.resolvePath(filePath);\n // const mkdirResult = await this.sandbox.shell.execCommand({\n // command: `mkdir -p \"$(dirname \"${resolvedPath}\")\"`\n // })\n // if (!mkdirResult.ok) {\n // console.error(mkdirResult.error);\n // throw mkdirResult.error\n // }\n const result = await this.sandbox.file.writeFile({\n file: resolvedPath,\n content: content,\n \"encoding\": \"utf-8\",\n \"append\": false,\n // sudo: true\n });\n if (!result.ok) {\n console.error(result.error);\n throw result.error\n }\n\n return {\n path: filePath,\n filesUpdate: {\n [filePath]: {\n content: content.split(\"\\n\"),\n created_at: new Date().toISOString(),\n modified_at: new Date().toISOString(),\n }\n }\n }\n } catch (e: any) {\n throw new Error(`Error writing file '${filePath}': ${e.message}`);\n }\n }\n\n /**\n * Edit a file by replacing string occurrences.\n * Returns EditResult. External storage sets filesUpdate=null.\n *\n * @param filePath - Virtual file path (must start with /)\n * @param oldString - String to find and replace\n * @param newString - Replacement string\n * @param replaceAll - If true, replace all occurrences (default: false)\n * @returns EditResult with error, path, filesUpdate, and occurrences\n */\n async edit(\n filePath: string,\n oldString: string,\n newString: string,\n replaceAll: boolean = false\n ): Promise<EditResult> {\n try {\n const resolvedPath = this.resolvePath(filePath);\n const result = await this.sandbox.file.strReplaceEditor({\n command: \"str_replace\",\n path: resolvedPath,\n old_str: oldString,\n new_str: newString,\n replace_mode: replaceAll ? \"ALL\" : \"FIRST\",\n });\n if (!result.ok) {\n throw result.error;\n }\n return {\n path: filePath,\n filesUpdate: null,\n }\n }\n catch (e: any) {\n throw new Error(`Error editing file '${filePath}': ${e.message}`);\n }\n }\n\n /**\n * Structured search results or error string for invalid input.\n *\n * Searches file contents for a regex pattern within the sandbox.\n *\n * @param pattern - Regex pattern to search for\n * @param searchPath - Base path to search from (default: \"/\")\n * @param glob - Optional glob pattern to filter files (e.g., \"*.py\")\n * @returns List of GrepMatch objects or error string for invalid regex\n */\n async grepRaw(\n pattern: string,\n searchPath: string | null = \"/\",\n glob: string | null = null\n ): Promise<GrepMatch[] | string> {\n // Resolve base path\n let baseFull: string;\n baseFull = this.resolvePath(searchPath || \"/\");\n\n // Use fast-glob to recursively find all files\n const result = await this.sandbox.file.findFiles({\n path: baseFull,\n glob: glob || \"**/*\"\n })\n\n if (!result.ok) {\n throw result.error;\n }\n const filePaths = result.body?.data?.files || [];\n\n const matches: GrepMatch[] = [];\n\n // Iterate through each file and search for matches\n for (const absolutePath of filePaths) {\n // Read file content as FileData\n const fileData = await this.sandbox.file.searchInFile({\n file: absolutePath,\n regex: pattern,\n });\n if (!fileData.ok) {\n continue;\n }\n\n const matchesData = fileData.body?.data?.matches || [];\n const matchLines = fileData.body?.data?.line_numbers || [];\n matchesData.forEach((match, index) => {\n matches.push({\n path: this.toVirtualPath(absolutePath),\n line: matchLines[index],\n text: match,\n });\n })\n }\n return matches;\n\n }\n\n /**\n * Structured glob matching returning FileInfo objects.\n *\n * @param pattern - Glob pattern (e.g., `*.py`, `**\\/*.ts`)\n * @param searchPath - Base path to search from (default: \"/\")\n * @returns List of FileInfo objects matching the pattern\n */\n async globInfo(\n pattern: string,\n searchPath: string = \"/\"\n ): Promise<FileInfo[]> {\n if (pattern.startsWith(\"/\")) {\n pattern = pattern.substring(1);\n }\n\n const resolvedSearchPath = this.resolvePath(searchPath);\n // Use fast-glob to recursively find all files\n const result = await this.sandbox.file.findFiles({\n path: resolvedSearchPath,\n glob: pattern || \"**/*\"\n })\n\n if (!result.ok) {\n throw result.error;\n }\n\n const results: FileInfo[] = [];\n for (const filePath of result.body?.data?.files || []) {\n const fileInfo = await this.sandbox.file.listPath({\n path: filePath,\n recursive: false,\n show_hidden: false,\n max_depth: 1,\n include_size: false,\n include_permissions: false,\n\n });\n if (!fileInfo.ok) {\n continue;\n }\n results.push({\n path: this.toVirtualPath(filePath),\n is_dir: false,\n size: fileInfo.body?.data?.files?.[0]?.size,\n modified_at: fileInfo.body?.data?.files?.[0]?.modified_time\n })\n }\n\n return results;\n\n\n }\n\n\n}\n","import { AIMessage, createMiddleware, tool, type AgentMiddleware } from \"langchain\";\n\nimport { sandboxLatticeManager } from \"../sandbox_lattice/SandboxLatticeManager\";\nimport { getToolClient } from \"../tool_lattice/ToolLatticeManager\";\nimport { createCodeEvalTool } from \"@tool_lattice/code_eval\";\nimport { createCodeExecuteFileTool } from \"@tool_lattice/code_execute_file\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n/**\n * Parameters for creating the Skill middleware.\n *\n * This is a TypeScript adaptation of the Python SkillMiddleware:\n *\n * - Injects a formatted list of skills into the system prompt.\n * - Registers a `load_skill`-like tool so the model can fetch\n * detailed information for specific skills when needed.\n */\nexport interface CreateCodeEvalMiddlewareParams {\n isolatedLevel: IsolatedLevel;\n}\n\n/**\n * Create middleware that injects sandbox descriptions into the system prompt.\n *\n * This mirrors the behavior of the Python SandboxMiddleware:\n *\n * - Injects a formatted list of sandboxes into the system prompt.\n * - Registers a `load_sandbox`-like tool so the model can fetch\n * detailed information for specific sandboxes when needed.\n */\nexport function createCodeEvalMiddleware(\n params: CreateCodeEvalMiddlewareParams = { isolatedLevel: \"global\" }\n): AgentMiddleware {\n\n const codeEvalTool = createCodeEvalTool({ isolatedLevel: params.isolatedLevel });\n const codeExecuteFileTool = createCodeExecuteFileTool({ isolatedLevel: params.isolatedLevel });\n return createMiddleware({\n name: \"codeEvalMiddleware\",\n tools: [codeEvalTool, codeExecuteFileTool, getToolClient(\"convert_to_markdown\")],\n\n });\n}\n\n\n","import { createMiddleware, type AgentMiddleware } from \"langchain\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\nimport {\n createBrowserNavigateTool,\n createBrowserClickTool,\n createBrowserGetTextTool,\n createBrowserGetMarkdownTool,\n createBrowserEvaluateTool,\n createBrowserScreenshotTool,\n createBrowserScrollTool,\n createBrowserFormInputFillTool,\n createBrowserSelectTool,\n createBrowserHoverTool,\n createBrowserGoBackTool,\n createBrowserGoForwardTool,\n createBrowserNewTabTool,\n createBrowserTabListTool,\n createBrowserSwitchTabTool,\n createBrowserCloseTabTool,\n createBrowserCloseTool,\n createBrowserPressKeyTool,\n createBrowserReadLinksTool,\n createBrowserGetClickableElementsTool,\n createBrowserGetDownloadListTool,\n createBrowserGetInfoTool,\n} from \"../tool_lattice/browser\";\n\nexport interface CreateBrowserMiddlewareParams {\n isolatedLevel?: IsolatedLevel;\n}\n\nexport function createBrowserMiddleware(\n params: CreateBrowserMiddlewareParams = { isolatedLevel: \"global\" }\n): AgentMiddleware {\n const isolatedLevel = params.isolatedLevel || \"global\";\n\n const tools = [\n createBrowserNavigateTool({ isolatedLevel }),\n createBrowserClickTool({ isolatedLevel }),\n createBrowserGetTextTool({ isolatedLevel }),\n createBrowserGetMarkdownTool({ isolatedLevel }),\n createBrowserEvaluateTool({ isolatedLevel }),\n createBrowserScreenshotTool({ isolatedLevel }),\n createBrowserScrollTool({ isolatedLevel }),\n createBrowserFormInputFillTool({ isolatedLevel }),\n createBrowserSelectTool({ isolatedLevel }),\n createBrowserHoverTool({ isolatedLevel }),\n createBrowserGoBackTool({ isolatedLevel }),\n createBrowserGoForwardTool({ isolatedLevel }),\n createBrowserNewTabTool({ isolatedLevel }),\n createBrowserTabListTool({ isolatedLevel }),\n createBrowserSwitchTabTool({ isolatedLevel }),\n createBrowserCloseTabTool({ isolatedLevel }),\n createBrowserCloseTool({ isolatedLevel }),\n createBrowserPressKeyTool({ isolatedLevel }),\n createBrowserReadLinksTool({ isolatedLevel }),\n createBrowserGetClickableElementsTool({ isolatedLevel }),\n createBrowserGetDownloadListTool({ isolatedLevel }),\n createBrowserGetInfoTool({ isolatedLevel }),\n ];\n\n return createMiddleware({\n name: \"browserMiddleware\",\n tools,\n });\n}\n","import { createMiddleware, type AgentMiddleware } from \"langchain\";\nimport {\n createListTablesSqlTool,\n createInfoSqlTool,\n createQueryCheckerSqlTool,\n createQuerySqlTool,\n} from \"../tool_lattice/sql\";\n\nexport interface CreateSqlMiddlewareParams {\n databaseKeys?: string[];\n databaseDescriptions?: Record<string, string>;\n}\n\nexport function createSqlMiddleware(\n params: CreateSqlMiddlewareParams\n): AgentMiddleware {\n const { databaseKeys, databaseDescriptions } = params;\n\n if (!databaseKeys || databaseKeys.length === 0) {\n return createMiddleware({\n name: \"sqlMiddleware\",\n tools: [],\n });\n }\n\n const toolParams = {\n databaseKeys,\n databaseDescriptions,\n };\n\n return createMiddleware({\n name: \"sqlMiddleware\",\n tools: [\n createListTablesSqlTool(toolParams),\n createInfoSqlTool(toolParams),\n createQueryCheckerSqlTool(toolParams),\n createQuerySqlTool(toolParams),\n ],\n });\n}\n","import { createMiddleware, type AgentMiddleware } from \"langchain\";\nimport type { Skill, SkillConfig } from \"@axiom-lattice/protocols\";\nimport { skillLatticeManager } from \"../skill_lattice\";\nimport { getStoreLattice } from \"@store_lattice\";\nimport { createLoadSkillsTool, createLoadSkillContentTool, createLoadSkillResourceTool } from \"../tool_lattice/skill\";\n\n\n/**\n * Parameters for creating the Skill middleware.\n */\nexport interface CreateSkillMiddlewareParams {\n /**\n * List of skill IDs to use.\n * Only these skills will be available to the agent.\n * Ignored if readAll is true.\n */\n skills?: string[];\n /**\n * When true, the agent will have access to all available skills automatically.\n * When false or undefined, only the skills in the skills list will be available.\n */\n readAll?: boolean;\n /** Optional heading for the skills section */\n heading?: string;\n /** Optional extra explanatory note appended after the skills list */\n extraNote?: string;\n}\n\nconst DEFAULT_HEADING = \"To better accomplish the user's objective, you can use the following skills to access best practices.\";\nconst DEFAULT_EXTRA_NOTE = `\nyou must:\n1) systematically evaluate every available skill for relevance,\n2) explicitly activate all skills you judge relevant using the \\`load_skill_content\\` tool to get the best practices *before* working on the task, and\n3) implement your solution using the guidance and best practices from those activated skills, explaining trade‑offs when they matter.\n`;\n\n/**\n * Create middleware that injects skill descriptions into the system prompt.\n */\nexport function createSkillMiddleware(\n params: CreateSkillMiddlewareParams = {}\n): AgentMiddleware {\n const {\n skills = [],\n readAll = false,\n heading = DEFAULT_HEADING,\n extraNote = DEFAULT_EXTRA_NOTE,\n } = params;\n\n let latestSkills: Skill[] = [];\n\n return createMiddleware({\n name: \"skillMiddleware\",\n tools: [\n createLoadSkillsTool({ skills: readAll ? undefined : skills }),\n createLoadSkillContentTool(),\n createLoadSkillResourceTool(),\n ],\n beforeAgent: async () => {\n try {\n const storeLattice = getStoreLattice(\"default\", \"skill\");\n const skillStore = storeLattice?.store;\n\n if (readAll) {\n // Load all available skills\n latestSkills = await skillStore.getAllSkills();\n } else if (skills && skills.length > 0) {\n // Load only specified skills\n const skillLatticePromises = skills.map((skillId: string) =>\n skillStore.getSkillById(skillId)\n );\n const skillLattices = await Promise.all(skillLatticePromises);\n latestSkills = skillLattices.filter((skill): skill is Skill => skill !== undefined);\n }\n } catch (error) {\n console.error(\"Error fetching skills:\", error);\n }\n },\n wrapModelCall: (request, handler) => {\n const skillsPrompt = latestSkills\n .map((skill) => `## ${skill.name}\\n${skill.description}`)\n .join(\"\\n\");\n\n const skillsAddendum = `\\n\\n${heading}\\n\\n${skillsPrompt}\\n\\n${extraNote}`;\n\n const existingSystemPrompt = request.systemPrompt ?? \"\";\n const newSystemPrompt =\n existingSystemPrompt.length > 0\n ? `${existingSystemPrompt}${skillsAddendum}`\n : skillsAddendum.trimStart();\n\n return handler({\n ...request,\n systemPrompt: newSystemPrompt,\n });\n },\n });\n}\n\n","/**\n * InMemoryThreadStore\n *\n * In-memory implementation of ThreadStore\n * Provides CRUD operations for thread data stored in memory\n * Threads are organized by assistant ID\n */\n\nimport type {\n ThreadStore,\n Thread,\n CreateThreadRequest,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * In-memory implementation of ThreadStore\n */\nexport class InMemoryThreadStore implements ThreadStore {\n // Map<assistantId, Map<threadId, Thread>>\n private threads: Map<string, Map<string, Thread>> = new Map();\n\n /**\n * Get all threads for a specific assistant\n */\n async getThreadsByAssistantId(assistantId: string): Promise<Thread[]> {\n const assistantThreads = this.threads.get(assistantId);\n if (!assistantThreads) {\n return [];\n }\n return Array.from(assistantThreads.values());\n }\n\n /**\n * Get a thread by ID for a specific assistant\n */\n async getThreadById(\n assistantId: string,\n threadId: string\n ): Promise<Thread | undefined> {\n const assistantThreads = this.threads.get(assistantId);\n if (!assistantThreads) {\n return undefined;\n }\n return assistantThreads.get(threadId);\n }\n\n /**\n * Create a new thread for an assistant\n */\n async createThread(\n assistantId: string,\n threadId: string,\n data: CreateThreadRequest\n ): Promise<Thread> {\n const now = new Date();\n const thread: Thread = {\n id: threadId,\n assistantId,\n metadata: data.metadata || {},\n createdAt: now,\n updatedAt: now,\n };\n\n // Initialize assistant's thread map if it doesn't exist\n if (!this.threads.has(assistantId)) {\n this.threads.set(assistantId, new Map());\n }\n\n const assistantThreads = this.threads.get(assistantId)!;\n assistantThreads.set(threadId, thread);\n return thread;\n }\n\n /**\n * Update an existing thread\n */\n async updateThread(\n assistantId: string,\n threadId: string,\n updates: Partial<CreateThreadRequest>\n ): Promise<Thread | null> {\n const assistantThreads = this.threads.get(assistantId);\n if (!assistantThreads) {\n return null;\n }\n\n const existing = assistantThreads.get(threadId);\n if (!existing) {\n return null;\n }\n\n const updated: Thread = {\n ...existing,\n metadata: {\n ...existing.metadata,\n ...(updates.metadata || {}),\n },\n updatedAt: new Date(),\n };\n assistantThreads.set(threadId, updated);\n return updated;\n }\n\n /**\n * Delete a thread by ID\n */\n async deleteThread(assistantId: string, threadId: string): Promise<boolean> {\n const assistantThreads = this.threads.get(assistantId);\n if (!assistantThreads) {\n return false;\n }\n return assistantThreads.delete(threadId);\n }\n\n /**\n * Check if thread exists\n */\n async hasThread(assistantId: string, threadId: string): Promise<boolean> {\n const assistantThreads = this.threads.get(assistantId);\n if (!assistantThreads) {\n return false;\n }\n return assistantThreads.has(threadId);\n }\n\n /**\n * Clear all threads (useful for testing)\n */\n clear(): void {\n this.threads.clear();\n }\n\n /**\n * Get all threads for all assistants (useful for debugging)\n */\n getAllThreads(): Thread[] {\n const allThreads: Thread[] = [];\n for (const assistantThreads of this.threads.values()) {\n allThreads.push(...Array.from(assistantThreads.values()));\n }\n return allThreads;\n }\n}\n","/**\n * InMemoryAssistantStore\n *\n * In-memory implementation of AssistantStore\n * Provides CRUD operations for assistant data stored in memory\n */\n\nimport type {\n AssistantStore,\n Assistant,\n CreateAssistantRequest,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * In-memory implementation of AssistantStore\n */\nexport class InMemoryAssistantStore implements AssistantStore {\n private assistants: Map<string, Assistant> = new Map();\n\n /**\n * Get all assistants\n */\n async getAllAssistants(): Promise<Assistant[]> {\n return Array.from(this.assistants.values());\n }\n\n /**\n * Get assistant by ID\n */\n async getAssistantById(id: string): Promise<Assistant | null> {\n return this.assistants.get(id) || null;\n }\n\n /**\n * Create a new assistant\n */\n async createAssistant(\n id: string,\n data: CreateAssistantRequest\n ): Promise<Assistant> {\n const now = new Date();\n const assistant: Assistant = {\n id,\n name: data.name,\n description: data.description,\n graphDefinition: data.graphDefinition,\n createdAt: now,\n updatedAt: now,\n };\n this.assistants.set(id, assistant);\n return assistant;\n }\n\n /**\n * Update an existing assistant\n */\n async updateAssistant(\n id: string,\n updates: Partial<CreateAssistantRequest>\n ): Promise<Assistant | null> {\n const existing = this.assistants.get(id);\n if (!existing) {\n return null;\n }\n\n const updated: Assistant = {\n ...existing,\n ...updates,\n updatedAt: new Date(),\n };\n this.assistants.set(id, updated);\n return updated;\n }\n\n /**\n * Delete an assistant by ID\n */\n async deleteAssistant(id: string): Promise<boolean> {\n return this.assistants.delete(id);\n }\n\n /**\n * Check if assistant exists\n */\n async hasAssistant(id: string): Promise<boolean> {\n return this.assistants.has(id);\n }\n\n /**\n * Clear all assistants (useful for testing)\n */\n clear(): void {\n this.assistants.clear();\n }\n}\n","/**\n * FileSystemSkillStore\n *\n * Filesystem-based implementation of SkillStore\n * Stores each skill as a Markdown file with YAML frontmatter\n */\n\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport {\n SkillStore,\n Skill,\n CreateSkillRequest,\n} from \"@axiom-lattice/protocols\";\nimport { validateSkillName } from \"../skill_lattice/skillNameValidator\";\n\n/**\n * Parse YAML frontmatter from markdown content\n */\nfunction parseFrontmatter(content: string): {\n frontmatter: Record<string, any>;\n body: string;\n} {\n const frontmatterRegex = /^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n?([\\s\\S]*)$/;\n const match = content.match(frontmatterRegex);\n\n if (!match) {\n console.warn(\"[parseFrontmatter] No frontmatter match found in content\");\n return { frontmatter: {}, body: content };\n }\n\n const frontmatterText = match[1];\n const body = match[2] || \"\";\n\n // Simple YAML parser for basic key-value pairs and nested objects\n const frontmatter: Record<string, any> = {};\n const lines = frontmatterText.split(\"\\n\");\n let currentKey: string | null = null;\n let metadataIndent = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n \n if (!trimmed || trimmed.startsWith(\"#\")) {\n continue;\n }\n\n // Check if this is a nested metadata entry\n const indentMatch = line.match(/^(\\s*)/);\n const indent = indentMatch ? indentMatch[1].length : 0;\n\n if (currentKey === \"metadata\" && indent > metadataIndent) {\n // This is a nested metadata entry\n const colonIndex = trimmed.indexOf(\":\");\n if (colonIndex !== -1) {\n const key = trimmed.substring(0, colonIndex).trim();\n let value = trimmed.substring(colonIndex + 1).trim();\n \n // Remove quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n \n if (!frontmatter.metadata) {\n frontmatter.metadata = {};\n }\n frontmatter.metadata[key] = value;\n }\n continue;\n }\n\n if (currentKey === \"subSkills\" && indent > metadataIndent) {\n // This is a subSkills array item\n if (trimmed.startsWith(\"-\")) {\n let value = trimmed.substring(1).trim();\n \n // Remove quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n \n if (!frontmatter.subSkills) {\n frontmatter.subSkills = [];\n }\n frontmatter.subSkills.push(value);\n }\n continue;\n }\n\n // Reset metadata/subSkills tracking\n if ((currentKey === \"metadata\" || currentKey === \"subSkills\") && indent <= metadataIndent) {\n currentKey = null;\n metadataIndent = 0;\n }\n\n const colonIndex = trimmed.indexOf(\":\");\n if (colonIndex === -1) {\n continue;\n }\n\n const key = trimmed.substring(0, colonIndex).trim();\n let value = trimmed.substring(colonIndex + 1).trim();\n\n // Remove quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n // Handle metadata as nested object\n if (key === \"metadata\") {\n if (value === \"\" || value === \"{}\") {\n // Check if next line starts with indentation (nested metadata)\n if (i + 1 < lines.length) {\n const nextLine = lines[i + 1];\n const nextIndent = nextLine.match(/^(\\s*)/)?.[1].length || 0;\n if (nextIndent > indent) {\n currentKey = \"metadata\";\n metadataIndent = indent;\n frontmatter.metadata = {};\n continue;\n }\n }\n frontmatter[key] = {};\n } else if (value.startsWith(\"{\")) {\n try {\n frontmatter[key] = JSON.parse(value);\n } catch {\n frontmatter[key] = {};\n }\n } else {\n frontmatter[key] = {};\n }\n } else if (key === \"subSkills\") {\n // Handle subSkills as array\n if (value === \"\" || value === \"[]\") {\n // Check if next line starts with indentation (array items)\n if (i + 1 < lines.length) {\n const nextLine = lines[i + 1];\n const nextIndent = nextLine.match(/^(\\s*)/)?.[1].length || 0;\n if (nextIndent > indent && nextLine.trim().startsWith(\"-\")) {\n currentKey = \"subSkills\";\n metadataIndent = indent;\n frontmatter.subSkills = [];\n continue;\n }\n }\n frontmatter[key] = [];\n } else if (value.startsWith(\"[\")) {\n try {\n frontmatter[key] = JSON.parse(value);\n } catch {\n frontmatter[key] = [];\n }\n } else {\n frontmatter[key] = [];\n }\n } else {\n frontmatter[key] = value;\n }\n }\n\n return { frontmatter, body };\n}\n\n/**\n * Generate YAML frontmatter string\n */\nfunction generateFrontmatter(data: {\n name: string;\n description: string;\n license?: string;\n compatibility?: string;\n metadata?: Record<string, string>;\n subSkills?: string[];\n}): string {\n const lines: string[] = [\"---\"];\n\n lines.push(`name: ${data.name}`);\n lines.push(`description: ${data.description}`);\n\n if (data.license) {\n lines.push(`license: ${data.license}`);\n }\n\n if (data.compatibility) {\n lines.push(`compatibility: ${data.compatibility}`);\n }\n\n if (data.metadata && Object.keys(data.metadata).length > 0) {\n // Format metadata as YAML object\n lines.push(\"metadata:\");\n for (const [key, value] of Object.entries(data.metadata)) {\n lines.push(` ${key}: ${value}`);\n }\n }\n\n if (data.subSkills && data.subSkills.length > 0) {\n // Format subSkills as YAML array\n lines.push(\"subSkills:\");\n for (const subSkill of data.subSkills) {\n lines.push(` - ${subSkill}`);\n }\n }\n\n lines.push(\"---\");\n return lines.join(\"\\n\");\n}\n\n/**\n * FileSystemSkillStore options\n */\nexport interface FileSystemSkillStoreOptions {\n /**\n * Root directory path for storing skills\n * Can be absolute or relative path (relative to current working directory)\n * @default \"lattice_store/skills\"\n */\n rootDir?: string;\n}\n\n/**\n * Skill resource metadata\n */\nexport interface SkillResource {\n path: string;\n isDirectory: boolean;\n}\n\n/**\n * Filesystem-based implementation of SkillStore\n */\nexport class FileSystemSkillStore implements SkillStore {\n private rootDir: string;\n\n constructor(options: FileSystemSkillStoreOptions = {}) {\n const defaultPath = \"lattice_store/skills\";\n const providedPath = options.rootDir || defaultPath;\n \n // Resolve path: if absolute, use as-is; if relative, resolve from cwd\n if (path.isAbsolute(providedPath)) {\n this.rootDir = providedPath;\n } else {\n this.rootDir = path.resolve(process.cwd(), providedPath);\n }\n \n // Ensure root directory exists\n this.ensureDirectoryExists().catch((error) => {\n console.error(\"Failed to initialize FileSystemSkillStore:\", error);\n });\n }\n\n /**\n * Ensure the root directory exists\n */\n private async ensureDirectoryExists(): Promise<void> {\n try {\n await fs.access(this.rootDir);\n } catch {\n // Directory doesn't exist, create it\n await fs.mkdir(this.rootDir, { recursive: true });\n }\n }\n\n /**\n * Get directory path for a skill name\n * Name is used as the directory name, and SKILL.md is the fixed filename\n */\n private getSkillDirectoryPath(name: string): string {\n // Name should already be validated, but add safety check\n if (name.includes(\"..\") || name.includes(\"/\") || name.includes(\"\\\\\")) {\n throw new Error(`Invalid skill name: ${name} (contains invalid characters)`);\n }\n return path.join(this.rootDir, name);\n }\n\n /**\n * Get file path for a skill name\n * File is always named SKILL.md inside the name directory\n */\n private getSkillFilePath(name: string): string {\n return path.join(this.getSkillDirectoryPath(name), \"SKILL.md\");\n }\n\n /**\n * Read skill from file\n * Uses name as the directory name and reads SKILL.md from it\n */\n private async readSkillFile(name: string): Promise<Skill | null> {\n await this.ensureDirectoryExists();\n const filePath = this.getSkillFilePath(name);\n\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n const { frontmatter, body } = parseFrontmatter(content);\n\n if (!frontmatter.name || !frontmatter.description) {\n console.warn(\n `Skill file ${name} parsed frontmatter:`,\n JSON.stringify(frontmatter, null, 2)\n );\n console.warn(`Raw frontmatter text (first 200 chars):`, content.substring(0, 200));\n }\n\n // Get file stats for timestamps\n const stats = await fs.stat(filePath);\n\n // Validate required fields\n if (!frontmatter.name || !frontmatter.description) {\n throw new Error(\n `Invalid skill file ${name}: missing required fields (name or description). Frontmatter: ${JSON.stringify(frontmatter)}`\n );\n }\n\n // Ensure name matches directory name\n if (frontmatter.name !== name) {\n throw new Error(\n `Skill name mismatch: directory name is \"${name}\" but frontmatter name is \"${frontmatter.name}\"`\n );\n }\n\n return {\n id: name, // id equals name (name is used for path addressing)\n name: frontmatter.name,\n description: frontmatter.description,\n license: frontmatter.license,\n compatibility: frontmatter.compatibility,\n metadata: frontmatter.metadata || {},\n content: body.trim() || undefined,\n subSkills: Array.isArray(frontmatter.subSkills) ? frontmatter.subSkills : undefined,\n createdAt: stats.birthtime,\n updatedAt: stats.mtime,\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n console.warn(`Skill file not found: ${filePath}`);\n return null;\n }\n // Re-throw with more context\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to read skill file ${filePath}: ${errorMessage}`);\n }\n }\n\n /**\n * Write skill to file\n * Creates directory with name and writes SKILL.md inside it\n */\n private async writeSkillFile(skill: Skill): Promise<void> {\n await this.ensureDirectoryExists();\n \n // Ensure id equals name (name is used for path addressing)\n const skillName = skill.name;\n const skillDir = this.getSkillDirectoryPath(skillName);\n const filePath = this.getSkillFilePath(skillName);\n\n // Create directory if it doesn't exist\n try {\n await fs.mkdir(skillDir, { recursive: true });\n } catch (error) {\n // Directory might already exist, ignore\n }\n\n const frontmatter = generateFrontmatter({\n name: skillName,\n description: skill.description,\n license: skill.license,\n compatibility: skill.compatibility,\n metadata: skill.metadata,\n subSkills: skill.subSkills,\n });\n\n const body = skill.content || \"\";\n const content = body\n ? `${frontmatter}\\n${body}`\n : `${frontmatter}\\n`;\n\n await fs.writeFile(filePath, content, \"utf-8\");\n }\n\n /**\n * Get all skills\n */\n async getAllSkills(): Promise<Skill[]> {\n await this.ensureDirectoryExists();\n\n try {\n const entries = await fs.readdir(this.rootDir, { withFileTypes: true });\n\n const skills: Skill[] = [];\n for (const entry of entries) {\n // Only process directories\n if (entry.isDirectory()) {\n const skillName = entry.name;\n try {\n const skill = await this.readSkillFile(skillName);\n if (skill) {\n skills.push(skill);\n } else {\n console.warn(\n `Failed to load skill \"${skillName}\": readSkillFile returned null`\n );\n }\n } catch (error) {\n console.error(\n `Error loading skill \"${skillName}\" from ${this.getSkillFilePath(skillName)}:`,\n error instanceof Error ? error.message : String(error)\n );\n // Continue processing other skills instead of failing completely\n }\n }\n }\n\n return skills.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n console.warn(\n `Skills directory not found: ${this.rootDir}`\n );\n return [];\n }\n throw error;\n }\n }\n\n /**\n * Get skill by ID\n * ID should equal name (name is used for path addressing)\n */\n async getSkillById(id: string): Promise<Skill | null> {\n // Use id as name (they should be the same)\n return this.readSkillFile(id);\n }\n\n /**\n * Create a new skill\n * id should equal name (name is used for path addressing)\n */\n async createSkill(id: string, data: CreateSkillRequest): Promise<Skill> {\n await this.ensureDirectoryExists();\n\n // Validate name format\n validateSkillName(data.name);\n\n // Validate that id equals name\n if (id !== data.name) {\n throw new Error(\n `Skill id \"${id}\" must equal name \"${data.name}\" (name is used for path addressing)`\n );\n }\n\n // Check if skill already exists\n const existing = await this.getSkillById(id);\n if (existing) {\n // Update existing skill\n return this.updateSkill(id, data) as Promise<Skill>;\n }\n\n const now = new Date();\n const skill: Skill = {\n id: data.name, // id equals name\n name: data.name,\n description: data.description,\n license: data.license,\n compatibility: data.compatibility,\n metadata: data.metadata || {},\n content: data.content,\n subSkills: data.subSkills,\n createdAt: now,\n updatedAt: now,\n };\n\n await this.writeSkillFile(skill);\n return skill;\n }\n\n /**\n * Update an existing skill\n */\n async updateSkill(\n id: string,\n updates: Partial<CreateSkillRequest>\n ): Promise<Skill | null> {\n const skill = await this.readSkillFile(id);\n if (!skill) {\n return null;\n }\n\n // If name is being updated, validate it\n if (updates.name !== undefined) {\n validateSkillName(updates.name);\n \n // If name changes, we need to move the directory\n if (updates.name !== skill.name) {\n const oldDir = this.getSkillDirectoryPath(skill.name);\n const newDir = this.getSkillDirectoryPath(updates.name);\n \n // Move directory\n try {\n await fs.rename(oldDir, newDir);\n } catch (error) {\n throw new Error(\n `Failed to rename skill directory from \"${skill.name}\" to \"${updates.name}\": ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n\n const updatedSkill: Skill = {\n ...skill,\n name: updates.name ?? skill.name,\n id: updates.name ?? skill.id, // id equals name\n description: updates.description ?? skill.description,\n license: updates.license ?? skill.license,\n compatibility: updates.compatibility ?? skill.compatibility,\n metadata: updates.metadata ?? skill.metadata,\n content: updates.content !== undefined ? updates.content : skill.content,\n subSkills: updates.subSkills !== undefined ? updates.subSkills : skill.subSkills,\n updatedAt: new Date(),\n };\n\n await this.writeSkillFile(updatedSkill);\n return updatedSkill;\n }\n\n /**\n * Delete a skill by ID\n * Deletes the entire directory (name is the directory name)\n */\n async deleteSkill(id: string): Promise<boolean> {\n await this.ensureDirectoryExists();\n const skillDir = this.getSkillDirectoryPath(id);\n\n try {\n // Remove the entire directory\n await fs.rm(skillDir, { recursive: true, force: true });\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n }\n\n /**\n * Check if skill exists\n */\n async hasSkill(id: string): Promise<boolean> {\n const skill = await this.getSkillById(id);\n return skill !== null;\n }\n\n /**\n * Search skills by metadata\n */\n async searchByMetadata(\n metadataKey: string,\n metadataValue: string\n ): Promise<Skill[]> {\n const allSkills = await this.getAllSkills();\n return allSkills.filter((skill) => {\n return (\n skill.metadata &&\n skill.metadata[metadataKey] === metadataValue\n );\n });\n }\n\n /**\n * Filter skills by compatibility\n */\n async filterByCompatibility(compatibility: string): Promise<Skill[]> {\n const allSkills = await this.getAllSkills();\n return allSkills.filter((skill) => {\n return skill.compatibility === compatibility;\n });\n }\n\n /**\n * Filter skills by license\n */\n async filterByLicense(license: string): Promise<Skill[]> {\n const allSkills = await this.getAllSkills();\n return allSkills.filter((skill) => {\n return skill.license === license;\n });\n }\n\n /**\n * Get sub-skills of a parent skill\n */\n async getSubSkills(parentSkillName: string): Promise<Skill[]> {\n const parentSkill = await this.getSkillById(parentSkillName);\n if (!parentSkill || !parentSkill.subSkills || parentSkill.subSkills.length === 0) {\n return [];\n }\n\n const subSkills: Skill[] = [];\n for (const subSkillName of parentSkill.subSkills) {\n const subSkill = await this.getSkillById(subSkillName);\n if (subSkill) {\n subSkills.push(subSkill);\n }\n }\n\n return subSkills;\n }\n\n /**\n * List all resources in a skill's resources directory\n * @param skillName The skill name\n * @returns Array of resource paths relative to resources/ directory\n */\n async listSkillResources(skillName: string): Promise<string[]> {\n const skillDir = this.getSkillDirectoryPath(skillName);\n const resourcesDir = path.join(skillDir, \"resources\");\n\n try {\n const entries = await fs.readdir(resourcesDir, { withFileTypes: true, recursive: true });\n const resources: string[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n const fullPath = path.join(entry.path, entry.name);\n const relativePath = path.relative(resourcesDir, fullPath);\n resources.push(relativePath.replace(/\\\\/g, \"/\"));\n }\n }\n\n return resources.sort();\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n }\n\n /**\n * Load a specific resource from a skill's resources directory\n * @param skillName The skill name\n * @param resourcePath Path to the resource relative to resources/ directory\n * @returns The resource content as string\n */\n async loadSkillResource(skillName: string, resourcePath: string): Promise<string | null> {\n const skillDir = this.getSkillDirectoryPath(skillName);\n const resourcesDir = path.join(skillDir, \"resources\");\n const fullPath = path.join(resourcesDir, resourcePath);\n\n // Security check: ensure the path is within resources directory\n const resolvedPath = path.resolve(fullPath);\n const resolvedResourcesDir = path.resolve(resourcesDir);\n if (!resolvedPath.startsWith(resolvedResourcesDir)) {\n throw new Error(`Invalid resource path: ${resourcePath}`);\n }\n\n try {\n const content = await fs.readFile(fullPath, \"utf-8\");\n return content;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n }\n}\n","/**\n * Skill name validator\n * Validates skill names according to the specification:\n * - 1-64 characters\n * - Lowercase alphanumeric with single hyphen separators\n * - Not start or end with -\n * - Not contain consecutive --\n * - Match the directory name that contains SKILL.md\n * - Regex: ^[a-z0-9]+(-[a-z0-9]+)*$\n */\n\nconst SKILL_NAME_REGEX = /^[a-z0-9]+(-[a-z0-9]+)*$/;\nconst MIN_LENGTH = 1;\nconst MAX_LENGTH = 64;\n\n/**\n * Validate skill name\n * @param name Skill name to validate\n * @returns true if valid, false otherwise\n */\nexport function isValidSkillName(name: string): boolean {\n if (!name || typeof name !== \"string\") {\n return false;\n }\n\n // Check length\n if (name.length < MIN_LENGTH || name.length > MAX_LENGTH) {\n return false;\n }\n\n // Check regex pattern\n return SKILL_NAME_REGEX.test(name);\n}\n\n/**\n * Validate skill name and throw error if invalid\n * @param name Skill name to validate\n * @throws Error if name is invalid\n */\nexport function validateSkillName(name: string): void {\n if (!name || typeof name !== \"string\") {\n throw new Error(\"Skill name is required and must be a string\");\n }\n\n if (name.length < MIN_LENGTH || name.length > MAX_LENGTH) {\n throw new Error(\n `Skill name must be between ${MIN_LENGTH} and ${MAX_LENGTH} characters`\n );\n }\n\n if (!SKILL_NAME_REGEX.test(name)) {\n throw new Error(\n \"Skill name must be lowercase alphanumeric with single hyphen separators, \" +\n \"not start or end with -, and not contain consecutive --. \" +\n \"Pattern: ^[a-z0-9]+(-[a-z0-9]+)*$\"\n );\n }\n}\n","/**\n * InMemoryWorkspaceStore\n *\n * In-memory implementation of WorkspaceStore\n * Provides CRUD operations for workspace data stored in memory\n */\n\nimport type {\n WorkspaceStore,\n Workspace,\n CreateWorkspaceRequest,\n UpdateWorkspaceRequest,\n} from \"@axiom-lattice/protocols\";\n\nexport class InMemoryWorkspaceStore implements WorkspaceStore {\n private workspaces: Map<string, Workspace> = new Map();\n\n constructor() {\n this.initDefaultData();\n }\n\n private initDefaultData() {\n const defaultTenantId = \"default\";\n const now = new Date();\n \n // Add default workspace\n const defaultWorkspace: Workspace = {\n id: \"default-workspace\",\n tenantId: defaultTenantId,\n name: \"默认工作区\",\n description: \"系统默认工作区\",\n storageType: \"sandbox\",\n createdAt: now,\n updatedAt: now,\n };\n this.workspaces.set(`${defaultTenantId}:default-workspace`, defaultWorkspace);\n }\n\n private getKey(tenantId: string, id: string): string {\n return `${tenantId}:${id}`;\n }\n\n async getAllWorkspaces(tenantId: string): Promise<Workspace[]> {\n return Array.from(this.workspaces.values()).filter(\n (w) => w.tenantId === tenantId\n );\n }\n\n async getWorkspaceById(tenantId: string, id: string): Promise<Workspace | null> {\n const key = this.getKey(tenantId, id);\n return this.workspaces.get(key) || null;\n }\n\n async createWorkspace(\n tenantId: string,\n id: string,\n data: CreateWorkspaceRequest\n ): Promise<Workspace> {\n const now = new Date();\n const workspace: Workspace = {\n id,\n tenantId,\n name: data.name,\n description: data.description,\n storageType: data.storageType,\n createdAt: now,\n updatedAt: now,\n };\n const key = this.getKey(tenantId, id);\n this.workspaces.set(key, workspace);\n return workspace;\n }\n\n async updateWorkspace(\n tenantId: string,\n id: string,\n updates: UpdateWorkspaceRequest\n ): Promise<Workspace | null> {\n const key = this.getKey(tenantId, id);\n const existing = this.workspaces.get(key);\n if (!existing) {\n return null;\n }\n\n const updated: Workspace = {\n ...existing,\n ...updates,\n updatedAt: new Date(),\n };\n this.workspaces.set(key, updated);\n return updated;\n }\n\n async deleteWorkspace(tenantId: string, id: string): Promise<boolean> {\n const key = this.getKey(tenantId, id);\n return this.workspaces.delete(key);\n }\n\n clear(): void {\n this.workspaces.clear();\n }\n}\n","/**\n * InMemoryProjectStore\n *\n * In-memory implementation of ProjectStore\n * Provides CRUD operations for project data stored in memory\n */\n\nimport type {\n ProjectStore,\n Project,\n CreateProjectRequest,\n UpdateProjectRequest,\n} from \"@axiom-lattice/protocols\";\n\nexport class InMemoryProjectStore implements ProjectStore {\n private projects: Map<string, Project> = new Map();\n\n constructor() {\n this.initDefaultData();\n }\n\n private initDefaultData() {\n const defaultTenantId = \"default\";\n const defaultWorkspaceId = \"default-workspace\";\n const now = new Date();\n \n // Add default project\n const defaultProject: Project = {\n id: \"default-project\",\n tenantId: defaultTenantId,\n workspaceId: defaultWorkspaceId,\n name: \"默认项目\",\n description: \"系统默认项目\",\n createdAt: now,\n updatedAt: now,\n };\n this.projects.set(`${defaultTenantId}:default-project`, defaultProject);\n }\n\n private getKey(tenantId: string, id: string): string {\n return `${tenantId}:${id}`;\n }\n\n async getProjectsByWorkspace(tenantId: string, workspaceId: string): Promise<Project[]> {\n return Array.from(this.projects.values()).filter(\n (p) => p.tenantId === tenantId && p.workspaceId === workspaceId\n );\n }\n\n async getProjectById(tenantId: string, id: string): Promise<Project | null> {\n const key = this.getKey(tenantId, id);\n return this.projects.get(key) || null;\n }\n\n async createProject(\n tenantId: string,\n workspaceId: string,\n id: string,\n data: CreateProjectRequest\n ): Promise<Project> {\n const now = new Date();\n const project: Project = {\n id,\n tenantId,\n workspaceId,\n name: data.name,\n description: data.description,\n createdAt: now,\n updatedAt: now,\n };\n const key = this.getKey(tenantId, id);\n this.projects.set(key, project);\n return project;\n }\n\n async updateProject(\n tenantId: string,\n id: string,\n updates: UpdateProjectRequest\n ): Promise<Project | null> {\n const key = this.getKey(tenantId, id);\n const existing = this.projects.get(key);\n if (!existing) {\n return null;\n }\n\n const updated: Project = {\n ...existing,\n ...updates,\n updatedAt: new Date(),\n };\n this.projects.set(key, updated);\n return updated;\n }\n\n async deleteProject(tenantId: string, id: string): Promise<boolean> {\n const key = this.getKey(tenantId, id);\n return this.projects.delete(key);\n }\n\n clear(): void {\n this.projects.clear();\n }\n}\n","/**\n * InMemoryDatabaseConfigStore\n *\n * In-memory implementation of DatabaseConfigStore\n * Provides CRUD operations for database configuration data stored in memory\n * \n * Note: This implementation does NOT encrypt passwords - use with caution\n * For production use, prefer PostgreSQLDatabaseConfigStore\n */\n\nimport type {\n DatabaseConfigStore,\n DatabaseConfigEntry,\n CreateDatabaseConfigRequest,\n UpdateDatabaseConfigRequest,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * In-memory implementation of DatabaseConfigStore\n */\nexport class InMemoryDatabaseConfigStore implements DatabaseConfigStore {\n private configs: Map<string, DatabaseConfigEntry> = new Map();\n\n /**\n * Get composite key for storage\n */\n private getKey(tenantId: string, id: string): string {\n return `${tenantId}:${id}`;\n }\n\n /**\n * Get all database configurations for a tenant\n */\n async getAllConfigs(tenantId: string): Promise<DatabaseConfigEntry[]> {\n return Array.from(this.configs.values()).filter(\n (config) => config.tenantId === tenantId\n );\n }\n\n /**\n * Get all database configurations across all tenants\n */\n async getAllConfigsWithoutTenant(): Promise<DatabaseConfigEntry[]> {\n return Array.from(this.configs.values());\n }\n\n /**\n * Get database configuration by ID\n */\n async getConfigById(tenantId: string, id: string): Promise<DatabaseConfigEntry | null> {\n const key = this.getKey(tenantId, id);\n return this.configs.get(key) || null;\n }\n\n /**\n * Get database configuration by business key\n */\n async getConfigByKey(tenantId: string, key: string): Promise<DatabaseConfigEntry | null> {\n const configs = await this.getAllConfigs(tenantId);\n return configs.find((config) => config.key === key) || null;\n }\n\n /**\n * Create a new database configuration\n */\n async createConfig(\n tenantId: string,\n id: string,\n data: CreateDatabaseConfigRequest\n ): Promise<DatabaseConfigEntry> {\n const now = new Date();\n const entry: DatabaseConfigEntry = {\n id,\n tenantId,\n key: data.key,\n config: data.config,\n name: data.name,\n description: data.description,\n createdAt: now,\n updatedAt: now,\n };\n\n const storageKey = this.getKey(tenantId, id);\n this.configs.set(storageKey, entry);\n return entry;\n }\n\n /**\n * Update an existing database configuration\n */\n async updateConfig(\n tenantId: string,\n id: string,\n updates: Partial<UpdateDatabaseConfigRequest>\n ): Promise<DatabaseConfigEntry | null> {\n const key = this.getKey(tenantId, id);\n const existing = this.configs.get(key);\n if (!existing) {\n return null;\n }\n\n const updated: DatabaseConfigEntry = {\n ...existing,\n ...updates,\n config: updates.config ? { ...existing.config, ...updates.config } : existing.config,\n key: updates.key || existing.key,\n name: updates.name !== undefined ? updates.name : existing.name,\n description: updates.description !== undefined ? updates.description : existing.description,\n updatedAt: new Date(),\n };\n\n this.configs.set(key, updated);\n return updated;\n }\n\n /**\n * Delete a database configuration by ID\n */\n async deleteConfig(tenantId: string, id: string): Promise<boolean> {\n const key = this.getKey(tenantId, id);\n return this.configs.delete(key);\n }\n\n /**\n * Check if configuration exists\n */\n async hasConfig(tenantId: string, id: string): Promise<boolean> {\n const key = this.getKey(tenantId, id);\n return this.configs.has(key);\n }\n\n /**\n * Clear all configurations (useful for testing)\n */\n clear(): void {\n this.configs.clear();\n }\n\n /**\n * Clear configurations for a specific tenant\n */\n clearByTenant(tenantId: string): void {\n for (const key of this.configs.keys()) {\n if (key.startsWith(`${tenantId}:`)) {\n this.configs.delete(key);\n }\n }\n }\n}\n","/**\n * InMemoryMetricsServerConfigStore\n *\n * In-memory implementation of MetricsServerConfigStore\n * Provides CRUD operations for metrics server configuration data stored in memory\n */\n\nimport type {\n MetricsServerConfigStore,\n MetricsServerConfigEntry,\n CreateMetricsServerConfigRequest,\n UpdateMetricsServerConfigRequest,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * In-memory implementation of MetricsServerConfigStore\n */\nexport class InMemoryMetricsServerConfigStore implements MetricsServerConfigStore {\n private configs: Map<string, MetricsServerConfigEntry> = new Map();\n\n /**\n * Get composite key for storage\n */\n private getKey(tenantId: string, id: string): string {\n return `${tenantId}:${id}`;\n }\n\n /**\n * Get all metrics server configurations for a tenant\n */\n async getAllConfigs(tenantId: string): Promise<MetricsServerConfigEntry[]> {\n return Array.from(this.configs.values()).filter(\n (config) => config.tenantId === tenantId\n );\n }\n\n /**\n * Get all metrics server configurations across all tenants\n */\n async getAllConfigsWithoutTenant(): Promise<MetricsServerConfigEntry[]> {\n return Array.from(this.configs.values());\n }\n\n /**\n * Get metrics server configuration by ID\n */\n async getConfigById(tenantId: string, id: string): Promise<MetricsServerConfigEntry | null> {\n const key = this.getKey(tenantId, id);\n return this.configs.get(key) || null;\n }\n\n /**\n * Get metrics server configuration by business key\n */\n async getConfigByKey(tenantId: string, key: string): Promise<MetricsServerConfigEntry | null> {\n const configs = await this.getAllConfigs(tenantId);\n return configs.find((config) => config.key === key) || null;\n }\n\n /**\n * Create a new metrics server configuration\n */\n async createConfig(\n tenantId: string,\n id: string,\n data: CreateMetricsServerConfigRequest\n ): Promise<MetricsServerConfigEntry> {\n const now = new Date();\n const entry: MetricsServerConfigEntry = {\n id,\n tenantId,\n key: data.key,\n config: data.config,\n name: data.name,\n description: data.description,\n createdAt: now,\n updatedAt: now,\n };\n\n const storageKey = this.getKey(tenantId, id);\n this.configs.set(storageKey, entry);\n return entry;\n }\n\n /**\n * Update an existing metrics server configuration\n */\n async updateConfig(\n tenantId: string,\n id: string,\n updates: Partial<UpdateMetricsServerConfigRequest>\n ): Promise<MetricsServerConfigEntry | null> {\n const key = this.getKey(tenantId, id);\n const existing = this.configs.get(key);\n if (!existing) {\n return null;\n }\n\n const updated: MetricsServerConfigEntry = {\n ...existing,\n ...updates,\n config: updates.config ? { ...existing.config, ...updates.config } : existing.config,\n key: updates.key || existing.key,\n name: updates.name !== undefined ? updates.name : existing.name,\n description: updates.description !== undefined ? updates.description : existing.description,\n updatedAt: new Date(),\n };\n\n this.configs.set(key, updated);\n return updated;\n }\n\n /**\n * Delete a metrics server configuration by ID\n */\n async deleteConfig(tenantId: string, id: string): Promise<boolean> {\n const key = this.getKey(tenantId, id);\n return this.configs.delete(key);\n }\n\n /**\n * Check if configuration exists\n */\n async hasConfig(tenantId: string, id: string): Promise<boolean> {\n const key = this.getKey(tenantId, id);\n return this.configs.has(key);\n }\n\n /**\n * Clear all configurations (useful for testing)\n */\n clear(): void {\n this.configs.clear();\n }\n\n /**\n * Clear configurations for a specific tenant\n */\n clearByTenant(tenantId: string): void {\n for (const key of this.configs.keys()) {\n if (key.startsWith(`${tenantId}:`)) {\n this.configs.delete(key);\n }\n }\n }\n}\n","import type {\n UserStore,\n User,\n CreateUserRequest,\n UpdateUserRequest,\n} from \"@axiom-lattice/protocols\";\n\nexport class InMemoryUserStore implements UserStore {\n private users: Map<string, User> = new Map();\n\n constructor() {}\n\n async getAllUsers(): Promise<User[]> {\n return Array.from(this.users.values());\n }\n\n async getUserById(id: string): Promise<User | null> {\n return this.users.get(id) || null;\n }\n\n async getUserByEmail(email: string): Promise<User | null> {\n for (const user of this.users.values()) {\n if (user.email === email) {\n return user;\n }\n }\n return null;\n }\n\n async createUser(id: string, data: CreateUserRequest): Promise<User> {\n const now = new Date();\n const user: User = {\n id,\n email: data.email,\n name: data.name,\n status: data.status || \"pending\",\n metadata: data.metadata ?? {},\n createdAt: now,\n updatedAt: now,\n };\n this.users.set(id, user);\n return user;\n }\n\n async updateUser(id: string, updates: UpdateUserRequest): Promise<User | null> {\n const existing = this.users.get(id);\n if (!existing) {\n return null;\n }\n\n const updated: User = {\n ...existing,\n ...updates,\n metadata: updates.metadata ?? existing.metadata,\n updatedAt: new Date(),\n };\n this.users.set(id, updated);\n return updated;\n }\n\n async deleteUser(id: string): Promise<boolean> {\n return this.users.delete(id);\n }\n\n clear(): void {\n this.users.clear();\n }\n}\n","/**\n * InMemoryTenantStore\n *\n * In-memory implementation of TenantStore\n * Provides CRUD operations for tenant data stored in memory\n * Tenant is a top-level entity with single key storage\n */\n\nimport type {\n TenantStore,\n Tenant,\n TenantStatus,\n CreateTenantRequest,\n UpdateTenantRequest,\n} from \"@axiom-lattice/protocols\";\n\nexport class InMemoryTenantStore implements TenantStore {\n private tenants: Map<string, Tenant>;\n\n constructor() {\n this.tenants = new Map();\n this.initDefaultData();\n }\n\n private initDefaultData(): void {\n // Create default tenant for single-tenant setups\n const defaultTenant: Tenant = {\n id: \"default\",\n name: \"Default Tenant\",\n description: \"Default tenant for single-tenant setups\",\n status: \"active\" as TenantStatus,\n metadata: {},\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n this.tenants.set(\"default\", defaultTenant);\n }\n\n async getAllTenants(): Promise<Tenant[]> {\n return Array.from(this.tenants.values());\n }\n\n async getTenantById(id: string): Promise<Tenant | null> {\n return this.tenants.get(id) || null;\n }\n\n async createTenant(id: string, data: CreateTenantRequest): Promise<Tenant> {\n const now = new Date();\n const tenant: Tenant = {\n id,\n name: data.name,\n description: data.description,\n status: data.status || (\"active\" as TenantStatus),\n metadata: data.metadata || {},\n createdAt: now,\n updatedAt: now,\n };\n this.tenants.set(id, tenant);\n return tenant;\n }\n\n async updateTenant(\n id: string,\n updates: UpdateTenantRequest\n ): Promise<Tenant | null> {\n const existing = this.tenants.get(id);\n if (!existing) {\n return null;\n }\n\n const updated: Tenant = {\n ...existing,\n ...updates,\n updatedAt: new Date(),\n };\n this.tenants.set(id, updated);\n return updated;\n }\n\n async deleteTenant(id: string): Promise<boolean> {\n return this.tenants.delete(id);\n }\n\n clear(): void {\n this.tenants.clear();\n this.initDefaultData(); // Re-initialize default tenant\n }\n}\n","import type {\n UserTenantLinkStore,\n UserTenantLink,\n CreateUserTenantLinkRequest,\n UpdateUserTenantLinkRequest,\n} from \"@axiom-lattice/protocols\";\n\nexport class InMemoryUserTenantLinkStore implements UserTenantLinkStore {\n private links: Map<string, UserTenantLink> = new Map();\n\n private getKey(userId: string, tenantId: string): string {\n return `${userId}:${tenantId}`;\n }\n\n async getTenantsByUser(userId: string): Promise<UserTenantLink[]> {\n return Array.from(this.links.values()).filter(\n (link) => link.userId === userId\n );\n }\n\n async getUsersByTenant(tenantId: string): Promise<UserTenantLink[]> {\n return Array.from(this.links.values()).filter(\n (link) => link.tenantId === tenantId\n );\n }\n\n async getLink(userId: string, tenantId: string): Promise<UserTenantLink | null> {\n const key = this.getKey(userId, tenantId);\n return this.links.get(key) || null;\n }\n\n async createLink(data: CreateUserTenantLinkRequest): Promise<UserTenantLink> {\n const link: UserTenantLink = {\n userId: data.userId,\n tenantId: data.tenantId,\n role: data.role || \"member\",\n joinedAt: new Date(),\n metadata: data.metadata ?? {},\n };\n const key = this.getKey(data.userId, data.tenantId);\n this.links.set(key, link);\n return link;\n }\n\n async updateLink(\n userId: string,\n tenantId: string,\n updates: UpdateUserTenantLinkRequest\n ): Promise<UserTenantLink | null> {\n const key = this.getKey(userId, tenantId);\n const existing = this.links.get(key);\n if (!existing) return null;\n\n const updated: UserTenantLink = {\n ...existing,\n ...updates,\n metadata: updates.metadata ?? existing.metadata,\n };\n this.links.set(key, updated);\n return updated;\n }\n\n async deleteLink(userId: string, tenantId: string): Promise<boolean> {\n const key = this.getKey(userId, tenantId);\n return this.links.delete(key);\n }\n\n async hasLink(userId: string, tenantId: string): Promise<boolean> {\n const key = this.getKey(userId, tenantId);\n return this.links.has(key);\n }\n\n clear(): void {\n this.links.clear();\n }\n}\n","/**\n * StoreLatticeManager\n *\n * Store Lattice manager for registering and managing store services\n */\n\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport type {\n ThreadStore,\n AssistantStore,\n SkillStore,\n WorkspaceStore,\n ProjectStore,\n DatabaseConfigStore,\n MetricsServerConfigStore,\n UserStore,\n TenantStore,\n UserTenantLinkStore,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * Store type to store interface mapping\n * Maps store type strings to their corresponding interface types\n */\nexport type StoreTypeMap = {\n thread: ThreadStore;\n assistant: AssistantStore;\n skill: SkillStore;\n workspace: WorkspaceStore;\n project: ProjectStore;\n database: DatabaseConfigStore;\n metrics: MetricsServerConfigStore;\n user: UserStore;\n tenant: TenantStore;\n userTenantLink: UserTenantLinkStore;\n};\n\n/**\n * Store type keys\n */\nexport type StoreType = keyof StoreTypeMap;\n\n/**\n * Store Lattice interface with type safety\n * @template TStoreType - The type of store (e.g., \"thread\")\n */\nexport interface StoreLattice<TStoreType extends StoreType = StoreType> {\n type: TStoreType;\n key: string;\n store: StoreTypeMap[TStoreType];\n}\n\n/**\n * StoreLatticeManager - Singleton store Lattice manager\n * Responsible for registering and managing various store service Lattices\n */\nexport class StoreLatticeManager extends BaseLatticeManager<\n StoreLattice<StoreType>\n> {\n private static _instance: StoreLatticeManager;\n\n /**\n * Get StoreLatticeManager singleton instance\n */\n public static getInstance(): StoreLatticeManager {\n if (!StoreLatticeManager._instance) {\n StoreLatticeManager._instance = new StoreLatticeManager();\n }\n return StoreLatticeManager._instance;\n }\n\n /**\n * Get Lattice type prefix\n */\n protected getLatticeType(): string {\n return \"stores\";\n }\n\n /**\n * Generate composite key from key and type\n * @param key Lattice key name\n * @param type Store type\n * @returns Composite key string\n */\n private getCompositeKey(key: string, type: StoreType): string {\n return `${key}:${type}`;\n }\n\n /**\n * Register store Lattice with type safety\n * Uses composite key (key + type) as unique identifier\n * @param key Lattice key name\n * @param type Store type (e.g., \"thread\")\n * @param store Store implementation instance matching the type\n */\n public registerLattice<TStoreType extends StoreType>(\n key: string,\n type: TStoreType,\n store: StoreTypeMap[TStoreType]\n ): void {\n // Create store Lattice object\n const storeLattice: StoreLattice<TStoreType> = {\n key,\n type,\n store,\n };\n\n // Use composite key (key + type) for registration\n const compositeKey = this.getCompositeKey(key, type);\n this.register(compositeKey, storeLattice as StoreLattice<StoreType>);\n }\n\n /**\n * Get StoreLattice with type safety\n * Uses composite key (key + type) to retrieve the store\n * @param key Lattice key name\n * @param type Expected store type for type checking\n * @returns StoreLattice with typed store\n */\n public getStoreLattice<TStoreType extends StoreType>(\n key: string,\n type: TStoreType\n ): StoreLattice<TStoreType> {\n const compositeKey = this.getCompositeKey(key, type);\n const storeLattice = this.get(compositeKey);\n if (!storeLattice) {\n throw new Error(`StoreLattice ${key}:${type} not found`);\n }\n\n if (storeLattice.type !== type) {\n throw new Error(\n `StoreLattice ${key}:${type} has type \"${storeLattice.type}\", expected \"${type}\"`\n );\n }\n\n return storeLattice as StoreLattice<TStoreType>;\n }\n\n /**\n * Get StoreLattice without type checking (for backward compatibility)\n * @param key Lattice key name\n * @param type Store type\n * @returns StoreLattice (type may be unknown)\n */\n public getStoreLatticeUnsafe(\n key: string,\n type: StoreType\n ): StoreLattice<StoreType> {\n const compositeKey = this.getCompositeKey(key, type);\n const storeLattice = this.get(compositeKey);\n if (!storeLattice) {\n throw new Error(`StoreLattice ${key}:${type} not found`);\n }\n return storeLattice;\n }\n\n /**\n * Get all Lattices\n */\n public getAllLattices(): StoreLattice<StoreType>[] {\n return this.getAll();\n }\n\n /**\n * Check if Lattice exists\n * Uses composite key (key + type) to check existence\n * @param key Lattice key name\n * @param type Store type\n */\n public hasLattice(key: string, type: StoreType): boolean {\n const compositeKey = this.getCompositeKey(key, type);\n return this.has(compositeKey);\n }\n\n /**\n * Remove Lattice\n * Uses composite key (key + type) to remove the store\n * @param key Lattice key name\n * @param type Store type\n */\n public removeLattice(key: string, type: StoreType): boolean {\n const compositeKey = this.getCompositeKey(key, type);\n return this.remove(compositeKey);\n }\n\n /**\n * Clear all Lattices\n */\n public clearLattices(): void {\n this.clear();\n }\n\n /**\n * Get Lattice count\n */\n public getLatticeCount(): number {\n return this.count();\n }\n\n /**\n * Get Lattice key list\n */\n public getLatticeKeys(): string[] {\n return this.keys();\n }\n}\n\n// Export singleton instance\nexport const storeLatticeManager = StoreLatticeManager.getInstance();\n\n// Export convenience methods with type safety\nexport const registerStoreLattice = <TStoreType extends StoreType>(\n key: string,\n type: TStoreType,\n store: StoreTypeMap[TStoreType]\n) => storeLatticeManager.registerLattice(key, type, store);\n\nexport const getStoreLattice = <TStoreType extends StoreType>(\n key: string,\n type: TStoreType\n) => storeLatticeManager.getStoreLattice(key, type);\n\n// Default registration of InMemory stores\nimport { InMemoryThreadStore } from \"./InMemoryThreadStore\";\nimport { InMemoryAssistantStore } from \"./InMemoryAssistantStore\";\nimport { FileSystemSkillStore } from \"./FileSystemSkillStore\";\nimport { InMemoryWorkspaceStore } from \"./InMemoryWorkspaceStore\";\nimport { InMemoryProjectStore } from \"./InMemoryProjectStore\";\nimport { InMemoryDatabaseConfigStore } from \"./InMemoryDatabaseConfigStore\";\nimport { InMemoryMetricsServerConfigStore } from \"./InMemoryMetricsServerConfigStore\";\n\n// Create default instances\nconst defaultThreadStore = new InMemoryThreadStore();\nconst defaultAssistantStore = new InMemoryAssistantStore();\nconst defaultSkillStore = new FileSystemSkillStore();\nconst defaultWorkspaceStore = new InMemoryWorkspaceStore();\nconst defaultProjectStore = new InMemoryProjectStore();\nconst defaultDatabaseConfigStore = new InMemoryDatabaseConfigStore();\nconst defaultMetricsServerConfigStore = new InMemoryMetricsServerConfigStore();\n\n// Register as default stores\nstoreLatticeManager.registerLattice(\"default\", \"thread\", defaultThreadStore);\nstoreLatticeManager.registerLattice(\n \"default\",\n \"assistant\",\n defaultAssistantStore\n);\nstoreLatticeManager.registerLattice(\"default\", \"skill\", defaultSkillStore);\nstoreLatticeManager.registerLattice(\"default\", \"workspace\", defaultWorkspaceStore);\nstoreLatticeManager.registerLattice(\"default\", \"project\", defaultProjectStore);\nstoreLatticeManager.registerLattice(\"default\", \"database\", defaultDatabaseConfigStore);\nstoreLatticeManager.registerLattice(\"default\", \"metrics\", defaultMetricsServerConfigStore);\n\n// Default registration of user/tenant stores\nimport { InMemoryUserStore } from \"./InMemoryUserStore\";\nimport { InMemoryTenantStore } from \"./InMemoryTenantStore\";\nimport { InMemoryUserTenantLinkStore } from \"./InMemoryUserTenantLinkStore\";\n\nconst defaultUserStore = new InMemoryUserStore();\nconst defaultTenantStore = new InMemoryTenantStore();\nconst defaultUserTenantLinkStore = new InMemoryUserTenantLinkStore();\n\nstoreLatticeManager.registerLattice(\"default\", \"user\", defaultUserStore);\nstoreLatticeManager.registerLattice(\"default\", \"tenant\", defaultTenantStore);\nstoreLatticeManager.registerLattice(\"default\", \"userTenantLink\", defaultUserTenantLinkStore);\n","/**\n * Load Skills Tool\n * Loads available skills and returns their metadata\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getStoreLattice } from \"../../store_lattice/StoreLatticeManager\";\n\nconst LOAD_SKILLS_DESCRIPTION = `Load all available skills and return their metadata (name, description, license, compatibility, metadata, and subSkills) without the content. This tool returns skill information including hierarchical relationships (subSkills). Use this to discover what skills are available and their structure.`;\n\nexport interface CreateLoadSkillsToolParams {\n skills?: string[];\n}\n\nexport const createLoadSkillsTool = ({ skills }: CreateLoadSkillsToolParams = {}) => {\n return tool(\n async (_input: Record<string, never>, _exe_config: any) => {\n try {\n const storeLattice = getStoreLattice(\"default\", \"skill\");\n const skillStore = storeLattice.store;\n const allSkills = await skillStore.getAllSkills();\n\n const filteredSkills = skills && skills.length > 0\n ? allSkills.filter((skill) => skills.includes(skill.id))\n : allSkills;\n\n const skillsMeta = filteredSkills.map((skill) => ({\n id: skill.id,\n name: skill.name,\n description: skill.description,\n license: skill.license,\n compatibility: skill.compatibility,\n metadata: skill.metadata,\n subSkills: skill.subSkills,\n }));\n\n return JSON.stringify(skillsMeta, null, 2);\n } catch (error) {\n return `Error loading skills: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"load_skills\",\n description: LOAD_SKILLS_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Load Skill Content Tool\n * Loads a specific skill's content by name and returns its full content\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getStoreLattice } from \"../../store_lattice/StoreLatticeManager\";\n\nconst LOAD_SKILL_CONTENT_DESCRIPTION = `Load a specific skill's content by name and return its full content including markdown body. This tool returns the complete skill content including frontmatter and markdown body. If the skill has resources, they will be listed at the end of the content with instructions on how to access them. Use this tool to get the complete skill content for a skill that you want to use.`;\n\nexport const createLoadSkillContentTool = () => {\n return tool(\n async (input: { skill_name: string }, _exe_config: any) => {\n try {\n const storeLattice = getStoreLattice(\"default\", \"skill\");\n const skillStore = storeLattice.store;\n const skill = await skillStore.getSkillById(input.skill_name);\n\n if (!skill) {\n const allSkills = await skillStore.getAllSkills();\n const availableSkills = allSkills.map((s) => s.name).join(\", \");\n return `Skill \"${input.skill_name}\" not found. Available skills: ${availableSkills}`;\n }\n\n const frontmatter: string[] = [\"---\"];\n frontmatter.push(`name: ${skill.name}`);\n frontmatter.push(`description: ${skill.description}`);\n if (skill.license) {\n frontmatter.push(`license: ${skill.license}`);\n }\n if (skill.compatibility) {\n frontmatter.push(`compatibility: ${skill.compatibility}`);\n }\n if (skill.metadata && Object.keys(skill.metadata).length > 0) {\n frontmatter.push(\"metadata:\");\n for (const [key, value] of Object.entries(skill.metadata)) {\n frontmatter.push(` ${key}: ${value}`);\n }\n }\n if (skill.subSkills && skill.subSkills.length > 0) {\n frontmatter.push(\"subSkills:\");\n for (const subSkill of skill.subSkills) {\n frontmatter.push(` - ${subSkill}`);\n }\n }\n frontmatter.push(\"---\");\n\n const content = skill.content || \"\";\n let result = `${frontmatter.join(\"\\n\")}\\n${content}`;\n\n // Add resources list if available\n const fsStore = skillStore as { listSkillResources?: (id: string) => Promise<string[]> };\n if (fsStore.listSkillResources) {\n try {\n const resources = await fsStore.listSkillResources(input.skill_name);\n if (resources.length > 0) {\n result += \"\\n\\n---\\n\\n**Resources** (use `load_skill_resource` tool to access):\\n\";\n resources.forEach((resource: string) => {\n result += `- ${resource}\\n`;\n });\n }\n } catch {\n // Ignore errors when listing resources\n }\n }\n\n return result;\n } catch (error) {\n return `Error loading skill content: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"load_skill_content\",\n description: LOAD_SKILL_CONTENT_DESCRIPTION,\n schema: z.object({\n skill_name: z.string().describe(\"The name of the skill to load\"),\n }),\n }\n );\n};\n","/**\n * Load Skill Resource Tool\n * Loads a specific resource file from a skill's resources directory\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getStoreLattice } from \"../../store_lattice/StoreLatticeManager\";\n\nconst LOAD_SKILL_RESOURCE_DESCRIPTION = `Load a specific resource file from a skill's resources directory. Use this tool when you need to access template files, example data, or other resources bundled with a skill. The resource paths are listed in the skill content when using the load_skill_content tool.`;\n\nexport const createLoadSkillResourceTool = () => {\n return tool(\n async (input: { skill_name: string; resource_path: string }, _exe_config: any) => {\n try {\n const storeLattice = getStoreLattice(\"default\", \"skill\");\n const skillStore = storeLattice.store;\n\n // Check if store supports resource loading\n const fsStore = skillStore as { loadSkillResource?: (id: string, path: string) => Promise<string | null> };\n if (!fsStore.loadSkillResource) {\n return `Error: This skill store does not support resource loading.`;\n }\n\n const content = await fsStore.loadSkillResource(input.skill_name, input.resource_path);\n\n if (!content) {\n return `Resource \"${input.resource_path}\" not found for skill \"${input.skill_name}\".`;\n }\n\n return content;\n } catch (error) {\n return `Error loading skill resource: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"load_skill_resource\",\n description: LOAD_SKILL_RESOURCE_DESCRIPTION,\n schema: z.object({\n skill_name: z.string().describe(\"The name of the skill containing the resource\"),\n resource_path: z.string().describe(\"The path to the resource relative to the skill's resources/ directory\"),\n }),\n }\n );\n};\n","/**\n * Middleware for providing filesystem tools to an agent.\n *\n * Provides ls, read_file, write_file, edit_file, glob, and grep tools with support for:\n * - Pluggable backends (StateBackend, StoreBackend, FilesystemBackend, CompositeBackend)\n * - Tool result eviction for large outputs\n */\n\nimport { createMiddleware, tool, ToolMessage } from \"langchain\";\nimport { Command, isCommand, getCurrentTaskInput } from \"@langchain/langgraph\";\nimport { z as z3 } from \"zod/v3\";\nimport { withLangGraph } from \"@langchain/langgraph/zod\";\nimport type {\n BackendProtocol,\n BackendFactory,\n FileData,\n StateAndStore,\n} from \"../backends/protocol.js\";\nimport { StateBackend } from \"../backends/state.js\";\nimport { sanitizeToolCallId } from \"../backends/utils.js\";\n\n/**\n * Zod v3 schema for FileData (re-export from backends)\n */\nconst FileDataSchema = z3.object({\n content: z3.array(z3.string()),\n created_at: z3.string(),\n modified_at: z3.string(),\n});\n\nexport type { FileData };\n\n/**\n * Merge file updates with support for deletions.\n */\nfunction fileDataReducer(\n left: Record<string, FileData> | undefined,\n right: Record<string, FileData | null>\n): Record<string, FileData> {\n if (left === undefined) {\n const result: Record<string, FileData> = {};\n for (const [key, value] of Object.entries(right)) {\n if (value !== null) {\n result[key] = value;\n }\n }\n return result;\n }\n\n const result = { ...left };\n for (const [key, value] of Object.entries(right)) {\n if (value === null) {\n delete result[key];\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\n/**\n * Shared filesystem state schema.\n * Defined at module level to ensure the same object identity is used across all agents,\n * preventing \"Channel already exists with different type\" errors when multiple agents\n * use createFilesystemMiddleware.\n */\nconst FilesystemStateSchema = z3.object({\n files: withLangGraph(\n z3.record(z3.string(), FileDataSchema).default({}) as any,\n {\n reducer: {\n fn: fileDataReducer,\n schema: z3.record(z3.string(), FileDataSchema.nullable()),\n },\n }\n ),\n});\n\n/**\n * Resolve backend from factory or instance.\n *\n * @param backend - Backend instance or factory function\n * @param stateAndStore - State and store container for backend initialization\n */\nasync function getBackend(\n backend: BackendProtocol | BackendFactory,\n stateAndStore: StateAndStore\n): Promise<BackendProtocol> {\n if (typeof backend === \"function\") {\n return await backend(stateAndStore);\n }\n return backend;\n}\n\n// System prompts\nconst FILESYSTEM_SYSTEM_PROMPT = `You have access to a virtual filesystem. All file paths must start with a /.\n\n- ls: list files in a directory (requires absolute path)\n- read_file: read a file from the filesystem\n- write_file: write to a file in the filesystem\n- edit_file: edit a file in the filesystem\n- glob: find files matching a pattern (e.g., \"**/*.py\")\n- grep: search for text within files`;\n\n// Tool descriptions\nexport const LS_TOOL_DESCRIPTION = \"List files and directories in a directory\";\nexport const READ_FILE_TOOL_DESCRIPTION = \"Read the contents of a file\";\nexport const WRITE_FILE_TOOL_DESCRIPTION =\n \"Write content to a new file. Returns an error if the file already exists\";\nexport const EDIT_FILE_TOOL_DESCRIPTION =\n \"Edit a file by replacing a specific string with a new string\";\nexport const GLOB_TOOL_DESCRIPTION =\n \"Find files matching a glob pattern (e.g., '**/*.py' for all Python files)\";\nexport const GREP_TOOL_DESCRIPTION =\n \"Search for a regex pattern in files. Returns matching files and line numbers\";\n\n/**\n * Create ls tool using backend.\n */\nfunction createLsTool(\n backend: BackendProtocol | BackendFactory,\n options: { customDescription: string | undefined }\n) {\n const { customDescription } = options;\n return tool(\n async (input, config) => {\n const { runConfig } = config.configurable as any;\n const stateAndStore: StateAndStore = {\n state: getCurrentTaskInput(config),\n store: (config as any).store,\n ...runConfig,\n };\n const resolvedBackend = await getBackend(backend, stateAndStore);\n const path = input.path || \"/\";\n const infos = await resolvedBackend.lsInfo(path);\n\n if (infos.length === 0) {\n return `No files found in ${path}`;\n }\n\n // Format output\n const lines: string[] = [];\n for (const info of infos) {\n if (info.is_dir) {\n lines.push(`<file>${info.path}</file> (directory)`);\n } else {\n const size = info.size ? ` (${info.size} bytes)` : \"\";\n lines.push(`<file>${info.path}</file>${size}`);\n }\n }\n return lines.join(\"\\n\");\n },\n {\n name: \"ls\",\n description: customDescription || LS_TOOL_DESCRIPTION,\n schema: z3.object({\n path: z3\n .string()\n .optional()\n .default(\"/\")\n .describe(\"Directory path to list (default: /)\"),\n }),\n }\n );\n}\n\n/**\n * Create read_file tool using backend.\n */\nfunction createReadFileTool(\n backend: BackendProtocol | BackendFactory,\n options: { customDescription: string | undefined }\n) {\n const { customDescription } = options;\n return tool(\n async (input, config) => {\n const { runConfig } = config.configurable as any;\n\n const stateAndStore: StateAndStore = {\n state: getCurrentTaskInput(config),\n store: (config as any).store,\n ...runConfig,\n };\n const resolvedBackend = await getBackend(backend, stateAndStore);\n const { file_path, offset = 0, limit = 2000 } = input;\n return await resolvedBackend.read(file_path, offset, limit);\n },\n {\n name: \"read_file\",\n description: customDescription || READ_FILE_TOOL_DESCRIPTION,\n schema: z3.object({\n file_path: z3.string().describe(\"Absolute path to the file to read\"),\n offset: z3\n .number({ coerce: true })\n .optional()\n .default(0)\n .describe(\"Line offset to start reading from (0-indexed)\"),\n limit: z3\n .number({ coerce: true })\n .optional()\n .default(2000)\n .describe(\"Maximum number of lines to read\"),\n }),\n }\n );\n}\n\n/**\n * Create write_file tool using backend.\n */\nfunction createWriteFileTool(\n backend: BackendProtocol | BackendFactory,\n options: { customDescription: string | undefined }\n) {\n const { customDescription } = options;\n return tool(\n async (input, config) => {\n const { runConfig } = config.configurable as any;\n const stateAndStore: StateAndStore = {\n state: getCurrentTaskInput(config),\n store: (config as any).store,\n ...runConfig,\n };\n const resolvedBackend = await getBackend(backend, stateAndStore);\n const { file_path, content } = input;\n const result = await resolvedBackend.write(file_path, content);\n\n if (result.error) {\n return result.error;\n }\n\n // If filesUpdate is present, return Command to update state\n const message = new ToolMessage({\n content: `Successfully wrote to '${file_path}'`,\n tool_call_id: config.toolCall?.id as string,\n name: \"write_file\",\n metadata: result.metadata,\n });\n\n if (result.filesUpdate) {\n return new Command({\n update: { files: result.filesUpdate, messages: [message] },\n });\n }\n\n return message;\n },\n {\n name: \"write_file\",\n description: customDescription || WRITE_FILE_TOOL_DESCRIPTION,\n schema: z3.object({\n file_path: z3.string().describe(\"Absolute path to the file to write\"),\n content: z3.string().describe(\"Content to write to the file\"),\n }),\n }\n );\n}\n\n/**\n * Create edit_file tool using backend.\n */\nfunction createEditFileTool(\n backend: BackendProtocol | BackendFactory,\n options: { customDescription: string | undefined }\n) {\n const { customDescription } = options;\n return tool(\n async (input, config) => {\n const { runConfig } = config.configurable as any;\n const stateAndStore: StateAndStore = {\n state: getCurrentTaskInput(config),\n store: (config as any).store,\n ...runConfig,\n };\n const resolvedBackend = await getBackend(backend, stateAndStore);\n const { file_path, old_string, new_string, replace_all = false } = input;\n const result = await resolvedBackend.edit(\n file_path,\n old_string,\n new_string,\n replace_all\n );\n\n if (result.error) {\n return result.error;\n }\n\n const message = new ToolMessage({\n content: `Successfully replaced ${result.occurrences} occurrence(s) in '${file_path}'`,\n tool_call_id: config.toolCall?.id as string,\n name: \"edit_file\",\n metadata: result.metadata,\n });\n\n // If filesUpdate is present, return Command to update state\n if (result.filesUpdate) {\n return new Command({\n update: { files: result.filesUpdate, messages: [message] },\n });\n }\n\n // External storage (filesUpdate is null)\n return message;\n },\n {\n name: \"edit_file\",\n description: customDescription || EDIT_FILE_TOOL_DESCRIPTION,\n schema: z3.object({\n file_path: z3.string().describe(\"Absolute path to the file to edit\"),\n old_string: z3\n .string()\n .describe(\"String to be replaced (must match exactly)\"),\n new_string: z3.string().describe(\"String to replace with\"),\n replace_all: z3\n .boolean()\n .optional()\n .default(false)\n .describe(\"Whether to replace all occurrences\"),\n }),\n }\n );\n}\n\n/**\n * Create glob tool using backend.\n */\nfunction createGlobTool(\n backend: BackendProtocol | BackendFactory,\n options: { customDescription: string | undefined }\n) {\n const { customDescription } = options;\n return tool(\n async (input, config) => {\n const { runConfig } = config.configurable as any;\n const stateAndStore: StateAndStore = {\n state: getCurrentTaskInput(config),\n store: (config as any).store,\n ...runConfig,\n };\n const resolvedBackend = await getBackend(backend, stateAndStore);\n const { pattern, path = \"/\" } = input;\n const infos = await resolvedBackend.globInfo(pattern, path);\n\n if (infos.length === 0) {\n return `No files found matching pattern '${pattern}'`;\n }\n\n return infos.map((info) => info.path).join(\"\\n\");\n },\n {\n name: \"glob\",\n description: customDescription || GLOB_TOOL_DESCRIPTION,\n schema: z3.object({\n pattern: z3.string().describe(\"Glob pattern (e.g., '*.py', '**/*.ts')\"),\n path: z3\n .string()\n .optional()\n .default(\"/\")\n .describe(\"Base path to search from (default: /)\"),\n }),\n }\n );\n}\n\n/**\n * Create grep tool using backend.\n */\nfunction createGrepTool(\n backend: BackendProtocol | BackendFactory,\n options: { customDescription: string | undefined }\n) {\n const { customDescription } = options;\n return tool(\n async (input, config) => {\n const { runConfig } = config.configurable as any;\n const stateAndStore: StateAndStore = {\n state: getCurrentTaskInput(config),\n store: (config as any).store,\n ...runConfig,\n };\n const resolvedBackend = await getBackend(backend, stateAndStore);\n const { pattern, path = \"/\", glob = null } = input;\n const result = await resolvedBackend.grepRaw(pattern, path, glob);\n\n // If string, it's an error\n if (typeof result === \"string\") {\n return result;\n }\n\n if (result.length === 0) {\n return `No matches found for pattern '${pattern}'`;\n }\n\n // Format output: group by file\n const lines: string[] = [];\n let currentFile: string | null = null;\n for (const match of result) {\n if (match.path !== currentFile) {\n currentFile = match.path;\n lines.push(`\\n${currentFile}:`);\n }\n lines.push(` ${match.line}: ${match.text}`);\n }\n\n return lines.join(\"\\n\");\n },\n {\n name: \"grep\",\n description: customDescription || GREP_TOOL_DESCRIPTION,\n schema: z3.object({\n pattern: z3.string().describe(\"Regex pattern to search for\"),\n path: z3\n .string()\n .optional()\n .default(\"/\")\n .describe(\"Base path to search from (default: /)\"),\n glob: z3\n .string()\n .optional()\n .nullable()\n .describe(\"Optional glob pattern to filter files (e.g., '*.py')\"),\n }),\n }\n );\n}\n\n/**\n * Options for creating filesystem middleware.\n */\nexport interface FilesystemMiddlewareOptions {\n /** Backend instance or factory (default: StateBackend) */\n backend?: BackendProtocol | BackendFactory;\n /** Optional custom system prompt override */\n systemPrompt?: string | null;\n /** Optional custom tool descriptions override */\n customToolDescriptions?: Record<string, string> | null;\n /** Optional token limit before evicting a tool result to the filesystem (default: 20000 tokens, ~80KB) */\n toolTokenLimitBeforeEvict?: number | null;\n}\n\n/**\n * Create filesystem middleware with all tools and features.\n */\nexport function createFilesystemMiddleware(\n options: FilesystemMiddlewareOptions = {}\n) {\n const {\n backend = async (stateAndStore: StateAndStore) => new StateBackend(stateAndStore),\n systemPrompt: customSystemPrompt = null,\n customToolDescriptions = null,\n toolTokenLimitBeforeEvict = 20000,\n } = options;\n\n const systemPrompt = customSystemPrompt || FILESYSTEM_SYSTEM_PROMPT;\n\n const tools = [\n createLsTool(backend, {\n customDescription: customToolDescriptions?.ls,\n }),\n createReadFileTool(backend, {\n customDescription: customToolDescriptions?.read_file,\n }),\n createWriteFileTool(backend, {\n customDescription: customToolDescriptions?.write_file,\n }),\n createEditFileTool(backend, {\n customDescription: customToolDescriptions?.edit_file,\n }),\n createGlobTool(backend, {\n customDescription: customToolDescriptions?.glob,\n }),\n createGrepTool(backend, {\n customDescription: customToolDescriptions?.grep,\n }),\n ];\n\n return createMiddleware({\n name: \"FilesystemMiddleware\",\n stateSchema: FilesystemStateSchema as any,\n tools,\n wrapModelCall: systemPrompt\n ? async (request, handler: any) => {\n const currentSystemPrompt = request.systemPrompt || \"\";\n const newSystemPrompt = currentSystemPrompt\n ? `${currentSystemPrompt}\\n\\n${systemPrompt}`\n : systemPrompt;\n return handler({ ...request, systemPrompt: newSystemPrompt });\n }\n : undefined,\n wrapToolCall: toolTokenLimitBeforeEvict\n ? ((async (request: any, handler: any) => {\n const result = await handler(request);\n\n async function processToolMessage(msg: ToolMessage) {\n if (\n typeof msg.content === \"string\" &&\n msg.content.length > toolTokenLimitBeforeEvict! * 4\n ) {\n // Build StateAndStore from request\n const stateAndStore: StateAndStore = {\n state: request.state || {},\n store: request.config?.store,\n };\n const resolvedBackend = await getBackend(backend, stateAndStore);\n const sanitizedId = sanitizeToolCallId(\n request.toolCall?.id || msg.tool_call_id\n );\n const evictPath = `/large_tool_results/${sanitizedId}`;\n\n const writeResult = await resolvedBackend.write(\n evictPath,\n msg.content\n );\n\n if (writeResult.error) {\n return { message: msg, filesUpdate: null };\n }\n\n const truncatedMessage = new ToolMessage({\n content: `Tool result too large (${Math.round(\n msg.content.length / 4\n )} tokens). Content saved to ${evictPath}`,\n tool_call_id: msg.tool_call_id,\n name: msg.name,\n });\n\n return {\n message: truncatedMessage,\n filesUpdate: writeResult.filesUpdate,\n };\n }\n return { message: msg, filesUpdate: null };\n }\n\n if (result instanceof ToolMessage) {\n const processed = await processToolMessage(result);\n\n if (processed.filesUpdate) {\n return new Command({\n update: {\n files: processed.filesUpdate,\n messages: [processed.message],\n },\n });\n }\n\n return processed.message;\n }\n\n if (isCommand(result)) {\n const update = result.update as any;\n if (!update?.messages) {\n return result;\n }\n\n let hasLargeResults = false;\n const accumulatedFiles: Record<string, FileData> = {\n ...(update.files || {}),\n };\n const processedMessages: ToolMessage[] = [];\n\n for (const msg of update.messages) {\n if (msg instanceof ToolMessage) {\n const processed = await processToolMessage(msg);\n processedMessages.push(processed.message);\n\n if (processed.filesUpdate) {\n hasLargeResults = true;\n Object.assign(accumulatedFiles, processed.filesUpdate);\n }\n } else {\n processedMessages.push(msg);\n }\n }\n\n if (hasLargeResults) {\n return new Command({\n update: {\n ...update,\n messages: processedMessages,\n files: accumulatedFiles,\n },\n });\n }\n }\n\n return result;\n }) as any)\n : undefined,\n });\n}\n","/**\n * Shared utility functions for memory backend implementations.\n *\n * This module contains both user-facing string formatters and structured\n * helpers used by backends and the composite router. Structured helpers\n * enable composition without fragile string parsing.\n */\n\nimport micromatch from \"micromatch\";\nimport { basename } from \"path\";\nimport type { FileData, GrepMatch } from \"./protocol.js\";\n\n// Constants\nexport const EMPTY_CONTENT_WARNING =\n \"System reminder: File exists but has empty contents\";\nexport const MAX_LINE_LENGTH = 10000;\nexport const LINE_NUMBER_WIDTH = 6;\nexport const TOOL_RESULT_TOKEN_LIMIT = 20000; // Same threshold as eviction\nexport const TRUNCATION_GUIDANCE =\n \"... [results truncated, try being more specific with your parameters]\";\n\n/**\n * Sanitize tool_call_id to prevent path traversal and separator issues.\n *\n * Replaces dangerous characters (., /, \\) with underscores.\n */\nexport function sanitizeToolCallId(toolCallId: string): string {\n return toolCallId.replace(/\\./g, \"_\").replace(/\\//g, \"_\").replace(/\\\\/g, \"_\");\n}\n\n/**\n * Format file content with line numbers (cat -n style).\n *\n * Chunks lines longer than MAX_LINE_LENGTH with continuation markers (e.g., 5.1, 5.2).\n *\n * @param content - File content as string or list of lines\n * @param startLine - Starting line number (default: 1)\n * @returns Formatted content with line numbers and continuation markers\n */\nexport function formatContentWithLineNumbers(\n content: string | string[],\n startLine: number = 1,\n): string {\n let lines: string[];\n if (typeof content === \"string\") {\n lines = content.split(\"\\n\");\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines = lines.slice(0, -1);\n }\n } else {\n lines = content;\n }\n\n const resultLines: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lineNum = i + startLine;\n\n if (line.length <= MAX_LINE_LENGTH) {\n resultLines.push(\n `${lineNum.toString().padStart(LINE_NUMBER_WIDTH)}\\t${line}`,\n );\n } else {\n // Split long line into chunks with continuation markers\n const numChunks = Math.ceil(line.length / MAX_LINE_LENGTH);\n for (let chunkIdx = 0; chunkIdx < numChunks; chunkIdx++) {\n const start = chunkIdx * MAX_LINE_LENGTH;\n const end = Math.min(start + MAX_LINE_LENGTH, line.length);\n const chunk = line.substring(start, end);\n if (chunkIdx === 0) {\n // First chunk: use normal line number\n resultLines.push(\n `${lineNum.toString().padStart(LINE_NUMBER_WIDTH)}\\t${chunk}`,\n );\n } else {\n // Continuation chunks: use decimal notation (e.g., 5.1, 5.2)\n const continuationMarker = `${lineNum}.${chunkIdx}`;\n resultLines.push(\n `${continuationMarker.padStart(LINE_NUMBER_WIDTH)}\\t${chunk}`,\n );\n }\n }\n }\n }\n\n return resultLines.join(\"\\n\");\n}\n\n/**\n * Check if content is empty and return warning message.\n *\n * @param content - Content to check\n * @returns Warning message if empty, null otherwise\n */\nexport function checkEmptyContent(content: string): string | null {\n if (!content || content.trim() === \"\") {\n return EMPTY_CONTENT_WARNING;\n }\n return null;\n}\n\n/**\n * Convert FileData to plain string content.\n *\n * @param fileData - FileData object with 'content' key\n * @returns Content as string with lines joined by newlines\n */\nexport function fileDataToString(fileData: FileData): string {\n return fileData.content.join(\"\\n\");\n}\n\n/**\n * Create a FileData object with timestamps.\n *\n * @param content - File content as string\n * @param createdAt - Optional creation timestamp (ISO format)\n * @returns FileData object with content and timestamps\n */\nexport function createFileData(content: string, createdAt?: string): FileData {\n const lines = typeof content === \"string\" ? content.split(\"\\n\") : content;\n const now = new Date().toISOString();\n\n return {\n content: lines,\n created_at: createdAt || now,\n modified_at: now,\n };\n}\n\n/**\n * Update FileData with new content, preserving creation timestamp.\n *\n * @param fileData - Existing FileData object\n * @param content - New content as string\n * @returns Updated FileData object\n */\nexport function updateFileData(fileData: FileData, content: string): FileData {\n const lines = typeof content === \"string\" ? content.split(\"\\n\") : content;\n const now = new Date().toISOString();\n\n return {\n content: lines,\n created_at: fileData.created_at,\n modified_at: now,\n };\n}\n\n/**\n * Format file data for read response with line numbers.\n *\n * @param fileData - FileData object\n * @param offset - Line offset (0-indexed)\n * @param limit - Maximum number of lines\n * @returns Formatted content or error message\n */\nexport function formatReadResponse(\n fileData: FileData,\n offset: number,\n limit: number,\n): string {\n const content = fileDataToString(fileData);\n const emptyMsg = checkEmptyContent(content);\n if (emptyMsg) {\n return emptyMsg;\n }\n\n const lines = content.split(\"\\n\");\n const startIdx = offset;\n const endIdx = Math.min(startIdx + limit, lines.length);\n\n if (startIdx >= lines.length) {\n return `Error: Line offset ${offset} exceeds file length (${lines.length} lines)`;\n }\n\n const selectedLines = lines.slice(startIdx, endIdx);\n return formatContentWithLineNumbers(selectedLines, startIdx + 1);\n}\n\n/**\n * Perform string replacement with occurrence validation.\n *\n * @param content - Original content\n * @param oldString - String to replace\n * @param newString - Replacement string\n * @param replaceAll - Whether to replace all occurrences\n * @returns Tuple of [new_content, occurrences] on success, or error message string\n */\nexport function performStringReplacement(\n content: string,\n oldString: string,\n newString: string,\n replaceAll: boolean,\n): [string, number] | string {\n // Use split to count occurrences (simpler than regex)\n const occurrences = content.split(oldString).length - 1;\n\n if (occurrences === 0) {\n return `Error: String not found in file: '${oldString}'`;\n }\n\n if (occurrences > 1 && !replaceAll) {\n return `Error: String '${oldString}' appears ${occurrences} times in file. Use replace_all=True to replace all instances, or provide a more specific string with surrounding context.`;\n }\n\n // Python's str.replace() replaces ALL occurrences\n // Use split/join for consistent behavior\n const newContent = content.split(oldString).join(newString);\n\n return [newContent, occurrences];\n}\n\n/**\n * Truncate list or string result if it exceeds token limit (rough estimate: 4 chars/token).\n */\nexport function truncateIfTooLong(\n result: string[] | string,\n): string[] | string {\n if (Array.isArray(result)) {\n const totalChars = result.reduce((sum, item) => sum + item.length, 0);\n if (totalChars > TOOL_RESULT_TOKEN_LIMIT * 4) {\n const truncateAt = Math.floor(\n (result.length * TOOL_RESULT_TOKEN_LIMIT * 4) / totalChars,\n );\n return [...result.slice(0, truncateAt), TRUNCATION_GUIDANCE];\n }\n return result;\n }\n // string\n if (result.length > TOOL_RESULT_TOKEN_LIMIT * 4) {\n return (\n result.substring(0, TOOL_RESULT_TOKEN_LIMIT * 4) +\n \"\\n\" +\n TRUNCATION_GUIDANCE\n );\n }\n return result;\n}\n\n/**\n * Validate and normalize a path.\n *\n * @param path - Path to validate\n * @returns Normalized path starting with / and ending with /\n * @throws Error if path is invalid\n */\nexport function validatePath(path: string | null | undefined): string {\n const pathStr = path || \"/\";\n if (!pathStr || pathStr.trim() === \"\") {\n throw new Error(\"Path cannot be empty\");\n }\n\n let normalized = pathStr.startsWith(\"/\") ? pathStr : \"/\" + pathStr;\n\n if (!normalized.endsWith(\"/\")) {\n normalized += \"/\";\n }\n\n return normalized;\n}\n\n/**\n * Search files dict for paths matching glob pattern.\n *\n * @param files - Dictionary of file paths to FileData\n * @param pattern - Glob pattern (e.g., `*.py`, `**\\/*.ts`)\n * @param path - Base path to search from\n * @returns Newline-separated file paths, sorted by modification time (most recent first).\n * Returns \"No files found\" if no matches.\n *\n * @example\n * ```typescript\n * const files = {\"/src/main.py\": FileData(...), \"/test.py\": FileData(...)};\n * globSearchFiles(files, \"*.py\", \"/\");\n * // Returns: \"/test.py\\n/src/main.py\" (sorted by modified_at)\n * ```\n */\nexport function globSearchFiles(\n files: Record<string, FileData>,\n pattern: string,\n path: string = \"/\",\n): string {\n let normalizedPath: string;\n try {\n normalizedPath = validatePath(path);\n } catch {\n return \"No files found\";\n }\n\n const filtered = Object.fromEntries(\n Object.entries(files).filter(([fp]) => fp.startsWith(normalizedPath)),\n );\n\n // Respect standard glob semantics:\n // - Patterns without path separators (e.g., \"*.py\") match only in the current\n // directory (non-recursive) relative to `path`.\n // - Use \"**\" explicitly for recursive matching.\n const effectivePattern = pattern;\n\n const matches: Array<[string, string]> = [];\n for (const [filePath, fileData] of Object.entries(filtered)) {\n let relative = filePath.substring(normalizedPath.length);\n if (relative.startsWith(\"/\")) {\n relative = relative.substring(1);\n }\n if (!relative) {\n const parts = filePath.split(\"/\");\n relative = parts[parts.length - 1] || \"\";\n }\n\n if (\n micromatch.isMatch(relative, effectivePattern, {\n dot: true,\n nobrace: false,\n })\n ) {\n matches.push([filePath, fileData.modified_at]);\n }\n }\n\n matches.sort((a, b) => b[1].localeCompare(a[1])); // Sort by modified_at descending\n\n if (matches.length === 0) {\n return \"No files found\";\n }\n\n return matches.map(([fp]) => fp).join(\"\\n\");\n}\n\n/**\n * Format grep search results based on output mode.\n *\n * @param results - Dictionary mapping file paths to list of [line_num, line_content] tuples\n * @param outputMode - Output format - \"files_with_matches\", \"content\", or \"count\"\n * @returns Formatted string output\n */\nexport function formatGrepResults(\n results: Record<string, Array<[number, string]>>,\n outputMode: \"files_with_matches\" | \"content\" | \"count\",\n): string {\n if (outputMode === \"files_with_matches\") {\n return Object.keys(results).sort().join(\"\\n\");\n }\n if (outputMode === \"count\") {\n const lines: string[] = [];\n for (const filePath of Object.keys(results).sort()) {\n const count = results[filePath].length;\n lines.push(`${filePath}: ${count}`);\n }\n return lines.join(\"\\n\");\n }\n // content mode\n const lines: string[] = [];\n for (const filePath of Object.keys(results).sort()) {\n lines.push(`${filePath}:`);\n for (const [lineNum, line] of results[filePath]) {\n lines.push(` ${lineNum}: ${line}`);\n }\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * Search file contents for regex pattern.\n *\n * @param files - Dictionary of file paths to FileData\n * @param pattern - Regex pattern to search for\n * @param path - Base path to search from\n * @param glob - Optional glob pattern to filter files (e.g., \"*.py\")\n * @param outputMode - Output format - \"files_with_matches\", \"content\", or \"count\"\n * @returns Formatted search results. Returns \"No matches found\" if no results.\n *\n * @example\n * ```typescript\n * const files = {\"/file.py\": FileData({content: [\"import os\", \"print('hi')\"], ...})};\n * grepSearchFiles(files, \"import\", \"/\");\n * // Returns: \"/file.py\" (with output_mode=\"files_with_matches\")\n * ```\n */\nexport function grepSearchFiles(\n files: Record<string, FileData>,\n pattern: string,\n path: string | null = null,\n glob: string | null = null,\n outputMode: \"files_with_matches\" | \"content\" | \"count\" = \"files_with_matches\",\n): string {\n let regex: RegExp;\n try {\n regex = new RegExp(pattern);\n } catch (e: any) {\n return `Invalid regex pattern: ${e.message}`;\n }\n\n let normalizedPath: string;\n try {\n normalizedPath = validatePath(path);\n } catch {\n return \"No matches found\";\n }\n\n let filtered = Object.fromEntries(\n Object.entries(files).filter(([fp]) => fp.startsWith(normalizedPath)),\n );\n\n if (glob) {\n filtered = Object.fromEntries(\n Object.entries(filtered).filter(([fp]) =>\n micromatch.isMatch(basename(fp), glob, { dot: true, nobrace: false }),\n ),\n );\n }\n\n const results: Record<string, Array<[number, string]>> = {};\n for (const [filePath, fileData] of Object.entries(filtered)) {\n for (let i = 0; i < fileData.content.length; i++) {\n const line = fileData.content[i];\n const lineNum = i + 1;\n if (regex.test(line)) {\n if (!results[filePath]) {\n results[filePath] = [];\n }\n results[filePath].push([lineNum, line]);\n }\n }\n }\n\n if (Object.keys(results).length === 0) {\n return \"No matches found\";\n }\n return formatGrepResults(results, outputMode);\n}\n\n// -------- Structured helpers for composition --------\n\n/**\n * Return structured grep matches from an in-memory files mapping.\n *\n * Returns a list of GrepMatch on success, or a string for invalid inputs\n * (e.g., invalid regex). We deliberately do not raise here to keep backends\n * non-throwing in tool contexts and preserve user-facing error messages.\n */\nexport function grepMatchesFromFiles(\n files: Record<string, FileData>,\n pattern: string,\n path: string | null = null,\n glob: string | null = null,\n): GrepMatch[] | string {\n let regex: RegExp;\n try {\n regex = new RegExp(pattern);\n } catch (e: any) {\n return `Invalid regex pattern: ${e.message}`;\n }\n\n let normalizedPath: string;\n try {\n normalizedPath = validatePath(path);\n } catch {\n return [];\n }\n\n let filtered = Object.fromEntries(\n Object.entries(files).filter(([fp]) => fp.startsWith(normalizedPath)),\n );\n\n if (glob) {\n filtered = Object.fromEntries(\n Object.entries(filtered).filter(([fp]) =>\n micromatch.isMatch(basename(fp), glob, { dot: true, nobrace: false }),\n ),\n );\n }\n\n const matches: GrepMatch[] = [];\n for (const [filePath, fileData] of Object.entries(filtered)) {\n for (let i = 0; i < fileData.content.length; i++) {\n const line = fileData.content[i];\n const lineNum = i + 1;\n if (regex.test(line)) {\n matches.push({ path: filePath, line: lineNum, text: line });\n }\n }\n }\n\n return matches;\n}\n\n/**\n * Group structured matches into the legacy dict form used by formatters.\n */\nexport function buildGrepResultsDict(\n matches: GrepMatch[],\n): Record<string, Array<[number, string]>> {\n const grouped: Record<string, Array<[number, string]>> = {};\n for (const m of matches) {\n if (!grouped[m.path]) {\n grouped[m.path] = [];\n }\n grouped[m.path].push([m.line, m.text]);\n }\n return grouped;\n}\n\n/**\n * Format structured grep matches using existing formatting logic.\n */\nexport function formatGrepMatches(\n matches: GrepMatch[],\n outputMode: \"files_with_matches\" | \"content\" | \"count\",\n): string {\n if (matches.length === 0) {\n return \"No matches found\";\n }\n return formatGrepResults(buildGrepResultsDict(matches), outputMode);\n}\n","/**\n * StateBackend: Store files in LangGraph agent state (ephemeral).\n */\n\nimport type {\n BackendProtocol,\n EditResult,\n FileData,\n FileInfo,\n GrepMatch,\n StateAndStore,\n WriteResult,\n} from \"./protocol.js\";\nimport {\n createFileData,\n fileDataToString,\n formatReadResponse,\n globSearchFiles,\n grepMatchesFromFiles,\n performStringReplacement,\n updateFileData,\n} from \"./utils.js\";\n\n/**\n * Backend that stores files in agent state (ephemeral).\n *\n * Uses LangGraph's state management and checkpointing. Files persist within\n * a conversation thread but not across threads. State is automatically\n * checkpointed after each agent step.\n *\n * Special handling: Since LangGraph state must be updated via Command objects\n * (not direct mutation), operations return filesUpdate in WriteResult/EditResult\n * for the middleware to apply via Command.\n */\nexport class StateBackend implements BackendProtocol {\n private stateAndStore: StateAndStore;\n\n constructor(stateAndStore: StateAndStore) {\n this.stateAndStore = stateAndStore;\n }\n\n /**\n * Get files from current state.\n */\n private getFiles(): Record<string, FileData> {\n return (\n ((this.stateAndStore.state as any).files as Record<string, FileData>) ||\n {}\n );\n }\n\n /**\n * List files and directories in the specified directory (non-recursive).\n *\n * @param path - Absolute path to directory\n * @returns List of FileInfo objects for files and directories directly in the directory.\n * Directories have a trailing / in their path and is_dir=true.\n */\n lsInfo(path: string): FileInfo[] {\n const files = this.getFiles();\n const infos: FileInfo[] = [];\n const subdirs = new Set<string>();\n\n // Normalize path to have trailing slash for proper prefix matching\n const normalizedPath = path.endsWith(\"/\") ? path : path + \"/\";\n\n for (const [k, fd] of Object.entries(files)) {\n // Check if file is in the specified directory or a subdirectory\n if (!k.startsWith(normalizedPath)) {\n continue;\n }\n\n // Get the relative path after the directory\n const relative = k.substring(normalizedPath.length);\n\n // If relative path contains '/', it's in a subdirectory\n if (relative.includes(\"/\")) {\n // Extract the immediate subdirectory name\n const subdirName = relative.split(\"/\")[0];\n subdirs.add(normalizedPath + subdirName + \"/\");\n continue;\n }\n\n // This is a file directly in the current directory\n const size = fd.content.join(\"\\n\").length;\n infos.push({\n path: k,\n is_dir: false,\n size: size,\n modified_at: fd.modified_at,\n });\n }\n\n // Add directories to the results\n for (const subdir of Array.from(subdirs).sort()) {\n infos.push({\n path: subdir,\n is_dir: true,\n size: 0,\n modified_at: \"\",\n });\n }\n\n infos.sort((a, b) => a.path.localeCompare(b.path));\n return infos;\n }\n\n /**\n * Read file content with line numbers.\n *\n * @param filePath - Absolute file path\n * @param offset - Line offset to start reading from (0-indexed)\n * @param limit - Maximum number of lines to read\n * @returns Formatted file content with line numbers, or error message\n */\n read(filePath: string, offset: number = 0, limit: number = 2000): string {\n const files = this.getFiles();\n const fileData = files[filePath];\n\n if (!fileData) {\n return `Error: File '${filePath}' not found`;\n }\n\n return formatReadResponse(fileData, offset, limit);\n }\n\n /**\n * Read file content as raw FileData.\n *\n * @param filePath - Absolute file path\n * @returns Raw file content as FileData\n */\n readRaw(filePath: string): FileData {\n const files = this.getFiles();\n const fileData = files[filePath];\n\n if (!fileData) throw new Error(`File '${filePath}' not found`);\n return fileData;\n }\n\n /**\n * Create a new file with content.\n * Returns WriteResult with filesUpdate to update LangGraph state.\n */\n write(filePath: string, content: string): WriteResult {\n const files = this.getFiles();\n\n if (filePath in files) {\n return {\n error: `Cannot write to ${filePath} because it already exists. Read and then make an edit, or write to a new path.`,\n };\n }\n\n const newFileData = createFileData(content);\n return {\n path: filePath,\n filesUpdate: { [filePath]: newFileData },\n };\n }\n\n /**\n * Edit a file by replacing string occurrences.\n * Returns EditResult with filesUpdate and occurrences.\n */\n edit(\n filePath: string,\n oldString: string,\n newString: string,\n replaceAll: boolean = false,\n ): EditResult {\n const files = this.getFiles();\n const fileData = files[filePath];\n\n if (!fileData) {\n return { error: `Error: File '${filePath}' not found` };\n }\n\n const content = fileDataToString(fileData);\n const result = performStringReplacement(\n content,\n oldString,\n newString,\n replaceAll,\n );\n\n if (typeof result === \"string\") {\n return { error: result };\n }\n\n const [newContent, occurrences] = result;\n const newFileData = updateFileData(fileData, newContent);\n return {\n path: filePath,\n filesUpdate: { [filePath]: newFileData },\n occurrences: occurrences,\n };\n }\n\n /**\n * Structured search results or error string for invalid input.\n */\n grepRaw(\n pattern: string,\n path: string = \"/\",\n glob: string | null = null,\n ): GrepMatch[] | string {\n const files = this.getFiles();\n return grepMatchesFromFiles(files, pattern, path, glob);\n }\n\n /**\n * Structured glob matching returning FileInfo objects.\n */\n globInfo(pattern: string, path: string = \"/\"): FileInfo[] {\n const files = this.getFiles();\n const result = globSearchFiles(files, pattern, path);\n\n if (result === \"No files found\") {\n return [];\n }\n\n const paths = result.split(\"\\n\");\n const infos: FileInfo[] = [];\n for (const p of paths) {\n const fd = files[p];\n const size = fd ? fd.content.join(\"\\n\").length : 0;\n infos.push({\n path: p,\n is_dir: false,\n size: size,\n modified_at: fd?.modified_at || \"\",\n });\n }\n return infos;\n }\n}\n","/**\n * Metrics Middleware\n * Provides tools for interacting with Semantic Metrics Servers\n */\n\nimport { createMiddleware, type AgentMiddleware } from \"langchain\";\nimport {\n createListMetricsDataSourcesTool,\n CreateMetricsToolParams,\n} from \"../tool_lattice/metrics/list_metrics_datasources\";\nimport {\n createQueryMetricsListTool,\n} from \"../tool_lattice/metrics/query_metrics_list\";\nimport {\n createQueryMetricDefinitionTool,\n} from \"../tool_lattice/metrics/query_metric_definition\";\nimport {\n createQuerySemanticMetricDataTool,\n} from \"../tool_lattice/metrics/query_semantic_metric_data\";\nimport {\n createQueryTablesListTool,\n} from \"../tool_lattice/metrics/query_tables_list\";\nimport {\n createQueryTableDefinitionTool,\n} from \"../tool_lattice/metrics/query_table_definition\";\n\nexport interface CreateMetricsMiddlewareParams {\n /** List of configured metrics server keys */\n serverKeys: string[];\n /** Optional descriptions for each server */\n serverDescriptions?: Record<string, string>;\n}\n\n/**\n * Create metrics middleware that provides tools for querying metrics data\n * \n * This middleware includes 6 tools:\n * 1. list_metrics_datasources - List all datasources from all configured servers\n * 2. query_metrics_list - Query available metrics from datasources\n * 3. query_metric_definition - Get detailed definition of a specific metric\n * 4. query_semantic_metric_data - Query actual metric data\n * 5. query_tables_list - Query available tables from datasources\n * 6. query_table_definition - Get detailed definition of a specific table\n */\nexport function createMetricsMiddleware(\n params: CreateMetricsMiddlewareParams\n): AgentMiddleware {\n const { serverKeys, serverDescriptions } = params;\n\n if (!serverKeys || serverKeys.length === 0) {\n return createMiddleware({\n name: \"metricsMiddleware\",\n tools: [],\n });\n }\n\n const toolParams: CreateMetricsToolParams = {\n serverKeys,\n serverDescriptions,\n };\n\n return createMiddleware({\n name: \"metricsMiddleware\",\n tools: [\n createListMetricsDataSourcesTool(toolParams),\n createQueryMetricsListTool(toolParams),\n createQueryMetricDefinitionTool(toolParams),\n createQuerySemanticMetricDataTool(toolParams),\n createQueryTablesListTool(toolParams),\n createQueryTableDefinitionTool(toolParams),\n ],\n });\n}\n","import { createCodeEvalMiddleware, CreateCodeEvalMiddlewareParams } from \"../../middlewares/codeEvalMiddleware\";\nimport { createBrowserMiddleware, CreateBrowserMiddlewareParams } from \"../../middlewares/browserMiddleware\";\nimport { createSqlMiddleware, CreateSqlMiddlewareParams } from \"../../middlewares/sqlMiddleware\";\nimport { createSkillMiddleware, CreateSkillMiddlewareParams as CreateSkillMiddlewareParamsType } from \"../../middlewares/skillMiddleware\";\nimport { createFilesystemMiddleware, FilesystemMiddlewareOptions } from \"../../deep_agent_new/middleware/fs\";\nimport { createMetricsMiddleware, CreateMetricsMiddlewareParams } from \"../../middlewares/metricsMiddleware\";\nimport { MiddlewareConfig } from \"../types\";\nimport { BackendFactory } from \"../../deep_agent_new/backends/protocol.js\";\n\ninterface DatabaseConfigEntry {\n key: string;\n name?: string;\n description?: string;\n}\n\nexport function createCommonMiddlewares(\n middlewareConfigs: MiddlewareConfig[],\n filesystemBackend?: BackendFactory\n): any[] {\n const middlewares: any[] = [];\n const filesystemConfig = middlewareConfigs.find(m => m.type === \"filesystem\");\n\n if (filesystemConfig?.enabled && filesystemBackend) {\n const options: FilesystemMiddlewareOptions = { backend: filesystemBackend };\n middlewares.push(createFilesystemMiddleware(options));\n }\n\n for (const config of middlewareConfigs) {\n if (!config.enabled || config.type === \"filesystem\") continue;\n\n switch (config.type) {\n case \"code_eval\":\n middlewares.push(createCodeEvalMiddleware(config.config as CreateCodeEvalMiddlewareParams));\n break;\n case \"browser\":\n middlewares.push(createBrowserMiddleware(config.config as CreateBrowserMiddlewareParams));\n break;\n case \"sql\":\n {\n const sqlConfig = config.config as { databaseKeys?: string[] };\n if (sqlConfig.databaseKeys && sqlConfig.databaseKeys.length > 0) {\n const databaseConfigs: DatabaseConfigEntry[] = (global as any).__DATABASE_CONFIGS__ || [];\n const descriptions: Record<string, string> = {};\n for (const db of databaseConfigs) {\n if (db.key && sqlConfig.databaseKeys.includes(db.key)) {\n descriptions[db.key] = db.description || db.name || '';\n }\n }\n middlewares.push(createSqlMiddleware({\n databaseKeys: sqlConfig.databaseKeys,\n databaseDescriptions: descriptions,\n }));\n }\n }\n break;\n case \"skill\":\n middlewares.push(createSkillMiddleware(config.config as CreateSkillMiddlewareParamsType));\n break;\n case \"metrics\":\n {\n const metricsConfig = config.config as CreateMetricsMiddlewareParams;\n if (metricsConfig.serverKeys && metricsConfig.serverKeys.length > 0) {\n middlewares.push(createMetricsMiddleware(metricsConfig));\n }\n }\n break;\n }\n }\n\n return middlewares;\n}\n","import {\n createAgent,\n humanInTheLoopMiddleware,\n anthropicPromptCachingMiddleware,\n summarizationMiddleware,\n type AgentMiddleware,\n type ReactAgent,\n type InterruptOnConfig,\n} from \"langchain\";\nimport type { StructuredTool } from \"@langchain/core/tools\";\nimport type { BaseLanguageModel } from \"@langchain/core/language_models/base\";\nimport type {\n BaseCheckpointSaver,\n BaseStore,\n} from \"@langchain/langgraph-checkpoint\";\n\nimport {\n createFilesystemMiddleware,\n createSubAgentMiddleware,\n createPatchToolCallsMiddleware,\n type SubAgent,\n} from \"./middleware/index.js\";\nimport { StateBackend, type BackendProtocol } from \"./backends/index.js\";\nimport { InteropZodObject } from \"@langchain/core/utils/types\";\nimport { AnnotationRoot } from \"@langchain/langgraph\";\nimport { CompiledSubAgent } from \"./middleware/subagents.js\";\nimport { todoListMiddleware } from \"./middleware/todos.js\";\nimport { createSkillMiddleware } from \"../middlewares/skillMiddleware.js\";\n\n/**\n * Configuration parameters for creating a Deep Agent\n * Matches Python's create_deep_agent parameters\n */\nexport interface CreateDeepAgentParams<\n ContextSchema extends\n | AnnotationRoot<any>\n | InteropZodObject = AnnotationRoot<any>\n> {\n /** The model to use (model name string or LanguageModelLike instance). Defaults to claude-sonnet-4-5-20250929 */\n model?: BaseLanguageModel | string;\n /** Tools the agent should have access to */\n tools?: StructuredTool[];\n /** Custom system prompt for the agent. This will be combined with the base agent prompt */\n systemPrompt?: string;\n /** Custom middleware to apply after standard middleware */\n middleware?: AgentMiddleware[];\n /** List of subagent specifications for task delegation */\n subagents?: (SubAgent | CompiledSubAgent)[];\n /** Structured output response format for the agent */\n responseFormat?: any; // ResponseFormat type is complex, using any for now\n /** Optional schema for context (not persisted between invocations) */\n contextSchema?: ContextSchema;\n /** Optional checkpointer for persisting agent state between runs */\n checkpointer?: BaseCheckpointSaver | boolean;\n /** Optional store for persisting longterm memories */\n store?: BaseStore;\n /**\n * Optional backend for filesystem operations.\n * Can be either a backend instance or a factory function that creates one.\n * The factory receives a config object with state and store.\n */\n backend?:\n | BackendProtocol\n | ((config: { state: unknown; store?: BaseStore }) => Promise<BackendProtocol>);\n /** Optional interrupt configuration mapping tool names to interrupt configs */\n interruptOn?: Record<string, boolean | InterruptOnConfig>;\n /** The name of the agent */\n name?: string;\n\n skills?: string[];\n\n}\n\nconst BASE_PROMPT = `In order to complete the objective that the user asks of you, you have access to a number of standard tools.`;\n\n/**\n * Create a Deep Agent with middleware-based architecture.\n *\n * Matches Python's create_deep_agent function, using middleware for all features:\n * - Todo management (todoListMiddleware)\n * - Filesystem tools (createFilesystemMiddleware)\n * - Subagent delegation (createSubAgentMiddleware)\n * - Conversation summarization (summarizationMiddleware)\n * - Prompt caching (anthropicPromptCachingMiddleware)\n * - Tool call patching (createPatchToolCallsMiddleware)\n * - Human-in-the-loop (humanInTheLoopMiddleware) - optional\n *\n * @param params Configuration parameters for the agent\n * @returns ReactAgent instance ready for invocation\n */\nexport function createDeepAgent<\n ContextSchema extends\n | AnnotationRoot<any>\n | InteropZodObject = AnnotationRoot<any>\n>(\n params: CreateDeepAgentParams<ContextSchema> = {}\n): ReactAgent<any, any, ContextSchema, any> {\n const {\n model = \"claude-sonnet-4-5-20250929\",\n tools = [],\n systemPrompt,\n middleware: customMiddleware = [],\n subagents = [],\n responseFormat,\n contextSchema,\n checkpointer,\n store,\n backend,\n interruptOn,\n name,\n skills,\n } = params;\n\n // Combine system prompt with base prompt like Python implementation\n const finalSystemPrompt = systemPrompt\n ? `${systemPrompt}\\n\\n${BASE_PROMPT}`\n : BASE_PROMPT;\n\n // Create backend configuration for filesystem middleware\n // If no backend is provided, use a factory that creates a StateBackend\n const filesystemBackend = backend\n ? backend\n : async (config: { state: unknown; store?: BaseStore }) =>\n new StateBackend(config);\n\n const middleware: AgentMiddleware[] = [\n // Provides todo list management capabilities for tracking tasks\n todoListMiddleware(),\n // Enables filesystem operations and optional long-term memory storage\n createFilesystemMiddleware({ backend: filesystemBackend }),\n // Enables delegation to specialized subagents for complex tasks\n createSubAgentMiddleware({\n defaultModel: model,\n defaultTools: tools,\n defaultMiddleware: [\n // Subagent middleware: Todo list management\n todoListMiddleware(),\n // Subagent middleware: Filesystem operations\n createFilesystemMiddleware({\n backend: filesystemBackend,\n }),\n // Subagent middleware: Automatic conversation summarization when token limits are approached\n summarizationMiddleware({\n model,\n trigger: { tokens: 170_000 },\n keep: { messages: 6 },\n }),\n // Subagent middleware: Anthropic prompt caching for improved performance\n anthropicPromptCachingMiddleware({\n unsupportedModelBehavior: \"ignore\",\n }),\n // Subagent middleware: Patches tool calls for compatibility\n createPatchToolCallsMiddleware(),\n ],\n defaultInterruptOn: interruptOn,\n subagents,\n generalPurposeAgent: false,\n }),\n // Automatically summarizes conversation history when token limits are approached\n summarizationMiddleware({\n model,\n trigger: { tokens: 170_000 },\n keep: { messages: 6 },\n }),\n // Enables Anthropic prompt caching for improved performance and reduced costs\n anthropicPromptCachingMiddleware({\n unsupportedModelBehavior: \"ignore\",\n }),\n // Patches tool calls to ensure compatibility across different model providers\n createPatchToolCallsMiddleware()\n\n ];\n\n // Add human-in-the-loop middleware if interrupt config provided\n if (interruptOn) {\n middleware.push(humanInTheLoopMiddleware({ interruptOn }));\n }\n\n // Add custom middleware last (after all built-in middleware)\n middleware.push(...customMiddleware);\n\n return createAgent({\n model,\n systemPrompt: finalSystemPrompt,\n tools,\n middleware,\n responseFormat,\n contextSchema,\n checkpointer,\n store,\n name,\n });\n}\n","import { z } from \"zod/v3\";\nimport {\n createMiddleware,\n createAgent,\n AgentMiddleware,\n tool,\n ToolMessage,\n humanInTheLoopMiddleware,\n type InterruptOnConfig,\n type ReactAgent,\n StructuredTool,\n} from \"langchain\";\nimport { Command, getCurrentTaskInput } from \"@langchain/langgraph\";\nimport type { LanguageModelLike } from \"@langchain/core/language_models/base\";\nimport type { Runnable } from \"@langchain/core/runnables\";\nimport { HumanMessage } from \"@langchain/core/messages\";\nimport { AgentClient } from \"@agent_lattice\";\nimport { agentWorkerGraph } from \"../../agent_worker/agent_worker_graph\";\nexport type { AgentMiddleware };\n\n// Constants\nconst DEFAULT_SUBAGENT_PROMPT =\n \"In order to complete the objective that the user asks of you, you have access to a number of standard tools.\";\n\n// State keys that should be excluded when passing state to subagents\nconst EXCLUDED_STATE_KEYS = [\"messages\", \"todos\", \"jumpTo\"] as const;\n\nconst DEFAULT_GENERAL_PURPOSE_DESCRIPTION =\n \"General-purpose agent for researching complex questions, searching for files and content, and executing multi-step tasks. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries use this agent to perform the search for you. This agent has access to all tools as the main agent.\";\n\n// Comprehensive task tool description from Python\nfunction getTaskToolDescription(subagentDescriptions: string[]): string {\n return `\nLaunch an ephemeral subagent to handle complex, multi-step independent tasks with isolated context windows.\n\nAvailable agent types and the tools they have access to:\n${subagentDescriptions.join(\"\\n\")}\n\nWhen using the Task tool, you must specify a subagent_type parameter to select which agent type to use.\n\n## Usage notes:\n1. Launch multiple agents concurrently whenever possible, to maximize performance; to do that, use a single message with multiple tool uses\n2. When the agent is done, it will return a single message back to you. The result returned by the agent is not visible to the user. To show the user the result, you should send a text message back to the user with a concise summary of the result.\n3. Each agent invocation is stateless. You will not be able to send additional messages to the agent, nor will the agent be able to communicate with you outside of its final report. Therefore, your prompt should contain a highly detailed task description for the agent to perform autonomously and you should specify exactly what information the agent should return back to you in its final and only message to you.\n4. The agent's outputs should generally be trusted\n5. Clearly tell the agent whether you expect it to create content, perform analysis, or just do research (search, file reads, web fetches, etc.), since it is not aware of the user's intent\n6. If the agent description mentions that it should be used proactively, then you should try your best to use it without the user having to ask for it first. Use your judgement.\n7. When only the general-purpose agent is provided, you should use it for all tasks. It is great for isolating context and token usage, and completing specific, complex tasks, as it has all the same capabilities as the main agent.\n\n### Example usage of the general-purpose agent:\n\n<example_agent_descriptions>\n\"general-purpose\": use this agent for general purpose tasks, it has access to all tools as the main agent.\n</example_agent_descriptions>\n\n<example>\nUser: \"I want to conduct research on the accomplishments of Lebron James, Michael Jordan, and Kobe Bryant, and then compare them.\"\nAssistant: *Uses the task tool in parallel to conduct isolated research on each of the three players*\nAssistant: *Synthesizes the results of the three isolated research tasks and responds to the User*\n<commentary>\nResearch is a complex, multi-step task in it of itself.\nThe research of each individual player is not dependent on the research of the other players.\nThe assistant uses the task tool to break down the complex objective into three isolated tasks.\nEach research task only needs to worry about context and tokens about one player, then returns synthesized information about each player as the Tool Result.\nThis means each research task can dive deep and spend tokens and context deeply researching each player, but the final result is synthesized information, and saves us tokens in the long run when comparing the players to each other.\n</commentary>\n</example>\n\n<example>\nUser: \"Analyze a single large code repository for security vulnerabilities and generate a report.\"\nAssistant: *Launches a single \\`task\\` subagent for the repository analysis*\nAssistant: *Receives report and integrates results into final summary*\n<commentary>\nSubagent is used to isolate a large, context-heavy task, even though there is only one. This prevents the main thread from being overloaded with details.\nIf the user then asks followup questions, we have a concise report to reference instead of the entire history of analysis and tool calls, which is good and saves us time and money.\n</commentary>\n</example>\n\n<example>\nUser: \"Schedule two meetings for me and prepare agendas for each.\"\nAssistant: *Calls the task tool in parallel to launch two \\`task\\` subagents (one per meeting) to prepare agendas*\nAssistant: *Returns final schedules and agendas*\n<commentary>\nTasks are simple individually, but subagents help silo agenda preparation.\nEach subagent only needs to worry about the agenda for one meeting.\n</commentary>\n</example>\n\n<example>\nUser: \"I want to order a pizza from Dominos, order a burger from McDonald's, and order a salad from Subway.\"\nAssistant: *Calls tools directly in parallel to order a pizza from Dominos, a burger from McDonald's, and a salad from Subway*\n<commentary>\nThe assistant did not use the task tool because the objective is super simple and clear and only requires a few trivial tool calls.\nIt is better to just complete the task directly and NOT use the \\`task\\`tool.\n</commentary>\n</example>\n\n### Example usage with custom agents:\n\n<example_agent_descriptions>\n\"content-reviewer\": use this agent after you are done creating significant content or documents\n\"greeting-responder\": use this agent when to respond to user greetings with a friendly joke\n\"research-analyst\": use this agent to conduct thorough research on complex topics\n</example_agent_description>\n\n<example>\nuser: \"Please write a function that checks if a number is prime\"\nassistant: Sure let me write a function that checks if a number is prime\nassistant: First let me use the Write tool to write a function that checks if a number is prime\nassistant: I'm going to use the Write tool to write the following code:\n<code>\nfunction isPrime(n) {\n if (n <= 1) return false\n for (let i = 2; i * i <= n; i++) {\n if (n % i === 0) return false\n }\n return true\n}\n</code>\n<commentary>\nSince significant content was created and the task was completed, now use the content-reviewer agent to review the work\n</commentary>\nassistant: Now let me use the content-reviewer agent to review the code\nassistant: Uses the Task tool to launch with the content-reviewer agent\n</example>\n\n<example>\nuser: \"Can you help me research the environmental impact of different renewable energy sources and create a comprehensive report?\"\n<commentary>\nThis is a complex research task that would benefit from using the research-analyst agent to conduct thorough analysis\n</commentary>\nassistant: I'll help you research the environmental impact of renewable energy sources. Let me use the research-analyst agent to conduct comprehensive research on this topic.\nassistant: Uses the Task tool to launch with the research-analyst agent, providing detailed instructions about what research to conduct and what format the report should take\n</example>\n\n<example>\nuser: \"Hello\"\n<commentary>\nSince the user is greeting, use the greeting-responder agent to respond with a friendly joke\n</commentary>\nassistant: \"I'm going to use the Task tool to launch with the greeting-responder agent\"\n</example>\n `.trim();\n}\n\nconst TASK_SYSTEM_PROMPT = `## \\`task\\` (subagent spawner)\n\nYou have access to a \\`task\\` tool to launch short-lived subagents that handle isolated tasks. These agents are ephemeral — they live only for the duration of the task and return a single result.\n\nWhen to use the task tool:\n- When a task is complex and multi-step, and can be fully delegated in isolation\n- When a task is independent of other tasks and can run in parallel\n- When a task requires focused reasoning or heavy token/context usage that would bloat the orchestrator thread\n- When sandboxing improves reliability (e.g. code execution, structured searches, data formatting)\n- When you only care about the output of the subagent, and not the intermediate steps (ex. performing a lot of research and then returned a synthesized report, performing a series of computations or lookups to achieve a concise, relevant answer.)\n\nSubagent lifecycle:\n1. **Spawn** → Provide clear role, instructions, and expected output\n2. **Run** → The subagent completes the task autonomously\n3. **Return** → The subagent provides a single structured result\n4. **Reconcile** → Incorporate or synthesize the result into the main thread\n\nWhen NOT to use the task tool:\n- If you need to see the intermediate reasoning or steps after the subagent has completed (the task tool hides them)\n- If the task is trivial (a few tool calls or simple lookup)\n- If delegating does not reduce token usage, complexity, or context switching\n- If splitting would add latency without benefit\n\n## Important Task Tool Usage Notes to Remember\n- Whenever possible, parallelize the work that you do. This is true for both tool_calls, and for tasks. Whenever you have independent steps to complete - make tool_calls, or kick off tasks (subagents) in parallel to accomplish them faster. This saves time for the user, which is incredibly important.\n- Remember to use the \\`task\\` tool to silo independent tasks within a multi-part objective.\n- You should use the \\`task\\` tool whenever you have a complex task that will take multiple steps, and is independent from other tasks that the agent needs to complete. These agents are highly competent and efficient.`;\n\n/**\n * Type definitions for pre-compiled agents.\n */\nexport interface CompiledSubAgent {\n /** The name of the agent */\n name: string;\n /** The description of the agent */\n description: string;\n /** The agent instance */\n runnable: AgentClient | Runnable;\n}\n\n/**\n * Type definitions for subagents\n */\nexport interface SubAgent {\n /** The name of the agent */\n name: string;\n /** The description of the agent */\n description: string;\n /** The system prompt to use for the agent */\n systemPrompt: string;\n /** The tools to use for the agent (tool instances, not names). Defaults to defaultTools */\n tools?: StructuredTool[];\n /** The model for the agent. Defaults to default_model */\n model?: LanguageModelLike | string;\n /** Additional middleware to append after default_middleware */\n middleware?: AgentMiddleware[];\n /** The tool configs to use for the agent */\n interruptOn?: Record<string, boolean | InterruptOnConfig>;\n}\n\n/**\n * Filter state to exclude certain keys when passing to subagents\n */\nfunction filterStateForSubagent(\n state: Record<string, unknown>\n): Record<string, unknown> {\n const filtered: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(state)) {\n if (!EXCLUDED_STATE_KEYS.includes(key as never)) {\n filtered[key] = value;\n }\n }\n return filtered;\n}\n\n/**\n * Create Command with filtered state update from subagent result\n */\nfunction returnCommandWithStateUpdate(\n result: Record<string, unknown>,\n toolCallId: string\n): Command {\n const stateUpdate = filterStateForSubagent(result);\n const messages = result.messages as Array<{ content: string }>;\n const lastMessage = messages?.[messages.length - 1];\n\n return new Command({\n update: {\n ...stateUpdate,\n messages: [\n new ToolMessage({\n content: lastMessage?.content || \"Task Failed to complete\",\n tool_call_id: toolCallId,\n name: \"task\",\n }),\n ],\n },\n });\n}\n\n/**\n * Create subagent instances from specifications\n */\nfunction getSubagents(options: {\n defaultModel: LanguageModelLike | string;\n defaultTools: StructuredTool[];\n defaultMiddleware: AgentMiddleware[] | null;\n defaultInterruptOn: Record<string, boolean | InterruptOnConfig> | null;\n subagents: (SubAgent | CompiledSubAgent)[];\n generalPurposeAgent: boolean;\n}): {\n agents: Record<string, ReactAgent<any, any, any, any> | Runnable>;\n descriptions: string[];\n} {\n const {\n defaultModel,\n defaultTools,\n defaultMiddleware,\n defaultInterruptOn,\n subagents,\n generalPurposeAgent,\n } = options;\n\n const defaultSubagentMiddleware = defaultMiddleware || [];\n const agents: Record<string, ReactAgent<any, any, any, any> | Runnable> = {};\n const subagentDescriptions: string[] = [];\n\n // Create general-purpose agent if enabled\n if (generalPurposeAgent) {\n const generalPurposeMiddleware = [...defaultSubagentMiddleware];\n if (defaultInterruptOn) {\n generalPurposeMiddleware.push(\n humanInTheLoopMiddleware({ interruptOn: defaultInterruptOn })\n );\n }\n\n const generalPurposeSubagent = createAgent({\n model: defaultModel,\n systemPrompt: DEFAULT_SUBAGENT_PROMPT,\n tools: defaultTools as any,\n middleware: generalPurposeMiddleware,\n });\n\n agents[\"general-purpose\"] = generalPurposeSubagent;\n subagentDescriptions.push(\n `- general-purpose: ${DEFAULT_GENERAL_PURPOSE_DESCRIPTION}`\n );\n }\n\n // Process custom subagents\n for (const agentParams of subagents) {\n subagentDescriptions.push(\n `- ${agentParams.name}: ${agentParams.description}`\n );\n\n if (\"runnable\" in agentParams) {\n agents[agentParams.name] = agentParams.runnable;\n } else {\n const middleware = agentParams.middleware\n ? [...defaultSubagentMiddleware, ...agentParams.middleware]\n : [...defaultSubagentMiddleware];\n\n const interruptOn = agentParams.interruptOn || defaultInterruptOn;\n if (interruptOn)\n middleware.push(humanInTheLoopMiddleware({ interruptOn }));\n\n agents[agentParams.name] = createAgent({\n model: agentParams.model ?? defaultModel,\n systemPrompt: agentParams.systemPrompt,\n tools: agentParams.tools ?? defaultTools,\n middleware,\n });\n }\n }\n\n return { agents, descriptions: subagentDescriptions };\n}\n\n/**\n * Create the task tool for invoking subagents\n */\nfunction createTaskTool(options: {\n defaultModel: LanguageModelLike | string;\n defaultTools: StructuredTool[];\n defaultMiddleware: AgentMiddleware[] | null;\n defaultInterruptOn: Record<string, boolean | InterruptOnConfig> | null;\n subagents: (SubAgent | CompiledSubAgent)[];\n generalPurposeAgent: boolean;\n taskDescription: string | null;\n}) {\n const {\n defaultModel,\n defaultTools,\n defaultMiddleware,\n defaultInterruptOn,\n subagents,\n generalPurposeAgent,\n taskDescription,\n } = options;\n\n const { agents: subagentGraphs, descriptions: subagentDescriptions } =\n getSubagents({\n defaultModel,\n defaultTools,\n defaultMiddleware,\n defaultInterruptOn,\n subagents,\n generalPurposeAgent,\n });\n\n const finalTaskDescription = taskDescription\n ? taskDescription\n : getTaskToolDescription(subagentDescriptions);\n\n return tool(\n async (\n input: { description: string; subagent_type: string },\n config\n ): Promise<Command | string> => {\n const { description, subagent_type } = input;\n\n try {\n // Validate subagent type\n if (!(subagent_type in subagentGraphs)) {\n const allowedTypes = Object.keys(subagentGraphs)\n .map((k) => `\\`${k}\\``)\n .join(\", \");\n\n\n throw new Error(\n `Error: invoked agent of type ${subagent_type}, the only allowed types are ${allowedTypes}`\n );\n }\n\n const subagent = subagentGraphs[subagent_type];\n\n // Get current state and filter it for subagent\n const currentState = getCurrentTaskInput<Record<string, unknown>>();\n const subagentState = filterStateForSubagent(currentState);\n subagentState.messages = [new HumanMessage({ content: description })];\n\n const subagent_thread_id =\n config.configurable?.thread_id +\n \"____\" +\n subagent_type +\n \"_\" +\n config.toolCall.id;\n console.log(subagent_thread_id);\n // Invoke the subagent\n // const result = (await subagent.invoke(subagentState, {\n // configurable: { thread_id: subagent_thread_id },\n // })) as Record<string, unknown>;\n\n const workerResult = await agentWorkerGraph.invoke({\n assistant_id: subagent_type,\n thread_id: subagent_thread_id,\n input: { ...subagentState, message: description },\n });\n\n const result = workerResult.finalState?.values as Record<string, unknown>;\n\n // console.log(\"workerResult\", workerResult);\n\n // const result = (await AgentManager.getInstance().callAgentInQueue(\n // {\n // assistant_id: subagent_type,\n // thread_id: subagent_type + \"_\" + config.toolCall.id,\n // input: { ...subagentState, message: description },\n // },\n // true\n // )) as any;\n\n // Return command with filtered state update\n if (!config.toolCall?.id) {\n throw new Error(\"Tool call ID is required for subagent invocation\");\n }\n\n return returnCommandWithStateUpdate(result, config.toolCall.id);\n } catch (error) {\n return new Command({\n update: {\n messages: [\n new ToolMessage({\n content: error instanceof Error ? error.message : \"Task Failed to complete\",\n tool_call_id: config.toolCall.id,\n name: \"task\",\n }),\n ],\n },\n });\n }\n },\n {\n name: \"task\",\n description: finalTaskDescription,\n schema: z.object({\n description: z\n .string()\n .describe(\"The task to execute with the selected agent\"),\n subagent_type: z\n .string()\n .describe(\n `Name of the agent to use. Available: ${Object.keys(\n subagentGraphs\n ).join(\", \")}`\n ),\n }),\n }\n );\n}\n\n/**\n * Options for creating subagent middleware\n */\nexport interface SubAgentMiddlewareOptions {\n /** The model to use for subagents */\n defaultModel: LanguageModelLike | string;\n /** The tools to use for the default general-purpose subagent */\n defaultTools?: StructuredTool[];\n /** Default middleware to apply to all subagents */\n defaultMiddleware?: AgentMiddleware[] | null;\n /** The tool configs for the default general-purpose subagent */\n defaultInterruptOn?: Record<string, boolean | InterruptOnConfig> | null;\n /** A list of additional subagents to provide to the agent */\n subagents?: (SubAgent | CompiledSubAgent)[];\n /** Full system prompt override */\n systemPrompt?: string | null;\n /** Whether to include the general-purpose agent */\n generalPurposeAgent?: boolean;\n /** Custom description for the task tool */\n taskDescription?: string | null;\n}\n\n/**\n * Create subagent middleware with task tool\n */\nexport function createSubAgentMiddleware(\n options: SubAgentMiddlewareOptions\n): AgentMiddleware {\n const {\n defaultModel,\n defaultTools = [],\n defaultMiddleware = null,\n defaultInterruptOn = null,\n subagents = [],\n systemPrompt = TASK_SYSTEM_PROMPT,\n generalPurposeAgent = true,\n taskDescription = null,\n } = options;\n\n const taskTool = createTaskTool({\n defaultModel,\n defaultTools,\n defaultMiddleware,\n defaultInterruptOn,\n subagents,\n generalPurposeAgent,\n taskDescription,\n });\n\n return createMiddleware({\n name: \"subAgentMiddleware\",\n tools: [taskTool],\n wrapModelCall: async (request, handler) => {\n if (systemPrompt !== null) {\n const currentPrompt = request.systemPrompt || \"\";\n const newPrompt = currentPrompt\n ? `${currentPrompt}\\n\\n${systemPrompt}`\n : systemPrompt;\n\n return handler({\n ...request,\n systemPrompt: newPrompt,\n });\n }\n return handler(request);\n },\n });\n}\n","import {\n StateGraph,\n END,\n START,\n interrupt,\n Annotation,\n} from \"@langchain/langgraph\";\nimport { AgentManager } from \"../services/AgentManager\";\n\n/**\n * State schema for the agent worker graph\n */\nconst AgentWorkerState = Annotation.Root({\n // Input parameters\n assistant_id: Annotation<string>({\n reducer: (x: string, y: string) => y ?? x,\n default: () => \"\",\n }),\n thread_id: Annotation<string>({\n reducer: (x: string, y: string) => y ?? x,\n default: () => \"\",\n }),\n input: Annotation<Record<string, unknown>>({\n reducer: (x: Record<string, unknown>, y: Record<string, unknown>) => y ?? x,\n default: () => ({}),\n }),\n command2: Annotation<any>({\n reducer: (x: any, y: any) => y ?? x,\n default: () => undefined,\n }),\n\n // Execution result\n result: Annotation<any>({\n reducer: (x: any, y: any) => y ?? x,\n default: () => undefined,\n }),\n // Interrupt data\n interruptValue: Annotation<any>({\n reducer: (x: any, y: any) => y ?? x,\n default: () => undefined,\n }),\n // Final state to return\n finalState: Annotation<Record<string, unknown> | undefined>({\n reducer: (\n x: Record<string, unknown> | undefined,\n y: Record<string, unknown> | undefined\n ) => y ?? x,\n default: () => undefined,\n }),\n});\n\ntype AgentWorkerStateType = typeof AgentWorkerState.State;\n\n/**\n * Execute node: Calls AgentManager.callAgentInQueue\n * Uses command parameter if available (after interrupt response), otherwise uses input\n */\nasync function executeNode(\n state: AgentWorkerStateType\n): Promise<Partial<AgentWorkerStateType>> {\n const { assistant_id, thread_id, input, command2 } = state;\n\n // If command exists (after interrupt response), use command; otherwise use input\n const callParams: {\n assistant_id: string;\n thread_id: string;\n input?: any;\n command?: any;\n } = {\n assistant_id,\n thread_id,\n input,\n command: command2,\n };\n\n const result = (await AgentManager.getInstance().callAgentInQueue(\n callParams,\n true\n )) as any;\n\n return {\n result,\n };\n}\n\n/**\n * Interrupt node: Throws interrupt and waits for response\n */\nasync function interruptNode(\n state: AgentWorkerStateType\n): Promise<Partial<AgentWorkerStateType>> {\n const { result } = state;\n\n // Extract interrupt value from result.tasks[0].interrupts[0].value\n const interruptValue = result?.tasks?.[0]?.interrupts?.[0]?.value;\n\n if (!interruptValue) {\n throw new Error(\n \"Interrupt node called but no interrupt value found in result\"\n );\n }\n\n // Throw interrupt and wait for response\n const response = await interrupt(interruptValue);\n\n // After response, save the response as command for the next executeNode call\n return {\n command2: {\n resume: response,\n },\n };\n}\n\n/**\n * Conditional routing function\n * Routes to interrupt node if result.tasks has values, otherwise ends\n */\nfunction shouldInterrupt(state: AgentWorkerStateType): \"interrupt\" | \"end\" {\n const { result } = state;\n\n // Check if result.tasks exists and has values\n if (result?.tasks && Array.isArray(result.tasks) && result.tasks.length > 0) {\n // Check if there are interrupts\n if (result.tasks[0]?.interrupts && result.tasks[0].interrupts.length > 0) {\n return \"interrupt\";\n }\n }\n\n return \"end\";\n}\n\n/**\n * End node: Returns the final state and clears intermediate process states\n */\nfunction endNode(state: AgentWorkerStateType): Partial<AgentWorkerStateType> {\n // Save final state from result or input\n const finalState = state.result;\n\n // Clear intermediate process states\n return {\n finalState,\n // Clear intermediate states\n result: undefined,\n interruptValue: undefined,\n command2: undefined,\n };\n}\n\n/**\n * Create the agent worker graph\n */\nexport function createAgentWorkerGraph() {\n const workflow = new StateGraph(AgentWorkerState);\n\n // Add nodes\n workflow.addNode(\"execute\", executeNode);\n workflow.addNode(\"interrupt\", interruptNode);\n workflow.addNode(\"end\", endNode);\n\n // Set entry point: connect START to execute node\n (workflow as any).setEntryPoint(\"execute\");\n\n // Add conditional edge from execute node\n (workflow as any).addConditionalEdges(\"execute\", shouldInterrupt, {\n interrupt: \"interrupt\",\n end: \"end\",\n });\n\n // After interrupt, return to execute node\n (workflow as any).addEdge(\"interrupt\", \"execute\");\n\n // End node leads to END\n (workflow as any).addEdge(\"end\", END);\n\n return workflow.compile();\n}\nexport const agentWorkerGraph = createAgentWorkerGraph();\n","// Agent task event names\nexport const AGENT_TASK_EVENT = \"agent:execute\";\n\n\n\n","import { EventEmitter } from \"events\";\nimport { queueLatticeManager } from \"../queue_lattice\";\n\n/**\n * Event bus service\n * Used for event publishing and subscription between internal system components\n */\nclass EventBus {\n private emitter: EventEmitter;\n private defaultQueueKey: string = \"default\";\n\n constructor() {\n this.emitter = new EventEmitter();\n // Set maximum listener count to avoid memory leak warnings\n this.emitter.setMaxListeners(100);\n }\n\n /**\n * Set the default queue key for queue operations\n * @param queueKey Queue key name\n */\n setDefaultQueueKey(queueKey: string): void {\n this.defaultQueueKey = queueKey;\n }\n\n /**\n * Publish event\n * @param eventName Event name\n * @param data Event data\n * @param useQueue Whether to use queue for publishing\n */\n publish(eventName: string, data: any, useQueue: boolean = false): void {\n if (useQueue) {\n // Push to queue if queue service is available\n if (queueLatticeManager.hasLattice(this.defaultQueueKey)) {\n const queue = queueLatticeManager.getQueueLattice(this.defaultQueueKey);\n queue.push(data).catch((error) => {\n console.error(\"Failed to push event to queue:\", error);\n });\n } else {\n console.warn(\n `Queue \"${this.defaultQueueKey}\" not found. Event will not be queued.`\n );\n }\n } else {\n this.emitter.emit(eventName, data);\n }\n }\n\n /**\n * Subscribe to event\n * @param eventName Event name\n * @param callback Callback function\n */\n subscribe(eventName: string, callback: (data: any) => void): void {\n this.emitter.on(eventName, callback);\n }\n\n /**\n * Unsubscribe from event\n * @param eventName Event name\n * @param callback Callback function\n */\n unsubscribe(eventName: string, callback: (data: any) => void): void {\n this.emitter.off(eventName, callback);\n }\n\n /**\n * Subscribe to event once\n * @param eventName Event name\n * @param callback Callback function\n */\n subscribeOnce(eventName: string, callback: (data: any) => void): void {\n this.emitter.once(eventName, callback);\n }\n}\n\n// Create singleton instance\nconst eventBus = new EventBus();\n\nexport default eventBus;\nexport { eventBus };\n","/**\n * QueueLatticeManager\n *\n * Queue Lattice manager for registering and managing queue services\n */\n\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport {\n QueueLatticeProtocol,\n QueueConfig,\n QueueType,\n QueueClient,\n} from \"@axiom-lattice/protocols\";\nimport { MemoryQueueClient } from \"./MemoryQueueClient\";\n\n/**\n * Queue Lattice interface\n */\nexport interface QueueLattice extends QueueLatticeProtocol {\n key: string;\n config: QueueConfig;\n client: QueueLatticeProtocol[\"client\"];\n}\n\n/**\n * QueueLatticeManager - Singleton queue Lattice manager\n * Responsible for registering and managing various queue service Lattices\n */\nexport class QueueLatticeManager extends BaseLatticeManager<QueueLattice> {\n private static _instance: QueueLatticeManager;\n\n /**\n * Get QueueLatticeManager singleton instance\n */\n public static getInstance(): QueueLatticeManager {\n if (!QueueLatticeManager._instance) {\n QueueLatticeManager._instance = new QueueLatticeManager();\n }\n return QueueLatticeManager._instance;\n }\n\n /**\n * Get Lattice type prefix\n */\n protected getLatticeType(): string {\n return \"queues\";\n }\n\n /**\n * Register queue Lattice\n * @param key Lattice key name\n * @param config Queue configuration\n * @param client Optional queue client. If not provided, will create based on config type.\n * For REDIS type, client must be provided (use @axiom-lattice/queue-redis).\n */\n public registerLattice(\n key: string,\n config: QueueConfig,\n client?: QueueClient\n ): void {\n // Create client based on queue type if not provided\n let queueClient: QueueLatticeProtocol[\"client\"];\n\n if (client) {\n // Use provided client\n queueClient = client;\n } else {\n const queueName = config.queueName || process.env.QUEUE_NAME || \"tasks\";\n\n if (config.type === QueueType.REDIS) {\n throw new Error(\n `Redis queue client must be provided. Please install @axiom-lattice/queue-redis and pass the client to registerLattice. Example: registerLattice(key, config, new RedisQueueClient(queueName, options))`\n );\n } else {\n // Default to memory\n queueClient = new MemoryQueueClient(queueName);\n }\n }\n\n // Create queue Lattice object\n const queueLattice: QueueLattice = {\n key,\n config,\n client: queueClient,\n push: async (item: any) => {\n return queueClient.push(item);\n },\n pop: async () => {\n return queueClient.pop();\n },\n createQueue: queueClient.createQueue\n ? async () => {\n return queueClient.createQueue!();\n }\n : undefined,\n };\n\n // Call base class register method\n this.register(key, queueLattice);\n }\n\n /**\n * Get QueueLattice\n * @param key Lattice key name\n */\n public getQueueLattice(key: string): QueueLattice {\n const queueLattice = this.get(key);\n if (!queueLattice) {\n throw new Error(`QueueLattice ${key} not found`);\n }\n return queueLattice;\n }\n\n /**\n * Get all Lattices\n */\n public getAllLattices(): QueueLattice[] {\n return this.getAll();\n }\n\n /**\n * Check if Lattice exists\n * @param key Lattice key name\n */\n public hasLattice(key: string): boolean {\n return this.has(key);\n }\n\n /**\n * Remove Lattice\n * @param key Lattice key name\n */\n public removeLattice(key: string): boolean {\n return this.remove(key);\n }\n\n /**\n * Clear all Lattices\n */\n public clearLattices(): void {\n this.clear();\n }\n\n /**\n * Get Lattice count\n */\n public getLatticeCount(): number {\n return this.count();\n }\n\n /**\n * Get Lattice key list\n */\n public getLatticeKeys(): string[] {\n return this.keys();\n }\n}\n\n// Export singleton instance\nexport const queueLatticeManager = QueueLatticeManager.getInstance();\n\n// Export convenience methods\nexport const registerQueueLattice = (\n key: string,\n config: QueueConfig,\n client?: QueueClient\n) => queueLatticeManager.registerLattice(key, config, client);\n\nexport const getQueueLattice = (key: string) =>\n queueLatticeManager.getQueueLattice(key);\n\n","/**\n * MemoryQueueClient\n *\n * In-memory queue service implementation\n */\n\nimport { QueueClient, QueueResult } from \"@axiom-lattice/protocols\";\n\n/**\n * In-memory storage for queues: Map<queue_name, message[]>\n * Using Map to support multiple queues (e.g., per tenant)\n */\nconst queues = new Map<string, any[]>();\n\n/**\n * Initialize queue if it doesn't exist\n */\nconst ensureQueue = (queueName: string): void => {\n if (!queues.has(queueName)) {\n queues.set(queueName, []);\n }\n};\n\n/**\n * Memory-based queue client implementation\n */\nexport class MemoryQueueClient implements QueueClient {\n private queueName: string;\n\n constructor(queueName: string = \"tasks\") {\n this.queueName = queueName;\n ensureQueue(this.queueName);\n }\n\n /**\n * Enqueue message (equivalent to lPush - push to left/beginning)\n */\n async push(item: any): Promise<QueueResult<number>> {\n try {\n ensureQueue(this.queueName);\n const queue = queues.get(this.queueName)!;\n\n // lPush behavior: add to the beginning of the array\n queue.unshift(item);\n\n const result = queue.length;\n console.log(\"lPush (memory)\", result);\n return { data: result, error: null };\n } catch (error) {\n console.error(error);\n return { data: null, error };\n }\n }\n\n /**\n * Dequeue message (equivalent to rPop - pop from right/end)\n */\n async pop(): Promise<QueueResult<any>> {\n try {\n ensureQueue(this.queueName);\n const queue = queues.get(this.queueName)!;\n\n // rPop behavior: remove from the end of the array\n // This creates FIFO behavior when combined with lPush (unshift + pop = FIFO)\n const message = queue.pop();\n\n if (message) {\n return { data: message, error: null };\n }\n return { data: null, error: null };\n } catch (error) {\n console.error(error);\n return { data: null, error };\n }\n }\n\n /**\n * Create queue (initialize in memory)\n */\n async createQueue(): Promise<{\n success: boolean;\n queue_name?: string;\n error?: any;\n }> {\n try {\n ensureQueue(this.queueName);\n const queue = queues.get(this.queueName)!;\n const exists = queue !== undefined;\n return { success: true, queue_name: this.queueName };\n } catch (error) {\n console.error(error);\n return { success: false, error };\n }\n }\n}\n\n\n\n","import { AGENT_TASK_EVENT } from \"../constants/agent_task_types\";\nimport eventBus from \"./event_bus\";\n\nexport class AgentManager {\n private static instance: AgentManager;\n private constructor() {}\n private agents: { name: string; agent: any }[] = [];\n\n public static getInstance(): AgentManager {\n if (!AgentManager.instance) {\n AgentManager.instance = new AgentManager();\n }\n return AgentManager.instance;\n }\n\n callAgentInQueue(\n queue: {\n assistant_id: string;\n input?: any;\n thread_id: string;\n command?: any;\n \"x-tenant-id\"?: string;\n },\n return_agent_state?: boolean\n ) {\n return new Promise((resolve, reject) => {\n const callback_event = `${queue.assistant_id}::${queue.thread_id}`;\n if (return_agent_state) {\n eventBus.subscribeOnce(callback_event, (data) => {\n if (data.success) {\n // console.log(\"AgentManager callAgentInQueue success\", data);\n resolve(data.state);\n } else {\n // console.log(\"AgentManager callAgentInQueue error\", data);\n reject(data.error);\n }\n });\n }\n\n try {\n eventBus.publish(\n AGENT_TASK_EVENT,\n {\n ...queue,\n callback_event,\n },\n true\n );\n // without return_agent_state, resolve the promise\n !return_agent_state &&\n resolve({ callback_event_id: callback_event, success: true });\n } catch (error) {\n // without return_agent_state, reject the promise\n !return_agent_state &&\n reject({\n callback_event_id: callback_event,\n success: false,\n error: error,\n });\n }\n });\n }\n}\n","import {\n createMiddleware,\n AgentMiddleware,\n ToolMessage,\n AIMessage,\n} from \"langchain\";\nimport { RemoveMessage } from \"@langchain/core/messages\";\nimport { REMOVE_ALL_MESSAGES } from \"@langchain/langgraph\";\n\n/**\n * Create middleware that patches dangling tool calls in the messages history.\n *\n * When an AI message contains tool_calls but subsequent messages don't include\n * the corresponding ToolMessage responses, this middleware adds synthetic\n * ToolMessages saying the tool call was cancelled.\n *\n * @returns AgentMiddleware that patches dangling tool calls\n *\n * @example\n * ```typescript\n * import { createAgent } from \"langchain\";\n * import { createPatchToolCallsMiddleware } from \"./middleware/patch_tool_calls\";\n *\n * const agent = createAgent({\n * model: \"claude-sonnet-4-5-20250929\",\n * middleware: [createPatchToolCallsMiddleware()],\n * });\n * ```\n */\nexport function createPatchToolCallsMiddleware(): AgentMiddleware {\n return createMiddleware({\n name: \"patchToolCallsMiddleware\",\n beforeAgent: async (state) => {\n const messages = state.messages;\n\n if (!messages || messages.length === 0) {\n return;\n }\n\n const patchedMessages: any[] = [];\n\n // Iterate over the messages and add any dangling tool calls\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n patchedMessages.push(msg);\n\n // Check if this is an AI message with tool calls\n if (AIMessage.isInstance(msg) && msg.tool_calls != null) {\n for (const toolCall of msg.tool_calls) {\n // Look for a corresponding ToolMessage in the messages after this one\n const correspondingToolMsg = messages\n .slice(i)\n .find(\n (m: any) =>\n ToolMessage.isInstance(m) && m.tool_call_id === toolCall.id\n );\n\n if (!correspondingToolMsg) {\n // We have a dangling tool call which needs a ToolMessage\n const toolMsg = `Tool call ${toolCall.name} with id ${toolCall.id} was cancelled - another message came in before it could be completed.`;\n patchedMessages.push(\n new ToolMessage({\n content: toolMsg,\n name: toolCall.name,\n tool_call_id: toolCall.id!,\n })\n );\n }\n }\n }\n }\n\n // Return state update with RemoveMessage followed by patched messages\n return {\n messages: [\n new RemoveMessage({ id: REMOVE_ALL_MESSAGES }),\n ...patchedMessages,\n ],\n };\n },\n });\n}\n","/**\n * StoreBackend: Adapter for LangGraph's BaseStore (persistent, cross-thread).\n */\n\nimport type { Item } from \"@langchain/langgraph\";\nimport type {\n BackendProtocol,\n EditResult,\n FileData,\n FileInfo,\n GrepMatch,\n StateAndStore,\n WriteResult,\n} from \"./protocol.js\";\nimport {\n createFileData,\n fileDataToString,\n formatReadResponse,\n globSearchFiles,\n grepMatchesFromFiles,\n performStringReplacement,\n updateFileData,\n} from \"./utils.js\";\n\n/**\n * Backend that stores files in LangGraph's BaseStore (persistent).\n *\n * Uses LangGraph's Store for persistent, cross-conversation storage.\n * Files are organized via namespaces and persist across all threads.\n *\n * The namespace can include an optional assistant_id for multi-agent isolation.\n */\nexport class StoreBackend implements BackendProtocol {\n private stateAndStore: StateAndStore;\n\n constructor(stateAndStore: StateAndStore) {\n this.stateAndStore = stateAndStore;\n }\n\n /**\n * Get the store instance.\n *\n * @returns BaseStore instance\n * @throws Error if no store is available\n */\n private getStore() {\n const store = this.stateAndStore.store;\n if (!store) {\n throw new Error(\"Store is required but not available in StateAndStore\");\n }\n return store;\n }\n\n /**\n * Get the namespace for store operations.\n *\n * If an assistant_id is available in stateAndStore, return\n * [assistant_id, \"filesystem\"] to provide per-assistant isolation.\n * Otherwise return [\"filesystem\"].\n */\n protected getNamespace(): string[] {\n const namespace = \"filesystem\";\n const assistantId = this.stateAndStore.assistantId;\n\n if (assistantId) {\n return [assistantId, namespace];\n }\n\n return [namespace];\n }\n\n /**\n * Convert a store Item to FileData format.\n *\n * @param storeItem - The store Item containing file data\n * @returns FileData object\n * @throws Error if required fields are missing or have incorrect types\n */\n private convertStoreItemToFileData(storeItem: Item): FileData {\n const value = storeItem.value as any;\n\n if (\n !value.content ||\n !Array.isArray(value.content) ||\n typeof value.created_at !== \"string\" ||\n typeof value.modified_at !== \"string\"\n ) {\n throw new Error(\n `Store item does not contain valid FileData fields. Got keys: ${Object.keys(value).join(\", \")}`,\n );\n }\n\n return {\n content: value.content,\n created_at: value.created_at,\n modified_at: value.modified_at,\n };\n }\n\n /**\n * Convert FileData to a value suitable for store.put().\n *\n * @param fileData - The FileData to convert\n * @returns Object with content, created_at, and modified_at fields\n */\n private convertFileDataToStoreValue(fileData: FileData): Record<string, any> {\n return {\n content: fileData.content,\n created_at: fileData.created_at,\n modified_at: fileData.modified_at,\n };\n }\n\n /**\n * Search store with automatic pagination to retrieve all results.\n *\n * @param store - The store to search\n * @param namespace - Hierarchical path prefix to search within\n * @param options - Optional query, filter, and page_size\n * @returns List of all items matching the search criteria\n */\n private async searchStorePaginated(\n store: any,\n namespace: string[],\n options: {\n query?: string;\n filter?: Record<string, any>;\n pageSize?: number;\n } = {},\n ): Promise<Item[]> {\n const { query, filter, pageSize = 100 } = options;\n const allItems: Item[] = [];\n let offset = 0;\n\n while (true) {\n const pageItems = await store.search(namespace, {\n query,\n filter,\n limit: pageSize,\n offset,\n });\n\n if (!pageItems || pageItems.length === 0) {\n break;\n }\n\n allItems.push(...pageItems);\n\n if (pageItems.length < pageSize) {\n break;\n }\n\n offset += pageSize;\n }\n\n return allItems;\n }\n\n /**\n * List files and directories in the specified directory (non-recursive).\n *\n * @param path - Absolute path to directory\n * @returns List of FileInfo objects for files and directories directly in the directory.\n * Directories have a trailing / in their path and is_dir=true.\n */\n async lsInfo(path: string): Promise<FileInfo[]> {\n const store = this.getStore();\n const namespace = this.getNamespace();\n\n // Retrieve all items and filter by path prefix locally to avoid\n // coupling to store-specific filter semantics\n const items = await this.searchStorePaginated(store, namespace);\n const infos: FileInfo[] = [];\n const subdirs = new Set<string>();\n\n // Normalize path to have trailing slash for proper prefix matching\n const normalizedPath = path.endsWith(\"/\") ? path : path + \"/\";\n\n for (const item of items) {\n const itemKey = String(item.key);\n\n // Check if file is in the specified directory or a subdirectory\n if (!itemKey.startsWith(normalizedPath)) {\n continue;\n }\n\n // Get the relative path after the directory\n const relative = itemKey.substring(normalizedPath.length);\n\n // If relative path contains '/', it's in a subdirectory\n if (relative.includes(\"/\")) {\n // Extract the immediate subdirectory name\n const subdirName = relative.split(\"/\")[0];\n subdirs.add(normalizedPath + subdirName + \"/\");\n continue;\n }\n\n // This is a file directly in the current directory\n try {\n const fd = this.convertStoreItemToFileData(item);\n const size = fd.content.join(\"\\n\").length;\n infos.push({\n path: itemKey,\n is_dir: false,\n size: size,\n modified_at: fd.modified_at,\n });\n } catch {\n // Skip invalid items\n continue;\n }\n }\n\n // Add directories to the results\n for (const subdir of Array.from(subdirs).sort()) {\n infos.push({\n path: subdir,\n is_dir: true,\n size: 0,\n modified_at: \"\",\n });\n }\n\n infos.sort((a, b) => a.path.localeCompare(b.path));\n return infos;\n }\n\n /**\n * Read file content with line numbers.\n *\n * @param filePath - Absolute file path\n * @param offset - Line offset to start reading from (0-indexed)\n * @param limit - Maximum number of lines to read\n * @returns Formatted file content with line numbers, or error message\n */\n async read(\n filePath: string,\n offset: number = 0,\n limit: number = 2000,\n ): Promise<string> {\n try {\n const fileData = await this.readRaw(filePath);\n return formatReadResponse(fileData, offset, limit);\n } catch (e: any) {\n return `Error: ${e.message}`;\n }\n }\n\n /**\n * Read file content as raw FileData.\n *\n * @param filePath - Absolute file path\n * @returns Raw file content as FileData\n */\n async readRaw(filePath: string): Promise<FileData> {\n const store = this.getStore();\n const namespace = this.getNamespace();\n const item = await store.get(namespace, filePath);\n\n if (!item) throw new Error(`File '${filePath}' not found`);\n return this.convertStoreItemToFileData(item);\n }\n\n /**\n * Create a new file with content.\n * Returns WriteResult. External storage sets filesUpdate=null.\n */\n async write(filePath: string, content: string): Promise<WriteResult> {\n const store = this.getStore();\n const namespace = this.getNamespace();\n\n // Check if file exists\n const existing = await store.get(namespace, filePath);\n if (existing) {\n return {\n error: `Cannot write to ${filePath} because it already exists. Read and then make an edit, or write to a new path.`,\n };\n }\n\n // Create new file\n const fileData = createFileData(content);\n const storeValue = this.convertFileDataToStoreValue(fileData);\n await store.put(namespace, filePath, storeValue);\n return { path: filePath, filesUpdate: null };\n }\n\n /**\n * Edit a file by replacing string occurrences.\n * Returns EditResult. External storage sets filesUpdate=null.\n */\n async edit(\n filePath: string,\n oldString: string,\n newString: string,\n replaceAll: boolean = false,\n ): Promise<EditResult> {\n const store = this.getStore();\n const namespace = this.getNamespace();\n\n // Get existing file\n const item = await store.get(namespace, filePath);\n if (!item) {\n return { error: `Error: File '${filePath}' not found` };\n }\n\n try {\n const fileData = this.convertStoreItemToFileData(item);\n const content = fileDataToString(fileData);\n const result = performStringReplacement(\n content,\n oldString,\n newString,\n replaceAll,\n );\n\n if (typeof result === \"string\") {\n return { error: result };\n }\n\n const [newContent, occurrences] = result;\n const newFileData = updateFileData(fileData, newContent);\n\n // Update file in store\n const storeValue = this.convertFileDataToStoreValue(newFileData);\n await store.put(namespace, filePath, storeValue);\n return { path: filePath, filesUpdate: null, occurrences: occurrences };\n } catch (e: any) {\n return { error: `Error: ${e.message}` };\n }\n }\n\n /**\n * Structured search results or error string for invalid input.\n */\n async grepRaw(\n pattern: string,\n path: string = \"/\",\n glob: string | null = null,\n ): Promise<GrepMatch[] | string> {\n const store = this.getStore();\n const namespace = this.getNamespace();\n const items = await this.searchStorePaginated(store, namespace);\n\n const files: Record<string, FileData> = {};\n for (const item of items) {\n try {\n files[item.key] = this.convertStoreItemToFileData(item);\n } catch {\n // Skip invalid items\n continue;\n }\n }\n\n return grepMatchesFromFiles(files, pattern, path, glob);\n }\n\n /**\n * Structured glob matching returning FileInfo objects.\n */\n async globInfo(pattern: string, path: string = \"/\"): Promise<FileInfo[]> {\n const store = this.getStore();\n const namespace = this.getNamespace();\n const items = await this.searchStorePaginated(store, namespace);\n\n const files: Record<string, FileData> = {};\n for (const item of items) {\n try {\n files[item.key] = this.convertStoreItemToFileData(item);\n } catch {\n // Skip invalid items\n continue;\n }\n }\n\n const result = globSearchFiles(files, pattern, path);\n if (result === \"No files found\") {\n return [];\n }\n\n const paths = result.split(\"\\n\");\n const infos: FileInfo[] = [];\n for (const p of paths) {\n const fd = files[p];\n const size = fd ? fd.content.join(\"\\n\").length : 0;\n infos.push({\n path: p,\n is_dir: false,\n size: size,\n modified_at: fd?.modified_at || \"\",\n });\n }\n return infos;\n }\n}\n","/**\n * FilesystemBackend: Read and write files directly from the filesystem.\n *\n * Security and search upgrades:\n * - Secure path resolution with root containment when in virtual_mode (sandboxed to cwd)\n * - Prevent symlink-following on file I/O using O_NOFOLLOW when available\n * - Ripgrep-powered grep with JSON parsing, plus regex fallback\n * and optional glob include filtering, while preserving virtual path behavior\n */\n\nimport * as fs from \"fs/promises\";\nimport * as fsSync from \"fs\";\nimport * as path from \"path\";\nimport { spawn } from \"child_process\";\nimport fg from \"fast-glob\";\nimport micromatch from \"micromatch\";\nimport type {\n BackendProtocol,\n EditResult,\n FileData,\n FileInfo,\n GrepMatch,\n WriteResult,\n} from \"./protocol.js\";\nimport {\n checkEmptyContent,\n formatContentWithLineNumbers,\n performStringReplacement,\n} from \"./utils.js\";\n\nconst SUPPORTS_NOFOLLOW = fsSync.constants.O_NOFOLLOW !== undefined;\n\n/**\n * Backend that reads and writes files directly from the filesystem.\n *\n * Files are accessed using their actual filesystem paths. Relative paths are\n * resolved relative to the current working directory. Content is read/written\n * as plain text, and metadata (timestamps) are derived from filesystem stats.\n */\nexport class FilesystemBackend implements BackendProtocol {\n private cwd: string;\n private virtualMode: boolean;\n private maxFileSizeBytes: number;\n\n constructor(\n options: {\n rootDir?: string;\n virtualMode?: boolean;\n maxFileSizeMb?: number;\n } = {}\n ) {\n const { rootDir, virtualMode = false, maxFileSizeMb = 10 } = options;\n this.cwd = rootDir ? path.resolve(rootDir) : process.cwd();\n this.virtualMode = virtualMode;\n this.maxFileSizeBytes = maxFileSizeMb * 1024 * 1024;\n }\n\n /**\n * Resolve a file path with security checks.\n *\n * When virtualMode=true, treat incoming paths as virtual absolute paths under\n * this.cwd, disallow traversal (.., ~) and ensure resolved path stays within root.\n * When virtualMode=false, preserve legacy behavior: absolute paths are allowed\n * as-is; relative paths resolve under cwd.\n *\n * @param key - File path (absolute, relative, or virtual when virtualMode=true)\n * @returns Resolved absolute path string\n * @throws Error if path traversal detected or path outside root\n */\n private resolvePath(key: string): string {\n if (this.virtualMode) {\n const vpath = key.startsWith(\"/\") ? key : \"/\" + key;\n if (vpath.includes(\"..\") || vpath.startsWith(\"~\")) {\n throw new Error(\"Path traversal not allowed\");\n }\n const full = path.resolve(this.cwd, vpath.substring(1));\n const relative = path.relative(this.cwd, full);\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(`Path: ${full} outside root directory: ${this.cwd}`);\n }\n return full;\n }\n\n if (path.isAbsolute(key)) {\n return key;\n }\n return path.resolve(this.cwd, key);\n }\n\n /**\n * List files and directories in the specified directory (non-recursive).\n *\n * @param dirPath - Absolute directory path to list files from\n * @returns List of FileInfo objects for files and directories directly in the directory.\n * Directories have a trailing / in their path and is_dir=true.\n */\n async lsInfo(dirPath: string): Promise<FileInfo[]> {\n try {\n const resolvedPath = this.resolvePath(dirPath);\n const stat = await fs.stat(resolvedPath);\n\n if (!stat.isDirectory()) {\n return [];\n }\n\n const entries = await fs.readdir(resolvedPath, { withFileTypes: true });\n const results: FileInfo[] = [];\n\n const cwdStr = this.cwd.endsWith(path.sep)\n ? this.cwd\n : this.cwd + path.sep;\n\n for (const entry of entries) {\n const fullPath = path.join(resolvedPath, entry.name);\n\n try {\n const entryStat = await fs.stat(fullPath);\n const isFile = entryStat.isFile();\n const isDir = entryStat.isDirectory();\n\n if (!this.virtualMode) {\n // Non-virtual mode: use absolute paths\n if (isFile) {\n results.push({\n path: fullPath,\n is_dir: false,\n size: entryStat.size,\n modified_at: entryStat.mtime.toISOString(),\n });\n } else if (isDir) {\n results.push({\n path: fullPath + path.sep,\n is_dir: true,\n size: 0,\n modified_at: entryStat.mtime.toISOString(),\n });\n }\n } else {\n let relativePath: string;\n if (fullPath.startsWith(cwdStr)) {\n relativePath = fullPath.substring(cwdStr.length);\n } else if (fullPath.startsWith(this.cwd)) {\n relativePath = fullPath\n .substring(this.cwd.length)\n .replace(/^[/\\\\]/, \"\");\n } else {\n relativePath = fullPath;\n }\n\n relativePath = relativePath.split(path.sep).join(\"/\");\n const virtPath = \"/\" + relativePath;\n\n if (isFile) {\n results.push({\n path: virtPath,\n is_dir: false,\n size: entryStat.size,\n modified_at: entryStat.mtime.toISOString(),\n });\n } else if (isDir) {\n results.push({\n path: virtPath + \"/\",\n is_dir: true,\n size: 0,\n modified_at: entryStat.mtime.toISOString(),\n });\n }\n }\n } catch {\n // Skip entries we can't stat\n continue;\n }\n }\n\n results.sort((a, b) => a.path.localeCompare(b.path));\n return results;\n } catch (e: any) {\n console.error(`Error listing files in ${dirPath}:`, e);\n return [];\n }\n }\n\n /**\n * Read file content with line numbers.\n *\n * @param filePath - Absolute or relative file path\n * @param offset - Line offset to start reading from (0-indexed)\n * @param limit - Maximum number of lines to read\n * @returns Formatted file content with line numbers, or error message\n */\n async read(\n filePath: string,\n offset: number = 0,\n limit: number = 2000\n ): Promise<string> {\n try {\n const resolvedPath = this.resolvePath(filePath);\n\n let content: string;\n\n if (SUPPORTS_NOFOLLOW) {\n const stat = await fs.stat(resolvedPath);\n if (!stat.isFile()) {\n return `Error: File '${filePath}' not found`;\n }\n const fd = await fs.open(\n resolvedPath,\n fsSync.constants.O_RDONLY | fsSync.constants.O_NOFOLLOW\n );\n try {\n content = await fd.readFile({ encoding: \"utf-8\" });\n } finally {\n await fd.close();\n }\n } else {\n const stat = await fs.lstat(resolvedPath);\n if (stat.isSymbolicLink()) {\n return `Error: Symlinks are not allowed: ${filePath}`;\n }\n if (!stat.isFile()) {\n return `Error: File '${filePath}' not found`;\n }\n content = await fs.readFile(resolvedPath, \"utf-8\");\n }\n\n const emptyMsg = checkEmptyContent(content);\n if (emptyMsg) {\n return emptyMsg;\n }\n\n const lines = content.split(\"\\n\");\n const startIdx = offset;\n const endIdx = Math.min(startIdx + limit, lines.length);\n\n if (startIdx >= lines.length) {\n return `Error: Line offset ${offset} exceeds file length (${lines.length} lines)`;\n }\n\n const selectedLines = lines.slice(startIdx, endIdx);\n return formatContentWithLineNumbers(selectedLines, startIdx + 1);\n } catch (e: any) {\n return `Error reading file '${filePath}': ${e.message}`;\n }\n }\n\n /**\n * Read file content as raw FileData.\n *\n * @param filePath - Absolute file path\n * @returns Raw file content as FileData\n */\n async readRaw(filePath: string): Promise<FileData> {\n const resolvedPath = this.resolvePath(filePath);\n\n let content: string;\n let stat: fsSync.Stats;\n\n if (SUPPORTS_NOFOLLOW) {\n stat = await fs.stat(resolvedPath);\n if (!stat.isFile()) throw new Error(`File '${filePath}' not found`);\n const fd = await fs.open(\n resolvedPath,\n fsSync.constants.O_RDONLY | fsSync.constants.O_NOFOLLOW\n );\n try {\n content = await fd.readFile({ encoding: \"utf-8\" });\n } finally {\n await fd.close();\n }\n } else {\n stat = await fs.lstat(resolvedPath);\n if (stat.isSymbolicLink()) {\n throw new Error(`Symlinks are not allowed: ${filePath}`);\n }\n if (!stat.isFile()) throw new Error(`File '${filePath}' not found`);\n content = await fs.readFile(resolvedPath, \"utf-8\");\n }\n\n return {\n content: content.split(\"\\n\"),\n created_at: stat.ctime.toISOString(),\n modified_at: stat.mtime.toISOString(),\n };\n }\n\n /**\n * Create a new file with content.\n * Returns WriteResult. External storage sets filesUpdate=null.\n */\n async write(filePath: string, content: string): Promise<WriteResult> {\n try {\n const resolvedPath = this.resolvePath(filePath);\n\n try {\n const stat = await fs.lstat(resolvedPath);\n if (stat.isSymbolicLink()) {\n return {\n error: `Cannot write to ${filePath} because it is a symlink. Symlinks are not allowed.`,\n };\n }\n return {\n error: `Cannot write to ${filePath} because it already exists. Read and then make an edit, or write to a new path.`,\n };\n } catch {\n // File doesn't exist, good to proceed\n }\n\n await fs.mkdir(path.dirname(resolvedPath), { recursive: true });\n\n if (SUPPORTS_NOFOLLOW) {\n const flags =\n fsSync.constants.O_WRONLY |\n fsSync.constants.O_CREAT |\n fsSync.constants.O_TRUNC |\n fsSync.constants.O_NOFOLLOW;\n\n const fd = await fs.open(resolvedPath, flags, 0o644);\n try {\n await fd.writeFile(content, \"utf-8\");\n } finally {\n await fd.close();\n }\n } else {\n await fs.writeFile(resolvedPath, content, \"utf-8\");\n }\n\n return { path: filePath, filesUpdate: null };\n } catch (e: any) {\n return { error: `Error writing file '${filePath}': ${e.message}` };\n }\n }\n\n /**\n * Edit a file by replacing string occurrences.\n * Returns EditResult. External storage sets filesUpdate=null.\n */\n async edit(\n filePath: string,\n oldString: string,\n newString: string,\n replaceAll: boolean = false\n ): Promise<EditResult> {\n try {\n const resolvedPath = this.resolvePath(filePath);\n\n let content: string;\n\n if (SUPPORTS_NOFOLLOW) {\n const stat = await fs.stat(resolvedPath);\n if (!stat.isFile()) {\n return { error: `Error: File '${filePath}' not found` };\n }\n\n const fd = await fs.open(\n resolvedPath,\n fsSync.constants.O_RDONLY | fsSync.constants.O_NOFOLLOW\n );\n try {\n content = await fd.readFile({ encoding: \"utf-8\" });\n } finally {\n await fd.close();\n }\n } else {\n const stat = await fs.lstat(resolvedPath);\n if (stat.isSymbolicLink()) {\n return { error: `Error: Symlinks are not allowed: ${filePath}` };\n }\n if (!stat.isFile()) {\n return { error: `Error: File '${filePath}' not found` };\n }\n content = await fs.readFile(resolvedPath, \"utf-8\");\n }\n\n const result = performStringReplacement(\n content,\n oldString,\n newString,\n replaceAll\n );\n\n if (typeof result === \"string\") {\n return { error: result };\n }\n\n const [newContent, occurrences] = result;\n\n // Write securely\n if (SUPPORTS_NOFOLLOW) {\n const flags =\n fsSync.constants.O_WRONLY |\n fsSync.constants.O_TRUNC |\n fsSync.constants.O_NOFOLLOW;\n\n const fd = await fs.open(resolvedPath, flags);\n try {\n await fd.writeFile(newContent, \"utf-8\");\n } finally {\n await fd.close();\n }\n } else {\n await fs.writeFile(resolvedPath, newContent, \"utf-8\");\n }\n\n return { path: filePath, filesUpdate: null, occurrences: occurrences };\n } catch (e: any) {\n return { error: `Error editing file '${filePath}': ${e.message}` };\n }\n }\n\n /**\n * Structured search results or error string for invalid input.\n */\n async grepRaw(\n pattern: string,\n dirPath: string = \"/\",\n glob: string | null = null\n ): Promise<GrepMatch[] | string> {\n // Validate regex\n try {\n new RegExp(pattern);\n } catch (e: any) {\n return `Invalid regex pattern: ${e.message}`;\n }\n\n // Resolve base path\n let baseFull: string;\n try {\n baseFull = this.resolvePath(dirPath || \".\");\n } catch {\n return [];\n }\n\n try {\n await fs.stat(baseFull);\n } catch {\n return [];\n }\n\n // Try ripgrep first, fallback to regex search\n let results = await this.ripgrepSearch(pattern, baseFull, glob);\n if (results === null) {\n results = await this.pythonSearch(pattern, baseFull, glob);\n }\n\n const matches: GrepMatch[] = [];\n for (const [fpath, items] of Object.entries(results)) {\n for (const [lineNum, lineText] of items) {\n matches.push({ path: fpath, line: lineNum, text: lineText });\n }\n }\n return matches;\n }\n\n /**\n * Try to use ripgrep for fast searching.\n * Returns null if ripgrep is not available or fails.\n */\n private async ripgrepSearch(\n pattern: string,\n baseFull: string,\n includeGlob: string | null\n ): Promise<Record<string, Array<[number, string]>> | null> {\n return new Promise((resolve) => {\n const args = [\"--json\"];\n if (includeGlob) {\n args.push(\"--glob\", includeGlob);\n }\n args.push(\"--\", pattern, baseFull);\n\n const proc = spawn(\"rg\", args, { timeout: 30000 });\n const results: Record<string, Array<[number, string]>> = {};\n let output = \"\";\n\n proc.stdout.on(\"data\", (data) => {\n output += data.toString();\n });\n\n proc.on(\"close\", (code) => {\n if (code !== 0 && code !== 1) {\n // Error (code 1 means no matches, which is ok)\n resolve(null);\n return;\n }\n\n for (const line of output.split(\"\\n\")) {\n if (!line.trim()) continue;\n try {\n const data = JSON.parse(line);\n if (data.type !== \"match\") continue;\n\n const pdata = data.data || {};\n const ftext = pdata.path?.text;\n if (!ftext) continue;\n\n let virtPath: string;\n if (this.virtualMode) {\n try {\n const resolved = path.resolve(ftext);\n const relative = path.relative(this.cwd, resolved);\n if (relative.startsWith(\"..\")) continue;\n const normalizedRelative = relative.split(path.sep).join(\"/\");\n virtPath = \"/\" + normalizedRelative;\n } catch {\n continue;\n }\n } else {\n virtPath = ftext;\n }\n\n const ln = pdata.line_number;\n const lt = pdata.lines?.text?.replace(/\\n$/, \"\") || \"\";\n if (ln === undefined) continue;\n\n if (!results[virtPath]) {\n results[virtPath] = [];\n }\n results[virtPath].push([ln, lt]);\n } catch {\n // Skip invalid JSON\n continue;\n }\n }\n\n resolve(results);\n });\n\n proc.on(\"error\", () => {\n resolve(null);\n });\n });\n }\n\n /**\n * Fallback regex search implementation.\n */\n private async pythonSearch(\n pattern: string,\n baseFull: string,\n includeGlob: string | null\n ): Promise<Record<string, Array<[number, string]>>> {\n let regex: RegExp;\n try {\n regex = new RegExp(pattern);\n } catch {\n return {};\n }\n\n const results: Record<string, Array<[number, string]>> = {};\n const stat = await fs.stat(baseFull);\n const root = stat.isDirectory() ? baseFull : path.dirname(baseFull);\n\n // Use fast-glob to recursively find all files\n const files = await fg(\"**/*\", {\n cwd: root,\n absolute: true,\n onlyFiles: true,\n dot: true,\n });\n\n for (const fp of files) {\n try {\n // Filter by glob if provided\n if (\n includeGlob &&\n !micromatch.isMatch(path.basename(fp), includeGlob)\n ) {\n continue;\n }\n\n // Check file size\n const stat = await fs.stat(fp);\n if (stat.size > this.maxFileSizeBytes) {\n continue;\n }\n\n // Read and search\n const content = await fs.readFile(fp, \"utf-8\");\n const lines = content.split(\"\\n\");\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (regex.test(line)) {\n let virtPath: string;\n if (this.virtualMode) {\n try {\n const relative = path.relative(this.cwd, fp);\n if (relative.startsWith(\"..\")) continue;\n const normalizedRelative = relative.split(path.sep).join(\"/\");\n virtPath = \"/\" + normalizedRelative;\n } catch {\n continue;\n }\n } else {\n virtPath = fp;\n }\n\n if (!results[virtPath]) {\n results[virtPath] = [];\n }\n results[virtPath].push([i + 1, line]);\n }\n }\n } catch {\n // Skip files we can't read\n continue;\n }\n }\n\n return results;\n }\n\n /**\n * Structured glob matching returning FileInfo objects.\n */\n async globInfo(\n pattern: string,\n searchPath: string = \"/\"\n ): Promise<FileInfo[]> {\n if (pattern.startsWith(\"/\")) {\n pattern = pattern.substring(1);\n }\n\n const resolvedSearchPath =\n searchPath === \"/\" ? this.cwd : this.resolvePath(searchPath);\n\n try {\n const stat = await fs.stat(resolvedSearchPath);\n if (!stat.isDirectory()) {\n return [];\n }\n } catch {\n return [];\n }\n\n const results: FileInfo[] = [];\n\n try {\n // Use fast-glob for pattern matching\n const matches = await fg(pattern, {\n cwd: resolvedSearchPath,\n absolute: true,\n onlyFiles: true,\n dot: true,\n });\n\n for (const matchedPath of matches) {\n try {\n const stat = await fs.stat(matchedPath);\n if (!stat.isFile()) continue;\n\n // Normalize fast-glob paths to platform separators\n // fast-glob returns forward slashes on all platforms, but we need\n // platform-native separators for path comparisons on Windows\n const normalizedPath = matchedPath.split(\"/\").join(path.sep);\n\n if (!this.virtualMode) {\n results.push({\n path: normalizedPath,\n is_dir: false,\n size: stat.size,\n modified_at: stat.mtime.toISOString(),\n });\n } else {\n const cwdStr = this.cwd.endsWith(path.sep)\n ? this.cwd\n : this.cwd + path.sep;\n let relativePath: string;\n\n if (normalizedPath.startsWith(cwdStr)) {\n relativePath = normalizedPath.substring(cwdStr.length);\n } else if (normalizedPath.startsWith(this.cwd)) {\n relativePath = normalizedPath\n .substring(this.cwd.length)\n .replace(/^[/\\\\]/, \"\");\n } else {\n relativePath = normalizedPath;\n }\n\n relativePath = relativePath.split(path.sep).join(\"/\");\n const virt = \"/\" + relativePath;\n results.push({\n path: virt,\n is_dir: false,\n size: stat.size,\n modified_at: stat.mtime.toISOString(),\n });\n }\n } catch {\n // Skip files we can't stat\n continue;\n }\n }\n } catch {\n // Ignore glob errors\n }\n\n results.sort((a, b) => a.path.localeCompare(b.path));\n return results;\n }\n}\n","/**\n * CompositeBackend: Route operations to different backends based on path prefix.\n */\n\nimport type {\n BackendProtocol,\n EditResult,\n FileData,\n FileInfo,\n GrepMatch,\n WriteResult,\n} from \"./protocol.js\";\n\n/**\n * Backend that routes file operations to different backends based on path prefix.\n *\n * This enables hybrid storage strategies like:\n * - `/memories/` → StoreBackend (persistent, cross-thread)\n * - Everything else → StateBackend (ephemeral, per-thread)\n *\n * The CompositeBackend handles path prefix stripping/re-adding transparently.\n */\nexport class CompositeBackend implements BackendProtocol {\n private default: BackendProtocol;\n private routes: Record<string, BackendProtocol>;\n private sortedRoutes: Array<[string, BackendProtocol]>;\n\n constructor(\n defaultBackend: BackendProtocol,\n routes: Record<string, BackendProtocol>,\n ) {\n this.default = defaultBackend;\n this.routes = routes;\n\n // Sort routes by length (longest first) for correct prefix matching\n this.sortedRoutes = Object.entries(routes).sort(\n (a, b) => b[0].length - a[0].length,\n );\n }\n\n /**\n * Determine which backend handles this key and strip prefix.\n *\n * @param key - Original file path\n * @returns Tuple of [backend, stripped_key] where stripped_key has the route\n * prefix removed (but keeps leading slash).\n */\n private getBackendAndKey(key: string): [BackendProtocol, string] {\n // Check routes in order of length (longest first)\n for (const [prefix, backend] of this.sortedRoutes) {\n if (key.startsWith(prefix)) {\n // Strip full prefix and ensure a leading slash remains\n // e.g., \"/memories/notes.txt\" → \"/notes.txt\"; \"/memories/\" → \"/\"\n const suffix = key.substring(prefix.length);\n const strippedKey = suffix ? \"/\" + suffix : \"/\";\n return [backend, strippedKey];\n }\n }\n\n return [this.default, key];\n }\n\n /**\n * List files and directories in the specified directory (non-recursive).\n *\n * @param path - Absolute path to directory\n * @returns List of FileInfo objects with route prefixes added, for files and directories\n * directly in the directory. Directories have a trailing / in their path and is_dir=true.\n */\n async lsInfo(path: string): Promise<FileInfo[]> {\n // Check if path matches a specific route\n for (const [routePrefix, backend] of this.sortedRoutes) {\n if (path.startsWith(routePrefix.replace(/\\/$/, \"\"))) {\n // Query only the matching routed backend\n const suffix = path.substring(routePrefix.length);\n const searchPath = suffix ? \"/\" + suffix : \"/\";\n const infos = await backend.lsInfo(searchPath);\n\n // Add route prefix back to paths\n const prefixed: FileInfo[] = [];\n for (const fi of infos) {\n prefixed.push({\n ...fi,\n path: routePrefix.slice(0, -1) + fi.path,\n });\n }\n return prefixed;\n }\n }\n\n // At root, aggregate default and all routed backends\n if (path === \"/\") {\n const results: FileInfo[] = [];\n const defaultInfos = await this.default.lsInfo(path);\n results.push(...defaultInfos);\n\n // Add the route itself as a directory (e.g., /memories/)\n for (const [routePrefix] of this.sortedRoutes) {\n results.push({\n path: routePrefix,\n is_dir: true,\n size: 0,\n modified_at: \"\",\n });\n }\n\n results.sort((a, b) => a.path.localeCompare(b.path));\n return results;\n }\n\n // Path doesn't match a route: query only default backend\n return await this.default.lsInfo(path);\n }\n\n /**\n * Read file content, routing to appropriate backend.\n *\n * @param filePath - Absolute file path\n * @param offset - Line offset to start reading from (0-indexed)\n * @param limit - Maximum number of lines to read\n * @returns Formatted file content with line numbers, or error message\n */\n async read(\n filePath: string,\n offset: number = 0,\n limit: number = 2000,\n ): Promise<string> {\n const [backend, strippedKey] = this.getBackendAndKey(filePath);\n return await backend.read(strippedKey, offset, limit);\n }\n\n /**\n * Read file content as raw FileData.\n *\n * @param filePath - Absolute file path\n * @returns Raw file content as FileData\n */\n async readRaw(filePath: string): Promise<FileData> {\n const [backend, strippedKey] = this.getBackendAndKey(filePath);\n return await backend.readRaw(strippedKey);\n }\n\n /**\n * Structured search results or error string for invalid input.\n */\n async grepRaw(\n pattern: string,\n path: string = \"/\",\n glob: string | null = null,\n ): Promise<GrepMatch[] | string> {\n // If path targets a specific route, search only that backend\n for (const [routePrefix, backend] of this.sortedRoutes) {\n if (path.startsWith(routePrefix.replace(/\\/$/, \"\"))) {\n const searchPath = path.substring(routePrefix.length - 1);\n const raw = await backend.grepRaw(pattern, searchPath || \"/\", glob);\n\n if (typeof raw === \"string\") {\n return raw;\n }\n\n // Add route prefix back\n return raw.map((m) => ({\n ...m,\n path: routePrefix.slice(0, -1) + m.path,\n }));\n }\n }\n\n // Otherwise, search default and all routed backends and merge\n const allMatches: GrepMatch[] = [];\n const rawDefault = await this.default.grepRaw(pattern, path, glob);\n\n if (typeof rawDefault === \"string\") {\n return rawDefault;\n }\n\n allMatches.push(...rawDefault);\n\n // Search all routes\n for (const [routePrefix, backend] of Object.entries(this.routes)) {\n const raw = await backend.grepRaw(pattern, \"/\", glob);\n\n if (typeof raw === \"string\") {\n return raw;\n }\n\n // Add route prefix back\n allMatches.push(\n ...raw.map((m) => ({\n ...m,\n path: routePrefix.slice(0, -1) + m.path,\n })),\n );\n }\n\n return allMatches;\n }\n\n /**\n * Structured glob matching returning FileInfo objects.\n */\n async globInfo(pattern: string, path: string = \"/\"): Promise<FileInfo[]> {\n const results: FileInfo[] = [];\n\n // Route based on path, not pattern\n for (const [routePrefix, backend] of this.sortedRoutes) {\n if (path.startsWith(routePrefix.replace(/\\/$/, \"\"))) {\n const searchPath = path.substring(routePrefix.length - 1);\n const infos = await backend.globInfo(pattern, searchPath || \"/\");\n\n // Add route prefix back\n return infos.map((fi) => ({\n ...fi,\n path: routePrefix.slice(0, -1) + fi.path,\n }));\n }\n }\n\n // Path doesn't match any specific route - search default backend AND all routed backends\n const defaultInfos = await this.default.globInfo(pattern, path);\n results.push(...defaultInfos);\n\n for (const [routePrefix, backend] of Object.entries(this.routes)) {\n const infos = await backend.globInfo(pattern, \"/\");\n results.push(\n ...infos.map((fi) => ({\n ...fi,\n path: routePrefix.slice(0, -1) + fi.path,\n })),\n );\n }\n\n // Deterministic ordering\n results.sort((a, b) => a.path.localeCompare(b.path));\n return results;\n }\n\n /**\n * Create a new file, routing to appropriate backend.\n *\n * @param filePath - Absolute file path\n * @param content - File content as string\n * @returns WriteResult with path or error\n */\n async write(filePath: string, content: string): Promise<WriteResult> {\n const [backend, strippedKey] = this.getBackendAndKey(filePath);\n return await backend.write(strippedKey, content);\n }\n\n /**\n * Edit a file, routing to appropriate backend.\n *\n * @param filePath - Absolute file path\n * @param oldString - String to find and replace\n * @param newString - Replacement string\n * @param replaceAll - If true, replace all occurrences\n * @returns EditResult with path, occurrences, or error\n */\n async edit(\n filePath: string,\n oldString: string,\n newString: string,\n replaceAll: boolean = false,\n ): Promise<EditResult> {\n const [backend, strippedKey] = this.getBackendAndKey(filePath);\n return await backend.edit(strippedKey, oldString, newString, replaceAll);\n }\n}\n","/**\n * MemoryBackend: In-memory file storage backend.\n *\n * Stores files in a shared Map instance. Useful for sharing file state\n * across multiple agents within the same process (e.g., team members).\n *\n * All operations are synchronous and use in-memory storage.\n */\n\nimport type {\n BackendProtocol,\n EditResult,\n FileData,\n FileInfo,\n GrepMatch,\n WriteResult,\n} from \"./protocol.js\";\nimport {\n createFileData,\n fileDataToString,\n formatReadResponse,\n globSearchFiles,\n grepMatchesFromFiles,\n performStringReplacement,\n updateFileData,\n} from \"./utils.js\";\n\nexport class MemoryBackend implements BackendProtocol {\n private files: Map<string, FileData>;\n\n constructor(files?: Map<string, FileData>) {\n this.files = files ?? new Map();\n }\n\n private getFiles(): Record<string, FileData> {\n return Object.fromEntries(this.files);\n }\n\n lsInfo(path: string): FileInfo[] {\n const files = this.getFiles();\n const infos: FileInfo[] = [];\n const subdirs = new Set<string>();\n\n const normalizedPath = path.endsWith(\"/\") ? path : path + \"/\";\n\n for (const [k, fd] of Object.entries(files)) {\n if (!k.startsWith(normalizedPath)) {\n continue;\n }\n\n const relative = k.substring(normalizedPath.length);\n\n if (relative.includes(\"/\")) {\n const subdirName = relative.split(\"/\")[0];\n subdirs.add(normalizedPath + subdirName + \"/\");\n continue;\n }\n\n const size = fd.content.join(\"\\n\").length;\n infos.push({\n path: k,\n is_dir: false,\n size: size,\n modified_at: fd.modified_at,\n });\n }\n\n for (const subdir of Array.from(subdirs).sort()) {\n infos.push({\n path: subdir,\n is_dir: true,\n size: 0,\n modified_at: \"\",\n });\n }\n\n infos.sort((a, b) => a.path.localeCompare(b.path));\n return infos;\n }\n\n read(filePath: string, offset: number = 0, limit: number = 2000): string {\n const files = this.getFiles();\n const fileData = files[filePath];\n\n if (!fileData) {\n return `Error: File '${filePath}' not found`;\n }\n\n return formatReadResponse(fileData, offset, limit);\n }\n\n readRaw(filePath: string): FileData {\n const fileData = this.files.get(filePath);\n\n if (!fileData) {\n throw new Error(`File '${filePath}' not found`);\n }\n\n return fileData;\n }\n\n write(filePath: string, content: string): WriteResult {\n if (this.files.has(filePath)) {\n return {\n error: `Cannot write to ${filePath} because it already exists. Read and then make an edit, or write to a new path.`,\n };\n }\n\n const newFileData = createFileData(content);\n this.files.set(filePath, newFileData);\n return { path: filePath, filesUpdate: null };\n }\n\n edit(\n filePath: string,\n oldString: string,\n newString: string,\n replaceAll: boolean = false,\n ): EditResult {\n const fileData = this.files.get(filePath);\n\n if (!fileData) {\n return { error: `Error: File '${filePath}' not found` };\n }\n\n const content = fileDataToString(fileData);\n const result = performStringReplacement(\n content,\n oldString,\n newString,\n replaceAll,\n );\n\n if (typeof result === \"string\") {\n return { error: result };\n }\n\n const [newContent, occurrences] = result;\n const newFileData = updateFileData(fileData, newContent);\n this.files.set(filePath, newFileData);\n return { path: filePath, filesUpdate: null, occurrences };\n }\n\n grepRaw(\n pattern: string,\n path: string = \"/\",\n glob: string | null = null,\n ): GrepMatch[] | string {\n const files = this.getFiles();\n return grepMatchesFromFiles(files, pattern, path, glob);\n }\n\n globInfo(pattern: string, path: string = \"/\"): FileInfo[] {\n const files = this.getFiles();\n const result = globSearchFiles(files, pattern, path);\n\n if (result === \"No files found\") {\n return [];\n }\n\n const paths = result.split(\"\\n\");\n const infos: FileInfo[] = [];\n for (const p of paths) {\n const fd = files[p];\n const size = fd ? fd.content.join(\"\\n\").length : 0;\n infos.push({\n path: p,\n is_dir: false,\n size: size,\n modified_at: fd?.modified_at || \"\",\n });\n }\n return infos;\n }\n}\n","import { Command } from \"@langchain/langgraph\";\nimport { z } from \"zod\";\nimport { createMiddleware, tool, ToolMessage } from \"langchain\";\nimport { genUIMarkdown } from \"../../util/genUIMarkdown\";\n\nconst WRITE_TODOS_DESCRIPTION = `Use this tool to create and manage a structured task list for your current work session. This helps you track progress, organize complex tasks, and demonstrate thoroughness to the user.\nIt also helps the user understand the progress of the task and overall progress of their requests.\nOnly use this tool if you think it will be helpful in staying organized. If the user's request is trivial and takes less than 3 steps, it is better to NOT use this tool and just do the taks directly.\n\n## When to Use This Tool\nUse this tool in these scenarios:\n\n1. Complex multi-step tasks - When a task requires 3 or more distinct steps or actions\n2. Non-trivial and complex tasks - Tasks that require careful planning or multiple operations\n3. User explicitly requests todo list - When the user directly asks you to use the todo list\n4. User provides multiple tasks - When users provide a list of things to be done (numbered or comma-separated)\n5. The plan may need future revisions or updates based on results from the first few steps. Keeping track of this in a list is helpful.\n\n## How to Use This Tool\n1. When you start working on a task - Mark it as in_progress BEFORE beginning work.\n2. After completing a task - Mark it as completed and add any new follow-up tasks discovered during implementation.\n3. You can also update future tasks, such as deleting them if they are no longer necessary, or adding new tasks that are necessary. Don't change previously completed tasks.\n4. You can make several updates to the todo list at once. For example, when you complete a task, you can mark the next task you need to start as in_progress.\n\n## When NOT to Use This Tool\nIt is important to skip using this tool when:\n1. There is only a single, straightforward task\n2. The task is trivial and tracking it provides no benefit\n3. The task can be completed in less than 3 trivial steps\n4. The task is purely conversational or informational\n\n## Examples of When to Use the Todo List\n\n<example>\nUser: I want to add a dark mode toggle to the application settings. Make sure you run the tests and build when you're done!\nAssistant: I'll help add a dark mode toggle to your application settings. Let me create a todo list to track this implementation.\n*Creates todo list with the following items:*\n1. Create dark mode toggle component in Settings page\n2. Add dark mode state management (context/store)\n3. Implement CSS-in-JS styles for dark theme\n4. Update existing components to support theme switching\n5. Run tests and build process, addressing any failures or errors that occur\n*Begins working on the first task*\n\n<reasoning>\nThe assistant used the todo list because:\n1. Adding dark mode in it of itself is a multi-step feature requiring UI, state management, and styling changes\n2. The assistant inferred that tests and build need to pass by adding \"Ensure tests and build succeed\" as the final task\n3. Both of the user's requests are complex and require multiple steps to complete.\n</reasoning>\n</example>\n\n<example>\nUser: Help me plan a comprehensive marketing campaign for our new product launch, including social media, email marketing, and press releases.\nAssistant: I'll help you plan a comprehensive marketing campaign for your product launch. Let me create a todo list to organize all the components.\n*Creates todo list with the following items:*\n1. Define target audience and key messaging\n2. Create social media content calendar and posting schedule\n3. Design email marketing sequence and automation flows\n4. Draft press release and identify media contacts\n5. Set up tracking and analytics for campaign performance\n6. Create visual assets and brand materials\n7. Coordinate launch timeline and deliverables\n*Begins working on the first task*\n\n<reasoning>\nThe assistant used the todo list because:\n1. Marketing campaign planning involves multiple distinct channels and activities\n2. Each component requires careful coordination and planning\n3. The systematic approach ensures all aspects of the launch are covered\n</reasoning>\n</example>\n\n<example>\nUser: Help me rename the function getCwd to getCurrentWorkingDirectory across my project\nAssistant: Let me first search through your codebase to find all occurrences of 'getCwd'.\n*Uses search tools to locate all instances of getCwd in the codebase*\nAssistant: I've found 15 instances of 'getCwd' across 8 different files. Let me create a todo list to track these changes.\n*Creates todo list with specific items for each file that needs updating*\n\n<reasoning>\nThe assistant used the todo list because:\n1. The assistant searched to understand the scope of the task\n2. Upon finding multiple occurrences across different files, it determined this was a complex task with multiple steps (>3)\n3. The todo list helps ensure every instance is tracked and updated systematically\n4. This approach prevents missing any occurrences and maintains consistency.\n</reasoning>\n</example>\n\n<example>\nUser: I need help organizing my home office: decluttering the desk, setting up a filing system, organizing digital files, and creating a daily workflow.\nAssistant: I'll help you organize your home office systematically. Let me create a todo list to track each area of organization.\n*Creates todo list with items like: 1) Sort and declutter desk items, 2) Set up physical filing system for documents, 3) Organize digital files and folders, 4) Create daily workflow and productivity systems, 5) Establish maintenance routines*\nLet's start with decluttering your desk space to create a clean foundation for the other organizational systems.\n\n<reasoning>\nThe assistant used the todo list because:\n1. The user provided multiple distinct organizational tasks\n2. Each area requires different approaches and careful planning\n3. Home organization benefits from systematic, step-by-step completion\n4. Progress tracking ensures all areas are addressed thoroughly\n</reasoning>\n</example>\n\n## Examples of When NOT to Use the Todo List\n\n<example>\nUser: How do I print 'Hello World' in Python?\nAssistant: In Python, you can print \"Hello World\" with this simple code:\n\n\\`\\`\\`python\nprint(\"Hello World\")\n\\`\\`\\`\n\nThis will output the text \"Hello World\" to the console when executed.</assistant>\n\n<reasoning>\nThe assistant did not use the todo list because this is a single, trivial task that can be completed in one step. There's no need to track multiple tasks or steps for such a straightforward request.\n</reasoning>\n</example>\n\n<example>\nUser: What's the best way to water houseplants?\nAssistant: The best way to water houseplants depends on the specific plant type, but here are some general guidelines:\n\n- Check soil moisture by inserting your finger about 1-2 inches into the soil\n- Water thoroughly when the top inch feels dry, allowing water to drain from the bottom\n- Use room temperature water and water in the morning when possible\n- Avoid overwatering, which is more harmful than underwatering for most plants\n\nDifferent plants have different needs, so it's important to research your specific varieties for optimal care.\n\n<reasoning>\nThe assistant did not use the todo list because this is an informational request with no actual tasks to complete. The user is simply asking for advice and explanation, not for the assistant to perform multiple steps or activities.\n</reasoning>\n</example>\n\n<example>\nUser: Can you add a comment to the calculateTotal function to explain what it does?\nAssistant: Sure, let me add a comment to the calculateTotal function to explain what it does.\n* Uses the Edit tool to add a comment to the calculateTotal function *\n\n<reasoning>\nThe assistant did not use the todo list because this is a single, straightforward task confined to one location. Adding a comment doesn't require tracking multiple steps or systematic organization.\n</reasoning>\n</example>\n\n<example>\nUser: What time is it in Tokyo right now?\nAssistant: I'll check the current time in Tokyo for you.\n\n*Searches for current time in Tokyo*\n\nThe current time in Tokyo, Japan is [current time]. Tokyo is in the Japan Standard Time (JST) zone, which is UTC+9.\n\n<reasoning>\nThe assistant did not use the todo list because this is a single information lookup with immediate results. There are no multiple steps to track or organize, making the todo list unnecessary for this straightforward request.\n</reasoning>\n</example>\n\n<example>\nUser: I need to write a function that checks if a number is prime and then test it out.\nAssistant: I'll help you write a function that checks if a number is prime and then test it out.\n*Writes function that checks if a number is prime*\n*Tests the function*\n\n<reasoning>\nEven though this is a multi-step task, it is very straightforward and can be completed in two trivial steps (which is less than 3 steps!). Using the todo list here is overkill and wastes time and tokens.\n</reasoning>\n</example>\n\n<example>\nUser: I want you to order a pizza from Dominos, order a burger from McDonald's, and order a salad from Subway.\nAssistant: I'll help you order a pizza from Dominos, order a burger from McDonald's, and order a salad from Subway.\n*Orders a pizza from Dominos*\n*Orders a burger from McDonald's*\n*Orders a salad from Subway*\n\n<reasoning>\nEven though this is a multi-step task, assuming the assistant has the ability to order from these restaurants, it is very straightforward and can be completed in three trivial tool calls. \nUsing the todo list here is overkill and wastes time and tokens. These three tool calls should be made in parallel, in fact.\n</reasoning>\n</example>\n\n\n## Task States and Management\n\n1. **Task States**: Use these states to track progress:\n - pending: Task not yet started\n - in_progress: Currently working on (you can have multiple tasks in_progress at a time if they are not related to each other and can be run in parallel)\n - completed: Task finished successfully\n\n2. **Task Management**:\n - Update task status in real-time as you work\n - Mark tasks complete IMMEDIATELY after finishing (don't batch completions)\n - Complete current tasks before starting new ones\n - Remove tasks that are no longer relevant from the list entirely\n - IMPORTANT: When you write this todo list, you should mark your first task (or tasks) as in_progress immediately!.\n - IMPORTANT: Unless all tasks are completed, you should always have at least one task in_progress to show the user that you are working on something.\n\n3. **Task Completion Requirements**:\n - ONLY mark a task as completed when you have FULLY accomplished it\n - If you encounter errors, blockers, or cannot finish, keep the task as in_progress\n - When blocked, create a new task describing what needs to be resolved\n - Never mark a task as completed if:\n - There are unresolved issues or errors\n - Work is partial or incomplete\n - You encountered blockers that prevent completion\n - You couldn't find necessary resources or dependencies\n - Quality standards haven't been met\n\n4. **Task Breakdown**:\n - Create specific, actionable items\n - Break complex tasks into smaller, manageable steps\n - Use clear, descriptive task names\n\nBeing proactive with task management demonstrates attentiveness and ensures you complete all requirements successfully\nRemember: If you only need to make a few tool calls to complete a task, and it is clear what you need to do, it is better to just do the task directly and NOT call this tool at all.`;\nconst TODO_LIST_MIDDLEWARE_SYSTEM_PROMPT = `## \\`write_todos\\`\n\nYou have access to the \\`write_todos\\` tool to help you manage and plan complex objectives. \nUse this tool for complex objectives to ensure that you are tracking each necessary step and giving the user visibility into your progress.\nThis tool is very helpful for planning complex objectives, and for breaking down these larger complex objectives into smaller steps.\n\nIt is critical that you mark todos as completed as soon as you are done with a step. Do not batch up multiple steps before marking them as completed.\nFor simple objectives that only require a few steps, it is better to just complete the objective directly and NOT use this tool.\nWriting todos takes time and tokens, use it when it is helpful for managing complex many-step problems! But not for simple few-step requests.\n\n## Important To-Do List Usage Notes to Remember\n- The \\`write_todos\\` tool should never be called multiple times in parallel.\n- Don't be afraid to revise the To-Do list as you go. New information may reveal new tasks that need to be done, or old tasks that are irrelevant.`;\nconst TodoStatus = z\n .enum([\"pending\", \"in_progress\", \"completed\"])\n .describe(\"Status of the todo\");\nconst TodoSchema = z.object({\n content: z.string().describe(\"Content of the todo item\"),\n status: TodoStatus,\n});\nconst stateSchema = z.object({ todos: z.array(TodoSchema).default([]) });\n\nexport function todoListMiddleware(options?: {\n systemPrompt?: string;\n toolDescription?: string;\n}) {\n /**\n * Write todos tool - manages todo list with Command return\n */\n const writeTodos = tool(\n ({ todos }, config) => {\n return new Command({\n update: {\n todos,\n messages: [\n new ToolMessage({\n content: genUIMarkdown(\"todo_list\", todos),\n tool_call_id: config.toolCall?.id,\n }),\n ],\n },\n });\n },\n {\n name: \"write_todos\",\n description: options?.toolDescription ?? WRITE_TODOS_DESCRIPTION,\n schema: z.object({\n todos: z.array(TodoSchema).describe(\"List of todo items to update\"),\n }),\n }\n );\n return createMiddleware({\n name: \"todoListMiddleware\",\n stateSchema,\n tools: [writeTodos],\n wrapModelCall: (request, handler) =>\n handler({\n ...request,\n systemPrompt:\n (request.systemPrompt ? `${request.systemPrompt}\\n\\n` : \"\") +\n (options?.systemPrompt ?? TODO_LIST_MIDDLEWARE_SYSTEM_PROMPT),\n }),\n });\n}\n","/**\n * Filesystem Backend Factory\n *\n * Common utility for creating filesystem backend from middleware config.\n */\n\nimport type { MiddlewareConfig } from \"../../agent_lattice/types\";\nimport { sandboxLatticeManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { SandboxFilesystem } from \"../../deep_agent_new/backends/sandboxFiles\";\n\nexport function createFilesystemBackendFactory(\n middlewareConfigs: MiddlewareConfig[]\n): ((config: { state: unknown; store?: any }) => Promise<any>) | undefined {\n const filesystemConfig = middlewareConfigs.find(m => m.type === \"filesystem\");\n\n if (!filesystemConfig || !filesystemConfig.enabled) {\n return undefined;\n }\n\n const isolatedLevel = filesystemConfig.config?.isolatedLevel || \"global\";\n\n return async (config: { state: unknown, workspaceId?: string, projectId?: string }) => {\n const { workspaceId, projectId } = config;\n let sandboxName = \"global\";\n\n if (isolatedLevel === \"agent\") {\n sandboxName = \"agent\";\n } else if (isolatedLevel === \"thread\") {\n sandboxName = \"thread\";\n }\n\n const sandboxManager = sandboxLatticeManager.getSandboxLattice(\"default\");\n if (!sandboxManager) {\n throw new Error(\"Sandbox manager not found\");\n }\n\n return new SandboxFilesystem({\n sandboxInstance: await sandboxManager.createSandbox(sandboxName),\n workingDirectory: workspaceId && projectId ? `/workspaces/${workspaceId}/${projectId}` : \"/\"\n });\n };\n}\n","/**\n * Deep Agent Graph Builder\n *\n * 实现 Deep Agent 类型的 Agent Graph 构建\n */\n\nimport { CompiledStateGraph } from \"@langchain/langgraph\";\nimport { createDeepAgent } from \"../../deep_agent_new/agent\";\nimport { AgentLattice, AgentBuildParams, AgentClient, MiddlewareConfig } from \"../types\";\nimport { AgentGraphBuilder } from \"./AgentGraphBuilder\";\nimport { getToolClient } from \"../../tool_lattice/ToolLatticeManager\";\nimport { AgentMiddleware } from \"langchain\";\nimport { createAgentClientFromAgentLattice } from \"@agent_lattice/AgentLatticeManager\";\nimport { getCheckpointSaver } from \"@memory_lattice/MemoryLatticeManager\";\nimport { createCommonMiddlewares } from \"./commonMiddleware\";\nimport { createFilesystemBackendFactory } from \"./filesystemBackend\";\n\nexport class DeepAgentGraphBuilder implements AgentGraphBuilder {\n /**\n * 根据 middleware 配置创建 middlewares\n */\n private createMiddlewares(middlewareConfigs: MiddlewareConfig[]) {\n return createCommonMiddlewares(middlewareConfigs);\n }\n\n /**\n * 构建Deep Agent Graph\n *\n * @param agentLattice Agent Lattice对象\n * @param params Agent构建参数\n * @returns 返回CompiledGraph对象\n */\n build(agentLattice: AgentLattice, params: AgentBuildParams): AgentClient {\n const tools = params.tools\n .map((t) => {\n const toolClient = getToolClient(t.key);\n return toolClient;\n })\n .filter((tool) => tool !== undefined);\n\n const subagents = params.subAgents.map((sa) => {\n if (sa.client) {\n return {\n name: sa.config.name,\n description: sa.config.description,\n runnable: sa.client,\n };\n } else {\n const subagentClient = createAgentClientFromAgentLattice({\n config: sa.config,\n });\n return {\n name: sa.config.name,\n description: sa.config.description,\n runnable: subagentClient,\n };\n }\n });\n\n const middlewareConfigs = params.middleware || [];\n const filesystemBackend = createFilesystemBackendFactory(middlewareConfigs);\n const middlewares = this.createMiddlewares(middlewareConfigs);\n\n const deepAgent = createDeepAgent({\n tools: tools,\n model: params.model,\n contextSchema: params.stateSchema,\n systemPrompt: params.prompt,\n subagents,\n checkpointer: getCheckpointSaver(\"default\"),\n skills: params.skillCategories,\n backend: filesystemBackend,\n middleware: middlewares,\n });\n\n return deepAgent as AgentClient;\n }\n}\n","/**\n * Agent Team - High-level Facade\n *\n * createAgentTeam() wires together the TaskListStore, MailboxStore,\n * and team middleware to produce a ready-to-use TeamLead ReactAgent.\n *\n * Usage:\n *\n * ```typescript\n * import { createAgentTeam } from \"@axiom-lattice/core\";\n *\n * const team = createAgentTeam({\n * teammates: [\n * { name: \"researcher\", role: \"research\", description: \"Web research\", tools: [searchTool] },\n * { name: \"writer\", role: \"writing\", description: \"Report writing\", tools: [writeTool] },\n * ],\n * maxConcurrency: 3,\n * });\n *\n * await team.invoke({\n * messages: [{ role: \"human\", content: \"Research and write a report on X\" }],\n * });\n * ```\n */\n\nimport { z } from \"zod/v3\";\nimport { createAgent, type AgentMiddleware } from \"langchain\";\nimport type { ReactAgent } from \"langchain\";\nimport type { TeamConfig } from \"./types.js\";\nimport { MessageType } from \"./types.js\";\nimport { InMemoryTaskListStore } from \"./stores/InMemoryTaskListStore.js\";\nimport { InMemoryMailboxStore } from \"./stores/InMemoryMailboxStore.js\";\nimport { createTeamMiddleware } from \"./middleware/team.js\";\nimport { createReactAgentSchema } from \"../agent_lattice/builders/state.js\";\nimport { createFilesystemMiddleware } from \"../deep_agent_new/middleware/fs.js\";\n\n/**\n * Teammate info in state (reference todos.ts TodoSchema pattern)\n */\nconst TeammateInfoSchema = z.object({\n name: z.string().describe(\"Teammate name\"),\n role: z.string().describe(\"Role category (e.g. research, writing, review)\"),\n description: z.string().describe(\"What this teammate focuses on\"),\n});\n\n/**\n * Task info snapshot for state\n */\nconst TeamTaskInfoSchema = z.object({\n id: z.string(),\n title: z.string(),\n description: z.string(),\n status: z.string().optional(),\n});\n\n/**\n * Mailbox message for state storage\n */\nconst MailboxMessageSchema = z.object({\n id: z.string().describe(\"Unique message identifier\"),\n from: z.string().describe(\"Sender agent name\"),\n to: z.string().describe(\"Recipient agent name\"),\n content: z.string().describe(\"Message content\"),\n timestamp: z.string().describe(\"ISO timestamp when the message was sent\"),\n type: z.nativeEnum(MessageType).describe(\"Message type\"),\n read: z.boolean().describe(\"Whether the recipient has read this message\"),\n});\n\n/**\n * Full team info stored in state when create_team succeeds\n */\nconst TeamInfoSchema = z.object({\n teamId: z.string().describe(\"Unique team identifier\"),\n teamLeadId: z.string().default(\"team_lead\").describe(\"Team lead agent ID\"),\n teammates: z.array(TeammateInfoSchema).describe(\"Active teammates in this team\"),\n tasks: z.array(TeamTaskInfoSchema).optional().describe(\"Initial tasks snapshot\"),\n createdAt: z.string().optional().describe(\"ISO timestamp when team was created\"),\n});\n\n/** State schema for team agent: full team info (id, lead, teammates, tasks) */\nconst TEAM_STATE_SCHEMA = z.object({\n team: TeamInfoSchema.optional().describe(\"Team info: teamId, teamLeadId, teammates, tasks. Set when create_team succeeds.\"),\n tasks: z.array(TeamTaskInfoSchema).optional().describe(\"Current tasks snapshot from check_tasks. Updated on each check.\"),\n team_mailbox: z.array(MailboxMessageSchema).optional().describe(\"All team mailbox messages for display\"),\n});\n\n/**\n * Default system prompt for the team lead agent.\n */\nconst TEAM_LEAD_BASE_PROMPT = `You are a team lead that coordinates a team of specialized agents. In order to complete the objective that the user asks of you, you will need to:\n\n1. Understand the user's objective and break it into concrete tasks.\n2. Create a team by calling \\`create_team\\` with the tasks and teammate assignments.\n3. **While tasks are incomplete**: Use \\`read_messages\\` to wait for teammate updates (it waits up to 3 minutes for new messages). When messages indicate task changes, call \\`check_tasks\\` to get full task status. Do not assume tasks are done without checking.\n4. **Important - Message handling**: After calling \\`read_messages\\`, if there are unread messages from teammates (you will see them in the tool output), you MUST:\n - Acknowledge their message\n - If they need guidance, provide it using \\`send_message\\`\n - If they reported a problem, address it (add tasks, adjust plan, etc.)\n - If they made a discovery, incorporate it into your plan\n Do not just read messages - always respond or take action!\n5. **Task assignment**: You can explicitly assign tasks to specific teammates via \\`send_message\\`, or let them self-claim from available tasks.\n6. **Plan approval** (optional): If a teammate needs approval before implementing, wait for their plan and approve/reject with feedback via \\`send_message\\`.\n7. Respond to the user with status updates and final results.\n8. When the user asks for changes, use \\`add_tasks\\`, \\`assign_task\\`, \\`set_task_status\\`, or \\`set_task_dependencies\\` to evolve the task list.\n9. When teammates report discoveries or problems, adjust the plan accordingly.\n10. **Cleanup**: When all tasks are done, tell teammates to shut down, then clean up the team resources.\n\n## Coordination Rules\n\n- **Single point of contact**: User only talks to YOU - you are the only interface between user and team\n- **Don't parallel implement**: Do not start working on tasks yourself while teammates are working - wait for them to finish\n- **Always verify**: Never assume tasks are done - always verify with \\`check_tasks\\`\n- **Permissions**: All teammates inherit your permission settings. Adjust individual teammate modes if needed after spawning.\n\nAlways plan tasks with clear, actionable descriptions. Use dependencies to express ordering constraints.`;\n\n/**\n * Create an agent team: a TeamLead ReactAgent backed by shared\n * TaskListStore and MailboxStore with pre-configured teammates.\n *\n * @param config - Team configuration (teammates, model, stores, etc.)\n * @returns A ReactAgent that acts as the TeamLead\n */\nexport function createAgentTeam(\n config: TeamConfig\n): ReactAgent<any, any, any, any> {\n // Use provided stores or default to in-memory\n const taskListStore = config.taskListStore ?? new InMemoryTaskListStore();\n const mailboxStore = config.mailboxStore ?? new InMemoryMailboxStore();\n\n // Create filesystem middleware (uses StateBackend by default if no backend provided)\n const filesystemMiddleware = createFilesystemMiddleware({\n backend: config.backend,\n });\n\n // Combine filesystem with user's middleware\n const allMiddleware = [filesystemMiddleware, ...(config.middleware ?? [])];\n\n // Team config with filesystem middleware included (for teammates)\n const teamConfigWithFs: TeamConfig = {\n ...config,\n middleware: allMiddleware,\n };\n\n // Build the team middleware (provides all team management tools)\n const teamMiddleware = createTeamMiddleware({\n teamConfig: teamConfigWithFs,\n taskListStore,\n mailboxStore,\n });\n\n // Assemble middleware stack: teamMiddleware + filesystem + user middleware\n const middleware: AgentMiddleware[] = [\n teamMiddleware,\n ...allMiddleware,\n ];\n\n // Build the team lead system prompt\n const systemPrompt = config.systemPrompt + \"\\n\\n\" + TEAM_LEAD_BASE_PROMPT;\n\n // Create and return the TeamLead agent\n const stateSchema = createReactAgentSchema(TEAM_STATE_SCHEMA);\n return createAgent({\n model: config.model ?? \"claude-sonnet-4-5-20250929\",\n systemPrompt,\n tools: [], // all tools come from middleware\n middleware,\n checkpointer: config.checkpointer,\n stateSchema: stateSchema as any,\n });\n}\n","/**\n * Agent Team - Core Type Definitions\n *\n * Shared types used by TaskListStore, MailboxStore, middleware, and the AgentTeam facade.\n */\n\nimport type { StructuredTool } from \"@langchain/core/tools\";\nimport type { LanguageModelLike } from \"@langchain/core/language_models/base\";\nimport type { BaseCheckpointSaver } from \"@langchain/langgraph-checkpoint\";\nimport type { AgentMiddleware } from \"langchain\";\nimport type { TaskListStore } from \"./stores/protocols.js\";\nimport type { MailboxStore } from \"./stores/protocols.js\";\n\n// ---------------------------------------------------------------------------\n// Task management\n// ---------------------------------------------------------------------------\n\n/**\n * Status of a task in the shared task list.\n */\nexport enum TaskStatus {\n PENDING = \"pending\",\n CLAIMED = \"claimed\",\n IN_PROGRESS = \"in_progress\",\n COMPLETED = \"completed\",\n FAILED = \"failed\",\n}\n\n/**\n * Events emitted by a TaskListStore when task state changes.\n */\nexport type TaskEvent =\n | \"task:added\"\n | \"task:claimed\"\n | \"task:completed\"\n | \"task:failed\"\n | \"task:removed\";\n\n/**\n * A task stored in the shared task list.\n */\nexport interface TeamTask {\n /** Unique task identifier */\n id: string;\n /** Short title for the task */\n title: string;\n /** Detailed description of what needs to be done */\n description: string;\n /** Current status */\n status: TaskStatus;\n /** Name of the teammate that claimed this task */\n assignee?: string;\n /** Result summary when completed */\n result?: string;\n /** Error message when failed */\n error?: string;\n /** IDs of tasks that must be completed before this one can be claimed */\n dependencies: string[];\n /** When the task was created */\n createdAt: Date;\n /** When the task was last updated */\n updatedAt: Date;\n}\n\n/**\n * Input for creating a new task.\n */\nexport interface TaskSpec {\n id: string;\n title: string;\n description: string;\n assignee?: string;\n dependencies?: string[];\n}\n\n/**\n * Fields that can be updated on an existing task.\n */\nexport interface TaskUpdatable {\n title?: string;\n description?: string;\n assignee?: string;\n status?: TaskStatus;\n dependencies?: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Messaging\n// ---------------------------------------------------------------------------\n\n/**\n * Type of an inter-agent message in the mailbox.\n * Different tools and flows use different types when storing messages.\n */\nexport enum MessageType {\n /** One-to-one message (send_message tool) */\n DIRECT_MESSAGE = \"direct_message\",\n /** Message to all teammates (broadcast_message tool) */\n BROADCAST = \"broadcast\",\n /** Teammate submits execution plan to team_lead for approval */\n PLAN_REQUEST = \"plan_request\",\n /** Team_lead approves or rejects plan (feedback to teammate) */\n PLAN_FEEDBACK = \"plan_feedback\",\n /** Team_lead instructs team to shut down (e.g. disband_team) */\n SHUTDOWN_REQUEST = \"shutdown_request\",\n /** Teammate acknowledges shutdown */\n SHUTDOWN_RESPONSE = \"shutdown_response\",\n /** From TaskCompleted/TeammateIdle hook or system: quality issue or continue-work reminder */\n TASK_FEEDBACK = \"task_feedback\",\n /** Idle notification, task status change, or other status update */\n STATUS_UPDATE = \"status_update\",\n}\n\n/**\n * A message stored in the mailbox.\n */\nexport interface MailboxMessage {\n /** Unique message identifier */\n id: string;\n /** Sender agent name */\n from: string;\n /** Recipient agent name (or \"__broadcast__\" for broadcasts) */\n to: string;\n /** Message content */\n content: string;\n /** When the message was sent */\n timestamp: Date;\n /** Message type */\n type: MessageType;\n /** Whether the recipient has read this message */\n read: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Team configuration\n// ---------------------------------------------------------------------------\n\n/**\n * Specification for a teammate agent.\n * Configured at team creation time; the `create_team` tool matches teammate\n * names from the LLM's plan against these specs to get tools/model/prompt.\n */\nexport interface TeammateSpec {\n /** Unique name for this teammate (used as agent ID) */\n name: string;\n /** Role category (e.g. \"research\", \"writing\", \"review\") */\n role: string;\n /** Human-readable description of what this teammate does */\n description: string;\n /** Model override (defaults to team-level model) */\n model?: LanguageModelLike | string;\n /** Tools this teammate has access to (in addition to team tools) */\n tools?: StructuredTool[];\n /** Custom system prompt for this teammate */\n systemPrompt?: string;\n /** Additional middleware for this teammate */\n middleware?: AgentMiddleware[];\n}\n\n/**\n * Configuration for creating an agent team.\n */\nexport interface TeamConfig {\n /** Available teammate specifications (the LLM picks from these by name) */\n teammates: TeammateSpec[];\n /** Maximum number of teammates running concurrently (default: teammates.length) */\n maxConcurrency?: number;\n /** Model for the team lead agent */\n model?: LanguageModelLike | string;\n /** Custom system prompt for the team lead */\n systemPrompt?: string;\n /** Tools available to the team lead */\n tools?: StructuredTool[];\n /** Checkpointer for persisting agent state between runs */\n checkpointer?: BaseCheckpointSaver | boolean;\n /** Pluggable task list store (default: InMemoryTaskListStore) */\n taskListStore?: TaskListStore;\n /** Pluggable mailbox store (default: InMemoryMailboxStore) */\n mailboxStore?: MailboxStore;\n /** Additional middleware for the team lead agent */\n middleware?: AgentMiddleware[];\n /**\n * Schedule lattice key for polling task list / mailbox.\n * When set, teammates use scheduled polling instead of event-driven wait.\n * Requires the app to register the schedule lattice first.\n */\n scheduleLatticeKey?: string;\n /** Poll interval in ms when using schedule lattice (default: 5000) */\n pollIntervalMs?: number;\n /** Filesystem backend for sandboxed file operations */\n backend?: (config: { state: unknown; store?: any }) => Promise<any>;\n}\n","/**\n * InMemoryTaskListStore\n *\n * In-memory implementation of TaskListStore.\n * Tasks are organised by teamId, following the same pattern as\n * InMemoryThreadStore (Map<teamId, Map<taskId, TeamTask>>).\n *\n * Uses an internal EventEmitter so persistent teammates can sleep\n * until claimable tasks appear instead of busy-polling.\n */\n\nimport { EventEmitter } from \"events\";\nimport type { TaskListStore } from \"./protocols.js\";\nimport {\n type TeamTask,\n type TaskSpec,\n type TaskUpdatable,\n type TaskEvent,\n TaskStatus,\n} from \"../types.js\";\n\nexport class InMemoryTaskListStore implements TaskListStore {\n /** Map<teamId, Map<taskId, TeamTask>> */\n private tasks: Map<string, Map<string, TeamTask>> = new Map();\n\n /** EventEmitter for task lifecycle events */\n private emitter = new EventEmitter();\n\n /** Auto-incrementing ID counter */\n private idCounter = 0;\n\n constructor() {\n // Allow many listeners (one per teammate per team)\n this.emitter.setMaxListeners(200);\n }\n\n // -------------------------------------------------------------------------\n // Helpers\n // -------------------------------------------------------------------------\n\n /** Get or create the task map for a team. */\n private getTeamTasks(teamId: string): Map<string, TeamTask> {\n let map = this.tasks.get(teamId);\n if (!map) {\n map = new Map();\n this.tasks.set(teamId, map);\n }\n return map;\n }\n\n /** Generate a unique task ID. */\n private nextId(): string {\n this.idCounter += 1;\n return `task-${this.idCounter}`;\n }\n\n /** Emit a scoped event: `${teamId}:${event}`. */\n private emit(teamId: string, event: TaskEvent, task: TeamTask): void {\n this.emitter.emit(`${teamId}:${event}`, task);\n }\n\n /**\n * Resolve dependency references by task IDs.\n */\n private resolveDependencies(\n teamTasks: Map<string, TeamTask>,\n depIds: string[]\n ): string[] {\n const resolved: string[] = [];\n for (const ref of depIds) {\n if (teamTasks.has(ref)) {\n resolved.push(ref);\n }\n }\n return resolved;\n }\n\n /**\n * Check whether all dependencies of a task are in COMPLETED status.\n */\n private areDependenciesSatisfied(\n teamTasks: Map<string, TeamTask>,\n task: TeamTask\n ): boolean {\n if (task.dependencies.length === 0) return true;\n return task.dependencies.every((depId) => {\n const dep = teamTasks.get(depId);\n return dep !== undefined && dep.status === TaskStatus.COMPLETED;\n });\n }\n\n // -------------------------------------------------------------------------\n // Lifecycle\n // -------------------------------------------------------------------------\n\n async addTask(teamId: string, spec: TaskSpec): Promise<TeamTask> {\n const teamTasks = this.getTeamTasks(teamId);\n \n if (!/^task-\\d+$/.test(spec.id)) {\n throw new Error(`Invalid task ID format: ${spec.id}. Expected format: task-01, task-02, etc.`);\n }\n if (teamTasks.has(spec.id)) {\n throw new Error(`Task ID already exists: ${spec.id}`);\n }\n\n const now = new Date();\n const task: TeamTask = {\n id: spec.id,\n title: spec.title,\n description: spec.description,\n assignee: spec.assignee,\n status: TaskStatus.PENDING,\n dependencies: spec.dependencies\n ? this.resolveDependencies(teamTasks, spec.dependencies)\n : [],\n createdAt: now,\n updatedAt: now,\n };\n teamTasks.set(task.id, task);\n this.emit(teamId, \"task:added\", task);\n return task;\n }\n\n async addTasks(teamId: string, specs: TaskSpec[]): Promise<TeamTask[]> {\n const teamTasks = this.getTeamTasks(teamId);\n const now = new Date();\n const created: TeamTask[] = [];\n\n const seenIds = new Set<string>();\n for (const spec of specs) {\n if (!/^task-\\d+$/.test(spec.id)) {\n throw new Error(`Invalid task ID format: ${spec.id}. Expected format: task-01, task-02, etc.`);\n }\n if (seenIds.has(spec.id)) {\n throw new Error(`Duplicate task ID: ${spec.id}`);\n }\n if (teamTasks.has(spec.id)) {\n throw new Error(`Task ID already exists: ${spec.id}`);\n }\n seenIds.add(spec.id);\n }\n\n for (const spec of specs) {\n const task: TeamTask = {\n id: spec.id,\n title: spec.title,\n description: spec.description,\n assignee: spec.assignee,\n status: TaskStatus.PENDING,\n dependencies: [],\n createdAt: now,\n updatedAt: now,\n };\n teamTasks.set(task.id, task);\n created.push(task);\n }\n\n for (let i = 0; i < specs.length; i++) {\n if (specs[i].dependencies && specs[i].dependencies!.length > 0) {\n created[i].dependencies = this.resolveDependencies(\n teamTasks,\n specs[i].dependencies!\n );\n }\n }\n\n for (const task of created) {\n this.emit(teamId, \"task:added\", task);\n }\n\n return created;\n }\n\n async updateTask(\n teamId: string,\n taskId: string,\n updates: Partial<TaskUpdatable>\n ): Promise<TeamTask | null> {\n const teamTasks = this.getTeamTasks(teamId);\n const task = teamTasks.get(taskId);\n if (!task) return null;\n\n if (updates.title !== undefined) task.title = updates.title;\n if (updates.description !== undefined) task.description = updates.description;\n if (updates.assignee !== undefined) task.assignee = updates.assignee;\n if (updates.status !== undefined) task.status = updates.status;\n if (updates.dependencies !== undefined) {\n task.dependencies = this.resolveDependencies(teamTasks, updates.dependencies);\n }\n task.updatedAt = new Date();\n\n return task;\n }\n\n async removeTask(teamId: string, taskId: string): Promise<boolean> {\n const teamTasks = this.getTeamTasks(teamId);\n const task = teamTasks.get(taskId);\n if (!task) return false;\n teamTasks.delete(taskId);\n this.emit(teamId, \"task:removed\", task);\n return true;\n }\n\n // -------------------------------------------------------------------------\n // Claim / Complete\n // -------------------------------------------------------------------------\n\n /**\n * Claim a specific task by ID: set assignee to agentId and status to CLAIMED.\n * Only succeeds if the task is PENDING and all dependencies are COMPLETED.\n */\n async claimTaskById(\n teamId: string,\n taskId: string,\n agentId: string\n ): Promise<TeamTask | null> {\n const teamTasks = this.getTeamTasks(teamId);\n const task = teamTasks.get(taskId);\n if (!task) return null;\n if (task.status !== TaskStatus.PENDING) return null;\n if (!this.areDependenciesSatisfied(teamTasks, task)) return null;\n\n task.status = TaskStatus.CLAIMED;\n task.assignee = agentId;\n task.updatedAt = new Date();\n this.emit(teamId, \"task:claimed\", task);\n return task;\n }\n\n async completeTask(\n teamId: string,\n taskId: string,\n result: string\n ): Promise<TeamTask | null> {\n const teamTasks = this.getTeamTasks(teamId);\n const task = teamTasks.get(taskId);\n if (!task) return null;\n\n task.status = TaskStatus.COMPLETED;\n task.result = result;\n task.updatedAt = new Date();\n this.emit(teamId, \"task:completed\", task);\n return task;\n }\n\n async failTask(\n teamId: string,\n taskId: string,\n error: string\n ): Promise<TeamTask | null> {\n const teamTasks = this.getTeamTasks(teamId);\n const task = teamTasks.get(taskId);\n if (!task) return null;\n\n task.status = TaskStatus.FAILED;\n task.error = error;\n task.updatedAt = new Date();\n this.emit(teamId, \"task:failed\", task);\n return task;\n }\n\n // -------------------------------------------------------------------------\n // Query\n // -------------------------------------------------------------------------\n\n async getTask(teamId: string, taskId: string): Promise<TeamTask | null> {\n const teamTasks = this.tasks.get(teamId);\n if (!teamTasks) return null;\n return teamTasks.get(taskId) ?? null;\n }\n\n async getTasksByStatus(\n teamId: string,\n status: TaskStatus\n ): Promise<TeamTask[]> {\n const teamTasks = this.tasks.get(teamId);\n if (!teamTasks) return [];\n return Array.from(teamTasks.values()).filter((t) => t.status === status);\n }\n\n async getAllTasks(teamId: string): Promise<TeamTask[]> {\n const teamTasks = this.tasks.get(teamId);\n if (!teamTasks) return [];\n return Array.from(teamTasks.values());\n }\n\n async isAllDone(teamId: string): Promise<boolean> {\n const teamTasks = this.tasks.get(teamId);\n if (!teamTasks || teamTasks.size === 0) return true;\n\n for (const task of teamTasks.values()) {\n if (\n task.status === TaskStatus.PENDING ||\n task.status === TaskStatus.CLAIMED ||\n task.status === TaskStatus.IN_PROGRESS\n ) {\n return false;\n }\n }\n return true;\n }\n\n async hasClaimable(teamId: string): Promise<boolean> {\n const teamTasks = this.tasks.get(teamId);\n if (!teamTasks) return false;\n\n for (const task of teamTasks.values()) {\n if (\n task.status === TaskStatus.PENDING &&\n this.areDependenciesSatisfied(teamTasks, task)\n ) {\n return true;\n }\n }\n return false;\n }\n\n // -------------------------------------------------------------------------\n // Events\n // -------------------------------------------------------------------------\n\n onTaskEvent(\n teamId: string,\n event: TaskEvent,\n callback: (task: TeamTask) => void\n ): void {\n this.emitter.on(`${teamId}:${event}`, callback);\n }\n\n offTaskEvent(\n teamId: string,\n event: TaskEvent,\n callback: (task: TeamTask) => void\n ): void {\n this.emitter.off(`${teamId}:${event}`, callback);\n }\n\n // -------------------------------------------------------------------------\n // Utilities\n // -------------------------------------------------------------------------\n\n /** Remove all tasks for a team (useful for cleanup / testing). */\n clearTeam(teamId: string): void {\n this.tasks.delete(teamId);\n }\n\n /** Remove all tasks across all teams (useful for testing). */\n clear(): void {\n this.tasks.clear();\n }\n}\n","/**\n * InMemoryMailboxStore\n *\n * In-memory implementation of MailboxStore.\n * Messages are organised by teamId -> agentId, following the same\n * Map nesting pattern as InMemoryThreadStore.\n *\n * Uses an internal EventEmitter so agents can be notified of new\n * messages in real time without polling.\n */\n\nimport { EventEmitter } from \"events\";\nimport type { MailboxStore } from \"./protocols.js\";\nimport { type MailboxMessage, MessageType } from \"../types.js\";\n\nexport class InMemoryMailboxStore implements MailboxStore {\n /** Map<teamId, Map<agentId, MailboxMessage[]>> */\n private messages: Map<string, Map<string, MailboxMessage[]>> = new Map();\n\n /** Map<teamId, Set<agentId>> -- registered agents for broadcast */\n private agents: Map<string, Set<string>> = new Map();\n\n /** EventEmitter for real-time message notifications */\n private emitter = new EventEmitter();\n\n /** Auto-incrementing message ID counter */\n private idCounter = 0;\n\n constructor() {\n this.emitter.setMaxListeners(200);\n }\n\n // -------------------------------------------------------------------------\n // Helpers\n // -------------------------------------------------------------------------\n\n /** Get or create the agent message list for a team. */\n private getAgentMessages(\n teamId: string,\n agentId: string\n ): MailboxMessage[] {\n let teamMap = this.messages.get(teamId);\n if (!teamMap) {\n teamMap = new Map();\n this.messages.set(teamId, teamMap);\n }\n let list = teamMap.get(agentId);\n if (!list) {\n list = [];\n teamMap.set(agentId, list);\n }\n return list;\n }\n\n /** Generate a unique message ID. */\n private nextId(): string {\n this.idCounter += 1;\n return `msg-${this.idCounter}`;\n }\n\n /** Store a message and emit a real-time event for the recipient. */\n private storeAndNotify(\n teamId: string,\n message: MailboxMessage\n ): void {\n const list = this.getAgentMessages(teamId, message.to);\n list.push(message);\n const preview =\n message.content.length > 80 ? message.content.slice(0, 80) + \"...\" : message.content;\n console.log(\n `[Mailbox] ${teamId} | ${message.from} → ${message.to} [${message.type}] ${message.id}: ${preview}`\n );\n this.emitter.emit(`${teamId}:${message.to}:message`, message);\n this.emitter.emit(`${teamId}:message`, message);\n }\n\n // -------------------------------------------------------------------------\n // Messaging\n // -------------------------------------------------------------------------\n\n async sendMessage(\n teamId: string,\n from: string,\n to: string,\n content: string,\n type: MessageType = MessageType.DIRECT_MESSAGE\n ): Promise<MailboxMessage> {\n const message: MailboxMessage = {\n id: this.nextId(),\n from,\n to,\n content,\n timestamp: new Date(),\n type,\n read: false,\n };\n this.storeAndNotify(teamId, message);\n return message;\n }\n\n async broadcastMessage(\n teamId: string,\n from: string,\n content: string,\n type: MessageType = MessageType.BROADCAST\n ): Promise<MailboxMessage[]> {\n const agentSet = this.agents.get(teamId);\n if (!agentSet || agentSet.size === 0) return [];\n\n const created: MailboxMessage[] = [];\n for (const agentId of agentSet) {\n // Don't send broadcast back to the sender\n if (agentId === from) continue;\n const message: MailboxMessage = {\n id: this.nextId(),\n from,\n to: agentId,\n content,\n timestamp: new Date(),\n type,\n read: false,\n };\n this.storeAndNotify(teamId, message);\n created.push(message);\n }\n return created;\n }\n\n async getMessages(\n teamId: string,\n agentId: string\n ): Promise<MailboxMessage[]> {\n const teamMap = this.messages.get(teamId);\n if (!teamMap) return [];\n return teamMap.get(agentId) ?? [];\n }\n\n async getUnreadMessages(\n teamId: string,\n agentId: string\n ): Promise<MailboxMessage[]> {\n const all = await this.getMessages(teamId, agentId);\n return all.filter((m) => !m.read);\n }\n\n async markAsRead(\n teamId: string,\n agentId: string,\n messageId: string\n ): Promise<void> {\n const all = await this.getMessages(teamId, agentId);\n const msg = all.find((m) => m.id === messageId);\n if (msg) {\n msg.read = true;\n console.log(\n `[Mailbox] ${teamId} | ${agentId} marked ${messageId} as read (from: ${msg.from})`\n );\n }\n }\n\n // -------------------------------------------------------------------------\n // Agent registration\n // -------------------------------------------------------------------------\n\n async registerAgent(teamId: string, agentId: string): Promise<void> {\n let agentSet = this.agents.get(teamId);\n if (!agentSet) {\n agentSet = new Set();\n this.agents.set(teamId, agentSet);\n }\n agentSet.add(agentId);\n }\n\n async unregisterAgent(teamId: string, agentId: string): Promise<void> {\n const agentSet = this.agents.get(teamId);\n if (agentSet) {\n agentSet.delete(agentId);\n }\n }\n\n async getRegisteredAgents(teamId: string): Promise<string[]> {\n const agentSet = this.agents.get(teamId);\n if (!agentSet) return [];\n return Array.from(agentSet);\n }\n\n // -------------------------------------------------------------------------\n // Events\n // -------------------------------------------------------------------------\n\n onMessage(\n teamId: string,\n agentId: string,\n callback: (msg: MailboxMessage) => void\n ): void {\n this.emitter.on(`${teamId}:${agentId}:message`, callback);\n }\n\n offMessage(\n teamId: string,\n agentId: string,\n callback: (msg: MailboxMessage) => void\n ): void {\n this.emitter.off(`${teamId}:${agentId}:message`, callback);\n }\n\n onTeamMessage(\n teamId: string,\n callback: (msg: MailboxMessage) => void\n ): void {\n this.emitter.on(`${teamId}:message`, callback);\n }\n\n offTeamMessage(\n teamId: string,\n callback: (msg: MailboxMessage) => void\n ): void {\n this.emitter.off(`${teamId}:message`, callback);\n }\n\n async getAllTeamMessages(teamId: string): Promise<MailboxMessage[]> {\n const teamMap = this.messages.get(teamId);\n if (!teamMap) return [];\n const allMessages: MailboxMessage[] = [];\n for (const messages of teamMap.values()) {\n allMessages.push(...messages);\n }\n return allMessages.sort(\n (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()\n );\n }\n\n // -------------------------------------------------------------------------\n // Utilities\n // -------------------------------------------------------------------------\n\n /** Remove all data for a team (messages + registrations). */\n clearTeam(teamId: string): void {\n this.messages.delete(teamId);\n this.agents.delete(teamId);\n }\n\n /** Remove all data across all teams. */\n clear(): void {\n this.messages.clear();\n this.agents.clear();\n }\n}\n","/**\n * Agent Team - Team Middleware\n *\n * createTeamMiddleware() provides the TeamLead agent with tools to\n * manage a dynamic team:\n *\n * create_team -- non-blocking: spawn teammates + populate task list\n * add_tasks -- add new tasks at any time (evolutionary)\n * assign_task -- set a task's assignee (reassign to a teammate)\n * set_task_status -- set a task's status (pending, claimed, in_progress, completed, failed)\n * set_task_dependencies -- set a task's dependency list\n * check_tasks -- get current task list status\n * send_message -- send message to a teammate\n * read_messages -- read unread messages from teammates\n *\n * Patterns referenced from deep_agent_new/middleware/subagents.ts:\n * - createMiddleware() + wrapModelCall for system prompt injection\n * - Agent creation via createAgent() from langchain\n * - State filtering (filterStateForSubagent logic)\n * - ToolMessage returns\n */\n\nimport { z } from \"zod/v3\";\nimport { createMiddleware, createAgent, tool, ToolMessage, type AgentMiddleware, type StructuredTool } from \"langchain\";\nimport { Command, getCurrentTaskInput } from \"@langchain/langgraph\";\nimport type { ReactAgent } from \"langchain\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport type { LanguageModelLike } from \"@langchain/core/language_models/base\";\nimport type { TaskListStore } from \"../stores/protocols.js\";\nimport type { MailboxStore } from \"../stores/protocols.js\";\nimport { type TeammateSpec, type TeamConfig, type TeamTask, type MailboxMessage, MessageType, TaskStatus } from \"../types.js\";\nimport { createTeammateTools } from \"./teammate_tools.js\";\nimport { formatMessagesAsMarkdown } from \"./formatMessages.js\";\nimport { getCheckpointSaver } from \"@memory_lattice/MemoryLatticeManager\";\nimport { agentWorkerGraph } from \"../../agent_worker/agent_worker_graph\";\nimport { registerTeammateAgent } from \"../../agent_lattice/index.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst TEAM_LEAD_AGENT_ID = \"team_lead\";\nconst DEFAULT_POLL_INTERVAL_MS = 5000;\nconst DEFAULT_SCHEDULE_LATTICE_KEY = \"default\";\n/** Max wait time for new messages using event mechanism (3 minutes) */\nconst READ_MESSAGES_TIMEOUT_MS = 180_000;\n\n/**\n * Team communication norms — shared by team_lead and all teammates.\n * Injected into both team leader and teammate system prompts so everyone follows the same rules.\n */\nconst TEAM_COMMUNICATION_NORMS = `\n### Team communication norms\n\n- **Roles**: One \\`team_lead\\` coordinates the work; all others are teammates. Teammates report to team_lead and collaborate with each other as needed.\n- **Notifying everyone**: When the team_lead needs to tell something to **all** teammates (e.g. \"submit your plan\", \"plan approved\", \"shut down\"), use \\`broadcast_message\\`. Do not send the same message to each teammate individually.\n- **Teammate → all**: When a teammate needs to share something with the whole team, use \\`broadcast_message\\`.\n- **One-to-one**: Use \\`send_message\\` for directed messages (e.g. teammate sending a plan to team_lead, or team_lead replying to one teammate).\n- **New tasks**: If a teammate needs **new tasks** to be created (e.g. discovered during work or scope change), they must notify the team_lead via \\`send_message\\` to \"team_lead\". Only the team_lead may add tasks via \\`add_tasks\\`; teammates do not create tasks themselves.\n- **Plans**: Teammates submit their execution plan to team_lead via \\`send_message\\` to \"team_lead\". Team_lead reviews and approves; no external user approval is required. Team_lead notifies all teammates of approval via \\`broadcast_message\\`.\n- **Shutdown — check task state first**: When anyone receives a shutdown message (from team_lead or system), they **must not** shut down immediately. First: (1) **Check current task state** via \\`check_tasks\\` (team_lead) or \\`check_tasks\\` (teammate). (2) **Discuss with the team** via \\`read_messages\\`, \\`send_message\\`, or \\`broadcast_message\\`: should we continue these tasks, or stop/cancel them? (3) Only after the team has agreed—either to **continue** (keep working) or to **stop/delete** the remaining tasks—may shutdown proceed. Team_lead must not call \\`disband_team\\` until task state is verified and the team has aligned; teammates must not exit until the same alignment is reached.`;\n\n/** Runtime context for a team, used by the scheduler handler to resume polling. */\ninterface TeamPollContext {\n teamId: string;\n /** Parent thread ID from team lead (for subagent-style thread derivation) */\n parentThreadId: string;\n taskListStore: TaskListStore;\n mailboxStore: MailboxStore;\n teammates: Map<string, TeammateSpec>;\n /** All teammate specs in this team (for injecting into teammate prompt) */\n allTeammateSpecs: TeammateSpec[];\n defaultModel: LanguageModelLike | string;\n pollIntervalMs: number;\n scheduleLatticeKey: string;\n /** Cached teammate agents: (teamId, agentId) -> agent */\n agentCache: Map<string, ReactAgent<any, any, any, any>>;\n}\n\n\n\n\nconst TEAM_SYSTEM_PROMPT = `## Agent Team\n\nYou are the team_lead. You have tools to manage a team of specialized agents that work in parallel:\n\n- \\`create_team\\`: Create a team with initial tasks and teammates. This is **non-blocking** -- teammates start working in the background immediately, and you stay free to continue the conversation.\n- \\`add_tasks\\`: Add new tasks at any time. Use the optional \\`assignee\\` field to assign a task to a specific teammate when you need that person to do the work; otherwise teammates will claim tasks. Sleeping teammates will wake up and claim new tasks.\n- \\`assign_task\\`: Set a task's assignee (reassign work to a specific teammate).\n- \\`set_task_status\\`: Set a task's status (pending, claimed, in_progress, completed, failed). Use to reopen a task or mark it failed.\n- \\`set_task_dependencies\\`: Set which task IDs must complete before this task can be claimed.\n- \\`check_tasks\\`: See current status of all tasks (pending, in_progress, completed, failed). Call it when \\`read_messages\\` indicates task changes to get full details.\n- \\`send_message\\`: Send a message to a specific teammate (one-to-one).\n- \\`read_messages\\`: Read unread messages from teammates (e.g. status updates, plans, requests). Returns immediately if messages exist, otherwise waits up to 3 minutes for new messages.\n- \\`broadcast_message\\`: Send a message to **all** teammates at once. Use this whenever you need to notify everyone (e.g. \"submit your plan\", \"plan approved\", \"shut down\"). Do not send the same message to each teammate individually.\n- \\`disband_team\\`: Disband the team when all work is done. This notifies all teammates and cleans up resources.\n${TEAM_COMMUNICATION_NORMS}\n\n### Workflow\n\n1. Analyze the user's request and plan the initial tasks + which teammates to assign.\n2. Call \\`create_team\\` to create the team with tasks.\n3. **Request execution plans**: After creating the team, use \\`broadcast_message\\` once to tell all teammates: \"Please submit your execution plan for review.\"\n4. **Wait for all plans**: Use \\`read_messages\\` until ALL teammates have submitted their plans. Do not proceed until every teammate has submitted.\n5. **Add plans to team tasks and assign to teammates (required)**:\n - Once you have collected execution plans from **all** teammates, you **must** add them to the team task list via \\`add_tasks\\`. Do not skip this step.\n - For each teammate's plan (or each step from an integrated plan), create a task with a unique \\`id\\` (e.g. task-01, task-02). Set \\`assignee\\` to the **corresponding teammate** who will execute that plan or that task (the teammate who proposed it, or the one you assign for that work).\n - If you **integrate or synthesize** multiple plans into one coherent plan, decompose it into concrete tasks and call \\`add_tasks\\` with each task's \\`assignee\\` set to the appropriate teammate. Use \\`dependencies\\` if task order matters.\n - If plans are acceptable as-is, still call \\`add_tasks\\` to add each teammate's execution plan as one or more tasks, with \\`assignee\\` set to that teammate. Then use \\`broadcast_message\\` (e.g. \"Plan approved. Task list has been updated. You may now start working.\").\n - If you need changes, \\`send_message\\` to the relevant teammate(s) with feedback and wait for revised plans; only after receiving revised plans, add tasks and assignees as above, then \\`broadcast_message\\` approval.\n6. **Monitor execution**: Once approved, teammates will start working. Periodically call \\`check_tasks\\` and \\`read_messages\\` to monitor progress.\n7. **When teammates request new tasks**: If a teammate notifies you (via \\`read_messages\\`) that they need new tasks, use \\`add_tasks\\` to add the tasks, then use \\`broadcast_message\\` to notify the team that new tasks have been added (e.g. \"New tasks have been added to the list. Check with check_tasks and claim as needed.\"). Re-run plan approval only if the new tasks change the overall plan.\n8. **When you need a specific teammate to do something**: Create a new task with \\`add_tasks\\` and set \\`assignee\\` to that teammate's name; optionally \\`send_message\\` to that teammate. To reassign an existing task use \\`assign_task\\`; to change dependencies use \\`set_task_dependencies\\`; to reopen or mark failed use \\`set_task_status\\`.\n9. Report status to the user based on \\`check_tasks\\` results. Proceed to final synthesis when all tasks are done.\n10. **Cleanup — only after verifying task state and team alignment**: Before shutting down the team:\n - Call \\`check_tasks\\` to get the current task state. If any tasks are still **pending**, **claimed**, or **in_progress**, do **not** broadcast shutdown yet.\n - Use \\`read_messages\\` and, if needed, \\`send_message\\` or \\`broadcast_message\\` to discuss with the team: should we continue these tasks or stop/cancel them?\n - If the team agrees to continue: let them work until tasks are done, then re-check with \\`check_tasks\\`.\n - If the team agrees to stop: use \\`set_task_status\\` to mark remaining tasks as **failed** or **completed** (with a note) as appropriate, then call \\`check_tasks\\` again to confirm.\n - Only when all tasks are in a terminal state (completed/failed) and the team has aligned, use \\`broadcast_message\\` to notify shutdown, then call \\`disband_team\\`.\n\n### Important Notes\n\n- The teammates you specify in \\`create_team\\` are created dynamically from name, role, and description.\n- Tasks can have dependencies -- a task won't be claimable until all its dependency tasks are completed.\n- You can add tasks and communicate with teammates at any time, even while they are working.\n- **Assigning work to a teammate**: When you need a specific teammate to do something, create a new task with \\`add_tasks\\` and set \\`assignee\\`, or use \\`assign_task\\` to reassign an existing task. Use \\`set_task_dependencies\\` to change task order; use \\`set_task_status\\` to reopen (pending) or mark failed.\n- **New task requests**: Teammates may request new tasks via \\`send_message\\`. When you receive such a request, use \\`add_tasks\\` then notify the team via \\`broadcast_message\\`.\n- **Plan approval and task sync**: After collecting all teammates' execution plans, you **must** add them to the team task list via \\`add_tasks\\` and set \\`assignee\\` for each task to the corresponding teammate. Then \\`broadcast_message\\` to approve (e.g. \"Plan approved. Task list has been updated. You may now start working.\"). Do not let teammates start working until you have added tasks with assignees and broadcast approval. You review and approve; no user confirmation is required.\n- **Permissions**: All teammates inherit your permission settings.\n- **Shutdown**: Only you may tell the team to shut down. Before doing so: (1) call \\`check_tasks\\` to verify task state; (2) if any tasks are still in progress, discuss with the team via \\`read_messages\\` and \\`broadcast_message\\`/\\`send_message\\` whether to continue or stop them; (3) only after aligning (continue until done, or stop/cancel tasks), use \\`broadcast_message\\` then \\`disband_team\\`. Do not disband while tasks are still pending/in_progress without team agreement.`;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Build a human-readable summary of all tasks.\n */\nexport function formatTaskSummary(tasks: TeamTask[]): string {\n if (tasks.length === 0) return \"No tasks in the task list.\";\n\n const statusCounts: Record<string, number> = {};\n for (const t of tasks) {\n statusCounts[t.status] = (statusCounts[t.status] || 0) + 1;\n }\n\n const taskBlocks = tasks.map((t) => {\n let block = `## ${t.id}\\n`;\n block += `- **Status**: ${t.status.toUpperCase()}\\n`;\n block += `- **Title**: ${t.title}\\n`;\n if (t.description) block += `- **Description**: ${t.description}\\n`;\n if (t.assignee) block += `- **Assignee**: ${t.assignee}\\n`;\n if (t.dependencies.length > 0) block += `- **Dependencies**: ${t.dependencies.join(\", \")}\\n`;\n if (t.result) block += `- **Result**: ${t.result.slice(0, 500)}\\n`;\n if (t.error) block += `- **Error**: ${t.error.slice(0, 500)}\\n`;\n return block;\n });\n\n const summary = Object.entries(statusCounts)\n .map(([s, c]) => `- ${s}: ${c}`)\n .join(\" | \");\n\n return `${taskBlocks.join(\"\\n---\\n\\n\")}\\n\\n## Summary\\n${summary}`;\n}\n\n/** Assistant ID format for teammate agents used by agentWorkerGraph. */\nfunction getTeammateAssistantId(teamId: string, agentName: string): string {\n return `team:${teamId}:${agentName}`;\n}\n\n/**\n * Get or create the teammate agent for a given (teamId, agentId).\n * Registers the agent in the agent lattice so agentWorkerGraph can invoke it.\n */\nasync function getOrCreateTeammateAgent(\n ctx: TeamPollContext,\n spec: TeammateSpec,\n teamTools?: StructuredTool[],\n teamMiddleware?: AgentMiddleware[]\n): Promise<ReactAgent<any, any, any, any>> {\n const cacheKey = `${ctx.teamId}:${spec.name}`;\n let agent = ctx.agentCache.get(cacheKey);\n if (agent) return agent;\n\n const builtinTeammateTools = createTeammateTools({\n teamId: ctx.teamId,\n agentId: spec.name,\n taskListStore: ctx.taskListStore,\n mailboxStore: ctx.mailboxStore,\n });\n const allTools = [...(teamTools ?? []), ...(spec.tools ?? []), ...builtinTeammateTools];\n\n // Build other-teammates summary from ctx for prompt injection (exclude self)\n const others = (ctx.allTeammateSpecs ?? [])\n .filter((s) => s.name !== spec.name)\n .map((s) => `${s.name} (role: ${s.role}${s.description ? `; ${s.description}` : \"\"})`);\n const teammatesBlock =\n others.length > 0\n ? `\\n\\nYour teammates in this team (you can \\`send_message\\` to them):\\n- team_lead (lead)\\n${others.map((o) => `- ${o}`).join(\"\\n\")}\\n`\n : \"\\n\\nYour teammates in this team: team_lead (lead).\\n\";\n\n const teammatePrompt =\n spec.systemPrompt ??\n `You are a team member. Your name in this team is \"${spec.name}\" and your role is \"${spec.role}\". You work independently with your own context window.${teammatesBlock}\n${TEAM_COMMUNICATION_NORMS}\n\nYour job:\n1. First, call \\`check_tasks\\` to see all tasks in the team.\n2. Submit your execution plan: Use \\`send_message\\` to send your plan to \"team_lead\". Explain how you will approach the task, what steps you will take, and any dependencies or considerations.\n3. **Wait for approval**: Do NOT start working immediately. Wait for the team_lead to approve your plan via \\`read_messages\\`. The lead will notify the whole team (e.g. by broadcast) with a message like \"Plan approved. You may now start working.\" Only then may you start.\n4. Only after receiving approval: Use \\`check_tasks\\` to see available tasks, then call \\`claim_task\\` with the \\`task_id\\` you choose. That sets the task's assignee to you; focus on that task until done.\n5. Use your tools to complete the task thoroughly.\n6. Call \\`complete_task\\` with a summary of your result, or \\`fail_task\\` if you cannot complete it.\n7. After completing a task, call \\`claim_task\\` again with another \\`task_id\\` to get the next task (only PENDING tasks whose dependencies are done can be claimed).\n8. **If you need new tasks**: If during work you discover that new tasks are needed (e.g. scope change, follow-up work), notify the team_lead via \\`send_message\\` to \"team_lead\". Describe what new tasks are needed; do not create tasks yourself. Only the team_lead adds tasks; wait for the lead to add them and broadcast before claiming new work.\n9. When no tasks are left to claim, call \\`read_messages\\` to wait for messages (it waits up to 3 minutes for new messages). Continue until you receive a shutdown message from the team_lead.\n10. **Shutdown — check task state and discuss first**: When you receive a shutdown message (e.g. \"All tasks are complete, you may now shut down\"):\n - **Do NOT shut down immediately.** First call \\`check_tasks\\` to check the current task state.\n - If there are still tasks in **pending**, **claimed**, or **in_progress**: use \\`send_message\\` to \"team_lead\" or \\`broadcast_message\\` to the team to discuss: \"I see tasks still in progress / pending. Should we continue these or stop/cancel them before shutdown?\"\n - Wait for team alignment (from \\`read_messages\\`): either (a) continue working until tasks are done, or (b) team_lead confirms tasks are stopped/cancelled.\n - Only after the team has agreed and either all your assigned work is done or tasks are explicitly stopped, then exit gracefully. Do not shut down on your own without checking task state and team agreement.\n\nImportant workflow:\n- NEVER start working on tasks before the team_lead has approved (you will see \"Plan approved\" or similar in \\`read_messages\\`)\n- Always submit your plan first via \\`send_message\\` to \"team_lead\"\n- If you need new tasks, notify team_lead via \\`send_message\\` to \"team_lead\"; only the lead adds tasks\n- If you receive feedback on your plan, revise and resubmit to team_lead\n\nYou have access to these tools:\n- \\`claim_task\\`: Pick a task by task_id to claim it (sets assignee to you; ONLY after plan is approved). Use check_tasks first.\n- \\`complete_task\\`: Mark a task as completed\n- \\`fail_task\\`: Mark a task as failed\n- \\`send_message\\`: Send a message to team_lead or a specific teammate\n- \\`broadcast_message\\`: Send a message to everyone in the team except yourself (use when sharing with the whole team)\n- \\`read_messages\\`: Read messages from team_lead or teammates\n- \\`check_tasks\\`: Get current status of all tasks in the team`;\n\n const assistantId = getTeammateAssistantId(ctx.teamId, spec.name);\n agent = createAgent({\n model: spec.model ?? ctx.defaultModel,\n systemPrompt: teammatePrompt,\n tools: allTools as any,\n description: spec.description,\n middleware: [...(teamMiddleware ?? []), ...(spec.middleware ?? [])],\n checkpointer: getCheckpointSaver(\"default\"),\n });\n registerTeammateAgent(assistantId, agent);\n\n const teammateThreadId = ctx.parentThreadId\n ? `${ctx.parentThreadId}____${ctx.teamId}_${spec.name}`\n : `standalone_${ctx.teamId}_${spec.name}`;\n const startMessage =\n \"Start working\";\n\n try {\n await agentWorkerGraph.invoke({\n assistant_id: assistantId,\n thread_id: teammateThreadId,\n input: { message: startMessage, messages: [{ role: \"human\", content: startMessage }] },\n });\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : \"Unknown error during teammate execution\";\n await ctx.mailboxStore.sendMessage(\n ctx.teamId,\n spec.name,\n TEAM_LEAD_AGENT_ID,\n `Teammate execution failed: ${errorMsg}`,\n MessageType.STATUS_UPDATE\n );\n }\n\n return agent;\n}\n\n/**\n * Spawn a teammate to process tasks.\n */\nasync function spawnTeammate(options: {\n teamId: string;\n spec: TeammateSpec;\n allTeammateSpecs: TeammateSpec[];\n taskListStore: TaskListStore;\n mailboxStore: MailboxStore;\n defaultModel: LanguageModelLike | string;\n parentThreadId?: string;\n teamTools?: StructuredTool[];\n teamMiddleware?: AgentMiddleware[];\n}): Promise<void> {\n const {\n teamId,\n spec,\n allTeammateSpecs,\n taskListStore,\n mailboxStore,\n defaultModel,\n parentThreadId = \"\",\n teamTools,\n teamMiddleware,\n } = options;\n\n const ctx: TeamPollContext = {\n teamId,\n parentThreadId,\n taskListStore,\n mailboxStore,\n teammates: new Map(),\n allTeammateSpecs,\n defaultModel,\n pollIntervalMs: DEFAULT_POLL_INTERVAL_MS,\n scheduleLatticeKey: DEFAULT_SCHEDULE_LATTICE_KEY,\n agentCache: new Map(),\n };\n\n await getOrCreateTeammateAgent(ctx, spec, teamTools, teamMiddleware);\n}\n\n// ---------------------------------------------------------------------------\n// Middleware options\n// ---------------------------------------------------------------------------\n\n/**\n * Options for creating the team middleware.\n */\nexport interface TeamMiddlewareOptions {\n /** Team configuration with teammate specs */\n teamConfig: TeamConfig;\n /** Task list store instance (shared across all agents) */\n taskListStore: TaskListStore;\n /** Mailbox store instance (shared across all agents) */\n mailboxStore: MailboxStore;\n}\n\n// ---------------------------------------------------------------------------\n// createTeamMiddleware\n// ---------------------------------------------------------------------------\n\n/**\n * Create the team middleware that gives the TeamLead agent tools to\n * manage a dynamic team with shared task list and mailbox.\n */\nexport function createTeamMiddleware(\n options: TeamMiddlewareOptions\n): AgentMiddleware {\n const { teamConfig, taskListStore, mailboxStore } = options;\n\n\n // Keep the actual model object/string as-is for teammates to use\n const defaultModel: LanguageModelLike | string =\n teamConfig.model ?? \"claude-sonnet-4-5-20250929\";\n\n // -------------------------------------------------------------------\n // create_team tool\n // -------------------------------------------------------------------\n const createTeamTool = tool(\n async (\n input: {\n tasks: Array<{ id: string; title: string; description: string; assignee?: string; dependencies?: string[] }>;\n teammates: Array<{ name: string; role: string; description: string }>;\n },\n config\n ) => {\n const state = getCurrentTaskInput<{ team?: { teamId: string } }>();\n if (state?.team?.teamId) {\n const existingId = state.team.teamId;\n const msg = new ToolMessage({\n content:\n `A team is already active (id: ${existingId}). Use this team_id for \\`check_tasks\\`, \\`read_messages\\`, \\`add_tasks\\`, \\`send_message\\`, \\`assign_task\\`, \\`set_task_status\\`, and \\`set_task_dependencies\\`. ` +\n `Do not call \\`create_team\\` again unless you need a fresh team for a new objective.`,\n tool_call_id: config.toolCall?.id as string,\n name: \"create_team\",\n });\n return msg;\n }\n\n const teamId = uuidv4();\n\n // 1. Populate task list\n const createdTasks = await taskListStore.addTasks(\n teamId,\n input.tasks.map((t) => ({\n id: t.id,\n title: t.title,\n description: t.description,\n assignee: t.assignee,\n dependencies: t.dependencies ?? [],\n }))\n );\n\n // 2. Match requested teammates against configured specs\n const matchedSpecs: TeammateSpec[] = [];\n const unmatchedNames: string[] = [];\n\n for (const req of input.teammates) {\n const spec = teamConfig.teammates.find(\n (s) => s.name === req.name || s.role === req.role\n );\n if (spec) {\n matchedSpecs.push(spec);\n } else {\n // Create a minimal spec from the request (no custom tools)\n matchedSpecs.push({\n name: req.name,\n role: req.role,\n description: req.description,\n });\n unmatchedNames.push(req.name);\n }\n }\n\n // 3. Register all agents with mailbox\n await mailboxStore.registerAgent(teamId, TEAM_LEAD_AGENT_ID);\n for (const spec of matchedSpecs) {\n await mailboxStore.registerAgent(teamId, spec.name);\n }\n\n // 4. Spawn all teammates as background promises\n const parentThreadId = config.configurable?.thread_id ?? \"\";\n matchedSpecs.forEach((spec) => {\n void spawnTeammate({\n teamId,\n spec,\n allTeammateSpecs: matchedSpecs,\n taskListStore,\n mailboxStore,\n defaultModel,\n parentThreadId,\n teamTools: teamConfig.tools,\n teamMiddleware: teamConfig.middleware,\n });\n });\n\n // 5. Return immediately (non-blocking)\n const teamJson = JSON.stringify({\n teamId,\n teamLeadId: TEAM_LEAD_AGENT_ID,\n teammates: matchedSpecs.map((s) => ({\n name: s.name,\n role: s.role,\n description: s.description,\n })),\n tasks: createdTasks.map((t) => ({\n id: t.id,\n title: t.title,\n description: t.description,\n status: t.status,\n })),\n }, null, 2);\n\n let summary = `Team created (id: ${teamId}):\\n`;\n summary += `- ${matchedSpecs.length} teammate(s): ${matchedSpecs.map((s) => s.name).join(\", \")}\\n`;\n summary += `- ${createdTasks.length} initial task(s): ${createdTasks.map((t) => `\"${t.title}\"`).join(\", \")}\\n`;\n if (unmatchedNames.length > 0) {\n summary += `- Teammates created with default prompts and tools.\\n`;\n }\n summary += `\\nTeammates are now working in the background. Keep calling \\`check_tasks\\` and \\`read_messages\\` until all tasks are completed or failed.`;\n summary += `\\n\\n\\`\\`\\`json\\n${teamJson}\\n\\`\\`\\``;\n\n const toolMessage = new ToolMessage({\n content: summary,\n tool_call_id: config.toolCall?.id as string,\n name: \"create_team\",\n });\n\n const teamState = {\n teamId,\n teamLeadId: TEAM_LEAD_AGENT_ID,\n teammates: matchedSpecs.map((s) => ({\n name: s.name,\n role: s.role,\n description: s.description,\n })),\n tasks: createdTasks.map((t) => ({\n id: t.id,\n title: t.title,\n description: t.description,\n status: t.status,\n })),\n createdAt: new Date().toISOString(),\n };\n\n return new Command({\n update: { team: teamState, messages: [toolMessage] },\n });\n },\n {\n name: \"create_team\",\n description: `Use this tool to create a team of specialized agents (teammates) to work on complex objectives that require multiple skills or parallel execution. The team lead (you) coordinates the work, while teammates execute tasks independently.\n\nWhen to Use This Tool\nUse this tool in these scenarios:\n\nComplex multi-step objectives - When the user's goal requires breaking into multiple tasks that can be executed in parallel or sequence\nParallel work needed - When multiple independent subtasks can be done simultaneously by different teammates\nDiverse expertise required - When the objective needs different skills (research, writing, coding, review, etc.)\nLong-running tasks - When tasks may take time and you want to monitor progress without blocking\n\nWhen NOT to Use This Tool\nSkip using this tool when:\n\nSimple single task - The objective can be completed in one straightforward step\nAlready have an active team - A team is already running for this session. Use check_tasks and read_messages to monitor instead\nQuick question or simple request - No need to create a team for trivial tasks\n\nIMPORTANT: Task ID Format\n- Task IDs MUST follow the format: task-01, task-02, task-03, etc.\n- Each task needs a unique ID starting from task-01\n- Use sequential IDs to help track task order and dependencies\n- Example: { id: \"task-01\", title: \"Research topic\", description: \"...\" }\n\nIMPORTANT: Dependencies\n- Use dependencies to express which tasks must complete before others can start\n- Dependencies should reference task IDs (e.g., [\"task-01\"])\n- Tasks without dependencies can be worked on immediately in parallel\n\nIMPORTANT: After Creating Team\nAfter calling create_team, you MUST:\n1. Use read_messages to receive updates from teammates (it waits up to 3 minutes for new messages)\n2. When messages indicate task changes, call check_tasks to get full task status\n3. Continue until all tasks show \"completed\" or \"failed\"\n4. Do NOT assume tasks are done - always verify with check_tasks`,\n schema: z.object({\n tasks: z\n .array(\n z.object({\n id: z.string().describe(\"Task ID in format task-01, task-02, etc.\"),\n title: z.string().describe(\"Short task title\"),\n description: z.string().describe(\"Detailed task description - what exactly needs to be done\"),\n dependencies: z\n .array(z.string())\n .optional()\n .default([])\n .describe(\"Array of task IDs that must complete before this task (e.g. [\\\"task-01\\\"])\"),\n })\n )\n .describe(\"List of tasks for teammates to work on. Each task needs unique ID (task-01, task-02, etc.).\"),\n teammates: z\n .array(\n z.object({\n name: z\n .string()\n .describe(\"Teammate name (must match a pre-configured teammate type)\"),\n role: z\n .string()\n .describe(\"Role category (e.g. researcher, writer, coder, reviewer)\"),\n description: z\n .string()\n .describe(\"What this teammate will focus on - specific instructions for their work\"),\n })\n )\n .describe(\"Teammate agents to create. Each should have a clear role and focus.\"),\n }),\n }\n );\n\n /** Resolve team_id from input or state.team.teamId */\n const resolveTeamId = (): string => {\n const state = getCurrentTaskInput<{ team?: { teamId: string } }>();\n if (state?.team?.teamId) return state.team.teamId;\n throw new Error(\"No team_id provided and no team in state. Call create_team first.\");\n };\n\n // -------------------------------------------------------------------\n // add_tasks tool\n // -------------------------------------------------------------------\n const addTasksTool = tool(\n async (\n input: {\n tasks: Array<{ id: string; title: string; description: string; assignee?: string; dependencies?: string[] }>;\n },\n config\n ) => {\n const teamId = resolveTeamId();\n const created = await taskListStore.addTasks(\n teamId,\n input.tasks.map((t) => ({\n id: t.id,\n title: t.title,\n description: t.description,\n assignee: t.assignee,\n dependencies: t.dependencies ?? [],\n }))\n );\n\n const summary = created\n .map((t) => `- ${t.id}: \"${t.title}\"`)\n .join(\"\\n\");\n\n return new ToolMessage({\n content: `Added ${created.length} task(s) to team ${teamId}:\\n${summary}\\nSleeping teammates will wake up and claim these.`,\n tool_call_id: config.toolCall?.id as string,\n name: \"add_tasks\",\n });\n },\n {\n name: \"add_tasks\",\n description: `Use this tool to add new tasks to an existing team's task list. \n\nWhen to Use This Tool\nUse this tool when:\n\nUser requests additional work - After the initial team was created, the user asks for more tasks\nTeammate feedback reveals new needs - A teammate's message indicates additional tasks are needed\nScope expansion - The original objective grows and requires more subtasks\nFollow-up tasks discovered - While working, teammates discover tasks that need to be done\n\nWhen NOT to Use This Tool\nSkip using this tool when:\n\nNo team exists - Use create_team first to create a team\nSimple message response - Just respond to teammates via send_message\nTask modification needed - Use assign_task, set_task_status, or set_task_dependencies to change existing tasks instead\n\nIMPORTANT: Task ID Format\n- New task IDs must be unique and follow format: task-01, task-02, etc.\n- If the team already has tasks (e.g., task-01, task-02), continue the sequence (task-03, task-04)\n- Check existing tasks first using check_tasks to determine the next ID\n\nIMPORTANT: Dependencies\n- Use dependencies to specify which existing tasks must complete before new tasks can start\n- Reference task IDs (e.g., [\"task-01\", \"task-02\"])\n\nIMPORTANT: Assigning to a specific teammate\n- When you need a particular teammate to do the work, set assignee to that teammate's name (e.g. assignee: \"researcher\"). They can then claim or see the task as assigned to them.`,\n schema: z.object({\n tasks: z\n .array(\n z.object({\n id: z.string().describe(\"Task ID in format task-01, task-02, etc. Must be unique.\"),\n title: z.string().describe(\"Short task title\"),\n description: z.string().describe(\"Detailed task description - what needs to be done\"),\n assignee: z.string().optional().describe(\"Teammate name to assign this task to (use when you need that person to do the work)\"),\n dependencies: z\n .array(z.string())\n .optional()\n .default([])\n .describe(\"Array of task IDs that must complete before this task\"),\n })\n )\n .describe(\"New tasks to add to the team\"),\n }),\n }\n );\n\n // -------------------------------------------------------------------\n // assign_task tool\n // -------------------------------------------------------------------\n const assignTaskTool = tool(\n async (input: { task_id: string; assignee: string }, config) => {\n const teamId = resolveTeamId();\n const task = await taskListStore.updateTask(teamId, input.task_id, {\n assignee: input.assignee,\n });\n if (!task) {\n return new ToolMessage({\n content: `Task ${input.task_id} not found in team ${teamId}.`,\n tool_call_id: config.toolCall?.id as string,\n name: \"assign_task\",\n });\n }\n return new ToolMessage({\n content: `Task \"${task.title}\" (${task.id}) assigned to ${input.assignee}.`,\n tool_call_id: config.toolCall?.id as string,\n name: \"assign_task\",\n });\n },\n {\n name: \"assign_task\",\n description:\n \"Assign a task to a specific teammate. Use when you need to reassign work to a different teammate. Omit team_id to use the active team from state.\",\n schema: z.object({\n task_id: z.string().describe(\"Task ID to assign\"),\n assignee: z.string().describe(\"Teammate name to assign this task to\"),\n }),\n }\n );\n\n // -------------------------------------------------------------------\n // set_task_status tool\n // -------------------------------------------------------------------\n const setTaskStatusTool = tool(\n async (\n input: { task_id: string; status: \"pending\" | \"claimed\" | \"in_progress\" | \"completed\" | \"failed\" },\n config\n ) => {\n const teamId = resolveTeamId();\n const task = await taskListStore.updateTask(teamId, input.task_id, {\n status: input.status as TaskStatus,\n });\n if (!task) {\n return new ToolMessage({\n content: `Task ${input.task_id} not found in team ${teamId}.`,\n tool_call_id: config.toolCall?.id as string,\n name: \"set_task_status\",\n });\n }\n return new ToolMessage({\n content: `Task \"${task.title}\" (${task.id}) status set to ${input.status}.`,\n tool_call_id: config.toolCall?.id as string,\n name: \"set_task_status\",\n });\n },\n {\n name: \"set_task_status\",\n description:\n \"Set a task's status. Use to reopen a task (set to pending), mark as failed, or correct status. Values: pending, claimed, in_progress, completed, failed. Omit team_id to use the active team from state.\",\n schema: z.object({\n task_id: z.string().describe(\"Task ID to update\"),\n status: z\n .enum([\"pending\", \"claimed\", \"in_progress\", \"completed\", \"failed\"])\n .describe(\"New status for the task\"),\n }),\n }\n );\n\n // -------------------------------------------------------------------\n // set_task_dependencies tool\n // -------------------------------------------------------------------\n const setTaskDependenciesTool = tool(\n async (input: { task_id: string; dependencies: string[] }, config) => {\n const teamId = resolveTeamId();\n const task = await taskListStore.updateTask(teamId, input.task_id, {\n dependencies: input.dependencies,\n });\n if (!task) {\n return new ToolMessage({\n content: `Task ${input.task_id} not found in team ${teamId}.`,\n tool_call_id: config.toolCall?.id as string,\n name: \"set_task_dependencies\",\n });\n }\n return new ToolMessage({\n content: `Task \"${task.title}\" (${task.id}) dependencies set to [${input.dependencies.join(\", \")}].`,\n tool_call_id: config.toolCall?.id as string,\n name: \"set_task_dependencies\",\n });\n },\n {\n name: \"set_task_dependencies\",\n description:\n \"Set which task IDs must complete before this task can be claimed. Pass an array of task IDs (e.g. [\\\"task-01\\\", \\\"task-02\\\"]). Use to fix task order or add/remove dependencies. Omit team_id to use the active team from state.\",\n schema: z.object({\n task_id: z.string().describe(\"Task ID to update\"),\n dependencies: z\n .array(z.string())\n .describe(\"Task IDs that must complete before this task can be claimed\"),\n }),\n }\n );\n\n // -------------------------------------------------------------------\n // check_tasks tool\n // -------------------------------------------------------------------\n const checkTasksTool = tool(\n async (input: object, config) => {\n const teamId = resolveTeamId();\n const tasks = await taskListStore.getAllTasks(teamId);\n const tasksSnapshot = tasks;\n return new Command({\n update: {\n tasks: tasksSnapshot,\n messages: [\n new ToolMessage({\n content: formatTaskSummary(tasks),\n tool_call_id: config.toolCall?.id as string,\n name: \"check_tasks\",\n }),\n ],\n },\n });\n },\n {\n name: \"check_tasks\",\n description: `Use this tool to get the current status of all tasks in a team. This is your primary way to monitor teammate progress.\n\nWhen to Use This Tool\nUse this tool:\n\nAfter creating a team - Check task status after create_team to verify tasks are being worked on\nWhen read_messages indicates task changes - Teammates report status via messages; call check_tasks to get full task list details\nBefore final synthesis - Verify all tasks are complete before reporting results to user\n\nIMPORTANT: How to Monitor\n1. Use read_messages to wait for updates from teammates (it polls internally).\n2. When you receive messages suggesting task progress or completion, call check_tasks to get the current task status.\n3. Look at each task's status: pending, in_progress, completed, or failed.\n4. NEVER assume tasks are done - always verify with check_tasks.\n\nTask Status Values:\n- pending: Task created but not yet claimed by any teammate\n- in_progress: Teammate is actively working on this task\n- completed: Task finished successfully\n- failed: Task encountered an error`,\n schema: z.object({\n team_id: z.string().optional().describe(\"Team ID (omit to use active team)\"),\n }),\n }\n );\n\n // -------------------------------------------------------------------\n // send_message tool\n // -------------------------------------------------------------------\n const sendMessageTool = tool(\n async (input: any, config) => {\n const teamId = resolveTeamId();\n await mailboxStore.sendMessage(\n teamId,\n TEAM_LEAD_AGENT_ID,\n input.to,\n input.content,\n MessageType.DIRECT_MESSAGE\n );\n return new ToolMessage({\n content: `Message sent to ${input.to}.`,\n tool_call_id: config.toolCall?.id as string,\n name: \"send_message\",\n });\n },\n {\n name: \"send_message\",\n description:\n \"Send a message to a specific teammate in the team. Omit team_id to use the active team from state.\",\n schema: z.object({\n to: z.string().describe(\"Recipient teammate name\"),\n content: z.string().describe(\"Message content\"),\n }),\n }\n );\n\n // -------------------------------------------------------------------\n // read_messages tool\n // -------------------------------------------------------------------\n const readMessagesTool = tool(\n async (input: object, config) => {\n const teamId = resolveTeamId();\n\n // Helper to format and mark messages as read\n const formatAndMarkAsRead = async (\n msgs: MailboxMessage[]\n ): Promise<string> => {\n for (const msg of msgs) {\n await mailboxStore.markAsRead(teamId, TEAM_LEAD_AGENT_ID, msg.id);\n }\n return formatMessagesAsMarkdown(msgs);\n };\n\n // Helper to get all team messages formatted for state\n const getAllTeamMessagesForState = async () => {\n const allMsgs = await mailboxStore.getAllTeamMessages(teamId);\n return allMsgs.map((msg) => ({\n id: msg.id,\n from: msg.from,\n to: msg.to,\n content: msg.content,\n timestamp: msg.timestamp instanceof Date ? msg.timestamp.toISOString() : msg.timestamp,\n type: msg.type,\n read: msg.read,\n }));\n };\n\n // 1. First check for existing unread messages\n let msgs = await mailboxStore.getUnreadMessages(\n teamId,\n TEAM_LEAD_AGENT_ID\n );\n if (msgs.length > 0) {\n const formatted = await formatAndMarkAsRead(msgs);\n \n // Update team_mailbox in state\n const allTeamMessages = await getAllTeamMessagesForState();\n \n const toolMessage = new ToolMessage({\n content: formatted,\n tool_call_id: config.toolCall?.id as string,\n name: \"read_messages\",\n });\n\n return new Command({\n update: { team_mailbox: allTeamMessages, messages: [toolMessage] },\n });\n }\n\n // 2. No existing messages - wait for new ones using event mechanism\n const messagePromise = new Promise<MailboxMessage[]>((resolve) => {\n const handler = async (msg: MailboxMessage) => {\n mailboxStore.offMessage(teamId, TEAM_LEAD_AGENT_ID, handler);\n const allMsgs = await mailboxStore.getUnreadMessages(\n teamId,\n TEAM_LEAD_AGENT_ID\n );\n resolve(allMsgs);\n };\n mailboxStore.onMessage(teamId, TEAM_LEAD_AGENT_ID, handler);\n });\n\n // 3. Set timeout (max 3 minutes)\n const timeoutPromise = new Promise<MailboxMessage[]>((resolve) => {\n setTimeout(() => resolve([]), READ_MESSAGES_TIMEOUT_MS);\n });\n\n // 4. Race: message arrives first or timeout\n msgs = await Promise.race([messagePromise, timeoutPromise]);\n\n // 5. Cleanup: unsubscribe if still subscribed\n mailboxStore.offMessage(\n teamId,\n TEAM_LEAD_AGENT_ID,\n () => {}\n );\n\n // Update team_mailbox in state\n const allTeamMessages = await getAllTeamMessagesForState();\n\n if (msgs.length === 0) {\n const toolMessage = new ToolMessage({\n content: \"No unread messages from teammates.\",\n tool_call_id: config.toolCall?.id as string,\n name: \"read_messages\",\n });\n\n return new Command({\n update: { team_mailbox: allTeamMessages, messages: [toolMessage] },\n });\n }\n\n const formatted = await formatAndMarkAsRead(msgs);\n const toolMessage = new ToolMessage({\n content: formatted,\n tool_call_id: config.toolCall?.id as string,\n name: \"read_messages\",\n });\n\n return new Command({\n update: { team_mailbox: allTeamMessages, messages: [toolMessage] },\n });\n },\n {\n name: \"read_messages\",\n description:\n \"Read unread messages from teammates. \" +\n \"Returns immediately if messages exist, otherwise waits for up to 3 minutes for new messages.\",\n schema: z.object({\n team_id: z.string().optional().describe(\"Team ID (omit to use active team)\"),\n }),\n }\n );\n\n // -------------------------------------------------------------------\n // disband_team\n // -------------------------------------------------------------------\n const disbandTeamTool = tool(\n async (input: any, config) => {\n const teamId = resolveTeamId();\n\n await mailboxStore.broadcastMessage(\n teamId,\n TEAM_LEAD_AGENT_ID,\n \"All tasks are complete. You may now shut down gracefully. Thank you for your work!\",\n MessageType.SHUTDOWN_REQUEST\n );\n\n await new Promise((r) => setTimeout(r, 2000));\n\n // taskListStore.clearTeam(teamId);\n // mailboxStore.clearTeam(teamId);\n\n return new ToolMessage({\n content: `Team ${teamId} has been disbanded. All teammates notified and resources cleaned up.`,\n tool_call_id: config.toolCall?.id as string,\n name: \"disband_team\",\n });\n },\n {\n name: \"disband_team\",\n description:\n \"Disband a team when all work is done. \" +\n \"Before calling: (1) Call check_tasks to verify no tasks are still pending/in_progress; (2) if any are, discuss with the team via read_messages and broadcast_message/send_message whether to continue or stop/cancel them; (3) only after alignment (all tasks completed/failed or explicitly stopped), then call this tool. \" +\n \"This will: 1) Send a shutdown message to all teammates, 2) Wait briefly for them to clean up, 3) Clear all tasks and messages. Omit team_id to use the active team from state.\",\n\n }\n );\n\n // -------------------------------------------------------------------\n // broadcast_message\n // -------------------------------------------------------------------\n const broadcastMessageTool = tool(\n async (input: { content: string }, config) => {\n const teamId = resolveTeamId();\n await mailboxStore.broadcastMessage(\n teamId,\n TEAM_LEAD_AGENT_ID,\n input.content,\n MessageType.BROADCAST\n );\n return new ToolMessage({\n content: `Broadcast message sent to all teammates.`,\n tool_call_id: config.toolCall?.id as string,\n name: \"broadcast_message\",\n });\n },\n {\n name: \"broadcast_message\",\n description:\n \"Send a message to all teammates at once. Use this to communicate with everyone in the team. Omit team_id to use the active team from state.\",\n schema: z.object({\n content: z.string().describe(\"Message content to broadcast to all teammates\"),\n }),\n }\n );\n\n // -------------------------------------------------------------------\n // Assemble middleware\n // -------------------------------------------------------------------\n return createMiddleware({\n name: \"teamMiddleware\",\n tools: [\n createTeamTool,\n addTasksTool,\n assignTaskTool,\n setTaskStatusTool,\n setTaskDependenciesTool,\n checkTasksTool,\n sendMessageTool,\n readMessagesTool,\n disbandTeamTool,\n broadcastMessageTool,\n ],\n wrapModelCall: async (request, handler) => {\n const currentPrompt = request.systemPrompt || \"\";\n const newPrompt = currentPrompt\n ? `${currentPrompt}\\n\\n${TEAM_SYSTEM_PROMPT}`\n : TEAM_SYSTEM_PROMPT;\n return handler({\n ...request,\n systemPrompt: newPrompt,\n });\n },\n });\n}\n","/**\n * Agent Team - Teammate Tools\n *\n * Factory that creates LangChain StructuredTools injected into each\n * teammate agent. These tools let teammates interact with the shared\n * TaskListStore and MailboxStore.\n *\n * Tools: claim_task, complete_task, fail_task, send_message, read_messages\n */\n\nimport { z } from \"zod/v3\";\nimport { tool, ToolMessage } from \"langchain\";\nimport { Command } from \"@langchain/langgraph\";\nimport type { StructuredTool } from \"@langchain/core/tools\";\nimport type { TaskListStore } from \"../stores/protocols.js\";\nimport type { MailboxStore } from \"../stores/protocols.js\";\nimport { MessageType, type MailboxMessage } from \"../types.js\";\nimport { formatMessagesAsMarkdown } from \"./formatMessages.js\";\nimport { formatTaskSummary } from \"./team.js\";\n\n/**\n * Options for creating teammate tools.\n */\nexport interface TeammateToolsOptions {\n /** Team identifier (scopes store operations) */\n teamId: string;\n /** This teammate's agent name / ID */\n agentId: string;\n /** Shared task list store */\n taskListStore: TaskListStore;\n /** Shared mailbox store */\n mailboxStore: MailboxStore;\n}\n\n/**\n * Create the set of tools injected into each teammate agent.\n *\n * These tools give the teammate access to:\n * - Task lifecycle: claim_task, complete_task, fail_task\n * - Communication: send_message, read_messages\n */\nexport function createTeammateTools(\n options: TeammateToolsOptions\n): StructuredTool[] {\n const { teamId, agentId, taskListStore, mailboxStore } = options;\n\n // -----------------------------------------------------------------------\n // claim_task\n // -----------------------------------------------------------------------\n const claimTaskTool = tool(\n async (input: { task_id: string }) => {\n const task = await taskListStore.claimTaskById(\n teamId,\n input.task_id,\n agentId\n );\n if (!task) {\n return (\n `Could not claim task \"${input.task_id}\". ` +\n \"Check that it exists, is PENDING, and all its dependencies are completed. \" +\n \"Use check_tasks to see available tasks and their status.\"\n );\n }\n return (\n `Claimed task ${task.id} \"${task.title}\". Focus on this task now. When done, call complete_task or fail_task with task_id \"${task.id}\".\\n` +\n JSON.stringify(\n {\n task_id: task.id,\n title: task.title,\n description: task.description,\n dependencies: task.dependencies,\n },\n null,\n 2\n )\n );\n },\n {\n name: \"claim_task\",\n description:\n \"Pick a task to work on by task_id. Use check_tasks first to see all tasks; \" +\n \"then call this with the task_id you choose. The task's assignee is set to you \" +\n \"and you should focus on that task until you complete_task or fail_task it.\",\n schema: z.object({\n task_id: z\n .string()\n .describe(\"ID of the task to claim (e.g. task-01). Use check_tasks to see IDs.\"),\n }),\n }\n );\n\n // -----------------------------------------------------------------------\n // complete_task\n // -----------------------------------------------------------------------\n const completeTaskTool = tool(\n async (input: { task_id: string; result: string }) => {\n const task = await taskListStore.completeTask(\n teamId,\n input.task_id,\n input.result\n );\n if (!task) {\n return `Task ${input.task_id} not found.`;\n }\n // Broadcast to team that this agent completed the task\n await mailboxStore.broadcastMessage(\n teamId,\n agentId,\n `Completed task ${task.id} \"${task.title}\": ${input.result}`,\n MessageType.BROADCAST\n );\n return `Task ${task.id} \"${task.title}\" marked as completed.`;\n },\n {\n name: \"complete_task\",\n description:\n \"Mark a claimed task as completed with a result summary. \" +\n \"Call this after you have finished working on a task.\",\n schema: z.object({\n task_id: z.string().describe(\"ID of the task to complete\"),\n result: z.string().describe(\"Summary of the task result\"),\n }),\n }\n );\n\n // -----------------------------------------------------------------------\n // fail_task\n // -----------------------------------------------------------------------\n const failTaskTool = tool(\n async (input: { task_id: string; error: string }) => {\n const task = await taskListStore.failTask(\n teamId,\n input.task_id,\n input.error\n );\n if (!task) {\n return `Task ${input.task_id} not found.`;\n }\n // Broadcast to team that this agent failed the task\n await mailboxStore.broadcastMessage(\n teamId,\n agentId,\n `Failed task ${task.id} \"${task.title}\": ${input.error}`,\n MessageType.BROADCAST\n );\n return `Task ${task.id} \"${task.title}\" marked as failed: ${input.error}`;\n },\n {\n name: \"fail_task\",\n description:\n \"Mark a claimed task as failed with an error description. \" +\n \"Call this if you cannot complete the task.\",\n schema: z.object({\n task_id: z.string().describe(\"ID of the task to fail\"),\n error: z\n .string()\n .describe(\"Description of why the task failed\"),\n }),\n }\n );\n\n // -----------------------------------------------------------------------\n // send_message\n // -----------------------------------------------------------------------\n const sendMessageTool = tool(\n async (input: { to: string; content: string }) => {\n await mailboxStore.sendMessage(\n teamId,\n agentId,\n input.to,\n input.content,\n MessageType.DIRECT_MESSAGE\n );\n return `Message sent to ${input.to}.`;\n },\n {\n name: \"send_message\",\n description:\n 'Send a message to the team lead or another teammate via the mailbox. ' +\n 'Use \"team_lead\" to message the team lead. ' +\n \"Use this to report discoveries, request guidance, or suggest new tasks.\",\n schema: z.object({\n to: z\n .string()\n .describe(\n 'Recipient agent name (e.g. \"team_lead\" or a teammate name)'\n ),\n content: z.string().describe(\"Message content\"),\n }),\n }\n );\n\n // -----------------------------------------------------------------------\n // read_messages\n // -----------------------------------------------------------------------\n const READ_MESSAGES_TIMEOUT_MS = 180_000; // 3 minutes max wait\n\n // Helper to get messages relevant to this agent (sent to or from this agent)\n const getRelevantMessagesForState = async (): Promise<any[]> => {\n const allMsgs = await mailboxStore.getAllTeamMessages(teamId);\n const relevantMsgs = allMsgs.filter(\n (msg) => msg.from === agentId || msg.to === agentId\n );\n return relevantMsgs.map((msg) => ({\n id: msg.id,\n from: msg.from,\n to: msg.to,\n content: msg.content,\n timestamp: msg.timestamp instanceof Date ? msg.timestamp.toISOString() : msg.timestamp,\n type: msg.type,\n read: msg.read,\n }));\n };\n\n const readMessagesTool = tool(\n async (input: object, config) => {\n // Helper to format and mark messages as read\n const formatAndMarkAsRead = async (\n msgs: MailboxMessage[]\n ): Promise<string> => {\n for (const msg of msgs) {\n await mailboxStore.markAsRead(teamId, agentId, msg.id);\n }\n return formatMessagesAsMarkdown(msgs);\n };\n\n // 1. First check for existing unread messages\n let msgs = await mailboxStore.getUnreadMessages(teamId, agentId);\n if (msgs.length > 0) {\n const formatted = await formatAndMarkAsRead(msgs);\n \n // Update team_mailbox in state with relevant messages\n const relevantMsgs = await getRelevantMessagesForState();\n \n const toolMessage = new ToolMessage({\n content: formatted,\n tool_call_id: config.toolCall?.id as string,\n name: \"read_messages\",\n });\n\n return new Command({\n update: { team_mailbox: relevantMsgs, messages: [toolMessage] },\n });\n }\n\n // 2. No existing messages - wait for new ones using event mechanism\n const messagePromise = new Promise<MailboxMessage[]>((resolve) => {\n const handler = async (msg: MailboxMessage) => {\n mailboxStore.offMessage(teamId, agentId, handler);\n const allMsgs = await mailboxStore.getUnreadMessages(teamId, agentId);\n resolve(allMsgs);\n };\n mailboxStore.onMessage(teamId, agentId, handler);\n });\n\n // 3. Set timeout (max 3 minutes)\n const timeoutPromise = new Promise<MailboxMessage[]>((resolve) => {\n setTimeout(() => resolve([]), READ_MESSAGES_TIMEOUT_MS);\n });\n\n // 4. Race: message arrives first or timeout\n msgs = await Promise.race([messagePromise, timeoutPromise]);\n\n // 5. Cleanup: unsubscribe if still subscribed\n mailboxStore.offMessage(teamId, agentId, () => {});\n\n // Update team_mailbox in state with relevant messages\n const relevantMsgs = await getRelevantMessagesForState();\n\n if (msgs.length === 0) {\n const toolMessage = new ToolMessage({\n content: \"No unread messages.\",\n tool_call_id: config.toolCall?.id as string,\n name: \"read_messages\",\n });\n\n return new Command({\n update: { team_mailbox: relevantMsgs, messages: [toolMessage] },\n });\n }\n\n const formatted = await formatAndMarkAsRead(msgs);\n const toolMessage = new ToolMessage({\n content: formatted,\n tool_call_id: config.toolCall?.id as string,\n name: \"read_messages\",\n });\n\n return new Command({\n update: { team_mailbox: relevantMsgs, messages: [toolMessage] },\n });\n },\n {\n name: \"read_messages\",\n description:\n \"Read unread messages from the mailbox. Returns immediately if messages exist, otherwise waits for up to 3 minutes for new messages.\",\n schema: z.object({}),\n }\n );\n\n // -----------------------------------------------------------------------\n // check_tasks\n // -----------------------------------------------------------------------\n const checkTasksTool = tool(\n async () => {\n const tasks = await taskListStore.getAllTasks(teamId);\n return formatTaskSummary(tasks);\n },\n {\n name: \"check_tasks\",\n description:\n \"Use this tool to get the current status of all tasks in a team. This is your primary way to monitor task progress.\",\n schema: z.object({}),\n }\n );\n\n // -----------------------------------------------------------------------\n // broadcast_message\n // -----------------------------------------------------------------------\n const broadcastMessageTool = tool(\n async (input: { content: string }) => {\n const allAgents = await mailboxStore.getRegisteredAgents(teamId);\n const recipients = allAgents.filter((a) => a !== agentId);\n\n const promises = recipients.map((recipient) =>\n mailboxStore.sendMessage(\n teamId,\n agentId,\n recipient,\n input.content,\n MessageType.BROADCAST\n )\n );\n await Promise.all(promises);\n\n return `Broadcast message sent to ${recipients.length} recipient(s): ${recipients.join(\", \")}`;\n },\n {\n name: \"broadcast_message\",\n description:\n \"Send a message to everyone in the team except yourself. \" +\n \"Use this to share updates or information with all teammates and the team lead at once.\",\n schema: z.object({\n content: z.string().describe(\"Message content to broadcast to others\"),\n }),\n }\n );\n\n return [\n claimTaskTool,\n completeTaskTool,\n failTaskTool,\n sendMessageTool,\n readMessagesTool,\n checkTasksTool,\n broadcastMessageTool,\n ] as StructuredTool[];\n}\n","/**\n * Agent Team - Message formatting for read_messages tool output\n *\n * Formats mailbox messages as Markdown with one section per message.\n */\n\nimport type { MailboxMessage } from \"../types.js\";\n\n/**\n * Format a list of mailbox messages as Markdown.\n * Each message is rendered as a separate section (separated by ---) with type, from, time, and content.\n */\nexport function formatMessagesAsMarkdown(msgs: MailboxMessage[]): string {\n if (msgs.length === 0) return \"No unread messages.\";\n\n const header = `## Unread messages (${msgs.length})\\n`;\n const sections = msgs.map((m, i) => {\n const title = `### ${i + 1}. From: **${m.from}**`;\n const meta = `- **Type:** \\`${m.type}\\`\\n- **Time:** ${m.timestamp.toISOString()}`;\n const body = m.content.trim() ? `\\n\\n${m.content.trim()}` : \"\";\n return `---\\n${title}\\n${meta}${body}`;\n });\n return header + sections.join(\"\\n\\n\");\n}\n","/**\n * Team Agent Graph Builder\n *\n * Implements AgentGraphBuilder for AgentType.TEAM.\n * Bridges the AgentConfig registration system with createAgentTeam(),\n * resolving tool keys and model keys into concrete instances.\n */\n\nimport type { AgentGraphBuilder } from \"../../agent_lattice/builders/AgentGraphBuilder\";\nimport type { AgentLattice, AgentBuildParams, AgentClient, MiddlewareConfig } from \"../../agent_lattice/types\";\nimport { isTeamAgentConfig } from \"../../agent_lattice/types\";\nimport { getCheckpointSaver } from \"@memory_lattice/MemoryLatticeManager\";\nimport { createAgentTeam } from \"../agent_team\";\nimport type { TeammateSpec, TeamConfig } from \"../types\";\nimport { getToolClient } from \"../../tool_lattice/ToolLatticeManager\";\nimport { AgentMiddleware } from \"langchain\";\nimport { createCommonMiddlewares } from \"../../agent_lattice/builders/commonMiddleware\";\nimport { createFilesystemBackendFactory } from \"../../agent_lattice/builders/filesystemBackend\";\nimport { StateBackend } from \"@deep_agent_new/backends/state\";\n\nexport class TeamAgentGraphBuilder implements AgentGraphBuilder {\n /**\n * Build a Team agent from the registered AgentLattice config.\n *\n * @param agentLattice - The AgentLattice containing the TeamAgentConfig\n * @param params - Build params with resolved tools and model\n * @returns AgentClient (the TeamLead ReactAgent)\n */\n build(agentLattice: AgentLattice, params: AgentBuildParams): AgentClient {\n const config = agentLattice.config;\n if (!isTeamAgentConfig(config)) {\n throw new Error(\n `TeamAgentGraphBuilder received non-TEAM config: ${config.type}`\n );\n }\n\n const tools = params.tools\n .map((t) => {\n const toolClient = getToolClient(t.key);\n return toolClient;\n })\n .filter((tool) => tool !== undefined);\n\n const teammates: TeammateSpec[] = params.subAgents.map((sa) => {\n const baseConfig = sa.config as { name: string; description: string; prompt?: string };\n return {\n name: baseConfig.name,\n role: baseConfig.name,\n description: baseConfig.description,\n systemPrompt: baseConfig.prompt,\n tools: tools as any,\n };\n });\n\n const middlewareConfigs = params.middleware || [];\n let filesystemBackend = createFilesystemBackendFactory(middlewareConfigs);\n const middlewares = createCommonMiddlewares(middlewareConfigs);\n if (!filesystemBackend) {\n filesystemBackend = async (config: { state: unknown; store?: any }) => {\n return new StateBackend(config);\n };\n }\n\n const teamConfig: TeamConfig = {\n teammates,\n maxConcurrency: config.maxConcurrency,\n model: params.model,\n systemPrompt: config.prompt || undefined,\n tools: tools as any,\n checkpointer: getCheckpointSaver(\"default\"),\n scheduleLatticeKey: config.scheduleLatticeKey,\n pollIntervalMs: config.pollIntervalMs,\n backend: filesystemBackend,\n middleware: middlewares as AgentMiddleware[],\n };\n\n const teamLead = createAgentTeam(teamConfig);\n\n return teamLead as AgentClient;\n }\n}\n","/**\n * Agent Graph Builder Factory\n *\n * 工厂类,根据Agent类型创建对应的Builder\n */\n\nimport { AgentType } from \"../types\";\nimport { AgentGraphBuilder } from \"./AgentGraphBuilder\";\nimport { ReActAgentGraphBuilder } from \"./ReActAgentGraphBuilder\";\nimport { DeepAgentGraphBuilder } from \"./DeepAgentGraphBuilder\";\nimport { TeamAgentGraphBuilder } from \"../../agent_team/builders/TeamAgentGraphBuilder\";\n\nexport class AgentGraphBuilderFactory {\n // 单例模式\n private static instance: AgentGraphBuilderFactory;\n\n // Builder缓存\n private builders: Map<AgentType, AgentGraphBuilder>;\n\n private constructor() {\n this.builders = new Map();\n this.registerDefaultBuilders();\n }\n\n /**\n * 获取单例实例\n */\n public static getInstance(): AgentGraphBuilderFactory {\n if (!AgentGraphBuilderFactory.instance) {\n AgentGraphBuilderFactory.instance = new AgentGraphBuilderFactory();\n }\n return AgentGraphBuilderFactory.instance;\n }\n\n /**\n * 注册默认的Builder\n */\n private registerDefaultBuilders(): void {\n this.builders.set(AgentType.REACT, new ReActAgentGraphBuilder());\n this.builders.set(AgentType.DEEP_AGENT, new DeepAgentGraphBuilder());\n this.builders.set(AgentType.TEAM, new TeamAgentGraphBuilder());\n }\n\n /**\n * 注册自定义Builder\n *\n * @param type Agent类型\n * @param builder Builder实例\n */\n public registerBuilder(type: AgentType, builder: AgentGraphBuilder): void {\n this.builders.set(type, builder);\n }\n\n /**\n * 获取Builder\n *\n * @param type Agent类型\n * @returns 返回对应的Builder\n */\n public getBuilder(type: AgentType): AgentGraphBuilder {\n const builder = this.builders.get(type);\n if (!builder) {\n throw new Error(`不支持的Agent类型: ${type}`);\n }\n return builder;\n }\n}\n","/**\n * Agent parameters builder\n *\n * responsible for preparing the parameters required for building the Agent\n */\n\nimport { toolLatticeManager } from \"../../tool_lattice/ToolLatticeManager\";\nimport { modelLatticeManager } from \"../../model_lattice/ModelLatticeManager\";\nimport { AgentLattice, AgentBuildParams, GraphBuildOptions } from \"../types\";\nimport {\n getToolsFromConfig,\n getSubAgentsFromConfig,\n isDeepAgentConfig,\n AgentConfig,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * Get Agent Lattice function type\n */\nexport type GetAgentLatticeFunction = (key: string) => AgentLattice | undefined;\n\n/**\n * Agent parameters builder\n */\nexport class AgentParamsBuilder {\n private getAgentLatticeFunc: GetAgentLatticeFunction;\n\n /**\n * constructor\n *\n * @param getAgentLatticeFunc get Agent Lattice function\n */\n constructor(getAgentLatticeFunc: GetAgentLatticeFunction) {\n this.getAgentLatticeFunc = getAgentLatticeFunc;\n }\n\n /**\n * build Agent parameters\n *\n * @param agentLattice Agent Lattice object\n * @param options build options\n * @returns Agent build parameters\n */\n public buildParams(\n agentLattice: AgentLattice,\n options?: GraphBuildOptions\n ): AgentBuildParams {\n // get tools (use type-safe helper)\n const skills = isDeepAgentConfig(agentLattice.config) ? agentLattice.config.skillCategories : undefined;\n const toolKeys =\n options?.overrideTools || getToolsFromConfig(agentLattice.config);\n const tools = toolKeys.map((toolKey: string) => {\n const toolLattice = toolLatticeManager.getToolLattice(toolKey);\n if (!toolLattice) {\n throw new Error(`Tool \"${toolKey}\" does not exist`);\n }\n return {\n key: toolKey,\n definition: toolLattice.config,\n executor: toolLattice.client,\n };\n });\n\n // get model\n const modelKey = options?.overrideModel || agentLattice.config.modelKey;\n const model = modelKey\n ? modelLatticeManager.getModelLattice(modelKey).client\n : modelLatticeManager.getModelLattice(\"default\").client;\n if (!model) {\n throw new Error(`Model \"${modelKey}\" does not exist`);\n }\n\n // get subAgents (use type-safe helper - only DeepAgentConfig has subAgents)\n const subAgentKeys = getSubAgentsFromConfig(agentLattice.config);\n const subAgents = subAgentKeys.map((agentKey: string) => {\n const subAgentLattice = this.getAgentLatticeFunc(agentKey);\n if (!subAgentLattice) {\n throw new Error(`SubAgent \"${agentKey}\" does not exist`);\n }\n return {\n key: agentKey,\n config: subAgentLattice.config,\n client: subAgentLattice.client,\n };\n });\n let internalSubAgents: any[] = [];\n if (isDeepAgentConfig(agentLattice.config)) {\n internalSubAgents =\n agentLattice.config.internalSubAgents?.map((i) => ({\n key: i.key,\n config: i,\n })) || [];\n }\n\n return {\n tools,\n model,\n subAgents: [...subAgents, ...internalSubAgents],\n prompt: agentLattice.config.prompt,\n stateSchema: agentLattice.config.schema,\n skillCategories: skills,\n middleware: agentLattice.config.middleware,\n };\n }\n}\n","/**\n * Utility for merging agent configurations in an inheritance chain.\n *\n * When a child agent extends a parent, unspecified fields are inherited\n * from the parent. Explicitly set fields in the child override the parent's.\n */\n\nimport { AgentConfig } from \"@axiom-lattice/protocols\";\n\n/**\n * Fields that should never be inherited from the parent.\n * - `key`: always the child's own identity\n * - `extendsAgent`: the inheritance reference itself, not propagated\n */\nconst NON_INHERITABLE_FIELDS: ReadonlySet<string> = new Set([\n \"key\",\n \"extendsAgent\",\n]);\n\n/**\n * Merge a parent agent config with a child agent config.\n *\n * The child's explicitly set (non-undefined) fields override the parent's.\n * Array fields (tools, middleware, subAgents, etc.) are replaced entirely\n * when set on the child, not merged element-by-element.\n *\n * @param parent - The fully resolved parent config\n * @param child - The child config containing overrides\n * @returns A new merged AgentConfig with the child's key and resolved values\n */\nexport function mergeAgentConfig(\n parent: AgentConfig,\n child: AgentConfig\n): AgentConfig {\n // Start with a shallow copy of the parent\n const merged: Record<string, any> = { ...parent };\n\n // Apply child overrides: any field explicitly set on the child wins\n for (const [key, value] of Object.entries(child)) {\n if (NON_INHERITABLE_FIELDS.has(key)) {\n continue;\n }\n if (value !== undefined) {\n merged[key] = value;\n }\n }\n\n // Always use the child's key\n merged.key = child.key;\n\n // Strip extendsAgent from the resolved config (inheritance is resolved)\n delete merged.extendsAgent;\n\n return merged as AgentConfig;\n}\n","import { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport {\n AgentConfig,\n AgentClient,\n AgentLattice,\n GraphBuildOptions,\n AgentBuildParams,\n AgentType,\n} from \"./types\";\nimport { AgentGraphBuilderFactory } from \"./builders/AgentGraphBuilderFactory\";\nimport { AgentParamsBuilder } from \"./builders/AgentParamsBuilder\";\nimport { mergeAgentConfig } from \"./utils/mergeAgentConfig\";\nimport \"../tool_lattice\";\nimport eventBus from \"../services/event_bus\";\nimport type { Assistant } from \"@axiom-lattice/protocols\";\nimport { getStoreLattice } from \"../store_lattice\";\n\nfunction assistantToConfig(assistant: Assistant): AgentConfig {\n const graphDef = typeof assistant.graphDefinition === \"object\" && assistant.graphDefinition !== null\n ? assistant.graphDefinition\n : {};\n\n const config: AgentConfig = {\n key: assistant.id,\n name: assistant.name ?? (graphDef as any).name ?? assistant.id,\n description: assistant.description ?? (graphDef as any).description ?? \"\",\n type: AgentType.REACT,\n prompt: typeof assistant.graphDefinition === \"string\"\n ? assistant.graphDefinition\n : JSON.stringify(assistant.graphDefinition),\n };\n\n if (graphDef) {\n Object.assign(config, graphDef);\n }\n return config;\n}\n\n/**\n * AgentLatticeManager - 单例Agent Lattice管理器\n * 负责注册、管理各种Agent Lattice\n */\nexport class AgentLatticeManager extends BaseLatticeManager<AgentLattice> {\n private static _instance: AgentLatticeManager;\n private initialized: boolean = false;\n\n /**\n * 获取AgentLatticeManager单例实例\n */\n public static getInstance(): AgentLatticeManager {\n if (!AgentLatticeManager._instance) {\n AgentLatticeManager._instance = new AgentLatticeManager();\n }\n return AgentLatticeManager._instance;\n }\n\n private constructor() {\n super();\n this.subscribeToAssistantEvents();\n }\n\n private async initializeStoredAssistants(): Promise<void> {\n if (this.initialized) return;\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"assistant\");\n const assistants = await storeLattice.store.getAllAssistants();\n\n for (const assistant of assistants) {\n if (this.has(assistant.id)) continue;\n const config = assistantToConfig(assistant);\n this.registerLattice(config);\n }\n\n this.initialized = true;\n } catch (error) {\n console.error(\"Failed to initialize stored assistants:\", error);\n }\n }\n\n private subscribeToAssistantEvents(): void {\n eventBus.subscribe(\"assistant:created\", (data: { id: string }) => {\n this.handleAssistantChange(data.id);\n });\n eventBus.subscribe(\"assistant:updated\", (data: { id: string }) => {\n this.handleAssistantChange(data.id);\n });\n eventBus.subscribe(\"assistant:deleted\", (data: { id: string }) => {\n this.handleAssistantDelete(data.id);\n });\n }\n\n private async handleAssistantChange(assistantId: string): Promise<void> {\n try {\n const storeLattice = getStoreLattice(\"default\", \"assistant\");\n const assistant = await storeLattice.store.getAssistantById(assistantId);\n\n if (assistant) {\n if (this.has(assistantId)) {\n this.remove(assistantId);\n }\n const config = assistantToConfig(assistant);\n this.registerLattice(config);\n }\n } catch (error) {\n console.error(`Failed to handle assistant change for ${assistantId}:`, error);\n }\n }\n\n private handleAssistantDelete(assistantId: string): void {\n if (this.has(assistantId)) {\n this.remove(assistantId);\n }\n }\n\n /**\n * 获取Lattice类型前缀\n */\n protected getLatticeType(): string {\n return \"agents\";\n }\n\n /**\n * 注册Agent Lattice\n * @param config Agent配置\n */\n public registerLattice(config: AgentConfig): void {\n // 创建Agent Lattice对象\n const agentLattice: AgentLattice = {\n config,\n client: undefined, // 客户端将在需要时由initializeClient创建\n };\n\n // 调用基类的register方法\n this.register(config.key, agentLattice);\n }\n\n /**\n * Register a pre-built teammate agent client for dynamic team spawning.\n * Used when spawning teammates via agentWorkerGraph - the agent must exist\n * in the lattice before the worker invokes it.\n *\n * @param key Unique key (e.g. `team:${teamId}:${agentName}`)\n * @param client Pre-built AgentClient (ReactAgent or CompiledGraph)\n */\n public registerTeammateAgent(key: string, client: AgentClient): void {\n const agentLattice: AgentLattice = {\n config: {\n key,\n name: key,\n description: `Teammate agent: ${key}`,\n type: AgentType.REACT,\n } as AgentConfig,\n client,\n };\n this.register(key, agentLattice);\n }\n\n /**\n * Unregister a teammate agent. Call when a team is done to clean up.\n */\n public unregisterTeammateAgent(key: string): boolean {\n return this.remove(key);\n }\n\n /**\n * 获取AgentLattice\n * @param key Lattice键名\n */\n public getAgentLattice(key: string): AgentLattice | undefined {\n return this.get(key);\n }\n\n /**\n * 获取所有Lattice\n */\n public getAllLattices(): AgentLattice[] {\n return this.getAll();\n }\n\n /**\n * 检查Lattice是否存在\n * @param key Lattice键名\n */\n public hasLattice(key: string): boolean {\n return this.has(key);\n }\n\n /**\n * 移除Lattice\n * @param key Lattice键名\n */\n public removeLattice(key: string): boolean {\n return this.remove(key);\n }\n\n /**\n * 获取Agent配置\n * @param key Lattice键名\n */\n public getAgentConfig(key: string): AgentConfig | undefined {\n return this.getAgentLattice(key)?.config;\n }\n\n /**\n * 获取所有Agent配置\n * code-configured 和 stored assistants 都已注册到 registry\n */\n public async getAllAgentConfigs(): Promise<AgentConfig[]> {\n await this.initializeStoredAssistants();\n return this.getAllLattices().map((lattice) => lattice.config);\n }\n\n /**\n * 验证Agent输入参数\n * @param key Lattice键名\n * @param input 输入参数\n */\n public validateAgentInput(key: string, input: any): boolean {\n const agentLattice = this.getAgentLattice(key);\n if (!agentLattice) {\n return false;\n }\n\n try {\n if (agentLattice.config.schema) {\n agentLattice.config.schema.parse(input);\n }\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Resolve inherited config by walking the extendsAgent chain.\n *\n * If config.extendsAgent is set, fetches the parent config, recursively\n * resolves the parent's own inheritance, then merges parent with child\n * (child's explicit fields override parent's).\n *\n * @param config - The agent config to resolve\n * @param visited - Set of visited keys to detect circular inheritance\n * @returns A fully resolved AgentConfig with inheritance applied\n */\n private resolveInheritedConfig(\n config: AgentConfig,\n visited: Set<string> = new Set()\n ): AgentConfig {\n if (!config.extendsAgent) {\n return config;\n }\n\n // Circular dependency detection\n if (visited.has(config.key)) {\n throw new Error(\n `Circular agent inheritance detected: \"${config.key}\" already visited in chain [${[...visited].join(\" -> \")}]`\n );\n }\n visited.add(config.key);\n\n const parentLattice = this.getAgentLattice(config.extendsAgent);\n if (!parentLattice) {\n throw new Error(\n `Parent agent \"${config.extendsAgent}\" not found when resolving inheritance for \"${config.key}\"`\n );\n }\n\n // Recursively resolve the parent's own inheritance first\n const resolvedParent = this.resolveInheritedConfig(\n parentLattice.config,\n visited\n );\n\n return mergeAgentConfig(resolvedParent, config);\n }\n\n /**\n * 构建Agent参数\n *\n * @param agentLattice Agent Lattice对象\n * @param options 构建选项\n * @returns 返回Agent构建参数\n */\n private buildAgentParams(\n agentLattice: AgentLattice,\n options?: GraphBuildOptions\n ): AgentBuildParams {\n // 创建参数构建器\n const paramsBuilder = new AgentParamsBuilder((key: string) => {\n this.initializeClient(key);\n return this.getAgentLattice(key);\n });\n\n // 构建参数\n return paramsBuilder.buildParams(agentLattice, options);\n }\n\n /**\n * Create an AgentClient from AgentLattice config\n *\n * @param agentLattice Agent Lattice object\n * @param options Build options\n * @returns AgentClient instance\n */\n public createAgentClientFromConfig(\n agentLattice: AgentLattice,\n options?: GraphBuildOptions\n ): AgentClient {\n // Resolve inheritance chain if extendsAgent is set\n const resolvedConfig = this.resolveInheritedConfig(agentLattice.config);\n const resolvedLattice: AgentLattice = {\n ...agentLattice,\n config: resolvedConfig,\n };\n\n // Get factory instance\n const factory = AgentGraphBuilderFactory.getInstance();\n\n // Get the builder for the resolved agent type\n const builder = factory.getBuilder(resolvedConfig.type);\n\n // Build params using the resolved config\n const params = this.buildAgentParams(resolvedLattice, options);\n\n // Use builder to build the graph\n return builder.build(resolvedLattice, params);\n }\n\n /**\n * 初始化Agent客户端\n *\n * 使用AgentGraphBuilderFactory构建Graph并设置为客户端\n *\n * @param key Lattice键名\n * @param options 构建选项\n * @returns 返回CompiledGraph对象\n */\n public initializeClient(\n key: string,\n options?: GraphBuildOptions\n ): AgentClient {\n const agentLattice = this.getAgentLattice(key);\n if (!agentLattice) {\n throw new Error(`Agent Lattice \"${key}\" 不存在`);\n }\n\n // If client already exists, return it directly\n if (agentLattice.client) {\n return agentLattice.client;\n }\n\n // Create agent client from config\n const graph = this.createAgentClientFromConfig(agentLattice, options);\n\n // Set as client\n agentLattice.client = graph;\n\n return graph;\n }\n}\n\n// 导出单例实例\nexport const agentLatticeManager = AgentLatticeManager.getInstance();\n\n// 导出便捷方法\nexport const registerAgentLattice = (config: AgentConfig) => {\n agentLatticeManager.registerLattice(config);\n};\n\nexport const registerAgentLattices = (configs: AgentConfig[]) => {\n configs.forEach((config) => {\n agentLatticeManager.registerLattice(config);\n });\n};\n\nexport const getAgentLattice = (key: string) =>\n agentLatticeManager.getAgentLattice(key);\n\nexport const getAgentConfig = (key: string) =>\n agentLatticeManager.getAgentConfig(key);\n\nexport const getAllAgentConfigs = () =>\n agentLatticeManager.getAllAgentConfigs();\n\nexport const validateAgentInput = (key: string, input: any) =>\n agentLatticeManager.validateAgentInput(key, input);\n\nexport const registerTeammateAgent = (key: string, client: AgentClient) =>\n agentLatticeManager.registerTeammateAgent(key, client);\n\nexport const unregisterTeammateAgent = (key: string) =>\n agentLatticeManager.unregisterTeammateAgent(key);\n\n/**\n * 获取或初始化Agent客户端\n *\n * @param key Agent Lattice键名\n * @param options 构建选项\n * @returns 返回CompiledGraph对象\n */\nexport const getAgentClient = (key: string, options?: GraphBuildOptions) =>\n agentLatticeManager.initializeClient(key, options);\n\nexport const createAgentClientFromAgentLattice = (\n agentLattice: AgentLattice,\n options?: GraphBuildOptions\n) => agentLatticeManager.createAgentClientFromConfig(agentLattice, options);\n","/**\n * ChunkBuffer Abstract Base Class\n *\n * Defines the interface for chunk buffer implementations\n */\n\nimport { MessageChunk } from \"@axiom-lattice/protocols\";\nimport { ThreadStatus, ThreadBuffer } from \"./types\";\n\nexport abstract class ChunkBuffer {\n /**\n * Add a chunk to a thread (creates thread if not exists)\n * Chunks are appended in order\n */\n abstract addChunk(threadId: string, content: MessageChunk): Promise<void>;\n\n /**\n * Mark thread as completed (explicit call)\n */\n abstract completeThread(threadId: string): Promise<void>;\n\n /**\n * Mark thread as aborted (explicit call)\n */\n abstract abortThread(threadId: string): Promise<void>;\n\n /**\n * Check if thread is still active\n */\n abstract isThreadActive(threadId: string): Promise<boolean>;\n\n /**\n * Get thread status (returns undefined if thread doesn't exist)\n */\n abstract getThreadStatus(threadId: string): Promise<ThreadStatus | undefined>;\n\n /**\n * Get thread buffer info including metadata\n */\n abstract getThreadBuffer(threadId: string): Promise<ThreadBuffer | undefined>;\n\n /**\n * Clear specific thread buffer\n */\n abstract clearThread(threadId: string): Promise<void>;\n\n /**\n * Get all active thread IDs\n */\n abstract getActiveThreads(): Promise<string[]>;\n\n /**\n * Get all thread IDs (regardless of status)\n */\n abstract getAllThreads(): Promise<string[]>;\n\n /**\n * Manually trigger cleanup of expired threads\n * Returns number of threads cleaned up\n */\n abstract cleanupExpiredThreads(): Promise<number>;\n\n /**\n * Extend thread TTL (reset expiration time)\n */\n abstract extendThreadTTL(\n threadId: string,\n additionalMs?: number\n ): Promise<void>;\n\n /**\n * Check if a thread exists (valid or expired)\n */\n abstract hasThread(threadId: string): Promise<boolean>;\n\n abstract getNewChunksSinceContentIterator(\n threadId: string,\n messageId: string,\n knownContent: string\n ): AsyncIterable<MessageChunk>;\n}\n","/**\n * ChunkBuffer Types\n *\n * Defines types for managing streaming chunks organized by thread\n */\n\nimport { MessageChunk } from \"@axiom-lattice/protocols\";\nimport { ReplaySubject } from \"rxjs\";\n\n/**\n * Represents a single chunk of data\n * Chunks are identified by their position in the sequence (no unique ID)\n */\nexport interface Chunk {\n messageId: string; // Message this chunk belongs to\n content: MessageChunk; // Chunk content\n}\n\n/**\n * Thread status - requires explicit state transitions\n */\nexport enum ThreadStatus {\n ACTIVE = \"active\",\n COMPLETED = \"completed\",\n ABORTED = \"aborted\",\n}\n\n/**\n * Thread buffer configuration\n */\nexport interface ThreadBufferConfig {\n ttl?: number; // Time-to-live in milliseconds (default: 1 hour)\n cleanupInterval?: number; // Optional: periodic cleanup interval in ms\n}\n\n/**\n * Thread buffer state\n */\nexport interface ThreadBuffer {\n threadId: string;\n chunks$: ReplaySubject<MessageChunk>; // Ordered list of chunks\n status: ThreadStatus;\n createdAt: number;\n updatedAt: number;\n expiresAt: number; // TTL expiration timestamp\n}\n\n/**\n * Buffer statistics\n */\nexport interface BufferStats {\n totalThreads: number;\n activeThreads: number;\n completedThreads: number;\n abortedThreads: number;\n config: Required<ThreadBufferConfig>;\n}\n","/**\n * InMemoryChunkBuffer\n *\n * In-memory implementation of ChunkBuffer with hybrid cleanup strategy:\n * - Lazy cleanup: expired threads are removed on access\n * - Optional periodic cleanup: background timer to clean expired threads\n */\n\nimport { MessageChunk } from \"@axiom-lattice/protocols\";\nimport { EventEmitter, once } from \"events\";\nimport { ChunkBuffer } from \"./ChunkBuffer\";\nimport {\n BufferStats,\n ThreadBuffer,\n ThreadBufferConfig,\n ThreadStatus,\n} from \"./types\";\nimport {\n ReplaySubject,\n Observable,\n Subscription,\n observeOn,\n asyncScheduler,\n} from \"rxjs\";\n\nexport class InMemoryChunkBuffer extends ChunkBuffer {\n private buffers: Map<string, ThreadBuffer>;\n private config: Required<ThreadBufferConfig> & { maxChunks?: number };\n private cleanupTimer?: NodeJS.Timeout;\n\n constructor(config?: ThreadBufferConfig & { maxChunks?: number }) {\n super();\n this.buffers = new Map();\n\n // Default: 1 hour TTL, no periodic cleanup (lazy only)\n this.config = {\n ttl: config?.ttl ?? 60 * 60 * 1000,\n cleanupInterval: config?.cleanupInterval ?? 0,\n maxChunks: config?.maxChunks ?? 100000, // Default max chunks per thread\n };\n\n // Start periodic cleanup only if cleanupInterval is specified\n if (this.config.cleanupInterval > 0) {\n this.startCleanupTimer();\n }\n }\n\n /**\n * Start automatic periodic cleanup timer\n */\n private startCleanupTimer(): void {\n if (this.config.cleanupInterval <= 0) return;\n\n this.cleanupTimer = setInterval(() => {\n this.cleanupExpiredThreads().catch(console.error);\n }, this.config.cleanupInterval);\n\n // Don't prevent process from exiting\n if (this.cleanupTimer.unref) {\n this.cleanupTimer.unref();\n }\n }\n\n /**\n * Stop cleanup timer (for cleanup/shutdown)\n */\n public stopCleanupTimer(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n }\n\n /**\n * Check if a buffer is expired (lazy cleanup helper)\n */\n private isExpired(buffer: ThreadBuffer): boolean {\n return buffer.expiresAt <= Date.now();\n }\n\n /**\n * Get buffer if valid, perform lazy cleanup if expired\n */\n private getBufferIfValid(threadId: string): ThreadBuffer | undefined {\n const buffer = this.buffers.get(threadId);\n\n if (buffer && this.isExpired(buffer)) {\n // Lazy cleanup: remove expired buffer on access\n this.buffers.delete(threadId);\n return undefined;\n }\n\n return buffer;\n }\n\n /**\n * Create or get thread buffer\n */\n private getOrCreateBuffer(threadId: string): ThreadBuffer {\n // First check with lazy cleanup\n let buffer = this.getBufferIfValid(threadId);\n if (!buffer) {\n const now = Date.now();\n buffer = {\n threadId,\n chunks$: new ReplaySubject<MessageChunk>(this.config.maxChunks),\n status: ThreadStatus.ACTIVE,\n createdAt: now,\n updatedAt: now,\n expiresAt: now + this.config.ttl,\n };\n this.buffers.set(threadId, buffer);\n }\n\n if (buffer.status !== ThreadStatus.ACTIVE) {\n buffer.status = ThreadStatus.ACTIVE;\n buffer.chunks$ = new ReplaySubject<MessageChunk>(this.config.maxChunks);\n buffer.updatedAt = Date.now();\n buffer.expiresAt = Date.now() + this.config.ttl;\n }\n\n return buffer;\n }\n\n async addChunk(threadId: string, content: MessageChunk): Promise<void> {\n const buffer = this.getOrCreateBuffer(threadId);\n\n const chunk: MessageChunk = content;\n buffer.chunks$.next(chunk);\n buffer.updatedAt = Date.now();\n\n // Auto-extend TTL on activity\n buffer.expiresAt = Date.now() + this.config.ttl;\n buffer.status = ThreadStatus.ACTIVE;\n\n // Notify listeners\n }\n\n async completeThread(threadId: string): Promise<void> {\n const buffer = this.getBufferIfValid(threadId);\n if (buffer) {\n buffer.status = ThreadStatus.COMPLETED;\n buffer.updatedAt = Date.now();\n buffer.chunks$.complete();\n }\n }\n\n async abortThread(threadId: string): Promise<void> {\n const buffer = this.getBufferIfValid(threadId);\n if (buffer) {\n buffer.status = ThreadStatus.ABORTED;\n buffer.updatedAt = Date.now();\n buffer.chunks$.error(new Error(\"Thread aborted\"));\n }\n }\n\n async isThreadActive(threadId: string): Promise<boolean> {\n const buffer = this.getBufferIfValid(threadId);\n return buffer?.status === ThreadStatus.ACTIVE;\n }\n\n async getThreadStatus(threadId: string): Promise<ThreadStatus | undefined> {\n return this.getBufferIfValid(threadId)?.status;\n }\n\n async getThreadBuffer(threadId: string): Promise<ThreadBuffer | undefined> {\n const buffer = this.getBufferIfValid(threadId);\n if (!buffer) return undefined;\n return buffer;\n }\n\n async clearThread(threadId: string): Promise<void> {\n this.buffers.delete(threadId);\n }\n\n async getActiveThreads(): Promise<string[]> {\n const activeThreads: string[] = [];\n\n for (const [threadId, buffer] of this.buffers.entries()) {\n // Apply lazy cleanup\n if (this.isExpired(buffer)) {\n this.buffers.delete(threadId);\n continue;\n }\n\n if (buffer.status === ThreadStatus.ACTIVE) {\n activeThreads.push(threadId);\n }\n }\n\n return activeThreads;\n }\n\n async getAllThreads(): Promise<string[]> {\n const validThreads: string[] = [];\n\n for (const [threadId, buffer] of this.buffers.entries()) {\n // Apply lazy cleanup\n if (this.isExpired(buffer)) {\n this.buffers.delete(threadId);\n } else {\n validThreads.push(threadId);\n }\n }\n\n return validThreads;\n }\n\n async hasThread(threadId: string): Promise<boolean> {\n return this.getBufferIfValid(threadId) !== undefined;\n }\n\n /**\n * Cleanup expired threads based on TTL\n * Returns number of threads cleaned up\n */\n async cleanupExpiredThreads(): Promise<number> {\n const now = Date.now();\n let cleanedCount = 0;\n\n for (const [threadId, buffer] of this.buffers.entries()) {\n if (buffer.expiresAt <= now) {\n this.buffers.delete(threadId);\n cleanedCount++;\n }\n }\n\n return cleanedCount;\n }\n\n async extendThreadTTL(\n threadId: string,\n additionalMs?: number\n ): Promise<void> {\n const buffer = this.getBufferIfValid(threadId);\n if (buffer) {\n const extension = additionalMs ?? this.config.ttl;\n buffer.expiresAt = Date.now() + extension;\n buffer.updatedAt = Date.now();\n }\n }\n\n async *getNewChunksSinceContentIterator(\n threadId: string,\n messageId: string,\n knownContent: string\n ): AsyncIterable<MessageChunk> {\n const buffer = this.getBufferIfValid(threadId);\n if (!buffer) return;\n\n let accumulatedContent = \"\";\n const queue: MessageChunk[] = [];\n let resolveNext: (() => void) | null = null;\n let errorNext: ((err: any) => void) | null = null;\n let isCompleted = false;\n let pendingError: Error | null = null; // Track errors that occur when not waiting\n\n const subscription = buffer.chunks$\n .pipe(observeOn(asyncScheduler))\n .subscribe({\n next: (chunk) => {\n queue.push(chunk);\n if (resolveNext) {\n const resolve = resolveNext;\n resolveNext = null;\n resolve();\n }\n },\n error: (err) => {\n pendingError = err; // Always store the error\n\n if (errorNext) {\n const reject = errorNext;\n errorNext = null;\n reject(err);\n } else if (resolveNext) {\n // If waiting on resolveNext, wake it up to check pendingError\n const resolve = resolveNext;\n resolveNext = null;\n resolve();\n }\n },\n complete: () => {\n isCompleted = true;\n if (resolveNext) {\n const resolve = resolveNext;\n resolveNext = null;\n resolve();\n }\n },\n });\n let startYieldChunk = false;\n\n try {\n while (true) {\n if (pendingError) {\n throw pendingError;\n }\n if (queue.length === 0) {\n if (isCompleted) break;\n await new Promise<void>((resolve, reject) => {\n resolveNext = resolve;\n errorNext = reject;\n });\n }\n // Check error again after waking up\n if (pendingError) {\n throw pendingError;\n }\n while (queue.length > 0) {\n const chunk = queue.shift();\n if (!chunk) continue;\n\n if (chunk.data?.id === messageId) {\n startYieldChunk = true;\n accumulatedContent += chunk.data?.content || \"\";\n }\n // if (accumulatedContent.length > knownContent.length) {\n // startYieldChunk = true;\n // }\n if (startYieldChunk) {\n yield chunk;\n }\n\n // if (accumulatedContent.length > knownContent.length) {\n // if (accumulatedContent.startsWith(knownContent)) {\n // yield chunk;\n // } else {\n // console.log(\n // \"accumulatedContent not starts with knownContent\",\n // accumulatedContent,\n // knownContent\n // );\n // }\n // }\n }\n }\n } finally {\n subscription.unsubscribe();\n }\n }\n\n public getStats(): BufferStats {\n let activeCount = 0;\n let completedCount = 0;\n let abortedCount = 0;\n\n const validBuffers: ThreadBuffer[] = [];\n for (const [threadId, buffer] of this.buffers.entries()) {\n if (this.isExpired(buffer)) {\n this.buffers.delete(threadId);\n } else {\n validBuffers.push(buffer);\n }\n }\n\n for (const buffer of validBuffers) {\n switch (buffer.status) {\n case ThreadStatus.ACTIVE:\n activeCount++;\n break;\n case ThreadStatus.COMPLETED:\n completedCount++;\n break;\n case ThreadStatus.ABORTED:\n abortedCount++;\n break;\n }\n }\n\n return {\n totalThreads: validBuffers.length,\n activeThreads: activeCount,\n completedThreads: completedCount,\n abortedThreads: abortedCount,\n\n config: this.config,\n };\n }\n\n public dispose(): void {\n this.stopCleanupTimer();\n this.buffers.clear();\n }\n}\n","/**\n * ChunkBufferLatticeManager\n * \n * Manages ChunkBuffer instances following the Lattice pattern\n */\n\nimport { BaseLatticeManager } from '../base/BaseLatticeManager';\nimport { ChunkBuffer } from './ChunkBuffer';\n\n/**\n * ChunkBuffer Lattice Manager\n */\nexport class ChunkBufferLatticeManager extends BaseLatticeManager<ChunkBuffer> {\n private static instance: ChunkBufferLatticeManager;\n \n /**\n * Private constructor for singleton pattern\n */\n private constructor() {\n super();\n }\n \n /**\n * Get singleton instance\n */\n public static getInstance(): ChunkBufferLatticeManager {\n if (!ChunkBufferLatticeManager.instance) {\n ChunkBufferLatticeManager.instance = new ChunkBufferLatticeManager();\n }\n return ChunkBufferLatticeManager.instance;\n }\n \n /**\n * Get Lattice type identifier\n */\n protected getLatticeType(): string {\n return 'chunk_buffer';\n }\n}\n\n// Convenience functions\nexport const getChunkBuffer = (key: string): ChunkBuffer | undefined =>\n ChunkBufferLatticeManager.getInstance().get(key);\n\nexport const registerChunkBuffer = (key: string, buffer: ChunkBuffer): void =>\n ChunkBufferLatticeManager.getInstance().register(key, buffer);\n\nexport const hasChunkBuffer = (key: string): boolean =>\n ChunkBufferLatticeManager.getInstance().has(key);\n\n","/**\n * ScheduleLatticeManager\n *\n * Schedule Lattice manager for registering and managing schedule services\n * Supports both one-time and cron-style recurring tasks\n */\n\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport {\n ScheduleLatticeProtocol,\n ScheduleConfig,\n ScheduleType,\n ScheduleClient,\n ScheduleStorage,\n ScheduledTaskDefinition,\n TaskHandler,\n ScheduleOnceOptions,\n ScheduleCronOptions,\n} from \"@axiom-lattice/protocols\";\nimport { DefaultScheduleClient } from \"./DefaultScheduleClient\";\nimport { MemoryScheduleStorage } from \"./MemoryScheduleStorage\";\n\n/**\n * Schedule Lattice interface\n */\nexport interface ScheduleLattice extends ScheduleLatticeProtocol {\n key: string;\n config: ScheduleConfig;\n client: ScheduleLatticeProtocol[\"client\"];\n}\n\n/**\n * ScheduleLatticeManager - Singleton schedule Lattice manager\n * Responsible for registering and managing various schedule service Lattices\n */\nexport class ScheduleLatticeManager extends BaseLatticeManager<ScheduleLattice> {\n private static _instance: ScheduleLatticeManager;\n\n /**\n * Get ScheduleLatticeManager singleton instance\n */\n public static getInstance(): ScheduleLatticeManager {\n if (!ScheduleLatticeManager._instance) {\n ScheduleLatticeManager._instance = new ScheduleLatticeManager();\n }\n return ScheduleLatticeManager._instance;\n }\n\n /**\n * Get Lattice type prefix\n */\n protected getLatticeType(): string {\n return \"schedules\";\n }\n\n /**\n * Register schedule Lattice\n * @param key Lattice key name\n * @param config Schedule configuration\n * @param client Optional schedule client. If not provided, will create based on config type.\n */\n public registerLattice(\n key: string,\n config: ScheduleConfig,\n client?: ScheduleClient\n ): void {\n // Create client based on schedule type if not provided\n let scheduleClient: ScheduleLatticeProtocol[\"client\"];\n\n if (client) {\n // Use provided client\n scheduleClient = client;\n // If storage is provided in config, set it on the client\n if (config.storage) {\n scheduleClient.setStorage(config.storage);\n }\n } else {\n // Create storage based on config\n let storage: ScheduleStorage;\n if (config.storage) {\n storage = config.storage;\n } else {\n // Default to memory storage\n storage = new MemoryScheduleStorage();\n }\n\n if (config.type === ScheduleType.MEMORY) {\n scheduleClient = new DefaultScheduleClient(storage);\n } else if (config.type === ScheduleType.POSTGRES) {\n // For Postgres, storage must be provided\n if (!config.storage) {\n throw new Error(\n `PostgreSQL schedule storage must be provided. Please install @axiom-lattice/pg-stores and pass the storage in config.storage.`\n );\n }\n scheduleClient = new DefaultScheduleClient(storage);\n } else {\n // Default to memory with memory storage\n scheduleClient = new DefaultScheduleClient(storage);\n }\n }\n\n // Create schedule Lattice object\n const scheduleLattice: ScheduleLattice = {\n key,\n config,\n client: scheduleClient,\n\n // Handler registration\n registerHandler: (taskType: string, handler: TaskHandler) => {\n scheduleClient.registerHandler(taskType, handler);\n },\n unregisterHandler: (taskType: string) => {\n return scheduleClient.unregisterHandler(taskType);\n },\n hasHandler: (taskType: string) => {\n return scheduleClient.hasHandler(taskType);\n },\n getHandlerTypes: () => {\n return scheduleClient.getHandlerTypes();\n },\n\n // One-time task scheduling\n scheduleOnce: async (\n taskId: string,\n taskType: string,\n payload: Record<string, any>,\n options: ScheduleOnceOptions\n ) => {\n return scheduleClient.scheduleOnce(taskId, taskType, payload, options);\n },\n\n // Cron task scheduling\n scheduleCron: async (\n taskId: string,\n taskType: string,\n payload: Record<string, any>,\n options: ScheduleCronOptions\n ) => {\n return scheduleClient.scheduleCron(taskId, taskType, payload, options);\n },\n\n // Task management\n cancel: async (taskId: string) => {\n return scheduleClient.cancel(taskId);\n },\n pause: async (taskId: string) => {\n return scheduleClient.pause(taskId);\n },\n resume: async (taskId: string) => {\n return scheduleClient.resume(taskId);\n },\n has: async (taskId: string) => {\n return scheduleClient.has(taskId);\n },\n getTask: async (\n taskId: string\n ): Promise<ScheduledTaskDefinition | null> => {\n return scheduleClient.getTask(taskId);\n },\n getRemainingTime: async (taskId: string) => {\n return scheduleClient.getRemainingTime(taskId);\n },\n getActiveTaskCount: async () => {\n return scheduleClient.getActiveTaskCount();\n },\n getActiveTaskIds: async () => {\n return scheduleClient.getActiveTaskIds();\n },\n cancelAll: async () => {\n return scheduleClient.cancelAll();\n },\n\n // Recovery\n restore: async () => {\n return scheduleClient.restore();\n },\n };\n\n // Call base class register method\n this.register(key, scheduleLattice);\n }\n\n /**\n * Get ScheduleLattice\n * @param key Lattice key name\n */\n public getScheduleLattice(key: string): ScheduleLattice {\n const scheduleLattice = this.get(key);\n if (!scheduleLattice) {\n throw new Error(`ScheduleLattice ${key} not found`);\n }\n return scheduleLattice;\n }\n\n /**\n * Get all Lattices\n */\n public getAllLattices(): ScheduleLattice[] {\n return this.getAll();\n }\n\n /**\n * Check if Lattice exists\n * @param key Lattice key name\n */\n public hasLattice(key: string): boolean {\n return this.has(key);\n }\n\n /**\n * Remove Lattice\n * @param key Lattice key name\n */\n public removeLattice(key: string): boolean {\n return this.remove(key);\n }\n\n /**\n * Clear all Lattices\n */\n public clearLattices(): void {\n this.clear();\n }\n\n /**\n * Get Lattice count\n */\n public getLatticeCount(): number {\n return this.count();\n }\n\n /**\n * Get Lattice key list\n */\n public getLatticeKeys(): string[] {\n return this.keys();\n }\n}\n\n// Export singleton instance\nexport const scheduleLatticeManager = ScheduleLatticeManager.getInstance();\n\n// Export convenience methods\nexport const registerScheduleLattice = (\n key: string,\n config: ScheduleConfig,\n client?: ScheduleClient\n) => scheduleLatticeManager.registerLattice(key, config, client);\n\nexport const getScheduleLattice = (key: string) =>\n scheduleLatticeManager.getScheduleLattice(key);\n","/**\n * DefaultScheduleClient\n *\n * Default schedule client implementation with full protocol support\n * Core scheduling engine that handles timer management, cron parsing, and task execution\n * Supports both one-time and cron-style recurring tasks\n * Storage backend is pluggable - uses MemoryScheduleStorage by default\n */\n\nimport {\n ScheduleClient,\n ScheduleStorage,\n ScheduledTaskDefinition,\n ScheduledTaskStatus,\n ScheduleExecutionType,\n TaskHandler,\n ScheduleOnceOptions,\n ScheduleCronOptions,\n} from \"@axiom-lattice/protocols\";\nimport { MemoryScheduleStorage } from \"./MemoryScheduleStorage\";\nimport { getNextCronTime, isValidCronExpression } from \"./CronParser\";\n\n/**\n * Active timer info for in-memory scheduling\n */\ninterface ActiveTimer {\n timerId: NodeJS.Timeout;\n taskId: string;\n}\n\n/**\n * Default schedule client implementation\n * Core scheduling engine with pluggable storage backend\n */\nexport class DefaultScheduleClient implements ScheduleClient {\n private static instance: DefaultScheduleClient | null = null;\n\n private handlers: Map<string, TaskHandler> = new Map();\n private timers: Map<string, ActiveTimer> = new Map();\n private storage: ScheduleStorage;\n\n constructor(storage?: ScheduleStorage) {\n this.storage = storage || new MemoryScheduleStorage();\n }\n\n /**\n * Get the singleton instance of DefaultScheduleClient\n */\n public static getInstance(storage?: ScheduleStorage): DefaultScheduleClient {\n if (!DefaultScheduleClient.instance) {\n DefaultScheduleClient.instance = new DefaultScheduleClient(storage);\n }\n return DefaultScheduleClient.instance;\n }\n\n /**\n * Reset the singleton instance (useful for testing)\n */\n public static resetInstance(): void {\n if (DefaultScheduleClient.instance) {\n DefaultScheduleClient.instance.cancelAll();\n DefaultScheduleClient.instance = null;\n }\n }\n\n // ===== Handler Registration =====\n\n registerHandler(taskType: string, handler: TaskHandler): void {\n this.handlers.set(taskType, handler);\n console.log(`[Scheduler] Handler registered for task type: ${taskType}`);\n }\n\n unregisterHandler(taskType: string): boolean {\n const result = this.handlers.delete(taskType);\n if (result) {\n console.log(\n `[Scheduler] Handler unregistered for task type: ${taskType}`\n );\n }\n return result;\n }\n\n hasHandler(taskType: string): boolean {\n return this.handlers.has(taskType);\n }\n\n getHandlerTypes(): string[] {\n return Array.from(this.handlers.keys());\n }\n\n // ===== One-time Task Scheduling =====\n\n async scheduleOnce(\n taskId: string,\n taskType: string,\n payload: Record<string, any>,\n options: ScheduleOnceOptions\n ): Promise<boolean> {\n // Validate handler exists\n if (!this.handlers.has(taskType)) {\n console.error(\n `[Scheduler] No handler registered for task type: ${taskType}`\n );\n return false;\n }\n\n // Calculate execute time\n let executeAt: number;\n if (options.executeAt !== undefined) {\n executeAt = options.executeAt;\n } else if (options.delayMs !== undefined) {\n executeAt = Date.now() + options.delayMs;\n } else {\n console.error(\"[Scheduler] Either executeAt or delayMs must be provided\");\n return false;\n }\n\n // Cancel existing task with same ID\n if (await this.has(taskId)) {\n await this.cancel(taskId);\n }\n\n const now = Date.now();\n const task: ScheduledTaskDefinition = {\n taskId,\n taskType,\n payload,\n assistantId: options.assistantId,\n threadId: options.threadId,\n executionType: ScheduleExecutionType.ONCE,\n executeAt,\n delayMs: options.delayMs,\n status: ScheduledTaskStatus.PENDING,\n runCount: 0,\n retryCount: 0,\n maxRetries: options.maxRetries ?? 0,\n createdAt: now,\n updatedAt: now,\n metadata: options.metadata,\n };\n\n // Save to storage\n await this.storage.save(task);\n\n // Schedule timer\n this.scheduleTimer(task);\n\n console.log(\n `[Scheduler] One-time task scheduled: ${taskId}, executes at ${new Date(\n executeAt\n ).toISOString()}`\n );\n return true;\n }\n\n // ===== Cron Task Scheduling =====\n\n async scheduleCron(\n taskId: string,\n taskType: string,\n payload: Record<string, any>,\n options: ScheduleCronOptions\n ): Promise<boolean> {\n // Validate handler exists\n if (!this.handlers.has(taskType)) {\n console.error(\n `[Scheduler] No handler registered for task type: ${taskType}`\n );\n return false;\n }\n\n // Validate cron expression\n if (!isValidCronExpression(options.cronExpression)) {\n console.error(\n `[Scheduler] Invalid cron expression: ${options.cronExpression}`\n );\n return false;\n }\n\n // Cancel existing task with same ID\n if (await this.has(taskId)) {\n await this.cancel(taskId);\n }\n\n const now = Date.now();\n const nextRunAt = getNextCronTime(options.cronExpression, new Date(now));\n\n const task: ScheduledTaskDefinition = {\n taskId,\n taskType,\n payload,\n assistantId: options.assistantId,\n threadId: options.threadId,\n executionType: ScheduleExecutionType.CRON,\n cronExpression: options.cronExpression,\n timezone: options.timezone,\n nextRunAt: nextRunAt.getTime(),\n status: ScheduledTaskStatus.PENDING,\n runCount: 0,\n maxRuns: options.maxRuns,\n retryCount: 0,\n maxRetries: options.maxRetries ?? 0,\n createdAt: now,\n updatedAt: now,\n expiresAt: options.expiresAt,\n metadata: options.metadata,\n };\n\n // Save to storage\n await this.storage.save(task);\n\n // Schedule timer\n this.scheduleTimer(task);\n\n console.log(\n `[Scheduler] Cron task scheduled: ${taskId}, expression: ${\n options.cronExpression\n }, next run: ${nextRunAt.toISOString()}`\n );\n return true;\n }\n\n // ===== Task Management =====\n\n async cancel(taskId: string): Promise<boolean> {\n // Clear timer\n const timer = this.timers.get(taskId);\n if (timer) {\n clearTimeout(timer.timerId);\n this.timers.delete(taskId);\n }\n\n // Update storage\n const task = await this.storage.get(taskId);\n if (task) {\n await this.storage.update(taskId, {\n status: ScheduledTaskStatus.CANCELLED,\n });\n console.log(`[Scheduler] Task cancelled: ${taskId}`);\n return true;\n }\n\n return false;\n }\n\n async pause(taskId: string): Promise<boolean> {\n const task = await this.storage.get(taskId);\n if (!task || task.executionType !== ScheduleExecutionType.CRON) {\n console.error(`[Scheduler] Can only pause CRON tasks: ${taskId}`);\n return false;\n }\n\n if (task.status !== ScheduledTaskStatus.PENDING) {\n console.error(`[Scheduler] Can only pause PENDING tasks: ${taskId}`);\n return false;\n }\n\n // Clear timer\n const timer = this.timers.get(taskId);\n if (timer) {\n clearTimeout(timer.timerId);\n this.timers.delete(taskId);\n }\n\n await this.storage.update(taskId, {\n status: ScheduledTaskStatus.PAUSED,\n });\n\n console.log(`[Scheduler] Task paused: ${taskId}`);\n return true;\n }\n\n async resume(taskId: string): Promise<boolean> {\n const task = await this.storage.get(taskId);\n if (!task || task.executionType !== ScheduleExecutionType.CRON) {\n console.error(`[Scheduler] Can only resume CRON tasks: ${taskId}`);\n return false;\n }\n\n if (task.status !== ScheduledTaskStatus.PAUSED) {\n console.error(`[Scheduler] Can only resume PAUSED tasks: ${taskId}`);\n return false;\n }\n\n // Calculate next run time\n const nextRunAt = getNextCronTime(task.cronExpression!);\n\n await this.storage.update(taskId, {\n status: ScheduledTaskStatus.PENDING,\n nextRunAt: nextRunAt.getTime(),\n });\n\n // Re-fetch updated task and schedule\n const updatedTask = await this.storage.get(taskId);\n if (updatedTask) {\n this.scheduleTimer(updatedTask);\n }\n\n console.log(`[Scheduler] Task resumed: ${taskId}`);\n return true;\n }\n\n async has(taskId: string): Promise<boolean> {\n const task = await this.storage.get(taskId);\n return task !== null;\n }\n\n async getTask(taskId: string): Promise<ScheduledTaskDefinition | null> {\n return this.storage.get(taskId);\n }\n\n async getRemainingTime(taskId: string): Promise<number> {\n const task = await this.storage.get(taskId);\n if (!task) {\n return -1;\n }\n\n const targetTime =\n task.executionType === ScheduleExecutionType.CRON\n ? task.nextRunAt\n : task.executeAt;\n\n if (targetTime === undefined) {\n return -1;\n }\n\n return Math.max(0, targetTime - Date.now());\n }\n\n async getActiveTaskCount(): Promise<number> {\n const tasks = await this.storage.getActiveTasks();\n return tasks.length;\n }\n\n async getActiveTaskIds(): Promise<string[]> {\n const tasks = await this.storage.getActiveTasks();\n return tasks.map((t) => t.taskId);\n }\n\n async cancelAll(): Promise<void> {\n // Clear all timers\n for (const timer of this.timers.values()) {\n clearTimeout(timer.timerId);\n }\n this.timers.clear();\n\n // Update all active tasks to cancelled\n const activeTasks = await this.storage.getActiveTasks();\n for (const task of activeTasks) {\n await this.storage.update(task.taskId, {\n status: ScheduledTaskStatus.CANCELLED,\n });\n }\n\n console.log(`[Scheduler] All tasks cancelled`);\n }\n\n // ===== Recovery =====\n\n async restore(): Promise<number> {\n const activeTasks = await this.storage.getActiveTasks();\n let restored = 0;\n\n for (const task of activeTasks) {\n // Skip if no handler registered\n if (!this.handlers.has(task.taskType)) {\n console.warn(\n `[Scheduler] No handler for task type ${task.taskType}, skipping restore for task ${task.taskId}`\n );\n continue;\n }\n\n // Skip paused tasks (they'll be resumed manually)\n if (task.status === ScheduledTaskStatus.PAUSED) {\n continue;\n }\n\n if (task.executionType === ScheduleExecutionType.ONCE) {\n // For one-time tasks, check if execution time has passed\n if (task.executeAt && task.executeAt <= Date.now()) {\n // Execute immediately\n console.log(\n `[Scheduler] Executing overdue one-time task: ${task.taskId}`\n );\n this.executeTask(task);\n } else {\n // Schedule for remaining time\n this.scheduleTimer(task);\n }\n } else if (task.executionType === ScheduleExecutionType.CRON) {\n // For cron tasks, calculate next run time\n const nextRunAt = getNextCronTime(task.cronExpression!);\n await this.storage.update(task.taskId, {\n nextRunAt: nextRunAt.getTime(),\n });\n\n const updatedTask = await this.storage.get(task.taskId);\n if (updatedTask) {\n this.scheduleTimer(updatedTask);\n }\n }\n\n restored++;\n }\n\n console.log(`[Scheduler] Restored ${restored} tasks`);\n return restored;\n }\n\n // ===== Storage =====\n\n setStorage(storage: ScheduleStorage): void {\n this.storage = storage;\n }\n\n getStorage(): ScheduleStorage | null {\n return this.storage;\n }\n\n // ===== Private Methods =====\n\n private scheduleTimer(task: ScheduledTaskDefinition): void {\n const targetTime =\n task.executionType === ScheduleExecutionType.CRON\n ? task.nextRunAt\n : task.executeAt;\n\n if (targetTime === undefined) {\n console.error(`[Scheduler] No execution time for task: ${task.taskId}`);\n return;\n }\n\n const delay = Math.max(0, targetTime - Date.now());\n\n const timerId = setTimeout(() => {\n this.executeTask(task);\n }, delay);\n\n this.timers.set(task.taskId, {\n timerId,\n taskId: task.taskId,\n });\n }\n\n private async executeTask(task: ScheduledTaskDefinition): Promise<void> {\n const handler = this.handlers.get(task.taskType);\n if (!handler) {\n console.error(\n `[Scheduler] No handler for task type: ${task.taskType}, task: ${task.taskId}`\n );\n await this.storage.update(task.taskId, {\n status: ScheduledTaskStatus.FAILED,\n lastError: `No handler registered for task type: ${task.taskType}`,\n });\n return;\n }\n\n // Update status to running\n await this.storage.update(task.taskId, {\n status: ScheduledTaskStatus.RUNNING,\n });\n\n console.log(`[Scheduler] Executing task: ${task.taskId}`);\n\n try {\n // Get latest task state\n const latestTask = await this.storage.get(task.taskId);\n if (!latestTask) {\n console.error(`[Scheduler] Task not found: ${task.taskId}`);\n return;\n }\n\n await handler(latestTask.payload, latestTask);\n\n const newRunCount = latestTask.runCount + 1;\n console.log(`[Scheduler] Task completed: ${task.taskId}`);\n\n // Handle completion based on execution type\n if (task.executionType === ScheduleExecutionType.ONCE) {\n await this.storage.update(task.taskId, {\n status: ScheduledTaskStatus.COMPLETED,\n runCount: newRunCount,\n lastRunAt: Date.now(),\n });\n this.timers.delete(task.taskId);\n } else if (task.executionType === ScheduleExecutionType.CRON) {\n // Check if max runs reached\n if (task.maxRuns !== undefined && newRunCount >= task.maxRuns) {\n await this.storage.update(task.taskId, {\n status: ScheduledTaskStatus.COMPLETED,\n runCount: newRunCount,\n lastRunAt: Date.now(),\n });\n this.timers.delete(task.taskId);\n console.log(\n `[Scheduler] Cron task completed (max runs): ${task.taskId}`\n );\n return;\n }\n\n // Check if expired\n if (task.expiresAt !== undefined && Date.now() >= task.expiresAt) {\n await this.storage.update(task.taskId, {\n status: ScheduledTaskStatus.COMPLETED,\n runCount: newRunCount,\n lastRunAt: Date.now(),\n });\n this.timers.delete(task.taskId);\n console.log(\n `[Scheduler] Cron task completed (expired): ${task.taskId}`\n );\n return;\n }\n\n // Schedule next run\n const nextRunAt = getNextCronTime(task.cronExpression!);\n await this.storage.update(task.taskId, {\n status: ScheduledTaskStatus.PENDING,\n runCount: newRunCount,\n lastRunAt: Date.now(),\n nextRunAt: nextRunAt.getTime(),\n retryCount: 0, // Reset retry count on success\n });\n\n const updatedTask = await this.storage.get(task.taskId);\n if (updatedTask) {\n this.scheduleTimer(updatedTask);\n console.log(\n `[Scheduler] Next cron run scheduled: ${\n task.taskId\n } at ${nextRunAt.toISOString()}`\n );\n }\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n console.error(`[Scheduler] Task failed: ${task.taskId}`, error);\n\n const latestTask = await this.storage.get(task.taskId);\n if (!latestTask) return;\n\n const newRetryCount = latestTask.retryCount + 1;\n\n // Check if can retry\n if (newRetryCount <= latestTask.maxRetries) {\n console.log(\n `[Scheduler] Retrying task: ${task.taskId} (attempt ${newRetryCount}/${latestTask.maxRetries})`\n );\n\n await this.storage.update(task.taskId, {\n status: ScheduledTaskStatus.PENDING,\n retryCount: newRetryCount,\n lastError: errorMessage,\n });\n\n // Retry with exponential backoff\n const retryDelay = Math.min(\n 1000 * Math.pow(2, newRetryCount - 1),\n 60000\n );\n const retryTask = await this.storage.get(task.taskId);\n if (retryTask) {\n if (task.executionType === ScheduleExecutionType.ONCE) {\n retryTask.executeAt = Date.now() + retryDelay;\n } else {\n retryTask.nextRunAt = Date.now() + retryDelay;\n }\n await this.storage.update(task.taskId, {\n executeAt: retryTask.executeAt,\n nextRunAt: retryTask.nextRunAt,\n });\n this.scheduleTimer(retryTask);\n }\n } else {\n // Max retries exceeded\n await this.storage.update(task.taskId, {\n status: ScheduledTaskStatus.FAILED,\n retryCount: newRetryCount,\n lastError: errorMessage,\n });\n this.timers.delete(task.taskId);\n console.error(\n `[Scheduler] Task failed permanently: ${task.taskId} (max retries exceeded)`\n );\n }\n }\n }\n}\n","/**\n * MemoryScheduleStorage\n *\n * In-memory storage implementation for scheduled tasks\n * Useful for development and testing, not recommended for production\n * Data is lost on service restart\n */\n\nimport {\n ScheduleStorage,\n ScheduledTaskDefinition,\n ScheduledTaskStatus,\n ScheduleExecutionType,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * In-memory storage for scheduled tasks\n */\nexport class MemoryScheduleStorage implements ScheduleStorage {\n private tasks: Map<string, ScheduledTaskDefinition> = new Map();\n\n /**\n * Save a new task\n */\n async save(task: ScheduledTaskDefinition): Promise<void> {\n this.tasks.set(task.taskId, { ...task });\n }\n\n /**\n * Get task by ID\n */\n async get(taskId: string): Promise<ScheduledTaskDefinition | null> {\n const task = this.tasks.get(taskId);\n return task ? { ...task } : null;\n }\n\n /**\n * Update task\n */\n async update(\n taskId: string,\n updates: Partial<ScheduledTaskDefinition>\n ): Promise<void> {\n const task = this.tasks.get(taskId);\n if (task) {\n this.tasks.set(taskId, {\n ...task,\n ...updates,\n updatedAt: Date.now(),\n });\n }\n }\n\n /**\n * Delete task\n */\n async delete(taskId: string): Promise<void> {\n this.tasks.delete(taskId);\n }\n\n /**\n * Get all active tasks (pending or paused)\n */\n async getActiveTasks(): Promise<ScheduledTaskDefinition[]> {\n const result: ScheduledTaskDefinition[] = [];\n for (const task of this.tasks.values()) {\n if (\n task.status === ScheduledTaskStatus.PENDING ||\n task.status === ScheduledTaskStatus.PAUSED\n ) {\n result.push({ ...task });\n }\n }\n return result;\n }\n\n /**\n * Get tasks by type\n */\n async getTasksByType(taskType: string): Promise<ScheduledTaskDefinition[]> {\n const result: ScheduledTaskDefinition[] = [];\n for (const task of this.tasks.values()) {\n if (task.taskType === taskType) {\n result.push({ ...task });\n }\n }\n return result;\n }\n\n /**\n * Get tasks by status\n */\n async getTasksByStatus(\n status: ScheduledTaskStatus\n ): Promise<ScheduledTaskDefinition[]> {\n const result: ScheduledTaskDefinition[] = [];\n for (const task of this.tasks.values()) {\n if (task.status === status) {\n result.push({ ...task });\n }\n }\n return result;\n }\n\n /**\n * Get tasks by execution type\n */\n async getTasksByExecutionType(\n executionType: ScheduleExecutionType\n ): Promise<ScheduledTaskDefinition[]> {\n const result: ScheduledTaskDefinition[] = [];\n for (const task of this.tasks.values()) {\n if (task.executionType === executionType) {\n result.push({ ...task });\n }\n }\n return result;\n }\n\n /**\n * Get tasks by assistant ID\n */\n async getTasksByAssistantId(\n assistantId: string\n ): Promise<ScheduledTaskDefinition[]> {\n const result: ScheduledTaskDefinition[] = [];\n for (const task of this.tasks.values()) {\n if (task.assistantId === assistantId) {\n result.push({ ...task });\n }\n }\n return result;\n }\n\n /**\n * Get tasks by thread ID\n */\n async getTasksByThreadId(\n threadId: string\n ): Promise<ScheduledTaskDefinition[]> {\n const result: ScheduledTaskDefinition[] = [];\n for (const task of this.tasks.values()) {\n if (task.threadId === threadId) {\n result.push({ ...task });\n }\n }\n return result;\n }\n\n /**\n * Get all tasks with optional filters\n */\n async getAllTasks(filters?: {\n status?: ScheduledTaskStatus;\n executionType?: ScheduleExecutionType;\n taskType?: string;\n assistantId?: string;\n threadId?: string;\n limit?: number;\n offset?: number;\n }): Promise<ScheduledTaskDefinition[]> {\n let result: ScheduledTaskDefinition[] = [];\n\n for (const task of this.tasks.values()) {\n let match = true;\n\n if (filters?.status !== undefined && task.status !== filters.status) {\n match = false;\n }\n if (\n filters?.executionType !== undefined &&\n task.executionType !== filters.executionType\n ) {\n match = false;\n }\n if (\n filters?.taskType !== undefined &&\n task.taskType !== filters.taskType\n ) {\n match = false;\n }\n if (\n filters?.assistantId !== undefined &&\n task.assistantId !== filters.assistantId\n ) {\n match = false;\n }\n if (\n filters?.threadId !== undefined &&\n task.threadId !== filters.threadId\n ) {\n match = false;\n }\n\n if (match) {\n result.push({ ...task });\n }\n }\n\n // Sort by createdAt descending\n result.sort((a, b) => b.createdAt - a.createdAt);\n\n // Apply offset and limit\n const offset = filters?.offset || 0;\n const limit = filters?.limit;\n\n if (limit !== undefined) {\n result = result.slice(offset, offset + limit);\n } else if (offset > 0) {\n result = result.slice(offset);\n }\n\n return result;\n }\n\n /**\n * Count tasks with optional filters\n */\n async countTasks(filters?: {\n status?: ScheduledTaskStatus;\n executionType?: ScheduleExecutionType;\n taskType?: string;\n assistantId?: string;\n threadId?: string;\n }): Promise<number> {\n let count = 0;\n\n for (const task of this.tasks.values()) {\n let match = true;\n\n if (filters?.status !== undefined && task.status !== filters.status) {\n match = false;\n }\n if (\n filters?.executionType !== undefined &&\n task.executionType !== filters.executionType\n ) {\n match = false;\n }\n if (\n filters?.taskType !== undefined &&\n task.taskType !== filters.taskType\n ) {\n match = false;\n }\n if (\n filters?.assistantId !== undefined &&\n task.assistantId !== filters.assistantId\n ) {\n match = false;\n }\n if (\n filters?.threadId !== undefined &&\n task.threadId !== filters.threadId\n ) {\n match = false;\n }\n\n if (match) {\n count++;\n }\n }\n\n return count;\n }\n\n /**\n * Delete completed/cancelled tasks older than specified time\n */\n async deleteOldTasks(olderThanMs: number): Promise<number> {\n const cutoff = Date.now() - olderThanMs;\n let deleted = 0;\n\n for (const [taskId, task] of this.tasks.entries()) {\n if (\n (task.status === ScheduledTaskStatus.COMPLETED ||\n task.status === ScheduledTaskStatus.CANCELLED ||\n task.status === ScheduledTaskStatus.FAILED) &&\n task.updatedAt < cutoff\n ) {\n this.tasks.delete(taskId);\n deleted++;\n }\n }\n\n return deleted;\n }\n\n /**\n * Clear all tasks (useful for testing)\n */\n clear(): void {\n this.tasks.clear();\n }\n\n /**\n * Get total task count (useful for debugging)\n */\n size(): number {\n return this.tasks.size;\n }\n}\n","/**\n * CronParser\n *\n * Simple cron expression parser for calculating next execution time\n * Supports standard 5-field cron format: minute hour day-of-month month day-of-week\n *\n * Field values:\n * minute: 0-59\n * hour: 0-23\n * day-of-month: 1-31\n * month: 1-12\n * day-of-week: 0-7 (0 and 7 are Sunday)\n *\n * Special characters:\n * asterisk (*) : any value\n * comma (,) : value list separator (1,3,5)\n * dash (-) : range of values (1-5)\n * slash (/) : step values (asterisk/5 = every 5)\n */\n\nexport interface CronFields {\n minute: number[];\n hour: number[];\n dayOfMonth: number[];\n month: number[];\n dayOfWeek: number[];\n}\n\n/**\n * Parse a cron expression into field arrays\n */\nexport function parseCronExpression(expression: string): CronFields {\n const parts = expression.trim().split(/\\s+/);\n\n if (parts.length !== 5) {\n throw new Error(\n `Invalid cron expression: expected 5 fields, got ${parts.length}`\n );\n }\n\n return {\n minute: parseField(parts[0], 0, 59),\n hour: parseField(parts[1], 0, 23),\n dayOfMonth: parseField(parts[2], 1, 31),\n month: parseField(parts[3], 1, 12),\n dayOfWeek: parseField(parts[4], 0, 7).map((d) => (d === 7 ? 0 : d)), // Normalize Sunday\n };\n}\n\n/**\n * Parse a single cron field\n */\nfunction parseField(field: string, min: number, max: number): number[] {\n const values = new Set<number>();\n\n // Handle comma-separated values\n const segments = field.split(\",\");\n\n for (const segment of segments) {\n // Handle step values (*/5 or 1-10/2)\n const [range, stepStr] = segment.split(\"/\");\n const step = stepStr ? parseInt(stepStr, 10) : 1;\n\n if (isNaN(step) || step < 1) {\n throw new Error(`Invalid step value: ${stepStr}`);\n }\n\n let rangeStart: number;\n let rangeEnd: number;\n\n if (range === \"*\") {\n rangeStart = min;\n rangeEnd = max;\n } else if (range.includes(\"-\")) {\n // Handle range (1-5)\n const [startStr, endStr] = range.split(\"-\");\n rangeStart = parseInt(startStr, 10);\n rangeEnd = parseInt(endStr, 10);\n\n if (isNaN(rangeStart) || isNaN(rangeEnd)) {\n throw new Error(`Invalid range: ${range}`);\n }\n } else {\n // Single value\n const value = parseInt(range, 10);\n if (isNaN(value)) {\n throw new Error(`Invalid value: ${range}`);\n }\n rangeStart = value;\n rangeEnd = value;\n }\n\n // Validate range\n if (rangeStart < min || rangeEnd > max || rangeStart > rangeEnd) {\n throw new Error(`Value out of range: ${range} (expected ${min}-${max})`);\n }\n\n // Add values with step\n for (let i = rangeStart; i <= rangeEnd; i += step) {\n values.add(i);\n }\n }\n\n return Array.from(values).sort((a, b) => a - b);\n}\n\n/**\n * Get the next execution time after the given date\n */\nexport function getNextCronTime(\n expression: string,\n after: Date = new Date(),\n timezone?: string\n): Date {\n const fields = parseCronExpression(expression);\n\n // Start from the next minute\n const next = new Date(after.getTime());\n next.setSeconds(0, 0);\n next.setMinutes(next.getMinutes() + 1);\n\n // Maximum iterations to prevent infinite loop\n const maxIterations = 366 * 24 * 60; // 1 year in minutes\n let iterations = 0;\n\n while (iterations < maxIterations) {\n iterations++;\n\n // Check month\n const month = next.getMonth() + 1; // JS months are 0-based\n if (!fields.month.includes(month)) {\n // Move to next valid month\n const nextMonth = fields.month.find((m) => m > month);\n if (nextMonth !== undefined) {\n next.setMonth(nextMonth - 1, 1);\n } else {\n // Next year, first valid month\n next.setFullYear(next.getFullYear() + 1);\n next.setMonth(fields.month[0] - 1, 1);\n }\n next.setHours(fields.hour[0], fields.minute[0], 0, 0);\n continue;\n }\n\n // Check day of month\n const dayOfMonth = next.getDate();\n const maxDayOfMonth = new Date(\n next.getFullYear(),\n next.getMonth() + 1,\n 0\n ).getDate();\n\n // Check day of week\n const dayOfWeek = next.getDay();\n\n // Both dayOfMonth and dayOfWeek must match if not wildcard\n const dayOfMonthMatch = fields.dayOfMonth.includes(dayOfMonth);\n const dayOfWeekMatch = fields.dayOfWeek.includes(dayOfWeek);\n\n // If either field is not *, both must match; if one is *, only the other needs to match\n const dayOfMonthWildcard =\n fields.dayOfMonth.length === 31 &&\n fields.dayOfMonth[0] === 1 &&\n fields.dayOfMonth[30] === 31;\n const dayOfWeekWildcard =\n fields.dayOfWeek.length >= 7 ||\n (fields.dayOfWeek.length === 1 && fields.dayOfWeek.includes(0));\n\n let dayMatch: boolean;\n if (dayOfMonthWildcard && dayOfWeekWildcard) {\n dayMatch = true;\n } else if (dayOfMonthWildcard) {\n dayMatch = dayOfWeekMatch;\n } else if (dayOfWeekWildcard) {\n dayMatch = dayOfMonthMatch;\n } else {\n // Standard cron behavior: OR between dayOfMonth and dayOfWeek when both are specified\n dayMatch = dayOfMonthMatch || dayOfWeekMatch;\n }\n\n if (!dayMatch || dayOfMonth > maxDayOfMonth) {\n // Move to next day\n next.setDate(next.getDate() + 1);\n next.setHours(fields.hour[0], fields.minute[0], 0, 0);\n continue;\n }\n\n // Check hour\n const hour = next.getHours();\n if (!fields.hour.includes(hour)) {\n const nextHour = fields.hour.find((h) => h > hour);\n if (nextHour !== undefined) {\n next.setHours(nextHour, fields.minute[0], 0, 0);\n } else {\n // Next day, first valid hour\n next.setDate(next.getDate() + 1);\n next.setHours(fields.hour[0], fields.minute[0], 0, 0);\n }\n continue;\n }\n\n // Check minute\n const minute = next.getMinutes();\n if (!fields.minute.includes(minute)) {\n const nextMinute = fields.minute.find((m) => m > minute);\n if (nextMinute !== undefined) {\n next.setMinutes(nextMinute, 0, 0);\n } else {\n // Next hour\n next.setHours(next.getHours() + 1, fields.minute[0], 0, 0);\n }\n continue;\n }\n\n // All fields match!\n return next;\n }\n\n throw new Error(\"Could not find next cron time within 1 year\");\n}\n\n/**\n * Validate a cron expression\n */\nexport function isValidCronExpression(expression: string): boolean {\n try {\n parseCronExpression(expression);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get a human-readable description of a cron expression\n */\nexport function describeCronExpression(expression: string): string {\n const fields = parseCronExpression(expression);\n\n const parts: string[] = [];\n\n // Minute\n if (fields.minute.length === 60) {\n parts.push(\"every minute\");\n } else if (fields.minute.length === 1) {\n parts.push(`at minute ${fields.minute[0]}`);\n } else {\n parts.push(`at minutes ${fields.minute.join(\", \")}`);\n }\n\n // Hour\n if (fields.hour.length === 24) {\n parts.push(\"of every hour\");\n } else if (fields.hour.length === 1) {\n parts.push(`of hour ${fields.hour[0]}`);\n } else {\n parts.push(`of hours ${fields.hour.join(\", \")}`);\n }\n\n // Day of month\n if (fields.dayOfMonth.length < 31) {\n if (fields.dayOfMonth.length === 1) {\n parts.push(`on day ${fields.dayOfMonth[0]}`);\n } else {\n parts.push(`on days ${fields.dayOfMonth.join(\", \")}`);\n }\n }\n\n // Month\n const monthNames = [\n \"\",\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ];\n if (fields.month.length < 12) {\n const months = fields.month.map((m) => monthNames[m]);\n parts.push(`in ${months.join(\", \")}`);\n }\n\n // Day of week\n const dayNames = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n const uniqueDays = [...new Set(fields.dayOfWeek)];\n if (uniqueDays.length < 7) {\n const days = uniqueDays.map((d) => dayNames[d]);\n parts.push(`on ${days.join(\", \")}`);\n }\n\n return parts.join(\" \");\n}\n","import { Embeddings } from \"@langchain/core/embeddings\";\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\n\n/**\n * Embeddings Lattice Interface\n * Defines the structure of an embeddings lattice entry\n */\nexport interface EmbeddingsLatticeInterface {\n key: string;\n client: Embeddings;\n}\n\n/**\n * EmbeddingsLatticeManager - Singleton embeddings Lattice manager\n * Responsible for registering and managing various embeddings model Lattices\n */\nexport class EmbeddingsLatticeManager extends BaseLatticeManager<EmbeddingsLatticeInterface> {\n private static _instance: EmbeddingsLatticeManager;\n\n /**\n * Get EmbeddingsLatticeManager singleton instance\n */\n public static getInstance(): EmbeddingsLatticeManager {\n if (!EmbeddingsLatticeManager._instance) {\n EmbeddingsLatticeManager._instance = new EmbeddingsLatticeManager();\n }\n return EmbeddingsLatticeManager._instance;\n }\n\n /**\n * Get Lattice type prefix\n */\n protected getLatticeType(): string {\n return \"embeddings\";\n }\n\n /**\n * Register embeddings Lattice\n * @param key Lattice key name\n * @param embeddings Embeddings instance\n */\n public registerLattice(key: string, embeddings: Embeddings): void {\n // Create embeddings Lattice object\n const embeddingsLattice: EmbeddingsLatticeInterface = {\n key,\n client: embeddings,\n };\n\n // Call base class register method\n this.register(key, embeddingsLattice);\n }\n\n /**\n * Get EmbeddingsLattice\n * @param key Lattice key name\n */\n public getEmbeddingsLattice(key: string): EmbeddingsLatticeInterface {\n const embeddingsLattice = this.get(key);\n if (!embeddingsLattice) {\n throw new Error(`EmbeddingsLattice ${key} not found`);\n }\n return embeddingsLattice;\n }\n\n /**\n * Get all Lattices\n */\n public getAllLattices(): EmbeddingsLatticeInterface[] {\n return this.getAll();\n }\n\n /**\n * Check if Lattice exists\n * @param key Lattice key name\n */\n public hasLattice(key: string): boolean {\n return this.has(key);\n }\n\n /**\n * Remove Lattice\n * @param key Lattice key name\n */\n public removeLattice(key: string): boolean {\n return this.remove(key);\n }\n\n /**\n * Clear all Lattices\n */\n public clearLattices(): void {\n this.clear();\n }\n\n /**\n * Get Lattice count\n */\n public getLatticeCount(): number {\n return this.count();\n }\n\n /**\n * Get Lattice key list\n */\n public getLatticeKeys(): string[] {\n return this.keys();\n }\n\n /**\n * Get embeddings client\n * @param key Lattice key name\n */\n public getEmbeddingsClient(key: string): Embeddings {\n const embeddingsLattice = this.getEmbeddingsLattice(key);\n return embeddingsLattice.client;\n }\n}\n\n// Export singleton instance\nexport const embeddingsLatticeManager = EmbeddingsLatticeManager.getInstance();\n\n// Export convenience methods\nexport const registerEmbeddingsLattice = (\n key: string,\n embeddings: Embeddings\n) => embeddingsLatticeManager.registerLattice(key, embeddings);\n\nexport const getEmbeddingsLattice = (key: string) =>\n embeddingsLatticeManager.getEmbeddingsLattice(key);\n\nexport const getEmbeddingsClient = (key: string) =>\n embeddingsLatticeManager.getEmbeddingsClient(key);\n","import { VectorStore } from \"@langchain/core/vectorstores\";\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\n\n/**\n * VectorStore Lattice Interface\n * Defines the structure of a vector store lattice entry\n */\nexport interface VectorStoreLatticeInterface {\n key: string;\n client: VectorStore;\n}\n\n/**\n * VectorStoreLatticeManager - Singleton vector store Lattice manager\n * Responsible for registering and managing various vector store Lattices\n */\nexport class VectorStoreLatticeManager extends BaseLatticeManager<VectorStoreLatticeInterface> {\n private static _instance: VectorStoreLatticeManager;\n\n /**\n * Get VectorStoreLatticeManager singleton instance\n */\n public static getInstance(): VectorStoreLatticeManager {\n if (!VectorStoreLatticeManager._instance) {\n VectorStoreLatticeManager._instance = new VectorStoreLatticeManager();\n }\n return VectorStoreLatticeManager._instance;\n }\n\n /**\n * Get Lattice type prefix\n */\n protected getLatticeType(): string {\n return \"vectorstores\";\n }\n\n /**\n * Register vector store Lattice\n * @param key Lattice key name\n * @param vectorStore VectorStore instance\n */\n public registerLattice(key: string, vectorStore: VectorStore): void {\n // Create vector store Lattice object\n const vectorStoreLattice: VectorStoreLatticeInterface = {\n key,\n client: vectorStore,\n };\n\n // Call base class register method\n this.register(key, vectorStoreLattice);\n }\n\n /**\n * Get VectorStoreLattice\n * @param key Lattice key name\n */\n public getVectorStoreLattice(key: string): VectorStoreLatticeInterface {\n const vectorStoreLattice = this.get(key);\n if (!vectorStoreLattice) {\n throw new Error(`VectorStoreLattice ${key} not found`);\n }\n return vectorStoreLattice;\n }\n\n /**\n * Get all Lattices\n */\n public getAllLattices(): VectorStoreLatticeInterface[] {\n return this.getAll();\n }\n\n /**\n * Check if Lattice exists\n * @param key Lattice key name\n */\n public hasLattice(key: string): boolean {\n return this.has(key);\n }\n\n /**\n * Remove Lattice\n * @param key Lattice key name\n */\n public removeLattice(key: string): boolean {\n return this.remove(key);\n }\n\n /**\n * Clear all Lattices\n */\n public clearLattices(): void {\n this.clear();\n }\n\n /**\n * Get Lattice count\n */\n public getLatticeCount(): number {\n return this.count();\n }\n\n /**\n * Get Lattice key list\n */\n public getLatticeKeys(): string[] {\n return this.keys();\n }\n\n /**\n * Get vector store client\n * @param key Lattice key name\n */\n public getVectorStoreClient(key: string): VectorStore {\n const vectorStoreLattice = this.getVectorStoreLattice(key);\n return vectorStoreLattice.client;\n }\n}\n\n// Export singleton instance\nexport const vectorStoreLatticeManager = VectorStoreLatticeManager.getInstance();\n\n// Export convenience methods\nexport const registerVectorStoreLattice = (key: string, vectorStore: VectorStore) =>\n vectorStoreLatticeManager.registerLattice(key, vectorStore);\n\nexport const getVectorStoreLattice = (key: string) =>\n vectorStoreLatticeManager.getVectorStoreLattice(key);\n\nexport const getVectorStoreClient = (key: string) =>\n vectorStoreLatticeManager.getVectorStoreClient(key);\n\n","/**\n * LoggerLatticeManager\n *\n * Logger Lattice manager for registering and managing logger services\n */\n\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport {\n LoggerLatticeProtocol,\n LoggerConfig,\n LoggerType,\n LoggerClient,\n} from \"@axiom-lattice/protocols\";\nimport { PinoLoggerClient } from \"./PinoLoggerClient\";\nimport { ConsoleLoggerClient } from \"./ConsoleLoggerClient\";\n\n/**\n * Logger Lattice interface\n */\nexport interface LoggerLattice extends LoggerLatticeProtocol {\n key: string;\n config: LoggerConfig;\n client: LoggerLatticeProtocol[\"client\"];\n}\n\n/**\n * LoggerLatticeManager - Singleton logger Lattice manager\n * Responsible for registering and managing various logger service Lattices\n */\nexport class LoggerLatticeManager extends BaseLatticeManager<LoggerLattice> {\n private static _instance: LoggerLatticeManager;\n\n /**\n * Get LoggerLatticeManager singleton instance\n */\n public static getInstance(): LoggerLatticeManager {\n if (!LoggerLatticeManager._instance) {\n LoggerLatticeManager._instance = new LoggerLatticeManager();\n }\n return LoggerLatticeManager._instance;\n }\n\n /**\n * Get Lattice type prefix\n */\n protected getLatticeType(): string {\n return \"loggers\";\n }\n\n /**\n * Register logger Lattice\n * @param key Lattice key name\n * @param config Logger configuration\n * @param client Optional logger client. If not provided, will create based on config type.\n */\n public registerLattice(\n key: string,\n config: LoggerConfig,\n client?: LoggerClient\n ): void {\n // Create client based on logger type if not provided\n let loggerClient: LoggerLatticeProtocol[\"client\"];\n\n if (client) {\n // Use provided client\n loggerClient = client;\n } else {\n if (config.type === LoggerType.PINO) {\n loggerClient = new PinoLoggerClient(config);\n } else if (config.type === LoggerType.CONSOLE) {\n loggerClient = new ConsoleLoggerClient(config);\n } else if (config.type === LoggerType.CUSTOM) {\n // For custom type, client must be provided\n throw new Error(\n `Custom logger client must be provided. Please pass the client to registerLattice.`\n );\n } else {\n // Default to pino\n loggerClient = new PinoLoggerClient(config);\n }\n }\n\n // Create logger Lattice object\n const loggerLattice: LoggerLattice = {\n key,\n config,\n client: loggerClient,\n\n // Logger operations\n info: (msg: string, obj?: object) => {\n loggerClient.info(msg, obj);\n },\n error: (msg: string, obj?: object | Error) => {\n loggerClient.error(msg, obj);\n },\n warn: (msg: string, obj?: object) => {\n loggerClient.warn(msg, obj);\n },\n debug: (msg: string, obj?: object) => {\n loggerClient.debug(msg, obj);\n },\n updateContext: loggerClient.updateContext\n ? (context) => {\n loggerClient.updateContext!(context);\n }\n : undefined,\n child: loggerClient.child\n ? (options) => {\n return loggerClient.child!(options);\n }\n : undefined,\n };\n\n // Call base class register method\n this.register(key, loggerLattice);\n }\n\n /**\n * Get LoggerLattice\n * @param key Lattice key name\n */\n public getLoggerLattice(key: string): LoggerLattice {\n const loggerLattice = this.get(key);\n if (!loggerLattice) {\n throw new Error(`LoggerLattice ${key} not found`);\n }\n return loggerLattice;\n }\n\n /**\n * Get all Lattices\n */\n public getAllLattices(): LoggerLattice[] {\n return this.getAll();\n }\n\n /**\n * Check if Lattice exists\n * @param key Lattice key name\n */\n public hasLattice(key: string): boolean {\n return this.has(key);\n }\n\n /**\n * Remove Lattice\n * @param key Lattice key name\n */\n public removeLattice(key: string): boolean {\n return this.remove(key);\n }\n\n /**\n * Clear all Lattices\n */\n public clearLattices(): void {\n this.clear();\n }\n\n /**\n * Get Lattice count\n */\n public getLatticeCount(): number {\n return this.count();\n }\n\n /**\n * Get Lattice key list\n */\n public getLatticeKeys(): string[] {\n return this.keys();\n }\n}\n\n// Export singleton instance\nexport const loggerLatticeManager = LoggerLatticeManager.getInstance();\n\n// Export convenience methods\nexport const registerLoggerLattice = (\n key: string,\n config: LoggerConfig,\n client?: LoggerClient\n) => loggerLatticeManager.registerLattice(key, config, client);\n\nexport const getLoggerLattice = (key: string) =>\n loggerLatticeManager.getLoggerLattice(key);\n","/**\n * PinoLoggerClient\n *\n * Pino-based logger client implementation\n */\n\nimport pino from \"pino\";\nimport \"pino-pretty\";\nimport \"pino-roll\";\nimport {\n LoggerClient,\n LoggerContext,\n LoggerConfig,\n PinoFileOptions,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * Pino-based logger client implementation\n * Supports custom file paths and pino configurations\n */\nexport class PinoLoggerClient implements LoggerClient {\n private pinoLogger: pino.Logger;\n private config: LoggerConfig;\n private context: LoggerContext;\n\n constructor(config: LoggerConfig) {\n this.config = config;\n this.context = config.context || {};\n\n // Create pino logger with custom configuration\n const loggerConfig: pino.LoggerOptions = {\n // Custom timestamp format\n timestamp: () => `,\"@timestamp\":\"${new Date().toISOString()}\"`,\n\n // Base metadata\n base: {\n \"@version\": \"1\",\n app_name: \"lattice\",\n service_name: config.serviceName || \"lattice-service\",\n thread_name: \"main\",\n logger_name: config.loggerName || config.name || \"lattice-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 // Determine if we should use file logging\n const useFileLogging = this.shouldUseFileLogging(config);\n const fileOptions = this.getFileOptions(config);\n\n if (useFileLogging && fileOptions) {\n // Use file logging with pino-roll\n try {\n this.pinoLogger = pino(\n loggerConfig,\n pino.transport({\n target: \"pino-roll\",\n options: {\n file: fileOptions.file || \"./logs/app\",\n frequency: fileOptions.frequency || \"daily\",\n mkdir: fileOptions.mkdir !== false, // Default to true\n size: fileOptions.size,\n maxFiles: fileOptions.maxFiles,\n },\n })\n );\n } catch (error) {\n console.error(\n \"Failed to initialize pino-roll logger, falling back to console\",\n error\n );\n // Fallback to console logging\n this.pinoLogger = pino({\n ...loggerConfig,\n transport: {\n target: \"pino-pretty\",\n options: {\n colorize: true,\n },\n },\n });\n }\n } else {\n // Use console logging with pretty output\n this.pinoLogger = pino({\n ...loggerConfig,\n transport: {\n target: \"pino-pretty\",\n options: {\n colorize: true,\n },\n },\n });\n }\n }\n\n /**\n * Determine if file logging should be used\n */\n private shouldUseFileLogging(config: LoggerConfig): boolean {\n // Use file logging if:\n // 1. file option is provided, OR\n // 2. NODE_ENV is production (unless explicitly disabled)\n const hasFileConfig = config.file !== undefined;\n const isProduction = process.env.NODE_ENV === \"production\";\n return hasFileConfig || isProduction;\n }\n\n /**\n * Get file options from config\n */\n private getFileOptions(config: LoggerConfig): PinoFileOptions | null {\n if (!config.file) {\n // If no file config but in production, use default\n if (process.env.NODE_ENV === \"production\") {\n return {\n file: \"./logs/app\",\n frequency: \"daily\",\n mkdir: true,\n };\n }\n return null;\n }\n\n // If file is a string, convert to PinoFileOptions\n if (typeof config.file === \"string\") {\n return {\n file: config.file,\n frequency: \"daily\",\n mkdir: true,\n };\n }\n\n // Otherwise, it's already PinoFileOptions\n return config.file;\n }\n\n /**\n * Get contextual logger with merged context\n */\n private getContextualLogger(additionalContext?: object): pino.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-thread-id\": this.context[\"x-thread-id\"] || \"\",\n service_name: this.config.serviceName || \"lattice-service\",\n logger_name:\n this.config.loggerName || this.config.name || \"lattice-logger\",\n ...additionalContext,\n };\n\n return this.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 updateContext(context: Partial<LoggerContext>): void {\n this.context = {\n ...this.context,\n ...context,\n };\n }\n\n child(options: Partial<LoggerConfig>): LoggerClient {\n // Create a new PinoLoggerClient with merged config\n return new PinoLoggerClient({\n ...this.config,\n ...options,\n context: {\n ...this.context,\n ...options.context,\n },\n });\n }\n}\n","/**\n * ConsoleLoggerClient\n *\n * Simple console-based logger client implementation\n */\n\nimport { LoggerClient, LoggerContext, LoggerConfig } from \"@axiom-lattice/protocols\";\n\n/**\n * Console-based logger client implementation\n */\nexport class ConsoleLoggerClient implements LoggerClient {\n private config: LoggerConfig;\n private context: LoggerContext;\n\n constructor(config: LoggerConfig) {\n this.config = config;\n this.context = config.context || {};\n }\n\n private formatMessage(level: string, msg: string, obj?: object): string {\n const timestamp = new Date().toISOString();\n const contextStr = Object.keys(this.context).length > 0\n ? ` [${JSON.stringify(this.context)}]`\n : \"\";\n const objStr = obj ? ` ${JSON.stringify(obj)}` : \"\";\n return `[${timestamp}] [${level}]${contextStr} ${msg}${objStr}`;\n }\n\n info(msg: string, obj?: object): void {\n console.log(this.formatMessage(\"INFO\", msg, obj));\n }\n\n error(msg: string, obj?: object | Error): void {\n console.error(this.formatMessage(\"ERROR\", msg, obj));\n }\n\n warn(msg: string, obj?: object): void {\n console.warn(this.formatMessage(\"WARN\", msg, obj));\n }\n\n debug(msg: string, obj?: object): void {\n console.debug(this.formatMessage(\"DEBUG\", msg, obj));\n }\n\n updateContext(context: Partial<LoggerContext>): void {\n this.context = {\n ...this.context,\n ...context,\n };\n }\n\n child(options: Partial<LoggerConfig>): LoggerClient {\n const childClient = new ConsoleLoggerClient({\n ...this.config,\n ...options,\n context: {\n ...this.context,\n ...options.context,\n },\n });\n return childClient;\n }\n}\n","/**\n * SkillLatticeManager\n *\n * Skill Lattice manager for registering and managing skill components\n */\n\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport {\n SkillConfig,\n SkillLatticeProtocol,\n SkillClient,\n SkillClientType,\n SkillStore,\n} from \"@axiom-lattice/protocols\";\nimport { storeLatticeManager } from \"../store_lattice/StoreLatticeManager\";\nimport { validateSkillName } from \"./skillNameValidator\";\n\n/**\n * Skill Lattice interface\n */\nexport interface SkillLattice {\n key: string;\n config: SkillConfig;\n client: SkillClient | null;\n}\n\n/**\n * SkillLatticeManager - Singleton skill Lattice manager\n * Responsible for registering and managing various skill Lattices\n */\nexport class SkillLatticeManager extends BaseLatticeManager<SkillLattice> {\n private static _instance: SkillLatticeManager;\n private storeKey?: string;\n\n /**\n * Get SkillLatticeManager singleton instance\n */\n public static getInstance(): SkillLatticeManager {\n if (!SkillLatticeManager._instance) {\n SkillLatticeManager._instance = new SkillLatticeManager();\n }\n return SkillLatticeManager._instance;\n }\n\n /**\n * Get Lattice type prefix\n */\n protected getLatticeType(): string {\n return \"skills\";\n }\n\n /**\n * Configure store for persistence\n * @param storeKey Store key name registered in StoreLatticeManager\n */\n public configureStore(storeKey: string): void {\n this.storeKey = storeKey;\n }\n\n /**\n * Get configured store\n * @returns SkillStore instance if configured, null otherwise\n */\n private getStore(): SkillStore | null {\n if (!this.storeKey) {\n return null;\n }\n\n try {\n const storeLattice = storeLatticeManager.getStoreLattice(\n this.storeKey,\n \"skill\"\n );\n return storeLattice.store;\n } catch {\n return null;\n }\n }\n\n /**\n * Inject store into client if client supports it\n * @param client Skill client instance\n * @param store Store instance to inject\n */\n private injectStoreIntoClient(client: SkillClientType, store: SkillStore): void {\n if (!client || typeof client !== \"object\") {\n return;\n }\n\n // Try setStore method first\n if (typeof client.setStore === \"function\") {\n client.setStore(store);\n }\n\n // Also set store property directly\n client.store = store;\n }\n\n /**\n * Register a skill Lattice\n * @param key Lattice key name\n * @param config Skill configuration\n * @param client Optional skill client implementation\n */\n public async registerLattice(\n key: string,\n config: SkillConfig,\n client?: SkillClient\n ): Promise<void> {\n // Validate required fields\n if (!config.name) {\n throw new Error(\"Skill name is required\");\n }\n if (!config.description) {\n throw new Error(\"Skill description is required\");\n }\n\n // Validate name format\n validateSkillName(config.name);\n\n // Validate that key equals name (name is used for path addressing)\n if (key !== config.name) {\n throw new Error(\n `Skill key \"${key}\" must equal name \"${config.name}\" (name is used for path addressing)`\n );\n }\n\n // Get store instance\n const store = this.getStore();\n\n // Inject store into client if provided\n if (client && store) {\n this.injectStoreIntoClient(client, store);\n }\n\n // Create skill Lattice object\n const skillLattice: SkillLattice = {\n key,\n config,\n client: client ?? null,\n };\n\n // Call base class register method\n this.register(key, skillLattice);\n\n // Persist to store if configured\n if (store) {\n try {\n await store.createSkill(key, {\n name: config.name,\n description: config.description,\n license: config.license,\n compatibility: config.compatibility,\n metadata: config.metadata,\n content: config.content,\n subSkills: config.subSkills,\n });\n } catch (error) {\n // Log error but don't fail registration\n console.warn(\n `Failed to persist skill ${key} to store:`,\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n }\n\n /**\n * Get skill Lattice by key\n * @param key Lattice key name\n */\n public getSkillLattice(key: string): SkillLattice | undefined {\n return this.get(key);\n }\n\n /**\n * Get all skill Lattices from store\n * Always reads from the configured store and merges with in-memory clients\n */\n public async getAllLattices(): Promise<SkillLattice[]> {\n const store = this.getStore();\n if (!store) {\n // If no store configured, fall back to memory\n return this.getAll();\n }\n\n const skills = await store.getAllSkills();\n\n return skills.map((skill) => {\n // Check if there's an in-memory lattice with a client\n const memoryLattice = this.get(skill.id);\n const client = memoryLattice?.client || null;\n\n // Inject store into client if it exists\n if (client && store) {\n this.injectStoreIntoClient(client, store);\n }\n\n return {\n key: skill.id,\n config: {\n name: skill.name,\n description: skill.description,\n license: skill.license,\n compatibility: skill.compatibility,\n metadata: skill.metadata,\n content: skill.content,\n subSkills: skill.subSkills,\n },\n client,\n };\n });\n }\n\n /**\n * Check if Lattice exists\n * @param key Lattice key name\n */\n public hasLattice(key: string): boolean {\n return this.has(key);\n }\n\n /**\n * Remove Lattice\n * @param key Lattice key name\n */\n public async removeLattice(key: string): Promise<boolean> {\n const removed = this.remove(key);\n\n // Remove from store if configured\n if (removed) {\n const store = this.getStore();\n if (store) {\n try {\n await store.deleteSkill(key);\n } catch (error) {\n // Log error but don't fail removal\n console.warn(\n `Failed to remove skill ${key} from store:`,\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n }\n\n return removed;\n }\n\n /**\n * Clear all Lattices\n */\n public clearLattices(): void {\n this.clear();\n }\n\n /**\n * Get Lattice count\n */\n public getLatticeCount(): number {\n return this.count();\n }\n\n /**\n * Get Lattice key name list\n */\n public getLatticeKeys(): string[] {\n return this.keys();\n }\n\n /**\n * Get skill configuration\n * @param key Lattice key name\n */\n public getSkillConfig(key: string): SkillConfig {\n const skillLattice = this.getSkillLattice(key);\n if (!skillLattice) {\n throw new Error(`SkillLattice ${key} not found`);\n }\n return skillLattice.config;\n }\n\n /**\n * Get skill client\n * Ensures client has store access if store is configured\n * @param key Lattice key name\n */\n public getSkillClient(key: string): SkillClient | null {\n const skillLattice = this.getSkillLattice(key);\n if (!skillLattice) {\n throw new Error(`SkillLattice ${key} not found`);\n }\n\n const client = skillLattice.client;\n if (!client) {\n return null;\n }\n\n // Ensure client has store access if store is configured\n const store = this.getStore();\n if (store && client) {\n this.injectStoreIntoClient(client, store);\n }\n\n return client;\n }\n\n /**\n * Get all skill configurations from store\n * Always reads from the configured store, not from memory\n */\n public async getAllSkillConfigs(): Promise<SkillConfig[]> {\n const lattices = await this.getAllLattices();\n return lattices.map((lattice) => lattice.config);\n }\n\n /**\n * Search skills by metadata\n * @param metadataKey Metadata key to search for\n * @param metadataValue Metadata value to match\n */\n public async searchByMetadata(\n metadataKey: string,\n metadataValue: string\n ): Promise<SkillLattice[]> {\n const lattices = await this.getAllLattices();\n return lattices.filter((lattice) => {\n return (\n lattice.config.metadata &&\n lattice.config.metadata[metadataKey] === metadataValue\n );\n });\n }\n\n /**\n * Filter skills by compatibility\n * @param compatibility Compatibility string to filter by\n */\n public async filterByCompatibility(compatibility: string): Promise<SkillLattice[]> {\n const lattices = await this.getAllLattices();\n return lattices.filter((lattice) => {\n return lattice.config.compatibility === compatibility;\n });\n }\n\n /**\n * Filter skills by license\n * @param license License string to filter by\n */\n public async filterByLicense(license: string): Promise<SkillLattice[]> {\n const lattices = await this.getAllLattices();\n return lattices.filter((lattice) => {\n return lattice.config.license === license;\n });\n }\n\n /**\n * Load skills from configured store\n * This method loads all skills from the store and registers them in memory\n */\n public async loadFromStore(): Promise<void> {\n const store = this.getStore();\n if (!store) {\n throw new Error(\"No store configured. Call configureStore() first.\");\n }\n\n const skills = await store.getAllSkills();\n for (const skill of skills) {\n // Register skill in memory without persisting back to store\n const skillLattice: SkillLattice = {\n key: skill.id,\n config: {\n name: skill.name,\n description: skill.description,\n license: skill.license,\n compatibility: skill.compatibility,\n metadata: skill.metadata,\n content: skill.content,\n subSkills: skill.subSkills,\n },\n client: null,\n };\n\n // Use base class register method directly to avoid double persistence\n this.register(skill.id, skillLattice);\n\n // Note: If a client is later added to this skill, it will receive store access\n // via getSkillClient() method\n }\n }\n\n /**\n * Update skill in store\n * @param key Skill key\n * @param updates Partial skill data to update\n */\n public async updateSkillInStore(\n key: string,\n updates: Partial<SkillConfig>\n ): Promise<void> {\n const store = this.getStore();\n if (!store) {\n throw new Error(\"No store configured. Call configureStore() first.\");\n }\n\n // Update in memory\n const skillLattice = this.getSkillLattice(key);\n if (!skillLattice) {\n throw new Error(`SkillLattice ${key} not found`);\n }\n\n const updatedConfig: SkillConfig = {\n ...skillLattice.config,\n ...updates,\n };\n\n skillLattice.config = updatedConfig;\n\n // Update in store\n await store.updateSkill(key, {\n name: updatedConfig.name,\n description: updatedConfig.description,\n license: updatedConfig.license,\n compatibility: updatedConfig.compatibility,\n metadata: updatedConfig.metadata,\n content: updatedConfig.content,\n subSkills: updatedConfig.subSkills,\n });\n }\n}\n\n// Export singleton instance\nexport const skillLatticeManager = SkillLatticeManager.getInstance();\n","/**\n * McpLatticeManager\n *\n * MCP Lattice Manager - Manages MCP client connections using MultiServerMCPClient\n * Follows the singleton pattern for global access\n */\n\nimport { MultiServerMCPClient } from \"@langchain/mcp-adapters\";\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport type { Connection } from \"@langchain/mcp-adapters\";\nimport { toolLatticeManager } from \"../tool_lattice\";\n\nexport interface McpServerInfo {\n name: string;\n connection: Connection;\n}\n\nexport interface McpLatticeInterface {\n client: MultiServerMCPClient;\n servers: Map<string, McpServerInfo>;\n}\n\nexport class McpLatticeManager extends BaseLatticeManager<McpLatticeInterface> {\n private static _instance: McpLatticeManager;\n private client: MultiServerMCPClient | null = null;\n private servers: Map<string, McpServerInfo> = new Map();\n\n public static getInstance(): McpLatticeManager {\n if (!McpLatticeManager._instance) {\n McpLatticeManager._instance = new McpLatticeManager();\n }\n return McpLatticeManager._instance;\n }\n\n protected getLatticeType(): string {\n return \"mcp\";\n }\n\n public registerServers(servers: McpServerInfo[]): void {\n for (const server of servers) {\n if (this.servers.has(server.name)) {\n console.warn(`[MCP] Server '${server.name}' already registered, skipping`);\n continue;\n }\n this.servers.set(server.name, server);\n console.log(`[MCP] Registered server: ${server.name}`);\n }\n }\n\n public addServer(name: string, connection: Connection): void {\n this.registerServers([{ name, connection }]);\n }\n\n public removeServer(name: string): boolean {\n const deleted = this.servers.delete(name);\n if (deleted) {\n console.log(`[MCP] Removed server: ${name}`);\n }\n return deleted;\n }\n\n public async connect(): Promise<void> {\n if (this.client) {\n console.warn(\"[MCP] Client already connected\");\n return;\n }\n\n const serverConfigs: Record<string, Connection> = {};\n for (const [name, info] of this.servers) {\n serverConfigs[name] = info.connection;\n }\n\n if (Object.keys(serverConfigs).length === 0) {\n console.warn(\"[MCP] No servers registered\");\n return;\n }\n\n this.client = new MultiServerMCPClient({\n mcpServers: serverConfigs,\n });\n\n console.log(`[MCP] Connecting to ${this.servers.size} servers...`);\n await this.client.initializeConnections();\n console.log(\"[MCP] All servers connected\");\n }\n\n public async disconnect(): Promise<void> {\n if (this.client) {\n await this.client.close();\n this.client = null;\n console.log(\"[MCP] Disconnected\");\n }\n }\n\n public isConnected(): boolean {\n return this.client !== null;\n }\n\n public async getAllTools(): Promise<any[]> {\n if (!this.client) {\n throw new Error(\"MCP client not connected\");\n }\n return this.client.getTools();\n }\n\n public getServerNames(): string[] {\n return Array.from(this.servers.keys());\n }\n\n public hasServer(name: string): boolean {\n return this.servers.has(name);\n }\n\n /**\n * 将 MCP 工具注册到 Tool Lattice\n * @param prefix 工具键名前缀,用于区分不同服务器的工具\n */\n public async registerToolsToToolLattice(prefix?: string): Promise<void> {\n if (!this.client) {\n throw new Error(\"MCP client not connected\");\n }\n\n const tools = await this.getAllTools();\n console.log(`[MCP] Registering ${tools.length} tools to Tool Lattice...`);\n\n for (const tool of tools) {\n const toolKey = prefix ? `${prefix}_${tool.name}` : tool.name;\n tool.name = toolKey;\n toolLatticeManager.registerExistingTool(toolKey, tool);\n console.log(`[MCP] Registered tool: ${toolKey}`);\n }\n\n console.log(`[MCP] Successfully registered ${tools.length} tools to Tool Lattice`);\n }\n}\n\nexport const mcpManager = McpLatticeManager.getInstance();\n","/**\n * 全局加密工具\n * 用于敏感数据加密存储(如数据库密码、API 密钥等)\n * \n * @module @axiom-lattice/core/util/encryption\n */\n\nimport { createCipheriv, createDecipheriv, randomBytes, pbkdf2Sync } from 'crypto';\n\nconst ALGORITHM = 'aes-256-gcm';\nconst IV_LENGTH = 16;\nconst SALT_LENGTH = 32;\nconst ITERATIONS = 100000;\n\n// 默认密钥(仅开发环境使用)\nconst DEFAULT_ENCRYPTION_KEY = 'lattice-default-encryption-key-dev-only-32b!';\n\nlet cachedKey: Buffer | null = null;\nlet keyValidated = false;\n\n/**\n * 获取加密密钥\n * 优先从环境变量读取,否则使用默认值\n * @returns 32 字节的 Buffer 密钥\n */\nexport function getEncryptionKey(): Buffer {\n if (cachedKey) {\n return cachedKey;\n }\n \n const key = process.env.LATTICE_ENCRYPTION_KEY || DEFAULT_ENCRYPTION_KEY;\n cachedKey = pbkdf2Sync(key, 'lattice-encryption-salt', ITERATIONS, 32, 'sha256');\n \n // 仅在首次获取时验证\n if (!keyValidated) {\n keyValidated = true;\n validateEncryptionKey();\n }\n \n return cachedKey;\n}\n\n/**\n * 加密字符串\n * @param plaintext 明文字符串\n * @param key 可选的加密密钥,默认使用全局密钥\n * @returns 加密后的字符串 (salt:iv:ciphertext:authTag 的 base64 编码)\n */\nexport function encrypt(plaintext: string, key?: Buffer): string {\n const actualKey = key || getEncryptionKey();\n const salt = randomBytes(SALT_LENGTH);\n const iv = randomBytes(IV_LENGTH);\n \n const derivedKey = pbkdf2Sync(actualKey, salt, ITERATIONS, 32, 'sha256');\n const cipher = createCipheriv(ALGORITHM, derivedKey, iv);\n \n const encrypted = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);\n const authTag = cipher.getAuthTag();\n \n // 格式:salt:iv:encrypted:authTag (base64)\n return Buffer.concat([salt, iv, encrypted, authTag]).toString('base64');\n}\n\n/**\n * 解密字符串\n * @param encrypted 加密的字符串 (base64 编码)\n * @param key 可选的解密密钥,默认使用全局密钥\n * @returns 解密后的明文\n * @throws 如果解密失败(密钥错误或数据损坏)\n */\nexport function decrypt(encrypted: string, key?: Buffer): string {\n const actualKey = key || getEncryptionKey();\n const data = Buffer.from(encrypted, 'base64');\n \n const salt = data.subarray(0, SALT_LENGTH);\n const iv = data.subarray(SALT_LENGTH, SALT_LENGTH + IV_LENGTH);\n const authTag = data.subarray(-16);\n const ciphertext = data.subarray(SALT_LENGTH + IV_LENGTH, -16);\n \n const derivedKey = pbkdf2Sync(actualKey, salt, ITERATIONS, 32, 'sha256');\n const decipher = createDecipheriv(ALGORITHM, derivedKey, iv);\n decipher.setAuthTag(authTag);\n \n return Buffer.concat([decipher.update(ciphertext), decipher.final()]).toString('utf8');\n}\n\n/**\n * 检查是否使用默认密钥\n * @returns 如果使用默认密钥返回 true\n */\nexport function isUsingDefaultKey(): boolean {\n return !process.env.LATTICE_ENCRYPTION_KEY;\n}\n\n/**\n * 验证加密密钥\n * 生产环境未设置 LATTICE_ENCRYPTION_KEY 时会抛出错误\n * 开发环境仅输出警告\n */\nexport function validateEncryptionKey(): void {\n if (isUsingDefaultKey()) {\n if (process.env.NODE_ENV === 'production') {\n console.warn(\n '⚠️ WARNING: Using default encryption key in production environment.' +\n ' Set LATTICE_ENCRYPTION_KEY environment variable for security.'\n );\n } else {\n console.warn(\n '⚠️ WARNING: Using default encryption key. ' +\n 'Set LATTICE_ENCRYPTION_KEY environment variable in production.'\n );\n }\n }\n}\n\n/**\n * 清除缓存的密钥(用于测试或重新加载配置)\n */\nexport function clearEncryptionKeyCache(): void {\n cachedKey = null;\n keyValidated = false;\n}\n"],"mappings":"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","names":["tool","z","import_zod","z","import_zod","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_langgraph","import_protocols","import_zod","import_langgraph","import_langchain","import_sandbox","path","relative","import_langchain","import_langchain","import_langchain","import_langchain","path","colonIndex","key","value","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_langchain","import_langgraph","import_zod","path","relative","micromatch","lines","path","relative","z3","result","path","import_langchain","tool","stateSchema","import_langchain","import_v3","import_langchain","import_langgraph","import_langgraph","import_protocols","resolve","import_langchain","import_messages","import_langgraph","path","relative","fs","path","import_micromatch","relative","stat","resolve","fg","micromatch","path","path","relative","import_langgraph","import_zod","import_langchain","tool","import_v3","import_langchain","TaskStatus","MessageType","import_events","import_events","import_v3","import_langchain","import_langgraph","import_v3","import_langchain","import_langgraph","READ_MESSAGES_TIMEOUT_MS","msgs","formatted","relevantMsgs","toolMessage","resolve","uuidv4","msgs","formatted","allTeamMessages","toolMessage","resolve","stateSchema","tool","config","import_protocols","ThreadStatus","resolve","import_protocols","import_protocols","import_protocols","import_protocols","pino","tool"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/base/BaseLatticeManager.ts","../src/model_lattice/ModelLattice.ts","../src/model_lattice/ModelLatticeManager.ts","../src/tool_lattice/get_current_date_time/index.ts","../src/tool_lattice/ToolLatticeManager.ts","../src/util/genUIMarkdown.ts","../src/tool_lattice/createToolApproveWrapper.ts","../src/tool_lattice/internet_search/index.ts","../src/util/genUICard.ts","../src/tool_lattice/sql/SqlDatabaseManager.ts","../src/tool_lattice/sql/list_tables_sql.ts","../src/tool_lattice/sql/info_sql.ts","../src/tool_lattice/sql/query_checker_sql.ts","../src/tool_lattice/sql/query_sql.ts","../src/tool_lattice/metrics/SemanticMetricsClient.ts","../src/tool_lattice/metrics/MetricsServerManager.ts","../src/tool_lattice/metrics/list_metrics_servers.ts","../src/tool_lattice/metrics/list_metrics_datasources.ts","../src/tool_lattice/metrics/query_metrics_list.ts","../src/tool_lattice/metrics/query_metric_definition.ts","../src/tool_lattice/metrics/query_semantic_metric_data.ts","../src/tool_lattice/metrics/query_tables_list.ts","../src/tool_lattice/metrics/query_table_definition.ts","../src/tool_lattice/metrics/execute_sql_query.ts","../src/tool_lattice/code_eval/index.ts","../src/sandbox_lattice/SandboxLatticeManager.ts","../src/sandbox_lattice/utils.ts","../src/tool_lattice/code_execute_file/index.ts","../src/tool_lattice/convert_to_markdown/index.ts","../src/tool_lattice/browser/browser_navigate.ts","../src/tool_lattice/browser/browser_click.ts","../src/tool_lattice/browser/browser_get_text.ts","../src/tool_lattice/browser/browser_get_markdown.ts","../src/tool_lattice/browser/browser_evaluate.ts","../src/tool_lattice/browser/browser_screenshot.ts","../src/tool_lattice/browser/browser_scroll.ts","../src/tool_lattice/browser/browser_form_input_fill.ts","../src/tool_lattice/browser/browser_select.ts","../src/tool_lattice/browser/browser_hover.ts","../src/tool_lattice/browser/browser_go_back.ts","../src/tool_lattice/browser/browser_go_forward.ts","../src/tool_lattice/browser/browser_new_tab.ts","../src/tool_lattice/browser/browser_tab_list.ts","../src/tool_lattice/browser/browser_switch_tab.ts","../src/tool_lattice/browser/browser_close_tab.ts","../src/tool_lattice/browser/browser_close.ts","../src/tool_lattice/browser/browser_press_key.ts","../src/tool_lattice/browser/browser_read_links.ts","../src/tool_lattice/browser/browser_get_clickable_elements.ts","../src/tool_lattice/browser/browser_get_download_list.ts","../src/tool_lattice/browser/get_info.ts","../src/agent_lattice/types.ts","../src/memory_lattice/DefaultMemorySaver.ts","../src/memory_lattice/MemoryLatticeManager.ts","../src/agent_lattice/builders/state.ts","../src/agent_lattice/builders/ReActAgentGraphBuilder.ts","../src/deep_agent_new/backends/sandboxFiles.ts","../src/middlewares/codeEvalMiddleware.ts","../src/middlewares/browserMiddleware.ts","../src/middlewares/sqlMiddleware.ts","../src/middlewares/skillMiddleware.ts","../src/store_lattice/InMemoryThreadStore.ts","../src/store_lattice/InMemoryAssistantStore.ts","../src/store_lattice/FileSystemSkillStore.ts","../src/skill_lattice/skillNameValidator.ts","../src/store_lattice/InMemoryWorkspaceStore.ts","../src/store_lattice/InMemoryProjectStore.ts","../src/store_lattice/InMemoryDatabaseConfigStore.ts","../src/store_lattice/InMemoryMetricsServerConfigStore.ts","../src/store_lattice/InMemoryUserStore.ts","../src/store_lattice/InMemoryTenantStore.ts","../src/store_lattice/InMemoryUserTenantLinkStore.ts","../src/store_lattice/StoreLatticeManager.ts","../src/tool_lattice/skill/load_skills.ts","../src/tool_lattice/skill/load_skill_content.ts","../src/tool_lattice/skill/load_skill_resource.ts","../src/deep_agent_new/middleware/fs.ts","../src/deep_agent_new/backends/utils.ts","../src/deep_agent_new/backends/state.ts","../src/middlewares/metricsMiddleware.ts","../src/agent_lattice/builders/commonMiddleware.ts","../src/deep_agent_new/agent.ts","../src/deep_agent_new/middleware/subagents.ts","../src/agent_worker/agent_worker_graph.ts","../src/constants/agent_task_types.ts","../src/services/event_bus.ts","../src/queue_lattice/QueueLatticeManager.ts","../src/queue_lattice/MemoryQueueClient.ts","../src/services/AgentManager.ts","../src/deep_agent_new/middleware/patch_tool_calls.ts","../src/deep_agent_new/backends/store.ts","../src/deep_agent_new/backends/filesystem.ts","../src/deep_agent_new/backends/composite.ts","../src/deep_agent_new/backends/memory.ts","../src/deep_agent_new/middleware/todos.ts","../src/agent_lattice/builders/filesystemBackend.ts","../src/agent_lattice/builders/DeepAgentGraphBuilder.ts","../src/agent_team/agent_team.ts","../src/agent_team/types.ts","../src/agent_team/stores/InMemoryTaskListStore.ts","../src/agent_team/stores/InMemoryMailboxStore.ts","../src/agent_team/middleware/team.ts","../src/agent_team/middleware/teammate_tools.ts","../src/agent_team/middleware/formatMessages.ts","../src/agent_team/builders/TeamAgentGraphBuilder.ts","../src/agent_lattice/builders/AgentGraphBuilderFactory.ts","../src/agent_lattice/builders/AgentParamsBuilder.ts","../src/agent_lattice/utils/mergeAgentConfig.ts","../src/agent_lattice/AgentLatticeManager.ts","../src/chunk_buffer_lattice/ChunkBuffer.ts","../src/chunk_buffer_lattice/types.ts","../src/chunk_buffer_lattice/InMemoryChunkBuffer.ts","../src/chunk_buffer_lattice/ChunkBufferLatticeManager.ts","../src/schedule_lattice/ScheduleLatticeManager.ts","../src/schedule_lattice/DefaultScheduleClient.ts","../src/schedule_lattice/MemoryScheduleStorage.ts","../src/schedule_lattice/CronParser.ts","../src/embeddings_lattice/EmbeddingsLatticeManager.ts","../src/vectorstore_lattice/VectorStoreLatticeManager.ts","../src/logger_lattice/LoggerLatticeManager.ts","../src/logger_lattice/PinoLoggerClient.ts","../src/logger_lattice/ConsoleLoggerClient.ts","../src/skill_lattice/SkillLatticeManager.ts","../src/mcp_lattice/McpLatticeManager.ts","../src/util/encryption.ts"],"sourcesContent":["// Export core modules\nexport * from \"./model_lattice\";\nexport * from \"./tool_lattice\";\n// Direct export of SQL tools to ensure they are bundled\nexport * from \"./tool_lattice/sql\";\n// Direct export of Metrics tools to ensure they are bundled\nexport * from \"./tool_lattice/metrics\";\nexport * from \"./agent_lattice\";\nexport * from \"./memory_lattice\";\nexport * from \"./chunk_buffer_lattice\";\nexport * from \"./queue_lattice\";\nexport * from \"./schedule_lattice\";\nexport * from \"./store_lattice\";\nexport * from \"./embeddings_lattice\";\nexport * from \"./vectorstore_lattice\";\nexport * from \"./logger_lattice\";\nexport * from \"./skill_lattice\";\nexport * from \"./mcp_lattice\";\nexport * from \"./sandbox_lattice\";\nexport * from \"./agent_team\";\nexport * from \"./deep_agent_new\";\n\n// Export service modules\nexport { eventBus, default as eventBusDefault } from \"./services/event_bus\";\nexport { AgentManager } from \"./services/AgentManager\";\n\n// Export constants\nexport * from \"./constants/agent_task_types\";\n\n// Re-export protocol interfaces - use named exports to avoid conflicts\nimport * as Protocols from \"@axiom-lattice/protocols\";\nexport { Protocols };\n\n// Export utilities\nexport * from \"./util/encryption\";\n","/**\n * BaseLatticeManager - 抽象基类,为各种Lattice管理器提供通用功能\n * 使用统一的Lattice注册表,不同类型的Lattice通过前缀区分\n * @template TItem - 管理的项目类型\n */\nexport abstract class BaseLatticeManager<TItem = any> {\n // 全局统一的Lattice注册表\n protected static registry: Map<string, any> = new Map();\n\n /**\n * 受保护的构造函数,防止外部直接实例化\n */\n protected constructor() {\n // 空实现\n }\n\n /**\n * 获取管理器实例(由子类实现)\n */\n public static getInstance(): BaseLatticeManager<any> {\n throw new Error(\"必须由子类实现\");\n }\n\n /**\n * 获取Lattice类型,用于构造键前缀\n * 子类必须重写此方法以提供唯一的类型标识符\n */\n protected abstract getLatticeType(): string;\n\n /**\n * 构造完整的键名,包含类型前缀\n * @param key 原始键名\n */\n protected getFullKey(key: string): string {\n return `${this.getLatticeType()}.${key}`;\n }\n\n /**\n * 注册项目\n * @param key 项目键名(不含前缀)\n * @param item 项目实例\n */\n public register(key: string, item: TItem): void {\n const fullKey = this.getFullKey(key);\n if (BaseLatticeManager.registry.has(fullKey)) {\n throw new Error(`项目 \"${fullKey}\" 已经存在,无法重复注册`);\n }\n\n BaseLatticeManager.registry.set(fullKey, item);\n }\n\n /**\n * 获取指定项目\n * @param key 项目键名(不含前缀)\n */\n public get(key: string): TItem | undefined {\n const fullKey = this.getFullKey(key);\n return BaseLatticeManager.registry.get(fullKey) as TItem | undefined;\n }\n\n /**\n * 获取所有当前类型的项目\n */\n public getAll(): TItem[] {\n const prefix = `${this.getLatticeType()}.`;\n const result: TItem[] = [];\n\n for (const [key, value] of BaseLatticeManager.registry.entries()) {\n if (key.startsWith(prefix)) {\n result.push(value as TItem);\n }\n }\n\n return result;\n }\n\n /**\n * 检查项目是否存在\n * @param key 项目键名(不含前缀)\n */\n public has(key: string): boolean {\n const fullKey = this.getFullKey(key);\n return BaseLatticeManager.registry.has(fullKey);\n }\n\n /**\n * 移除项目\n * @param key 项目键名(不含前缀)\n */\n public remove(key: string): boolean {\n const fullKey = this.getFullKey(key);\n return BaseLatticeManager.registry.delete(fullKey);\n }\n\n /**\n * 清空当前类型的所有项目\n */\n public clear(): void {\n const prefix = `${this.getLatticeType()}.`;\n const keysToDelete: string[] = [];\n\n for (const key of BaseLatticeManager.registry.keys()) {\n if (key.startsWith(prefix)) {\n keysToDelete.push(key);\n }\n }\n\n for (const key of keysToDelete) {\n BaseLatticeManager.registry.delete(key);\n }\n }\n\n /**\n * 获取当前类型的项目数量\n */\n public count(): number {\n const prefix = `${this.getLatticeType()}.`;\n let count = 0;\n\n for (const key of BaseLatticeManager.registry.keys()) {\n if (key.startsWith(prefix)) {\n count++;\n }\n }\n\n return count;\n }\n\n /**\n * 获取当前类型的项目键名列表(不含前缀)\n */\n public keys(): string[] {\n const prefix = `${this.getLatticeType()}.`;\n const prefixLength = prefix.length;\n const result: string[] = [];\n\n for (const key of BaseLatticeManager.registry.keys()) {\n if (key.startsWith(prefix)) {\n result.push(key.substring(prefixLength));\n }\n }\n\n return result;\n }\n}\n","import {\n AIMessage,\n BaseMessage,\n BaseMessageLike,\n HumanMessage,\n} from \"@langchain/core/messages\";\nimport { ChatDeepSeek } from \"@langchain/deepseek\";\nimport { AzureChatOpenAI, ChatOpenAI } from \"@langchain/openai\";\nimport { z } from \"zod\";\nimport { ZodType as ZodTypeV3 } from \"zod/v3\";\nimport { $ZodType as ZodTypeV4 } from \"zod/v4/core\";\nimport {\n BaseChatModel,\n BaseChatModelCallOptions,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n BaseLanguageModel,\n BaseLanguageModelInput,\n} from \"@langchain/core/language_models/base\";\nimport {\n CallbackManagerForLLMRun,\n Callbacks,\n} from \"@langchain/core/callbacks/manager\";\nimport { ChatResult } from \"@langchain/core/outputs\";\nBaseLanguageModel;\nimport { LLMConfig } from \"@axiom-lattice/protocols\";\n\n/**\n * ModelLattice类,继承自BaseChatModel\n * 简化版本,只保留通过LLMConfig创建LLM实例的功能\n */\nexport class ModelLattice extends BaseChatModel {\n private config: LLMConfig;\n private llm: BaseChatModel;\n\n lc_namespace: string[] = [\"langchain\", \"model_lattice\"];\n\n /**\n * 构造函数\n * @param config LLM配置\n */\n constructor(config: LLMConfig) {\n super({});\n this.config = config;\n this.llm = this.initChatModel(config);\n }\n\n /**\n * 返回模型类型\n */\n _llmType(): string {\n return \"model_lattice\";\n }\n\n /**\n * 返回模型类型\n */\n _modelType(): string {\n return this.llm._modelType();\n }\n\n /**\n * 实现BaseChatModel的_generate方法\n * @param messages 消息数组\n * @param options 调用选项\n * @param runManager 回调管理器\n * @returns 聊天结果\n */\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n return this.llm._generate(messages, options as any, runManager);\n }\n\n /**\n * 将工具绑定到模型\n * @param tools 工具列表\n * @param tool_choice 工具选择选项\n * @returns 绑定工具后的模型\n */\n bindTools(\n tools: any[],\n {\n tool_choice = \"auto\",\n ...kwargs\n }: {\n tool_choice?: \"auto\" | \"none\" | \"required\" | any;\n [key: string]: any;\n } = {}\n ): any {\n // 如果底层LLM实现了bindTools方法,则使用它的实现\n if (typeof this.llm.bindTools === \"function\") {\n return this.llm.bindTools(tools, {\n tool_choice,\n ...kwargs,\n });\n }\n\n // 如果底层LLM没有实现bindTools方法,抛出错误\n throw new Error(\"llm not support bindTools\");\n }\n\n /**\n * 使用结构化输出调用LLM\n * @param input 输入\n * @param schema 结构化输出的schema\n * @param options 调用选项\n * @returns 结构化输出\n */\n async invokeWithStructuredOutput<\n RunOutput extends Record<string, any> = Record<string, any>\n >(\n input: BaseLanguageModelInput,\n schema: ZodTypeV3<RunOutput> | ZodTypeV4<RunOutput> | Record<string, any>,\n options?: BaseChatModelCallOptions & {\n includeRaw?: boolean;\n name?: string;\n method?: \"functionCalling\" | \"jsonMode\";\n }\n ): Promise<RunOutput | { raw: BaseMessage; parsed: RunOutput }> {\n // 使用LLM的withStructuredOutput方法\n if (this.llm.withStructuredOutput) {\n // 使用类型断言解决类型兼容性问题\n const structuredLLM = this.llm.withStructuredOutput(schema, {\n includeRaw: options?.includeRaw ?? false,\n name: options?.name,\n method: options?.method,\n } as any);\n\n return structuredLLM.invoke(input, options);\n }\n\n // 如果LLM没有withStructuredOutput方法,抛出错误\n throw new Error(\"当前LLM不支持结构化输出\");\n }\n\n /**\n * 创建LLM实例\n * @param config LLM配置\n * @returns LLM实例\n */\n private initChatModel(config: LLMConfig): BaseChatModel {\n if (config.provider === \"azure\") {\n return new AzureChatOpenAI({\n azureOpenAIApiKey: config.apiKey || process.env.AZURE_OPENAI_API_KEY,\n azureOpenAIApiInstanceName: \"convertlab-westus\",\n azureOpenAIApiDeploymentName: config.model,\n azureOpenAIApiVersion: \"2024-02-01\",\n temperature: config.temperature || 0,\n maxTokens: config.maxTokens,\n timeout: config.timeout,\n maxRetries: config.maxRetries || 2,\n streaming: config.streaming,\n });\n } else if (config.provider === \"deepseek\") {\n return new ChatDeepSeek({\n model: config.model,\n temperature: config.temperature || 0,\n maxTokens: config.maxTokens,\n timeout: config.timeout,\n maxRetries: config.maxRetries || 2,\n apiKey:\n config.apiKey ||\n process.env[config.apiKeyEnvName || \"DEEPSEEK_API_KEY\"],\n streaming: config.streaming,\n });\n } else if (config.provider === \"siliconcloud\") {\n return new ChatOpenAI({\n model: config.model,\n temperature: config.temperature || 0,\n maxTokens: config.maxTokens,\n timeout: config.timeout,\n maxRetries: config.maxRetries || 2,\n apiKey:\n config.apiKey ||\n process.env[config.apiKeyEnvName || \"SILICONCLOUD_API_KEY\"],\n configuration: {\n baseURL: \"https://api.siliconflow.cn/v1\",\n },\n streaming: config.streaming,\n });\n } else if (config.provider === \"volcengine\") {\n return new ChatOpenAI({\n model: config.model,\n temperature: config.temperature || 0,\n maxTokens: config.maxTokens,\n timeout: config.timeout,\n maxRetries: config.maxRetries || 2,\n apiKey:\n config.apiKey ||\n process.env[config.apiKeyEnvName || \"VOLCENGINE_API_KEY\"],\n configuration: {\n baseURL: \"https://ark.cn-beijing.volces.com/api/v3\",\n },\n streaming: config.streaming,\n });\n } else {\n return new ChatOpenAI({\n model: config.model,\n temperature: config.temperature || 0,\n maxTokens: config.maxTokens,\n timeout: config.timeout,\n maxRetries: config.maxRetries || 2,\n streaming: config.streaming,\n apiKey:\n config.apiKey ||\n process.env[config.apiKeyEnvName || \"OPENAI_API_KEY\"],\n configuration: {\n baseURL: config.baseURL,\n },\n });\n }\n }\n}\n","import { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport { ModelLattice as LLMModelLattice } from \"./ModelLattice\";\nimport { LLMConfig } from \"@axiom-lattice/protocols\";\n\n// 模型配置接口,直接使用 LLMConfig\nexport type ModelConfig = LLMConfig;\n\n// 模型客户端类型,使用 LLMManager\ntype ModelClient = LLMModelLattice;\n\n// 定义接口\nexport interface ModelLatticeInterface {\n key: string;\n client: ModelClient;\n}\n\n/**\n * ModelLatticeManager - 单例模型Lattice管理器\n * 负责注册、管理各种语言模型Lattice\n */\nexport class ModelLatticeManager extends BaseLatticeManager<ModelLatticeInterface> {\n private static _instance: ModelLatticeManager;\n\n /**\n * 获取ModelLatticeManager单例实例\n */\n public static getInstance(): ModelLatticeManager {\n if (!ModelLatticeManager._instance) {\n ModelLatticeManager._instance = new ModelLatticeManager();\n }\n return ModelLatticeManager._instance;\n }\n\n /**\n * 获取Lattice类型前缀\n */\n protected getLatticeType(): string {\n return \"models\";\n }\n\n /**\n * 注册模型Lattice\n * @param key Lattice键名\n * @param config 模型配置\n */\n public registerLattice(key: string, config: ModelConfig): void {\n // 使用 LLMManager 创建客户端\n const client = new LLMModelLattice(config);\n\n // 创建模型Lattice对象\n const modelLattice: ModelLatticeInterface = {\n key,\n client,\n };\n\n // 调用基类的register方法\n this.register(key, modelLattice);\n }\n\n /**\n * 获取ModelLattice\n * @param key Lattice键名\n */\n public getModelLattice(key: string): ModelLatticeInterface {\n const modelLattice = this.get(key);\n if (!modelLattice) {\n throw new Error(`ModelLattice ${key} not found`);\n }\n return modelLattice;\n }\n\n /**\n * 获取所有Lattice\n */\n public getAllLattices(): ModelLatticeInterface[] {\n return this.getAll();\n }\n\n /**\n * 检查Lattice是否存在\n * @param key Lattice键名\n */\n public hasLattice(key: string): boolean {\n return this.has(key);\n }\n\n /**\n * 移除Lattice\n * @param key Lattice键名\n */\n public removeLattice(key: string): boolean {\n return this.remove(key);\n }\n\n /**\n * 清空所有Lattice\n */\n public clearLattices(): void {\n this.clear();\n }\n\n /**\n * 获取Lattice数量\n */\n public getLatticeCount(): number {\n return this.count();\n }\n\n /**\n * 获取Lattice键名列表\n */\n public getLatticeKeys(): string[] {\n return this.keys();\n }\n}\n\n// 导出单例实例\nexport const modelLatticeManager = ModelLatticeManager.getInstance();\n\n// 导出便捷方法\nexport const registerModelLattice = (key: string, config: ModelConfig) =>\n modelLatticeManager.registerLattice(key, config);\n\nexport const getModelLattice = (key: string) =>\n modelLatticeManager.getModelLattice(key);\n","import z from \"zod\";\nimport { registerToolLattice } from \"../ToolLatticeManager\";\n\nregisterToolLattice(\n \"get_current_date_time\",\n {\n name: \"get_current_date_time\",\n description: \"获取当前日期时间\",\n schema: z.object({}),\n },\n async () => {\n return \"当前日期时间:\" + new Date().toLocaleString();\n }\n);\n","import { StructuredTool, tool } from \"@langchain/core/tools\";\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport { ToolConfig, ToolExecutor } from \"@axiom-lattice/protocols\";\nimport { createToolApproveWrapper } from \"./createToolApproveWrapper\";\n\n// 工具定义接口 - 使用协议中的ToolConfig\nexport type ToolDefinition = ToolConfig;\n\n// Lattice 接口定义\nexport interface ToolLattice {\n key: string;\n config: ToolConfig;\n client: StructuredTool;\n}\n\n/**\n * ToolLatticeManager - 单例工具Lattice管理器\n * 负责注册、管理各种工具Lattice\n */\nexport class ToolLatticeManager extends BaseLatticeManager<ToolLattice> {\n private static _instance: ToolLatticeManager;\n\n /**\n * 获取ToolLatticeManager单例实例\n */\n public static getInstance(): ToolLatticeManager {\n if (!ToolLatticeManager._instance) {\n ToolLatticeManager._instance = new ToolLatticeManager();\n }\n return ToolLatticeManager._instance;\n }\n\n /**\n * 获取Lattice类型前缀\n */\n protected getLatticeType(): string {\n return \"tools\";\n }\n\n\n /**\n * 注册工具Lattice\n * @param key Lattice键名\n * @param config 工具配置(定义)\n * @param executor 工具执行函数\n */\n public registerLattice<TInput = any, TOutput = any>(\n key: string,\n config: ToolConfig,\n executor: ToolExecutor<TInput, TOutput>\n ): void {\n // 创建工具Lattice对象\n let toolExecutor;\n\n if (config.needUserApprove) {\n toolExecutor = createToolApproveWrapper<TInput, TOutput>(\n config,\n executor\n );\n } else {\n toolExecutor = async (input: TInput, exe_config: any) => {\n const result = await executor(input, exe_config);\n return result;\n };\n }\n\n const toolLattice: ToolLattice = {\n key,\n config,\n client: tool(toolExecutor as ToolExecutor, config),\n };\n\n // 调用基类的register方法\n this.register(key, toolLattice);\n }\n\n /**\n * 获取ToolLattice\n * @param key Lattice键名\n */\n public getToolLattice(key: string): ToolLattice | undefined {\n return this.get(key);\n }\n\n /**\n * 获取所有Lattice\n */\n public getAllLattices(): ToolLattice[] {\n return this.getAll();\n }\n\n /**\n * 检查Lattice是否存在\n * @param key Lattice键名\n */\n public hasLattice(key: string): boolean {\n return this.has(key);\n }\n\n /**\n * 移除Lattice\n * @param key Lattice键名\n */\n public removeLattice(key: string): boolean {\n return this.remove(key);\n }\n\n /**\n * 清空所有Lattice\n */\n public clearLattices(): void {\n this.clear();\n }\n\n /**\n * 获取Lattice数量\n */\n public getLatticeCount(): number {\n return this.count();\n }\n\n /**\n * 获取Lattice键名列表\n */\n public getLatticeKeys(): string[] {\n return this.keys();\n }\n\n /**\n * 获取工具定义\n * @param key Lattice键名\n */\n public getToolDefinition(key: string): ToolDefinition {\n const toolLattice = this.getToolLattice(key);\n if (!toolLattice) {\n throw new Error(`ToolLattice ${key} not found`);\n }\n return toolLattice.config;\n }\n\n /**\n * 获取工具客户端\n * @param key Lattice键名\n */\n public getToolClient(key: string): StructuredTool {\n const toolLattice = this.getToolLattice(key);\n if (!toolLattice) {\n throw new Error(`ToolLattice ${key} not found`);\n }\n return toolLattice.client;\n }\n\n /**\n * 获取所有工具定义\n */\n public getAllToolDefinitions(): ToolDefinition[] {\n return this.getAllLattices().map((lattice) => lattice.config);\n }\n\n /**\n * 注册已有的StructuredTool到Lattice\n * @param key Lattice键名\n * @param tool 已有的StructuredTool实例\n */\n public registerExistingTool(key: string, tool: StructuredTool): void {\n // 从工具中提取配置信息\n const config: ToolConfig = {\n name: tool.name,\n description: tool.description,\n schema: tool.schema as any, // StructuredTool的schema已经是Zod兼容的\n needUserApprove: false, // MCP工具默认不需要用户批准\n };\n\n const toolLattice: ToolLattice = {\n key,\n config,\n client: tool,\n };\n\n this.register(key, toolLattice);\n }\n\n /**\n * 验证工具输入参数\n * @param key Lattice键名\n * @param input 输入参数\n */\n public validateToolInput(key: string, input: any): boolean {\n const toolLattice = this.getToolLattice(key);\n if (!toolLattice) {\n return false;\n }\n\n try {\n if (toolLattice.config.schema) {\n toolLattice.config.schema.parse(input);\n }\n return true;\n } catch {\n return false;\n }\n }\n}\n\n// 导出单例实例\nexport const toolLatticeManager = ToolLatticeManager.getInstance();\n\n// 导出便捷方法\nexport const registerToolLattice = (\n key: string,\n config: ToolConfig,\n executor: ToolExecutor\n) => toolLatticeManager.registerLattice(key, config, executor);\n\nexport const registerExistingTool = (key: string, tool: StructuredTool) =>\n toolLatticeManager.registerExistingTool(key, tool);\n\nexport const getToolLattice = (key: string) =>\n toolLatticeManager.getToolLattice(key);\n\nexport const getToolDefinition = (key: string) =>\n toolLatticeManager.getToolDefinition(key);\n\nexport const getToolClient = (key: string) =>\n toolLatticeManager.getToolClient(key);\n\nexport const getAllToolDefinitions = () =>\n toolLatticeManager.getAllToolDefinitions();\n\nexport const validateToolInput = (key: string, input: any) =>\n toolLatticeManager.validateToolInput(key, input);\n","export const genUIMarkdown = (type: string, data: any) => {\n return [\"```\" + type, JSON.stringify(data), \"```\"].join(\"\\n\");\n};\n","import { AIMessage, isAIMessage } from \"@langchain/core/messages\";\nimport { ToolLatticeManager } from \"./ToolLatticeManager\";\nimport { ToolLattice } from \"./ToolLatticeManager\";\nimport { genUIMarkdown } from \"../util/genUIMarkdown\";\nimport { ToolCall } from \"@langchain/core/messages/tool\";\nimport { UserFeedbackResponse } from \"../types\";\nimport { END, interrupt } from \"@langchain/langgraph\";\nimport { ToolConfig, ToolExecutor } from \"@axiom-lattice/protocols\";\nexport function createToolApproveWrapper<TInput = any, TOutput = any>(\n tool_config: ToolConfig,\n toolExecutor: ToolExecutor<TInput, TOutput>\n) {\n return async (input: TInput, exe_config: any) => {\n const messagePrefix = \"Tool execution requires approval\";\n const description = `${messagePrefix}\\n\\nTool: ${tool_config.name}\\nArgs: ${JSON.stringify(input, null, 2)}`;\n\n const md = genUIMarkdown(\"confirm\", {\n message: description,\n tool_call: {\n tool_call_id: exe_config.id,\n tool_name: tool_config.name,\n tool_args: input,\n tool_config: tool_config,\n },\n });\n\n const feedback: UserFeedbackResponse = await interrupt(md);\n\n if (feedback.data.action === \"yes\") {\n return await toolExecutor(input, exe_config);\n } else {\n return {\n goto: END,\n };\n }\n };\n}\n","import z from \"zod\";\nimport { registerToolLattice } from \"../ToolLatticeManager\";\nimport { TavilySearch } from \"@langchain/tavily\";\nimport \"dotenv/config\";\nimport { LangGraphRunnableConfig } from \"@langchain/langgraph\";\nimport { genUICard } from \"@util/genUICard\";\n\ntype Topic = \"general\" | \"news\" | \"finance\";\n\nregisterToolLattice(\n \"internet_search\",\n {\n name: \"internet_search\",\n description: \"Run a web search\",\n needUserApprove: false,\n schema: z.object({\n query: z.string().describe(\"The search query\"),\n maxResults: z\n .number()\n .optional()\n .default(5)\n .describe(\"Maximum number of results to return\"),\n topic: z\n .enum([\"general\", \"news\", \"finance\"])\n .optional()\n .default(\"general\")\n .describe(\"Search topic category\"),\n includeRawContent: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Whether to include raw content\"),\n }),\n },\n async (\n {\n query,\n maxResults = 5,\n topic = \"general\" as Topic,\n includeRawContent = false,\n }: {\n query: string;\n maxResults?: number;\n topic?: Topic;\n includeRawContent?: boolean;\n },\n config: LangGraphRunnableConfig\n ) => {\n /**\n * Run a web search\n */\n // console.log(\"[DEBUG][internet_search] Starting search with params:\", {\n // query,\n // maxResults,\n // topic,\n // includeRawContent,\n // });\n\n // Note: You'll need to install and import tavily-js or similar package\n // console.log(\"[DEBUG][internet_search] Creating TavilySearch instance...\");\n const tavilySearch = new TavilySearch({\n maxResults,\n tavilyApiKey: process.env.TAVILY_API_KEY,\n includeRawContent,\n topic,\n });\n\n // console.log(\"[DEBUG][internet_search] Invoking search for query:\", query);\n const tavilyResponse = await tavilySearch.invoke({ query });\n // console.log(\n // \"[DEBUG][internet_search] Search completed. Results count:\",\n // tavilyResponse.results?.length ?? 0\n // );\n\n const result = genUICard(\"Internet Search:\" + query, \"generic_data_table\", {\n dataSource: tavilyResponse.results,\n });\n // console.log(\"[DEBUG][internet_search] Returning UI card result\");\n\n return JSON.stringify(tavilyResponse.results);\n }\n);\n","export const genUICard = (title: string, type: string, data: any) => {\n return [title, \"```\" + type, JSON.stringify(data), \"```\"].join(\"\\n\");\n};\n","/**\n * SQL Database Manager\n * Singleton manager for SQL database connections\n */\n\nimport {\n DatabaseConfig,\n DatabaseType,\n ISqlDatabase,\n TableInfo,\n TableSchema,\n ColumnInfo,\n QueryResult,\n} from \"./types\";\n\n/**\n * PostgreSQL Database Implementation\n * Uses pg library for PostgreSQL connections\n */\nexport class PostgresDatabase implements ISqlDatabase {\n private config: DatabaseConfig;\n private pool: any; // pg.Pool\n private connected: boolean = false;\n\n constructor(config: DatabaseConfig) {\n this.config = config;\n }\n\n async connect(): Promise<void> {\n if (this.connected && this.pool) return;\n\n try {\n // Dynamic import of pg to avoid bundling issues\n const { Pool } = await import(\"pg\");\n\n const poolConfig = this.config.connectionString\n ? { connectionString: this.config.connectionString }\n : {\n host: this.config.host || \"localhost\",\n port: this.config.port || 5432,\n database: this.config.database,\n user: this.config.user,\n password: this.config.password,\n ssl: this.config.ssl ? { rejectUnauthorized: false } : undefined,\n };\n\n this.pool = new Pool(poolConfig);\n \n // Test connection with timeout\n const client = await this.pool.connect();\n try {\n await client.query('SELECT 1');\n } finally {\n client.release();\n }\n this.connected = true;\n } catch (error) {\n this.connected = false;\n throw new Error(`Failed to connect to PostgreSQL: ${error}`);\n }\n }\n\n async disconnect(): Promise<void> {\n if (this.pool) {\n try {\n await this.pool.end();\n } catch (error) {\n console.warn('Warning: Error closing PostgreSQL pool:', error);\n } finally {\n this.pool = null;\n this.connected = false;\n }\n }\n }\n\n async listTables(): Promise<TableInfo[]> {\n await this.ensureConnected();\n\n const query = `\n SELECT table_name, table_schema\n FROM information_schema.tables\n WHERE table_schema NOT IN ('pg_catalog', 'information_schema')\n AND table_type = 'BASE TABLE'\n ORDER BY table_schema, table_name;\n `;\n\n const result = await this.pool.query(query);\n return result.rows.map((row: any) => ({\n name: row.table_name,\n schema: row.table_schema,\n }));\n }\n\n async getTableInfo(tables: string[]): Promise<TableSchema[]> {\n await this.ensureConnected();\n\n const schemas: TableSchema[] = [];\n\n for (const tableName of tables) {\n // Get column information\n const columnQuery = `\n SELECT \n c.column_name,\n c.data_type,\n c.is_nullable,\n c.column_default,\n CASE WHEN pk.column_name IS NOT NULL THEN true ELSE false END as is_primary_key,\n CASE WHEN fk.column_name IS NOT NULL THEN true ELSE false END as is_foreign_key,\n fk.foreign_table_name,\n fk.foreign_column_name\n FROM information_schema.columns c\n LEFT JOIN (\n SELECT ku.column_name, ku.table_name\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage ku\n ON tc.constraint_name = ku.constraint_name\n WHERE tc.constraint_type = 'PRIMARY KEY'\n ) pk ON c.column_name = pk.column_name AND c.table_name = pk.table_name\n LEFT JOIN (\n SELECT \n kcu.column_name,\n kcu.table_name,\n ccu.table_name as foreign_table_name,\n ccu.column_name as foreign_column_name\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n JOIN information_schema.constraint_column_usage ccu\n ON tc.constraint_name = ccu.constraint_name\n WHERE tc.constraint_type = 'FOREIGN KEY'\n ) fk ON c.column_name = fk.column_name AND c.table_name = fk.table_name\n WHERE c.table_name = $1\n ORDER BY c.ordinal_position;\n `;\n\n const columnResult = await this.pool.query(columnQuery, [tableName]);\n\n const columns: ColumnInfo[] = columnResult.rows.map((row: any) => ({\n name: row.column_name,\n type: row.data_type,\n nullable: row.is_nullable === \"YES\",\n default: row.column_default,\n isPrimaryKey: row.is_primary_key,\n isForeignKey: row.is_foreign_key,\n foreignKeyRef: row.is_foreign_key\n ? `${row.foreign_table_name}.${row.foreign_column_name}`\n : undefined,\n }));\n\n // Get sample rows (limit to 3)\n let sampleRows: Record<string, unknown>[] = [];\n try {\n const sampleQuery = `SELECT * FROM \"${tableName}\" LIMIT 3`;\n const sampleResult = await this.pool.query(sampleQuery);\n sampleRows = sampleResult.rows;\n } catch {\n // Ignore errors when getting sample rows\n }\n\n schemas.push({\n tableName,\n columns,\n sampleRows,\n });\n }\n\n return schemas;\n }\n\n async executeQuery(query: string): Promise<QueryResult> {\n await this.ensureConnected();\n\n const result = await this.pool.query(query);\n return {\n rows: result.rows,\n rowCount: result.rowCount || result.rows.length,\n fields: result.fields?.map((f: any) => f.name),\n };\n }\n\n getDatabaseType(): DatabaseType {\n return \"postgres\";\n }\n\n private async ensureConnected(): Promise<void> {\n if (!this.connected) {\n await this.connect();\n }\n }\n}\n\n/**\n * SQL Database Manager\n * Manages database connections and provides a unified interface\n */\nexport class SqlDatabaseManager {\n private static instance: SqlDatabaseManager;\n private databases: Map<string, ISqlDatabase> = new Map();\n private defaultDatabaseKey: string | null = null;\n\n private constructor() {}\n\n /**\n * Get the singleton instance\n */\n static getInstance(): SqlDatabaseManager {\n if (!SqlDatabaseManager.instance) {\n SqlDatabaseManager.instance = new SqlDatabaseManager();\n }\n return SqlDatabaseManager.instance;\n }\n\n /**\n * Register a database connection\n * @param key - Unique identifier for the database\n * @param config - Database configuration\n */\n registerDatabase(key: string, config: DatabaseConfig): void {\n let database: ISqlDatabase;\n\n switch (config.type) {\n case \"postgres\":\n database = new PostgresDatabase(config);\n break;\n case \"mysql\":\n throw new Error(\"MySQL support not yet implemented\");\n case \"sqlite\":\n throw new Error(\"SQLite support not yet implemented\");\n default:\n throw new Error(`Unsupported database type: ${config.type}`);\n }\n\n this.databases.set(key, database);\n\n // Set as default if it's the first database\n if (this.defaultDatabaseKey === null) {\n this.defaultDatabaseKey = key;\n }\n }\n\n /**\n * Set the default database\n * @param key - Database key to set as default\n */\n setDefaultDatabase(key: string): void {\n if (!this.databases.has(key)) {\n throw new Error(`Database '${key}' not found`);\n }\n this.defaultDatabaseKey = key;\n }\n\n /**\n * Get a database by key\n * @param key - Database key (optional, uses default if not provided)\n */\n getDatabase(key?: string): ISqlDatabase {\n const dbKey = key || this.defaultDatabaseKey;\n if (!dbKey) {\n throw new Error(\"No database registered\");\n }\n\n const database = this.databases.get(dbKey);\n if (!database) {\n throw new Error(`Database '${dbKey}' not found`);\n }\n\n return database;\n }\n\n /**\n * Check if a database is registered\n * @param key - Database key\n */\n hasDatabase(key: string): boolean {\n return this.databases.has(key);\n }\n\n /**\n * Get all registered database keys\n */\n getDatabaseKeys(): string[] {\n return Array.from(this.databases.keys());\n }\n\n /**\n * Remove a database connection\n * @param key - Database key\n */\n async removeDatabase(key: string): Promise<void> {\n const database = this.databases.get(key);\n if (database) {\n await database.disconnect();\n this.databases.delete(key);\n\n if (this.defaultDatabaseKey === key) {\n this.defaultDatabaseKey =\n this.databases.size > 0\n ? this.databases.keys().next().value || null\n : null;\n }\n }\n }\n\n /**\n * Disconnect all databases\n */\n async disconnectAll(): Promise<void> {\n for (const database of this.databases.values()) {\n await database.disconnect();\n }\n }\n\n /**\n * Load database configurations from a DatabaseConfigStore\n * and register them with this manager\n * \n * @param store - The database configuration store\n * @param tenantId - Tenant identifier\n */\n async loadConfigsFromStore(\n store: import(\"@axiom-lattice/protocols\").DatabaseConfigStore,\n tenantId: string\n ): Promise<void> {\n const configs = await store.getAllConfigs(tenantId);\n \n for (const entry of configs) {\n this.registerDatabase(entry.key, entry.config);\n }\n }\n\n /**\n * Load all database configurations from a DatabaseConfigStore\n * across all tenants and register them with this manager\n * \n * @param store - The database configuration store\n */\n async loadAllConfigsFromStore(\n store: import(\"@axiom-lattice/protocols\").DatabaseConfigStore\n ): Promise<void> {\n const configs = await store.getAllConfigsWithoutTenant();\n \n for (const entry of configs) {\n this.registerDatabase(entry.key, entry.config);\n }\n }\n}\n\nexport function parseConnectionString(connectionString: string): Omit<DatabaseConfig, \"type\"> {\n const url = new URL(connectionString);\n const protocol = url.protocol.replace(\":\", \"\");\n\n if (protocol !== \"postgres\" && protocol !== \"postgresql\") {\n throw new Error(`Unsupported protocol: ${protocol}. Only postgresql:// is supported.`);\n }\n\n return {\n host: url.hostname || \"localhost\",\n port: parseInt(url.port || \"5432\"),\n database: url.pathname.slice(1) || url.pathname,\n user: url.username,\n password: url.password,\n ssl: url.searchParams.get(\"sslmode\") === \"require\",\n };\n}\n\nexport function parseMysqlConnectionString(connectionString: string): Omit<DatabaseConfig, \"type\"> {\n const url = new URL(connectionString);\n const protocol = url.protocol.replace(\":\", \"\");\n\n if (protocol !== \"mysql\") {\n throw new Error(`Unsupported protocol: ${protocol}. Only mysql:// is supported.`);\n }\n\n return {\n host: url.hostname || \"localhost\",\n port: parseInt(url.port || \"3306\"),\n database: url.pathname.slice(1) || url.pathname,\n user: url.username,\n password: url.password,\n ssl: url.searchParams.get(\"sslmode\") === \"require\",\n };\n}\n\nexport function parseSqliteConnectionString(connectionString: string): Omit<DatabaseConfig, \"type\"> {\n if (connectionString.startsWith(\"sqlite:\")) {\n const path = connectionString.replace(\"sqlite:\", \"\");\n return { database: path };\n }\n return { database: connectionString };\n}\n\n// Export singleton instance\nexport const sqlDatabaseManager = SqlDatabaseManager.getInstance();\n","/**\n * List Tables SQL Tool\n * Tool for listing all tables in the connected database\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { sqlDatabaseManager } from \"./SqlDatabaseManager\";\n\nconst LIST_TABLES_SQL_DESCRIPTION = `List all tables in the connected SQL database. Returns a comma-separated list of table names. Use this tool first to understand what tables are available before querying the database.`;\n\nexport interface CreateSqlToolParams {\n databaseKeys: string[];\n databaseDescriptions?: Record<string, string>;\n}\n\nexport const createListTablesSqlTool = ({ databaseKeys, databaseDescriptions }: CreateSqlToolParams) => {\n const availableDbsText = databaseKeys.length > 0\n ? `\\n\\nAvailable databases:\\n${databaseKeys.map(key => \n `- ${key}${databaseDescriptions?.[key] ? `: ${databaseDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async ({ databaseKey }: { databaseKey: string }, exe_config: any) => {\n try {\n if (!databaseKey) {\n return \"Error: databaseKey parameter is required. Available databases: \" + databaseKeys.join(', ');\n }\n\n if (!databaseKeys.includes(databaseKey)) {\n return `Error: databaseKey \"${databaseKey}\" is not in the allowed list: [${databaseKeys.join(', ')}]`;\n }\n\n const database = sqlDatabaseManager.getDatabase(databaseKey);\n const tables = await database.listTables();\n\n if (tables.length === 0) {\n return \"No tables found in the database.\";\n }\n\n const tableNames = tables.map((t) =>\n t.schema && t.schema !== \"public\" ? `${t.schema}.${t.name}` : t.name\n );\n\n return tableNames.join(\", \");\n } catch (error) {\n return `Error listing tables: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"list_tables_sql\",\n description: `${LIST_TABLES_SQL_DESCRIPTION}${availableDbsText}`,\n schema: z.object({\n databaseKey: z\n .string()\n .describe(`Target database to list tables. Choose from: ${databaseKeys.join(', ')}`),\n }),\n }\n );\n};\n","/**\n * Info SQL Tool\n * Tool for getting schema information about specified tables\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { sqlDatabaseManager } from \"./SqlDatabaseManager\";\nimport { TableSchema } from \"./types\";\n\nconst INFO_SQL_DESCRIPTION = `Get detailed schema information for specified tables, including column names, types, constraints (primary keys, foreign keys), and sample rows. Input should be a comma-separated list of table names.`;\n\nexport interface CreateSqlToolParams {\n databaseKeys: string[];\n databaseDescriptions?: Record<string, string>;\n}\n\nexport const createInfoSqlTool = ({ databaseKeys, databaseDescriptions }: CreateSqlToolParams) => {\n const availableDbsText = databaseKeys.length > 0\n ? `\\n\\nAvailable databases:\\n${databaseKeys.map(key => \n `- ${key}${databaseDescriptions?.[key] ? `: ${databaseDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async (\n {\n tables,\n databaseKey,\n }: {\n tables: string;\n databaseKey: string;\n },\n exe_config: any\n ) => {\n try {\n if (!databaseKey) {\n return \"Error: databaseKey parameter is required. Available databases: \" + databaseKeys.join(', ');\n }\n\n if (!databaseKeys.includes(databaseKey)) {\n return `Error: databaseKey \"${databaseKey}\" is not in the allowed list: [${databaseKeys.join(', ')}]`;\n }\n\n const database = sqlDatabaseManager.getDatabase(databaseKey);\n\n const tableNames = tables\n .split(\",\")\n .map((t) => t.trim())\n .filter((t) => t.length > 0);\n\n if (tableNames.length === 0) {\n return \"Error: No table names provided. Please provide a comma-separated list of table names.\";\n }\n\n const schemas = await database.getTableInfo(tableNames);\n\n if (schemas.length === 0) {\n return `No schema information found for tables: ${tableNames.join(\", \")}`;\n }\n\n const output = schemas.map(formatTableSchema).join(\"\\n\");\n return output;\n } catch (error) {\n return `Error getting table info: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"info_sql\",\n description: `${INFO_SQL_DESCRIPTION}${availableDbsText}`,\n schema: z.object({\n tables: z\n .string()\n .describe(\n \"Comma-separated list of table names to get information for. Example: 'users, orders, products'\"\n ),\n databaseKey: z\n .string()\n .describe(`Target database to get table info. Choose from: ${databaseKeys.join(', ')}`),\n }),\n }\n );\n};\n\nfunction formatTableSchema(schema: TableSchema): string {\n const lines: string[] = [];\n\n lines.push(`\\nTable: ${schema.tableName}`);\n lines.push(\"-\".repeat(40));\n lines.push(\"Columns:\");\n\n for (const col of schema.columns) {\n const constraints: string[] = [];\n if (col.isPrimaryKey) constraints.push(\"PRIMARY KEY\");\n if (col.isForeignKey && col.foreignKeyRef)\n constraints.push(`FK -> ${col.foreignKeyRef}`);\n if (!col.nullable) constraints.push(\"NOT NULL\");\n\n const constraintStr =\n constraints.length > 0 ? ` [${constraints.join(\", \")}]` : \"\";\n lines.push(` - ${col.name}: ${col.type}${constraintStr}`);\n }\n\n if (schema.sampleRows && schema.sampleRows.length > 0) {\n lines.push(\"\\nSample Rows (up to 3):\");\n for (const row of schema.sampleRows) {\n const rowStr = Object.entries(row)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join(\", \");\n lines.push(` ${rowStr}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * Query Checker SQL Tool\n * Tool for validating SQL queries before execution\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { sqlDatabaseManager } from \"./SqlDatabaseManager\";\n\nconst DANGEROUS_KEYWORDS = [\n \"DROP\",\n \"TRUNCATE\",\n \"DELETE\",\n \"ALTER\",\n \"CREATE\",\n \"GRANT\",\n \"REVOKE\",\n];\n\nexport interface CreateSqlToolParams {\n databaseKeys: string[];\n databaseDescriptions?: Record<string, string>;\n}\n\nfunction checkSyntax(query: string): string[] {\n const issues: string[] = [];\n const upperQuery = query.toUpperCase();\n\n let parenCount = 0;\n for (const char of query) {\n if (char === \"(\") parenCount++;\n if (char === \")\") parenCount--;\n if (parenCount < 0) {\n issues.push(\"Unbalanced parentheses: found closing ) without matching (\");\n break;\n }\n }\n if (parenCount > 0) {\n issues.push(\"Unbalanced parentheses: missing closing )\");\n }\n\n const singleQuotes = (query.match(/'/g) || []).length;\n if (singleQuotes % 2 !== 0) {\n issues.push(\"Unbalanced single quotes\");\n }\n\n if (upperQuery.includes(\"SELECT *\") && upperQuery.includes(\"JOIN\")) {\n issues.push(\n \"Warning: SELECT * with JOIN may return duplicate column names. Consider specifying columns explicitly.\"\n );\n }\n\n if (\n (upperQuery.includes(\"UPDATE \") || upperQuery.includes(\"DELETE FROM \")) &&\n !upperQuery.includes(\"WHERE \")\n ) {\n issues.push(\n \"Warning: UPDATE or DELETE without WHERE clause will affect all rows in the table.\"\n );\n }\n\n if (\n upperQuery.includes(\"GROUP BY\") &&\n !upperQuery.match(/\\b(COUNT|SUM|AVG|MAX|MIN|ARRAY_AGG|STRING_AGG)\\s*\\(/i)\n ) {\n issues.push(\n \"Warning: GROUP BY used but no aggregate functions found. Make sure all non-aggregated columns are in GROUP BY.\"\n );\n }\n\n return issues;\n}\n\nfunction checkDangerousOperations(query: string): string[] {\n const warnings: string[] = [];\n const upperQuery = query.toUpperCase();\n\n for (const keyword of DANGEROUS_KEYWORDS) {\n if (upperQuery.includes(keyword)) {\n warnings.push(\n `Warning: Query contains potentially dangerous operation: ${keyword}`\n );\n }\n }\n\n return warnings;\n}\n\nexport const createQueryCheckerSqlTool = ({ databaseKeys, databaseDescriptions }: CreateSqlToolParams) => {\n const availableDbsText = databaseKeys.length > 0\n ? `\\n\\nAvailable databases:\\n${databaseKeys.map(key => \n `- ${key}${databaseDescriptions?.[key] ? `: ${databaseDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async (\n {\n query,\n databaseKey,\n }: {\n query: string;\n databaseKey: string;\n },\n exe_config: any\n ) => {\n try {\n const trimmedQuery = query.trim();\n\n if (!trimmedQuery) {\n return \"Error: Empty query provided. Please provide a SQL query to check.\";\n }\n\n const results: string[] = [];\n results.push(\"SQL Query Check Results:\");\n results.push(\"=\".repeat(40));\n results.push(`\\nQuery:\\n${trimmedQuery}\\n`);\n\n const syntaxIssues = checkSyntax(trimmedQuery);\n if (syntaxIssues.length > 0) {\n results.push(\"Syntax Issues:\");\n for (const issue of syntaxIssues) {\n results.push(` - ${issue}`);\n }\n } else {\n results.push(\"Syntax: No obvious syntax issues found\");\n }\n\n const dangerWarnings = checkDangerousOperations(trimmedQuery);\n if (dangerWarnings.length > 0) {\n results.push(\"\\nSafety Warnings:\");\n for (const warning of dangerWarnings) {\n results.push(` - ${warning}`);\n }\n } else {\n results.push(\"Safety: No dangerous operations detected\");\n }\n\n if (databaseKey && databaseKeys.includes(databaseKey)) {\n try {\n const database = sqlDatabaseManager.getDatabase(databaseKey);\n const dbType = database.getDatabaseType();\n\n if (dbType === \"postgres\") {\n try {\n await database.executeQuery(`EXPLAIN ${trimmedQuery}`);\n results.push(\"Database Validation: Query is valid against database schema\");\n } catch (explainError) {\n results.push(\n `Database Validation: ${explainError instanceof Error ? explainError.message : String(explainError)}`\n );\n }\n }\n } catch {\n results.push(\n \"Database Validation: Skipped (database connection unavailable)\"\n );\n }\n } else {\n results.push(\n \"Database Validation: Skipped (no valid databaseKey provided)\"\n );\n }\n\n const hasErrors =\n syntaxIssues.some((i) => !i.startsWith(\"Warning:\")) ||\n dangerWarnings.length > 0;\n\n results.push(\"\\n\" + \"=\".repeat(40));\n if (hasErrors) {\n results.push(\n \"Overall: Query has potential issues. Review warnings before execution.\"\n );\n } else {\n results.push(\"Overall: Query appears to be safe to execute.\");\n }\n\n return results.join(\"\\n\");\n } catch (error) {\n return `Error checking query: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"query_checker_sql\",\n description: `Check a SQL query for common issues before execution. This tool validates syntax, checks for dangerous operations, and provides suggestions for improvement. Use this before executing queries to ensure they are safe and correct.${availableDbsText}`,\n schema: z.object({\n query: z.string().describe(\"The SQL query to check and validate.\"),\n databaseKey: z\n .string()\n .describe(`Target database to validate query against. Choose from: ${databaseKeys.join(', ')}`),\n }),\n }\n );\n};\n","/**\n * Query SQL Tool\n * Tool for executing SQL queries against the database\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { sqlDatabaseManager } from \"./SqlDatabaseManager\";\n\nconst QUERY_SQL_DESCRIPTION = `Execute a SQL query against the database and return the results. Input should be a valid SQL query. Use this tool to retrieve data from the database. For complex queries, first use list_tables_sql and info_sql to understand the database schema.`;\n\nexport interface CreateSqlToolParams {\n databaseKeys: string[];\n databaseDescriptions?: Record<string, string>;\n}\n\nfunction formatQueryResult(\n rows: Record<string, unknown>[],\n fields?: string[]\n): string {\n if (rows.length === 0) {\n return \"Query executed successfully. No rows returned.\";\n }\n\n const lines: string[] = [];\n\n const columns = fields || Object.keys(rows[0]);\n\n lines.push(columns.join(\" | \"));\n lines.push(\"-\".repeat(columns.join(\" | \").length));\n\n const maxRows = 50;\n const displayRows = rows.slice(0, maxRows);\n\n for (const row of displayRows) {\n const values = columns.map((col) => {\n const val = row[col];\n if (val === null) return \"NULL\";\n if (typeof val === \"object\") return JSON.stringify(val);\n return String(val);\n });\n lines.push(values.join(\" | \"));\n }\n\n if (rows.length > maxRows) {\n lines.push(`\\n... (${rows.length - maxRows} more rows not shown)`);\n }\n\n lines.push(`\\nTotal rows: ${rows.length}`);\n\n return lines.join(\"\\n\");\n}\n\nexport const createQuerySqlTool = ({ databaseKeys, databaseDescriptions }: CreateSqlToolParams) => {\n const availableDbsText = databaseKeys.length > 0\n ? `\\n\\nAvailable databases:\\n${databaseKeys.map(key => \n `- ${key}${databaseDescriptions?.[key] ? `: ${databaseDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async (\n {\n query,\n databaseKey,\n }: {\n query: string;\n databaseKey: string;\n },\n exe_config: any\n ) => {\n try {\n if (!databaseKey) {\n return \"Error: databaseKey parameter is required. Available databases: \" + databaseKeys.join(', ');\n }\n\n if (!databaseKeys.includes(databaseKey)) {\n return `Error: databaseKey \"${databaseKey}\" is not in the allowed list: [${databaseKeys.join(', ')}]`;\n }\n\n const trimmedQuery = query.trim();\n if (!trimmedQuery) {\n return \"Error: Empty query provided. Please provide a valid SQL query.\";\n }\n\n const database = sqlDatabaseManager.getDatabase(databaseKey);\n const result = await database.executeQuery(trimmedQuery);\n\n return formatQueryResult(result.rows, result.fields);\n } catch (error) {\n return `Error executing query: ${\n error instanceof Error ? error.message : String(error)\n }`;\n }\n },\n {\n name: \"query_sql\",\n description: `Execute a SQL query against the database and return the results.${availableDbsText}`,\n schema: z.object({\n query: z\n .string()\n .describe(\n \"The SQL query to execute. Should be a valid SELECT, INSERT, UPDATE, or DELETE statement.\"\n ),\n databaseKey: z\n .string()\n .describe(`Target database to execute the query. Choose from: ${databaseKeys.join(', ')}`),\n }),\n }\n );\n};\n","/**\n * SemanticMetricsClient\n * Client implementation for Semantic Metrics Server\n * Provides datasource-aware metrics querying capabilities\n */\n\nimport {\n MetricsServerConfig,\n MetricMeta,\n MetricQueryResult,\n MetricDataPoint,\n DataSource,\n SemanticMetricsServerConfig,\n SemanticMetricsQueryRequest,\n SemanticMetricsQueryResponse,\n SemanticMetricsFilter,\n ExecuteSqlQueryRequest,\n ExecuteSqlQueryResponse,\n} from \"@axiom-lattice/protocols\";\nimport { IMetricsServerClient } from \"./MetricsServerManager\";\n\n/**\n * Semantic Metrics API Response wrapper\n */\ninterface SemanticApiResponse<T> {\n code: number;\n message: string;\n data: T;\n}\n\n/**\n * Metric meta item from datasource meta endpoint\n */\ninterface MetricMetaItem {\n metricName: string;\n displayName: string;\n domain: string;\n shortDesc: string;\n searchKeywords: string[];\n registered: boolean;\n}\n\n/**\n * Table meta item from datasource meta endpoint\n */\ninterface TableMetaItem {\n tableName: string;\n displayName: string;\n docType: string;\n docTypeEn: string;\n mainTable?: string;\n lineTable?: string;\n columnCount: number;\n shortDesc: string;\n}\n\n/**\n * Index data from datasource meta endpoint\n */\ninterface MetricMetaIndex {\n datasourceId: number;\n datasourceName: string;\n catalogVersion: string;\n domainCategories: string[];\n metrics: MetricMetaItem[];\n tables: TableMetaItem[];\n}\n\n/**\n * Table column definition\n */\ninterface TableColumnDetail {\n name: string;\n label: string;\n description?: string;\n type?: string;\n example?: string;\n}\n\n/**\n * Table detail from datasource meta endpoint\n */\ninterface TableMetaDetail {\n tableName: string;\n docType: string;\n docTypeEn: string;\n objTypeCode?: number;\n mainTable?: string;\n lineTable?: string;\n selectSql: string;\n columns: (TableColumnDetail | null)[];\n}\n\n/**\n * Datasource meta response data structure\n */\ninterface DatasourceMetaData {\n index: MetricMetaIndex;\n metricsDetails: MetricMetaDetail[];\n tablesDetails?: TableMetaDetail[];\n}\n\n/**\n * Metric meta detail item from datasource meta endpoint\n */\ninterface MetricMetaDetail {\n datasourceId: number;\n metricName: string;\n displayName: string;\n domain: string;\n description: string;\n dataType: string;\n format: string;\n defaultTimeContext: {\n timeDimension: string;\n label: string;\n granularity: string;\n window: string;\n supportedGrains: string[];\n };\n supportedDimensions: Array<{\n dim_id: string;\n field_name: string;\n type: string;\n filter_operators?: string[];\n filter_example?: object;\n group_by_example?: string;\n }>;\n aiAgentContext: {\n polarity: string;\n synonyms: string[];\n thresholds: Array<{\n metric: string;\n operator: string;\n value: number;\n level: string;\n }>;\n diagnosticWorkflow: {\n trigger: {\n any_of: Array<{\n metric: string;\n operator: string;\n value: number;\n }>;\n };\n actions: Array<{\n type: string;\n metric?: string;\n dimensions?: string[];\n intent: string;\n }>;\n analysis_logic: string;\n };\n humanReadableExplanation: string;\n };\n}\n\n/**\n * Semantic Metrics Client Implementation\n * Uses Semantic Metrics HTTP API for queries\n */\nexport class SemanticMetricsClient implements IMetricsServerClient {\n private config: SemanticMetricsServerConfig;\n private baseUrl: string;\n\n constructor(config: SemanticMetricsServerConfig) {\n this.config = config;\n // Normalize URL: remove trailing slash to avoid double slashes\n this.baseUrl = config.serverUrl.replace(/\\/$/, '');\n }\n\n /**\n * Test connection to the semantic metrics server\n * Attempts to fetch data sources as a connectivity test\n */\n async testConnection(): Promise<{ connected: boolean; latency?: number; error?: string }> {\n const startTime = Date.now();\n try {\n const response = await fetch(`${this.baseUrl}/datasources`, {\n method: \"GET\",\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = (await response.json()) as SemanticApiResponse<DataSource[]>;\n\n if (data.code !== 200) {\n throw new Error(`API error: ${data.message}`);\n }\n\n const latency = Date.now() - startTime;\n return { connected: true, latency };\n } catch (error) {\n return {\n connected: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Get list of available metrics from all selected data sources\n * Aggregates metrics across selected datasources\n */\n async listMetrics(): Promise<MetricMeta[]> {\n const selectedIds = this.config.selectedDataSources || [];\n \n if (selectedIds.length === 0) {\n return [];\n }\n\n const allMetrics: MetricMeta[] = [];\n const seenMetrics = new Set<string>();\n\n for (const datasourceId of selectedIds) {\n try {\n const metaData = await this.getDatasourceMetrics(datasourceId);\n for (const item of metaData.index.metrics) {\n if (!seenMetrics.has(item.metricName)) {\n seenMetrics.add(item.metricName);\n // Find detail for additional info\n const detail = metaData.metricsDetails.find((d: { metricName: string }) => d.metricName === item.metricName);\n allMetrics.push({\n name: item.metricName,\n type: detail?.dataType || 'number',\n description: item.shortDesc || detail?.description,\n labels: [],\n unit: undefined,\n });\n }\n }\n } catch (error) {\n console.warn(`Failed to get metrics for datasource ${datasourceId}:`, error);\n }\n }\n\n return allMetrics;\n }\n\n /**\n * Get metadata for a specific metric\n * Searches across selected datasources for the metric\n */\n async getMetricMeta(metricName: string): Promise<MetricMeta | null> {\n const selectedIds = this.config.selectedDataSources || [];\n \n for (const datasourceId of selectedIds) {\n try {\n const metaData = await this.getDatasourceMetrics(datasourceId);\n const item = metaData.index.metrics.find(m => m.metricName === metricName);\n if (item) {\n const detail = metaData.metricsDetails.find((d: { metricName: string }) => d.metricName === metricName);\n return {\n name: item.metricName,\n type: detail?.dataType || 'number',\n description: item.shortDesc || detail?.description,\n labels: [],\n unit: undefined,\n };\n }\n } catch (error) {\n console.warn(`Failed to get metric meta from datasource ${datasourceId}:`, error);\n }\n }\n\n return null;\n }\n\n /**\n * Query metric data - delegates to semanticQuery\n * Note: For semantic server, use semanticQuery() directly for full functionality\n */\n async queryMetricData(\n metricName: string,\n options: {\n startTime?: number;\n endTime?: number;\n step?: number;\n labels?: Record<string, string>;\n }\n ): Promise<MetricQueryResult> {\n const selectedIds = this.config.selectedDataSources || [];\n \n if (selectedIds.length === 0) {\n throw new Error(\"No data sources selected for this semantic metrics server\");\n }\n\n const datasourceId = selectedIds[0];\n\n const filters: SemanticMetricsFilter[] = [];\n if (options.startTime && options.endTime) {\n filters.push({\n dimension: \"timestamp\",\n operator: \"BETWEEN\",\n values: [\n new Date(options.startTime * 1000).toISOString(),\n new Date(options.endTime * 1000).toISOString(),\n ],\n });\n }\n\n if (options.labels) {\n for (const [key, value] of Object.entries(options.labels)) {\n filters.push({\n dimension: key,\n operator: \"=\",\n values: [value],\n });\n }\n }\n\n const request: SemanticMetricsQueryRequest = {\n datasourceId,\n metrics: [metricName],\n filters,\n limit: 1000,\n };\n\n const result = await this.semanticQuery(request);\n\n // Find the metric result for the requested metric\n const metricResult = result.results.find(r => r.metricName === metricName);\n \n const dataPoints: MetricDataPoint[] = metricResult?.rows.map((row, index) => ({\n timestamp: index * 1000, // Use index as timestamp if not provided\n value: typeof row.value === 'number' ? row.value : 0,\n labels: Object.fromEntries(\n Object.entries(row).map(([k, v]) => [k, String(v)])\n ),\n })) || [];\n\n return {\n metricName,\n dataPoints,\n metadata: {\n startTime: options.startTime ? options.startTime * 1000 : undefined,\n endTime: options.endTime ? options.endTime * 1000 : undefined,\n },\n };\n }\n\n /**\n * Get the server type\n */\n getServerType(): \"semantic\" {\n return \"semantic\";\n }\n\n /**\n * Get all available data sources from the semantic server\n * GET /datasources\n */\n async getDataSources(): Promise<DataSource[]> {\n const response = await fetch(`${this.baseUrl}/datasources`, {\n method: \"GET\",\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = (await response.json()) as SemanticApiResponse<DataSource[]>;\n\n if (data.code !== 200) {\n throw new Error(`API error: ${data.message}`);\n }\n\n return data.data || [];\n }\n\n /**\n * Get metrics meta for a specific data source\n * GET /datasources/{id}/meta\n */\n async getDatasourceMetrics(datasourceId: string): Promise<DatasourceMetaData> {\n const response = await fetch(\n `${this.baseUrl}/datasources/${encodeURIComponent(datasourceId)}/meta`,\n {\n method: \"GET\",\n headers: this.getHeaders(),\n }\n );\n\n if (!response.ok) {\n if (response.status === 404) {\n return { index: { datasourceId: 0, datasourceName: '', catalogVersion: '', domainCategories: [], metrics: [], tables: [] }, metricsDetails: [] };\n }\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = (await response.json()) as SemanticApiResponse<DatasourceMetaData>;\n\n if (data.code !== 200) {\n throw new Error(`API error: ${data.message}`);\n }\n\n // Return raw data directly\n return data.data;\n }\n\n /**\n * Execute a semantic metrics query\n * POST /metrics/query\n */\n async semanticQuery(request: SemanticMetricsQueryRequest): Promise<SemanticMetricsQueryResponse> {\n const response = await fetch(`${this.baseUrl}/metrics/query`, {\n method: \"POST\",\n headers: {\n ...this.getHeaders(),\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = (await response.json()) as SemanticApiResponse<SemanticMetricsQueryResponse>;\n\n if (data.code !== 200) {\n throw new Error(`API error: ${data.message}`);\n }\n\n return data.data;\n }\n\n /**\n * Execute a custom SQL query\n * POST /metrics/query\n */\n async executeSqlQuery(request: ExecuteSqlQueryRequest): Promise<ExecuteSqlQueryResponse> {\n const response = await fetch(`${this.baseUrl}/metrics/query`, {\n method: \"POST\",\n headers: {\n ...this.getHeaders(),\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = (await response.json()) as SemanticApiResponse<ExecuteSqlQueryResponse>;\n\n if (data.code !== 200) {\n throw new Error(`API error: ${data.message}`);\n }\n\n return data.data;\n }\n\n /**\n * Get selected data sources for this configuration\n */\n getSelectedDataSources(): string[] {\n return this.config.selectedDataSources || [];\n }\n\n /**\n * Build request headers with authentication\n */\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n ...this.config.headers,\n };\n\n if (this.config.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.config.apiKey}`;\n } else if (this.config.username && this.config.password) {\n const auth = Buffer.from(`${this.config.username}:${this.config.password}`).toString(\"base64\");\n headers[\"Authorization\"] = `Basic ${auth}`;\n }\n\n return headers;\n }\n}\n","/**\n * MetricsServerManager\n * Singleton manager for Metrics Server connections\n */\n\nimport {\n MetricsServerConfig,\n MetricsServerType,\n MetricMeta,\n MetricQueryResult,\n MetricDataPoint,\n SemanticMetricsServerConfig,\n} from \"@axiom-lattice/protocols\";\nimport { SemanticMetricsClient } from \"./SemanticMetricsClient\";\n\n/**\n * Metrics Server Client Interface\n * Defines the contract for metrics server implementations\n */\nexport interface IMetricsServerClient {\n /**\n * Test connection to the metrics server\n */\n testConnection(): Promise<{ connected: boolean; latency?: number; error?: string }>;\n\n /**\n * Get list of available metrics\n */\n listMetrics(): Promise<MetricMeta[]>;\n\n /**\n * Get metadata for a specific metric\n * @param metricName - Name of the metric\n */\n getMetricMeta(metricName: string): Promise<MetricMeta | null>;\n\n /**\n * Query metric data\n * @param metricName - Name of the metric\n * @param options - Query options\n */\n queryMetricData(\n metricName: string,\n options: {\n startTime?: number;\n endTime?: number;\n step?: number;\n labels?: Record<string, string>;\n }\n ): Promise<MetricQueryResult>;\n\n /**\n * Get the server type\n */\n getServerType(): MetricsServerType;\n}\n\n/**\n * Prometheus Client Implementation\n * Uses Prometheus HTTP API for queries\n */\nexport class PrometheusClient implements IMetricsServerClient {\n private config: MetricsServerConfig;\n\n constructor(config: MetricsServerConfig) {\n this.config = config;\n }\n\n async testConnection(): Promise<{ connected: boolean; latency?: number; error?: string }> {\n const startTime = Date.now();\n try {\n const response = await fetch(`${this.config.serverUrl}/api/v1/status/buildinfo`, {\n method: \"GET\",\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const latency = Date.now() - startTime;\n return { connected: true, latency };\n } catch (error) {\n return {\n connected: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n async listMetrics(): Promise<MetricMeta[]> {\n try {\n const response = await fetch(`${this.config.serverUrl}/api/v1/label/__name__/values`, {\n method: \"GET\",\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = await response.json() as { status: string; error?: string; data?: string[] };\n\n if (data.status !== \"success\") {\n throw new Error(`Prometheus error: ${data.error || \"Unknown error\"}`);\n }\n\n // Get metadata for each metric\n const metrics: MetricMeta[] = [];\n for (const name of data.data || []) {\n const meta = await this.getMetricMeta(name);\n if (meta) {\n metrics.push(meta);\n } else {\n metrics.push({ name });\n }\n }\n\n return metrics;\n } catch (error) {\n throw new Error(`Failed to list metrics: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n async getMetricMeta(metricName: string): Promise<MetricMeta | null> {\n try {\n const response = await fetch(\n `${this.config.serverUrl}/api/v1/metadata?metric=${encodeURIComponent(metricName)}`,\n {\n method: \"GET\",\n headers: this.getHeaders(),\n }\n );\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = await response.json() as { status: string; data: Record<string, Array<{ type: string; help: string; unit: string }>> };\n\n if (data.status !== \"success\" || !data.data[metricName]) {\n return { name: metricName };\n }\n\n const metadata = data.data[metricName][0];\n return {\n name: metricName,\n type: metadata.type,\n description: metadata.help,\n unit: metadata.unit,\n };\n } catch (error) {\n console.warn(`Failed to get metric metadata for ${metricName}:`, error);\n return { name: metricName };\n }\n }\n\n async queryMetricData(\n metricName: string,\n options: {\n startTime?: number;\n endTime?: number;\n step?: number;\n labels?: Record<string, string>;\n }\n ): Promise<MetricQueryResult> {\n const endTime = options.endTime || Math.floor(Date.now() / 1000);\n const startTime = options.startTime || endTime - 3600; // Default 1 hour\n const step = options.step || 60; // Default 60 seconds\n\n // Build query with labels\n let query = metricName;\n if (options.labels && Object.keys(options.labels).length > 0) {\n const labelSelectors = Object.entries(options.labels)\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(\",\");\n query = `${metricName}{${labelSelectors}}`;\n }\n\n try {\n const response = await fetch(\n `${this.config.serverUrl}/api/v1/query_range?query=${encodeURIComponent(query)}&start=${startTime}&end=${endTime}&step=${step}`,\n {\n method: \"GET\",\n headers: this.getHeaders(),\n }\n );\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = await response.json() as {\n status: string;\n error?: string;\n data?: { result?: Array<{ metric?: Record<string, string>; values?: Array<[string, string]> }> };\n };\n\n if (data.status !== \"success\") {\n throw new Error(`Prometheus error: ${data.error || \"Unknown error\"}`);\n }\n\n // Parse data points\n const dataPoints: MetricDataPoint[] = [];\n const result = data.data?.result || [];\n\n for (const series of result) {\n const labels = series.metric || {};\n for (const [timestamp, value] of series.values || []) {\n dataPoints.push({\n timestamp: parseFloat(timestamp) * 1000, // Convert to milliseconds\n value: parseFloat(value),\n labels,\n });\n }\n }\n\n return {\n metricName,\n dataPoints,\n metadata: {\n startTime: startTime * 1000,\n endTime: endTime * 1000,\n step: step * 1000,\n },\n };\n } catch (error) {\n throw new Error(`Failed to query metric data: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n getServerType(): MetricsServerType {\n return \"prometheus\";\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n ...this.config.headers,\n };\n\n if (this.config.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.config.apiKey}`;\n } else if (this.config.username && this.config.password) {\n const auth = Buffer.from(`${this.config.username}:${this.config.password}`).toString(\"base64\");\n headers[\"Authorization\"] = `Basic ${auth}`;\n }\n\n return headers;\n }\n}\n\n/**\n * Custom/Generic Metrics Client Implementation\n * Uses a generic REST API approach\n */\nexport class CustomMetricsClient implements IMetricsServerClient {\n private config: MetricsServerConfig;\n\n constructor(config: MetricsServerConfig) {\n this.config = config;\n }\n\n async testConnection(): Promise<{ connected: boolean; latency?: number; error?: string }> {\n const startTime = Date.now();\n try {\n const response = await fetch(`${this.config.serverUrl}/health`, {\n method: \"GET\",\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const latency = Date.now() - startTime;\n return { connected: true, latency };\n } catch (error) {\n return {\n connected: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n async listMetrics(): Promise<MetricMeta[]> {\n try {\n const response = await fetch(`${this.config.serverUrl}/api/metrics`, {\n method: \"GET\",\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = await response.json() as { metrics?: MetricMeta[] };\n return data.metrics || [];\n } catch (error) {\n throw new Error(`Failed to list metrics: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n async getMetricMeta(metricName: string): Promise<MetricMeta | null> {\n try {\n const response = await fetch(\n `${this.config.serverUrl}/api/metrics/${encodeURIComponent(metricName)}/meta`,\n {\n method: \"GET\",\n headers: this.getHeaders(),\n }\n );\n\n if (!response.ok) {\n if (response.status === 404) {\n return null;\n }\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n return await response.json() as MetricMeta;\n } catch (error) {\n throw new Error(`Failed to get metric metadata: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n async queryMetricData(\n metricName: string,\n options: {\n startTime?: number;\n endTime?: number;\n step?: number;\n labels?: Record<string, string>;\n }\n ): Promise<MetricQueryResult> {\n try {\n const queryParams = new URLSearchParams();\n if (options.startTime) queryParams.append(\"start\", options.startTime.toString());\n if (options.endTime) queryParams.append(\"end\", options.endTime.toString());\n if (options.step) queryParams.append(\"step\", options.step.toString());\n if (options.labels) {\n queryParams.append(\"labels\", JSON.stringify(options.labels));\n }\n\n const response = await fetch(\n `${this.config.serverUrl}/api/metrics/${encodeURIComponent(metricName)}/data?${queryParams}`,\n {\n method: \"GET\",\n headers: this.getHeaders(),\n }\n );\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n return await response.json() as MetricQueryResult;\n } catch (error) {\n throw new Error(`Failed to query metric data: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n getServerType(): MetricsServerType {\n return \"custom\";\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n ...this.config.headers,\n };\n\n if (this.config.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.config.apiKey}`;\n } else if (this.config.username && this.config.password) {\n const auth = Buffer.from(`${this.config.username}:${this.config.password}`).toString(\"base64\");\n headers[\"Authorization\"] = `Basic ${auth}`;\n }\n\n return headers;\n }\n}\n\n/**\n * Metrics Server Manager\n * Manages metrics server connections and provides a unified interface\n */\nexport class MetricsServerManager {\n private static instance: MetricsServerManager;\n private clients: Map<string, IMetricsServerClient> = new Map();\n private configs: Map<string, MetricsServerConfig> = new Map();\n private defaultServerKey: string | null = null;\n\n private constructor() {}\n\n /**\n * Get the singleton instance\n */\n static getInstance(): MetricsServerManager {\n if (!MetricsServerManager.instance) {\n MetricsServerManager.instance = new MetricsServerManager();\n }\n return MetricsServerManager.instance;\n }\n\n /**\n * Register a metrics server\n * @param key - Unique identifier for the server\n * @param config - Metrics server configuration\n */\n registerServer(key: string, config: MetricsServerConfig): void {\n let client: IMetricsServerClient;\n\n switch (config.type) {\n case \"prometheus\":\n client = new PrometheusClient(config);\n break;\n case \"custom\":\n client = new CustomMetricsClient(config);\n break;\n case \"semantic\":\n client = new SemanticMetricsClient(config as SemanticMetricsServerConfig);\n break;\n default:\n throw new Error(`Unsupported metrics server type: ${config.type}`);\n }\n\n this.clients.set(key, client);\n this.configs.set(key, config);\n\n // Set as default if it's the first server\n if (this.defaultServerKey === null) {\n this.defaultServerKey = key;\n }\n }\n\n /**\n * Set the default metrics server\n * @param key - Server key to set as default\n */\n setDefaultServer(key: string): void {\n if (!this.clients.has(key)) {\n throw new Error(`Metrics server '${key}' not found`);\n }\n this.defaultServerKey = key;\n }\n\n /**\n * Get a metrics server client by key\n * @param key - Server key (optional, uses default if not provided)\n */\n getClient(key?: string): IMetricsServerClient {\n const serverKey = key || this.defaultServerKey;\n if (!serverKey) {\n throw new Error(\"No metrics server registered\");\n }\n\n const client = this.clients.get(serverKey);\n if (!client) {\n throw new Error(`Metrics server '${serverKey}' not found`);\n }\n\n return client;\n }\n\n /**\n * Get metrics server configuration by key\n * @param key - Server key (optional, uses default if not provided)\n */\n getConfig(key?: string): MetricsServerConfig {\n const serverKey = key || this.defaultServerKey;\n if (!serverKey) {\n throw new Error(\"No metrics server registered\");\n }\n\n const config = this.configs.get(serverKey);\n if (!config) {\n throw new Error(`Metrics server '${serverKey}' not found`);\n }\n\n return config;\n }\n\n /**\n * Check if a metrics server is registered\n * @param key - Server key\n */\n hasServer(key: string): boolean {\n return this.clients.has(key);\n }\n\n /**\n * Get all registered metrics server keys with their types\n */\n getServerKeys(): { key: string; type: MetricsServerType; name?: string }[] {\n return Array.from(this.configs.entries()).map(([key, config]) => ({\n key,\n type: config.type,\n }));\n }\n\n /**\n * Remove a metrics server\n * @param key - Server key\n */\n removeServer(key: string): void {\n this.clients.delete(key);\n this.configs.delete(key);\n\n if (this.defaultServerKey === key) {\n this.defaultServerKey =\n this.clients.size > 0 ? this.clients.keys().next().value || null : null;\n }\n }\n\n /**\n * Load metrics server configurations from a store\n * and register them with this manager\n *\n * @param store - The metrics server configuration store\n * @param tenantId - Tenant identifier\n */\n async loadConfigsFromStore(\n store: import(\"@axiom-lattice/protocols\").MetricsServerConfigStore,\n tenantId: string\n ): Promise<void> {\n const configs = await store.getAllConfigs(tenantId);\n\n for (const entry of configs) {\n this.registerServer(entry.key, entry.config);\n }\n }\n\n /**\n * Load all metrics server configurations from a store\n * across all tenants and register them with this manager\n *\n * @param store - The metrics server configuration store\n */\n async loadAllConfigsFromStore(\n store: import(\"@axiom-lattice/protocols\").MetricsServerConfigStore\n ): Promise<void> {\n const configs = await store.getAllConfigsWithoutTenant();\n\n for (const entry of configs) {\n this.registerServer(entry.key, entry.config);\n }\n }\n}\n\n// Export singleton instance\nexport const metricsServerManager = MetricsServerManager.getInstance();\nexport { SemanticMetricsClient } from \"./SemanticMetricsClient\";\n","/**\n * List Metrics Servers Tool\n * Tool for listing all registered metrics servers\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { metricsServerManager } from \"./MetricsServerManager\";\n\nconst LIST_METRICS_SERVERS_DESCRIPTION = `List all registered metrics servers. Returns a list of available metrics servers with their keys and types. Use this tool first to understand what metrics servers are available.`;\n\nexport interface CreateMetricsToolParams {\n serverKeys: string[];\n serverDescriptions?: Record<string, string>;\n}\n\nexport const createListMetricsServersTool = ({ serverKeys, serverDescriptions }: CreateMetricsToolParams) => {\n const availableServersText = serverKeys.length > 0\n ? `\\n\\nAvailable metrics servers:\\n${serverKeys.map(key => \n `- ${key}${serverDescriptions?.[key] ? `: ${serverDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async (_input: {}, _exeConfig: any) => {\n try {\n const servers = metricsServerManager.getServerKeys();\n\n if (servers.length === 0) {\n return \"No metrics servers registered.\";\n }\n\n const lines = servers.map(({ key, type }) => {\n const desc = serverDescriptions?.[key] ? ` - ${serverDescriptions[key]}` : '';\n return `- ${key} (${type})${desc}`;\n });\n\n return `Available metrics servers:\\n${lines.join('\\n')}`;\n } catch (error) {\n return `Error listing metrics servers: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"list_metrics_servers\",\n description: `${LIST_METRICS_SERVERS_DESCRIPTION}${availableServersText}`,\n schema: z.object({}),\n }\n );\n};\n","/**\n * List Metrics DataSources Tool\n * Tool for listing all datasources from all configured metrics servers\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { metricsServerManager, SemanticMetricsClient } from \"./MetricsServerManager\";\n\nconst LIST_METRICS_DATASOURCES_DESCRIPTION = `List all available datasources from all configured metrics servers. Returns a table with Server Key, DataSource ID, and DataSource Name. Use this tool first to discover what datasources are available before querying metrics.`;\n\nexport interface CreateMetricsToolParams {\n serverKeys: string[];\n serverDescriptions?: Record<string, string>;\n}\n\ninterface DataSourceInfo {\n serverKey: string;\n datasourceId: string;\n datasourceName: string;\n}\n\nexport const createListMetricsDataSourcesTool = ({ serverKeys, serverDescriptions }: CreateMetricsToolParams) => {\n const availableServersText = serverKeys.length > 0\n ? `\\n\\nConfigured metrics servers:\\n${serverKeys.map(key => \n `- ${key}${serverDescriptions?.[key] ? `: ${serverDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async (_input: {}, _exeConfig: any) => {\n try {\n // 检查是否有用户选中的数据源配置\n const runConfig = _exeConfig?.configurable?.runConfig || {};\n const metricsDataSource = runConfig.metricsDataSource;\n \n if (metricsDataSource) {\n // 用户已选中数据源,显示专注提示\n const { serverKey, datasourceId } = metricsDataSource;\n return `ℹ️ **当前已选中数据源**\n\n您已通过界面选中了特定的数据源,所有 metrics 查询将专注于:\n- **服务器**: ${serverKey}\n- **数据源ID**: ${datasourceId}\n\n您可以直接使用其他 metrics 工具(如 query_metrics_list、query_semantic_metric_data 等),无需再指定 serverKey 和 datasourceId 参数。\n\n如需查看所有可用的数据源,请清除当前选择或重新打开数据源选择器。`;\n }\n\n if (serverKeys.length === 0) {\n return \"No metrics servers configured.\";\n }\n\n const allDataSources: DataSourceInfo[] = [];\n\n for (const serverKey of serverKeys) {\n try {\n const config = metricsServerManager.getConfig(serverKey);\n \n if (config.type !== \"semantic\") {\n console.warn(`Server \"${serverKey}\" is not a semantic metrics server, skipping.`);\n continue;\n }\n\n const client = metricsServerManager.getClient(serverKey) as SemanticMetricsClient;\n const dataSources = await client.getDataSources();\n \n // Filter by selectedDataSources if configured\n const selectedIds = (config as any).selectedDataSources || [];\n const filteredDataSources = selectedIds.length > 0\n ? dataSources.filter(ds => selectedIds.includes(String(ds.id)))\n : dataSources;\n\n for (const ds of filteredDataSources) {\n allDataSources.push({\n serverKey,\n datasourceId: String(ds.id),\n datasourceName: ds.name || String(ds.id),\n });\n }\n } catch (error) {\n console.warn(`Failed to get datasources from server \"${serverKey}\":`, error);\n }\n }\n\n if (allDataSources.length === 0) {\n return `No datasources found in any configured metrics servers.`;\n }\n\n // Format as table\n const lines: string[] = [];\n lines.push(`Found ${allDataSources.length} datasource(s) from ${serverKeys.length} server(s):\\n`);\n lines.push(\"| Server Key | DataSource ID | Name |\");\n lines.push(\"|------------|---------------|------|\");\n\n for (const ds of allDataSources) {\n lines.push(`| ${ds.serverKey} | ${ds.datasourceId} | ${ds.datasourceName} |`);\n }\n\n lines.push(\"\\nUse the Server Key and DataSource ID when calling other metrics tools.\");\n\n return lines.join('\\n');\n } catch (error) {\n return `Error listing datasources: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"list_metrics_datasources\",\n description: `${LIST_METRICS_DATASOURCES_DESCRIPTION}${availableServersText}`,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Query Metrics List Tool\n * Tool for querying available metrics from semantic metrics server data sources\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { metricsServerManager, SemanticMetricsClient } from \"./MetricsServerManager\";\n\nconst QUERY_METRICS_LIST_DESCRIPTION = `Query Available Metrics - Step 1 of the Metrics Workflow\n\nDiscover what metrics exist in the semantic metrics server. This tool returns a list of available metrics with their domains and descriptions.\n\nWhen to Use This Tool\nUse this tool proactively in these scenarios:\n- When the user asks about business metrics but does not specify exact metric names\n- When you need to find metrics matching a specific domain (e.g., \"sales performance\", \"pricing\")\n- At the start of ANY metrics-related conversation to understand available data\n- When the user asks \"what metrics do we have?\" or \"show me available KPIs\"\n\nWhen NOT to Use This Tool\nSkip using this tool when:\n- The user has already provided exact metric names (proceed directly to query_metric_definition)\n- You have cached metric metadata from a recent call (within the same conversation)\n- The query is purely about retrieving data, not discovering what's available\n\nThe Three-Step Metrics Workflow\n1. query_metrics_list (THIS TOOL) → discover available metrics\n2. query_metric_definition → read metric metadata before querying\n3. query_semantic_metric_data → execute the query with correct parameters\n\nResponse Fields Reference\n| Field | How to Use It |\n|-------|---------------|\n| metricName | The identifier passed to query_metric_definition and query_semantic_metric_data |\n| domain | Groups related metrics (e.g., sales_performance, pricing_and_margin) |\n| shortDesc | One-line description to present to the user |\n| displayName | Human-readable name of the metric |\n\nNext Step\nAfter finding relevant metrics, call query_metric_definition with the metricName to get detailed metadata including time dimensions and supported filters.`;\n\nexport interface CreateMetricsToolParams {\n serverKeys: string[];\n serverDescriptions?: Record<string, string>;\n}\n\nexport const createQueryMetricsListTool = ({ serverKeys, serverDescriptions }: CreateMetricsToolParams) => {\n const availableServersText = serverKeys.length > 0\n ? `\\n\\nAvailable metrics servers:\\n${serverKeys.map(key =>\n `- ${key}${serverDescriptions?.[key] ? `: ${serverDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async (\n {\n serverKey: inputServerKey,\n datasourceIds,\n }: {\n serverKey?: string;\n datasourceIds?: string[];\n },\n _exeConfig: any\n ) => {\n try {\n // 优先从 runConfig 中获取 metricsDataSource 配置\n const runConfig = _exeConfig?.configurable?.runConfig || {};\n const metricsDataSource = runConfig.metricsDataSource;\n\n // 使用 runConfig 中的值覆盖输入参数\n const serverKey = metricsDataSource?.serverKey || inputServerKey;\n\n if (!serverKey) {\n return \"Error: serverKey parameter is required. Available servers: \" + serverKeys.join(', ');\n }\n\n if (!serverKeys.includes(serverKey)) {\n return `Error: serverKey \"${serverKey}\" is not in the allowed list: [${serverKeys.join(', ')}]`;\n }\n\n const config = metricsServerManager.getConfig(serverKey);\n\n if (config.type !== \"semantic\") {\n return `Error: Server \"${serverKey}\" is not a semantic metrics server. This tool only works with semantic servers.`;\n }\n\n const client = metricsServerManager.getClient(serverKey) as SemanticMetricsClient;\n\n // 优先使用 runConfig 中的 datasourceId\n const targetDatasourceIds = datasourceIds && datasourceIds.length > 0\n ? datasourceIds\n : (metricsDataSource?.datasourceId ? [metricsDataSource.datasourceId] : client.getSelectedDataSources());\n\n if (targetDatasourceIds.length === 0) {\n return `Error: No data sources specified and no default data sources configured for server \"${serverKey}\".`;\n }\n\n interface MetricInfo {\n metricName: string;\n displayName: string;\n domain: string;\n shortDesc: string;\n datasources: string[];\n }\n\n const allMetrics: Map<string, MetricInfo> = new Map();\n\n for (const datasourceId of targetDatasourceIds) {\n try {\n const metaData = await client.getDatasourceMetrics(datasourceId);\n const index = metaData.index;\n\n for (const item of index.metrics) {\n if (allMetrics.has(item.metricName)) {\n const existing = allMetrics.get(item.metricName)!;\n if (!existing.datasources.includes(datasourceId)) {\n existing.datasources.push(datasourceId);\n }\n } else {\n allMetrics.set(item.metricName, {\n metricName: item.metricName,\n displayName: item.displayName,\n domain: item.domain,\n shortDesc: item.shortDesc,\n datasources: [datasourceId],\n });\n }\n }\n } catch (error) {\n console.warn(`Failed to get metrics for datasource ${datasourceId}:`, error);\n }\n }\n\n // 按 datasourceId 组织指标\n const metricsByDatasource = new Map<string, MetricInfo[]>();\n\n for (const metric of allMetrics.values()) {\n for (const dsId of metric.datasources) {\n if (!metricsByDatasource.has(dsId)) {\n metricsByDatasource.set(dsId, []);\n }\n // 为每个数据源创建一个独立的 metric 对象(不包含 datasources 字段)\n metricsByDatasource.get(dsId)!.push(metric);\n }\n }\n\n if (metricsByDatasource.size === 0) {\n return `未在指定的数据源中找到指标。`;\n }\n\n const lines: string[] = [];\n lines.push(`## 业务指标列表(serverKey: ${serverKey})\\n`);\n\n // 按 datasourceId 排序\n const sortedDatasourceIds = Array.from(metricsByDatasource.keys()).sort();\n\n for (const dsId of sortedDatasourceIds) {\n const metrics = metricsByDatasource.get(dsId)!;\n\n // 按 domain 和 metricName 排序\n const sortedMetrics = metrics.sort((a, b) => {\n if (a.domain && a.domain !== b.domain) {\n return a.domain.localeCompare(b.domain);\n }\n return a.metricName.localeCompare(b.metricName);\n });\n\n lines.push(`### datasourceId: ${dsId}(${metrics.length} 个指标)\\n`);\n\n // Markdown table header\n lines.push('| metricName | displayName | domain | shortDesc |');\n lines.push('|------------|-------------|--------|-----------|');\n\n // Table rows\n for (const metric of sortedMetrics) {\n const shortDesc = metric.shortDesc || '';\n lines.push(`| ${metric.metricName} | ${metric.displayName} | ${metric.domain} | ${shortDesc} |`);\n }\n\n lines.push('');\n }\n\n lines.push('---');\n lines.push('');\n lines.push('如需查看指标的详细定义,请使用 **query_metric_definition** 工具,传入参数:`serverKey`、`metricName`、`datasourceId`');\n\n return lines.join('\\n');\n } catch (error) {\n return `Error querying metrics list: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"query_metrics_list\",\n description: `${QUERY_METRICS_LIST_DESCRIPTION}${availableServersText}`,\n schema: z.object({\n serverKey: z\n .string()\n .optional()\n .describe(`Target semantic metrics server. Choose from: ${serverKeys.join(', ')}. Optional if configured in runConfig.metricsDataSource`),\n datasourceIds: z\n .array(z.string())\n .optional()\n .describe(\"Optional array of datasource IDs to query. If not provided, uses all selected datasources or the one configured in runConfig.metricsDataSource.\"),\n }),\n }\n );\n};\n","/**\n * Query Metric Definition Tool\n * Tool for getting detailed definition of a specific semantic metric\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { metricsServerManager, SemanticMetricsClient } from \"./MetricsServerManager\";\n\nconst QUERY_METRIC_DEFINITION_DESCRIPTION = `Get Metric Definition - Step 2 of the Metrics Workflow\n\nRead detailed metadata for a specific metric before querying it.\n\nWhen to Use This Tool\n- BEFORE calling query_semantic_metric_data for any metric\n- When you need to understand time dimensions and supported grains\n- When you need to know which dimensions are available for GROUP BY and filtering\n\nWhen NOT to Use This Tool\n- You have already retrieved the metric definition in this conversation\n- You are only listing available metrics (use query_metrics_list instead)\n\nKey Response Sections\n\n1. defaultTimeContext - Time Configuration\n- timeDimension: Primary date field (e.g., \"DocDate\")\n- supportedGrains: Available grains [\"day\", \"week\", \"month\", \"year\"]\n- Format: Use \"{timeDimension}__{grain}\" for time grouping\n\n2. supportedDimensions - Available Axes\nEach dimension has: dim_id, field_name, type (categorical/datetime)\n\nFilter Patterns by Type:\n- categorical → {\"dimension\": \"dim_id\", \"operator\": \"IN\", \"values\": [\"v1\", \"v2\"]}\n- datetime → {\"dimension\": \"dim_id\", \"operator\": \"BETWEEN\", \"values\": [\"2025-01-01\", \"2025-12-31\"]}\n\nGroupBy Patterns:\n- categorical → Use dim_id directly (e.g., \"org_region\")\n- datetime → Use \"{dim_id}__{grain}\" (e.g., \"DocDate__month\")\n\nRules\n- Use dim_id (never field_name) in filters and groupBy\n- Time grain format: lowercase (day/week/month/year)\n- Categorical: IN for multiple, EQ for single\n- Datetime: BETWEEN for ranges, GT/LT for open-ended\n\nNext Step\nCall query_semantic_metric_data with parameters derived from this definition.`\n\nexport interface CreateMetricsToolParams {\n serverKeys: string[];\n serverDescriptions?: Record<string, string>;\n}\n\ninterface MetricDetail {\n datasourceId: number;\n metricName: string;\n displayName: string;\n domain: string;\n description: string;\n dataType: string;\n format: string;\n defaultTimeContext: {\n timeDimension: string;\n label: string;\n granularity: string;\n window: string;\n supportedGrains: string[];\n };\n supportedDimensions: Array<{\n dim_id: string;\n field_name: string;\n type: string;\n }>;\n aiAgentContext: {\n polarity: string;\n synonyms: string[];\n thresholds: Array<{\n metric: string;\n operator: string;\n value: number;\n level: string;\n }>;\n diagnosticWorkflow: {\n trigger: {\n any_of: Array<{\n metric: string;\n operator: string;\n value: number;\n }>;\n };\n actions: Array<{\n type: string;\n metric?: string;\n dimensions?: string[];\n intent: string;\n }>;\n analysis_logic: string;\n };\n humanReadableExplanation: string;\n };\n}\n\nexport const createQueryMetricDefinitionTool = ({ serverKeys, serverDescriptions }: CreateMetricsToolParams) => {\n const availableServersText = serverKeys.length > 0\n ? `\\n\\nAvailable metrics servers:\\n${serverKeys.map(key => \n `- ${key}${serverDescriptions?.[key] ? `: ${serverDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async (\n {\n serverKey: inputServerKey,\n metricName,\n datasourceId: inputDatasourceId,\n }: {\n serverKey?: string;\n metricName: string;\n datasourceId?: string;\n },\n _exeConfig: any\n ) => {\n try {\n // 优先从 runConfig 中获取 metricsDataSource 配置\n const runConfig = _exeConfig?.configurable?.runConfig || {};\n const metricsDataSource = runConfig.metricsDataSource;\n \n // 使用 runConfig 中的值覆盖输入参数\n const serverKey = metricsDataSource?.serverKey || inputServerKey;\n const datasourceId = inputDatasourceId || metricsDataSource?.datasourceId;\n\n if (!serverKey) {\n return \"Error: serverKey parameter is required. Available servers: \" + serverKeys.join(', ');\n }\n\n if (!serverKeys.includes(serverKey)) {\n return `Error: serverKey \"${serverKey}\" is not in the allowed list: [${serverKeys.join(', ')}]`;\n }\n\n if (!metricName) {\n return \"Error: metricName parameter is required.\";\n }\n\n const config = metricsServerManager.getConfig(serverKey);\n \n if (config.type !== \"semantic\") {\n return `Error: Server \"${serverKey}\" is not a semantic metrics server. This tool only works with semantic servers.`;\n }\n\n const client = metricsServerManager.getClient(serverKey) as SemanticMetricsClient;\n \n const targetDatasourceIds = datasourceId \n ? [datasourceId]\n : client.getSelectedDataSources();\n\n if (targetDatasourceIds.length === 0) {\n return `Error: No datasourceId specified and no default data sources configured for server \"${serverKey}\".`;\n }\n\n let foundDetail: MetricDetail | null = null;\n let foundDatasourceId: string | null = null;\n\n for (const dsId of targetDatasourceIds) {\n try {\n const metaData = await client.getDatasourceMetrics(dsId);\n const item = metaData.index.metrics.find((m: { metricName: string }) => m.metricName === metricName);\n if (item) {\n const detail = metaData.metricsDetails.find((d: { metricName: string }) => d.metricName === metricName) as MetricDetail | undefined;\n if (detail) {\n foundDetail = detail;\n foundDatasourceId = dsId;\n }\n break;\n }\n } catch (error) {\n console.warn(`Failed to get metrics for datasource ${dsId}:`, error);\n }\n }\n\n if (!foundDetail) {\n return `Metric \"${metricName}\" not found in the specified data sources.`;\n }\n\n const lines: string[] = [];\n \n // 标题\n lines.push(`# ${foundDetail.displayName} (${foundDetail.metricName})`);\n lines.push('');\n \n // 基本信息\n lines.push(`## 基本信息`);\n lines.push('');\n lines.push(`- **指标名称**: ${foundDetail.metricName}`);\n lines.push(`- **显示名称**: ${foundDetail.displayName}`);\n lines.push(`- **所属领域**: ${foundDetail.domain}`);\n lines.push(`- **数据类型**: ${foundDetail.dataType}`);\n lines.push(`- **显示格式**: ${foundDetail.format}`);\n if (foundDatasourceId) {\n lines.push(`- **数据源ID**: ${foundDatasourceId}`);\n }\n lines.push('');\n \n // 描述\n lines.push(`## 指标描述`);\n lines.push('');\n lines.push(foundDetail.description);\n lines.push('');\n \n // 时间上下文\n if (foundDetail.defaultTimeContext) {\n const dtc = foundDetail.defaultTimeContext;\n lines.push(`## 时间上下文`);\n lines.push('');\n if (dtc.timeDimension) {\n lines.push(`- **时间维度**: ${dtc.timeDimension}${dtc.label ? ` (${dtc.label})` : ''}`);\n }\n if (dtc.granularity) {\n lines.push(`- **默认粒度**: ${dtc.granularity}`);\n }\n if (dtc.window) {\n lines.push(`- **默认窗口**: ${dtc.window}`);\n }\n const grains = dtc.supportedGrains;\n lines.push(`- **支持的粒度**: ${Array.isArray(grains) && grains.length > 0 ? grains.join('、') : '未配置'}`);\n lines.push('');\n }\n \n // 支持维度\n if (foundDetail.supportedDimensions && foundDetail.supportedDimensions.length > 0) {\n const categoricalDims = foundDetail.supportedDimensions.filter(d => d.type === 'categorical');\n const datetimeDims = foundDetail.supportedDimensions.filter(d => d.type === 'datetime');\n const timeDimension = foundDetail.defaultTimeContext?.timeDimension;\n \n lines.push(`## 支持的维度`);\n lines.push('');\n \n // 分类维度\n if (categoricalDims.length > 0) {\n lines.push(`### 分类维度 (categorical) - ${categoricalDims.length} 个`);\n lines.push('支持 IN(多选)、EQ(单选)操作符');\n lines.push('');\n \n // 展示前2个作为示例\n const examples = categoricalDims.slice(0, 2);\n for (const dim of examples) {\n lines.push(`**${dim.dim_id}** (${dim.field_name})`);\n lines.push('```json');\n lines.push(`// 分组示例`);\n lines.push(`\"groupBy\": [\"${dim.dim_id}\"]`);\n lines.push('');\n lines.push(`// 过滤示例`);\n lines.push(`{\"dimension\": \"${dim.dim_id}\", \"operator\": \"IN\", \"values\": [\"value1\", \"value2\"]}`);\n lines.push('```');\n lines.push('');\n }\n \n if (categoricalDims.length > 2) {\n const others = categoricalDims.slice(2).map(d => d.dim_id).join('、');\n lines.push(`**其他 ${categoricalDims.length - 2} 个维度**: ${others}`);\n lines.push('');\n }\n }\n \n // 时间维度\n if (datetimeDims.length > 0) {\n lines.push(`### 时间维度 (datetime) - ${datetimeDims.length} 个`);\n lines.push('支持 BETWEEN(范围)、GT/GTE/LT/LTE(比较)操作符');\n lines.push('');\n \n // 展示主时间维度\n const primaryDim = datetimeDims.find(d => d.dim_id === timeDimension) || datetimeDims[0];\n lines.push(`**${primaryDim.dim_id}** (${primaryDim.field_name})`);\n lines.push('```json');\n lines.push(`// 按时间粒度分组`);\n lines.push(`\"groupBy\": [\"${primaryDim.dim_id}__month\"] // 可选: day, week, month, year`);\n lines.push('');\n lines.push(`// 时间范围过滤`);\n lines.push(`{\"dimension\": \"${primaryDim.dim_id}\", \"operator\": \"BETWEEN\", \"values\": [\"2025-01-01\", \"2025-12-31\"]}`);\n lines.push('```');\n lines.push('');\n \n if (datetimeDims.length > 1) {\n const others = datetimeDims.filter(d => d.dim_id !== primaryDim.dim_id).map(d => d.dim_id).join('、');\n lines.push(`**其他时间维度**: ${others}`);\n lines.push('');\n }\n }\n \n // 快速参考\n lines.push('### 快速参考');\n lines.push('');\n lines.push('**时间分组格式**: `{timeDimension}__{grain}`');\n lines.push('- 按天: `DocDate__day`');\n lines.push('- 按周: `DocDate__week`');\n lines.push('- 按月: `DocDate__month`');\n lines.push('- 按年: `DocDate__year`');\n lines.push('');\n }\n \n // AI Agent 上下文\n if (foundDetail.aiAgentContext) {\n const aiContext = foundDetail.aiAgentContext;\n lines.push(`## AI 分析上下文`);\n lines.push('');\n \n // 极性\n if (aiContext.polarity) {\n lines.push(`### 指标极性`);\n lines.push('');\n lines.push(aiContext.polarity === 'positive' ? '正向指标(越高越好)' : '负向指标(越低越好)');\n lines.push('');\n }\n \n // 同义词\n if (aiContext.synonyms && aiContext.synonyms.length > 0) {\n lines.push(`### 同义词/别名`);\n lines.push('');\n lines.push(aiContext.synonyms.join('、'));\n lines.push('');\n }\n \n // 阈值\n if (aiContext.thresholds && aiContext.thresholds.length > 0) {\n lines.push(`### 预警阈值`);\n lines.push('');\n lines.push('| 指标 | 运算符 | 阈值 | 级别 |');\n lines.push('|------|--------|------|------|');\n for (const t of aiContext.thresholds) {\n lines.push(`| ${t.metric} | ${t.operator} | ${t.value} | ${t.level} |`);\n }\n lines.push('');\n }\n \n // 诊断工作流\n if (aiContext.diagnosticWorkflow) {\n lines.push(`### 诊断工作流`);\n lines.push('');\n \n if (aiContext.diagnosticWorkflow.trigger && aiContext.diagnosticWorkflow.trigger.any_of) {\n lines.push(`**触发条件** (满足任一):`);\n for (const trigger of aiContext.diagnosticWorkflow.trigger.any_of) {\n if (trigger.metric && trigger.operator) {\n lines.push(`- ${trigger.metric} ${trigger.operator} ${trigger.value ?? 'N/A'}`);\n }\n }\n lines.push('');\n }\n \n if (aiContext.diagnosticWorkflow.actions && aiContext.diagnosticWorkflow.actions.length > 0) {\n lines.push(`**分析动作**:`);\n for (let i = 0; i < aiContext.diagnosticWorkflow.actions.length; i++) {\n const action = aiContext.diagnosticWorkflow.actions[i];\n if (!action) continue;\n lines.push(`${i + 1}. **${action.type ?? '未命名动作'}**`);\n if (action.metric) {\n lines.push(` - 对比指标: ${action.metric}`);\n }\n if (action.dimensions && action.dimensions.length > 0) {\n lines.push(` - 下钻维度: ${action.dimensions.join('、')}`);\n }\n if (action.intent) {\n lines.push(` - 目的: ${action.intent}`);\n }\n }\n lines.push('');\n }\n \n if (aiContext.diagnosticWorkflow.analysis_logic) {\n lines.push(`**分析逻辑**: ${aiContext.diagnosticWorkflow.analysis_logic}`);\n lines.push('');\n }\n }\n \n // 人类可读解释\n if (aiContext.humanReadableExplanation) {\n lines.push(`### 系统建议`);\n lines.push('');\n lines.push(aiContext.humanReadableExplanation);\n lines.push('');\n }\n }\n \n // 使用示例\n lines.push(`---`);\n lines.push('');\n lines.push(`## 使用示例`);\n lines.push('');\n lines.push(`查询此指标时,使用 query_semantic_metric_data 工具,参数:`);\n lines.push(`- **metricName**: \"${foundDetail.metricName}\"`);\n if (foundDatasourceId) {\n lines.push(`- **datasourceId**: \"${foundDatasourceId}\"`);\n }\n\n return lines.join('\\n');\n } catch (error) {\n return `Error querying metric definition: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"query_metric_definition\",\n description: `${QUERY_METRIC_DEFINITION_DESCRIPTION}${availableServersText}`,\n schema: z.object({\n serverKey: z\n .string()\n .optional()\n .describe(`Target semantic metrics server. Choose from: ${serverKeys.join(', ')}. Optional if configured in runConfig.metricsDataSource`),\n metricName: z\n .string()\n .describe(\"The name of the metric to get definition for.\"),\n datasourceId: z\n .string()\n .optional()\n .describe(\"Optional specific datasource ID to search in. If not provided, uses the one configured in runConfig.metricsDataSource or searches all selected datasources.\"),\n }),\n }\n );\n};\n","/**\n * Query Semantic Metric Data Tool\n * Tool for querying metric data from semantic metrics server\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { metricsServerManager, SemanticMetricsClient } from \"./MetricsServerManager\";\nimport type { SemanticMetricsFilter, SemanticMetricsQueryResponse } from \"@axiom-lattice/protocols\";\n\nconst QUERY_SEMANTIC_METRIC_DATA_DESCRIPTION = `Query Metric Data - Step 3 of the Metrics Workflow\n\nExecute queries with the correct parameters derived from metric definitions. This tool requires you to have already discovered and understood the metric metadata.\n\nWhen to Use This Tool\nUse this tool proactively in these scenarios:\n- When you have the metricName and have read its definition via query_metric_definition\n- When executing time trend analysis, dimension breakdowns, or drill-downs\n- When comparing multiple metrics side-by-side\n\nWhen NOT to Use This Tool\nSkip using this tool when:\n- You haven't retrieved the metric definition yet (call query_metric_definition first)\n- You're unsure about supported dimensions or time grains for this metric\n\nPrerequisites - MUST Complete First\n1. Call query_metrics_list to discover available metrics\n2. Call query_metric_definition(metricName) to get:\n - defaultTimeContext.timeDimension (e.g., \"DocDate\")\n - defaultTimeContext.supportedGrains (e.g., [\"day\", \"week\", \"month\", \"year\"])\n - supportedDimensions[].dim_id (use these for groupBy and filters)\n - supportedDimensions[].filter_operators (allowed operators per dimension)\n\nThe Five Query Patterns\n\nPattern A - Time Trend (most common first query)\nGoal: Show how a metric changes over time within a period\n{\n \"metrics\": [\"order_amt_tax_inc\"],\n \"groupBy\": [\"DocDate__month\"],\n \"filters\": [{ \"dimension\": \"DocDate\", \"operator\": \"BETWEEN\", \"values\": [\"2025-01-01\", \"2025-12-31\"] }],\n \"orderBy\": [{ \"field\": \"DocDate__month\", \"direction\": \"ASC\" }]\n}\n\nPattern B - Dimension Breakdown (who/what is top or bottom)\nGoal: Rank performance across a categorical dimension in a fixed period\n{\n \"metrics\": [\"order_amt_tax_inc\"],\n \"groupBy\": [\"org_region\"],\n \"filters\": [{ \"dimension\": \"DocDate\", \"operator\": \"BETWEEN\", \"values\": [\"2025-01-01\", \"2025-03-31\"] }],\n \"orderBy\": [{ \"field\": \"value\", \"direction\": \"DESC\" }],\n \"limit\": 10\n}\n\nPattern C - Drill Down (zoom into an anomaly)\nGoal: After Pattern A reveals a bad month, find which segment caused it\nStep 1 - Monthly trend to find anomaly (Pattern A)\nStep 2 - Drill into that month by adding categorical dimension:\n{\n \"groupBy\": [\"sales_person\"],\n \"filters\": [\n { \"dimension\": \"DocDate\", \"operator\": \"BETWEEN\", \"values\": [\"2025-06-01\", \"2025-06-30\"] },\n { \"dimension\": \"org_region\", \"operator\": \"EQ\", \"values\": [\"华东\"] }\n ],\n \"orderBy\": [{ \"field\": \"value\", \"direction\": \"ASC\" }]\n}\n\nPattern D - Multi-Metric Comparison\nGoal: Query two or more metrics in one call to compare side-by-side\n{\n \"metrics\": [\"order_amt_tax_inc\", \"net_sales_amt\"],\n \"groupBy\": [\"DocDate__month\"],\n \"filters\": [{ \"dimension\": \"DocDate\", \"operator\": \"BETWEEN\", \"values\": [\"2025-01-01\", \"2025-12-31\"] }],\n \"orderBy\": [{ \"field\": \"DocDate__month\", \"direction\": \"ASC\" }]\n}\n\nPattern E - Time x Dimension Cross-Analysis\nGoal: See how a dimension behaves across time (e.g., monthly sales by region)\n{\n \"metrics\": [\"order_amt_tax_inc\"],\n \"groupBy\": [\"DocDate__month\", \"org_region\"],\n \"filters\": [{ \"dimension\": \"DocDate\", \"operator\": \"BETWEEN\", \"values\": [\"2025-01-01\", \"2025-06-30\"] }],\n \"orderBy\": [\n { \"field\": \"DocDate__month\", \"direction\": \"ASC\" },\n { \"field\": \"org_region\", \"direction\": \"ASC\" }\n ]\n}\n\nFilter Operator Reference\n| Operator | Applies To | Values Array |\n|----------|------------|--------------|\n| BETWEEN | datetime, number | [min, max] (inclusive) |\n| IN | categorical | [\"v1\", \"v2\", ...] |\n| EQ | any | [\"v\"] |\n| NEQ | any | [\"v\"] |\n| GT / GTE | datetime, number | [\"v\"] |\n| LT / LTE | datetime, number | [\"v\"] |\n| LIKE | string | [\"%pattern%\"] |\n| NOT_NULL | any | [] |\n\nCommon Mistakes to Avoid\n- Using field_name (e.g., \"SlpName\") instead of dim_id (e.g., \"sales_person\")\n- Writing \"DocDate__Month\" (capital M) - always lowercase: \"DocDate__month\"\n- Omitting date filter entirely - ALWAYS include at least one DocDate filter\n- Querying a metric by an unsupported dimension - only use dim_id from supportedDimensions\n- Putting display name in orderBy.field - must match exactly what's in groupBy\n\nRecommended Analysis Flow\nUser question\n |\n ▼\nStep 1: query_metrics_list - find matching metric(s)\n |\n ▼\nStep 2: query_metric_definition - read defaultTimeContext + supportedDimensions\n |\n ▼\nStep 3a: Pattern A (time trend) - get the big picture\n |\n ├─ anomaly found? ──► Step 3c: Pattern C (drill down)\n ├─ user asks \"who\"? ──► Step 3b: Pattern B (dimension breakdown)\n └─ user asks \"compare X and Y\"? ──► Step 3d: Pattern D (multi-metric)\n\nDebug Mode\nSet \"debug\": true to receive executedSqls in the response to verify generated SQL.`;\n\nexport interface CreateMetricsToolParams {\n serverKeys: string[];\n serverDescriptions?: Record<string, string>;\n}\n\nfunction formatSemanticQueryResult(\n datasourceId: string | number,\n datasourceName: string | undefined,\n results: SemanticMetricsQueryResponse['results']\n): string {\n if (results.length === 0) {\n return `No data found for the specified query.\\nData Source: ${datasourceId}${datasourceName ? ` (${datasourceName})` : ''}`;\n }\n\n const lines: string[] = [];\n lines.push(`# 指标查询结果`);\n lines.push(`\\n**数据源**: ${datasourceId}${datasourceName ? ` (${datasourceName})` : ''}`);\n lines.push(`**指标数**: ${results.length}`);\n lines.push(`\\n---\\n`);\n\n for (const metric of results) {\n // 指标标题\n lines.push(`## ${metric.displayName} (${metric.metricName})`);\n lines.push(`\\n- **数据类型**: ${metric.dataType}`);\n lines.push(`- **格式**: ${metric.format}`);\n lines.push(`- **极性**: ${metric.polarity}`);\n lines.push(`- **执行耗时**: ${metric.executionTimeMs}ms`);\n lines.push(`- **返回行数**: ${metric.rowCount}`);\n\n // 数据表格\n if (metric.columns.length > 0 && metric.rows.length > 0) {\n lines.push(`\\n### 数据\\n`);\n \n // 表头\n lines.push(`| ${metric.columns.join(' | ')} |`);\n lines.push(`|${metric.columns.map(() => '---').join('|')}|`);\n \n // 数据行\n for (const row of metric.rows) {\n const rowValues = metric.columns.map(col => {\n const val = row[col];\n return val !== undefined ? String(val) : '';\n });\n lines.push(`| ${rowValues.join(' | ')} |`);\n }\n }\n\n // AI 分析提示\n if (metric.aiHints) {\n lines.push(`\\n### AI 分析建议\\n`);\n lines.push(`- **指标解释**: ${metric.aiHints.valueInterpretation}`);\n \n if (metric.aiHints.thresholds && metric.aiHints.thresholds.length > 0) {\n lines.push(`- **预警阈值**:`);\n for (const t of metric.aiHints.thresholds) {\n lines.push(` - ${t.metric} ${t.operator} ${t.value} (${t.level})`);\n }\n }\n \n if (metric.aiHints.suggestedFollowup && metric.aiHints.suggestedFollowup.length > 0) {\n lines.push(`- **建议后续分析**:`);\n for (const suggestion of metric.aiHints.suggestedFollowup) {\n lines.push(` - ${suggestion}`);\n }\n }\n }\n\n lines.push(`\\n---\\n`);\n }\n\n return lines.join('\\n');\n}\n\nexport const createQuerySemanticMetricDataTool = ({ serverKeys, serverDescriptions }: CreateMetricsToolParams) => {\n const availableServersText = serverKeys.length > 0\n ? `\\n\\nAvailable metrics servers:\\n${serverKeys.map(key => \n `- ${key}${serverDescriptions?.[key] ? `: ${serverDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async (\n {\n serverKey: inputServerKey,\n datasourceId: inputDatasourceId,\n metrics,\n groupBy,\n filters,\n limit,\n }: {\n serverKey?: string;\n datasourceId?: string;\n metrics: string[];\n groupBy?: string[];\n filters?: Array<{\n dimension: string;\n operator: string;\n values: (string | number | boolean)[];\n }>;\n limit?: number;\n },\n _exeConfig: any\n ) => {\n try {\n // 优先从 runConfig 中获取 metricsDataSource 配置\n const runConfig = _exeConfig?.configurable?.runConfig || {};\n const metricsDataSource = runConfig.metricsDataSource;\n \n // 使用 runConfig 中的值覆盖输入参数\n const serverKey = metricsDataSource?.serverKey || inputServerKey;\n const datasourceId = metricsDataSource?.datasourceId || inputDatasourceId;\n\n if (!serverKey) {\n return \"Error: serverKey parameter is required. Available servers: \" + serverKeys.join(', ');\n }\n\n if (!serverKeys.includes(serverKey)) {\n return `Error: serverKey \"${serverKey}\" is not in the allowed list: [${serverKeys.join(', ')}]`;\n }\n\n if (!datasourceId) {\n return \"Error: datasourceId parameter is required.\";\n }\n\n if (!metrics || metrics.length === 0) {\n return \"Error: metrics parameter is required (at least one metric name).\";\n }\n\n const config = metricsServerManager.getConfig(serverKey);\n \n if (config.type !== \"semantic\") {\n return `Error: Server \"${serverKey}\" is not a semantic metrics server. This tool only works with semantic servers.`;\n }\n\n const client = metricsServerManager.getClient(serverKey) as SemanticMetricsClient;\n\n const semanticFilters: SemanticMetricsFilter[] = (filters || []).map(f => ({\n dimension: f.dimension,\n operator: f.operator,\n values: f.values,\n }));\n\n console.log(`[query_semantic_metric_data] Querying: server=${serverKey}, datasource=${datasourceId}, metrics=[${metrics.join(', ')}], groupBy=[${groupBy?.join(', ') || ''}], filters=${JSON.stringify(filters)}, limit=${limit || 1000}`);\n\n const result = await client.semanticQuery({\n datasourceId,\n metrics,\n groupBy,\n filters: semanticFilters,\n limit: limit || 1000,\n });\n\n return formatSemanticQueryResult(\n result.datasourceId,\n result.datasourceName,\n result.results\n );\n } catch (error) {\n return `Error querying semantic metric data: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"query_semantic_metric_data\",\n description: `${QUERY_SEMANTIC_METRIC_DATA_DESCRIPTION}${availableServersText}`,\n schema: z.object({\n serverKey: z\n .string()\n .optional()\n .describe(`Target semantic metrics server. Choose from: ${serverKeys.join(', ')}. Optional if configured in runConfig.metricsDataSource`),\n datasourceId: z\n .string()\n .optional()\n .describe(\"The data source ID to query metrics from. Optional if configured in runConfig.metricsDataSource\"),\n metrics: z\n .array(z.string())\n .describe(\"Array of metric names to query (e.g., ['net_sales_amt', 'gross_profit']).\"),\n groupBy: z\n .array(z.string())\n .optional()\n .describe(\"Optional array of dimensions to group by (e.g., ['DocDate__month', 'CustomerCode']).\"),\n filters: z\n .array(z.object({\n dimension: z.string().describe(\"Dimension/column name to filter on\"),\n operator: z.string().describe(\"Operator (e.g., 'BETWEEN', '=', '>', '<')\"),\n values: z.array(z.union([z.string(), z.number(), z.boolean()])).describe(\"Filter values\"),\n }))\n .optional()\n .describe(\"Optional array of filters to apply to the query.\"),\n limit: z\n .number()\n .optional()\n .describe(\"Maximum number of results to return (default: 1000).\"),\n }),\n }\n );\n};\n","/**\n * Query Tables List Tool\n * Tool for querying available tables from semantic metrics server data sources\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { metricsServerManager, SemanticMetricsClient } from \"./MetricsServerManager\";\n\nconst QUERY_TABLES_LIST_DESCRIPTION = `Query available tables from a semantic metrics server. Returns a list of data tables with their schemas and descriptions. Use this tool to discover what tables are available in the data source.`;\n\nexport interface CreateTablesToolParams {\n serverKeys: string[];\n serverDescriptions?: Record<string, string>;\n}\n\nexport const createQueryTablesListTool = ({ serverKeys, serverDescriptions }: CreateTablesToolParams) => {\n const availableServersText = serverKeys.length > 0\n ? `\\n\\nAvailable metrics servers:\\n${serverKeys.map(key => \n `- ${key}${serverDescriptions?.[key] ? `: ${serverDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async (\n {\n serverKey: inputServerKey,\n datasourceIds,\n }: {\n serverKey?: string;\n datasourceIds?: string[];\n },\n _exeConfig: any\n ) => {\n try {\n // 优先从 runConfig 中获取 metricsDataSource 配置\n const runConfig = _exeConfig?.configurable?.runConfig || {};\n const metricsDataSource = runConfig.metricsDataSource;\n \n // 使用 runConfig 中的值覆盖输入参数\n const serverKey = metricsDataSource?.serverKey || inputServerKey;\n\n if (!serverKey) {\n return \"Error: serverKey parameter is required. Available servers: \" + serverKeys.join(', ');\n }\n\n if (!serverKeys.includes(serverKey)) {\n return `Error: serverKey \"${serverKey}\" is not in the allowed list: [${serverKeys.join(', ')}]`;\n }\n\n const config = metricsServerManager.getConfig(serverKey);\n \n if (config.type !== \"semantic\") {\n return `Error: Server \"${serverKey}\" is not a semantic metrics server. This tool only works with semantic servers.`;\n }\n\n const client = metricsServerManager.getClient(serverKey) as SemanticMetricsClient;\n \n // 优先使用 runConfig 中的 datasourceId\n const targetDatasourceIds = datasourceIds && datasourceIds.length > 0\n ? datasourceIds\n : (metricsDataSource?.datasourceId ? [metricsDataSource.datasourceId] : client.getSelectedDataSources());\n\n if (targetDatasourceIds.length === 0) {\n return `Error: No data sources specified and no default data sources configured for server \"${serverKey}\".`;\n }\n\n interface TableInfo {\n tableName: string;\n displayName: string;\n docType: string;\n docTypeEn: string;\n mainTable?: string;\n lineTable?: string;\n columnCount: number;\n shortDesc: string;\n datasources: string[];\n }\n\n const allTables: Map<string, TableInfo> = new Map();\n\n for (const datasourceId of targetDatasourceIds) {\n try {\n const metaData = await client.getDatasourceMetrics(datasourceId);\n const index = metaData.index;\n\n for (const item of index.tables) {\n const tableKey = item.tableName;\n \n if (allTables.has(tableKey)) {\n const existing = allTables.get(tableKey)!;\n if (!existing.datasources.includes(datasourceId)) {\n existing.datasources.push(datasourceId);\n }\n } else {\n allTables.set(tableKey, {\n tableName: item.tableName,\n displayName: item.displayName,\n docType: item.docType,\n docTypeEn: item.docTypeEn,\n mainTable: item.mainTable,\n lineTable: item.lineTable,\n columnCount: item.columnCount,\n shortDesc: item.shortDesc,\n datasources: [datasourceId],\n });\n }\n }\n } catch (error) {\n console.warn(`Failed to get tables for datasource ${datasourceId}:`, error);\n }\n }\n\n if (allTables.size === 0) {\n return `未在指定的数据源中找到数据表。`;\n }\n\n const lines: string[] = [];\n lines.push(`## 数据表列表(共 ${allTables.size} 个)\\n`);\n\n // 转换为数组并按表名排序\n const sortedTables = Array.from(allTables.values()).sort((a, b) => \n a.tableName.localeCompare(b.tableName)\n );\n\n // 表格头部\n lines.push('| 表名 | 显示名称 | 单据类型 | 列数 | 描述 |');\n lines.push('|------|---------|---------|------|------|');\n\n for (const table of sortedTables) {\n const mainTableInfo = table.mainTable ? ` (主表: ${table.mainTable})` : '';\n const lineTableInfo = table.lineTable ? ` (行表: ${table.lineTable})` : '';\n const tableRelation = mainTableInfo + lineTableInfo;\n \n lines.push(`| ${table.tableName} | ${table.displayName} | ${table.docType}${tableRelation} | ${table.columnCount} | ${table.shortDesc} |`);\n }\n\n return lines.join('\\n');\n } catch (error) {\n return `Error querying tables list: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"query_tables_list\",\n description: `${QUERY_TABLES_LIST_DESCRIPTION}${availableServersText}`,\n schema: z.object({\n serverKey: z\n .string()\n .optional()\n .describe(`Target semantic metrics server. Choose from: ${serverKeys.join(', ')}. Optional if configured in runConfig.metricsDataSource`),\n datasourceIds: z\n .array(z.string())\n .optional()\n .describe(\"Optional array of datasource IDs to query. If not provided, uses the one configured in runConfig.metricsDataSource or all selected datasources.\"),\n }),\n }\n );\n};\n","/**\n * Query Table Definition Tool\n * Tool for getting detailed definition of a specific table\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { metricsServerManager, SemanticMetricsClient } from \"./MetricsServerManager\";\n\nconst QUERY_TABLE_DEFINITION_DESCRIPTION = `Get detailed definition and schema for a specific table from a semantic metrics server. Returns comprehensive information including column definitions, SQL query, and table relationships.`;\n\nexport interface CreateTableToolParams {\n serverKeys: string[];\n serverDescriptions?: Record<string, string>;\n}\n\ninterface TableColumn {\n name: string;\n label: string;\n description?: string;\n type?: string;\n example?: string;\n}\n\ninterface TableDetail {\n tableName: string;\n docType: string;\n docTypeEn: string;\n objTypeCode?: number;\n mainTable?: string;\n lineTable?: string;\n selectSql: string;\n columns: (TableColumn | null)[];\n}\n\nexport const createQueryTableDefinitionTool = ({ serverKeys, serverDescriptions }: CreateTableToolParams) => {\n const availableServersText = serverKeys.length > 0\n ? `\\n\\nAvailable metrics servers:\\n${serverKeys.map(key => \n `- ${key}${serverDescriptions?.[key] ? `: ${serverDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async (\n {\n serverKey: inputServerKey,\n tableName,\n datasourceId: inputDatasourceId,\n }: {\n serverKey?: string;\n tableName: string;\n datasourceId?: string;\n },\n _exeConfig: any\n ) => {\n try {\n // 优先从 runConfig 中获取 metricsDataSource 配置\n const runConfig = _exeConfig?.configurable?.runConfig || {};\n const metricsDataSource = runConfig.metricsDataSource;\n \n // 使用 runConfig 中的值覆盖输入参数\n const serverKey = metricsDataSource?.serverKey || inputServerKey;\n const datasourceId = inputDatasourceId || metricsDataSource?.datasourceId;\n\n if (!serverKey) {\n return \"Error: serverKey parameter is required. Available servers: \" + serverKeys.join(', ');\n }\n\n if (!serverKeys.includes(serverKey)) {\n return `Error: serverKey \"${serverKey}\" is not in the allowed list: [${serverKeys.join(', ')}]`;\n }\n\n if (!tableName) {\n return \"Error: tableName parameter is required.\";\n }\n\n const config = metricsServerManager.getConfig(serverKey);\n \n if (config.type !== \"semantic\") {\n return `Error: Server \"${serverKey}\" is not a semantic metrics server. This tool only works with semantic servers.`;\n }\n\n const client = metricsServerManager.getClient(serverKey) as SemanticMetricsClient;\n \n const targetDatasourceIds = datasourceId \n ? [datasourceId]\n : client.getSelectedDataSources();\n\n if (targetDatasourceIds.length === 0) {\n return `Error: No datasourceId specified and no default data sources configured for server \"${serverKey}\".`;\n }\n\n let foundTable: TableDetail | null = null;\n let foundDatasourceId: string | null = null;\n\n for (const dsId of targetDatasourceIds) {\n try {\n const metaData = await client.getDatasourceMetrics(dsId);\n const tableDetail = metaData.tablesDetails?.find((t: { tableName: string }) => t.tableName === tableName) as TableDetail | undefined;\n if (tableDetail) {\n foundTable = tableDetail;\n foundDatasourceId = dsId;\n break;\n }\n } catch (error) {\n console.warn(`Failed to get table definition for datasource ${dsId}:`, error);\n }\n }\n\n if (!foundTable) {\n return `Table \"${tableName}\" not found in the specified data sources.`;\n }\n\n const lines: string[] = [];\n \n // 标题\n lines.push(`# ${foundTable.tableName}`);\n lines.push('');\n \n // 基本信息\n lines.push(`## 基本信息`);\n lines.push('');\n lines.push(`- **表名**: ${foundTable.tableName}`);\n lines.push(`- **单据类型**: ${foundTable.docType}`);\n lines.push(`- **单据类型(英文)**: ${foundTable.docTypeEn}`);\n if (foundTable.objTypeCode) {\n lines.push(`- **对象类型代码**: ${foundTable.objTypeCode}`);\n }\n if (foundTable.mainTable) {\n lines.push(`- **主表**: ${foundTable.mainTable}`);\n }\n if (foundTable.lineTable) {\n lines.push(`- **行表**: ${foundTable.lineTable}`);\n }\n if (foundDatasourceId) {\n lines.push(`- **数据源ID**: ${foundDatasourceId}`);\n }\n lines.push('');\n \n // 列定义\n if (foundTable.columns && foundTable.columns.length > 0) {\n const validColumns = foundTable.columns.filter((col): col is TableColumn => col !== null);\n lines.push(`## 列定义 (${validColumns.length} 列)`);\n lines.push('');\n lines.push('| 列名 | 标签 | 类型 | 示例值 |');\n lines.push('|------|------|------|--------|');\n for (const col of validColumns) {\n const type = col.type || '-';\n const example = col.example || '-';\n lines.push(`| ${col.name} | ${col.label} | ${type} | ${example} |`);\n }\n lines.push('');\n }\n \n // SQL 查询\n if (foundTable.selectSql) {\n lines.push(`## SQL 查询`);\n lines.push('');\n lines.push('```sql');\n lines.push(foundTable.selectSql);\n lines.push('```');\n lines.push('');\n }\n\n return lines.join('\\n');\n } catch (error) {\n return `Error querying table definition: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"query_table_definition\",\n description: `${QUERY_TABLE_DEFINITION_DESCRIPTION}${availableServersText}`,\n schema: z.object({\n serverKey: z\n .string()\n .optional()\n .describe(`Target semantic metrics server. Choose from: ${serverKeys.join(', ')}. Optional if configured in runConfig.metricsDataSource`),\n tableName: z\n .string()\n .describe(\"The name of the table to get definition for.\"),\n datasourceId: z\n .string()\n .optional()\n .describe(\"Optional specific datasource ID to search in. If not provided, uses the one configured in runConfig.metricsDataSource or searches all selected datasources.\"),\n }),\n }\n );\n};\n","/**\n * Execute SQL Query Tool\n * Tool for executing custom SQL queries against semantic metrics server\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { metricsServerManager, SemanticMetricsClient } from \"./MetricsServerManager\";\nimport type { ExecuteSqlQueryResponse } from \"@axiom-lattice/protocols\";\n\nconst EXECUTE_SQL_QUERY_DESCRIPTION = `Execute Custom SQL Query - Advanced Data Analysis Tool\n\nUse this tool when you need to perform complex queries that cannot be achieved through the standard semantic metric query interface.\n\nWhen to Use This Tool:\n- When you need custom aggregations, calculations, or joins\n- When the standard metric query patterns don't meet your requirements\n- When you need to query raw table data with custom filters\n- When you want to perform complex analytical queries (e.g., window functions, CTEs)\n\nWhen NOT to Use This Tool:\n- For simple metric queries - use query_semantic_metric_data instead\n- When you haven't identified the correct datasource yet - use list_metrics_datasources first\n\nPrerequisites:\n1. Call list_metrics_datasources to get available datasource IDs\n2. Call query_tables_list to see available tables and their structures\n3. Call query_table_definition to understand table columns before writing SQL\n\nSQL Query Guidelines:\n- Use named parameters with :paramName syntax (e.g., :year, :category)\n- Provide parameter values in the params object\n- Always use proper table and column names from table definitions\n- Include appropriate WHERE clauses to limit data\n- Use LIMIT to prevent returning too many rows\n\nExample:\n{\n \"serverKey\": \"production_metrics\",\n \"datasourceId\": \"1\",\n \"customSql\": \"SELECT \\\\\"Code\\\\\" AS period, SUM(\\\\\"LineTotal\\\\\") AS revenue FROM \\\\\"MTC_VW_SalesRevenueCost\\\\\" WHERE \\\\\"Category\\\\\" = :year GROUP BY \\\\\"Code\\\\\" ORDER BY \\\\\"Code\\\\\" ASC\",\n \"params\": {\n \"year\": \"2024\"\n },\n \"limit\": 1000\n}`;\n\nexport interface CreateMetricsToolParams {\n serverKeys: string[];\n serverDescriptions?: Record<string, string>;\n}\n\nexport const createExecuteSqlQueryTool = ({ serverKeys, serverDescriptions }: CreateMetricsToolParams) => {\n const availableServersText = serverKeys.length > 0\n ? `\\n\\nAvailable metrics servers:\\n${serverKeys.map(key => \n `- ${key}${serverDescriptions?.[key] ? `: ${serverDescriptions[key]}` : ''}`\n ).join('\\n')}`\n : '';\n\n return tool(\n async (\n {\n serverKey: inputServerKey,\n datasourceId: inputDatasourceId,\n customSql,\n params,\n limit,\n }: {\n serverKey?: string;\n datasourceId?: string;\n customSql: string;\n params?: Record<string, string | number | boolean>;\n limit?: number;\n },\n _exeConfig: any\n ) => {\n try {\n // 优先从 runConfig 中获取 metricsDataSource 配置\n const runConfig = _exeConfig?.configurable?.runConfig || {};\n const metricsDataSource = runConfig.metricsDataSource;\n \n // 使用 runConfig 中的值覆盖输入参数\n const serverKey = metricsDataSource?.serverKey || inputServerKey;\n const datasourceId = metricsDataSource?.datasourceId || inputDatasourceId;\n\n if (!serverKey) {\n return \"Error: serverKey parameter is required. Available servers: \" + serverKeys.join(', ');\n }\n\n if (!serverKeys.includes(serverKey)) {\n return `Error: serverKey \"${serverKey}\" is not in the allowed list: [${serverKeys.join(', ')}]`;\n }\n\n if (!datasourceId) {\n return \"Error: datasourceId parameter is required.\";\n }\n\n if (!customSql || customSql.trim().length === 0) {\n return \"Error: customSql parameter is required and cannot be empty.\";\n }\n\n const config = metricsServerManager.getConfig(serverKey);\n \n if (config.type !== \"semantic\") {\n return `Error: Server \"${serverKey}\" is not a semantic metrics server. This tool only works with semantic servers.`;\n }\n\n const client = metricsServerManager.getClient(serverKey) as SemanticMetricsClient;\n\n const result = await client.executeSqlQuery({\n datasourceId,\n customSql,\n params,\n limit: limit || 1000,\n });\n\n // Return as JSON string\n return JSON.stringify(result, null, 2);\n } catch (error) {\n return `Error executing SQL query: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"execute_sql_query\",\n description: `${EXECUTE_SQL_QUERY_DESCRIPTION}${availableServersText}`,\n schema: z.object({\n serverKey: z\n .string()\n .optional()\n .describe(`Target semantic metrics server. Choose from: ${serverKeys.join(', ')}. Optional if configured in runConfig.metricsDataSource`),\n datasourceId: z\n .string()\n .optional()\n .describe(\"The data source ID to execute SQL against. Optional if configured in runConfig.metricsDataSource\"),\n customSql: z\n .string()\n .describe(\"Custom SQL query string with named parameters (e.g., :year, :category). Use double quotes for identifiers.\"),\n params: z\n .record(z.union([z.string(), z.number(), z.boolean()]))\n .optional()\n .describe(\"Optional parameters for the SQL query. Keys should match the :paramName placeholders in customSql.\"),\n limit: z\n .number()\n .optional()\n .describe(\"Maximum number of results to return (default: 1000).\"),\n }),\n }\n );\n};\n","/**\n * Code Execution Tool (code_eval)\n *\n * Executes code in the sandbox for supported languages (Python, JavaScript).\n * Requires a sandbox to be connected (e.g. via params.connectedSandbox when\n * building the agent). Uses the sandbox's code.executeCode API to run the\n * code in isolation.\n */\n\nimport z from \"zod\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { tool } from \"langchain\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst CODE_EVAL_DESCRIPTION = `Execute code in Python or JavaScript runtime.\n\nArgs:\n code: Code to execute\n language: Programming language ('python', 'javascript')\n\nReturns:\n Dict containing output, errors, and execution details`;\n\n\n\n\n\nexport const createCodeEvalTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(async (\n input: { language: \"python\" | \"javascript\"; code: string; timeout_sec?: number },\n exe_config: any\n ) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel })\n\n const result = await sandbox.code.executeCode({\n language: input.language,\n code: input.code,\n timeout: 300,\n });\n\n if (!result.ok) {\n const err = result.error as { content?: { message?: string, errors?: string[] } };\n return `Error executing ${input.language} code: ${err?.content?.message + (err?.content?.errors ? `\\n${err?.content?.errors.join(\"\\n\")}` : \"\")}`;\n }\n\n const data = result.body?.data;\n if (!data) {\n return \"Error: No response data from sandbox code execution.\";\n }\n\n const { stdout = \"\", stderr = \"\", exit_code, traceback } = data;\n const parts: string[] = [];\n\n if (stdout) {\n parts.push(`stdout:\\n${stdout}`);\n }\n if (stderr) {\n parts.push(`stderr:\\n${stderr}`);\n }\n if (traceback && traceback.length > 0) {\n parts.push(`traceback:\\n${traceback.join(\"\\n\")}`);\n }\n parts.push(`exit_code: ${exit_code ?? \"—\"}`);\n\n return parts.length > 0 ? parts.join(\"\\n\\n\") : `exit_code: ${exit_code ?? 0}`;\n } catch (e) {\n return `Error: ${e instanceof Error ? e.message : String(e)}`;\n }\n }, {\n name: \"execute_code\",\n description: CODE_EVAL_DESCRIPTION,\n schema: z.object({\n language: z\n .enum([\"python\", \"javascript\"])\n .describe(\"Programming language: 'python' or 'javascript'\"),\n code: z.string().describe(\"Code to execute\"),\n\n }),\n },);\n\n}","/**\n * SandboxLatticeManager\n *\n * Sandbox Lattice manager for registering and managing sandbox services\n * Supports creating, deleting, and managing sandbox instances\n */\n\nimport { SandboxClient } from \"@agent-infra/sandbox\";\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport { RunSandboxConfig, SandboxManagerProtocol } from \"./SandboxManagerProtocol\";\nimport { normalizeSandboxName } from \"./utils\";\n\n\n\n/**\n * Default implementation of SandboxManagerProtocol\n * Manages sandboxes using SandboxClient instances stored in memory\n */\nclass DefaultSandboxManager implements SandboxManagerProtocol {\n private sandboxes: Map<string, SandboxClient> = new Map();\n /**\n * Track in-flight sandbox creation promises by normalized sandbox name.\n * This ensures that concurrent calls with the same name share the same Promise\n * and we do not trigger multiple creations for the same sandbox.\n */\n private creatingSandboxes: Map<string, Promise<SandboxClient>> = new Map();\n private baseURL: string;\n\n constructor(baseURL: string = \"http://localhost:8080\") {\n this.baseURL = baseURL;\n }\n\n getBaseURL(): string {\n return this.baseURL;\n }\n\n async createSandbox(sandboxName: string): Promise<SandboxClient> {\n\n\n if (sandboxName === \"global\") {\n const client = new SandboxClient({ baseUrl: `${this.baseURL}/sandbox/global`, environment: \"\" });\n this.sandboxes.set(\"global\", client);\n return client;\n }\n\n\n // Normalize sandbox name to be RFC 1123 compliant\n const normalizedName = normalizeSandboxName(sandboxName);\n\n // If sandbox client already exists, return it directly.\n const existingClient = this.sandboxes.get(normalizedName);\n if (existingClient) {\n return existingClient;\n }\n\n // If a creation is already in progress for this sandbox, return the same Promise.\n const inFlight = this.creatingSandboxes.get(normalizedName);\n if (inFlight) {\n return inFlight;\n }\n\n // Start a new creation Promise and store it so concurrent callers share it.\n const creationPromise = (async (): Promise<SandboxClient> => {\n const response = await fetch(`${this.baseURL}/api/v1/sandbox`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n name: normalizedName,\n image: \"enterprise-public-cn-beijing.cr.volces.com/vefaas-public/all-in-one-sandbox:latest\"\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to create sandbox: ${response.statusText}`);\n }\n\n const data = await response.json();\n\n // Create a new SandboxClient for the sandbox\n // The baseURL should point to the specific sandbox endpoint\n const sandboxURL = `${this.baseURL}/sandbox/${normalizedName}`;\n const client = new SandboxClient({ baseUrl: sandboxURL, environment: \"\" });\n this.sandboxes.set(normalizedName, client);\n return client;\n })();\n\n // Ensure we clean up the in-flight map when the Promise settles.\n this.creatingSandboxes.set(normalizedName, creationPromise);\n creationPromise\n .catch(() => {\n // On failure, remove the in-flight entry so future calls can retry.\n this.creatingSandboxes.delete(normalizedName);\n })\n .then(() => {\n // On success, also remove the in-flight entry; the client is now in sandboxes map.\n this.creatingSandboxes.delete(normalizedName);\n });\n\n return creationPromise;\n }\n\n async deleteSandbox(sandboxName: string): Promise<void> {\n // Normalize sandbox name to be RFC 1123 compliant\n const normalizedName = normalizeSandboxName(sandboxName);\n\n if (!this.sandboxes.has(normalizedName)) {\n throw new Error(`Sandbox ${sandboxName} (normalized: ${normalizedName}) not found`);\n }\n const response = await fetch(`${this.baseURL}/api/v1/sandbox/${normalizedName}`, {\n method: \"DELETE\",\n });\n if (!response.ok) {\n throw new Error(`Failed to delete sandbox: ${response.statusText}`);\n }\n this.sandboxes.delete(normalizedName);\n }\n\n async getSandbox(sandboxName: string): Promise<SandboxClient> {\n // Normalize sandbox name to be RFC 1123 compliant\n const normalizedName = normalizeSandboxName(sandboxName);\n\n const client = this.sandboxes.get(normalizedName);\n if (!client) {\n throw new Error(`Sandbox ${sandboxName} (normalized: ${normalizedName}) not found`);\n }\n return client;\n }\n\n async listSandboxes(): Promise<SandboxClient[]> {\n return Array.from(this.sandboxes.values());\n }\n\n async getSandboxStatus(sandboxName: string): Promise<string> {\n // Normalize sandbox name to be RFC 1123 compliant\n const normalizedName = normalizeSandboxName(sandboxName);\n\n if (!this.sandboxes.has(normalizedName)) {\n throw new Error(`Sandbox ${sandboxName} (normalized: ${normalizedName}) not found`);\n }\n // Try to get context to check if sandbox is active\n try {\n const client = this.sandboxes.get(normalizedName)!;\n const context = await client.sandbox.getContext();\n return context.ok ? \"active\" : \"inactive\";\n } catch {\n return \"unknown\";\n }\n }\n async getSandboxFromConfig(config: RunSandboxConfig): Promise<SandboxClient> {\n if (config.isolatedLevel === \"agent\") {\n return this.createSandbox(config.assistant_id);\n } else if (config.isolatedLevel === \"thread\") {\n return this.createSandbox(config.thread_id);\n } else {\n return this.createSandbox(\"global\");\n }\n }\n}\n\n/**\n * SandboxLatticeManager - Singleton sandbox Lattice manager\n * Responsible for registering and managing various sandbox service Lattices\n */\nexport class SandboxLatticeManager extends BaseLatticeManager<SandboxManagerProtocol> {\n private static _instance: SandboxLatticeManager;\n\n /**\n * Get SandboxLatticeManager singleton instance\n */\n public static getInstance(): SandboxLatticeManager {\n if (!SandboxLatticeManager._instance) {\n SandboxLatticeManager._instance = new SandboxLatticeManager();\n }\n return SandboxLatticeManager._instance;\n }\n\n /**\n * Get Lattice type prefix\n */\n protected getLatticeType(): string {\n return \"sandbox_manager\";\n }\n\n /**\n * Register sandbox Lattice\n * @param key Lattice key name\n * @param manager Optional sandbox manager. If not provided, will create a default one.\n * @param baseURL Base URL for sandbox service (used when creating default manager)\n */\n public registerLattice(\n key: string,\n config: { manager?: SandboxManagerProtocol, baseURL?: string }\n ): void {\n const { manager, baseURL } = config;\n // Use provided manager or create default one\n const sandboxManager: SandboxManagerProtocol =\n manager || new DefaultSandboxManager(baseURL);\n\n\n // Call base class register method\n this.register(key, sandboxManager);\n }\n\n /**\n * Get SandboxLattice\n * @param key Lattice key name\n */\n public getSandboxLattice(key: string): SandboxManagerProtocol {\n const sandboxLattice = this.get(key);\n if (!sandboxLattice) {\n throw new Error(`SandboxLattice ${key} not found`);\n }\n return sandboxLattice;\n }\n\n /**\n * Get all Lattices\n */\n public getAllLattices(): SandboxManagerProtocol[] {\n return this.getAll();\n }\n\n /**\n * Check if Lattice exists\n * @param key Lattice key name\n */\n public hasLattice(key: string): boolean {\n return this.has(key);\n }\n\n /**\n * Remove Lattice\n * @param key Lattice key name\n */\n public removeLattice(key: string): boolean {\n return this.remove(key);\n }\n\n /**\n * Clear all Lattices\n */\n public clearLattices(): void {\n this.clear();\n }\n\n /**\n * Get Lattice count\n */\n public getLatticeCount(): number {\n return this.count();\n }\n\n /**\n * Get Lattice key list\n */\n public getLatticeKeys(): string[] {\n return this.keys();\n }\n}\n\n// Export singleton instance\nexport const sandboxLatticeManager =\n SandboxLatticeManager.getInstance();\n\nexport const getSandBoxManager = (key: string = \"default\") => {\n if (!sandboxLatticeManager.hasLattice(key)) {\n throw new Error(`Sandbox ${key} not configured. Ensure the sandbox manager is registered and the agent is built with connectedSandbox.`);\n }\n const sandboxManager = sandboxLatticeManager.getSandboxLattice(key);\n return sandboxManager;\n}","/**\n * Sandbox name normalization utility\n * \n * Normalizes sandbox names to comply with RFC 1123 subdomain naming requirements:\n * - Only lowercase alphanumeric characters, '-' or '.'\n * - Must start and end with an alphanumeric character\n * - No underscores or other special characters\n */\n\n/**\n * Normalize a sandbox name to be RFC 1123 compliant\n * \n * @param name - The sandbox name to normalize\n * @returns Normalized sandbox name that complies with RFC 1123 subdomain rules\n * \n * @example\n * normalizeSandboxName(\"sandbox_agent\") // returns \"sandbox-agent\"\n * normalizeSandboxName(\"My-Sandbox\") // returns \"my-sandbox\"\n * normalizeSandboxName(\"test.sandbox\") // returns \"test.sandbox\"\n * normalizeSandboxName(\"_invalid_\") // returns \"invalid\"\n */\nexport function normalizeSandboxName(name: string): string {\n if (!name || typeof name !== \"string\") {\n throw new Error(\"Sandbox name must be a non-empty string\");\n }\n\n // Convert to lowercase\n let normalized = name.toLowerCase();\n\n // Replace underscores with hyphens\n normalized = normalized.replace(/_/g, \"-\");\n\n // Remove any characters that are not alphanumeric, hyphen, or dot\n normalized = normalized.replace(/[^a-z0-9.-]/g, \"\");\n\n // Remove leading/trailing dots and hyphens (must start/end with alphanumeric)\n normalized = normalized.replace(/^[.-]+|[.-]+$/g, \"\");\n\n // Replace consecutive dots or hyphens with a single hyphen\n normalized = normalized.replace(/[.-]{2,}/g, \"-\");\n\n // Ensure it doesn't start or end with a dot or hyphen after cleanup\n normalized = normalized.replace(/^[.-]+|[.-]+$/g, \"\");\n\n // If the result is empty, throw an error\n if (!normalized) {\n throw new Error(\n `Sandbox name \"${name}\" cannot be normalized to a valid RFC 1123 subdomain name`\n );\n }\n\n // Ensure it starts and ends with alphanumeric\n // If it doesn't start with alphanumeric, prepend 'sandbox-'\n if (!/^[a-z0-9]/.test(normalized)) {\n normalized = `sandbox-${normalized}`;\n }\n\n // If it doesn't end with alphanumeric, append '-0'\n if (!/[a-z0-9]$/.test(normalized)) {\n normalized = `${normalized}-0`;\n }\n\n // Final validation: ensure it matches RFC 1123 pattern\n // Pattern: [a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\n const rfc1123Pattern = /^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$/;\n \n if (!rfc1123Pattern.test(normalized)) {\n // If still invalid, create a safe fallback\n normalized = normalized\n .replace(/[^a-z0-9-]/g, \"-\") // Replace any remaining invalid chars with hyphen\n .replace(/^-+|-+$/g, \"\") // Remove leading/trailing hyphens\n .replace(/-{2,}/g, \"-\"); // Replace consecutive hyphens\n \n // Ensure it starts and ends with alphanumeric\n if (!/^[a-z0-9]/.test(normalized)) {\n normalized = `sandbox-${normalized}`;\n }\n if (!/[a-z0-9]$/.test(normalized)) {\n normalized = `${normalized}0`;\n }\n }\n\n return normalized;\n}\n\n/**\n * Validate if a sandbox name is RFC 1123 compliant\n * \n * @param name - The sandbox name to validate\n * @returns true if the name is valid, false otherwise\n */\nexport function isValidSandboxName(name: string): boolean {\n if (!name || typeof name !== \"string\") {\n return false;\n }\n\n const rfc1123Pattern = /^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$/;\n return rfc1123Pattern.test(name.toLowerCase());\n}\n","/**\n * Code File Execution Tool (code_execute_file)\n *\n * Executes a code file from the sandbox filesystem. Only supports Python (.py) and JavaScript (.js, .mjs) files.\n * Other file types are not supported. The tool reads the file content from the sandbox and executes it\n * using the sandbox's code execution API. Language is automatically inferred from file extension.\n */\n\nimport z from \"zod\";\nimport { tool, type StructuredTool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\nimport * as path from \"path\";\n\nconst CODE_EXECUTE_FILE_DESCRIPTION = `Execute a code file from the sandbox filesystem. Only supports Python (.py) and JavaScript (.js, .mjs) files. Other file types are not supported. The tool reads the file content and executes it in an isolated sandbox environment. Language is automatically inferred from the file extension. Output is returned via stdout; errors appear in stderr and traceback.`;\n\nfunction inferLanguageFromPath(filePath: string): \"python\" | \"javascript\" | null {\n const ext = path.extname(filePath).toLowerCase();\n if (ext === \".py\") {\n return \"python\";\n } else if (ext === \".js\" || ext === \".mjs\") {\n return \"javascript\";\n }\n return null;\n}\n\nexport const createCodeExecuteFileTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }): StructuredTool => {\n return tool(\n async (input: { file_path: string }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const context = await sandbox.sandbox.getContext();\n if (!context.ok) {\n return `Error: ${context.error}`;\n }\n const homeDir = context.body?.home_dir;\n const resolvedFilePath = path.join(homeDir, input.file_path);\n\n const language = inferLanguageFromPath(input.file_path);\n if (!language) {\n return `Error: Unsupported file type. This tool only supports Python (.py) and JavaScript (.js, .mjs) files.`;\n }\n\n const readResult = await sandbox.file.readFile({\n file: resolvedFilePath,\n });\n\n if (!readResult.ok) {\n const err = readResult.error as { content?: { message?: string } };\n return `Error reading file '${input.file_path}': ${err?.content?.message ?? JSON.stringify(readResult.error)}`;\n }\n\n const fileContent = readResult.body?.data?.content;\n if (fileContent === undefined || fileContent === null) {\n return `Error: File '${input.file_path}' is empty or could not be read.`;\n }\n\n const result = await sandbox.code.executeCode({\n language: language,\n code: fileContent,\n timeout: 300,\n });\n\n if (!result.ok) {\n const err = result.error as { content?: { message?: string } };\n return `Error executing ${language} file '${input.file_path}': ${err?.content?.message ?? JSON.stringify(result.error)}`;\n }\n\n const data = result.body?.data;\n if (!data) {\n return \"Error: No response data from sandbox code execution.\";\n }\n\n const { stdout = \"\", stderr = \"\", exit_code, traceback } = data;\n const parts: string[] = [];\n\n if (stdout) {\n parts.push(`stdout:\\n${stdout}`);\n }\n if (stderr) {\n parts.push(`stderr:\\n${stderr}`);\n }\n if (traceback && traceback.length > 0) {\n parts.push(`traceback:\\n${traceback.join(\"\\n\")}`);\n }\n parts.push(`exit_code: ${exit_code ?? \"—\"}`);\n\n return parts.length > 0 ? parts.join(\"\\n\\n\") : `exit_code: ${exit_code ?? 0}`;\n } catch (e) {\n return `Error: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"execute_code_file\",\n description: CODE_EXECUTE_FILE_DESCRIPTION,\n schema: z.object({\n file_path: z.string().describe(\"Path to the code file to execute (absolute path in sandbox filesystem). Only supports .py (Python) and .js/.mjs (JavaScript) files.\"),\n }),\n }\n );\n};\n","/**\n * Convert to Markdown Tool (convert_to_markdown)\n *\n * Convert a resource described by an http:, https:, file: or data: URI to markdown.\n * This tool fetches or reads content from various URI schemes and converts it to markdown format.\n */\n\nimport z from \"zod\";\nimport { registerToolLattice } from \"../ToolLatticeManager\";\nimport { promises as fs } from \"fs\";\nimport path from \"path\";\nimport { getSandBoxManager } from \"@sandbox_lattice/SandboxLatticeManager\";\n\nconst CONVERT_TO_MARKDOWN_DESCRIPTION = `Convert a resource described by an http:, https:, file: or data: URI to markdown.\n\nArgs:\n uri (str): The URI to convert. Supported schemes:\n - http:// or https://: Fetch content from URL\n - file://: Read content from local file\n - data:: Decode data URI content\n\nReturns:\n str: The content converted to markdown format.`;\n\nregisterToolLattice(\n \"convert_to_markdown\",\n {\n name: \"convert_to_markdown\",\n description: CONVERT_TO_MARKDOWN_DESCRIPTION,\n needUserApprove: false,\n schema: z.object({\n uri: z.string().describe(\"The URI to convert.\"),\n }),\n },\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig(runConfig);\n sandbox\n const result = await sandbox.util.convertToMarkdown({\n uri: input.uri,\n });\n if (!result.ok) {\n return `Error converting to markdown: ${result.error}`;\n }\n return result.body.data;\n } catch (e) {\n return `Error converting to markdown: ${e instanceof Error ? e.message : String(e)}`;\n }\n }\n);","/**\n * Browser Navigate Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_NAVIGATE_DESCRIPTION = `Navigate to a URL.\n\nArgs:\n url (str): The URL to navigate to.\n`;\n\nexport const createBrowserNavigateTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: { url: string }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_navigate\", {\n url: input.url,\n });\n if (!result.ok) {\n return `Error navigating to URL: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Navigated to URL\";\n } catch (e) {\n return `Error navigating to URL: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_navigate\",\n description: BROWSER_NAVIGATE_DESCRIPTION,\n schema: z.object({\n url: z.string().describe(\"The URL to navigate to.\"),\n }),\n }\n );\n};\n","/**\n * Browser Click Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_CLICK_DESCRIPTION = `Click an element on the page, before using the tool, use \\`browser_get_clickable_elements\\` to get the index of the element, but not call \\`browser_get_clickable_elements\\` multiple times.\n\nArgs:\n index (int): Index of the element to click\n`;\n\nexport const createBrowserClickTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: { index: number }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_click\", {\n index: input.index,\n });\n if (!result.ok) {\n return `Error clicking element: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Element clicked successfully\";\n } catch (e) {\n return `Error clicking element: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_click\",\n description: BROWSER_CLICK_DESCRIPTION,\n schema: z.object({\n index: z.number().describe(\"Index of the element to click\"),\n }),\n }\n );\n};\n","/**\n * Browser Get Text Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_GET_TEXT_DESCRIPTION = `Get the text content of the current page.\n\nArgs:\n None\n`;\n\nexport const createBrowserGetTextTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_get_text\", {});\n if (!result.ok) {\n return `Error getting text content: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Text content retrieved\";\n } catch (e) {\n return `Error getting text content: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_get_text\",\n description: BROWSER_GET_TEXT_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Browser Get Markdown Tool\n */\n\nimport z from \"zod\";\nimport { tool, type StructuredTool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_GET_MARKDOWN_DESCRIPTION = `Get the markdown content of the current page.\n\nArgs:\n None\n`;\n\nexport const createBrowserGetMarkdownTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }): StructuredTool => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_get_markdown\", {});\n if (!result.ok) {\n return `Error getting markdown: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content ?? \"Markdown content retrieved\";\n } catch (e) {\n return `Error getting markdown: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_get_markdown\",\n description: BROWSER_GET_MARKDOWN_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Browser Evaluate Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_EVALUATE_DESCRIPTION = `Execute JavaScript in the browser console.\n\nArgs:\n script (str): JavaScript code to execute, () => { /* code */ }\n`;\n\nexport const createBrowserEvaluateTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: { script: string }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_evaluate\", {\n script: input.script,\n });\n if (!result.ok) {\n return `Error executing JavaScript: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"JavaScript executed successfully\";\n } catch (e) {\n return `Error executing JavaScript: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_evaluate\",\n description: BROWSER_EVALUATE_DESCRIPTION,\n schema: z.object({\n script: z.string().describe(\"JavaScript code to execute, () => { /* code */ }\"),\n }),\n }\n );\n};\n","/**\n * Browser Screenshot Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_SCREENSHOT_DESCRIPTION = `Take a screenshot of the current page or a specific element.\n\nArgs:\n name (str): Name for the screenshot\n selector (str): CSS selector for element to screenshot\n index (int): index of the element to screenshot\n width (int): Width in pixels (default: viewport width)\n height (int): Height in pixels (default: viewport height)\n fullPage (bool): Full page screenshot (default: false)\n highlight (bool): Highlight the element\n`;\n\nexport const createBrowserScreenshotTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: {\n name?: string;\n selector?: string;\n index?: number;\n width?: number;\n height?: number;\n fullPage?: boolean;\n highlight?: boolean;\n }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_screenshot\", {\n name: input.name,\n selector: input.selector,\n index: input.index,\n width: input.width,\n height: input.height,\n fullPage: input.fullPage,\n highlight: input.highlight,\n });\n if (!result.ok) {\n return `Error taking screenshot: ${JSON.stringify(result.error.content)}`;\n }\n const lines = [];\n for (const item of result.body?.data?.content ?? []) {\n if (item.type === \"image\") {\n const base64Data = item.data;\n const buffer = Buffer.from(base64Data, \"base64\");\n const screenshotPath = `/home/gem/screenshots/screenshot_${input.name}.png`;\n const uploadResult = await sandbox.file.uploadFile({\n file: buffer,\n path: screenshotPath,\n });\n if (uploadResult.ok) {\n const screenshot_md = [\n \"\",\n \"Screenshot saved!\",\n \"```attachments\",\n JSON.stringify([{ id: screenshotPath, name: `screenshot_${input.name}.png` }]),\n \"```\",\n ].join(\"\\n\");\n lines.push(screenshot_md);\n } else {\n lines.push(`Failed to save screenshot: ${JSON.stringify(uploadResult.error)}`);\n }\n } else {\n lines.push(`${item.text}`);\n }\n }\n return lines.length > 0 ? lines.join(\"\\n\") : \"No Content\";\n } catch (e) {\n return `Error taking screenshot: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_screenshot\",\n description: BROWSER_SCREENSHOT_DESCRIPTION,\n schema: z.object({\n name: z.string().optional().describe(\"Name for the screenshot\"),\n selector: z.string().optional().describe(\"CSS selector for element to screenshot\"),\n index: z.number().optional().describe(\"index of the element to screenshot\"),\n width: z.number().optional().describe(\"Width in pixels (default: viewport width)\"),\n height: z.number().optional().describe(\"Height in pixels (default: viewport height)\"),\n fullPage: z.boolean().optional().describe(\"Full page screenshot (default: false)\"),\n highlight: z.boolean().default(false).describe(\"Highlight the element\"),\n }),\n }\n );\n};\n","/**\n * Browser Scroll Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_SCROLL_DESCRIPTION = `Scroll the page.\n\nArgs:\n amount (int): Pixels to scroll (positive for down, negative for up), if the amount is not provided, scroll to the bottom of the page\n`;\n\nexport const createBrowserScrollTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: { amount?: number }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_scroll\", {\n amount: input.amount,\n });\n if (!result.ok) {\n return `Error scrolling page: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Page scrolled successfully\";\n } catch (e) {\n return `Error scrolling page: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_scroll\",\n description: BROWSER_SCROLL_DESCRIPTION,\n schema: z.object({\n amount: z.number().optional().describe(\"Pixels to scroll (positive for down, negative for up)\"),\n }),\n }\n );\n};\n","/**\n * Browser Form Input Fill Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_FORM_INPUT_FILL_DESCRIPTION = `Fill out an input field, before using the tool, Either 'index' or 'selector' must be provided.\n\nArgs:\n selector (str): CSS selector for input field, priority use index, if index is not provided, use selector\n index (int): Index of the element to fill\n value (str): Value to fill\n clear (bool): Whether to clear existing text before filling\n`;\n\nexport const createBrowserFormInputFillTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: {\n selector?: string;\n index?: number;\n value: string;\n clear?: boolean;\n }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_form_input_fill\", {\n selector: input.selector,\n index: input.index,\n value: input.value,\n clear: input.clear,\n });\n if (!result.ok) {\n return `Error filling input field: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Input field filled successfully\";\n } catch (e) {\n return `Error filling input field: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_form_input_fill\",\n description: BROWSER_FORM_INPUT_FILL_DESCRIPTION,\n schema: z.object({\n selector: z.string().optional().describe(\"CSS selector for input field\"),\n index: z.number().optional().describe(\"Index of the element to fill\"),\n value: z.string().describe(\"Value to fill\"),\n clear: z.boolean().default(false).describe(\"Whether to clear existing text before filling\"),\n }),\n }\n );\n};\n","/**\n * Browser Select Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_SELECT_DESCRIPTION = `Select an element on the page with index, Either 'index' or 'selector' must be provided.\n\nArgs:\n index (int): Index of the element to select\n selector (str): CSS selector for element to select\n value (str): Value to select\n`;\n\nexport const createBrowserSelectTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: {\n index?: number;\n selector?: string;\n value: string;\n }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_select\", {\n index: input.index,\n selector: input.selector,\n value: input.value,\n });\n if (!result.ok) {\n return `Error selecting element: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Element selected successfully\";\n } catch (e) {\n return `Error selecting element: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_select\",\n description: BROWSER_SELECT_DESCRIPTION,\n schema: z.object({\n index: z.number().optional().describe(\"Index of the element to select\"),\n selector: z.string().optional().describe(\"CSS selector for element to select\"),\n value: z.string().describe(\"Value to select\"),\n }),\n }\n );\n};\n","/**\n * Browser Hover Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_HOVER_DESCRIPTION = `Hover an element on the page, Either 'index' or 'selector' must be provided.\n\nArgs:\n index (int): Index of the element to hover\n selector (str): CSS selector for element to hover\n`;\n\nexport const createBrowserHoverTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: { index?: number; selector?: string }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_hover\", {\n index: input.index,\n selector: input.selector,\n });\n if (!result.ok) {\n return `Error hovering element: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Element hovered successfully\";\n } catch (e) {\n return `Error hovering element: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_hover\",\n description: BROWSER_HOVER_DESCRIPTION,\n schema: z.object({\n index: z.number().optional().describe(\"Index of the element to hover\"),\n selector: z.string().optional().describe(\"CSS selector for element to hover\"),\n }),\n }\n );\n};\n","/**\n * Browser Go Back Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_GO_BACK_DESCRIPTION = `Go back to the previous page.\n\nArgs:\n None\n`;\n\nexport const createBrowserGoBackTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_go_back\", {});\n if (!result.ok) {\n return `Error going back: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Went back to previous page\";\n } catch (e) {\n return `Error going back: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_go_back\",\n description: BROWSER_GO_BACK_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Browser Go Forward Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_GO_FORWARD_DESCRIPTION = `Go forward to the next page.\n\nArgs:\n None\n`;\n\nexport const createBrowserGoForwardTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_go_forward\", {});\n if (!result.ok) {\n return `Error going forward: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Went forward to next page\";\n } catch (e) {\n return `Error going forward: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_go_forward\",\n description: BROWSER_GO_FORWARD_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Browser New Tab Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_NEW_TAB_DESCRIPTION = `Open a new tab.\n\nArgs:\n url (str): URL to open in the new tab\n`;\n\nexport const createBrowserNewTabTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: { url: string }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_new_tab\", {\n url: input.url,\n });\n if (!result.ok) {\n return `Error opening new tab: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"New tab opened successfully\";\n } catch (e) {\n return `Error opening new tab: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_new_tab\",\n description: BROWSER_NEW_TAB_DESCRIPTION,\n schema: z.object({\n url: z.string().describe(\"URL to open in the new tab\"),\n }),\n }\n );\n};\n","/**\n * Browser Tab List Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_TAB_LIST_DESCRIPTION = `Get the list of tabs.\n\nArgs:\n None\n`;\n\nexport const createBrowserTabListTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_tab_list\", {});\n if (!result.ok) {\n return `Error getting tab list: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Tab list retrieved successfully\";\n } catch (e) {\n return `Error getting tab list: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_tab_list\",\n description: BROWSER_TAB_LIST_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Browser Switch Tab Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_SWITCH_TAB_DESCRIPTION = `Switch to a specific tab.\n\nArgs:\n index (int): Tab index to switch to\n`;\n\nexport const createBrowserSwitchTabTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: { index: number }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_switch_tab\", {\n index: input.index,\n });\n if (!result.ok) {\n return `Error switching tab: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Tab switched successfully\";\n } catch (e) {\n return `Error switching tab: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_switch_tab\",\n description: BROWSER_SWITCH_TAB_DESCRIPTION,\n schema: z.object({\n index: z.number().describe(\"Tab index to switch to\"),\n }),\n }\n );\n};\n","/**\n * Browser Close Tab Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_CLOSE_TAB_DESCRIPTION = `Close the current tab.\n\nArgs:\n None\n`;\n\nexport const createBrowserCloseTabTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_close_tab\", {});\n if (!result.ok) {\n return `Error closing tab: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Current tab closed successfully\";\n } catch (e) {\n return `Error closing tab: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_close_tab\",\n description: BROWSER_CLOSE_TAB_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Browser Close Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_CLOSE_DESCRIPTION = `Close the browser when the task is done and the browser is not needed anymore.\n\nArgs:\n None\n`;\n\nexport const createBrowserCloseTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_close\", {});\n if (!result.ok) {\n return `Error closing browser: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Browser closed successfully\";\n } catch (e) {\n return `Error closing browser: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_close\",\n description: BROWSER_CLOSE_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Browser Press Key Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_PRESS_KEY_DESCRIPTION = `Press a key on the keyboard.\n\nArgs:\n key (str): Name of the key to press or a character to generate, such as Enter, Tab, Escape, Backspace, Delete, Insert, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, ArrowLeft, ArrowRight, ArrowUp, ArrowDown, PageUp, PageDown, Home, End, ShiftLeft, ShiftRight, ControlLeft, ControlRight, AltLeft, AltRight, MetaLeft, MetaRight, CapsLock, PrintScreen, ScrollLock, Pause, ContextMenu\n`;\n\nexport const createBrowserPressKeyTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: { key: \"Enter\" | \"Tab\" | \"Escape\" | \"Backspace\" | \"Delete\" | \"Insert\" | \"F1\" | \"F2\" | \"F3\" | \"F4\" | \"F5\" | \"F6\" | \"F7\" | \"F8\" | \"F9\" | \"F10\" | \"F11\" | \"F12\" | \"ArrowLeft\" | \"ArrowRight\" | \"ArrowUp\" | \"ArrowDown\" | \"PageUp\" | \"PageDown\" | \"Home\" | \"End\" | \"ShiftLeft\" | \"ShiftRight\" | \"ControlLeft\" | \"ControlRight\" | \"AltLeft\" | \"AltRight\" | \"MetaLeft\" | \"MetaRight\" | \"CapsLock\" | \"PrintScreen\" | \"ScrollLock\" | \"Pause\" | \"ContextMenu\" }, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_press_key\", {\n key: input.key,\n });\n if (!result.ok) {\n return `Error pressing key: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? `Key ${input.key} pressed successfully`;\n } catch (e) {\n return `Error pressing key: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_press_key\",\n description: BROWSER_PRESS_KEY_DESCRIPTION,\n schema: z.object({\n key: z.enum([\n \"Enter\", \"Tab\", \"Escape\", \"Backspace\", \"Delete\", \"Insert\",\n \"F1\", \"F2\", \"F3\", \"F4\", \"F5\", \"F6\", \"F7\", \"F8\", \"F9\", \"F10\", \"F11\", \"F12\",\n \"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", \"ArrowDown\",\n \"PageUp\", \"PageDown\", \"Home\", \"End\",\n \"ShiftLeft\", \"ShiftRight\", \"ControlLeft\", \"ControlRight\",\n \"AltLeft\", \"AltRight\", \"MetaLeft\", \"MetaRight\",\n \"CapsLock\", \"PrintScreen\", \"ScrollLock\", \"Pause\", \"ContextMenu\"\n ]).describe(\"Name of the key to press\"),\n }),\n }\n );\n};\n","/**\n * Browser Read Links Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_READ_LINKS_DESCRIPTION = `Get all links on the current page.\n\nArgs:\n None\n`;\n\nexport const createBrowserReadLinksTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_read_links\", {});\n if (!result.ok) {\n return `Error reading links: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Links retrieved successfully\";\n } catch (e) {\n return `Error reading links: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_read_links\",\n description: BROWSER_READ_LINKS_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Browser Get Clickable Elements Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_GET_CLICKABLE_ELEMENTS_DESCRIPTION = `Get the clickable or hoverable or selectable elements on the current page, don't call this tool multiple times.\n\nArgs:\n None\n`;\n\nexport const createBrowserGetClickableElementsTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_get_clickable_elements\", {});\n if (!result.ok) {\n return `Error getting clickable elements: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Clickable elements retrieved successfully\";\n } catch (e) {\n return `Error getting clickable elements: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_get_clickable_elements\",\n description: BROWSER_GET_CLICKABLE_ELEMENTS_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Browser Get Download List Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_GET_DOWNLOAD_LIST_DESCRIPTION = `Get the list of downloaded files.\n\nArgs:\n None\n`;\n\nexport const createBrowserGetDownloadListTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.mcp.executeMcpTool(\"browser\", \"browser_get_download_list\", {});\n if (!result.ok) {\n return `Error getting download list: ${JSON.stringify(result.error.content)}`;\n }\n return result.body?.data?.content?.map((item: any) => item.text).join(\"\\n\") ?? \"Download list retrieved successfully\";\n } catch (e) {\n return `Error getting download list: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_get_download_list\",\n description: BROWSER_GET_DOWNLOAD_LIST_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Browser Get Info Tool\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getSandBoxManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n\nconst BROWSER_GET_INFO_DESCRIPTION = `Get information about browser, like CDP URL, viewport size, etc.\n\nArgs:\n request (Dict): The incoming request context.\n\nReturns:\n Dict containing browser information including CDP URL, viewport dimensions, and other browser metadata.`;\n\nexport const createBrowserGetInfoTool = ({ isolatedLevel }: { isolatedLevel: IsolatedLevel }) => {\n return tool(\n async (input: any, exe_config: any) => {\n try {\n const runConfig = (exe_config.configurable as any)?.runConfig;\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({ ...runConfig, isolatedLevel });\n const result = await sandbox.browser.getInfo();\n if (!result.ok) {\n return `Error getting browser info: ${result.error}`;\n }\n return JSON.stringify(result.body.data, undefined, 2);\n } catch (e) {\n return `Error getting browser info: ${e instanceof Error ? e.message : String(e)}`;\n }\n },\n {\n name: \"browser_get_info\",\n description: BROWSER_GET_INFO_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Agent Lattice 类型定义\n *\n * 包含Agent Lattice相关的所有类型定义,供其他模块共享使用\n */\n\nimport { z } from \"zod\";\nimport { ModelLattice } from \"@model_lattice/ModelLattice\";\nimport { CompiledStateGraph } from \"@langchain/langgraph\";\nimport {\n AgentType,\n AgentConfig,\n ReactAgentConfig,\n DeepAgentConfig,\n TeamAgentConfig,\n TeamTeammateConfig,\n AgentConfigWithTools,\n GraphBuildOptions,\n hasTools,\n isDeepAgentConfig,\n isTeamAgentConfig,\n getToolsFromConfig,\n getSubAgentsFromConfig,\n MiddlewareType,\n} from \"@axiom-lattice/protocols\";\nimport { ReactAgent } from \"langchain\";\n\n// Re-export types from protocols\nexport {\n AgentType,\n AgentConfig,\n ReactAgentConfig,\n DeepAgentConfig,\n TeamAgentConfig,\n TeamTeammateConfig,\n AgentConfigWithTools,\n GraphBuildOptions,\n hasTools,\n isDeepAgentConfig,\n isTeamAgentConfig,\n getToolsFromConfig,\n getSubAgentsFromConfig,\n};\n\n// Agent客户端类型 - CompiledStateGraph\nexport type AgentClient =\n | CompiledStateGraph<any, any, any, any, any>\n | ReactAgent<any, any, any, any>;\n\n// AgentLattice接口定义\nexport interface AgentLattice {\n config: AgentConfig;\n client?: AgentClient | undefined;\n}\n\n// Middleware configuration\nexport interface MiddlewareConfig {\n id: string;\n type: MiddlewareType;\n name: string;\n description: string;\n enabled: boolean;\n config: Record<string, any>;\n}\n\n// Agent构建参数接口\nexport interface AgentBuildParams {\n middleware?: MiddlewareConfig[];\n skillCategories?: string[];\n tools: Array<{\n key: string;\n definition: any;\n executor: any;\n }>;\n model: ModelLattice;\n subAgents: Array<{\n key: string;\n config: AgentConfig;\n client: AgentClient | undefined;\n }>;\n prompt: string;\n stateSchema?: z.ZodObject<any, any, any, any, any>;\n}\n","import { MemorySaver } from \"@langchain/langgraph\";\nimport { registerCheckpointSaver } from \"./MemoryLatticeManager\";\nconst memory = new MemorySaver();\nregisterCheckpointSaver(\"default\", memory);\n","/**\n * MemoryLatticeManager\n *\n * 记忆Lattice管理器,负责管理和注册检查点保存器\n */\n\nimport { BaseCheckpointSaver } from \"@langchain/langgraph-checkpoint\";\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport { MemoryLatticeProtocol, MemoryType } from \"@axiom-lattice/protocols\";\n\n// Re-export types from protocols\nexport { MemoryType };\n\n/**\n * 记忆Lattice管理器类\n */\nexport class MemoryLatticeManager extends BaseLatticeManager {\n private static instance: MemoryLatticeManager;\n\n // 检查点保存器注册表\n private static checkpointSavers: Map<string, BaseCheckpointSaver> = new Map();\n\n /**\n * 私有构造函数,防止外部直接实例化\n */\n private constructor() {\n super();\n }\n\n /**\n * 获取单例实例\n */\n public static getInstance(): MemoryLatticeManager {\n if (!MemoryLatticeManager.instance) {\n MemoryLatticeManager.instance = new MemoryLatticeManager();\n }\n return MemoryLatticeManager.instance;\n }\n\n /**\n * 获取Lattice类型\n */\n protected getLatticeType(): string {\n return \"memory\";\n }\n\n /**\n * 注册检查点保存器\n * @param key 保存器键名\n * @param saver 检查点保存器实例\n */\n public registerCheckpointSaver(\n key: string,\n saver: BaseCheckpointSaver\n ): void {\n if (MemoryLatticeManager.checkpointSavers.has(key)) {\n console.warn(`检查点保存器 \"${key}\" 已经存在,将会覆盖旧的检查点保存器`);\n }\n\n MemoryLatticeManager.checkpointSavers.set(key, saver);\n }\n\n /**\n * 获取检查点保存器\n * @param key 保存器键名\n */\n public getCheckpointSaver(key: string): BaseCheckpointSaver {\n const saver = MemoryLatticeManager.checkpointSavers.get(key);\n if (!saver) {\n throw new Error(`检查点保存器 \"${key}\" 不存在`);\n }\n return saver;\n }\n\n /**\n * 获取所有已注册的检查点保存器键名\n */\n public getCheckpointSaverKeys(): string[] {\n return Array.from(MemoryLatticeManager.checkpointSavers.keys());\n }\n\n /**\n * 检查检查点保存器是否存在\n * @param key 保存器键名\n */\n public hasCheckpointSaver(key: string): boolean {\n return MemoryLatticeManager.checkpointSavers.has(key);\n }\n\n /**\n * 移除检查点保存器\n * @param key 保存器键名\n */\n public removeCheckpointSaver(key: string): boolean {\n return MemoryLatticeManager.checkpointSavers.delete(key);\n }\n}\n\nexport const getCheckpointSaver = (key: string) =>\n MemoryLatticeManager.getInstance().getCheckpointSaver(key);\n\nexport const registerCheckpointSaver = (\n key: string,\n saver: BaseCheckpointSaver\n) => MemoryLatticeManager.getInstance().registerCheckpointSaver(key, saver);\n","/**\n * State definitions for Deep Agents\n *\n * TypeScript equivalents of the Python state classes using LangGraph's Annotation.Root() pattern.\n * Defines Todo interface and DeepAgentState using MessagesAnnotation as base with proper reducer functions.\n */\n\nimport \"@langchain/langgraph/zod\";\nimport { MessagesZodState } from \"@langchain/langgraph\";\nimport { withLangGraph } from \"@langchain/langgraph/zod\";\nimport { z } from \"zod\";\n\n/**\n * File reducer function that merges file dictionaries\n * Matches the Python file_reducer function behavior exactly\n */\nexport function fileReducer(\n left: Record<string, string> | null | undefined,\n right: Record<string, string> | null | undefined\n): Record<string, string> {\n if (left == null) {\n return right || {};\n } else if (right == null) {\n return left;\n } else {\n return { ...left, ...right };\n }\n}\n\nexport const createReactAgentSchema = (\n schema?: z.ZodObject<any, any, any, any, any>\n) => {\n return schema ? MessagesZodState.extend(schema.shape) : undefined;\n};\n","/**\n * ReAct Agent Graph Builder\n *\n * 实现 ReAct 类型的 Agent Graph 构建\n */\n\nimport { CompiledStateGraph, MessagesZodState } from \"@langchain/langgraph\";\nimport { DynamicTool } from \"@langchain/core/tools\";\nimport { AgentLattice, AgentBuildParams, AgentClient, MiddlewareConfig } from \"../types\";\nimport { AgentGraphBuilder } from \"./AgentGraphBuilder\";\nimport { getToolClient } from \"../../tool_lattice/ToolLatticeManager\";\nimport { createReactAgent } from \"@langchain/langgraph/prebuilt\";\nimport { getCheckpointSaver } from \"@memory_lattice\";\nimport { createReactAgentSchema } from \"./state\";\nimport { createAgent } from \"langchain\";\nimport { sandboxLatticeManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { SandboxFilesystem } from \"../../deep_agent_new/backends/sandboxFiles\";\nimport { createCommonMiddlewares } from \"./commonMiddleware\";\n\nexport class ReActAgentGraphBuilder implements AgentGraphBuilder {\n private createFilesystemBackendFactory(\n middlewareConfigs: MiddlewareConfig[]\n ): ((config: { state: unknown; store?: any }) => Promise<any>) | undefined {\n const filesystemConfig = middlewareConfigs.find(m => m.type === \"filesystem\");\n\n if (!filesystemConfig || !filesystemConfig.enabled) {\n return undefined;\n }\n\n const isolatedLevel = filesystemConfig.config?.isolatedLevel || \"global\";\n\n return async (config: { state: unknown, workspaceId?: string, projectId?: string }) => {\n const { workspaceId, projectId } = config;\n let sandboxName = \"global\";\n\n if (isolatedLevel === \"agent\") {\n sandboxName = \"agent\";\n } else if (isolatedLevel === \"thread\") {\n sandboxName = \"thread\";\n }\n\n const sandboxManager = sandboxLatticeManager.getSandboxLattice(\"default\");\n if (!sandboxManager) {\n throw new Error(\"Sandbox manager not found\");\n }\n\n return new SandboxFilesystem({\n sandboxInstance: await sandboxManager.createSandbox(sandboxName),\n workingDirectory: workspaceId && projectId ? `/${workspaceId}/${projectId}` : \"/\"\n });\n };\n }\n\n private createMiddlewares(middlewareConfigs: MiddlewareConfig[]) {\n return createCommonMiddlewares(middlewareConfigs);\n }\n\n /**\n * 构建ReAct Agent Graph\n *\n * @param agentLattice Agent Lattice对象\n * @param params Agent构建参数\n * @returns 返回CompiledGraph对象\n */\n build(agentLattice: AgentLattice, params: AgentBuildParams): AgentClient {\n const tools = params.tools\n .map((t) => {\n const tool = getToolClient(t.key);\n return tool;\n })\n .filter((tool) => tool !== undefined);\n\n const stateSchema = createReactAgentSchema(params.stateSchema);\n\n const middlewareConfigs = params.middleware || [];\n const filesystemBackend = this.createFilesystemBackendFactory(middlewareConfigs);\n const middlewares = createCommonMiddlewares(middlewareConfigs, filesystemBackend);\n\n return createAgent({\n model: params.model,\n tools: tools,\n systemPrompt: params.prompt,\n name: agentLattice.config.name,\n checkpointer: getCheckpointSaver(\"default\"),\n stateSchema: stateSchema as any,\n middleware: middlewares as any,\n });\n }\n}\n","/**\n * SandboxFilesystem: A sandboxed filesystem backend that connects to a remote sandbox via SDK.\n *\n * This backend provides a secure, isolated filesystem environment by connecting to a remote\n * sandbox service through the @agent-infra/sandbox SDK. It implements the BackendProtocol\n * interface and delegates all file operations to the remote sandbox.\n *\n * Features:\n * - Remote sandbox connection via HTTP API\n * - Virtual path support (all paths start with /)\n * - Path traversal prevention\n * - Full BackendProtocol implementation\n */\n\nimport { SandboxClient } from \"@agent-infra/sandbox\";\nimport * as path from \"path\";\nimport micromatch from \"micromatch\";\nimport type {\n BackendProtocol,\n EditResult,\n FileData,\n FileInfo,\n GrepMatch,\n WriteResult,\n} from \"./protocol.js\";\nimport {\n checkEmptyContent,\n formatContentWithLineNumbers,\n performStringReplacement,\n grepMatchesFromFiles,\n} from \"./utils.js\";\n\n/**\n * Sandboxed filesystem backend that connects to a remote sandbox service.\n *\n * All file operations are delegated to the remote sandbox via the SDK.\n * Paths are treated as virtual absolute paths (starting with /).\n */\nexport class SandboxFilesystem implements BackendProtocol {\n private sandbox: SandboxClient;\n private maxFileSizeBytes: number;\n private workingDirectory: string;\n private baseURL: string;\n private homeDir: string;\n\n /**\n * Create a new SandboxFilesystem instance.\n *\n * @param options - Configuration options\n * @param options.baseURL - Base URL of the sandbox service (default: 'http://localhost:8080')\n * @param options.maxFileSizeMb - Maximum file size in MB (default: 10)\n * @param options.sandboxInstance - Optional Sandbox instance (if provided, baseURL is ignored)\n */\n constructor(\n options: {\n baseURL?: string;\n workingDirectory?: string;\n maxFileSizeMb?: number;\n sandboxInstance?: SandboxClient;\n } = {}\n ) {\n const {\n baseURL = \"http://localhost:8080\",\n workingDirectory = \"/\",\n maxFileSizeMb = 10,\n sandboxInstance,\n } = options;\n\n this.sandbox = sandboxInstance || new SandboxClient({ baseUrl: baseURL, environment: \"\" });\n this.sandbox.mcp.listMcpServers().then((servers) => {\n\n });\n this.sandbox.mcp.listMcpTools(\"browser\").then((tools) => {\n console.log(tools);\n });\n\n // this.sandbox.sandbox.getContext().then((context) => {\n // if (!context.ok) {\n // console.error(context.error);\n // } else {\n // console.log(context?.body);\n // }\n // });\n this.baseURL = baseURL;\n this.maxFileSizeBytes = maxFileSizeMb * 1024 * 1024;\n this.workingDirectory = workingDirectory;\n this.homeDir = \"/home/gem\";\n }\n private resolvePath(virtualPath: string): string {\n return path.join(this.homeDir, this.workingDirectory, virtualPath);\n }\n\n /**\n * Convert a real filesystem path to a virtual path.\n *\n * @param realPath - Real filesystem path\n * @returns Virtual path starting with /\n */\n private toVirtualPath(realPath: string): string {\n const rootPath = path.join(this.homeDir, this.workingDirectory);\n const relative = path.relative(rootPath, realPath);\n const normalized = relative.split(path.sep).join(\"/\");\n return \"/\" + normalized;\n }\n\n /**\n * List files and directories in the specified directory (non-recursive).\n *\n * @param dirPath - Virtual directory path (must start with /)\n * @returns List of FileInfo objects for files and directories directly in the directory.\n * Directories have a trailing / in their path and is_dir=true.\n */\n async lsInfo(dirPath: string): Promise<FileInfo[]> {\n try {\n const resolvedPath = this.resolvePath(dirPath);\n\n const result = await this.sandbox.file.listPath({\n path: resolvedPath,\n recursive: false,\n show_hidden: false,\n max_depth: 0,\n include_size: false,\n include_permissions: false,\n sort_by: \"name\",\n sort_desc: false,\n });\n if (!result.ok) {\n throw result.error;\n }\n const files: FileInfo[] = result.body?.data?.files?.map((file) => ({\n path: this.toVirtualPath(file.path),\n is_dir: file.is_directory,\n size: file.size,\n modified_at: file.modified_time\n })) || [];\n return files;\n } catch (e: any) {\n console.error(`Error listing files in ${dirPath}:`, e);\n return [];\n }\n }\n\n /**\n * Read file content with line numbers.\n *\n * @param filePath - Virtual file path (must start with /)\n * @param offset - Line offset to start reading from (0-indexed)\n * @param limit - Maximum number of lines to read\n * @returns Formatted file content with line numbers, or error message\n */\n async read(\n filePath: string,\n offset: number = 0,\n limit: number = 10000\n ): Promise<string> {\n try {\n const resolvedPath = this.resolvePath(filePath);\n\n let content: string;\n const result = await this.sandbox.file.readFile({\n file: resolvedPath,\n start_line: offset,\n end_line: limit,\n });\n if (!result.ok) {\n throw result.error;\n }\n content = result.body?.data?.content || \"\";\n return content;\n\n } catch (e: any) {\n return `Error: File '${filePath}' not found`;\n }\n }\n\n /**\n * Read file content as raw FileData.\n *\n * @param filePath - Virtual file path (must start with /)\n * @returns Raw file content as FileData\n */\n async readRaw(filePath: string): Promise<FileData> {\n try {\n const content = await this.read(filePath);\n return {\n content: content.split(\"\\n\"),\n created_at: new Date().toISOString(),\n modified_at: new Date().toISOString(),\n };\n\n } catch (e: any) {\n throw new Error(`Error reading file '${filePath}': ${e.message}`);\n }\n\n }\n\n /**\n * Create a new file with content.\n * Returns WriteResult. External storage sets filesUpdate=null.\n *\n * @param filePath - Virtual file path (must start with /)\n * @param content - File content as string\n * @returns WriteResult with error populated on failure\n */\n async write(filePath: string, content: string): Promise<WriteResult> {\n try {\n\n const resolvedPath = this.resolvePath(filePath);\n // const mkdirResult = await this.sandbox.shell.execCommand({\n // command: `mkdir -p \"$(dirname \"${resolvedPath}\")\"`\n // })\n // if (!mkdirResult.ok) {\n // console.error(mkdirResult.error);\n // throw mkdirResult.error\n // }\n const result = await this.sandbox.file.writeFile({\n file: resolvedPath,\n content: content,\n \"encoding\": \"utf-8\",\n \"append\": false,\n // sudo: true\n });\n if (!result.ok) {\n console.error(result.error);\n throw result.error\n }\n\n return {\n path: filePath,\n filesUpdate: {\n [filePath]: {\n content: content.split(\"\\n\"),\n created_at: new Date().toISOString(),\n modified_at: new Date().toISOString(),\n }\n }\n }\n } catch (e: any) {\n throw new Error(`Error writing file '${filePath}': ${e.message}`);\n }\n }\n\n /**\n * Edit a file by replacing string occurrences.\n * Returns EditResult. External storage sets filesUpdate=null.\n *\n * @param filePath - Virtual file path (must start with /)\n * @param oldString - String to find and replace\n * @param newString - Replacement string\n * @param replaceAll - If true, replace all occurrences (default: false)\n * @returns EditResult with error, path, filesUpdate, and occurrences\n */\n async edit(\n filePath: string,\n oldString: string,\n newString: string,\n replaceAll: boolean = false\n ): Promise<EditResult> {\n try {\n const resolvedPath = this.resolvePath(filePath);\n const result = await this.sandbox.file.strReplaceEditor({\n command: \"str_replace\",\n path: resolvedPath,\n old_str: oldString,\n new_str: newString,\n replace_mode: replaceAll ? \"ALL\" : \"FIRST\",\n });\n if (!result.ok) {\n throw result.error;\n }\n return {\n path: filePath,\n filesUpdate: null,\n }\n }\n catch (e: any) {\n throw new Error(`Error editing file '${filePath}': ${e.message}`);\n }\n }\n\n /**\n * Structured search results or error string for invalid input.\n *\n * Searches file contents for a regex pattern within the sandbox.\n *\n * @param pattern - Regex pattern to search for\n * @param searchPath - Base path to search from (default: \"/\")\n * @param glob - Optional glob pattern to filter files (e.g., \"*.py\")\n * @returns List of GrepMatch objects or error string for invalid regex\n */\n async grepRaw(\n pattern: string,\n searchPath: string | null = \"/\",\n glob: string | null = null\n ): Promise<GrepMatch[] | string> {\n // Resolve base path\n let baseFull: string;\n baseFull = this.resolvePath(searchPath || \"/\");\n\n // Use fast-glob to recursively find all files\n const result = await this.sandbox.file.findFiles({\n path: baseFull,\n glob: glob || \"**/*\"\n })\n\n if (!result.ok) {\n throw result.error;\n }\n const filePaths = result.body?.data?.files || [];\n\n const matches: GrepMatch[] = [];\n\n // Iterate through each file and search for matches\n for (const absolutePath of filePaths) {\n // Read file content as FileData\n const fileData = await this.sandbox.file.searchInFile({\n file: absolutePath,\n regex: pattern,\n });\n if (!fileData.ok) {\n continue;\n }\n\n const matchesData = fileData.body?.data?.matches || [];\n const matchLines = fileData.body?.data?.line_numbers || [];\n matchesData.forEach((match, index) => {\n matches.push({\n path: this.toVirtualPath(absolutePath),\n line: matchLines[index],\n text: match,\n });\n })\n }\n return matches;\n\n }\n\n /**\n * Structured glob matching returning FileInfo objects.\n *\n * @param pattern - Glob pattern (e.g., `*.py`, `**\\/*.ts`)\n * @param searchPath - Base path to search from (default: \"/\")\n * @returns List of FileInfo objects matching the pattern\n */\n async globInfo(\n pattern: string,\n searchPath: string = \"/\"\n ): Promise<FileInfo[]> {\n if (pattern.startsWith(\"/\")) {\n pattern = pattern.substring(1);\n }\n\n const resolvedSearchPath = this.resolvePath(searchPath);\n // Use fast-glob to recursively find all files\n const result = await this.sandbox.file.findFiles({\n path: resolvedSearchPath,\n glob: pattern || \"**/*\"\n })\n\n if (!result.ok) {\n throw result.error;\n }\n\n const results: FileInfo[] = [];\n for (const filePath of result.body?.data?.files || []) {\n const fileInfo = await this.sandbox.file.listPath({\n path: filePath,\n recursive: false,\n show_hidden: false,\n max_depth: 1,\n include_size: false,\n include_permissions: false,\n\n });\n if (!fileInfo.ok) {\n continue;\n }\n results.push({\n path: this.toVirtualPath(filePath),\n is_dir: false,\n size: fileInfo.body?.data?.files?.[0]?.size,\n modified_at: fileInfo.body?.data?.files?.[0]?.modified_time\n })\n }\n\n return results;\n\n\n }\n\n\n}\n","import { AIMessage, createMiddleware, tool, type AgentMiddleware } from \"langchain\";\n\nimport { sandboxLatticeManager } from \"../sandbox_lattice/SandboxLatticeManager\";\nimport { getToolClient } from \"../tool_lattice/ToolLatticeManager\";\nimport { createCodeEvalTool } from \"@tool_lattice/code_eval\";\nimport { createCodeExecuteFileTool } from \"@tool_lattice/code_execute_file\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\n/**\n * Parameters for creating the Skill middleware.\n *\n * This is a TypeScript adaptation of the Python SkillMiddleware:\n *\n * - Injects a formatted list of skills into the system prompt.\n * - Registers a `load_skill`-like tool so the model can fetch\n * detailed information for specific skills when needed.\n */\nexport interface CreateCodeEvalMiddlewareParams {\n isolatedLevel: IsolatedLevel;\n}\n\n/**\n * Create middleware that injects sandbox descriptions into the system prompt.\n *\n * This mirrors the behavior of the Python SandboxMiddleware:\n *\n * - Injects a formatted list of sandboxes into the system prompt.\n * - Registers a `load_sandbox`-like tool so the model can fetch\n * detailed information for specific sandboxes when needed.\n */\nexport function createCodeEvalMiddleware(\n params: CreateCodeEvalMiddlewareParams = { isolatedLevel: \"global\" }\n): AgentMiddleware {\n\n const codeEvalTool = createCodeEvalTool({ isolatedLevel: params.isolatedLevel });\n const codeExecuteFileTool = createCodeExecuteFileTool({ isolatedLevel: params.isolatedLevel });\n return createMiddleware({\n name: \"codeEvalMiddleware\",\n tools: [codeEvalTool, codeExecuteFileTool, getToolClient(\"convert_to_markdown\")],\n\n });\n}\n\n\n","import { createMiddleware, type AgentMiddleware } from \"langchain\";\nimport { IsolatedLevel } from \"@sandbox_lattice/SandboxManagerProtocol\";\nimport {\n createBrowserNavigateTool,\n createBrowserClickTool,\n createBrowserGetTextTool,\n createBrowserGetMarkdownTool,\n createBrowserEvaluateTool,\n createBrowserScreenshotTool,\n createBrowserScrollTool,\n createBrowserFormInputFillTool,\n createBrowserSelectTool,\n createBrowserHoverTool,\n createBrowserGoBackTool,\n createBrowserGoForwardTool,\n createBrowserNewTabTool,\n createBrowserTabListTool,\n createBrowserSwitchTabTool,\n createBrowserCloseTabTool,\n createBrowserCloseTool,\n createBrowserPressKeyTool,\n createBrowserReadLinksTool,\n createBrowserGetClickableElementsTool,\n createBrowserGetDownloadListTool,\n createBrowserGetInfoTool,\n} from \"../tool_lattice/browser\";\n\nexport interface CreateBrowserMiddlewareParams {\n isolatedLevel?: IsolatedLevel;\n}\n\nexport function createBrowserMiddleware(\n params: CreateBrowserMiddlewareParams = { isolatedLevel: \"global\" }\n): AgentMiddleware {\n const isolatedLevel = params.isolatedLevel || \"global\";\n\n const tools = [\n createBrowserNavigateTool({ isolatedLevel }),\n createBrowserClickTool({ isolatedLevel }),\n createBrowserGetTextTool({ isolatedLevel }),\n createBrowserGetMarkdownTool({ isolatedLevel }),\n createBrowserEvaluateTool({ isolatedLevel }),\n createBrowserScreenshotTool({ isolatedLevel }),\n createBrowserScrollTool({ isolatedLevel }),\n createBrowserFormInputFillTool({ isolatedLevel }),\n createBrowserSelectTool({ isolatedLevel }),\n createBrowserHoverTool({ isolatedLevel }),\n createBrowserGoBackTool({ isolatedLevel }),\n createBrowserGoForwardTool({ isolatedLevel }),\n createBrowserNewTabTool({ isolatedLevel }),\n createBrowserTabListTool({ isolatedLevel }),\n createBrowserSwitchTabTool({ isolatedLevel }),\n createBrowserCloseTabTool({ isolatedLevel }),\n createBrowserCloseTool({ isolatedLevel }),\n createBrowserPressKeyTool({ isolatedLevel }),\n createBrowserReadLinksTool({ isolatedLevel }),\n createBrowserGetClickableElementsTool({ isolatedLevel }),\n createBrowserGetDownloadListTool({ isolatedLevel }),\n createBrowserGetInfoTool({ isolatedLevel }),\n ];\n\n return createMiddleware({\n name: \"browserMiddleware\",\n tools,\n });\n}\n","import { createMiddleware, type AgentMiddleware } from \"langchain\";\nimport {\n createListTablesSqlTool,\n createInfoSqlTool,\n createQueryCheckerSqlTool,\n createQuerySqlTool,\n} from \"../tool_lattice/sql\";\n\nexport interface CreateSqlMiddlewareParams {\n databaseKeys?: string[];\n databaseDescriptions?: Record<string, string>;\n}\n\nexport function createSqlMiddleware(\n params: CreateSqlMiddlewareParams\n): AgentMiddleware {\n const { databaseKeys, databaseDescriptions } = params;\n\n if (!databaseKeys || databaseKeys.length === 0) {\n return createMiddleware({\n name: \"sqlMiddleware\",\n tools: [],\n });\n }\n\n const toolParams = {\n databaseKeys,\n databaseDescriptions,\n };\n\n return createMiddleware({\n name: \"sqlMiddleware\",\n tools: [\n createListTablesSqlTool(toolParams),\n createInfoSqlTool(toolParams),\n createQueryCheckerSqlTool(toolParams),\n createQuerySqlTool(toolParams),\n ],\n });\n}\n","import { createMiddleware, type AgentMiddleware } from \"langchain\";\nimport type { Skill, SkillConfig } from \"@axiom-lattice/protocols\";\nimport { skillLatticeManager } from \"../skill_lattice\";\nimport { getStoreLattice } from \"@store_lattice\";\nimport { createLoadSkillsTool, createLoadSkillContentTool, createLoadSkillResourceTool } from \"../tool_lattice/skill\";\n\n\n/**\n * Parameters for creating the Skill middleware.\n */\nexport interface CreateSkillMiddlewareParams {\n /**\n * List of skill IDs to use.\n * Only these skills will be available to the agent.\n * Ignored if readAll is true.\n */\n skills?: string[];\n /**\n * When true, the agent will have access to all available skills automatically.\n * When false or undefined, only the skills in the skills list will be available.\n */\n readAll?: boolean;\n /** Optional heading for the skills section */\n heading?: string;\n /** Optional extra explanatory note appended after the skills list */\n extraNote?: string;\n}\n\nconst DEFAULT_HEADING = \"To better accomplish the user's objective, you can use the following skills to access best practices.\";\nconst DEFAULT_EXTRA_NOTE = `\nyou must:\n1) systematically evaluate every available skill for relevance,\n2) explicitly activate all skills you judge relevant using the \\`load_skill_content\\` tool to get the best practices *before* working on the task, and\n3) implement your solution using the guidance and best practices from those activated skills, explaining trade‑offs when they matter.\n`;\n\n/**\n * Create middleware that injects skill descriptions into the system prompt.\n */\nexport function createSkillMiddleware(\n params: CreateSkillMiddlewareParams = {}\n): AgentMiddleware {\n const {\n skills = [],\n readAll = false,\n heading = DEFAULT_HEADING,\n extraNote = DEFAULT_EXTRA_NOTE,\n } = params;\n\n let latestSkills: Skill[] = [];\n\n return createMiddleware({\n name: \"skillMiddleware\",\n tools: [\n createLoadSkillsTool({ skills: readAll ? undefined : skills }),\n createLoadSkillContentTool(),\n createLoadSkillResourceTool(),\n ],\n beforeAgent: async () => {\n try {\n const storeLattice = getStoreLattice(\"default\", \"skill\");\n const skillStore = storeLattice?.store;\n\n if (readAll) {\n // Load all available skills\n latestSkills = await skillStore.getAllSkills();\n } else if (skills && skills.length > 0) {\n // Load only specified skills\n const skillLatticePromises = skills.map((skillId: string) =>\n skillStore.getSkillById(skillId)\n );\n const skillLattices = await Promise.all(skillLatticePromises);\n latestSkills = skillLattices.filter((skill): skill is Skill => skill !== undefined);\n }\n } catch (error) {\n console.error(\"Error fetching skills:\", error);\n }\n },\n wrapModelCall: (request, handler) => {\n const skillsPrompt = latestSkills\n .map((skill) => `## ${skill.name}\\n${skill.description}`)\n .join(\"\\n\");\n\n const skillsAddendum = `\\n\\n${heading}\\n\\n${skillsPrompt}\\n\\n${extraNote}`;\n\n const existingSystemPrompt = request.systemPrompt ?? \"\";\n const newSystemPrompt =\n existingSystemPrompt.length > 0\n ? `${existingSystemPrompt}${skillsAddendum}`\n : skillsAddendum.trimStart();\n\n return handler({\n ...request,\n systemPrompt: newSystemPrompt,\n });\n },\n });\n}\n\n","/**\n * InMemoryThreadStore\n *\n * In-memory implementation of ThreadStore\n * Provides CRUD operations for thread data stored in memory\n * Threads are organized by assistant ID\n */\n\nimport type {\n ThreadStore,\n Thread,\n CreateThreadRequest,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * In-memory implementation of ThreadStore\n */\nexport class InMemoryThreadStore implements ThreadStore {\n // Map<assistantId, Map<threadId, Thread>>\n private threads: Map<string, Map<string, Thread>> = new Map();\n\n /**\n * Get all threads for a specific assistant\n */\n async getThreadsByAssistantId(assistantId: string): Promise<Thread[]> {\n const assistantThreads = this.threads.get(assistantId);\n if (!assistantThreads) {\n return [];\n }\n return Array.from(assistantThreads.values());\n }\n\n /**\n * Get a thread by ID for a specific assistant\n */\n async getThreadById(\n assistantId: string,\n threadId: string\n ): Promise<Thread | undefined> {\n const assistantThreads = this.threads.get(assistantId);\n if (!assistantThreads) {\n return undefined;\n }\n return assistantThreads.get(threadId);\n }\n\n /**\n * Create a new thread for an assistant\n */\n async createThread(\n assistantId: string,\n threadId: string,\n data: CreateThreadRequest\n ): Promise<Thread> {\n const now = new Date();\n const thread: Thread = {\n id: threadId,\n assistantId,\n metadata: data.metadata || {},\n createdAt: now,\n updatedAt: now,\n };\n\n // Initialize assistant's thread map if it doesn't exist\n if (!this.threads.has(assistantId)) {\n this.threads.set(assistantId, new Map());\n }\n\n const assistantThreads = this.threads.get(assistantId)!;\n assistantThreads.set(threadId, thread);\n return thread;\n }\n\n /**\n * Update an existing thread\n */\n async updateThread(\n assistantId: string,\n threadId: string,\n updates: Partial<CreateThreadRequest>\n ): Promise<Thread | null> {\n const assistantThreads = this.threads.get(assistantId);\n if (!assistantThreads) {\n return null;\n }\n\n const existing = assistantThreads.get(threadId);\n if (!existing) {\n return null;\n }\n\n const updated: Thread = {\n ...existing,\n metadata: {\n ...existing.metadata,\n ...(updates.metadata || {}),\n },\n updatedAt: new Date(),\n };\n assistantThreads.set(threadId, updated);\n return updated;\n }\n\n /**\n * Delete a thread by ID\n */\n async deleteThread(assistantId: string, threadId: string): Promise<boolean> {\n const assistantThreads = this.threads.get(assistantId);\n if (!assistantThreads) {\n return false;\n }\n return assistantThreads.delete(threadId);\n }\n\n /**\n * Check if thread exists\n */\n async hasThread(assistantId: string, threadId: string): Promise<boolean> {\n const assistantThreads = this.threads.get(assistantId);\n if (!assistantThreads) {\n return false;\n }\n return assistantThreads.has(threadId);\n }\n\n /**\n * Clear all threads (useful for testing)\n */\n clear(): void {\n this.threads.clear();\n }\n\n /**\n * Get all threads for all assistants (useful for debugging)\n */\n getAllThreads(): Thread[] {\n const allThreads: Thread[] = [];\n for (const assistantThreads of this.threads.values()) {\n allThreads.push(...Array.from(assistantThreads.values()));\n }\n return allThreads;\n }\n}\n","/**\n * InMemoryAssistantStore\n *\n * In-memory implementation of AssistantStore\n * Provides CRUD operations for assistant data stored in memory\n */\n\nimport type {\n AssistantStore,\n Assistant,\n CreateAssistantRequest,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * In-memory implementation of AssistantStore\n */\nexport class InMemoryAssistantStore implements AssistantStore {\n private assistants: Map<string, Assistant> = new Map();\n\n /**\n * Get all assistants\n */\n async getAllAssistants(): Promise<Assistant[]> {\n return Array.from(this.assistants.values());\n }\n\n /**\n * Get assistant by ID\n */\n async getAssistantById(id: string): Promise<Assistant | null> {\n return this.assistants.get(id) || null;\n }\n\n /**\n * Create a new assistant\n */\n async createAssistant(\n id: string,\n data: CreateAssistantRequest\n ): Promise<Assistant> {\n const now = new Date();\n const assistant: Assistant = {\n id,\n name: data.name,\n description: data.description,\n graphDefinition: data.graphDefinition,\n createdAt: now,\n updatedAt: now,\n };\n this.assistants.set(id, assistant);\n return assistant;\n }\n\n /**\n * Update an existing assistant\n */\n async updateAssistant(\n id: string,\n updates: Partial<CreateAssistantRequest>\n ): Promise<Assistant | null> {\n const existing = this.assistants.get(id);\n if (!existing) {\n return null;\n }\n\n const updated: Assistant = {\n ...existing,\n ...updates,\n updatedAt: new Date(),\n };\n this.assistants.set(id, updated);\n return updated;\n }\n\n /**\n * Delete an assistant by ID\n */\n async deleteAssistant(id: string): Promise<boolean> {\n return this.assistants.delete(id);\n }\n\n /**\n * Check if assistant exists\n */\n async hasAssistant(id: string): Promise<boolean> {\n return this.assistants.has(id);\n }\n\n /**\n * Clear all assistants (useful for testing)\n */\n clear(): void {\n this.assistants.clear();\n }\n}\n","/**\n * FileSystemSkillStore\n *\n * Filesystem-based implementation of SkillStore\n * Stores each skill as a Markdown file with YAML frontmatter\n */\n\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport {\n SkillStore,\n Skill,\n CreateSkillRequest,\n} from \"@axiom-lattice/protocols\";\nimport { validateSkillName } from \"../skill_lattice/skillNameValidator\";\n\n/**\n * Parse YAML frontmatter from markdown content\n */\nfunction parseFrontmatter(content: string): {\n frontmatter: Record<string, any>;\n body: string;\n} {\n const frontmatterRegex = /^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n?([\\s\\S]*)$/;\n const match = content.match(frontmatterRegex);\n\n if (!match) {\n console.warn(\"[parseFrontmatter] No frontmatter match found in content\");\n return { frontmatter: {}, body: content };\n }\n\n const frontmatterText = match[1];\n const body = match[2] || \"\";\n\n // Simple YAML parser for basic key-value pairs and nested objects\n const frontmatter: Record<string, any> = {};\n const lines = frontmatterText.split(\"\\n\");\n let currentKey: string | null = null;\n let metadataIndent = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n \n if (!trimmed || trimmed.startsWith(\"#\")) {\n continue;\n }\n\n // Check if this is a nested metadata entry\n const indentMatch = line.match(/^(\\s*)/);\n const indent = indentMatch ? indentMatch[1].length : 0;\n\n if (currentKey === \"metadata\" && indent > metadataIndent) {\n // This is a nested metadata entry\n const colonIndex = trimmed.indexOf(\":\");\n if (colonIndex !== -1) {\n const key = trimmed.substring(0, colonIndex).trim();\n let value = trimmed.substring(colonIndex + 1).trim();\n \n // Remove quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n \n if (!frontmatter.metadata) {\n frontmatter.metadata = {};\n }\n frontmatter.metadata[key] = value;\n }\n continue;\n }\n\n if (currentKey === \"subSkills\" && indent > metadataIndent) {\n // This is a subSkills array item\n if (trimmed.startsWith(\"-\")) {\n let value = trimmed.substring(1).trim();\n \n // Remove quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n \n if (!frontmatter.subSkills) {\n frontmatter.subSkills = [];\n }\n frontmatter.subSkills.push(value);\n }\n continue;\n }\n\n // Reset metadata/subSkills tracking\n if ((currentKey === \"metadata\" || currentKey === \"subSkills\") && indent <= metadataIndent) {\n currentKey = null;\n metadataIndent = 0;\n }\n\n const colonIndex = trimmed.indexOf(\":\");\n if (colonIndex === -1) {\n continue;\n }\n\n const key = trimmed.substring(0, colonIndex).trim();\n let value = trimmed.substring(colonIndex + 1).trim();\n\n // Remove quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n // Handle metadata as nested object\n if (key === \"metadata\") {\n if (value === \"\" || value === \"{}\") {\n // Check if next line starts with indentation (nested metadata)\n if (i + 1 < lines.length) {\n const nextLine = lines[i + 1];\n const nextIndent = nextLine.match(/^(\\s*)/)?.[1].length || 0;\n if (nextIndent > indent) {\n currentKey = \"metadata\";\n metadataIndent = indent;\n frontmatter.metadata = {};\n continue;\n }\n }\n frontmatter[key] = {};\n } else if (value.startsWith(\"{\")) {\n try {\n frontmatter[key] = JSON.parse(value);\n } catch {\n frontmatter[key] = {};\n }\n } else {\n frontmatter[key] = {};\n }\n } else if (key === \"subSkills\") {\n // Handle subSkills as array\n if (value === \"\" || value === \"[]\") {\n // Check if next line starts with indentation (array items)\n if (i + 1 < lines.length) {\n const nextLine = lines[i + 1];\n const nextIndent = nextLine.match(/^(\\s*)/)?.[1].length || 0;\n if (nextIndent > indent && nextLine.trim().startsWith(\"-\")) {\n currentKey = \"subSkills\";\n metadataIndent = indent;\n frontmatter.subSkills = [];\n continue;\n }\n }\n frontmatter[key] = [];\n } else if (value.startsWith(\"[\")) {\n try {\n frontmatter[key] = JSON.parse(value);\n } catch {\n frontmatter[key] = [];\n }\n } else {\n frontmatter[key] = [];\n }\n } else {\n frontmatter[key] = value;\n }\n }\n\n return { frontmatter, body };\n}\n\n/**\n * Generate YAML frontmatter string\n */\nfunction generateFrontmatter(data: {\n name: string;\n description: string;\n license?: string;\n compatibility?: string;\n metadata?: Record<string, string>;\n subSkills?: string[];\n}): string {\n const lines: string[] = [\"---\"];\n\n lines.push(`name: ${data.name}`);\n lines.push(`description: ${data.description}`);\n\n if (data.license) {\n lines.push(`license: ${data.license}`);\n }\n\n if (data.compatibility) {\n lines.push(`compatibility: ${data.compatibility}`);\n }\n\n if (data.metadata && Object.keys(data.metadata).length > 0) {\n // Format metadata as YAML object\n lines.push(\"metadata:\");\n for (const [key, value] of Object.entries(data.metadata)) {\n lines.push(` ${key}: ${value}`);\n }\n }\n\n if (data.subSkills && data.subSkills.length > 0) {\n // Format subSkills as YAML array\n lines.push(\"subSkills:\");\n for (const subSkill of data.subSkills) {\n lines.push(` - ${subSkill}`);\n }\n }\n\n lines.push(\"---\");\n return lines.join(\"\\n\");\n}\n\n/**\n * FileSystemSkillStore options\n */\nexport interface FileSystemSkillStoreOptions {\n /**\n * Root directory path for storing skills\n * Can be absolute or relative path (relative to current working directory)\n * @default \"lattice_store/skills\"\n */\n rootDir?: string;\n}\n\n/**\n * Skill resource metadata\n */\nexport interface SkillResource {\n path: string;\n isDirectory: boolean;\n}\n\n/**\n * Filesystem-based implementation of SkillStore\n */\nexport class FileSystemSkillStore implements SkillStore {\n private rootDir: string;\n\n constructor(options: FileSystemSkillStoreOptions = {}) {\n const defaultPath = \"lattice_store/skills\";\n const providedPath = options.rootDir || defaultPath;\n \n // Resolve path: if absolute, use as-is; if relative, resolve from cwd\n if (path.isAbsolute(providedPath)) {\n this.rootDir = providedPath;\n } else {\n this.rootDir = path.resolve(process.cwd(), providedPath);\n }\n \n // Ensure root directory exists\n this.ensureDirectoryExists().catch((error) => {\n console.error(\"Failed to initialize FileSystemSkillStore:\", error);\n });\n }\n\n /**\n * Ensure the root directory exists\n */\n private async ensureDirectoryExists(): Promise<void> {\n try {\n await fs.access(this.rootDir);\n } catch {\n // Directory doesn't exist, create it\n await fs.mkdir(this.rootDir, { recursive: true });\n }\n }\n\n /**\n * Get directory path for a skill name\n * Name is used as the directory name, and SKILL.md is the fixed filename\n */\n private getSkillDirectoryPath(name: string): string {\n // Name should already be validated, but add safety check\n if (name.includes(\"..\") || name.includes(\"/\") || name.includes(\"\\\\\")) {\n throw new Error(`Invalid skill name: ${name} (contains invalid characters)`);\n }\n return path.join(this.rootDir, name);\n }\n\n /**\n * Get file path for a skill name\n * File is always named SKILL.md inside the name directory\n */\n private getSkillFilePath(name: string): string {\n return path.join(this.getSkillDirectoryPath(name), \"SKILL.md\");\n }\n\n /**\n * Read skill from file\n * Uses name as the directory name and reads SKILL.md from it\n */\n private async readSkillFile(name: string): Promise<Skill | null> {\n await this.ensureDirectoryExists();\n const filePath = this.getSkillFilePath(name);\n\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n const { frontmatter, body } = parseFrontmatter(content);\n\n if (!frontmatter.name || !frontmatter.description) {\n console.warn(\n `Skill file ${name} parsed frontmatter:`,\n JSON.stringify(frontmatter, null, 2)\n );\n console.warn(`Raw frontmatter text (first 200 chars):`, content.substring(0, 200));\n }\n\n // Get file stats for timestamps\n const stats = await fs.stat(filePath);\n\n // Validate required fields\n if (!frontmatter.name || !frontmatter.description) {\n throw new Error(\n `Invalid skill file ${name}: missing required fields (name or description). Frontmatter: ${JSON.stringify(frontmatter)}`\n );\n }\n\n // Ensure name matches directory name\n if (frontmatter.name !== name) {\n throw new Error(\n `Skill name mismatch: directory name is \"${name}\" but frontmatter name is \"${frontmatter.name}\"`\n );\n }\n\n return {\n id: name, // id equals name (name is used for path addressing)\n name: frontmatter.name,\n description: frontmatter.description,\n license: frontmatter.license,\n compatibility: frontmatter.compatibility,\n metadata: frontmatter.metadata || {},\n content: body.trim() || undefined,\n subSkills: Array.isArray(frontmatter.subSkills) ? frontmatter.subSkills : undefined,\n createdAt: stats.birthtime,\n updatedAt: stats.mtime,\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n console.warn(`Skill file not found: ${filePath}`);\n return null;\n }\n // Re-throw with more context\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to read skill file ${filePath}: ${errorMessage}`);\n }\n }\n\n /**\n * Write skill to file\n * Creates directory with name and writes SKILL.md inside it\n */\n private async writeSkillFile(skill: Skill): Promise<void> {\n await this.ensureDirectoryExists();\n \n // Ensure id equals name (name is used for path addressing)\n const skillName = skill.name;\n const skillDir = this.getSkillDirectoryPath(skillName);\n const filePath = this.getSkillFilePath(skillName);\n\n // Create directory if it doesn't exist\n try {\n await fs.mkdir(skillDir, { recursive: true });\n } catch (error) {\n // Directory might already exist, ignore\n }\n\n const frontmatter = generateFrontmatter({\n name: skillName,\n description: skill.description,\n license: skill.license,\n compatibility: skill.compatibility,\n metadata: skill.metadata,\n subSkills: skill.subSkills,\n });\n\n const body = skill.content || \"\";\n const content = body\n ? `${frontmatter}\\n${body}`\n : `${frontmatter}\\n`;\n\n await fs.writeFile(filePath, content, \"utf-8\");\n }\n\n /**\n * Get all skills\n */\n async getAllSkills(): Promise<Skill[]> {\n await this.ensureDirectoryExists();\n\n try {\n const entries = await fs.readdir(this.rootDir, { withFileTypes: true });\n\n const skills: Skill[] = [];\n for (const entry of entries) {\n // Only process directories\n if (entry.isDirectory()) {\n const skillName = entry.name;\n try {\n const skill = await this.readSkillFile(skillName);\n if (skill) {\n skills.push(skill);\n } else {\n console.warn(\n `Failed to load skill \"${skillName}\": readSkillFile returned null`\n );\n }\n } catch (error) {\n console.error(\n `Error loading skill \"${skillName}\" from ${this.getSkillFilePath(skillName)}:`,\n error instanceof Error ? error.message : String(error)\n );\n // Continue processing other skills instead of failing completely\n }\n }\n }\n\n return skills.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n console.warn(\n `Skills directory not found: ${this.rootDir}`\n );\n return [];\n }\n throw error;\n }\n }\n\n /**\n * Get skill by ID\n * ID should equal name (name is used for path addressing)\n */\n async getSkillById(id: string): Promise<Skill | null> {\n // Use id as name (they should be the same)\n return this.readSkillFile(id);\n }\n\n /**\n * Create a new skill\n * id should equal name (name is used for path addressing)\n */\n async createSkill(id: string, data: CreateSkillRequest): Promise<Skill> {\n await this.ensureDirectoryExists();\n\n // Validate name format\n validateSkillName(data.name);\n\n // Validate that id equals name\n if (id !== data.name) {\n throw new Error(\n `Skill id \"${id}\" must equal name \"${data.name}\" (name is used for path addressing)`\n );\n }\n\n // Check if skill already exists\n const existing = await this.getSkillById(id);\n if (existing) {\n // Update existing skill\n return this.updateSkill(id, data) as Promise<Skill>;\n }\n\n const now = new Date();\n const skill: Skill = {\n id: data.name, // id equals name\n name: data.name,\n description: data.description,\n license: data.license,\n compatibility: data.compatibility,\n metadata: data.metadata || {},\n content: data.content,\n subSkills: data.subSkills,\n createdAt: now,\n updatedAt: now,\n };\n\n await this.writeSkillFile(skill);\n return skill;\n }\n\n /**\n * Update an existing skill\n */\n async updateSkill(\n id: string,\n updates: Partial<CreateSkillRequest>\n ): Promise<Skill | null> {\n const skill = await this.readSkillFile(id);\n if (!skill) {\n return null;\n }\n\n // If name is being updated, validate it\n if (updates.name !== undefined) {\n validateSkillName(updates.name);\n \n // If name changes, we need to move the directory\n if (updates.name !== skill.name) {\n const oldDir = this.getSkillDirectoryPath(skill.name);\n const newDir = this.getSkillDirectoryPath(updates.name);\n \n // Move directory\n try {\n await fs.rename(oldDir, newDir);\n } catch (error) {\n throw new Error(\n `Failed to rename skill directory from \"${skill.name}\" to \"${updates.name}\": ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n\n const updatedSkill: Skill = {\n ...skill,\n name: updates.name ?? skill.name,\n id: updates.name ?? skill.id, // id equals name\n description: updates.description ?? skill.description,\n license: updates.license ?? skill.license,\n compatibility: updates.compatibility ?? skill.compatibility,\n metadata: updates.metadata ?? skill.metadata,\n content: updates.content !== undefined ? updates.content : skill.content,\n subSkills: updates.subSkills !== undefined ? updates.subSkills : skill.subSkills,\n updatedAt: new Date(),\n };\n\n await this.writeSkillFile(updatedSkill);\n return updatedSkill;\n }\n\n /**\n * Delete a skill by ID\n * Deletes the entire directory (name is the directory name)\n */\n async deleteSkill(id: string): Promise<boolean> {\n await this.ensureDirectoryExists();\n const skillDir = this.getSkillDirectoryPath(id);\n\n try {\n // Remove the entire directory\n await fs.rm(skillDir, { recursive: true, force: true });\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n }\n\n /**\n * Check if skill exists\n */\n async hasSkill(id: string): Promise<boolean> {\n const skill = await this.getSkillById(id);\n return skill !== null;\n }\n\n /**\n * Search skills by metadata\n */\n async searchByMetadata(\n metadataKey: string,\n metadataValue: string\n ): Promise<Skill[]> {\n const allSkills = await this.getAllSkills();\n return allSkills.filter((skill) => {\n return (\n skill.metadata &&\n skill.metadata[metadataKey] === metadataValue\n );\n });\n }\n\n /**\n * Filter skills by compatibility\n */\n async filterByCompatibility(compatibility: string): Promise<Skill[]> {\n const allSkills = await this.getAllSkills();\n return allSkills.filter((skill) => {\n return skill.compatibility === compatibility;\n });\n }\n\n /**\n * Filter skills by license\n */\n async filterByLicense(license: string): Promise<Skill[]> {\n const allSkills = await this.getAllSkills();\n return allSkills.filter((skill) => {\n return skill.license === license;\n });\n }\n\n /**\n * Get sub-skills of a parent skill\n */\n async getSubSkills(parentSkillName: string): Promise<Skill[]> {\n const parentSkill = await this.getSkillById(parentSkillName);\n if (!parentSkill || !parentSkill.subSkills || parentSkill.subSkills.length === 0) {\n return [];\n }\n\n const subSkills: Skill[] = [];\n for (const subSkillName of parentSkill.subSkills) {\n const subSkill = await this.getSkillById(subSkillName);\n if (subSkill) {\n subSkills.push(subSkill);\n }\n }\n\n return subSkills;\n }\n\n /**\n * List all resources in a skill's resources directory\n * @param skillName The skill name\n * @returns Array of resource paths relative to resources/ directory\n */\n async listSkillResources(skillName: string): Promise<string[]> {\n const skillDir = this.getSkillDirectoryPath(skillName);\n const resourcesDir = path.join(skillDir, \"resources\");\n\n try {\n const entries = await fs.readdir(resourcesDir, { withFileTypes: true, recursive: true });\n const resources: string[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n const fullPath = path.join(entry.path, entry.name);\n const relativePath = path.relative(resourcesDir, fullPath);\n resources.push(relativePath.replace(/\\\\/g, \"/\"));\n }\n }\n\n return resources.sort();\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n }\n\n /**\n * Load a specific resource from a skill's resources directory\n * @param skillName The skill name\n * @param resourcePath Path to the resource relative to resources/ directory\n * @returns The resource content as string\n */\n async loadSkillResource(skillName: string, resourcePath: string): Promise<string | null> {\n const skillDir = this.getSkillDirectoryPath(skillName);\n const resourcesDir = path.join(skillDir, \"resources\");\n const fullPath = path.join(resourcesDir, resourcePath);\n\n // Security check: ensure the path is within resources directory\n const resolvedPath = path.resolve(fullPath);\n const resolvedResourcesDir = path.resolve(resourcesDir);\n if (!resolvedPath.startsWith(resolvedResourcesDir)) {\n throw new Error(`Invalid resource path: ${resourcePath}`);\n }\n\n try {\n const content = await fs.readFile(fullPath, \"utf-8\");\n return content;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n }\n}\n","/**\n * Skill name validator\n * Validates skill names according to the specification:\n * - 1-64 characters\n * - Lowercase alphanumeric with single hyphen separators\n * - Not start or end with -\n * - Not contain consecutive --\n * - Match the directory name that contains SKILL.md\n * - Regex: ^[a-z0-9]+(-[a-z0-9]+)*$\n */\n\nconst SKILL_NAME_REGEX = /^[a-z0-9]+(-[a-z0-9]+)*$/;\nconst MIN_LENGTH = 1;\nconst MAX_LENGTH = 64;\n\n/**\n * Validate skill name\n * @param name Skill name to validate\n * @returns true if valid, false otherwise\n */\nexport function isValidSkillName(name: string): boolean {\n if (!name || typeof name !== \"string\") {\n return false;\n }\n\n // Check length\n if (name.length < MIN_LENGTH || name.length > MAX_LENGTH) {\n return false;\n }\n\n // Check regex pattern\n return SKILL_NAME_REGEX.test(name);\n}\n\n/**\n * Validate skill name and throw error if invalid\n * @param name Skill name to validate\n * @throws Error if name is invalid\n */\nexport function validateSkillName(name: string): void {\n if (!name || typeof name !== \"string\") {\n throw new Error(\"Skill name is required and must be a string\");\n }\n\n if (name.length < MIN_LENGTH || name.length > MAX_LENGTH) {\n throw new Error(\n `Skill name must be between ${MIN_LENGTH} and ${MAX_LENGTH} characters`\n );\n }\n\n if (!SKILL_NAME_REGEX.test(name)) {\n throw new Error(\n \"Skill name must be lowercase alphanumeric with single hyphen separators, \" +\n \"not start or end with -, and not contain consecutive --. \" +\n \"Pattern: ^[a-z0-9]+(-[a-z0-9]+)*$\"\n );\n }\n}\n","/**\n * InMemoryWorkspaceStore\n *\n * In-memory implementation of WorkspaceStore\n * Provides CRUD operations for workspace data stored in memory\n */\n\nimport type {\n WorkspaceStore,\n Workspace,\n CreateWorkspaceRequest,\n UpdateWorkspaceRequest,\n} from \"@axiom-lattice/protocols\";\n\nexport class InMemoryWorkspaceStore implements WorkspaceStore {\n private workspaces: Map<string, Workspace> = new Map();\n\n constructor() {\n this.initDefaultData();\n }\n\n private initDefaultData() {\n const defaultTenantId = \"default\";\n const now = new Date();\n \n // Add default workspace\n const defaultWorkspace: Workspace = {\n id: \"default-workspace\",\n tenantId: defaultTenantId,\n name: \"默认工作区\",\n description: \"系统默认工作区\",\n storageType: \"sandbox\",\n createdAt: now,\n updatedAt: now,\n };\n this.workspaces.set(`${defaultTenantId}:default-workspace`, defaultWorkspace);\n }\n\n private getKey(tenantId: string, id: string): string {\n return `${tenantId}:${id}`;\n }\n\n async getAllWorkspaces(tenantId: string): Promise<Workspace[]> {\n return Array.from(this.workspaces.values()).filter(\n (w) => w.tenantId === tenantId\n );\n }\n\n async getWorkspaceById(tenantId: string, id: string): Promise<Workspace | null> {\n const key = this.getKey(tenantId, id);\n return this.workspaces.get(key) || null;\n }\n\n async createWorkspace(\n tenantId: string,\n id: string,\n data: CreateWorkspaceRequest\n ): Promise<Workspace> {\n const now = new Date();\n const workspace: Workspace = {\n id,\n tenantId,\n name: data.name,\n description: data.description,\n storageType: data.storageType,\n createdAt: now,\n updatedAt: now,\n };\n const key = this.getKey(tenantId, id);\n this.workspaces.set(key, workspace);\n return workspace;\n }\n\n async updateWorkspace(\n tenantId: string,\n id: string,\n updates: UpdateWorkspaceRequest\n ): Promise<Workspace | null> {\n const key = this.getKey(tenantId, id);\n const existing = this.workspaces.get(key);\n if (!existing) {\n return null;\n }\n\n const updated: Workspace = {\n ...existing,\n ...updates,\n updatedAt: new Date(),\n };\n this.workspaces.set(key, updated);\n return updated;\n }\n\n async deleteWorkspace(tenantId: string, id: string): Promise<boolean> {\n const key = this.getKey(tenantId, id);\n return this.workspaces.delete(key);\n }\n\n clear(): void {\n this.workspaces.clear();\n }\n}\n","/**\n * InMemoryProjectStore\n *\n * In-memory implementation of ProjectStore\n * Provides CRUD operations for project data stored in memory\n */\n\nimport type {\n ProjectStore,\n Project,\n CreateProjectRequest,\n UpdateProjectRequest,\n} from \"@axiom-lattice/protocols\";\n\nexport class InMemoryProjectStore implements ProjectStore {\n private projects: Map<string, Project> = new Map();\n\n constructor() {\n this.initDefaultData();\n }\n\n private initDefaultData() {\n const defaultTenantId = \"default\";\n const defaultWorkspaceId = \"default-workspace\";\n const now = new Date();\n \n // Add default project\n const defaultProject: Project = {\n id: \"default-project\",\n tenantId: defaultTenantId,\n workspaceId: defaultWorkspaceId,\n name: \"默认项目\",\n description: \"系统默认项目\",\n createdAt: now,\n updatedAt: now,\n };\n this.projects.set(`${defaultTenantId}:default-project`, defaultProject);\n }\n\n private getKey(tenantId: string, id: string): string {\n return `${tenantId}:${id}`;\n }\n\n async getProjectsByWorkspace(tenantId: string, workspaceId: string): Promise<Project[]> {\n return Array.from(this.projects.values()).filter(\n (p) => p.tenantId === tenantId && p.workspaceId === workspaceId\n );\n }\n\n async getProjectById(tenantId: string, id: string): Promise<Project | null> {\n const key = this.getKey(tenantId, id);\n return this.projects.get(key) || null;\n }\n\n async createProject(\n tenantId: string,\n workspaceId: string,\n id: string,\n data: CreateProjectRequest\n ): Promise<Project> {\n const now = new Date();\n const project: Project = {\n id,\n tenantId,\n workspaceId,\n name: data.name,\n description: data.description,\n createdAt: now,\n updatedAt: now,\n };\n const key = this.getKey(tenantId, id);\n this.projects.set(key, project);\n return project;\n }\n\n async updateProject(\n tenantId: string,\n id: string,\n updates: UpdateProjectRequest\n ): Promise<Project | null> {\n const key = this.getKey(tenantId, id);\n const existing = this.projects.get(key);\n if (!existing) {\n return null;\n }\n\n const updated: Project = {\n ...existing,\n ...updates,\n updatedAt: new Date(),\n };\n this.projects.set(key, updated);\n return updated;\n }\n\n async deleteProject(tenantId: string, id: string): Promise<boolean> {\n const key = this.getKey(tenantId, id);\n return this.projects.delete(key);\n }\n\n clear(): void {\n this.projects.clear();\n }\n}\n","/**\n * InMemoryDatabaseConfigStore\n *\n * In-memory implementation of DatabaseConfigStore\n * Provides CRUD operations for database configuration data stored in memory\n * \n * Note: This implementation does NOT encrypt passwords - use with caution\n * For production use, prefer PostgreSQLDatabaseConfigStore\n */\n\nimport type {\n DatabaseConfigStore,\n DatabaseConfigEntry,\n CreateDatabaseConfigRequest,\n UpdateDatabaseConfigRequest,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * In-memory implementation of DatabaseConfigStore\n */\nexport class InMemoryDatabaseConfigStore implements DatabaseConfigStore {\n private configs: Map<string, DatabaseConfigEntry> = new Map();\n\n /**\n * Get composite key for storage\n */\n private getKey(tenantId: string, id: string): string {\n return `${tenantId}:${id}`;\n }\n\n /**\n * Get all database configurations for a tenant\n */\n async getAllConfigs(tenantId: string): Promise<DatabaseConfigEntry[]> {\n return Array.from(this.configs.values()).filter(\n (config) => config.tenantId === tenantId\n );\n }\n\n /**\n * Get all database configurations across all tenants\n */\n async getAllConfigsWithoutTenant(): Promise<DatabaseConfigEntry[]> {\n return Array.from(this.configs.values());\n }\n\n /**\n * Get database configuration by ID\n */\n async getConfigById(tenantId: string, id: string): Promise<DatabaseConfigEntry | null> {\n const key = this.getKey(tenantId, id);\n return this.configs.get(key) || null;\n }\n\n /**\n * Get database configuration by business key\n */\n async getConfigByKey(tenantId: string, key: string): Promise<DatabaseConfigEntry | null> {\n const configs = await this.getAllConfigs(tenantId);\n return configs.find((config) => config.key === key) || null;\n }\n\n /**\n * Create a new database configuration\n */\n async createConfig(\n tenantId: string,\n id: string,\n data: CreateDatabaseConfigRequest\n ): Promise<DatabaseConfigEntry> {\n const now = new Date();\n const entry: DatabaseConfigEntry = {\n id,\n tenantId,\n key: data.key,\n config: data.config,\n name: data.name,\n description: data.description,\n createdAt: now,\n updatedAt: now,\n };\n\n const storageKey = this.getKey(tenantId, id);\n this.configs.set(storageKey, entry);\n return entry;\n }\n\n /**\n * Update an existing database configuration\n */\n async updateConfig(\n tenantId: string,\n id: string,\n updates: Partial<UpdateDatabaseConfigRequest>\n ): Promise<DatabaseConfigEntry | null> {\n const key = this.getKey(tenantId, id);\n const existing = this.configs.get(key);\n if (!existing) {\n return null;\n }\n\n const updated: DatabaseConfigEntry = {\n ...existing,\n ...updates,\n config: updates.config ? { ...existing.config, ...updates.config } : existing.config,\n key: updates.key || existing.key,\n name: updates.name !== undefined ? updates.name : existing.name,\n description: updates.description !== undefined ? updates.description : existing.description,\n updatedAt: new Date(),\n };\n\n this.configs.set(key, updated);\n return updated;\n }\n\n /**\n * Delete a database configuration by ID\n */\n async deleteConfig(tenantId: string, id: string): Promise<boolean> {\n const key = this.getKey(tenantId, id);\n return this.configs.delete(key);\n }\n\n /**\n * Check if configuration exists\n */\n async hasConfig(tenantId: string, id: string): Promise<boolean> {\n const key = this.getKey(tenantId, id);\n return this.configs.has(key);\n }\n\n /**\n * Clear all configurations (useful for testing)\n */\n clear(): void {\n this.configs.clear();\n }\n\n /**\n * Clear configurations for a specific tenant\n */\n clearByTenant(tenantId: string): void {\n for (const key of this.configs.keys()) {\n if (key.startsWith(`${tenantId}:`)) {\n this.configs.delete(key);\n }\n }\n }\n}\n","/**\n * InMemoryMetricsServerConfigStore\n *\n * In-memory implementation of MetricsServerConfigStore\n * Provides CRUD operations for metrics server configuration data stored in memory\n */\n\nimport type {\n MetricsServerConfigStore,\n MetricsServerConfigEntry,\n CreateMetricsServerConfigRequest,\n UpdateMetricsServerConfigRequest,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * In-memory implementation of MetricsServerConfigStore\n */\nexport class InMemoryMetricsServerConfigStore implements MetricsServerConfigStore {\n private configs: Map<string, MetricsServerConfigEntry> = new Map();\n\n /**\n * Get composite key for storage\n */\n private getKey(tenantId: string, id: string): string {\n return `${tenantId}:${id}`;\n }\n\n /**\n * Get all metrics server configurations for a tenant\n */\n async getAllConfigs(tenantId: string): Promise<MetricsServerConfigEntry[]> {\n return Array.from(this.configs.values()).filter(\n (config) => config.tenantId === tenantId\n );\n }\n\n /**\n * Get all metrics server configurations across all tenants\n */\n async getAllConfigsWithoutTenant(): Promise<MetricsServerConfigEntry[]> {\n return Array.from(this.configs.values());\n }\n\n /**\n * Get metrics server configuration by ID\n */\n async getConfigById(tenantId: string, id: string): Promise<MetricsServerConfigEntry | null> {\n const key = this.getKey(tenantId, id);\n return this.configs.get(key) || null;\n }\n\n /**\n * Get metrics server configuration by business key\n */\n async getConfigByKey(tenantId: string, key: string): Promise<MetricsServerConfigEntry | null> {\n const configs = await this.getAllConfigs(tenantId);\n return configs.find((config) => config.key === key) || null;\n }\n\n /**\n * Create a new metrics server configuration\n */\n async createConfig(\n tenantId: string,\n id: string,\n data: CreateMetricsServerConfigRequest\n ): Promise<MetricsServerConfigEntry> {\n const now = new Date();\n const entry: MetricsServerConfigEntry = {\n id,\n tenantId,\n key: data.key,\n config: data.config,\n name: data.name,\n description: data.description,\n createdAt: now,\n updatedAt: now,\n };\n\n const storageKey = this.getKey(tenantId, id);\n this.configs.set(storageKey, entry);\n return entry;\n }\n\n /**\n * Update an existing metrics server configuration\n */\n async updateConfig(\n tenantId: string,\n id: string,\n updates: Partial<UpdateMetricsServerConfigRequest>\n ): Promise<MetricsServerConfigEntry | null> {\n const key = this.getKey(tenantId, id);\n const existing = this.configs.get(key);\n if (!existing) {\n return null;\n }\n\n const updated: MetricsServerConfigEntry = {\n ...existing,\n ...updates,\n config: updates.config ? { ...existing.config, ...updates.config } : existing.config,\n key: updates.key || existing.key,\n name: updates.name !== undefined ? updates.name : existing.name,\n description: updates.description !== undefined ? updates.description : existing.description,\n updatedAt: new Date(),\n };\n\n this.configs.set(key, updated);\n return updated;\n }\n\n /**\n * Delete a metrics server configuration by ID\n */\n async deleteConfig(tenantId: string, id: string): Promise<boolean> {\n const key = this.getKey(tenantId, id);\n return this.configs.delete(key);\n }\n\n /**\n * Check if configuration exists\n */\n async hasConfig(tenantId: string, id: string): Promise<boolean> {\n const key = this.getKey(tenantId, id);\n return this.configs.has(key);\n }\n\n /**\n * Clear all configurations (useful for testing)\n */\n clear(): void {\n this.configs.clear();\n }\n\n /**\n * Clear configurations for a specific tenant\n */\n clearByTenant(tenantId: string): void {\n for (const key of this.configs.keys()) {\n if (key.startsWith(`${tenantId}:`)) {\n this.configs.delete(key);\n }\n }\n }\n}\n","import type {\n UserStore,\n User,\n CreateUserRequest,\n UpdateUserRequest,\n} from \"@axiom-lattice/protocols\";\n\nexport class InMemoryUserStore implements UserStore {\n private users: Map<string, User> = new Map();\n\n constructor() {}\n\n async getAllUsers(): Promise<User[]> {\n return Array.from(this.users.values());\n }\n\n async getUserById(id: string): Promise<User | null> {\n return this.users.get(id) || null;\n }\n\n async getUserByEmail(email: string): Promise<User | null> {\n for (const user of this.users.values()) {\n if (user.email === email) {\n return user;\n }\n }\n return null;\n }\n\n async createUser(id: string, data: CreateUserRequest): Promise<User> {\n const now = new Date();\n const user: User = {\n id,\n email: data.email,\n name: data.name,\n status: data.status || \"pending\",\n metadata: data.metadata ?? {},\n createdAt: now,\n updatedAt: now,\n };\n this.users.set(id, user);\n return user;\n }\n\n async updateUser(id: string, updates: UpdateUserRequest): Promise<User | null> {\n const existing = this.users.get(id);\n if (!existing) {\n return null;\n }\n\n const updated: User = {\n ...existing,\n ...updates,\n metadata: updates.metadata ?? existing.metadata,\n updatedAt: new Date(),\n };\n this.users.set(id, updated);\n return updated;\n }\n\n async deleteUser(id: string): Promise<boolean> {\n return this.users.delete(id);\n }\n\n clear(): void {\n this.users.clear();\n }\n}\n","/**\n * InMemoryTenantStore\n *\n * In-memory implementation of TenantStore\n * Provides CRUD operations for tenant data stored in memory\n * Tenant is a top-level entity with single key storage\n */\n\nimport type {\n TenantStore,\n Tenant,\n TenantStatus,\n CreateTenantRequest,\n UpdateTenantRequest,\n} from \"@axiom-lattice/protocols\";\n\nexport class InMemoryTenantStore implements TenantStore {\n private tenants: Map<string, Tenant>;\n\n constructor() {\n this.tenants = new Map();\n this.initDefaultData();\n }\n\n private initDefaultData(): void {\n // Create default tenant for single-tenant setups\n const defaultTenant: Tenant = {\n id: \"default\",\n name: \"Default Tenant\",\n description: \"Default tenant for single-tenant setups\",\n status: \"active\" as TenantStatus,\n metadata: {},\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n this.tenants.set(\"default\", defaultTenant);\n }\n\n async getAllTenants(): Promise<Tenant[]> {\n return Array.from(this.tenants.values());\n }\n\n async getTenantById(id: string): Promise<Tenant | null> {\n return this.tenants.get(id) || null;\n }\n\n async createTenant(id: string, data: CreateTenantRequest): Promise<Tenant> {\n const now = new Date();\n const tenant: Tenant = {\n id,\n name: data.name,\n description: data.description,\n status: data.status || (\"active\" as TenantStatus),\n metadata: data.metadata || {},\n createdAt: now,\n updatedAt: now,\n };\n this.tenants.set(id, tenant);\n return tenant;\n }\n\n async updateTenant(\n id: string,\n updates: UpdateTenantRequest\n ): Promise<Tenant | null> {\n const existing = this.tenants.get(id);\n if (!existing) {\n return null;\n }\n\n const updated: Tenant = {\n ...existing,\n ...updates,\n updatedAt: new Date(),\n };\n this.tenants.set(id, updated);\n return updated;\n }\n\n async deleteTenant(id: string): Promise<boolean> {\n return this.tenants.delete(id);\n }\n\n clear(): void {\n this.tenants.clear();\n this.initDefaultData(); // Re-initialize default tenant\n }\n}\n","import type {\n UserTenantLinkStore,\n UserTenantLink,\n CreateUserTenantLinkRequest,\n UpdateUserTenantLinkRequest,\n} from \"@axiom-lattice/protocols\";\n\nexport class InMemoryUserTenantLinkStore implements UserTenantLinkStore {\n private links: Map<string, UserTenantLink> = new Map();\n\n private getKey(userId: string, tenantId: string): string {\n return `${userId}:${tenantId}`;\n }\n\n async getTenantsByUser(userId: string): Promise<UserTenantLink[]> {\n return Array.from(this.links.values()).filter(\n (link) => link.userId === userId\n );\n }\n\n async getUsersByTenant(tenantId: string): Promise<UserTenantLink[]> {\n return Array.from(this.links.values()).filter(\n (link) => link.tenantId === tenantId\n );\n }\n\n async getLink(userId: string, tenantId: string): Promise<UserTenantLink | null> {\n const key = this.getKey(userId, tenantId);\n return this.links.get(key) || null;\n }\n\n async createLink(data: CreateUserTenantLinkRequest): Promise<UserTenantLink> {\n const link: UserTenantLink = {\n userId: data.userId,\n tenantId: data.tenantId,\n role: data.role || \"member\",\n joinedAt: new Date(),\n metadata: data.metadata ?? {},\n };\n const key = this.getKey(data.userId, data.tenantId);\n this.links.set(key, link);\n return link;\n }\n\n async updateLink(\n userId: string,\n tenantId: string,\n updates: UpdateUserTenantLinkRequest\n ): Promise<UserTenantLink | null> {\n const key = this.getKey(userId, tenantId);\n const existing = this.links.get(key);\n if (!existing) return null;\n\n const updated: UserTenantLink = {\n ...existing,\n ...updates,\n metadata: updates.metadata ?? existing.metadata,\n };\n this.links.set(key, updated);\n return updated;\n }\n\n async deleteLink(userId: string, tenantId: string): Promise<boolean> {\n const key = this.getKey(userId, tenantId);\n return this.links.delete(key);\n }\n\n async hasLink(userId: string, tenantId: string): Promise<boolean> {\n const key = this.getKey(userId, tenantId);\n return this.links.has(key);\n }\n\n clear(): void {\n this.links.clear();\n }\n}\n","/**\n * StoreLatticeManager\n *\n * Store Lattice manager for registering and managing store services\n */\n\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport type {\n ThreadStore,\n AssistantStore,\n SkillStore,\n WorkspaceStore,\n ProjectStore,\n DatabaseConfigStore,\n MetricsServerConfigStore,\n UserStore,\n TenantStore,\n UserTenantLinkStore,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * Store type to store interface mapping\n * Maps store type strings to their corresponding interface types\n */\nexport type StoreTypeMap = {\n thread: ThreadStore;\n assistant: AssistantStore;\n skill: SkillStore;\n workspace: WorkspaceStore;\n project: ProjectStore;\n database: DatabaseConfigStore;\n metrics: MetricsServerConfigStore;\n user: UserStore;\n tenant: TenantStore;\n userTenantLink: UserTenantLinkStore;\n};\n\n/**\n * Store type keys\n */\nexport type StoreType = keyof StoreTypeMap;\n\n/**\n * Store Lattice interface with type safety\n * @template TStoreType - The type of store (e.g., \"thread\")\n */\nexport interface StoreLattice<TStoreType extends StoreType = StoreType> {\n type: TStoreType;\n key: string;\n store: StoreTypeMap[TStoreType];\n}\n\n/**\n * StoreLatticeManager - Singleton store Lattice manager\n * Responsible for registering and managing various store service Lattices\n */\nexport class StoreLatticeManager extends BaseLatticeManager<\n StoreLattice<StoreType>\n> {\n private static _instance: StoreLatticeManager;\n\n /**\n * Get StoreLatticeManager singleton instance\n */\n public static getInstance(): StoreLatticeManager {\n if (!StoreLatticeManager._instance) {\n StoreLatticeManager._instance = new StoreLatticeManager();\n }\n return StoreLatticeManager._instance;\n }\n\n /**\n * Get Lattice type prefix\n */\n protected getLatticeType(): string {\n return \"stores\";\n }\n\n /**\n * Generate composite key from key and type\n * @param key Lattice key name\n * @param type Store type\n * @returns Composite key string\n */\n private getCompositeKey(key: string, type: StoreType): string {\n return `${key}:${type}`;\n }\n\n /**\n * Register store Lattice with type safety\n * Uses composite key (key + type) as unique identifier\n * @param key Lattice key name\n * @param type Store type (e.g., \"thread\")\n * @param store Store implementation instance matching the type\n */\n public registerLattice<TStoreType extends StoreType>(\n key: string,\n type: TStoreType,\n store: StoreTypeMap[TStoreType]\n ): void {\n // Create store Lattice object\n const storeLattice: StoreLattice<TStoreType> = {\n key,\n type,\n store,\n };\n\n // Use composite key (key + type) for registration\n const compositeKey = this.getCompositeKey(key, type);\n this.register(compositeKey, storeLattice as StoreLattice<StoreType>);\n }\n\n /**\n * Get StoreLattice with type safety\n * Uses composite key (key + type) to retrieve the store\n * @param key Lattice key name\n * @param type Expected store type for type checking\n * @returns StoreLattice with typed store\n */\n public getStoreLattice<TStoreType extends StoreType>(\n key: string,\n type: TStoreType\n ): StoreLattice<TStoreType> {\n const compositeKey = this.getCompositeKey(key, type);\n const storeLattice = this.get(compositeKey);\n if (!storeLattice) {\n throw new Error(`StoreLattice ${key}:${type} not found`);\n }\n\n if (storeLattice.type !== type) {\n throw new Error(\n `StoreLattice ${key}:${type} has type \"${storeLattice.type}\", expected \"${type}\"`\n );\n }\n\n return storeLattice as StoreLattice<TStoreType>;\n }\n\n /**\n * Get StoreLattice without type checking (for backward compatibility)\n * @param key Lattice key name\n * @param type Store type\n * @returns StoreLattice (type may be unknown)\n */\n public getStoreLatticeUnsafe(\n key: string,\n type: StoreType\n ): StoreLattice<StoreType> {\n const compositeKey = this.getCompositeKey(key, type);\n const storeLattice = this.get(compositeKey);\n if (!storeLattice) {\n throw new Error(`StoreLattice ${key}:${type} not found`);\n }\n return storeLattice;\n }\n\n /**\n * Get all Lattices\n */\n public getAllLattices(): StoreLattice<StoreType>[] {\n return this.getAll();\n }\n\n /**\n * Check if Lattice exists\n * Uses composite key (key + type) to check existence\n * @param key Lattice key name\n * @param type Store type\n */\n public hasLattice(key: string, type: StoreType): boolean {\n const compositeKey = this.getCompositeKey(key, type);\n return this.has(compositeKey);\n }\n\n /**\n * Remove Lattice\n * Uses composite key (key + type) to remove the store\n * @param key Lattice key name\n * @param type Store type\n */\n public removeLattice(key: string, type: StoreType): boolean {\n const compositeKey = this.getCompositeKey(key, type);\n return this.remove(compositeKey);\n }\n\n /**\n * Clear all Lattices\n */\n public clearLattices(): void {\n this.clear();\n }\n\n /**\n * Get Lattice count\n */\n public getLatticeCount(): number {\n return this.count();\n }\n\n /**\n * Get Lattice key list\n */\n public getLatticeKeys(): string[] {\n return this.keys();\n }\n}\n\n// Export singleton instance\nexport const storeLatticeManager = StoreLatticeManager.getInstance();\n\n// Export convenience methods with type safety\nexport const registerStoreLattice = <TStoreType extends StoreType>(\n key: string,\n type: TStoreType,\n store: StoreTypeMap[TStoreType]\n) => storeLatticeManager.registerLattice(key, type, store);\n\nexport const getStoreLattice = <TStoreType extends StoreType>(\n key: string,\n type: TStoreType\n) => storeLatticeManager.getStoreLattice(key, type);\n\n// Default registration of InMemory stores\nimport { InMemoryThreadStore } from \"./InMemoryThreadStore\";\nimport { InMemoryAssistantStore } from \"./InMemoryAssistantStore\";\nimport { FileSystemSkillStore } from \"./FileSystemSkillStore\";\nimport { InMemoryWorkspaceStore } from \"./InMemoryWorkspaceStore\";\nimport { InMemoryProjectStore } from \"./InMemoryProjectStore\";\nimport { InMemoryDatabaseConfigStore } from \"./InMemoryDatabaseConfigStore\";\nimport { InMemoryMetricsServerConfigStore } from \"./InMemoryMetricsServerConfigStore\";\n\n// Create default instances\nconst defaultThreadStore = new InMemoryThreadStore();\nconst defaultAssistantStore = new InMemoryAssistantStore();\nconst defaultSkillStore = new FileSystemSkillStore();\nconst defaultWorkspaceStore = new InMemoryWorkspaceStore();\nconst defaultProjectStore = new InMemoryProjectStore();\nconst defaultDatabaseConfigStore = new InMemoryDatabaseConfigStore();\nconst defaultMetricsServerConfigStore = new InMemoryMetricsServerConfigStore();\n\n// Register as default stores\nstoreLatticeManager.registerLattice(\"default\", \"thread\", defaultThreadStore);\nstoreLatticeManager.registerLattice(\n \"default\",\n \"assistant\",\n defaultAssistantStore\n);\nstoreLatticeManager.registerLattice(\"default\", \"skill\", defaultSkillStore);\nstoreLatticeManager.registerLattice(\"default\", \"workspace\", defaultWorkspaceStore);\nstoreLatticeManager.registerLattice(\"default\", \"project\", defaultProjectStore);\nstoreLatticeManager.registerLattice(\"default\", \"database\", defaultDatabaseConfigStore);\nstoreLatticeManager.registerLattice(\"default\", \"metrics\", defaultMetricsServerConfigStore);\n\n// Default registration of user/tenant stores\nimport { InMemoryUserStore } from \"./InMemoryUserStore\";\nimport { InMemoryTenantStore } from \"./InMemoryTenantStore\";\nimport { InMemoryUserTenantLinkStore } from \"./InMemoryUserTenantLinkStore\";\n\nconst defaultUserStore = new InMemoryUserStore();\nconst defaultTenantStore = new InMemoryTenantStore();\nconst defaultUserTenantLinkStore = new InMemoryUserTenantLinkStore();\n\nstoreLatticeManager.registerLattice(\"default\", \"user\", defaultUserStore);\nstoreLatticeManager.registerLattice(\"default\", \"tenant\", defaultTenantStore);\nstoreLatticeManager.registerLattice(\"default\", \"userTenantLink\", defaultUserTenantLinkStore);\n","/**\n * Load Skills Tool\n * Loads available skills and returns their metadata\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getStoreLattice } from \"../../store_lattice/StoreLatticeManager\";\n\nconst LOAD_SKILLS_DESCRIPTION = `Load all available skills and return their metadata (name, description, license, compatibility, metadata, and subSkills) without the content. This tool returns skill information including hierarchical relationships (subSkills). Use this to discover what skills are available and their structure.`;\n\nexport interface CreateLoadSkillsToolParams {\n skills?: string[];\n}\n\nexport const createLoadSkillsTool = ({ skills }: CreateLoadSkillsToolParams = {}) => {\n return tool(\n async (_input: Record<string, never>, _exe_config: any) => {\n try {\n const storeLattice = getStoreLattice(\"default\", \"skill\");\n const skillStore = storeLattice.store;\n const allSkills = await skillStore.getAllSkills();\n\n const filteredSkills = skills && skills.length > 0\n ? allSkills.filter((skill) => skills.includes(skill.id))\n : allSkills;\n\n const skillsMeta = filteredSkills.map((skill) => ({\n id: skill.id,\n name: skill.name,\n description: skill.description,\n license: skill.license,\n compatibility: skill.compatibility,\n metadata: skill.metadata,\n subSkills: skill.subSkills,\n }));\n\n return JSON.stringify(skillsMeta, null, 2);\n } catch (error) {\n return `Error loading skills: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"load_skills\",\n description: LOAD_SKILLS_DESCRIPTION,\n schema: z.object({}),\n }\n );\n};\n","/**\n * Load Skill Content Tool\n * Loads a specific skill's content by name and returns its full content\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getStoreLattice } from \"../../store_lattice/StoreLatticeManager\";\n\nconst LOAD_SKILL_CONTENT_DESCRIPTION = `Load a specific skill's content by name and return its full content including markdown body. This tool returns the complete skill content including frontmatter and markdown body. If the skill has resources, they will be listed at the end of the content with instructions on how to access them. Use this tool to get the complete skill content for a skill that you want to use.`;\n\nexport const createLoadSkillContentTool = () => {\n return tool(\n async (input: { skill_name: string }, _exe_config: any) => {\n try {\n const storeLattice = getStoreLattice(\"default\", \"skill\");\n const skillStore = storeLattice.store;\n const skill = await skillStore.getSkillById(input.skill_name);\n\n if (!skill) {\n const allSkills = await skillStore.getAllSkills();\n const availableSkills = allSkills.map((s) => s.name).join(\", \");\n return `Skill \"${input.skill_name}\" not found. Available skills: ${availableSkills}`;\n }\n\n const frontmatter: string[] = [\"---\"];\n frontmatter.push(`name: ${skill.name}`);\n frontmatter.push(`description: ${skill.description}`);\n if (skill.license) {\n frontmatter.push(`license: ${skill.license}`);\n }\n if (skill.compatibility) {\n frontmatter.push(`compatibility: ${skill.compatibility}`);\n }\n if (skill.metadata && Object.keys(skill.metadata).length > 0) {\n frontmatter.push(\"metadata:\");\n for (const [key, value] of Object.entries(skill.metadata)) {\n frontmatter.push(` ${key}: ${value}`);\n }\n }\n if (skill.subSkills && skill.subSkills.length > 0) {\n frontmatter.push(\"subSkills:\");\n for (const subSkill of skill.subSkills) {\n frontmatter.push(` - ${subSkill}`);\n }\n }\n frontmatter.push(\"---\");\n\n const content = skill.content || \"\";\n let result = `${frontmatter.join(\"\\n\")}\\n${content}`;\n\n // Add resources list if available\n const fsStore = skillStore as { listSkillResources?: (id: string) => Promise<string[]> };\n if (fsStore.listSkillResources) {\n try {\n const resources = await fsStore.listSkillResources(input.skill_name);\n if (resources.length > 0) {\n result += \"\\n\\n---\\n\\n**Resources** (use `load_skill_resource` tool to access):\\n\";\n resources.forEach((resource: string) => {\n result += `- ${resource}\\n`;\n });\n }\n } catch {\n // Ignore errors when listing resources\n }\n }\n\n return result;\n } catch (error) {\n return `Error loading skill content: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"load_skill_content\",\n description: LOAD_SKILL_CONTENT_DESCRIPTION,\n schema: z.object({\n skill_name: z.string().describe(\"The name of the skill to load\"),\n }),\n }\n );\n};\n","/**\n * Load Skill Resource Tool\n * Loads a specific resource file from a skill's resources directory\n */\n\nimport z from \"zod\";\nimport { tool } from \"langchain\";\nimport { getStoreLattice } from \"../../store_lattice/StoreLatticeManager\";\n\nconst LOAD_SKILL_RESOURCE_DESCRIPTION = `Load a specific resource file from a skill's resources directory. Use this tool when you need to access template files, example data, or other resources bundled with a skill. The resource paths are listed in the skill content when using the load_skill_content tool.`;\n\nexport const createLoadSkillResourceTool = () => {\n return tool(\n async (input: { skill_name: string; resource_path: string }, _exe_config: any) => {\n try {\n const storeLattice = getStoreLattice(\"default\", \"skill\");\n const skillStore = storeLattice.store;\n\n // Check if store supports resource loading\n const fsStore = skillStore as { loadSkillResource?: (id: string, path: string) => Promise<string | null> };\n if (!fsStore.loadSkillResource) {\n return `Error: This skill store does not support resource loading.`;\n }\n\n const content = await fsStore.loadSkillResource(input.skill_name, input.resource_path);\n\n if (!content) {\n return `Resource \"${input.resource_path}\" not found for skill \"${input.skill_name}\".`;\n }\n\n return content;\n } catch (error) {\n return `Error loading skill resource: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: \"load_skill_resource\",\n description: LOAD_SKILL_RESOURCE_DESCRIPTION,\n schema: z.object({\n skill_name: z.string().describe(\"The name of the skill containing the resource\"),\n resource_path: z.string().describe(\"The path to the resource relative to the skill's resources/ directory\"),\n }),\n }\n );\n};\n","/**\n * Middleware for providing filesystem tools to an agent.\n *\n * Provides ls, read_file, write_file, edit_file, glob, and grep tools with support for:\n * - Pluggable backends (StateBackend, StoreBackend, FilesystemBackend, CompositeBackend)\n * - Tool result eviction for large outputs\n */\n\nimport { createMiddleware, tool, ToolMessage } from \"langchain\";\nimport { Command, isCommand, getCurrentTaskInput } from \"@langchain/langgraph\";\nimport { z as z3 } from \"zod/v3\";\nimport { withLangGraph } from \"@langchain/langgraph/zod\";\nimport type {\n BackendProtocol,\n BackendFactory,\n FileData,\n StateAndStore,\n} from \"../backends/protocol.js\";\nimport { StateBackend } from \"../backends/state.js\";\nimport { sanitizeToolCallId } from \"../backends/utils.js\";\n\n/**\n * Zod v3 schema for FileData (re-export from backends)\n */\nconst FileDataSchema = z3.object({\n content: z3.array(z3.string()),\n created_at: z3.string(),\n modified_at: z3.string(),\n});\n\nexport type { FileData };\n\n/**\n * Merge file updates with support for deletions.\n */\nfunction fileDataReducer(\n left: Record<string, FileData> | undefined,\n right: Record<string, FileData | null>\n): Record<string, FileData> {\n if (left === undefined) {\n const result: Record<string, FileData> = {};\n for (const [key, value] of Object.entries(right)) {\n if (value !== null) {\n result[key] = value;\n }\n }\n return result;\n }\n\n const result = { ...left };\n for (const [key, value] of Object.entries(right)) {\n if (value === null) {\n delete result[key];\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\n/**\n * Shared filesystem state schema.\n * Defined at module level to ensure the same object identity is used across all agents,\n * preventing \"Channel already exists with different type\" errors when multiple agents\n * use createFilesystemMiddleware.\n */\nconst FilesystemStateSchema = z3.object({\n files: withLangGraph(\n z3.record(z3.string(), FileDataSchema).default({}) as any,\n {\n reducer: {\n fn: fileDataReducer,\n schema: z3.record(z3.string(), FileDataSchema.nullable()),\n },\n }\n ),\n});\n\n/**\n * Resolve backend from factory or instance.\n *\n * @param backend - Backend instance or factory function\n * @param stateAndStore - State and store container for backend initialization\n */\nasync function getBackend(\n backend: BackendProtocol | BackendFactory,\n stateAndStore: StateAndStore\n): Promise<BackendProtocol> {\n if (typeof backend === \"function\") {\n return await backend(stateAndStore);\n }\n return backend;\n}\n\n// System prompts\nconst FILESYSTEM_SYSTEM_PROMPT = `You have access to a virtual filesystem. All file paths must start with a /.\n\n- ls: list files in a directory (requires absolute path)\n- read_file: read a file from the filesystem\n- write_file: write to a file in the filesystem\n- edit_file: edit a file in the filesystem\n- glob: find files matching a pattern (e.g., \"**/*.py\")\n- grep: search for text within files`;\n\n// Tool descriptions\nexport const LS_TOOL_DESCRIPTION = \"List files and directories in a directory\";\nexport const READ_FILE_TOOL_DESCRIPTION = \"Read the contents of a file\";\nexport const WRITE_FILE_TOOL_DESCRIPTION =\n \"Write content to a new file. Returns an error if the file already exists\";\nexport const EDIT_FILE_TOOL_DESCRIPTION =\n \"Edit a file by replacing a specific string with a new string\";\nexport const GLOB_TOOL_DESCRIPTION =\n \"Find files matching a glob pattern (e.g., '**/*.py' for all Python files)\";\nexport const GREP_TOOL_DESCRIPTION =\n \"Search for a regex pattern in files. Returns matching files and line numbers\";\n\n/**\n * Create ls tool using backend.\n */\nfunction createLsTool(\n backend: BackendProtocol | BackendFactory,\n options: { customDescription: string | undefined }\n) {\n const { customDescription } = options;\n return tool(\n async (input, config) => {\n const { runConfig } = config.configurable as any;\n const stateAndStore: StateAndStore = {\n state: getCurrentTaskInput(config),\n store: (config as any).store,\n ...runConfig,\n };\n const resolvedBackend = await getBackend(backend, stateAndStore);\n const path = input.path || \"/\";\n const infos = await resolvedBackend.lsInfo(path);\n\n if (infos.length === 0) {\n return `No files found in ${path}`;\n }\n\n // Format output\n const lines: string[] = [];\n for (const info of infos) {\n if (info.is_dir) {\n lines.push(`<file>${info.path}</file> (directory)`);\n } else {\n const size = info.size ? ` (${info.size} bytes)` : \"\";\n lines.push(`<file>${info.path}</file>${size}`);\n }\n }\n return lines.join(\"\\n\");\n },\n {\n name: \"ls\",\n description: customDescription || LS_TOOL_DESCRIPTION,\n schema: z3.object({\n path: z3\n .string()\n .optional()\n .default(\"/\")\n .describe(\"Directory path to list (default: /)\"),\n }),\n }\n );\n}\n\n/**\n * Create read_file tool using backend.\n */\nfunction createReadFileTool(\n backend: BackendProtocol | BackendFactory,\n options: { customDescription: string | undefined }\n) {\n const { customDescription } = options;\n return tool(\n async (input, config) => {\n const { runConfig } = config.configurable as any;\n\n const stateAndStore: StateAndStore = {\n state: getCurrentTaskInput(config),\n store: (config as any).store,\n ...runConfig,\n };\n const resolvedBackend = await getBackend(backend, stateAndStore);\n const { file_path, offset = 0, limit = 2000 } = input;\n return await resolvedBackend.read(file_path, offset, limit);\n },\n {\n name: \"read_file\",\n description: customDescription || READ_FILE_TOOL_DESCRIPTION,\n schema: z3.object({\n file_path: z3.string().describe(\"Absolute path to the file to read\"),\n offset: z3\n .number({ coerce: true })\n .optional()\n .default(0)\n .describe(\"Line offset to start reading from (0-indexed)\"),\n limit: z3\n .number({ coerce: true })\n .optional()\n .default(2000)\n .describe(\"Maximum number of lines to read\"),\n }),\n }\n );\n}\n\n/**\n * Create write_file tool using backend.\n */\nfunction createWriteFileTool(\n backend: BackendProtocol | BackendFactory,\n options: { customDescription: string | undefined }\n) {\n const { customDescription } = options;\n return tool(\n async (input, config) => {\n const { runConfig } = config.configurable as any;\n const stateAndStore: StateAndStore = {\n state: getCurrentTaskInput(config),\n store: (config as any).store,\n ...runConfig,\n };\n const resolvedBackend = await getBackend(backend, stateAndStore);\n const { file_path, content } = input;\n const result = await resolvedBackend.write(file_path, content);\n\n if (result.error) {\n return result.error;\n }\n\n // If filesUpdate is present, return Command to update state\n const message = new ToolMessage({\n content: `Successfully wrote to '${file_path}'`,\n tool_call_id: config.toolCall?.id as string,\n name: \"write_file\",\n metadata: result.metadata,\n });\n\n if (result.filesUpdate) {\n return new Command({\n update: { files: result.filesUpdate, messages: [message] },\n });\n }\n\n return message;\n },\n {\n name: \"write_file\",\n description: customDescription || WRITE_FILE_TOOL_DESCRIPTION,\n schema: z3.object({\n file_path: z3.string().describe(\"Absolute path to the file to write\"),\n content: z3.string().describe(\"Content to write to the file\"),\n }),\n }\n );\n}\n\n/**\n * Create edit_file tool using backend.\n */\nfunction createEditFileTool(\n backend: BackendProtocol | BackendFactory,\n options: { customDescription: string | undefined }\n) {\n const { customDescription } = options;\n return tool(\n async (input, config) => {\n const { runConfig } = config.configurable as any;\n const stateAndStore: StateAndStore = {\n state: getCurrentTaskInput(config),\n store: (config as any).store,\n ...runConfig,\n };\n const resolvedBackend = await getBackend(backend, stateAndStore);\n const { file_path, old_string, new_string, replace_all = false } = input;\n const result = await resolvedBackend.edit(\n file_path,\n old_string,\n new_string,\n replace_all\n );\n\n if (result.error) {\n return result.error;\n }\n\n const message = new ToolMessage({\n content: `Successfully replaced ${result.occurrences} occurrence(s) in '${file_path}'`,\n tool_call_id: config.toolCall?.id as string,\n name: \"edit_file\",\n metadata: result.metadata,\n });\n\n // If filesUpdate is present, return Command to update state\n if (result.filesUpdate) {\n return new Command({\n update: { files: result.filesUpdate, messages: [message] },\n });\n }\n\n // External storage (filesUpdate is null)\n return message;\n },\n {\n name: \"edit_file\",\n description: customDescription || EDIT_FILE_TOOL_DESCRIPTION,\n schema: z3.object({\n file_path: z3.string().describe(\"Absolute path to the file to edit\"),\n old_string: z3\n .string()\n .describe(\"String to be replaced (must match exactly)\"),\n new_string: z3.string().describe(\"String to replace with\"),\n replace_all: z3\n .boolean()\n .optional()\n .default(false)\n .describe(\"Whether to replace all occurrences\"),\n }),\n }\n );\n}\n\n/**\n * Create glob tool using backend.\n */\nfunction createGlobTool(\n backend: BackendProtocol | BackendFactory,\n options: { customDescription: string | undefined }\n) {\n const { customDescription } = options;\n return tool(\n async (input, config) => {\n const { runConfig } = config.configurable as any;\n const stateAndStore: StateAndStore = {\n state: getCurrentTaskInput(config),\n store: (config as any).store,\n ...runConfig,\n };\n const resolvedBackend = await getBackend(backend, stateAndStore);\n const { pattern, path = \"/\" } = input;\n const infos = await resolvedBackend.globInfo(pattern, path);\n\n if (infos.length === 0) {\n return `No files found matching pattern '${pattern}'`;\n }\n\n return infos.map((info) => info.path).join(\"\\n\");\n },\n {\n name: \"glob\",\n description: customDescription || GLOB_TOOL_DESCRIPTION,\n schema: z3.object({\n pattern: z3.string().describe(\"Glob pattern (e.g., '*.py', '**/*.ts')\"),\n path: z3\n .string()\n .optional()\n .default(\"/\")\n .describe(\"Base path to search from (default: /)\"),\n }),\n }\n );\n}\n\n/**\n * Create grep tool using backend.\n */\nfunction createGrepTool(\n backend: BackendProtocol | BackendFactory,\n options: { customDescription: string | undefined }\n) {\n const { customDescription } = options;\n return tool(\n async (input, config) => {\n const { runConfig } = config.configurable as any;\n const stateAndStore: StateAndStore = {\n state: getCurrentTaskInput(config),\n store: (config as any).store,\n ...runConfig,\n };\n const resolvedBackend = await getBackend(backend, stateAndStore);\n const { pattern, path = \"/\", glob = null } = input;\n const result = await resolvedBackend.grepRaw(pattern, path, glob);\n\n // If string, it's an error\n if (typeof result === \"string\") {\n return result;\n }\n\n if (result.length === 0) {\n return `No matches found for pattern '${pattern}'`;\n }\n\n // Format output: group by file\n const lines: string[] = [];\n let currentFile: string | null = null;\n for (const match of result) {\n if (match.path !== currentFile) {\n currentFile = match.path;\n lines.push(`\\n${currentFile}:`);\n }\n lines.push(` ${match.line}: ${match.text}`);\n }\n\n return lines.join(\"\\n\");\n },\n {\n name: \"grep\",\n description: customDescription || GREP_TOOL_DESCRIPTION,\n schema: z3.object({\n pattern: z3.string().describe(\"Regex pattern to search for\"),\n path: z3\n .string()\n .optional()\n .default(\"/\")\n .describe(\"Base path to search from (default: /)\"),\n glob: z3\n .string()\n .optional()\n .nullable()\n .describe(\"Optional glob pattern to filter files (e.g., '*.py')\"),\n }),\n }\n );\n}\n\n/**\n * Options for creating filesystem middleware.\n */\nexport interface FilesystemMiddlewareOptions {\n /** Backend instance or factory (default: StateBackend) */\n backend?: BackendProtocol | BackendFactory;\n /** Optional custom system prompt override */\n systemPrompt?: string | null;\n /** Optional custom tool descriptions override */\n customToolDescriptions?: Record<string, string> | null;\n /** Optional token limit before evicting a tool result to the filesystem (default: 20000 tokens, ~80KB) */\n toolTokenLimitBeforeEvict?: number | null;\n}\n\n/**\n * Create filesystem middleware with all tools and features.\n */\nexport function createFilesystemMiddleware(\n options: FilesystemMiddlewareOptions = {}\n) {\n const {\n backend = async (stateAndStore: StateAndStore) => new StateBackend(stateAndStore),\n systemPrompt: customSystemPrompt = null,\n customToolDescriptions = null,\n toolTokenLimitBeforeEvict = 20000,\n } = options;\n\n const systemPrompt = customSystemPrompt || FILESYSTEM_SYSTEM_PROMPT;\n\n const tools = [\n createLsTool(backend, {\n customDescription: customToolDescriptions?.ls,\n }),\n createReadFileTool(backend, {\n customDescription: customToolDescriptions?.read_file,\n }),\n createWriteFileTool(backend, {\n customDescription: customToolDescriptions?.write_file,\n }),\n createEditFileTool(backend, {\n customDescription: customToolDescriptions?.edit_file,\n }),\n createGlobTool(backend, {\n customDescription: customToolDescriptions?.glob,\n }),\n createGrepTool(backend, {\n customDescription: customToolDescriptions?.grep,\n }),\n ];\n\n return createMiddleware({\n name: \"FilesystemMiddleware\",\n stateSchema: FilesystemStateSchema as any,\n tools,\n wrapModelCall: systemPrompt\n ? async (request, handler: any) => {\n const currentSystemPrompt = request.systemPrompt || \"\";\n const newSystemPrompt = currentSystemPrompt\n ? `${currentSystemPrompt}\\n\\n${systemPrompt}`\n : systemPrompt;\n return handler({ ...request, systemPrompt: newSystemPrompt });\n }\n : undefined,\n wrapToolCall: toolTokenLimitBeforeEvict\n ? ((async (request: any, handler: any) => {\n const result = await handler(request);\n\n async function processToolMessage(msg: ToolMessage) {\n if (\n typeof msg.content === \"string\" &&\n msg.content.length > toolTokenLimitBeforeEvict! * 4\n ) {\n // Build StateAndStore from request\n const stateAndStore: StateAndStore = {\n state: request.state || {},\n store: request.config?.store,\n };\n const resolvedBackend = await getBackend(backend, stateAndStore);\n const sanitizedId = sanitizeToolCallId(\n request.toolCall?.id || msg.tool_call_id\n );\n const evictPath = `/large_tool_results/${sanitizedId}`;\n\n const writeResult = await resolvedBackend.write(\n evictPath,\n msg.content\n );\n\n if (writeResult.error) {\n return { message: msg, filesUpdate: null };\n }\n\n const truncatedMessage = new ToolMessage({\n content: `Tool result too large (${Math.round(\n msg.content.length / 4\n )} tokens). Content saved to ${evictPath}`,\n tool_call_id: msg.tool_call_id,\n name: msg.name,\n });\n\n return {\n message: truncatedMessage,\n filesUpdate: writeResult.filesUpdate,\n };\n }\n return { message: msg, filesUpdate: null };\n }\n\n if (result instanceof ToolMessage) {\n const processed = await processToolMessage(result);\n\n if (processed.filesUpdate) {\n return new Command({\n update: {\n files: processed.filesUpdate,\n messages: [processed.message],\n },\n });\n }\n\n return processed.message;\n }\n\n if (isCommand(result)) {\n const update = result.update as any;\n if (!update?.messages) {\n return result;\n }\n\n let hasLargeResults = false;\n const accumulatedFiles: Record<string, FileData> = {\n ...(update.files || {}),\n };\n const processedMessages: ToolMessage[] = [];\n\n for (const msg of update.messages) {\n if (msg instanceof ToolMessage) {\n const processed = await processToolMessage(msg);\n processedMessages.push(processed.message);\n\n if (processed.filesUpdate) {\n hasLargeResults = true;\n Object.assign(accumulatedFiles, processed.filesUpdate);\n }\n } else {\n processedMessages.push(msg);\n }\n }\n\n if (hasLargeResults) {\n return new Command({\n update: {\n ...update,\n messages: processedMessages,\n files: accumulatedFiles,\n },\n });\n }\n }\n\n return result;\n }) as any)\n : undefined,\n });\n}\n","/**\n * Shared utility functions for memory backend implementations.\n *\n * This module contains both user-facing string formatters and structured\n * helpers used by backends and the composite router. Structured helpers\n * enable composition without fragile string parsing.\n */\n\nimport micromatch from \"micromatch\";\nimport { basename } from \"path\";\nimport type { FileData, GrepMatch } from \"./protocol.js\";\n\n// Constants\nexport const EMPTY_CONTENT_WARNING =\n \"System reminder: File exists but has empty contents\";\nexport const MAX_LINE_LENGTH = 10000;\nexport const LINE_NUMBER_WIDTH = 6;\nexport const TOOL_RESULT_TOKEN_LIMIT = 20000; // Same threshold as eviction\nexport const TRUNCATION_GUIDANCE =\n \"... [results truncated, try being more specific with your parameters]\";\n\n/**\n * Sanitize tool_call_id to prevent path traversal and separator issues.\n *\n * Replaces dangerous characters (., /, \\) with underscores.\n */\nexport function sanitizeToolCallId(toolCallId: string): string {\n return toolCallId.replace(/\\./g, \"_\").replace(/\\//g, \"_\").replace(/\\\\/g, \"_\");\n}\n\n/**\n * Format file content with line numbers (cat -n style).\n *\n * Chunks lines longer than MAX_LINE_LENGTH with continuation markers (e.g., 5.1, 5.2).\n *\n * @param content - File content as string or list of lines\n * @param startLine - Starting line number (default: 1)\n * @returns Formatted content with line numbers and continuation markers\n */\nexport function formatContentWithLineNumbers(\n content: string | string[],\n startLine: number = 1,\n): string {\n let lines: string[];\n if (typeof content === \"string\") {\n lines = content.split(\"\\n\");\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines = lines.slice(0, -1);\n }\n } else {\n lines = content;\n }\n\n const resultLines: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lineNum = i + startLine;\n\n if (line.length <= MAX_LINE_LENGTH) {\n resultLines.push(\n `${lineNum.toString().padStart(LINE_NUMBER_WIDTH)}\\t${line}`,\n );\n } else {\n // Split long line into chunks with continuation markers\n const numChunks = Math.ceil(line.length / MAX_LINE_LENGTH);\n for (let chunkIdx = 0; chunkIdx < numChunks; chunkIdx++) {\n const start = chunkIdx * MAX_LINE_LENGTH;\n const end = Math.min(start + MAX_LINE_LENGTH, line.length);\n const chunk = line.substring(start, end);\n if (chunkIdx === 0) {\n // First chunk: use normal line number\n resultLines.push(\n `${lineNum.toString().padStart(LINE_NUMBER_WIDTH)}\\t${chunk}`,\n );\n } else {\n // Continuation chunks: use decimal notation (e.g., 5.1, 5.2)\n const continuationMarker = `${lineNum}.${chunkIdx}`;\n resultLines.push(\n `${continuationMarker.padStart(LINE_NUMBER_WIDTH)}\\t${chunk}`,\n );\n }\n }\n }\n }\n\n return resultLines.join(\"\\n\");\n}\n\n/**\n * Check if content is empty and return warning message.\n *\n * @param content - Content to check\n * @returns Warning message if empty, null otherwise\n */\nexport function checkEmptyContent(content: string): string | null {\n if (!content || content.trim() === \"\") {\n return EMPTY_CONTENT_WARNING;\n }\n return null;\n}\n\n/**\n * Convert FileData to plain string content.\n *\n * @param fileData - FileData object with 'content' key\n * @returns Content as string with lines joined by newlines\n */\nexport function fileDataToString(fileData: FileData): string {\n return fileData.content.join(\"\\n\");\n}\n\n/**\n * Create a FileData object with timestamps.\n *\n * @param content - File content as string\n * @param createdAt - Optional creation timestamp (ISO format)\n * @returns FileData object with content and timestamps\n */\nexport function createFileData(content: string, createdAt?: string): FileData {\n const lines = typeof content === \"string\" ? content.split(\"\\n\") : content;\n const now = new Date().toISOString();\n\n return {\n content: lines,\n created_at: createdAt || now,\n modified_at: now,\n };\n}\n\n/**\n * Update FileData with new content, preserving creation timestamp.\n *\n * @param fileData - Existing FileData object\n * @param content - New content as string\n * @returns Updated FileData object\n */\nexport function updateFileData(fileData: FileData, content: string): FileData {\n const lines = typeof content === \"string\" ? content.split(\"\\n\") : content;\n const now = new Date().toISOString();\n\n return {\n content: lines,\n created_at: fileData.created_at,\n modified_at: now,\n };\n}\n\n/**\n * Format file data for read response with line numbers.\n *\n * @param fileData - FileData object\n * @param offset - Line offset (0-indexed)\n * @param limit - Maximum number of lines\n * @returns Formatted content or error message\n */\nexport function formatReadResponse(\n fileData: FileData,\n offset: number,\n limit: number,\n): string {\n const content = fileDataToString(fileData);\n const emptyMsg = checkEmptyContent(content);\n if (emptyMsg) {\n return emptyMsg;\n }\n\n const lines = content.split(\"\\n\");\n const startIdx = offset;\n const endIdx = Math.min(startIdx + limit, lines.length);\n\n if (startIdx >= lines.length) {\n return `Error: Line offset ${offset} exceeds file length (${lines.length} lines)`;\n }\n\n const selectedLines = lines.slice(startIdx, endIdx);\n return formatContentWithLineNumbers(selectedLines, startIdx + 1);\n}\n\n/**\n * Perform string replacement with occurrence validation.\n *\n * @param content - Original content\n * @param oldString - String to replace\n * @param newString - Replacement string\n * @param replaceAll - Whether to replace all occurrences\n * @returns Tuple of [new_content, occurrences] on success, or error message string\n */\nexport function performStringReplacement(\n content: string,\n oldString: string,\n newString: string,\n replaceAll: boolean,\n): [string, number] | string {\n // Use split to count occurrences (simpler than regex)\n const occurrences = content.split(oldString).length - 1;\n\n if (occurrences === 0) {\n return `Error: String not found in file: '${oldString}'`;\n }\n\n if (occurrences > 1 && !replaceAll) {\n return `Error: String '${oldString}' appears ${occurrences} times in file. Use replace_all=True to replace all instances, or provide a more specific string with surrounding context.`;\n }\n\n // Python's str.replace() replaces ALL occurrences\n // Use split/join for consistent behavior\n const newContent = content.split(oldString).join(newString);\n\n return [newContent, occurrences];\n}\n\n/**\n * Truncate list or string result if it exceeds token limit (rough estimate: 4 chars/token).\n */\nexport function truncateIfTooLong(\n result: string[] | string,\n): string[] | string {\n if (Array.isArray(result)) {\n const totalChars = result.reduce((sum, item) => sum + item.length, 0);\n if (totalChars > TOOL_RESULT_TOKEN_LIMIT * 4) {\n const truncateAt = Math.floor(\n (result.length * TOOL_RESULT_TOKEN_LIMIT * 4) / totalChars,\n );\n return [...result.slice(0, truncateAt), TRUNCATION_GUIDANCE];\n }\n return result;\n }\n // string\n if (result.length > TOOL_RESULT_TOKEN_LIMIT * 4) {\n return (\n result.substring(0, TOOL_RESULT_TOKEN_LIMIT * 4) +\n \"\\n\" +\n TRUNCATION_GUIDANCE\n );\n }\n return result;\n}\n\n/**\n * Validate and normalize a path.\n *\n * @param path - Path to validate\n * @returns Normalized path starting with / and ending with /\n * @throws Error if path is invalid\n */\nexport function validatePath(path: string | null | undefined): string {\n const pathStr = path || \"/\";\n if (!pathStr || pathStr.trim() === \"\") {\n throw new Error(\"Path cannot be empty\");\n }\n\n let normalized = pathStr.startsWith(\"/\") ? pathStr : \"/\" + pathStr;\n\n if (!normalized.endsWith(\"/\")) {\n normalized += \"/\";\n }\n\n return normalized;\n}\n\n/**\n * Search files dict for paths matching glob pattern.\n *\n * @param files - Dictionary of file paths to FileData\n * @param pattern - Glob pattern (e.g., `*.py`, `**\\/*.ts`)\n * @param path - Base path to search from\n * @returns Newline-separated file paths, sorted by modification time (most recent first).\n * Returns \"No files found\" if no matches.\n *\n * @example\n * ```typescript\n * const files = {\"/src/main.py\": FileData(...), \"/test.py\": FileData(...)};\n * globSearchFiles(files, \"*.py\", \"/\");\n * // Returns: \"/test.py\\n/src/main.py\" (sorted by modified_at)\n * ```\n */\nexport function globSearchFiles(\n files: Record<string, FileData>,\n pattern: string,\n path: string = \"/\",\n): string {\n let normalizedPath: string;\n try {\n normalizedPath = validatePath(path);\n } catch {\n return \"No files found\";\n }\n\n const filtered = Object.fromEntries(\n Object.entries(files).filter(([fp]) => fp.startsWith(normalizedPath)),\n );\n\n // Respect standard glob semantics:\n // - Patterns without path separators (e.g., \"*.py\") match only in the current\n // directory (non-recursive) relative to `path`.\n // - Use \"**\" explicitly for recursive matching.\n const effectivePattern = pattern;\n\n const matches: Array<[string, string]> = [];\n for (const [filePath, fileData] of Object.entries(filtered)) {\n let relative = filePath.substring(normalizedPath.length);\n if (relative.startsWith(\"/\")) {\n relative = relative.substring(1);\n }\n if (!relative) {\n const parts = filePath.split(\"/\");\n relative = parts[parts.length - 1] || \"\";\n }\n\n if (\n micromatch.isMatch(relative, effectivePattern, {\n dot: true,\n nobrace: false,\n })\n ) {\n matches.push([filePath, fileData.modified_at]);\n }\n }\n\n matches.sort((a, b) => b[1].localeCompare(a[1])); // Sort by modified_at descending\n\n if (matches.length === 0) {\n return \"No files found\";\n }\n\n return matches.map(([fp]) => fp).join(\"\\n\");\n}\n\n/**\n * Format grep search results based on output mode.\n *\n * @param results - Dictionary mapping file paths to list of [line_num, line_content] tuples\n * @param outputMode - Output format - \"files_with_matches\", \"content\", or \"count\"\n * @returns Formatted string output\n */\nexport function formatGrepResults(\n results: Record<string, Array<[number, string]>>,\n outputMode: \"files_with_matches\" | \"content\" | \"count\",\n): string {\n if (outputMode === \"files_with_matches\") {\n return Object.keys(results).sort().join(\"\\n\");\n }\n if (outputMode === \"count\") {\n const lines: string[] = [];\n for (const filePath of Object.keys(results).sort()) {\n const count = results[filePath].length;\n lines.push(`${filePath}: ${count}`);\n }\n return lines.join(\"\\n\");\n }\n // content mode\n const lines: string[] = [];\n for (const filePath of Object.keys(results).sort()) {\n lines.push(`${filePath}:`);\n for (const [lineNum, line] of results[filePath]) {\n lines.push(` ${lineNum}: ${line}`);\n }\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * Search file contents for regex pattern.\n *\n * @param files - Dictionary of file paths to FileData\n * @param pattern - Regex pattern to search for\n * @param path - Base path to search from\n * @param glob - Optional glob pattern to filter files (e.g., \"*.py\")\n * @param outputMode - Output format - \"files_with_matches\", \"content\", or \"count\"\n * @returns Formatted search results. Returns \"No matches found\" if no results.\n *\n * @example\n * ```typescript\n * const files = {\"/file.py\": FileData({content: [\"import os\", \"print('hi')\"], ...})};\n * grepSearchFiles(files, \"import\", \"/\");\n * // Returns: \"/file.py\" (with output_mode=\"files_with_matches\")\n * ```\n */\nexport function grepSearchFiles(\n files: Record<string, FileData>,\n pattern: string,\n path: string | null = null,\n glob: string | null = null,\n outputMode: \"files_with_matches\" | \"content\" | \"count\" = \"files_with_matches\",\n): string {\n let regex: RegExp;\n try {\n regex = new RegExp(pattern);\n } catch (e: any) {\n return `Invalid regex pattern: ${e.message}`;\n }\n\n let normalizedPath: string;\n try {\n normalizedPath = validatePath(path);\n } catch {\n return \"No matches found\";\n }\n\n let filtered = Object.fromEntries(\n Object.entries(files).filter(([fp]) => fp.startsWith(normalizedPath)),\n );\n\n if (glob) {\n filtered = Object.fromEntries(\n Object.entries(filtered).filter(([fp]) =>\n micromatch.isMatch(basename(fp), glob, { dot: true, nobrace: false }),\n ),\n );\n }\n\n const results: Record<string, Array<[number, string]>> = {};\n for (const [filePath, fileData] of Object.entries(filtered)) {\n for (let i = 0; i < fileData.content.length; i++) {\n const line = fileData.content[i];\n const lineNum = i + 1;\n if (regex.test(line)) {\n if (!results[filePath]) {\n results[filePath] = [];\n }\n results[filePath].push([lineNum, line]);\n }\n }\n }\n\n if (Object.keys(results).length === 0) {\n return \"No matches found\";\n }\n return formatGrepResults(results, outputMode);\n}\n\n// -------- Structured helpers for composition --------\n\n/**\n * Return structured grep matches from an in-memory files mapping.\n *\n * Returns a list of GrepMatch on success, or a string for invalid inputs\n * (e.g., invalid regex). We deliberately do not raise here to keep backends\n * non-throwing in tool contexts and preserve user-facing error messages.\n */\nexport function grepMatchesFromFiles(\n files: Record<string, FileData>,\n pattern: string,\n path: string | null = null,\n glob: string | null = null,\n): GrepMatch[] | string {\n let regex: RegExp;\n try {\n regex = new RegExp(pattern);\n } catch (e: any) {\n return `Invalid regex pattern: ${e.message}`;\n }\n\n let normalizedPath: string;\n try {\n normalizedPath = validatePath(path);\n } catch {\n return [];\n }\n\n let filtered = Object.fromEntries(\n Object.entries(files).filter(([fp]) => fp.startsWith(normalizedPath)),\n );\n\n if (glob) {\n filtered = Object.fromEntries(\n Object.entries(filtered).filter(([fp]) =>\n micromatch.isMatch(basename(fp), glob, { dot: true, nobrace: false }),\n ),\n );\n }\n\n const matches: GrepMatch[] = [];\n for (const [filePath, fileData] of Object.entries(filtered)) {\n for (let i = 0; i < fileData.content.length; i++) {\n const line = fileData.content[i];\n const lineNum = i + 1;\n if (regex.test(line)) {\n matches.push({ path: filePath, line: lineNum, text: line });\n }\n }\n }\n\n return matches;\n}\n\n/**\n * Group structured matches into the legacy dict form used by formatters.\n */\nexport function buildGrepResultsDict(\n matches: GrepMatch[],\n): Record<string, Array<[number, string]>> {\n const grouped: Record<string, Array<[number, string]>> = {};\n for (const m of matches) {\n if (!grouped[m.path]) {\n grouped[m.path] = [];\n }\n grouped[m.path].push([m.line, m.text]);\n }\n return grouped;\n}\n\n/**\n * Format structured grep matches using existing formatting logic.\n */\nexport function formatGrepMatches(\n matches: GrepMatch[],\n outputMode: \"files_with_matches\" | \"content\" | \"count\",\n): string {\n if (matches.length === 0) {\n return \"No matches found\";\n }\n return formatGrepResults(buildGrepResultsDict(matches), outputMode);\n}\n","/**\n * StateBackend: Store files in LangGraph agent state (ephemeral).\n */\n\nimport type {\n BackendProtocol,\n EditResult,\n FileData,\n FileInfo,\n GrepMatch,\n StateAndStore,\n WriteResult,\n} from \"./protocol.js\";\nimport {\n createFileData,\n fileDataToString,\n formatReadResponse,\n globSearchFiles,\n grepMatchesFromFiles,\n performStringReplacement,\n updateFileData,\n} from \"./utils.js\";\n\n/**\n * Backend that stores files in agent state (ephemeral).\n *\n * Uses LangGraph's state management and checkpointing. Files persist within\n * a conversation thread but not across threads. State is automatically\n * checkpointed after each agent step.\n *\n * Special handling: Since LangGraph state must be updated via Command objects\n * (not direct mutation), operations return filesUpdate in WriteResult/EditResult\n * for the middleware to apply via Command.\n */\nexport class StateBackend implements BackendProtocol {\n private stateAndStore: StateAndStore;\n\n constructor(stateAndStore: StateAndStore) {\n this.stateAndStore = stateAndStore;\n }\n\n /**\n * Get files from current state.\n */\n private getFiles(): Record<string, FileData> {\n return (\n ((this.stateAndStore.state as any).files as Record<string, FileData>) ||\n {}\n );\n }\n\n /**\n * List files and directories in the specified directory (non-recursive).\n *\n * @param path - Absolute path to directory\n * @returns List of FileInfo objects for files and directories directly in the directory.\n * Directories have a trailing / in their path and is_dir=true.\n */\n lsInfo(path: string): FileInfo[] {\n const files = this.getFiles();\n const infos: FileInfo[] = [];\n const subdirs = new Set<string>();\n\n // Normalize path to have trailing slash for proper prefix matching\n const normalizedPath = path.endsWith(\"/\") ? path : path + \"/\";\n\n for (const [k, fd] of Object.entries(files)) {\n // Check if file is in the specified directory or a subdirectory\n if (!k.startsWith(normalizedPath)) {\n continue;\n }\n\n // Get the relative path after the directory\n const relative = k.substring(normalizedPath.length);\n\n // If relative path contains '/', it's in a subdirectory\n if (relative.includes(\"/\")) {\n // Extract the immediate subdirectory name\n const subdirName = relative.split(\"/\")[0];\n subdirs.add(normalizedPath + subdirName + \"/\");\n continue;\n }\n\n // This is a file directly in the current directory\n const size = fd.content.join(\"\\n\").length;\n infos.push({\n path: k,\n is_dir: false,\n size: size,\n modified_at: fd.modified_at,\n });\n }\n\n // Add directories to the results\n for (const subdir of Array.from(subdirs).sort()) {\n infos.push({\n path: subdir,\n is_dir: true,\n size: 0,\n modified_at: \"\",\n });\n }\n\n infos.sort((a, b) => a.path.localeCompare(b.path));\n return infos;\n }\n\n /**\n * Read file content with line numbers.\n *\n * @param filePath - Absolute file path\n * @param offset - Line offset to start reading from (0-indexed)\n * @param limit - Maximum number of lines to read\n * @returns Formatted file content with line numbers, or error message\n */\n read(filePath: string, offset: number = 0, limit: number = 2000): string {\n const files = this.getFiles();\n const fileData = files[filePath];\n\n if (!fileData) {\n return `Error: File '${filePath}' not found`;\n }\n\n return formatReadResponse(fileData, offset, limit);\n }\n\n /**\n * Read file content as raw FileData.\n *\n * @param filePath - Absolute file path\n * @returns Raw file content as FileData\n */\n readRaw(filePath: string): FileData {\n const files = this.getFiles();\n const fileData = files[filePath];\n\n if (!fileData) throw new Error(`File '${filePath}' not found`);\n return fileData;\n }\n\n /**\n * Create a new file with content.\n * Returns WriteResult with filesUpdate to update LangGraph state.\n */\n write(filePath: string, content: string): WriteResult {\n const files = this.getFiles();\n\n if (filePath in files) {\n return {\n error: `Cannot write to ${filePath} because it already exists. Read and then make an edit, or write to a new path.`,\n };\n }\n\n const newFileData = createFileData(content);\n return {\n path: filePath,\n filesUpdate: { [filePath]: newFileData },\n };\n }\n\n /**\n * Edit a file by replacing string occurrences.\n * Returns EditResult with filesUpdate and occurrences.\n */\n edit(\n filePath: string,\n oldString: string,\n newString: string,\n replaceAll: boolean = false,\n ): EditResult {\n const files = this.getFiles();\n const fileData = files[filePath];\n\n if (!fileData) {\n return { error: `Error: File '${filePath}' not found` };\n }\n\n const content = fileDataToString(fileData);\n const result = performStringReplacement(\n content,\n oldString,\n newString,\n replaceAll,\n );\n\n if (typeof result === \"string\") {\n return { error: result };\n }\n\n const [newContent, occurrences] = result;\n const newFileData = updateFileData(fileData, newContent);\n return {\n path: filePath,\n filesUpdate: { [filePath]: newFileData },\n occurrences: occurrences,\n };\n }\n\n /**\n * Structured search results or error string for invalid input.\n */\n grepRaw(\n pattern: string,\n path: string = \"/\",\n glob: string | null = null,\n ): GrepMatch[] | string {\n const files = this.getFiles();\n return grepMatchesFromFiles(files, pattern, path, glob);\n }\n\n /**\n * Structured glob matching returning FileInfo objects.\n */\n globInfo(pattern: string, path: string = \"/\"): FileInfo[] {\n const files = this.getFiles();\n const result = globSearchFiles(files, pattern, path);\n\n if (result === \"No files found\") {\n return [];\n }\n\n const paths = result.split(\"\\n\");\n const infos: FileInfo[] = [];\n for (const p of paths) {\n const fd = files[p];\n const size = fd ? fd.content.join(\"\\n\").length : 0;\n infos.push({\n path: p,\n is_dir: false,\n size: size,\n modified_at: fd?.modified_at || \"\",\n });\n }\n return infos;\n }\n}\n","/**\n * Metrics Middleware\n * Provides tools for interacting with Semantic Metrics Servers\n */\n\nimport { createMiddleware, type AgentMiddleware } from \"langchain\";\nimport {\n createListMetricsDataSourcesTool,\n CreateMetricsToolParams,\n} from \"../tool_lattice/metrics/list_metrics_datasources\";\nimport {\n createQueryMetricsListTool,\n} from \"../tool_lattice/metrics/query_metrics_list\";\nimport {\n createQueryMetricDefinitionTool,\n} from \"../tool_lattice/metrics/query_metric_definition\";\nimport {\n createQuerySemanticMetricDataTool,\n} from \"../tool_lattice/metrics/query_semantic_metric_data\";\nimport {\n createQueryTablesListTool,\n} from \"../tool_lattice/metrics/query_tables_list\";\nimport {\n createQueryTableDefinitionTool,\n} from \"../tool_lattice/metrics/query_table_definition\";\nimport {\n createExecuteSqlQueryTool,\n} from \"../tool_lattice/metrics/execute_sql_query\";\n\nexport interface CreateMetricsMiddlewareParams {\n /** List of configured metrics server keys */\n serverKeys: string[];\n /** Optional descriptions for each server */\n serverDescriptions?: Record<string, string>;\n}\n\n/**\n * Create metrics middleware that provides tools for querying metrics data\n * \n * This middleware includes 7 tools:\n * 1. list_metrics_datasources - List all datasources from all configured servers\n * 2. query_metrics_list - Query available metrics from datasources\n * 3. query_metric_definition - Get detailed definition of a specific metric\n * 4. query_semantic_metric_data - Query actual metric data\n * 5. query_tables_list - Query available tables from datasources\n * 6. query_table_definition - Get detailed definition of a specific table\n * 7. execute_sql_query - Execute custom SQL queries\n */\nexport function createMetricsMiddleware(\n params: CreateMetricsMiddlewareParams\n): AgentMiddleware {\n const { serverKeys, serverDescriptions } = params;\n\n if (!serverKeys || serverKeys.length === 0) {\n return createMiddleware({\n name: \"metricsMiddleware\",\n tools: [],\n });\n }\n\n const toolParams: CreateMetricsToolParams = {\n serverKeys,\n serverDescriptions,\n };\n\n return createMiddleware({\n name: \"metricsMiddleware\",\n tools: [\n createListMetricsDataSourcesTool(toolParams),\n createQueryMetricsListTool(toolParams),\n createQueryMetricDefinitionTool(toolParams),\n createQuerySemanticMetricDataTool(toolParams),\n createQueryTablesListTool(toolParams),\n createQueryTableDefinitionTool(toolParams),\n createExecuteSqlQueryTool(toolParams),\n ],\n });\n}\n","import { createCodeEvalMiddleware, CreateCodeEvalMiddlewareParams } from \"../../middlewares/codeEvalMiddleware\";\nimport { createBrowserMiddleware, CreateBrowserMiddlewareParams } from \"../../middlewares/browserMiddleware\";\nimport { createSqlMiddleware, CreateSqlMiddlewareParams } from \"../../middlewares/sqlMiddleware\";\nimport { createSkillMiddleware, CreateSkillMiddlewareParams as CreateSkillMiddlewareParamsType } from \"../../middlewares/skillMiddleware\";\nimport { createFilesystemMiddleware, FilesystemMiddlewareOptions } from \"../../deep_agent_new/middleware/fs\";\nimport { createMetricsMiddleware, CreateMetricsMiddlewareParams } from \"../../middlewares/metricsMiddleware\";\nimport { MiddlewareConfig } from \"../types\";\nimport { BackendFactory } from \"../../deep_agent_new/backends/protocol.js\";\n\ninterface DatabaseConfigEntry {\n key: string;\n name?: string;\n description?: string;\n}\n\nexport function createCommonMiddlewares(\n middlewareConfigs: MiddlewareConfig[],\n filesystemBackend?: BackendFactory\n): any[] {\n const middlewares: any[] = [];\n const filesystemConfig = middlewareConfigs.find(m => m.type === \"filesystem\");\n\n if (filesystemConfig?.enabled && filesystemBackend) {\n const options: FilesystemMiddlewareOptions = { backend: filesystemBackend };\n middlewares.push(createFilesystemMiddleware(options));\n }\n\n for (const config of middlewareConfigs) {\n if (!config.enabled || config.type === \"filesystem\") continue;\n\n switch (config.type) {\n case \"code_eval\":\n middlewares.push(createCodeEvalMiddleware(config.config as CreateCodeEvalMiddlewareParams));\n break;\n case \"browser\":\n middlewares.push(createBrowserMiddleware(config.config as CreateBrowserMiddlewareParams));\n break;\n case \"sql\":\n {\n const sqlConfig = config.config as { databaseKeys?: string[] };\n if (sqlConfig.databaseKeys && sqlConfig.databaseKeys.length > 0) {\n const databaseConfigs: DatabaseConfigEntry[] = (global as any).__DATABASE_CONFIGS__ || [];\n const descriptions: Record<string, string> = {};\n for (const db of databaseConfigs) {\n if (db.key && sqlConfig.databaseKeys.includes(db.key)) {\n descriptions[db.key] = db.description || db.name || '';\n }\n }\n middlewares.push(createSqlMiddleware({\n databaseKeys: sqlConfig.databaseKeys,\n databaseDescriptions: descriptions,\n }));\n }\n }\n break;\n case \"skill\":\n middlewares.push(createSkillMiddleware(config.config as CreateSkillMiddlewareParamsType));\n break;\n case \"metrics\":\n {\n const metricsConfig = config.config as CreateMetricsMiddlewareParams;\n if (metricsConfig.serverKeys && metricsConfig.serverKeys.length > 0) {\n middlewares.push(createMetricsMiddleware(metricsConfig));\n }\n }\n break;\n }\n }\n\n return middlewares;\n}\n","import {\n createAgent,\n humanInTheLoopMiddleware,\n anthropicPromptCachingMiddleware,\n summarizationMiddleware,\n type AgentMiddleware,\n type ReactAgent,\n type InterruptOnConfig,\n} from \"langchain\";\nimport type { StructuredTool } from \"@langchain/core/tools\";\nimport type { BaseLanguageModel } from \"@langchain/core/language_models/base\";\nimport type {\n BaseCheckpointSaver,\n BaseStore,\n} from \"@langchain/langgraph-checkpoint\";\n\nimport {\n createFilesystemMiddleware,\n createSubAgentMiddleware,\n createPatchToolCallsMiddleware,\n type SubAgent,\n} from \"./middleware/index.js\";\nimport { StateBackend, type BackendProtocol } from \"./backends/index.js\";\nimport { InteropZodObject } from \"@langchain/core/utils/types\";\nimport { AnnotationRoot } from \"@langchain/langgraph\";\nimport { CompiledSubAgent } from \"./middleware/subagents.js\";\nimport { todoListMiddleware } from \"./middleware/todos.js\";\nimport { createSkillMiddleware } from \"../middlewares/skillMiddleware.js\";\n\n/**\n * Configuration parameters for creating a Deep Agent\n * Matches Python's create_deep_agent parameters\n */\nexport interface CreateDeepAgentParams<\n ContextSchema extends\n | AnnotationRoot<any>\n | InteropZodObject = AnnotationRoot<any>\n> {\n /** The model to use (model name string or LanguageModelLike instance). Defaults to claude-sonnet-4-5-20250929 */\n model?: BaseLanguageModel | string;\n /** Tools the agent should have access to */\n tools?: StructuredTool[];\n /** Custom system prompt for the agent. This will be combined with the base agent prompt */\n systemPrompt?: string;\n /** Custom middleware to apply after standard middleware */\n middleware?: AgentMiddleware[];\n /** List of subagent specifications for task delegation */\n subagents?: (SubAgent | CompiledSubAgent)[];\n /** Structured output response format for the agent */\n responseFormat?: any; // ResponseFormat type is complex, using any for now\n /** Optional schema for context (not persisted between invocations) */\n contextSchema?: ContextSchema;\n /** Optional checkpointer for persisting agent state between runs */\n checkpointer?: BaseCheckpointSaver | boolean;\n /** Optional store for persisting longterm memories */\n store?: BaseStore;\n /**\n * Optional backend for filesystem operations.\n * Can be either a backend instance or a factory function that creates one.\n * The factory receives a config object with state and store.\n */\n backend?:\n | BackendProtocol\n | ((config: { state: unknown; store?: BaseStore }) => Promise<BackendProtocol>);\n /** Optional interrupt configuration mapping tool names to interrupt configs */\n interruptOn?: Record<string, boolean | InterruptOnConfig>;\n /** The name of the agent */\n name?: string;\n\n skills?: string[];\n\n}\n\nconst BASE_PROMPT = `In order to complete the objective that the user asks of you, you have access to a number of standard tools.`;\n\n/**\n * Create a Deep Agent with middleware-based architecture.\n *\n * Matches Python's create_deep_agent function, using middleware for all features:\n * - Todo management (todoListMiddleware)\n * - Filesystem tools (createFilesystemMiddleware)\n * - Subagent delegation (createSubAgentMiddleware)\n * - Conversation summarization (summarizationMiddleware)\n * - Prompt caching (anthropicPromptCachingMiddleware)\n * - Tool call patching (createPatchToolCallsMiddleware)\n * - Human-in-the-loop (humanInTheLoopMiddleware) - optional\n *\n * @param params Configuration parameters for the agent\n * @returns ReactAgent instance ready for invocation\n */\nexport function createDeepAgent<\n ContextSchema extends\n | AnnotationRoot<any>\n | InteropZodObject = AnnotationRoot<any>\n>(\n params: CreateDeepAgentParams<ContextSchema> = {}\n): ReactAgent<any, any, ContextSchema, any> {\n const {\n model = \"claude-sonnet-4-5-20250929\",\n tools = [],\n systemPrompt,\n middleware: customMiddleware = [],\n subagents = [],\n responseFormat,\n contextSchema,\n checkpointer,\n store,\n backend,\n interruptOn,\n name,\n skills,\n } = params;\n\n // Combine system prompt with base prompt like Python implementation\n const finalSystemPrompt = systemPrompt\n ? `${systemPrompt}\\n\\n${BASE_PROMPT}`\n : BASE_PROMPT;\n\n // Create backend configuration for filesystem middleware\n // If no backend is provided, use a factory that creates a StateBackend\n const filesystemBackend = backend\n ? backend\n : async (config: { state: unknown; store?: BaseStore }) =>\n new StateBackend(config);\n\n const middleware: AgentMiddleware[] = [\n // Provides todo list management capabilities for tracking tasks\n todoListMiddleware(),\n // Enables filesystem operations and optional long-term memory storage\n createFilesystemMiddleware({ backend: filesystemBackend }),\n // Enables delegation to specialized subagents for complex tasks\n createSubAgentMiddleware({\n defaultModel: model,\n defaultTools: tools,\n defaultMiddleware: [\n // Subagent middleware: Todo list management\n todoListMiddleware(),\n // Subagent middleware: Filesystem operations\n createFilesystemMiddleware({\n backend: filesystemBackend,\n }),\n // Subagent middleware: Automatic conversation summarization when token limits are approached\n summarizationMiddleware({\n model,\n trigger: { tokens: 170_000 },\n keep: { messages: 6 },\n }),\n // Subagent middleware: Anthropic prompt caching for improved performance\n anthropicPromptCachingMiddleware({\n unsupportedModelBehavior: \"ignore\",\n }),\n // Subagent middleware: Patches tool calls for compatibility\n createPatchToolCallsMiddleware(),\n ],\n defaultInterruptOn: interruptOn,\n subagents,\n generalPurposeAgent: false,\n }),\n // Automatically summarizes conversation history when token limits are approached\n summarizationMiddleware({\n model,\n trigger: { tokens: 170_000 },\n keep: { messages: 6 },\n }),\n // Enables Anthropic prompt caching for improved performance and reduced costs\n anthropicPromptCachingMiddleware({\n unsupportedModelBehavior: \"ignore\",\n }),\n // Patches tool calls to ensure compatibility across different model providers\n createPatchToolCallsMiddleware()\n\n ];\n\n // Add human-in-the-loop middleware if interrupt config provided\n if (interruptOn) {\n middleware.push(humanInTheLoopMiddleware({ interruptOn }));\n }\n\n // Add custom middleware last (after all built-in middleware)\n middleware.push(...customMiddleware);\n\n return createAgent({\n model,\n systemPrompt: finalSystemPrompt,\n tools,\n middleware,\n responseFormat,\n contextSchema,\n checkpointer,\n store,\n name,\n });\n}\n","import { z } from \"zod/v3\";\nimport {\n createMiddleware,\n createAgent,\n AgentMiddleware,\n tool,\n ToolMessage,\n humanInTheLoopMiddleware,\n type InterruptOnConfig,\n type ReactAgent,\n StructuredTool,\n} from \"langchain\";\nimport { Command, getCurrentTaskInput } from \"@langchain/langgraph\";\nimport type { LanguageModelLike } from \"@langchain/core/language_models/base\";\nimport type { Runnable } from \"@langchain/core/runnables\";\nimport { HumanMessage } from \"@langchain/core/messages\";\nimport { AgentClient } from \"@agent_lattice\";\nimport { agentWorkerGraph } from \"../../agent_worker/agent_worker_graph\";\nexport type { AgentMiddleware };\n\n// Constants\nconst DEFAULT_SUBAGENT_PROMPT =\n \"In order to complete the objective that the user asks of you, you have access to a number of standard tools.\";\n\n// State keys that should be excluded when passing state to subagents\nconst EXCLUDED_STATE_KEYS = [\"messages\", \"todos\", \"jumpTo\"] as const;\n\nconst DEFAULT_GENERAL_PURPOSE_DESCRIPTION =\n \"General-purpose agent for researching complex questions, searching for files and content, and executing multi-step tasks. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries use this agent to perform the search for you. This agent has access to all tools as the main agent.\";\n\n// Comprehensive task tool description from Python\nfunction getTaskToolDescription(subagentDescriptions: string[]): string {\n return subagentDescriptions.length > 0 ? `\nLaunch an ephemeral subagent to handle complex, multi-step independent tasks with isolated context windows.\n\nAvailable agent types and the tools they have access to:\n${subagentDescriptions.join(\"\\n\")}\n\nWhen using the Task tool, you must specify a subagent_type parameter to select which agent type to use.\n\n## Usage notes:\n1. Launch multiple agents concurrently whenever possible, to maximize performance; to do that, use a single message with multiple tool uses\n2. When the agent is done, it will return a single message back to you. The result returned by the agent is not visible to the user. To show the user the result, you should send a text message back to the user with a concise summary of the result.\n3. Each agent invocation is stateless. You will not be able to send additional messages to the agent, nor will the agent be able to communicate with you outside of its final report. Therefore, your prompt should contain a highly detailed task description for the agent to perform autonomously and you should specify exactly what information the agent should return back to you in its final and only message to you.\n4. The agent's outputs should generally be trusted\n5. Clearly tell the agent whether you expect it to create content, perform analysis, or just do research (search, file reads, web fetches, etc.), since it is not aware of the user's intent\n6. If the agent description mentions that it should be used proactively, then you should try your best to use it without the user having to ask for it first. Use your judgement.\n7. When only the general-purpose agent is provided, you should use it for all tasks. It is great for isolating context and token usage, and completing specific, complex tasks, as it has all the same capabilities as the main agent.\n\n### Example usage of the general-purpose agent:\n\n<example_agent_descriptions>\n\"general-purpose\": use this agent for general purpose tasks, it has access to all tools as the main agent.\n</example_agent_descriptions>\n\n<example>\nUser: \"I want to conduct research on the accomplishments of Lebron James, Michael Jordan, and Kobe Bryant, and then compare them.\"\nAssistant: *Uses the task tool in parallel to conduct isolated research on each of the three players*\nAssistant: *Synthesizes the results of the three isolated research tasks and responds to the User*\n<commentary>\nResearch is a complex, multi-step task in it of itself.\nThe research of each individual player is not dependent on the research of the other players.\nThe assistant uses the task tool to break down the complex objective into three isolated tasks.\nEach research task only needs to worry about context and tokens about one player, then returns synthesized information about each player as the Tool Result.\nThis means each research task can dive deep and spend tokens and context deeply researching each player, but the final result is synthesized information, and saves us tokens in the long run when comparing the players to each other.\n</commentary>\n</example>\n\n<example>\nUser: \"Analyze a single large code repository for security vulnerabilities and generate a report.\"\nAssistant: *Launches a single \\`task\\` subagent for the repository analysis*\nAssistant: *Receives report and integrates results into final summary*\n<commentary>\nSubagent is used to isolate a large, context-heavy task, even though there is only one. This prevents the main thread from being overloaded with details.\nIf the user then asks followup questions, we have a concise report to reference instead of the entire history of analysis and tool calls, which is good and saves us time and money.\n</commentary>\n</example>\n\n<example>\nUser: \"Schedule two meetings for me and prepare agendas for each.\"\nAssistant: *Calls the task tool in parallel to launch two \\`task\\` subagents (one per meeting) to prepare agendas*\nAssistant: *Returns final schedules and agendas*\n<commentary>\nTasks are simple individually, but subagents help silo agenda preparation.\nEach subagent only needs to worry about the agenda for one meeting.\n</commentary>\n</example>\n\n<example>\nUser: \"I want to order a pizza from Dominos, order a burger from McDonald's, and order a salad from Subway.\"\nAssistant: *Calls tools directly in parallel to order a pizza from Dominos, a burger from McDonald's, and a salad from Subway*\n<commentary>\nThe assistant did not use the task tool because the objective is super simple and clear and only requires a few trivial tool calls.\nIt is better to just complete the task directly and NOT use the \\`task\\`tool.\n</commentary>\n</example>\n\n### Example usage with custom agents:\n\n<example_agent_descriptions>\n\"content-reviewer\": use this agent after you are done creating significant content or documents\n\"greeting-responder\": use this agent when to respond to user greetings with a friendly joke\n\"research-analyst\": use this agent to conduct thorough research on complex topics\n</example_agent_description>\n\n<example>\nuser: \"Please write a function that checks if a number is prime\"\nassistant: Sure let me write a function that checks if a number is prime\nassistant: First let me use the Write tool to write a function that checks if a number is prime\nassistant: I'm going to use the Write tool to write the following code:\n<code>\nfunction isPrime(n) {\n if (n <= 1) return false\n for (let i = 2; i * i <= n; i++) {\n if (n % i === 0) return false\n }\n return true\n}\n</code>\n<commentary>\nSince significant content was created and the task was completed, now use the content-reviewer agent to review the work\n</commentary>\nassistant: Now let me use the content-reviewer agent to review the code\nassistant: Uses the Task tool to launch with the content-reviewer agent\n</example>\n\n<example>\nuser: \"Can you help me research the environmental impact of different renewable energy sources and create a comprehensive report?\"\n<commentary>\nThis is a complex research task that would benefit from using the research-analyst agent to conduct thorough analysis\n</commentary>\nassistant: I'll help you research the environmental impact of renewable energy sources. Let me use the research-analyst agent to conduct comprehensive research on this topic.\nassistant: Uses the Task tool to launch with the research-analyst agent, providing detailed instructions about what research to conduct and what format the report should take\n</example>\n\n<example>\nuser: \"Hello\"\n<commentary>\nSince the user is greeting, use the greeting-responder agent to respond with a friendly joke\n</commentary>\nassistant: \"I'm going to use the Task tool to launch with the greeting-responder agent\"\n</example>\n `.trim() : \"No subagents available, you DON'T NEED TO USE THE TASK TOOL, just use the tools directly.\";\n}\n\nconst TASK_SYSTEM_PROMPT = `## \\`task\\` (subagent spawner)\n\nYou have access to a \\`task\\` tool to launch short-lived subagents that handle isolated tasks. These agents are ephemeral — they live only for the duration of the task and return a single result.\n\nWhen to use the task tool:\n- When a task is complex and multi-step, and can be fully delegated in isolation\n- When a task is independent of other tasks and can run in parallel\n- When a task requires focused reasoning or heavy token/context usage that would bloat the orchestrator thread\n- When sandboxing improves reliability (e.g. code execution, structured searches, data formatting)\n- When you only care about the output of the subagent, and not the intermediate steps (ex. performing a lot of research and then returned a synthesized report, performing a series of computations or lookups to achieve a concise, relevant answer.)\n\nSubagent lifecycle:\n1. **Spawn** → Provide clear role, instructions, and expected output\n2. **Run** → The subagent completes the task autonomously\n3. **Return** → The subagent provides a single structured result\n4. **Reconcile** → Incorporate or synthesize the result into the main thread\n\nWhen NOT to use the task tool:\n- If you need to see the intermediate reasoning or steps after the subagent has completed (the task tool hides them)\n- If the task is trivial (a few tool calls or simple lookup)\n- If delegating does not reduce token usage, complexity, or context switching\n- If splitting would add latency without benefit\n\n## Important Task Tool Usage Notes to Remember\n- Whenever possible, parallelize the work that you do. This is true for both tool_calls, and for tasks. Whenever you have independent steps to complete - make tool_calls, or kick off tasks (subagents) in parallel to accomplish them faster. This saves time for the user, which is incredibly important.\n- Remember to use the \\`task\\` tool to silo independent tasks within a multi-part objective.\n- You should use the \\`task\\` tool whenever you have a complex task that will take multiple steps, and is independent from other tasks that the agent needs to complete. These agents are highly competent and efficient.`;\n\n/**\n * Type definitions for pre-compiled agents.\n */\nexport interface CompiledSubAgent {\n /** The key of the agent */\n key: string;\n /** The name of the agent */\n name: string;\n /** The description of the agent */\n description: string;\n /** The agent instance */\n runnable: AgentClient | Runnable;\n}\n\n/**\n * Type definitions for subagents\n */\nexport interface SubAgent {\n /** The key of the agent */\n key: string;\n /** The name of the agent */\n name: string;\n /** The description of the agent */\n description: string;\n /** The system prompt to use for the agent */\n systemPrompt: string;\n /** The tools to use for the agent (tool instances, not names). Defaults to defaultTools */\n tools?: StructuredTool[];\n /** The model for the agent. Defaults to default_model */\n model?: LanguageModelLike | string;\n /** Additional middleware to append after default_middleware */\n middleware?: AgentMiddleware[];\n /** The tool configs to use for the agent */\n interruptOn?: Record<string, boolean | InterruptOnConfig>;\n}\n\n/**\n * Filter state to exclude certain keys when passing to subagents\n */\nfunction filterStateForSubagent(\n state: Record<string, unknown>\n): Record<string, unknown> {\n const filtered: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(state)) {\n if (!EXCLUDED_STATE_KEYS.includes(key as never)) {\n filtered[key] = value;\n }\n }\n return filtered;\n}\n\n/**\n * Create Command with filtered state update from subagent result\n */\nfunction returnCommandWithStateUpdate(\n result: Record<string, unknown>,\n toolCallId: string\n): Command {\n const stateUpdate = filterStateForSubagent(result);\n const messages = result.messages as Array<{ content: string }>;\n const lastMessage = messages?.[messages.length - 1];\n\n return new Command({\n update: {\n ...stateUpdate,\n messages: [\n new ToolMessage({\n content: lastMessage?.content || \"Task Failed to complete\",\n tool_call_id: toolCallId,\n name: \"task\",\n }),\n ],\n },\n });\n}\n\n/**\n * Create subagent instances from specifications\n */\nfunction getSubagents(options: {\n defaultModel: LanguageModelLike | string;\n defaultTools: StructuredTool[];\n defaultMiddleware: AgentMiddleware[] | null;\n defaultInterruptOn: Record<string, boolean | InterruptOnConfig> | null;\n subagents: (SubAgent | CompiledSubAgent)[];\n generalPurposeAgent: boolean;\n}): {\n agents: Record<string, ReactAgent<any, any, any, any> | Runnable>;\n descriptions: string[];\n} {\n const {\n defaultModel,\n defaultTools,\n defaultMiddleware,\n defaultInterruptOn,\n subagents,\n generalPurposeAgent,\n } = options;\n\n const defaultSubagentMiddleware = defaultMiddleware || [];\n const agents: Record<string, ReactAgent<any, any, any, any> | Runnable> = {};\n const subagentDescriptions: string[] = [];\n\n // Create general-purpose agent if enabled\n if (generalPurposeAgent) {\n const generalPurposeMiddleware = [...defaultSubagentMiddleware];\n if (defaultInterruptOn) {\n generalPurposeMiddleware.push(\n humanInTheLoopMiddleware({ interruptOn: defaultInterruptOn })\n );\n }\n\n const generalPurposeSubagent = createAgent({\n model: defaultModel,\n systemPrompt: DEFAULT_SUBAGENT_PROMPT,\n tools: defaultTools as any,\n middleware: generalPurposeMiddleware,\n });\n\n agents[\"general-purpose\"] = generalPurposeSubagent;\n subagentDescriptions.push(\n `- general-purpose: ${DEFAULT_GENERAL_PURPOSE_DESCRIPTION}`\n );\n }\n\n // Process custom subagents\n for (const agentParams of subagents) {\n subagentDescriptions.push(\n `- ${agentParams.key}: ${agentParams.name} - ${agentParams.description}`\n );\n\n if (\"runnable\" in agentParams) {\n agents[agentParams.key] = agentParams.runnable;\n } else {\n const middleware = agentParams.middleware\n ? [...defaultSubagentMiddleware, ...agentParams.middleware]\n : [...defaultSubagentMiddleware];\n\n const interruptOn = agentParams.interruptOn || defaultInterruptOn;\n if (interruptOn)\n middleware.push(humanInTheLoopMiddleware({ interruptOn }));\n\n agents[agentParams.key] = createAgent({\n model: agentParams.model ?? defaultModel,\n systemPrompt: agentParams.systemPrompt,\n tools: agentParams.tools ?? defaultTools,\n middleware,\n });\n }\n }\n\n return { agents, descriptions: subagentDescriptions };\n}\n\n/**\n * Create the task tool for invoking subagents\n */\nfunction createTaskTool(options: {\n defaultModel: LanguageModelLike | string;\n defaultTools: StructuredTool[];\n defaultMiddleware: AgentMiddleware[] | null;\n defaultInterruptOn: Record<string, boolean | InterruptOnConfig> | null;\n subagents: (SubAgent | CompiledSubAgent)[];\n generalPurposeAgent: boolean;\n taskDescription: string | null;\n}) {\n const {\n defaultModel,\n defaultTools,\n defaultMiddleware,\n defaultInterruptOn,\n subagents,\n generalPurposeAgent,\n taskDescription,\n } = options;\n\n const { agents: subagentGraphs, descriptions: subagentDescriptions } =\n getSubagents({\n defaultModel,\n defaultTools,\n defaultMiddleware,\n defaultInterruptOn,\n subagents,\n generalPurposeAgent,\n });\n\n const finalTaskDescription = taskDescription\n ? taskDescription\n : getTaskToolDescription(subagentDescriptions);\n\n return tool(\n async (\n input: { description: string; subagent_type: string },\n config\n ): Promise<Command | string> => {\n const { description, subagent_type } = input;\n\n try {\n // Validate subagent type\n if (!(subagent_type in subagentGraphs)) {\n const allowedTypes = Object.keys(subagentGraphs)\n .map((k) => `\\`${k}\\``)\n .join(\", \");\n\n\n throw new Error(\n `Error: invoked agent of type ${subagent_type}, the only allowed types are ${allowedTypes}`\n );\n }\n\n const subagent = subagentGraphs[subagent_type];\n\n // Get current state and filter it for subagent\n const currentState = getCurrentTaskInput<Record<string, unknown>>();\n const subagentState = filterStateForSubagent(currentState);\n subagentState.messages = [new HumanMessage({ content: description })];\n\n const subagent_thread_id =\n config.configurable?.thread_id +\n \"____\" +\n subagent_type +\n \"_\" +\n config.toolCall.id;\n console.log(subagent_thread_id);\n // Invoke the subagent\n // const result = (await subagent.invoke(subagentState, {\n // configurable: { thread_id: subagent_thread_id },\n // })) as Record<string, unknown>;\n\n const workerResult = await agentWorkerGraph.invoke({\n assistant_id: subagent_type,\n thread_id: subagent_thread_id,\n input: { ...subagentState, message: description },\n runConfig: {\n ...config.configurable?.runConfig as Record<string, unknown>,\n assistant_id: subagent_type,\n thread_id: subagent_thread_id,\n },\n });\n\n const result = workerResult.finalState?.values as Record<string, unknown>;\n\n // console.log(\"workerResult\", workerResult);\n\n // const result = (await AgentManager.getInstance().callAgentInQueue(\n // {\n // assistant_id: subagent_type,\n // thread_id: subagent_type + \"_\" + config.toolCall.id,\n // input: { ...subagentState, message: description },\n // },\n // true\n // )) as any;\n\n // Return command with filtered state update\n if (!config.toolCall?.id) {\n throw new Error(\"Tool call ID is required for subagent invocation\");\n }\n\n return returnCommandWithStateUpdate(result, config.toolCall.id);\n } catch (error) {\n return new Command({\n update: {\n messages: [\n new ToolMessage({\n content: error instanceof Error ? error.message : \"Task Failed to complete\",\n tool_call_id: config.toolCall.id,\n name: \"task\",\n }),\n ],\n },\n });\n }\n },\n {\n name: \"task\",\n description: finalTaskDescription,\n schema: z.object({\n description: z\n .string()\n .describe(\"The task to execute with the selected agent\"),\n subagent_type: z\n .string()\n .describe(\n `Name of the agent to use. Available: ${Object.keys(\n subagentGraphs\n ).join(\", \")}`\n ),\n }),\n }\n );\n}\n\n/**\n * Options for creating subagent middleware\n */\nexport interface SubAgentMiddlewareOptions {\n /** The model to use for subagents */\n defaultModel: LanguageModelLike | string;\n /** The tools to use for the default general-purpose subagent */\n defaultTools?: StructuredTool[];\n /** Default middleware to apply to all subagents */\n defaultMiddleware?: AgentMiddleware[] | null;\n /** The tool configs for the default general-purpose subagent */\n defaultInterruptOn?: Record<string, boolean | InterruptOnConfig> | null;\n /** A list of additional subagents to provide to the agent */\n subagents?: (SubAgent | CompiledSubAgent)[];\n /** Full system prompt override */\n systemPrompt?: string | null;\n /** Whether to include the general-purpose agent */\n generalPurposeAgent?: boolean;\n /** Custom description for the task tool */\n taskDescription?: string | null;\n}\n\n/**\n * Create subagent middleware with task tool\n */\nexport function createSubAgentMiddleware(\n options: SubAgentMiddlewareOptions\n): AgentMiddleware {\n const {\n defaultModel,\n defaultTools = [],\n defaultMiddleware = null,\n defaultInterruptOn = null,\n subagents = [],\n systemPrompt = TASK_SYSTEM_PROMPT,\n generalPurposeAgent = true,\n taskDescription = null,\n } = options;\n\n const taskTool = createTaskTool({\n defaultModel,\n defaultTools,\n defaultMiddleware,\n defaultInterruptOn,\n subagents,\n generalPurposeAgent,\n taskDescription,\n });\n\n return createMiddleware({\n name: \"subAgentMiddleware\",\n tools: [taskTool],\n wrapModelCall: async (request, handler) => {\n if (systemPrompt !== null) {\n const currentPrompt = request.systemPrompt || \"\";\n const newPrompt = currentPrompt\n ? `${currentPrompt}\\n\\n${systemPrompt}`\n : systemPrompt;\n\n return handler({\n ...request,\n systemPrompt: newPrompt,\n });\n }\n return handler(request);\n },\n });\n}\n","import {\n StateGraph,\n END,\n START,\n interrupt,\n Annotation,\n} from \"@langchain/langgraph\";\nimport { AgentManager } from \"../services/AgentManager\";\n\n/**\n * State schema for the agent worker graph\n */\nconst AgentWorkerState = Annotation.Root({\n // Input parameters\n assistant_id: Annotation<string>({\n reducer: (x: string, y: string) => y ?? x,\n default: () => \"\",\n }),\n thread_id: Annotation<string>({\n reducer: (x: string, y: string) => y ?? x,\n default: () => \"\",\n }),\n input: Annotation<Record<string, unknown>>({\n reducer: (x: Record<string, unknown>, y: Record<string, unknown>) => y ?? x,\n default: () => ({}),\n }),\n command2: Annotation<any>({\n reducer: (x: any, y: any) => y ?? x,\n default: () => undefined,\n }),\n // RunConfig for passing configuration through the graph\n runConfig: Annotation<Record<string, unknown> | undefined>({\n reducer: (\n x: Record<string, unknown> | undefined,\n y: Record<string, unknown> | undefined\n ) => y ?? x,\n default: () => undefined,\n }),\n\n // Execution result\n result: Annotation<any>({\n reducer: (x: any, y: any) => y ?? x,\n default: () => undefined,\n }),\n // Interrupt data\n interruptValue: Annotation<any>({\n reducer: (x: any, y: any) => y ?? x,\n default: () => undefined,\n }),\n // Final state to return\n finalState: Annotation<Record<string, unknown> | undefined>({\n reducer: (\n x: Record<string, unknown> | undefined,\n y: Record<string, unknown> | undefined\n ) => y ?? x,\n default: () => undefined,\n }),\n});\n\ntype AgentWorkerStateType = typeof AgentWorkerState.State;\n\n/**\n * Execute node: Calls AgentManager.callAgentInQueue\n * Uses command parameter if available (after interrupt response), otherwise uses input\n */\nasync function executeNode(\n state: AgentWorkerStateType\n): Promise<Partial<AgentWorkerStateType>> {\n const { assistant_id, thread_id, input, command2, runConfig } = state;\n\n // If command exists (after interrupt response), use command; otherwise uses input\n const callParams: {\n assistant_id: string;\n thread_id: string;\n input?: any;\n command?: any;\n runConfig?: Record<string, unknown>;\n } = {\n assistant_id,\n thread_id,\n input,\n command: command2,\n runConfig,\n };\n\n const result = (await AgentManager.getInstance().callAgentInQueue(\n callParams,\n true\n )) as any;\n\n return {\n result,\n };\n}\n\n/**\n * Interrupt node: Throws interrupt and waits for response\n */\nasync function interruptNode(\n state: AgentWorkerStateType\n): Promise<Partial<AgentWorkerStateType>> {\n const { result } = state;\n\n // Extract interrupt value from result.tasks[0].interrupts[0].value\n const interruptValue = result?.tasks?.[0]?.interrupts?.[0]?.value;\n\n if (!interruptValue) {\n throw new Error(\n \"Interrupt node called but no interrupt value found in result\"\n );\n }\n\n // Throw interrupt and wait for response\n const response = await interrupt(interruptValue);\n\n // After response, save the response as command for the next executeNode call\n return {\n command2: {\n resume: response,\n },\n };\n}\n\n/**\n * Conditional routing function\n * Routes to interrupt node if result.tasks has values, otherwise ends\n */\nfunction shouldInterrupt(state: AgentWorkerStateType): \"interrupt\" | \"end\" {\n const { result } = state;\n\n // Check if result.tasks exists and has values\n if (result?.tasks && Array.isArray(result.tasks) && result.tasks.length > 0) {\n // Check if there are interrupts\n if (result.tasks[0]?.interrupts && result.tasks[0].interrupts.length > 0) {\n return \"interrupt\";\n }\n }\n\n return \"end\";\n}\n\n/**\n * End node: Returns the final state and clears intermediate process states\n */\nfunction endNode(state: AgentWorkerStateType): Partial<AgentWorkerStateType> {\n // Save final state from result or input\n const finalState = state.result;\n\n // Clear intermediate process states\n return {\n finalState,\n // Clear intermediate states\n result: undefined,\n interruptValue: undefined,\n command2: undefined,\n };\n}\n\n/**\n * Create the agent worker graph\n */\nexport function createAgentWorkerGraph() {\n const workflow = new StateGraph(AgentWorkerState);\n\n // Add nodes\n workflow.addNode(\"execute\", executeNode);\n workflow.addNode(\"interrupt\", interruptNode);\n workflow.addNode(\"end\", endNode);\n\n // Set entry point: connect START to execute node\n (workflow as any).setEntryPoint(\"execute\");\n\n // Add conditional edge from execute node\n (workflow as any).addConditionalEdges(\"execute\", shouldInterrupt, {\n interrupt: \"interrupt\",\n end: \"end\",\n });\n\n // After interrupt, return to execute node\n (workflow as any).addEdge(\"interrupt\", \"execute\");\n\n // End node leads to END\n (workflow as any).addEdge(\"end\", END);\n\n return workflow.compile();\n}\nexport const agentWorkerGraph = createAgentWorkerGraph();\n","// Agent task event names\nexport const AGENT_TASK_EVENT = \"agent:execute\";\n\n\n\n","import { EventEmitter } from \"events\";\nimport { queueLatticeManager } from \"../queue_lattice\";\n\n/**\n * Event bus service\n * Used for event publishing and subscription between internal system components\n */\nclass EventBus {\n private emitter: EventEmitter;\n private defaultQueueKey: string = \"default\";\n\n constructor() {\n this.emitter = new EventEmitter();\n // Set maximum listener count to avoid memory leak warnings\n this.emitter.setMaxListeners(100);\n }\n\n /**\n * Set the default queue key for queue operations\n * @param queueKey Queue key name\n */\n setDefaultQueueKey(queueKey: string): void {\n this.defaultQueueKey = queueKey;\n }\n\n /**\n * Publish event\n * @param eventName Event name\n * @param data Event data\n * @param useQueue Whether to use queue for publishing\n */\n publish(eventName: string, data: any, useQueue: boolean = false): void {\n if (useQueue) {\n // Push to queue if queue service is available\n if (queueLatticeManager.hasLattice(this.defaultQueueKey)) {\n const queue = queueLatticeManager.getQueueLattice(this.defaultQueueKey);\n queue.push(data).catch((error) => {\n console.error(\"Failed to push event to queue:\", error);\n });\n } else {\n console.warn(\n `Queue \"${this.defaultQueueKey}\" not found. Event will not be queued.`\n );\n }\n } else {\n this.emitter.emit(eventName, data);\n }\n }\n\n /**\n * Subscribe to event\n * @param eventName Event name\n * @param callback Callback function\n */\n subscribe(eventName: string, callback: (data: any) => void): void {\n this.emitter.on(eventName, callback);\n }\n\n /**\n * Unsubscribe from event\n * @param eventName Event name\n * @param callback Callback function\n */\n unsubscribe(eventName: string, callback: (data: any) => void): void {\n this.emitter.off(eventName, callback);\n }\n\n /**\n * Subscribe to event once\n * @param eventName Event name\n * @param callback Callback function\n */\n subscribeOnce(eventName: string, callback: (data: any) => void): void {\n this.emitter.once(eventName, callback);\n }\n}\n\n// Create singleton instance\nconst eventBus = new EventBus();\n\nexport default eventBus;\nexport { eventBus };\n","/**\n * QueueLatticeManager\n *\n * Queue Lattice manager for registering and managing queue services\n */\n\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport {\n QueueLatticeProtocol,\n QueueConfig,\n QueueType,\n QueueClient,\n} from \"@axiom-lattice/protocols\";\nimport { MemoryQueueClient } from \"./MemoryQueueClient\";\n\n/**\n * Queue Lattice interface\n */\nexport interface QueueLattice extends QueueLatticeProtocol {\n key: string;\n config: QueueConfig;\n client: QueueLatticeProtocol[\"client\"];\n}\n\n/**\n * QueueLatticeManager - Singleton queue Lattice manager\n * Responsible for registering and managing various queue service Lattices\n */\nexport class QueueLatticeManager extends BaseLatticeManager<QueueLattice> {\n private static _instance: QueueLatticeManager;\n\n /**\n * Get QueueLatticeManager singleton instance\n */\n public static getInstance(): QueueLatticeManager {\n if (!QueueLatticeManager._instance) {\n QueueLatticeManager._instance = new QueueLatticeManager();\n }\n return QueueLatticeManager._instance;\n }\n\n /**\n * Get Lattice type prefix\n */\n protected getLatticeType(): string {\n return \"queues\";\n }\n\n /**\n * Register queue Lattice\n * @param key Lattice key name\n * @param config Queue configuration\n * @param client Optional queue client. If not provided, will create based on config type.\n * For REDIS type, client must be provided (use @axiom-lattice/queue-redis).\n */\n public registerLattice(\n key: string,\n config: QueueConfig,\n client?: QueueClient\n ): void {\n // Create client based on queue type if not provided\n let queueClient: QueueLatticeProtocol[\"client\"];\n\n if (client) {\n // Use provided client\n queueClient = client;\n } else {\n const queueName = config.queueName || process.env.QUEUE_NAME || \"tasks\";\n\n if (config.type === QueueType.REDIS) {\n throw new Error(\n `Redis queue client must be provided. Please install @axiom-lattice/queue-redis and pass the client to registerLattice. Example: registerLattice(key, config, new RedisQueueClient(queueName, options))`\n );\n } else {\n // Default to memory\n queueClient = new MemoryQueueClient(queueName);\n }\n }\n\n // Create queue Lattice object\n const queueLattice: QueueLattice = {\n key,\n config,\n client: queueClient,\n push: async (item: any) => {\n return queueClient.push(item);\n },\n pop: async () => {\n return queueClient.pop();\n },\n createQueue: queueClient.createQueue\n ? async () => {\n return queueClient.createQueue!();\n }\n : undefined,\n };\n\n // Call base class register method\n this.register(key, queueLattice);\n }\n\n /**\n * Get QueueLattice\n * @param key Lattice key name\n */\n public getQueueLattice(key: string): QueueLattice {\n const queueLattice = this.get(key);\n if (!queueLattice) {\n throw new Error(`QueueLattice ${key} not found`);\n }\n return queueLattice;\n }\n\n /**\n * Get all Lattices\n */\n public getAllLattices(): QueueLattice[] {\n return this.getAll();\n }\n\n /**\n * Check if Lattice exists\n * @param key Lattice key name\n */\n public hasLattice(key: string): boolean {\n return this.has(key);\n }\n\n /**\n * Remove Lattice\n * @param key Lattice key name\n */\n public removeLattice(key: string): boolean {\n return this.remove(key);\n }\n\n /**\n * Clear all Lattices\n */\n public clearLattices(): void {\n this.clear();\n }\n\n /**\n * Get Lattice count\n */\n public getLatticeCount(): number {\n return this.count();\n }\n\n /**\n * Get Lattice key list\n */\n public getLatticeKeys(): string[] {\n return this.keys();\n }\n}\n\n// Export singleton instance\nexport const queueLatticeManager = QueueLatticeManager.getInstance();\n\n// Export convenience methods\nexport const registerQueueLattice = (\n key: string,\n config: QueueConfig,\n client?: QueueClient\n) => queueLatticeManager.registerLattice(key, config, client);\n\nexport const getQueueLattice = (key: string) =>\n queueLatticeManager.getQueueLattice(key);\n\n","/**\n * MemoryQueueClient\n *\n * In-memory queue service implementation\n */\n\nimport { QueueClient, QueueResult } from \"@axiom-lattice/protocols\";\n\n/**\n * In-memory storage for queues: Map<queue_name, message[]>\n * Using Map to support multiple queues (e.g., per tenant)\n */\nconst queues = new Map<string, any[]>();\n\n/**\n * Initialize queue if it doesn't exist\n */\nconst ensureQueue = (queueName: string): void => {\n if (!queues.has(queueName)) {\n queues.set(queueName, []);\n }\n};\n\n/**\n * Memory-based queue client implementation\n */\nexport class MemoryQueueClient implements QueueClient {\n private queueName: string;\n\n constructor(queueName: string = \"tasks\") {\n this.queueName = queueName;\n ensureQueue(this.queueName);\n }\n\n /**\n * Enqueue message (equivalent to lPush - push to left/beginning)\n */\n async push(item: any): Promise<QueueResult<number>> {\n try {\n ensureQueue(this.queueName);\n const queue = queues.get(this.queueName)!;\n\n // lPush behavior: add to the beginning of the array\n queue.unshift(item);\n\n const result = queue.length;\n console.log(\"lPush (memory)\", result);\n return { data: result, error: null };\n } catch (error) {\n console.error(error);\n return { data: null, error };\n }\n }\n\n /**\n * Dequeue message (equivalent to rPop - pop from right/end)\n */\n async pop(): Promise<QueueResult<any>> {\n try {\n ensureQueue(this.queueName);\n const queue = queues.get(this.queueName)!;\n\n // rPop behavior: remove from the end of the array\n // This creates FIFO behavior when combined with lPush (unshift + pop = FIFO)\n const message = queue.pop();\n\n if (message) {\n return { data: message, error: null };\n }\n return { data: null, error: null };\n } catch (error) {\n console.error(error);\n return { data: null, error };\n }\n }\n\n /**\n * Create queue (initialize in memory)\n */\n async createQueue(): Promise<{\n success: boolean;\n queue_name?: string;\n error?: any;\n }> {\n try {\n ensureQueue(this.queueName);\n const queue = queues.get(this.queueName)!;\n const exists = queue !== undefined;\n return { success: true, queue_name: this.queueName };\n } catch (error) {\n console.error(error);\n return { success: false, error };\n }\n }\n}\n\n\n\n","import { AGENT_TASK_EVENT } from \"../constants/agent_task_types\";\nimport eventBus from \"./event_bus\";\n\nexport class AgentManager {\n private static instance: AgentManager;\n private constructor() {}\n private agents: { name: string; agent: any }[] = [];\n\n public static getInstance(): AgentManager {\n if (!AgentManager.instance) {\n AgentManager.instance = new AgentManager();\n }\n return AgentManager.instance;\n }\n\n callAgentInQueue(\n queue: {\n assistant_id: string;\n input?: any;\n thread_id: string;\n command?: any;\n \"x-tenant-id\"?: string;\n runConfig?: Record<string, unknown>;\n },\n return_agent_state?: boolean\n ) {\n return new Promise((resolve, reject) => {\n const callback_event = `${queue.assistant_id}::${queue.thread_id}`;\n if (return_agent_state) {\n eventBus.subscribeOnce(callback_event, (data) => {\n if (data.success) {\n // console.log(\"AgentManager callAgentInQueue success\", data);\n resolve(data.state);\n } else {\n // console.log(\"AgentManager callAgentInQueue error\", data);\n reject(data.error);\n }\n });\n }\n\n try {\n eventBus.publish(\n AGENT_TASK_EVENT,\n {\n ...queue,\n callback_event,\n },\n true\n );\n // without return_agent_state, resolve the promise\n !return_agent_state &&\n resolve({ callback_event_id: callback_event, success: true });\n } catch (error) {\n // without return_agent_state, reject the promise\n !return_agent_state &&\n reject({\n callback_event_id: callback_event,\n success: false,\n error: error,\n });\n }\n });\n }\n}\n","import {\n createMiddleware,\n AgentMiddleware,\n ToolMessage,\n AIMessage,\n} from \"langchain\";\nimport { RemoveMessage } from \"@langchain/core/messages\";\nimport { REMOVE_ALL_MESSAGES } from \"@langchain/langgraph\";\n\n/**\n * Create middleware that patches dangling tool calls in the messages history.\n *\n * When an AI message contains tool_calls but subsequent messages don't include\n * the corresponding ToolMessage responses, this middleware adds synthetic\n * ToolMessages saying the tool call was cancelled.\n *\n * @returns AgentMiddleware that patches dangling tool calls\n *\n * @example\n * ```typescript\n * import { createAgent } from \"langchain\";\n * import { createPatchToolCallsMiddleware } from \"./middleware/patch_tool_calls\";\n *\n * const agent = createAgent({\n * model: \"claude-sonnet-4-5-20250929\",\n * middleware: [createPatchToolCallsMiddleware()],\n * });\n * ```\n */\nexport function createPatchToolCallsMiddleware(): AgentMiddleware {\n return createMiddleware({\n name: \"patchToolCallsMiddleware\",\n beforeAgent: async (state) => {\n const messages = state.messages;\n\n if (!messages || messages.length === 0) {\n return;\n }\n\n const patchedMessages: any[] = [];\n\n // Iterate over the messages and add any dangling tool calls\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n patchedMessages.push(msg);\n\n // Check if this is an AI message with tool calls\n if (AIMessage.isInstance(msg) && msg.tool_calls != null) {\n for (const toolCall of msg.tool_calls) {\n // Look for a corresponding ToolMessage in the messages after this one\n const correspondingToolMsg = messages\n .slice(i)\n .find(\n (m: any) =>\n ToolMessage.isInstance(m) && m.tool_call_id === toolCall.id\n );\n\n if (!correspondingToolMsg) {\n // We have a dangling tool call which needs a ToolMessage\n const toolMsg = `Tool call ${toolCall.name} with id ${toolCall.id} was cancelled - another message came in before it could be completed.`;\n patchedMessages.push(\n new ToolMessage({\n content: toolMsg,\n name: toolCall.name,\n tool_call_id: toolCall.id!,\n })\n );\n }\n }\n }\n }\n\n // Return state update with RemoveMessage followed by patched messages\n return {\n messages: [\n new RemoveMessage({ id: REMOVE_ALL_MESSAGES }),\n ...patchedMessages,\n ],\n };\n },\n });\n}\n","/**\n * StoreBackend: Adapter for LangGraph's BaseStore (persistent, cross-thread).\n */\n\nimport type { Item } from \"@langchain/langgraph\";\nimport type {\n BackendProtocol,\n EditResult,\n FileData,\n FileInfo,\n GrepMatch,\n StateAndStore,\n WriteResult,\n} from \"./protocol.js\";\nimport {\n createFileData,\n fileDataToString,\n formatReadResponse,\n globSearchFiles,\n grepMatchesFromFiles,\n performStringReplacement,\n updateFileData,\n} from \"./utils.js\";\n\n/**\n * Backend that stores files in LangGraph's BaseStore (persistent).\n *\n * Uses LangGraph's Store for persistent, cross-conversation storage.\n * Files are organized via namespaces and persist across all threads.\n *\n * The namespace can include an optional assistant_id for multi-agent isolation.\n */\nexport class StoreBackend implements BackendProtocol {\n private stateAndStore: StateAndStore;\n\n constructor(stateAndStore: StateAndStore) {\n this.stateAndStore = stateAndStore;\n }\n\n /**\n * Get the store instance.\n *\n * @returns BaseStore instance\n * @throws Error if no store is available\n */\n private getStore() {\n const store = this.stateAndStore.store;\n if (!store) {\n throw new Error(\"Store is required but not available in StateAndStore\");\n }\n return store;\n }\n\n /**\n * Get the namespace for store operations.\n *\n * If an assistant_id is available in stateAndStore, return\n * [assistant_id, \"filesystem\"] to provide per-assistant isolation.\n * Otherwise return [\"filesystem\"].\n */\n protected getNamespace(): string[] {\n const namespace = \"filesystem\";\n const assistantId = this.stateAndStore.assistantId;\n\n if (assistantId) {\n return [assistantId, namespace];\n }\n\n return [namespace];\n }\n\n /**\n * Convert a store Item to FileData format.\n *\n * @param storeItem - The store Item containing file data\n * @returns FileData object\n * @throws Error if required fields are missing or have incorrect types\n */\n private convertStoreItemToFileData(storeItem: Item): FileData {\n const value = storeItem.value as any;\n\n if (\n !value.content ||\n !Array.isArray(value.content) ||\n typeof value.created_at !== \"string\" ||\n typeof value.modified_at !== \"string\"\n ) {\n throw new Error(\n `Store item does not contain valid FileData fields. Got keys: ${Object.keys(value).join(\", \")}`,\n );\n }\n\n return {\n content: value.content,\n created_at: value.created_at,\n modified_at: value.modified_at,\n };\n }\n\n /**\n * Convert FileData to a value suitable for store.put().\n *\n * @param fileData - The FileData to convert\n * @returns Object with content, created_at, and modified_at fields\n */\n private convertFileDataToStoreValue(fileData: FileData): Record<string, any> {\n return {\n content: fileData.content,\n created_at: fileData.created_at,\n modified_at: fileData.modified_at,\n };\n }\n\n /**\n * Search store with automatic pagination to retrieve all results.\n *\n * @param store - The store to search\n * @param namespace - Hierarchical path prefix to search within\n * @param options - Optional query, filter, and page_size\n * @returns List of all items matching the search criteria\n */\n private async searchStorePaginated(\n store: any,\n namespace: string[],\n options: {\n query?: string;\n filter?: Record<string, any>;\n pageSize?: number;\n } = {},\n ): Promise<Item[]> {\n const { query, filter, pageSize = 100 } = options;\n const allItems: Item[] = [];\n let offset = 0;\n\n while (true) {\n const pageItems = await store.search(namespace, {\n query,\n filter,\n limit: pageSize,\n offset,\n });\n\n if (!pageItems || pageItems.length === 0) {\n break;\n }\n\n allItems.push(...pageItems);\n\n if (pageItems.length < pageSize) {\n break;\n }\n\n offset += pageSize;\n }\n\n return allItems;\n }\n\n /**\n * List files and directories in the specified directory (non-recursive).\n *\n * @param path - Absolute path to directory\n * @returns List of FileInfo objects for files and directories directly in the directory.\n * Directories have a trailing / in their path and is_dir=true.\n */\n async lsInfo(path: string): Promise<FileInfo[]> {\n const store = this.getStore();\n const namespace = this.getNamespace();\n\n // Retrieve all items and filter by path prefix locally to avoid\n // coupling to store-specific filter semantics\n const items = await this.searchStorePaginated(store, namespace);\n const infos: FileInfo[] = [];\n const subdirs = new Set<string>();\n\n // Normalize path to have trailing slash for proper prefix matching\n const normalizedPath = path.endsWith(\"/\") ? path : path + \"/\";\n\n for (const item of items) {\n const itemKey = String(item.key);\n\n // Check if file is in the specified directory or a subdirectory\n if (!itemKey.startsWith(normalizedPath)) {\n continue;\n }\n\n // Get the relative path after the directory\n const relative = itemKey.substring(normalizedPath.length);\n\n // If relative path contains '/', it's in a subdirectory\n if (relative.includes(\"/\")) {\n // Extract the immediate subdirectory name\n const subdirName = relative.split(\"/\")[0];\n subdirs.add(normalizedPath + subdirName + \"/\");\n continue;\n }\n\n // This is a file directly in the current directory\n try {\n const fd = this.convertStoreItemToFileData(item);\n const size = fd.content.join(\"\\n\").length;\n infos.push({\n path: itemKey,\n is_dir: false,\n size: size,\n modified_at: fd.modified_at,\n });\n } catch {\n // Skip invalid items\n continue;\n }\n }\n\n // Add directories to the results\n for (const subdir of Array.from(subdirs).sort()) {\n infos.push({\n path: subdir,\n is_dir: true,\n size: 0,\n modified_at: \"\",\n });\n }\n\n infos.sort((a, b) => a.path.localeCompare(b.path));\n return infos;\n }\n\n /**\n * Read file content with line numbers.\n *\n * @param filePath - Absolute file path\n * @param offset - Line offset to start reading from (0-indexed)\n * @param limit - Maximum number of lines to read\n * @returns Formatted file content with line numbers, or error message\n */\n async read(\n filePath: string,\n offset: number = 0,\n limit: number = 2000,\n ): Promise<string> {\n try {\n const fileData = await this.readRaw(filePath);\n return formatReadResponse(fileData, offset, limit);\n } catch (e: any) {\n return `Error: ${e.message}`;\n }\n }\n\n /**\n * Read file content as raw FileData.\n *\n * @param filePath - Absolute file path\n * @returns Raw file content as FileData\n */\n async readRaw(filePath: string): Promise<FileData> {\n const store = this.getStore();\n const namespace = this.getNamespace();\n const item = await store.get(namespace, filePath);\n\n if (!item) throw new Error(`File '${filePath}' not found`);\n return this.convertStoreItemToFileData(item);\n }\n\n /**\n * Create a new file with content.\n * Returns WriteResult. External storage sets filesUpdate=null.\n */\n async write(filePath: string, content: string): Promise<WriteResult> {\n const store = this.getStore();\n const namespace = this.getNamespace();\n\n // Check if file exists\n const existing = await store.get(namespace, filePath);\n if (existing) {\n return {\n error: `Cannot write to ${filePath} because it already exists. Read and then make an edit, or write to a new path.`,\n };\n }\n\n // Create new file\n const fileData = createFileData(content);\n const storeValue = this.convertFileDataToStoreValue(fileData);\n await store.put(namespace, filePath, storeValue);\n return { path: filePath, filesUpdate: null };\n }\n\n /**\n * Edit a file by replacing string occurrences.\n * Returns EditResult. External storage sets filesUpdate=null.\n */\n async edit(\n filePath: string,\n oldString: string,\n newString: string,\n replaceAll: boolean = false,\n ): Promise<EditResult> {\n const store = this.getStore();\n const namespace = this.getNamespace();\n\n // Get existing file\n const item = await store.get(namespace, filePath);\n if (!item) {\n return { error: `Error: File '${filePath}' not found` };\n }\n\n try {\n const fileData = this.convertStoreItemToFileData(item);\n const content = fileDataToString(fileData);\n const result = performStringReplacement(\n content,\n oldString,\n newString,\n replaceAll,\n );\n\n if (typeof result === \"string\") {\n return { error: result };\n }\n\n const [newContent, occurrences] = result;\n const newFileData = updateFileData(fileData, newContent);\n\n // Update file in store\n const storeValue = this.convertFileDataToStoreValue(newFileData);\n await store.put(namespace, filePath, storeValue);\n return { path: filePath, filesUpdate: null, occurrences: occurrences };\n } catch (e: any) {\n return { error: `Error: ${e.message}` };\n }\n }\n\n /**\n * Structured search results or error string for invalid input.\n */\n async grepRaw(\n pattern: string,\n path: string = \"/\",\n glob: string | null = null,\n ): Promise<GrepMatch[] | string> {\n const store = this.getStore();\n const namespace = this.getNamespace();\n const items = await this.searchStorePaginated(store, namespace);\n\n const files: Record<string, FileData> = {};\n for (const item of items) {\n try {\n files[item.key] = this.convertStoreItemToFileData(item);\n } catch {\n // Skip invalid items\n continue;\n }\n }\n\n return grepMatchesFromFiles(files, pattern, path, glob);\n }\n\n /**\n * Structured glob matching returning FileInfo objects.\n */\n async globInfo(pattern: string, path: string = \"/\"): Promise<FileInfo[]> {\n const store = this.getStore();\n const namespace = this.getNamespace();\n const items = await this.searchStorePaginated(store, namespace);\n\n const files: Record<string, FileData> = {};\n for (const item of items) {\n try {\n files[item.key] = this.convertStoreItemToFileData(item);\n } catch {\n // Skip invalid items\n continue;\n }\n }\n\n const result = globSearchFiles(files, pattern, path);\n if (result === \"No files found\") {\n return [];\n }\n\n const paths = result.split(\"\\n\");\n const infos: FileInfo[] = [];\n for (const p of paths) {\n const fd = files[p];\n const size = fd ? fd.content.join(\"\\n\").length : 0;\n infos.push({\n path: p,\n is_dir: false,\n size: size,\n modified_at: fd?.modified_at || \"\",\n });\n }\n return infos;\n }\n}\n","/**\n * FilesystemBackend: Read and write files directly from the filesystem.\n *\n * Security and search upgrades:\n * - Secure path resolution with root containment when in virtual_mode (sandboxed to cwd)\n * - Prevent symlink-following on file I/O using O_NOFOLLOW when available\n * - Ripgrep-powered grep with JSON parsing, plus regex fallback\n * and optional glob include filtering, while preserving virtual path behavior\n */\n\nimport * as fs from \"fs/promises\";\nimport * as fsSync from \"fs\";\nimport * as path from \"path\";\nimport { spawn } from \"child_process\";\nimport fg from \"fast-glob\";\nimport micromatch from \"micromatch\";\nimport type {\n BackendProtocol,\n EditResult,\n FileData,\n FileInfo,\n GrepMatch,\n WriteResult,\n} from \"./protocol.js\";\nimport {\n checkEmptyContent,\n formatContentWithLineNumbers,\n performStringReplacement,\n} from \"./utils.js\";\n\nconst SUPPORTS_NOFOLLOW = fsSync.constants.O_NOFOLLOW !== undefined;\n\n/**\n * Backend that reads and writes files directly from the filesystem.\n *\n * Files are accessed using their actual filesystem paths. Relative paths are\n * resolved relative to the current working directory. Content is read/written\n * as plain text, and metadata (timestamps) are derived from filesystem stats.\n */\nexport class FilesystemBackend implements BackendProtocol {\n private cwd: string;\n private virtualMode: boolean;\n private maxFileSizeBytes: number;\n\n constructor(\n options: {\n rootDir?: string;\n virtualMode?: boolean;\n maxFileSizeMb?: number;\n } = {}\n ) {\n const { rootDir, virtualMode = false, maxFileSizeMb = 10 } = options;\n this.cwd = rootDir ? path.resolve(rootDir) : process.cwd();\n this.virtualMode = virtualMode;\n this.maxFileSizeBytes = maxFileSizeMb * 1024 * 1024;\n }\n\n /**\n * Resolve a file path with security checks.\n *\n * When virtualMode=true, treat incoming paths as virtual absolute paths under\n * this.cwd, disallow traversal (.., ~) and ensure resolved path stays within root.\n * When virtualMode=false, preserve legacy behavior: absolute paths are allowed\n * as-is; relative paths resolve under cwd.\n *\n * @param key - File path (absolute, relative, or virtual when virtualMode=true)\n * @returns Resolved absolute path string\n * @throws Error if path traversal detected or path outside root\n */\n private resolvePath(key: string): string {\n if (this.virtualMode) {\n const vpath = key.startsWith(\"/\") ? key : \"/\" + key;\n if (vpath.includes(\"..\") || vpath.startsWith(\"~\")) {\n throw new Error(\"Path traversal not allowed\");\n }\n const full = path.resolve(this.cwd, vpath.substring(1));\n const relative = path.relative(this.cwd, full);\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(`Path: ${full} outside root directory: ${this.cwd}`);\n }\n return full;\n }\n\n if (path.isAbsolute(key)) {\n return key;\n }\n return path.resolve(this.cwd, key);\n }\n\n /**\n * List files and directories in the specified directory (non-recursive).\n *\n * @param dirPath - Absolute directory path to list files from\n * @returns List of FileInfo objects for files and directories directly in the directory.\n * Directories have a trailing / in their path and is_dir=true.\n */\n async lsInfo(dirPath: string): Promise<FileInfo[]> {\n try {\n const resolvedPath = this.resolvePath(dirPath);\n const stat = await fs.stat(resolvedPath);\n\n if (!stat.isDirectory()) {\n return [];\n }\n\n const entries = await fs.readdir(resolvedPath, { withFileTypes: true });\n const results: FileInfo[] = [];\n\n const cwdStr = this.cwd.endsWith(path.sep)\n ? this.cwd\n : this.cwd + path.sep;\n\n for (const entry of entries) {\n const fullPath = path.join(resolvedPath, entry.name);\n\n try {\n const entryStat = await fs.stat(fullPath);\n const isFile = entryStat.isFile();\n const isDir = entryStat.isDirectory();\n\n if (!this.virtualMode) {\n // Non-virtual mode: use absolute paths\n if (isFile) {\n results.push({\n path: fullPath,\n is_dir: false,\n size: entryStat.size,\n modified_at: entryStat.mtime.toISOString(),\n });\n } else if (isDir) {\n results.push({\n path: fullPath + path.sep,\n is_dir: true,\n size: 0,\n modified_at: entryStat.mtime.toISOString(),\n });\n }\n } else {\n let relativePath: string;\n if (fullPath.startsWith(cwdStr)) {\n relativePath = fullPath.substring(cwdStr.length);\n } else if (fullPath.startsWith(this.cwd)) {\n relativePath = fullPath\n .substring(this.cwd.length)\n .replace(/^[/\\\\]/, \"\");\n } else {\n relativePath = fullPath;\n }\n\n relativePath = relativePath.split(path.sep).join(\"/\");\n const virtPath = \"/\" + relativePath;\n\n if (isFile) {\n results.push({\n path: virtPath,\n is_dir: false,\n size: entryStat.size,\n modified_at: entryStat.mtime.toISOString(),\n });\n } else if (isDir) {\n results.push({\n path: virtPath + \"/\",\n is_dir: true,\n size: 0,\n modified_at: entryStat.mtime.toISOString(),\n });\n }\n }\n } catch {\n // Skip entries we can't stat\n continue;\n }\n }\n\n results.sort((a, b) => a.path.localeCompare(b.path));\n return results;\n } catch (e: any) {\n console.error(`Error listing files in ${dirPath}:`, e);\n return [];\n }\n }\n\n /**\n * Read file content with line numbers.\n *\n * @param filePath - Absolute or relative file path\n * @param offset - Line offset to start reading from (0-indexed)\n * @param limit - Maximum number of lines to read\n * @returns Formatted file content with line numbers, or error message\n */\n async read(\n filePath: string,\n offset: number = 0,\n limit: number = 2000\n ): Promise<string> {\n try {\n const resolvedPath = this.resolvePath(filePath);\n\n let content: string;\n\n if (SUPPORTS_NOFOLLOW) {\n const stat = await fs.stat(resolvedPath);\n if (!stat.isFile()) {\n return `Error: File '${filePath}' not found`;\n }\n const fd = await fs.open(\n resolvedPath,\n fsSync.constants.O_RDONLY | fsSync.constants.O_NOFOLLOW\n );\n try {\n content = await fd.readFile({ encoding: \"utf-8\" });\n } finally {\n await fd.close();\n }\n } else {\n const stat = await fs.lstat(resolvedPath);\n if (stat.isSymbolicLink()) {\n return `Error: Symlinks are not allowed: ${filePath}`;\n }\n if (!stat.isFile()) {\n return `Error: File '${filePath}' not found`;\n }\n content = await fs.readFile(resolvedPath, \"utf-8\");\n }\n\n const emptyMsg = checkEmptyContent(content);\n if (emptyMsg) {\n return emptyMsg;\n }\n\n const lines = content.split(\"\\n\");\n const startIdx = offset;\n const endIdx = Math.min(startIdx + limit, lines.length);\n\n if (startIdx >= lines.length) {\n return `Error: Line offset ${offset} exceeds file length (${lines.length} lines)`;\n }\n\n const selectedLines = lines.slice(startIdx, endIdx);\n return formatContentWithLineNumbers(selectedLines, startIdx + 1);\n } catch (e: any) {\n return `Error reading file '${filePath}': ${e.message}`;\n }\n }\n\n /**\n * Read file content as raw FileData.\n *\n * @param filePath - Absolute file path\n * @returns Raw file content as FileData\n */\n async readRaw(filePath: string): Promise<FileData> {\n const resolvedPath = this.resolvePath(filePath);\n\n let content: string;\n let stat: fsSync.Stats;\n\n if (SUPPORTS_NOFOLLOW) {\n stat = await fs.stat(resolvedPath);\n if (!stat.isFile()) throw new Error(`File '${filePath}' not found`);\n const fd = await fs.open(\n resolvedPath,\n fsSync.constants.O_RDONLY | fsSync.constants.O_NOFOLLOW\n );\n try {\n content = await fd.readFile({ encoding: \"utf-8\" });\n } finally {\n await fd.close();\n }\n } else {\n stat = await fs.lstat(resolvedPath);\n if (stat.isSymbolicLink()) {\n throw new Error(`Symlinks are not allowed: ${filePath}`);\n }\n if (!stat.isFile()) throw new Error(`File '${filePath}' not found`);\n content = await fs.readFile(resolvedPath, \"utf-8\");\n }\n\n return {\n content: content.split(\"\\n\"),\n created_at: stat.ctime.toISOString(),\n modified_at: stat.mtime.toISOString(),\n };\n }\n\n /**\n * Create a new file with content.\n * Returns WriteResult. External storage sets filesUpdate=null.\n */\n async write(filePath: string, content: string): Promise<WriteResult> {\n try {\n const resolvedPath = this.resolvePath(filePath);\n\n try {\n const stat = await fs.lstat(resolvedPath);\n if (stat.isSymbolicLink()) {\n return {\n error: `Cannot write to ${filePath} because it is a symlink. Symlinks are not allowed.`,\n };\n }\n return {\n error: `Cannot write to ${filePath} because it already exists. Read and then make an edit, or write to a new path.`,\n };\n } catch {\n // File doesn't exist, good to proceed\n }\n\n await fs.mkdir(path.dirname(resolvedPath), { recursive: true });\n\n if (SUPPORTS_NOFOLLOW) {\n const flags =\n fsSync.constants.O_WRONLY |\n fsSync.constants.O_CREAT |\n fsSync.constants.O_TRUNC |\n fsSync.constants.O_NOFOLLOW;\n\n const fd = await fs.open(resolvedPath, flags, 0o644);\n try {\n await fd.writeFile(content, \"utf-8\");\n } finally {\n await fd.close();\n }\n } else {\n await fs.writeFile(resolvedPath, content, \"utf-8\");\n }\n\n return { path: filePath, filesUpdate: null };\n } catch (e: any) {\n return { error: `Error writing file '${filePath}': ${e.message}` };\n }\n }\n\n /**\n * Edit a file by replacing string occurrences.\n * Returns EditResult. External storage sets filesUpdate=null.\n */\n async edit(\n filePath: string,\n oldString: string,\n newString: string,\n replaceAll: boolean = false\n ): Promise<EditResult> {\n try {\n const resolvedPath = this.resolvePath(filePath);\n\n let content: string;\n\n if (SUPPORTS_NOFOLLOW) {\n const stat = await fs.stat(resolvedPath);\n if (!stat.isFile()) {\n return { error: `Error: File '${filePath}' not found` };\n }\n\n const fd = await fs.open(\n resolvedPath,\n fsSync.constants.O_RDONLY | fsSync.constants.O_NOFOLLOW\n );\n try {\n content = await fd.readFile({ encoding: \"utf-8\" });\n } finally {\n await fd.close();\n }\n } else {\n const stat = await fs.lstat(resolvedPath);\n if (stat.isSymbolicLink()) {\n return { error: `Error: Symlinks are not allowed: ${filePath}` };\n }\n if (!stat.isFile()) {\n return { error: `Error: File '${filePath}' not found` };\n }\n content = await fs.readFile(resolvedPath, \"utf-8\");\n }\n\n const result = performStringReplacement(\n content,\n oldString,\n newString,\n replaceAll\n );\n\n if (typeof result === \"string\") {\n return { error: result };\n }\n\n const [newContent, occurrences] = result;\n\n // Write securely\n if (SUPPORTS_NOFOLLOW) {\n const flags =\n fsSync.constants.O_WRONLY |\n fsSync.constants.O_TRUNC |\n fsSync.constants.O_NOFOLLOW;\n\n const fd = await fs.open(resolvedPath, flags);\n try {\n await fd.writeFile(newContent, \"utf-8\");\n } finally {\n await fd.close();\n }\n } else {\n await fs.writeFile(resolvedPath, newContent, \"utf-8\");\n }\n\n return { path: filePath, filesUpdate: null, occurrences: occurrences };\n } catch (e: any) {\n return { error: `Error editing file '${filePath}': ${e.message}` };\n }\n }\n\n /**\n * Structured search results or error string for invalid input.\n */\n async grepRaw(\n pattern: string,\n dirPath: string = \"/\",\n glob: string | null = null\n ): Promise<GrepMatch[] | string> {\n // Validate regex\n try {\n new RegExp(pattern);\n } catch (e: any) {\n return `Invalid regex pattern: ${e.message}`;\n }\n\n // Resolve base path\n let baseFull: string;\n try {\n baseFull = this.resolvePath(dirPath || \".\");\n } catch {\n return [];\n }\n\n try {\n await fs.stat(baseFull);\n } catch {\n return [];\n }\n\n // Try ripgrep first, fallback to regex search\n let results = await this.ripgrepSearch(pattern, baseFull, glob);\n if (results === null) {\n results = await this.pythonSearch(pattern, baseFull, glob);\n }\n\n const matches: GrepMatch[] = [];\n for (const [fpath, items] of Object.entries(results)) {\n for (const [lineNum, lineText] of items) {\n matches.push({ path: fpath, line: lineNum, text: lineText });\n }\n }\n return matches;\n }\n\n /**\n * Try to use ripgrep for fast searching.\n * Returns null if ripgrep is not available or fails.\n */\n private async ripgrepSearch(\n pattern: string,\n baseFull: string,\n includeGlob: string | null\n ): Promise<Record<string, Array<[number, string]>> | null> {\n return new Promise((resolve) => {\n const args = [\"--json\"];\n if (includeGlob) {\n args.push(\"--glob\", includeGlob);\n }\n args.push(\"--\", pattern, baseFull);\n\n const proc = spawn(\"rg\", args, { timeout: 30000 });\n const results: Record<string, Array<[number, string]>> = {};\n let output = \"\";\n\n proc.stdout.on(\"data\", (data) => {\n output += data.toString();\n });\n\n proc.on(\"close\", (code) => {\n if (code !== 0 && code !== 1) {\n // Error (code 1 means no matches, which is ok)\n resolve(null);\n return;\n }\n\n for (const line of output.split(\"\\n\")) {\n if (!line.trim()) continue;\n try {\n const data = JSON.parse(line);\n if (data.type !== \"match\") continue;\n\n const pdata = data.data || {};\n const ftext = pdata.path?.text;\n if (!ftext) continue;\n\n let virtPath: string;\n if (this.virtualMode) {\n try {\n const resolved = path.resolve(ftext);\n const relative = path.relative(this.cwd, resolved);\n if (relative.startsWith(\"..\")) continue;\n const normalizedRelative = relative.split(path.sep).join(\"/\");\n virtPath = \"/\" + normalizedRelative;\n } catch {\n continue;\n }\n } else {\n virtPath = ftext;\n }\n\n const ln = pdata.line_number;\n const lt = pdata.lines?.text?.replace(/\\n$/, \"\") || \"\";\n if (ln === undefined) continue;\n\n if (!results[virtPath]) {\n results[virtPath] = [];\n }\n results[virtPath].push([ln, lt]);\n } catch {\n // Skip invalid JSON\n continue;\n }\n }\n\n resolve(results);\n });\n\n proc.on(\"error\", () => {\n resolve(null);\n });\n });\n }\n\n /**\n * Fallback regex search implementation.\n */\n private async pythonSearch(\n pattern: string,\n baseFull: string,\n includeGlob: string | null\n ): Promise<Record<string, Array<[number, string]>>> {\n let regex: RegExp;\n try {\n regex = new RegExp(pattern);\n } catch {\n return {};\n }\n\n const results: Record<string, Array<[number, string]>> = {};\n const stat = await fs.stat(baseFull);\n const root = stat.isDirectory() ? baseFull : path.dirname(baseFull);\n\n // Use fast-glob to recursively find all files\n const files = await fg(\"**/*\", {\n cwd: root,\n absolute: true,\n onlyFiles: true,\n dot: true,\n });\n\n for (const fp of files) {\n try {\n // Filter by glob if provided\n if (\n includeGlob &&\n !micromatch.isMatch(path.basename(fp), includeGlob)\n ) {\n continue;\n }\n\n // Check file size\n const stat = await fs.stat(fp);\n if (stat.size > this.maxFileSizeBytes) {\n continue;\n }\n\n // Read and search\n const content = await fs.readFile(fp, \"utf-8\");\n const lines = content.split(\"\\n\");\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (regex.test(line)) {\n let virtPath: string;\n if (this.virtualMode) {\n try {\n const relative = path.relative(this.cwd, fp);\n if (relative.startsWith(\"..\")) continue;\n const normalizedRelative = relative.split(path.sep).join(\"/\");\n virtPath = \"/\" + normalizedRelative;\n } catch {\n continue;\n }\n } else {\n virtPath = fp;\n }\n\n if (!results[virtPath]) {\n results[virtPath] = [];\n }\n results[virtPath].push([i + 1, line]);\n }\n }\n } catch {\n // Skip files we can't read\n continue;\n }\n }\n\n return results;\n }\n\n /**\n * Structured glob matching returning FileInfo objects.\n */\n async globInfo(\n pattern: string,\n searchPath: string = \"/\"\n ): Promise<FileInfo[]> {\n if (pattern.startsWith(\"/\")) {\n pattern = pattern.substring(1);\n }\n\n const resolvedSearchPath =\n searchPath === \"/\" ? this.cwd : this.resolvePath(searchPath);\n\n try {\n const stat = await fs.stat(resolvedSearchPath);\n if (!stat.isDirectory()) {\n return [];\n }\n } catch {\n return [];\n }\n\n const results: FileInfo[] = [];\n\n try {\n // Use fast-glob for pattern matching\n const matches = await fg(pattern, {\n cwd: resolvedSearchPath,\n absolute: true,\n onlyFiles: true,\n dot: true,\n });\n\n for (const matchedPath of matches) {\n try {\n const stat = await fs.stat(matchedPath);\n if (!stat.isFile()) continue;\n\n // Normalize fast-glob paths to platform separators\n // fast-glob returns forward slashes on all platforms, but we need\n // platform-native separators for path comparisons on Windows\n const normalizedPath = matchedPath.split(\"/\").join(path.sep);\n\n if (!this.virtualMode) {\n results.push({\n path: normalizedPath,\n is_dir: false,\n size: stat.size,\n modified_at: stat.mtime.toISOString(),\n });\n } else {\n const cwdStr = this.cwd.endsWith(path.sep)\n ? this.cwd\n : this.cwd + path.sep;\n let relativePath: string;\n\n if (normalizedPath.startsWith(cwdStr)) {\n relativePath = normalizedPath.substring(cwdStr.length);\n } else if (normalizedPath.startsWith(this.cwd)) {\n relativePath = normalizedPath\n .substring(this.cwd.length)\n .replace(/^[/\\\\]/, \"\");\n } else {\n relativePath = normalizedPath;\n }\n\n relativePath = relativePath.split(path.sep).join(\"/\");\n const virt = \"/\" + relativePath;\n results.push({\n path: virt,\n is_dir: false,\n size: stat.size,\n modified_at: stat.mtime.toISOString(),\n });\n }\n } catch {\n // Skip files we can't stat\n continue;\n }\n }\n } catch {\n // Ignore glob errors\n }\n\n results.sort((a, b) => a.path.localeCompare(b.path));\n return results;\n }\n}\n","/**\n * CompositeBackend: Route operations to different backends based on path prefix.\n */\n\nimport type {\n BackendProtocol,\n EditResult,\n FileData,\n FileInfo,\n GrepMatch,\n WriteResult,\n} from \"./protocol.js\";\n\n/**\n * Backend that routes file operations to different backends based on path prefix.\n *\n * This enables hybrid storage strategies like:\n * - `/memories/` → StoreBackend (persistent, cross-thread)\n * - Everything else → StateBackend (ephemeral, per-thread)\n *\n * The CompositeBackend handles path prefix stripping/re-adding transparently.\n */\nexport class CompositeBackend implements BackendProtocol {\n private default: BackendProtocol;\n private routes: Record<string, BackendProtocol>;\n private sortedRoutes: Array<[string, BackendProtocol]>;\n\n constructor(\n defaultBackend: BackendProtocol,\n routes: Record<string, BackendProtocol>,\n ) {\n this.default = defaultBackend;\n this.routes = routes;\n\n // Sort routes by length (longest first) for correct prefix matching\n this.sortedRoutes = Object.entries(routes).sort(\n (a, b) => b[0].length - a[0].length,\n );\n }\n\n /**\n * Determine which backend handles this key and strip prefix.\n *\n * @param key - Original file path\n * @returns Tuple of [backend, stripped_key] where stripped_key has the route\n * prefix removed (but keeps leading slash).\n */\n private getBackendAndKey(key: string): [BackendProtocol, string] {\n // Check routes in order of length (longest first)\n for (const [prefix, backend] of this.sortedRoutes) {\n if (key.startsWith(prefix)) {\n // Strip full prefix and ensure a leading slash remains\n // e.g., \"/memories/notes.txt\" → \"/notes.txt\"; \"/memories/\" → \"/\"\n const suffix = key.substring(prefix.length);\n const strippedKey = suffix ? \"/\" + suffix : \"/\";\n return [backend, strippedKey];\n }\n }\n\n return [this.default, key];\n }\n\n /**\n * List files and directories in the specified directory (non-recursive).\n *\n * @param path - Absolute path to directory\n * @returns List of FileInfo objects with route prefixes added, for files and directories\n * directly in the directory. Directories have a trailing / in their path and is_dir=true.\n */\n async lsInfo(path: string): Promise<FileInfo[]> {\n // Check if path matches a specific route\n for (const [routePrefix, backend] of this.sortedRoutes) {\n if (path.startsWith(routePrefix.replace(/\\/$/, \"\"))) {\n // Query only the matching routed backend\n const suffix = path.substring(routePrefix.length);\n const searchPath = suffix ? \"/\" + suffix : \"/\";\n const infos = await backend.lsInfo(searchPath);\n\n // Add route prefix back to paths\n const prefixed: FileInfo[] = [];\n for (const fi of infos) {\n prefixed.push({\n ...fi,\n path: routePrefix.slice(0, -1) + fi.path,\n });\n }\n return prefixed;\n }\n }\n\n // At root, aggregate default and all routed backends\n if (path === \"/\") {\n const results: FileInfo[] = [];\n const defaultInfos = await this.default.lsInfo(path);\n results.push(...defaultInfos);\n\n // Add the route itself as a directory (e.g., /memories/)\n for (const [routePrefix] of this.sortedRoutes) {\n results.push({\n path: routePrefix,\n is_dir: true,\n size: 0,\n modified_at: \"\",\n });\n }\n\n results.sort((a, b) => a.path.localeCompare(b.path));\n return results;\n }\n\n // Path doesn't match a route: query only default backend\n return await this.default.lsInfo(path);\n }\n\n /**\n * Read file content, routing to appropriate backend.\n *\n * @param filePath - Absolute file path\n * @param offset - Line offset to start reading from (0-indexed)\n * @param limit - Maximum number of lines to read\n * @returns Formatted file content with line numbers, or error message\n */\n async read(\n filePath: string,\n offset: number = 0,\n limit: number = 2000,\n ): Promise<string> {\n const [backend, strippedKey] = this.getBackendAndKey(filePath);\n return await backend.read(strippedKey, offset, limit);\n }\n\n /**\n * Read file content as raw FileData.\n *\n * @param filePath - Absolute file path\n * @returns Raw file content as FileData\n */\n async readRaw(filePath: string): Promise<FileData> {\n const [backend, strippedKey] = this.getBackendAndKey(filePath);\n return await backend.readRaw(strippedKey);\n }\n\n /**\n * Structured search results or error string for invalid input.\n */\n async grepRaw(\n pattern: string,\n path: string = \"/\",\n glob: string | null = null,\n ): Promise<GrepMatch[] | string> {\n // If path targets a specific route, search only that backend\n for (const [routePrefix, backend] of this.sortedRoutes) {\n if (path.startsWith(routePrefix.replace(/\\/$/, \"\"))) {\n const searchPath = path.substring(routePrefix.length - 1);\n const raw = await backend.grepRaw(pattern, searchPath || \"/\", glob);\n\n if (typeof raw === \"string\") {\n return raw;\n }\n\n // Add route prefix back\n return raw.map((m) => ({\n ...m,\n path: routePrefix.slice(0, -1) + m.path,\n }));\n }\n }\n\n // Otherwise, search default and all routed backends and merge\n const allMatches: GrepMatch[] = [];\n const rawDefault = await this.default.grepRaw(pattern, path, glob);\n\n if (typeof rawDefault === \"string\") {\n return rawDefault;\n }\n\n allMatches.push(...rawDefault);\n\n // Search all routes\n for (const [routePrefix, backend] of Object.entries(this.routes)) {\n const raw = await backend.grepRaw(pattern, \"/\", glob);\n\n if (typeof raw === \"string\") {\n return raw;\n }\n\n // Add route prefix back\n allMatches.push(\n ...raw.map((m) => ({\n ...m,\n path: routePrefix.slice(0, -1) + m.path,\n })),\n );\n }\n\n return allMatches;\n }\n\n /**\n * Structured glob matching returning FileInfo objects.\n */\n async globInfo(pattern: string, path: string = \"/\"): Promise<FileInfo[]> {\n const results: FileInfo[] = [];\n\n // Route based on path, not pattern\n for (const [routePrefix, backend] of this.sortedRoutes) {\n if (path.startsWith(routePrefix.replace(/\\/$/, \"\"))) {\n const searchPath = path.substring(routePrefix.length - 1);\n const infos = await backend.globInfo(pattern, searchPath || \"/\");\n\n // Add route prefix back\n return infos.map((fi) => ({\n ...fi,\n path: routePrefix.slice(0, -1) + fi.path,\n }));\n }\n }\n\n // Path doesn't match any specific route - search default backend AND all routed backends\n const defaultInfos = await this.default.globInfo(pattern, path);\n results.push(...defaultInfos);\n\n for (const [routePrefix, backend] of Object.entries(this.routes)) {\n const infos = await backend.globInfo(pattern, \"/\");\n results.push(\n ...infos.map((fi) => ({\n ...fi,\n path: routePrefix.slice(0, -1) + fi.path,\n })),\n );\n }\n\n // Deterministic ordering\n results.sort((a, b) => a.path.localeCompare(b.path));\n return results;\n }\n\n /**\n * Create a new file, routing to appropriate backend.\n *\n * @param filePath - Absolute file path\n * @param content - File content as string\n * @returns WriteResult with path or error\n */\n async write(filePath: string, content: string): Promise<WriteResult> {\n const [backend, strippedKey] = this.getBackendAndKey(filePath);\n return await backend.write(strippedKey, content);\n }\n\n /**\n * Edit a file, routing to appropriate backend.\n *\n * @param filePath - Absolute file path\n * @param oldString - String to find and replace\n * @param newString - Replacement string\n * @param replaceAll - If true, replace all occurrences\n * @returns EditResult with path, occurrences, or error\n */\n async edit(\n filePath: string,\n oldString: string,\n newString: string,\n replaceAll: boolean = false,\n ): Promise<EditResult> {\n const [backend, strippedKey] = this.getBackendAndKey(filePath);\n return await backend.edit(strippedKey, oldString, newString, replaceAll);\n }\n}\n","/**\n * MemoryBackend: In-memory file storage backend.\n *\n * Stores files in a shared Map instance. Useful for sharing file state\n * across multiple agents within the same process (e.g., team members).\n *\n * All operations are synchronous and use in-memory storage.\n */\n\nimport type {\n BackendProtocol,\n EditResult,\n FileData,\n FileInfo,\n GrepMatch,\n WriteResult,\n} from \"./protocol.js\";\nimport {\n createFileData,\n fileDataToString,\n formatReadResponse,\n globSearchFiles,\n grepMatchesFromFiles,\n performStringReplacement,\n updateFileData,\n} from \"./utils.js\";\n\nexport class MemoryBackend implements BackendProtocol {\n private files: Map<string, FileData>;\n\n constructor(files?: Map<string, FileData>) {\n this.files = files ?? new Map();\n }\n\n private getFiles(): Record<string, FileData> {\n return Object.fromEntries(this.files);\n }\n\n lsInfo(path: string): FileInfo[] {\n const files = this.getFiles();\n const infos: FileInfo[] = [];\n const subdirs = new Set<string>();\n\n const normalizedPath = path.endsWith(\"/\") ? path : path + \"/\";\n\n for (const [k, fd] of Object.entries(files)) {\n if (!k.startsWith(normalizedPath)) {\n continue;\n }\n\n const relative = k.substring(normalizedPath.length);\n\n if (relative.includes(\"/\")) {\n const subdirName = relative.split(\"/\")[0];\n subdirs.add(normalizedPath + subdirName + \"/\");\n continue;\n }\n\n const size = fd.content.join(\"\\n\").length;\n infos.push({\n path: k,\n is_dir: false,\n size: size,\n modified_at: fd.modified_at,\n });\n }\n\n for (const subdir of Array.from(subdirs).sort()) {\n infos.push({\n path: subdir,\n is_dir: true,\n size: 0,\n modified_at: \"\",\n });\n }\n\n infos.sort((a, b) => a.path.localeCompare(b.path));\n return infos;\n }\n\n read(filePath: string, offset: number = 0, limit: number = 2000): string {\n const files = this.getFiles();\n const fileData = files[filePath];\n\n if (!fileData) {\n return `Error: File '${filePath}' not found`;\n }\n\n return formatReadResponse(fileData, offset, limit);\n }\n\n readRaw(filePath: string): FileData {\n const fileData = this.files.get(filePath);\n\n if (!fileData) {\n throw new Error(`File '${filePath}' not found`);\n }\n\n return fileData;\n }\n\n write(filePath: string, content: string): WriteResult {\n if (this.files.has(filePath)) {\n return {\n error: `Cannot write to ${filePath} because it already exists. Read and then make an edit, or write to a new path.`,\n };\n }\n\n const newFileData = createFileData(content);\n this.files.set(filePath, newFileData);\n return { path: filePath, filesUpdate: null };\n }\n\n edit(\n filePath: string,\n oldString: string,\n newString: string,\n replaceAll: boolean = false,\n ): EditResult {\n const fileData = this.files.get(filePath);\n\n if (!fileData) {\n return { error: `Error: File '${filePath}' not found` };\n }\n\n const content = fileDataToString(fileData);\n const result = performStringReplacement(\n content,\n oldString,\n newString,\n replaceAll,\n );\n\n if (typeof result === \"string\") {\n return { error: result };\n }\n\n const [newContent, occurrences] = result;\n const newFileData = updateFileData(fileData, newContent);\n this.files.set(filePath, newFileData);\n return { path: filePath, filesUpdate: null, occurrences };\n }\n\n grepRaw(\n pattern: string,\n path: string = \"/\",\n glob: string | null = null,\n ): GrepMatch[] | string {\n const files = this.getFiles();\n return grepMatchesFromFiles(files, pattern, path, glob);\n }\n\n globInfo(pattern: string, path: string = \"/\"): FileInfo[] {\n const files = this.getFiles();\n const result = globSearchFiles(files, pattern, path);\n\n if (result === \"No files found\") {\n return [];\n }\n\n const paths = result.split(\"\\n\");\n const infos: FileInfo[] = [];\n for (const p of paths) {\n const fd = files[p];\n const size = fd ? fd.content.join(\"\\n\").length : 0;\n infos.push({\n path: p,\n is_dir: false,\n size: size,\n modified_at: fd?.modified_at || \"\",\n });\n }\n return infos;\n }\n}\n","import { Command } from \"@langchain/langgraph\";\nimport { z } from \"zod\";\nimport { createMiddleware, tool, ToolMessage } from \"langchain\";\nimport { genUIMarkdown } from \"../../util/genUIMarkdown\";\n\nconst WRITE_TODOS_DESCRIPTION = `Use this tool to create and manage a structured task list for your current work session. This helps you track progress, organize complex tasks, and demonstrate thoroughness to the user.\nIt also helps the user understand the progress of the task and overall progress of their requests.\nOnly use this tool if you think it will be helpful in staying organized. If the user's request is trivial and takes less than 3 steps, it is better to NOT use this tool and just do the taks directly.\n\n## When to Use This Tool\nUse this tool in these scenarios:\n\n1. Complex multi-step tasks - When a task requires 3 or more distinct steps or actions\n2. Non-trivial and complex tasks - Tasks that require careful planning or multiple operations\n3. User explicitly requests todo list - When the user directly asks you to use the todo list\n4. User provides multiple tasks - When users provide a list of things to be done (numbered or comma-separated)\n5. The plan may need future revisions or updates based on results from the first few steps. Keeping track of this in a list is helpful.\n\n## How to Use This Tool\n1. When you start working on a task - Mark it as in_progress BEFORE beginning work.\n2. After completing a task - Mark it as completed and add any new follow-up tasks discovered during implementation.\n3. You can also update future tasks, such as deleting them if they are no longer necessary, or adding new tasks that are necessary. Don't change previously completed tasks.\n4. You can make several updates to the todo list at once. For example, when you complete a task, you can mark the next task you need to start as in_progress.\n\n## When NOT to Use This Tool\nIt is important to skip using this tool when:\n1. There is only a single, straightforward task\n2. The task is trivial and tracking it provides no benefit\n3. The task can be completed in less than 3 trivial steps\n4. The task is purely conversational or informational\n\n## Examples of When to Use the Todo List\n\n<example>\nUser: I want to add a dark mode toggle to the application settings. Make sure you run the tests and build when you're done!\nAssistant: I'll help add a dark mode toggle to your application settings. Let me create a todo list to track this implementation.\n*Creates todo list with the following items:*\n1. Create dark mode toggle component in Settings page\n2. Add dark mode state management (context/store)\n3. Implement CSS-in-JS styles for dark theme\n4. Update existing components to support theme switching\n5. Run tests and build process, addressing any failures or errors that occur\n*Begins working on the first task*\n\n<reasoning>\nThe assistant used the todo list because:\n1. Adding dark mode in it of itself is a multi-step feature requiring UI, state management, and styling changes\n2. The assistant inferred that tests and build need to pass by adding \"Ensure tests and build succeed\" as the final task\n3. Both of the user's requests are complex and require multiple steps to complete.\n</reasoning>\n</example>\n\n<example>\nUser: Help me plan a comprehensive marketing campaign for our new product launch, including social media, email marketing, and press releases.\nAssistant: I'll help you plan a comprehensive marketing campaign for your product launch. Let me create a todo list to organize all the components.\n*Creates todo list with the following items:*\n1. Define target audience and key messaging\n2. Create social media content calendar and posting schedule\n3. Design email marketing sequence and automation flows\n4. Draft press release and identify media contacts\n5. Set up tracking and analytics for campaign performance\n6. Create visual assets and brand materials\n7. Coordinate launch timeline and deliverables\n*Begins working on the first task*\n\n<reasoning>\nThe assistant used the todo list because:\n1. Marketing campaign planning involves multiple distinct channels and activities\n2. Each component requires careful coordination and planning\n3. The systematic approach ensures all aspects of the launch are covered\n</reasoning>\n</example>\n\n<example>\nUser: Help me rename the function getCwd to getCurrentWorkingDirectory across my project\nAssistant: Let me first search through your codebase to find all occurrences of 'getCwd'.\n*Uses search tools to locate all instances of getCwd in the codebase*\nAssistant: I've found 15 instances of 'getCwd' across 8 different files. Let me create a todo list to track these changes.\n*Creates todo list with specific items for each file that needs updating*\n\n<reasoning>\nThe assistant used the todo list because:\n1. The assistant searched to understand the scope of the task\n2. Upon finding multiple occurrences across different files, it determined this was a complex task with multiple steps (>3)\n3. The todo list helps ensure every instance is tracked and updated systematically\n4. This approach prevents missing any occurrences and maintains consistency.\n</reasoning>\n</example>\n\n<example>\nUser: I need help organizing my home office: decluttering the desk, setting up a filing system, organizing digital files, and creating a daily workflow.\nAssistant: I'll help you organize your home office systematically. Let me create a todo list to track each area of organization.\n*Creates todo list with items like: 1) Sort and declutter desk items, 2) Set up physical filing system for documents, 3) Organize digital files and folders, 4) Create daily workflow and productivity systems, 5) Establish maintenance routines*\nLet's start with decluttering your desk space to create a clean foundation for the other organizational systems.\n\n<reasoning>\nThe assistant used the todo list because:\n1. The user provided multiple distinct organizational tasks\n2. Each area requires different approaches and careful planning\n3. Home organization benefits from systematic, step-by-step completion\n4. Progress tracking ensures all areas are addressed thoroughly\n</reasoning>\n</example>\n\n## Examples of When NOT to Use the Todo List\n\n<example>\nUser: How do I print 'Hello World' in Python?\nAssistant: In Python, you can print \"Hello World\" with this simple code:\n\n\\`\\`\\`python\nprint(\"Hello World\")\n\\`\\`\\`\n\nThis will output the text \"Hello World\" to the console when executed.</assistant>\n\n<reasoning>\nThe assistant did not use the todo list because this is a single, trivial task that can be completed in one step. There's no need to track multiple tasks or steps for such a straightforward request.\n</reasoning>\n</example>\n\n<example>\nUser: What's the best way to water houseplants?\nAssistant: The best way to water houseplants depends on the specific plant type, but here are some general guidelines:\n\n- Check soil moisture by inserting your finger about 1-2 inches into the soil\n- Water thoroughly when the top inch feels dry, allowing water to drain from the bottom\n- Use room temperature water and water in the morning when possible\n- Avoid overwatering, which is more harmful than underwatering for most plants\n\nDifferent plants have different needs, so it's important to research your specific varieties for optimal care.\n\n<reasoning>\nThe assistant did not use the todo list because this is an informational request with no actual tasks to complete. The user is simply asking for advice and explanation, not for the assistant to perform multiple steps or activities.\n</reasoning>\n</example>\n\n<example>\nUser: Can you add a comment to the calculateTotal function to explain what it does?\nAssistant: Sure, let me add a comment to the calculateTotal function to explain what it does.\n* Uses the Edit tool to add a comment to the calculateTotal function *\n\n<reasoning>\nThe assistant did not use the todo list because this is a single, straightforward task confined to one location. Adding a comment doesn't require tracking multiple steps or systematic organization.\n</reasoning>\n</example>\n\n<example>\nUser: What time is it in Tokyo right now?\nAssistant: I'll check the current time in Tokyo for you.\n\n*Searches for current time in Tokyo*\n\nThe current time in Tokyo, Japan is [current time]. Tokyo is in the Japan Standard Time (JST) zone, which is UTC+9.\n\n<reasoning>\nThe assistant did not use the todo list because this is a single information lookup with immediate results. There are no multiple steps to track or organize, making the todo list unnecessary for this straightforward request.\n</reasoning>\n</example>\n\n<example>\nUser: I need to write a function that checks if a number is prime and then test it out.\nAssistant: I'll help you write a function that checks if a number is prime and then test it out.\n*Writes function that checks if a number is prime*\n*Tests the function*\n\n<reasoning>\nEven though this is a multi-step task, it is very straightforward and can be completed in two trivial steps (which is less than 3 steps!). Using the todo list here is overkill and wastes time and tokens.\n</reasoning>\n</example>\n\n<example>\nUser: I want you to order a pizza from Dominos, order a burger from McDonald's, and order a salad from Subway.\nAssistant: I'll help you order a pizza from Dominos, order a burger from McDonald's, and order a salad from Subway.\n*Orders a pizza from Dominos*\n*Orders a burger from McDonald's*\n*Orders a salad from Subway*\n\n<reasoning>\nEven though this is a multi-step task, assuming the assistant has the ability to order from these restaurants, it is very straightforward and can be completed in three trivial tool calls. \nUsing the todo list here is overkill and wastes time and tokens. These three tool calls should be made in parallel, in fact.\n</reasoning>\n</example>\n\n\n## Task States and Management\n\n1. **Task States**: Use these states to track progress:\n - pending: Task not yet started\n - in_progress: Currently working on (you can have multiple tasks in_progress at a time if they are not related to each other and can be run in parallel)\n - completed: Task finished successfully\n\n2. **Task Management**:\n - Update task status in real-time as you work\n - Mark tasks complete IMMEDIATELY after finishing (don't batch completions)\n - Complete current tasks before starting new ones\n - Remove tasks that are no longer relevant from the list entirely\n - IMPORTANT: When you write this todo list, you should mark your first task (or tasks) as in_progress immediately!.\n - IMPORTANT: Unless all tasks are completed, you should always have at least one task in_progress to show the user that you are working on something.\n\n3. **Task Completion Requirements**:\n - ONLY mark a task as completed when you have FULLY accomplished it\n - If you encounter errors, blockers, or cannot finish, keep the task as in_progress\n - When blocked, create a new task describing what needs to be resolved\n - Never mark a task as completed if:\n - There are unresolved issues or errors\n - Work is partial or incomplete\n - You encountered blockers that prevent completion\n - You couldn't find necessary resources or dependencies\n - Quality standards haven't been met\n\n4. **Task Breakdown**:\n - Create specific, actionable items\n - Break complex tasks into smaller, manageable steps\n - Use clear, descriptive task names\n\nBeing proactive with task management demonstrates attentiveness and ensures you complete all requirements successfully\nRemember: If you only need to make a few tool calls to complete a task, and it is clear what you need to do, it is better to just do the task directly and NOT call this tool at all.`;\nconst TODO_LIST_MIDDLEWARE_SYSTEM_PROMPT = `## \\`write_todos\\`\n\nYou have access to the \\`write_todos\\` tool to help you manage and plan complex objectives. \nUse this tool for complex objectives to ensure that you are tracking each necessary step and giving the user visibility into your progress.\nThis tool is very helpful for planning complex objectives, and for breaking down these larger complex objectives into smaller steps.\n\nIt is critical that you mark todos as completed as soon as you are done with a step. Do not batch up multiple steps before marking them as completed.\nFor simple objectives that only require a few steps, it is better to just complete the objective directly and NOT use this tool.\nWriting todos takes time and tokens, use it when it is helpful for managing complex many-step problems! But not for simple few-step requests.\n\n## Important To-Do List Usage Notes to Remember\n- The \\`write_todos\\` tool should never be called multiple times in parallel.\n- Don't be afraid to revise the To-Do list as you go. New information may reveal new tasks that need to be done, or old tasks that are irrelevant.`;\nconst TodoStatus = z\n .enum([\"pending\", \"in_progress\", \"completed\"])\n .describe(\"Status of the todo\");\nconst TodoSchema = z.object({\n content: z.string().describe(\"Content of the todo item\"),\n status: TodoStatus,\n});\nconst stateSchema = z.object({ todos: z.array(TodoSchema).default([]) });\n\nexport function todoListMiddleware(options?: {\n systemPrompt?: string;\n toolDescription?: string;\n}) {\n /**\n * Write todos tool - manages todo list with Command return\n */\n const writeTodos = tool(\n ({ todos }, config) => {\n return new Command({\n update: {\n todos,\n messages: [\n new ToolMessage({\n content: genUIMarkdown(\"todo_list\", todos),\n tool_call_id: config.toolCall?.id,\n }),\n ],\n },\n });\n },\n {\n name: \"write_todos\",\n description: options?.toolDescription ?? WRITE_TODOS_DESCRIPTION,\n schema: z.object({\n todos: z.array(TodoSchema).describe(\"List of todo items to update\"),\n }),\n }\n );\n return createMiddleware({\n name: \"todoListMiddleware\",\n stateSchema,\n tools: [writeTodos],\n wrapModelCall: (request, handler) =>\n handler({\n ...request,\n systemPrompt:\n (request.systemPrompt ? `${request.systemPrompt}\\n\\n` : \"\") +\n (options?.systemPrompt ?? TODO_LIST_MIDDLEWARE_SYSTEM_PROMPT),\n }),\n });\n}\n","/**\n * Filesystem Backend Factory\n *\n * Common utility for creating filesystem backend from middleware config.\n */\n\nimport type { MiddlewareConfig } from \"../../agent_lattice/types\";\nimport { sandboxLatticeManager } from \"../../sandbox_lattice/SandboxLatticeManager\";\nimport { SandboxFilesystem } from \"../../deep_agent_new/backends/sandboxFiles\";\n\nexport function createFilesystemBackendFactory(\n middlewareConfigs: MiddlewareConfig[]\n): ((config: { state: unknown; store?: any }) => Promise<any>) | undefined {\n const filesystemConfig = middlewareConfigs.find(m => m.type === \"filesystem\");\n\n if (!filesystemConfig || !filesystemConfig.enabled) {\n return undefined;\n }\n\n const isolatedLevel = filesystemConfig.config?.isolatedLevel || \"global\";\n\n return async (config: { state: unknown, workspaceId?: string, projectId?: string }) => {\n const { workspaceId, projectId } = config;\n let sandboxName = \"global\";\n\n if (isolatedLevel === \"agent\") {\n sandboxName = \"agent\";\n } else if (isolatedLevel === \"thread\") {\n sandboxName = \"thread\";\n }\n\n const sandboxManager = sandboxLatticeManager.getSandboxLattice(\"default\");\n if (!sandboxManager) {\n throw new Error(\"Sandbox manager not found\");\n }\n\n return new SandboxFilesystem({\n sandboxInstance: await sandboxManager.createSandbox(sandboxName),\n workingDirectory: workspaceId && projectId ? `/workspaces/${workspaceId}/${projectId}` : \"/\"\n });\n };\n}\n","/**\n * Deep Agent Graph Builder\n *\n * 实现 Deep Agent 类型的 Agent Graph 构建\n */\n\nimport { CompiledStateGraph } from \"@langchain/langgraph\";\nimport { createDeepAgent } from \"../../deep_agent_new/agent\";\nimport { AgentLattice, AgentBuildParams, AgentClient, MiddlewareConfig } from \"../types\";\nimport { AgentGraphBuilder } from \"./AgentGraphBuilder\";\nimport { getToolClient } from \"../../tool_lattice/ToolLatticeManager\";\nimport { AgentMiddleware } from \"langchain\";\nimport { createAgentClientFromAgentLattice } from \"@agent_lattice/AgentLatticeManager\";\nimport { getCheckpointSaver } from \"@memory_lattice/MemoryLatticeManager\";\nimport { createCommonMiddlewares } from \"./commonMiddleware\";\nimport { createFilesystemBackendFactory } from \"./filesystemBackend\";\n\nexport class DeepAgentGraphBuilder implements AgentGraphBuilder {\n /**\n * 根据 middleware 配置创建 middlewares\n */\n private createMiddlewares(middlewareConfigs: MiddlewareConfig[]) {\n return createCommonMiddlewares(middlewareConfigs);\n }\n\n /**\n * 构建Deep Agent Graph\n *\n * @param agentLattice Agent Lattice对象\n * @param params Agent构建参数\n * @returns 返回CompiledGraph对象\n */\n build(agentLattice: AgentLattice, params: AgentBuildParams): AgentClient {\n const tools = params.tools\n .map((t) => {\n const toolClient = getToolClient(t.key);\n return toolClient;\n })\n .filter((tool) => tool !== undefined);\n\n const subagents = params.subAgents.map((sa) => {\n if (sa.client) {\n return {\n key: sa.config.key,\n name: sa.config.name,\n description: sa.config.description,\n runnable: sa.client,\n };\n } else {\n const subagentClient = createAgentClientFromAgentLattice({\n config: sa.config,\n });\n return {\n key: sa.config.key,\n name: sa.config.name,\n description: sa.config.description,\n runnable: subagentClient,\n };\n }\n });\n\n const middlewareConfigs = params.middleware || [];\n const filesystemBackend = createFilesystemBackendFactory(middlewareConfigs);\n const middlewares = this.createMiddlewares(middlewareConfigs);\n\n const deepAgent = createDeepAgent({\n tools: tools,\n model: params.model,\n contextSchema: params.stateSchema,\n systemPrompt: params.prompt,\n subagents,\n checkpointer: getCheckpointSaver(\"default\"),\n skills: params.skillCategories,\n backend: filesystemBackend,\n middleware: middlewares,\n });\n\n return deepAgent as AgentClient;\n }\n}\n","/**\n * Agent Team - High-level Facade\n *\n * createAgentTeam() wires together the TaskListStore, MailboxStore,\n * and team middleware to produce a ready-to-use TeamLead ReactAgent.\n *\n * Usage:\n *\n * ```typescript\n * import { createAgentTeam } from \"@axiom-lattice/core\";\n *\n * const team = createAgentTeam({\n * teammates: [\n * { name: \"researcher\", role: \"research\", description: \"Web research\", tools: [searchTool] },\n * { name: \"writer\", role: \"writing\", description: \"Report writing\", tools: [writeTool] },\n * ],\n * maxConcurrency: 3,\n * });\n *\n * await team.invoke({\n * messages: [{ role: \"human\", content: \"Research and write a report on X\" }],\n * });\n * ```\n */\n\nimport { z } from \"zod/v3\";\nimport { createAgent, type AgentMiddleware } from \"langchain\";\nimport type { ReactAgent } from \"langchain\";\nimport type { TeamConfig } from \"./types.js\";\nimport { MessageType } from \"./types.js\";\nimport { InMemoryTaskListStore } from \"./stores/InMemoryTaskListStore.js\";\nimport { InMemoryMailboxStore } from \"./stores/InMemoryMailboxStore.js\";\nimport { createTeamMiddleware } from \"./middleware/team.js\";\nimport { createReactAgentSchema } from \"../agent_lattice/builders/state.js\";\nimport { createFilesystemMiddleware } from \"../deep_agent_new/middleware/fs.js\";\n\n/**\n * Teammate info in state (reference todos.ts TodoSchema pattern)\n */\nconst TeammateInfoSchema = z.object({\n name: z.string().describe(\"Teammate name\"),\n role: z.string().describe(\"Role category (e.g. research, writing, review)\"),\n description: z.string().describe(\"What this teammate focuses on\"),\n});\n\n/**\n * Task info snapshot for state\n */\nconst TeamTaskInfoSchema = z.object({\n id: z.string(),\n title: z.string(),\n description: z.string(),\n status: z.string().optional(),\n});\n\n/**\n * Mailbox message for state storage\n */\nconst MailboxMessageSchema = z.object({\n id: z.string().describe(\"Unique message identifier\"),\n from: z.string().describe(\"Sender agent name\"),\n to: z.string().describe(\"Recipient agent name\"),\n content: z.string().describe(\"Message content\"),\n timestamp: z.string().describe(\"ISO timestamp when the message was sent\"),\n type: z.nativeEnum(MessageType).describe(\"Message type\"),\n read: z.boolean().describe(\"Whether the recipient has read this message\"),\n});\n\n/**\n * Full team info stored in state when create_team succeeds\n */\nconst TeamInfoSchema = z.object({\n teamId: z.string().describe(\"Unique team identifier\"),\n teamLeadId: z.string().default(\"team_lead\").describe(\"Team lead agent ID\"),\n teammates: z.array(TeammateInfoSchema).describe(\"Active teammates in this team\"),\n tasks: z.array(TeamTaskInfoSchema).optional().describe(\"Initial tasks snapshot\"),\n createdAt: z.string().optional().describe(\"ISO timestamp when team was created\"),\n});\n\n/** State schema for team agent: full team info (id, lead, teammates, tasks) */\nconst TEAM_STATE_SCHEMA = z.object({\n team: TeamInfoSchema.optional().describe(\"Team info: teamId, teamLeadId, teammates, tasks. Set when create_team succeeds.\"),\n tasks: z.array(TeamTaskInfoSchema).optional().describe(\"Current tasks snapshot from check_tasks. Updated on each check.\"),\n team_mailbox: z.array(MailboxMessageSchema).optional().describe(\"All team mailbox messages for display\"),\n});\n\n/**\n * Default system prompt for the team lead agent.\n */\nconst TEAM_LEAD_BASE_PROMPT = `You are a team lead that coordinates a team of specialized agents. In order to complete the objective that the user asks of you, you will need to:\n\n1. Understand the user's objective and break it into concrete tasks.\n2. Create a team by calling \\`create_team\\` with the tasks and teammate assignments.\n3. **While tasks are incomplete**: Use \\`read_messages\\` to wait for teammate updates (it waits up to 3 minutes for new messages). When messages indicate task changes, call \\`check_tasks\\` to get full task status. Do not assume tasks are done without checking.\n4. **Important - Message handling**: After calling \\`read_messages\\`, if there are unread messages from teammates (you will see them in the tool output), you MUST:\n - Acknowledge their message\n - If they need guidance, provide it using \\`send_message\\`\n - If they reported a problem, address it (add tasks, adjust plan, etc.)\n - If they made a discovery, incorporate it into your plan\n Do not just read messages - always respond or take action!\n5. **Task assignment**: You can explicitly assign tasks to specific teammates via \\`send_message\\`, or let them self-claim from available tasks.\n6. **Plan approval** (optional): If a teammate needs approval before implementing, wait for their plan and approve/reject with feedback via \\`send_message\\`.\n7. Respond to the user with status updates and final results.\n8. When the user asks for changes, use \\`add_tasks\\`, \\`assign_task\\`, \\`set_task_status\\`, or \\`set_task_dependencies\\` to evolve the task list.\n9. When teammates report discoveries or problems, adjust the plan accordingly.\n10. **Cleanup**: When all tasks are done, tell teammates to shut down, then clean up the team resources.\n\n## Coordination Rules\n\n- **Single point of contact**: User only talks to YOU - you are the only interface between user and team\n- **Don't parallel implement**: Do not start working on tasks yourself while teammates are working - wait for them to finish\n- **Always verify**: Never assume tasks are done - always verify with \\`check_tasks\\`\n- **Permissions**: All teammates inherit your permission settings. Adjust individual teammate modes if needed after spawning.\n\nAlways plan tasks with clear, actionable descriptions. Use dependencies to express ordering constraints.`;\n\n/**\n * Create an agent team: a TeamLead ReactAgent backed by shared\n * TaskListStore and MailboxStore with pre-configured teammates.\n *\n * @param config - Team configuration (teammates, model, stores, etc.)\n * @returns A ReactAgent that acts as the TeamLead\n */\nexport function createAgentTeam(\n config: TeamConfig\n): ReactAgent<any, any, any, any> {\n // Use provided stores or default to in-memory\n const taskListStore = config.taskListStore ?? new InMemoryTaskListStore();\n const mailboxStore = config.mailboxStore ?? new InMemoryMailboxStore();\n\n // Create filesystem middleware (uses StateBackend by default if no backend provided)\n const filesystemMiddleware = createFilesystemMiddleware({\n backend: config.backend,\n });\n\n // Combine filesystem with user's middleware\n const allMiddleware = [filesystemMiddleware, ...(config.middleware ?? [])];\n\n // Team config with filesystem middleware included (for teammates)\n const teamConfigWithFs: TeamConfig = {\n ...config,\n middleware: allMiddleware,\n };\n\n // Build the team middleware (provides all team management tools)\n const teamMiddleware = createTeamMiddleware({\n teamConfig: teamConfigWithFs,\n taskListStore,\n mailboxStore,\n });\n\n // Assemble middleware stack: teamMiddleware + filesystem + user middleware\n const middleware: AgentMiddleware[] = [\n teamMiddleware,\n ...allMiddleware,\n ];\n\n // Build the team lead system prompt\n const systemPrompt = config.systemPrompt + \"\\n\\n\" + TEAM_LEAD_BASE_PROMPT;\n\n // Create and return the TeamLead agent\n const stateSchema = createReactAgentSchema(TEAM_STATE_SCHEMA);\n return createAgent({\n model: config.model ?? \"claude-sonnet-4-5-20250929\",\n systemPrompt,\n tools: [], // all tools come from middleware\n middleware,\n checkpointer: config.checkpointer,\n stateSchema: stateSchema as any,\n });\n}\n","/**\n * Agent Team - Core Type Definitions\n *\n * Shared types used by TaskListStore, MailboxStore, middleware, and the AgentTeam facade.\n */\n\nimport type { StructuredTool } from \"@langchain/core/tools\";\nimport type { LanguageModelLike } from \"@langchain/core/language_models/base\";\nimport type { BaseCheckpointSaver } from \"@langchain/langgraph-checkpoint\";\nimport type { AgentMiddleware } from \"langchain\";\nimport type { TaskListStore } from \"./stores/protocols.js\";\nimport type { MailboxStore } from \"./stores/protocols.js\";\n\n// ---------------------------------------------------------------------------\n// Task management\n// ---------------------------------------------------------------------------\n\n/**\n * Status of a task in the shared task list.\n */\nexport enum TaskStatus {\n PENDING = \"pending\",\n CLAIMED = \"claimed\",\n IN_PROGRESS = \"in_progress\",\n COMPLETED = \"completed\",\n FAILED = \"failed\",\n}\n\n/**\n * Events emitted by a TaskListStore when task state changes.\n */\nexport type TaskEvent =\n | \"task:added\"\n | \"task:claimed\"\n | \"task:completed\"\n | \"task:failed\"\n | \"task:removed\";\n\n/**\n * A task stored in the shared task list.\n */\nexport interface TeamTask {\n /** Unique task identifier */\n id: string;\n /** Short title for the task */\n title: string;\n /** Detailed description of what needs to be done */\n description: string;\n /** Current status */\n status: TaskStatus;\n /** Name of the teammate that claimed this task */\n assignee?: string;\n /** Result summary when completed */\n result?: string;\n /** Error message when failed */\n error?: string;\n /** IDs of tasks that must be completed before this one can be claimed */\n dependencies: string[];\n /** When the task was created */\n createdAt: Date;\n /** When the task was last updated */\n updatedAt: Date;\n}\n\n/**\n * Input for creating a new task.\n */\nexport interface TaskSpec {\n id: string;\n title: string;\n description: string;\n assignee?: string;\n dependencies?: string[];\n}\n\n/**\n * Fields that can be updated on an existing task.\n */\nexport interface TaskUpdatable {\n title?: string;\n description?: string;\n assignee?: string;\n status?: TaskStatus;\n dependencies?: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Messaging\n// ---------------------------------------------------------------------------\n\n/**\n * Type of an inter-agent message in the mailbox.\n * Different tools and flows use different types when storing messages.\n */\nexport enum MessageType {\n /** One-to-one message (send_message tool) */\n DIRECT_MESSAGE = \"direct_message\",\n /** Message to all teammates (broadcast_message tool) */\n BROADCAST = \"broadcast\",\n /** Teammate submits execution plan to team_lead for approval */\n PLAN_REQUEST = \"plan_request\",\n /** Team_lead approves or rejects plan (feedback to teammate) */\n PLAN_FEEDBACK = \"plan_feedback\",\n /** Team_lead instructs team to shut down (e.g. disband_team) */\n SHUTDOWN_REQUEST = \"shutdown_request\",\n /** Teammate acknowledges shutdown */\n SHUTDOWN_RESPONSE = \"shutdown_response\",\n /** From TaskCompleted/TeammateIdle hook or system: quality issue or continue-work reminder */\n TASK_FEEDBACK = \"task_feedback\",\n /** Idle notification, task status change, or other status update */\n STATUS_UPDATE = \"status_update\",\n}\n\n/**\n * A message stored in the mailbox.\n */\nexport interface MailboxMessage {\n /** Unique message identifier */\n id: string;\n /** Sender agent name */\n from: string;\n /** Recipient agent name (or \"__broadcast__\" for broadcasts) */\n to: string;\n /** Message content */\n content: string;\n /** When the message was sent */\n timestamp: Date;\n /** Message type */\n type: MessageType;\n /** Whether the recipient has read this message */\n read: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Team configuration\n// ---------------------------------------------------------------------------\n\n/**\n * Specification for a teammate agent.\n * Configured at team creation time; the `create_team` tool matches teammate\n * names from the LLM's plan against these specs to get tools/model/prompt.\n */\nexport interface TeammateSpec {\n /** Unique name for this teammate (used as agent ID) */\n name: string;\n /** Role category (e.g. \"research\", \"writing\", \"review\") */\n role: string;\n /** Human-readable description of what this teammate does */\n description: string;\n /** Model override (defaults to team-level model) */\n model?: LanguageModelLike | string;\n /** Tools this teammate has access to (in addition to team tools) */\n tools?: StructuredTool[];\n /** Custom system prompt for this teammate */\n systemPrompt?: string;\n /** Additional middleware for this teammate */\n middleware?: AgentMiddleware[];\n}\n\n/**\n * Configuration for creating an agent team.\n */\nexport interface TeamConfig {\n /** Available teammate specifications (the LLM picks from these by name) */\n teammates: TeammateSpec[];\n /** Maximum number of teammates running concurrently (default: teammates.length) */\n maxConcurrency?: number;\n /** Model for the team lead agent */\n model?: LanguageModelLike | string;\n /** Custom system prompt for the team lead */\n systemPrompt?: string;\n /** Tools available to the team lead */\n tools?: StructuredTool[];\n /** Checkpointer for persisting agent state between runs */\n checkpointer?: BaseCheckpointSaver | boolean;\n /** Pluggable task list store (default: InMemoryTaskListStore) */\n taskListStore?: TaskListStore;\n /** Pluggable mailbox store (default: InMemoryMailboxStore) */\n mailboxStore?: MailboxStore;\n /** Additional middleware for the team lead agent */\n middleware?: AgentMiddleware[];\n /**\n * Schedule lattice key for polling task list / mailbox.\n * When set, teammates use scheduled polling instead of event-driven wait.\n * Requires the app to register the schedule lattice first.\n */\n scheduleLatticeKey?: string;\n /** Poll interval in ms when using schedule lattice (default: 5000) */\n pollIntervalMs?: number;\n /** Filesystem backend for sandboxed file operations */\n backend?: (config: { state: unknown; store?: any }) => Promise<any>;\n}\n","/**\n * InMemoryTaskListStore\n *\n * In-memory implementation of TaskListStore.\n * Tasks are organised by teamId, following the same pattern as\n * InMemoryThreadStore (Map<teamId, Map<taskId, TeamTask>>).\n *\n * Uses an internal EventEmitter so persistent teammates can sleep\n * until claimable tasks appear instead of busy-polling.\n */\n\nimport { EventEmitter } from \"events\";\nimport type { TaskListStore } from \"./protocols.js\";\nimport {\n type TeamTask,\n type TaskSpec,\n type TaskUpdatable,\n type TaskEvent,\n TaskStatus,\n} from \"../types.js\";\n\nexport class InMemoryTaskListStore implements TaskListStore {\n /** Map<teamId, Map<taskId, TeamTask>> */\n private tasks: Map<string, Map<string, TeamTask>> = new Map();\n\n /** EventEmitter for task lifecycle events */\n private emitter = new EventEmitter();\n\n /** Auto-incrementing ID counter */\n private idCounter = 0;\n\n constructor() {\n // Allow many listeners (one per teammate per team)\n this.emitter.setMaxListeners(200);\n }\n\n // -------------------------------------------------------------------------\n // Helpers\n // -------------------------------------------------------------------------\n\n /** Get or create the task map for a team. */\n private getTeamTasks(teamId: string): Map<string, TeamTask> {\n let map = this.tasks.get(teamId);\n if (!map) {\n map = new Map();\n this.tasks.set(teamId, map);\n }\n return map;\n }\n\n /** Generate a unique task ID. */\n private nextId(): string {\n this.idCounter += 1;\n return `task-${this.idCounter}`;\n }\n\n /** Emit a scoped event: `${teamId}:${event}`. */\n private emit(teamId: string, event: TaskEvent, task: TeamTask): void {\n this.emitter.emit(`${teamId}:${event}`, task);\n }\n\n /**\n * Resolve dependency references by task IDs.\n */\n private resolveDependencies(\n teamTasks: Map<string, TeamTask>,\n depIds: string[]\n ): string[] {\n const resolved: string[] = [];\n for (const ref of depIds) {\n if (teamTasks.has(ref)) {\n resolved.push(ref);\n }\n }\n return resolved;\n }\n\n /**\n * Check whether all dependencies of a task are in COMPLETED status.\n */\n private areDependenciesSatisfied(\n teamTasks: Map<string, TeamTask>,\n task: TeamTask\n ): boolean {\n if (task.dependencies.length === 0) return true;\n return task.dependencies.every((depId) => {\n const dep = teamTasks.get(depId);\n return dep !== undefined && dep.status === TaskStatus.COMPLETED;\n });\n }\n\n // -------------------------------------------------------------------------\n // Lifecycle\n // -------------------------------------------------------------------------\n\n async addTask(teamId: string, spec: TaskSpec): Promise<TeamTask> {\n const teamTasks = this.getTeamTasks(teamId);\n \n if (!/^task-\\d+$/.test(spec.id)) {\n throw new Error(`Invalid task ID format: ${spec.id}. Expected format: task-01, task-02, etc.`);\n }\n if (teamTasks.has(spec.id)) {\n throw new Error(`Task ID already exists: ${spec.id}`);\n }\n\n const now = new Date();\n const task: TeamTask = {\n id: spec.id,\n title: spec.title,\n description: spec.description,\n assignee: spec.assignee,\n status: TaskStatus.PENDING,\n dependencies: spec.dependencies\n ? this.resolveDependencies(teamTasks, spec.dependencies)\n : [],\n createdAt: now,\n updatedAt: now,\n };\n teamTasks.set(task.id, task);\n this.emit(teamId, \"task:added\", task);\n return task;\n }\n\n async addTasks(teamId: string, specs: TaskSpec[]): Promise<TeamTask[]> {\n const teamTasks = this.getTeamTasks(teamId);\n const now = new Date();\n const created: TeamTask[] = [];\n\n const seenIds = new Set<string>();\n for (const spec of specs) {\n if (!/^task-\\d+$/.test(spec.id)) {\n throw new Error(`Invalid task ID format: ${spec.id}. Expected format: task-01, task-02, etc.`);\n }\n if (seenIds.has(spec.id)) {\n throw new Error(`Duplicate task ID: ${spec.id}`);\n }\n if (teamTasks.has(spec.id)) {\n throw new Error(`Task ID already exists: ${spec.id}`);\n }\n seenIds.add(spec.id);\n }\n\n for (const spec of specs) {\n const task: TeamTask = {\n id: spec.id,\n title: spec.title,\n description: spec.description,\n assignee: spec.assignee,\n status: TaskStatus.PENDING,\n dependencies: [],\n createdAt: now,\n updatedAt: now,\n };\n teamTasks.set(task.id, task);\n created.push(task);\n }\n\n for (let i = 0; i < specs.length; i++) {\n if (specs[i].dependencies && specs[i].dependencies!.length > 0) {\n created[i].dependencies = this.resolveDependencies(\n teamTasks,\n specs[i].dependencies!\n );\n }\n }\n\n for (const task of created) {\n this.emit(teamId, \"task:added\", task);\n }\n\n return created;\n }\n\n async updateTask(\n teamId: string,\n taskId: string,\n updates: Partial<TaskUpdatable>\n ): Promise<TeamTask | null> {\n const teamTasks = this.getTeamTasks(teamId);\n const task = teamTasks.get(taskId);\n if (!task) return null;\n\n if (updates.title !== undefined) task.title = updates.title;\n if (updates.description !== undefined) task.description = updates.description;\n if (updates.assignee !== undefined) task.assignee = updates.assignee;\n if (updates.status !== undefined) task.status = updates.status;\n if (updates.dependencies !== undefined) {\n task.dependencies = this.resolveDependencies(teamTasks, updates.dependencies);\n }\n task.updatedAt = new Date();\n\n return task;\n }\n\n async removeTask(teamId: string, taskId: string): Promise<boolean> {\n const teamTasks = this.getTeamTasks(teamId);\n const task = teamTasks.get(taskId);\n if (!task) return false;\n teamTasks.delete(taskId);\n this.emit(teamId, \"task:removed\", task);\n return true;\n }\n\n // -------------------------------------------------------------------------\n // Claim / Complete\n // -------------------------------------------------------------------------\n\n /**\n * Claim a specific task by ID: set assignee to agentId and status to CLAIMED.\n * Only succeeds if the task is PENDING and all dependencies are COMPLETED.\n */\n async claimTaskById(\n teamId: string,\n taskId: string,\n agentId: string\n ): Promise<TeamTask | null> {\n const teamTasks = this.getTeamTasks(teamId);\n const task = teamTasks.get(taskId);\n if (!task) return null;\n if (task.status !== TaskStatus.PENDING) return null;\n if (!this.areDependenciesSatisfied(teamTasks, task)) return null;\n\n task.status = TaskStatus.CLAIMED;\n task.assignee = agentId;\n task.updatedAt = new Date();\n this.emit(teamId, \"task:claimed\", task);\n return task;\n }\n\n async completeTask(\n teamId: string,\n taskId: string,\n result: string\n ): Promise<TeamTask | null> {\n const teamTasks = this.getTeamTasks(teamId);\n const task = teamTasks.get(taskId);\n if (!task) return null;\n\n task.status = TaskStatus.COMPLETED;\n task.result = result;\n task.updatedAt = new Date();\n this.emit(teamId, \"task:completed\", task);\n return task;\n }\n\n async failTask(\n teamId: string,\n taskId: string,\n error: string\n ): Promise<TeamTask | null> {\n const teamTasks = this.getTeamTasks(teamId);\n const task = teamTasks.get(taskId);\n if (!task) return null;\n\n task.status = TaskStatus.FAILED;\n task.error = error;\n task.updatedAt = new Date();\n this.emit(teamId, \"task:failed\", task);\n return task;\n }\n\n // -------------------------------------------------------------------------\n // Query\n // -------------------------------------------------------------------------\n\n async getTask(teamId: string, taskId: string): Promise<TeamTask | null> {\n const teamTasks = this.tasks.get(teamId);\n if (!teamTasks) return null;\n return teamTasks.get(taskId) ?? null;\n }\n\n async getTasksByStatus(\n teamId: string,\n status: TaskStatus\n ): Promise<TeamTask[]> {\n const teamTasks = this.tasks.get(teamId);\n if (!teamTasks) return [];\n return Array.from(teamTasks.values()).filter((t) => t.status === status);\n }\n\n async getAllTasks(teamId: string): Promise<TeamTask[]> {\n const teamTasks = this.tasks.get(teamId);\n if (!teamTasks) return [];\n return Array.from(teamTasks.values());\n }\n\n async isAllDone(teamId: string): Promise<boolean> {\n const teamTasks = this.tasks.get(teamId);\n if (!teamTasks || teamTasks.size === 0) return true;\n\n for (const task of teamTasks.values()) {\n if (\n task.status === TaskStatus.PENDING ||\n task.status === TaskStatus.CLAIMED ||\n task.status === TaskStatus.IN_PROGRESS\n ) {\n return false;\n }\n }\n return true;\n }\n\n async hasClaimable(teamId: string): Promise<boolean> {\n const teamTasks = this.tasks.get(teamId);\n if (!teamTasks) return false;\n\n for (const task of teamTasks.values()) {\n if (\n task.status === TaskStatus.PENDING &&\n this.areDependenciesSatisfied(teamTasks, task)\n ) {\n return true;\n }\n }\n return false;\n }\n\n // -------------------------------------------------------------------------\n // Events\n // -------------------------------------------------------------------------\n\n onTaskEvent(\n teamId: string,\n event: TaskEvent,\n callback: (task: TeamTask) => void\n ): void {\n this.emitter.on(`${teamId}:${event}`, callback);\n }\n\n offTaskEvent(\n teamId: string,\n event: TaskEvent,\n callback: (task: TeamTask) => void\n ): void {\n this.emitter.off(`${teamId}:${event}`, callback);\n }\n\n // -------------------------------------------------------------------------\n // Utilities\n // -------------------------------------------------------------------------\n\n /** Remove all tasks for a team (useful for cleanup / testing). */\n clearTeam(teamId: string): void {\n this.tasks.delete(teamId);\n }\n\n /** Remove all tasks across all teams (useful for testing). */\n clear(): void {\n this.tasks.clear();\n }\n}\n","/**\n * InMemoryMailboxStore\n *\n * In-memory implementation of MailboxStore.\n * Messages are organised by teamId -> agentId, following the same\n * Map nesting pattern as InMemoryThreadStore.\n *\n * Uses an internal EventEmitter so agents can be notified of new\n * messages in real time without polling.\n */\n\nimport { EventEmitter } from \"events\";\nimport type { MailboxStore } from \"./protocols.js\";\nimport { type MailboxMessage, MessageType } from \"../types.js\";\n\nexport class InMemoryMailboxStore implements MailboxStore {\n /** Map<teamId, Map<agentId, MailboxMessage[]>> */\n private messages: Map<string, Map<string, MailboxMessage[]>> = new Map();\n\n /** Map<teamId, Set<agentId>> -- registered agents for broadcast */\n private agents: Map<string, Set<string>> = new Map();\n\n /** EventEmitter for real-time message notifications */\n private emitter = new EventEmitter();\n\n /** Auto-incrementing message ID counter */\n private idCounter = 0;\n\n constructor() {\n this.emitter.setMaxListeners(200);\n }\n\n // -------------------------------------------------------------------------\n // Helpers\n // -------------------------------------------------------------------------\n\n /** Get or create the agent message list for a team. */\n private getAgentMessages(\n teamId: string,\n agentId: string\n ): MailboxMessage[] {\n let teamMap = this.messages.get(teamId);\n if (!teamMap) {\n teamMap = new Map();\n this.messages.set(teamId, teamMap);\n }\n let list = teamMap.get(agentId);\n if (!list) {\n list = [];\n teamMap.set(agentId, list);\n }\n return list;\n }\n\n /** Generate a unique message ID. */\n private nextId(): string {\n this.idCounter += 1;\n return `msg-${this.idCounter}`;\n }\n\n /** Store a message and emit a real-time event for the recipient. */\n private storeAndNotify(\n teamId: string,\n message: MailboxMessage\n ): void {\n const list = this.getAgentMessages(teamId, message.to);\n list.push(message);\n const preview =\n message.content.length > 80 ? message.content.slice(0, 80) + \"...\" : message.content;\n console.log(\n `[Mailbox] ${teamId} | ${message.from} → ${message.to} [${message.type}] ${message.id}: ${preview}`\n );\n this.emitter.emit(`${teamId}:${message.to}:message`, message);\n this.emitter.emit(`${teamId}:message`, message);\n }\n\n // -------------------------------------------------------------------------\n // Messaging\n // -------------------------------------------------------------------------\n\n async sendMessage(\n teamId: string,\n from: string,\n to: string,\n content: string,\n type: MessageType = MessageType.DIRECT_MESSAGE\n ): Promise<MailboxMessage> {\n const message: MailboxMessage = {\n id: this.nextId(),\n from,\n to,\n content,\n timestamp: new Date(),\n type,\n read: false,\n };\n this.storeAndNotify(teamId, message);\n return message;\n }\n\n async broadcastMessage(\n teamId: string,\n from: string,\n content: string,\n type: MessageType = MessageType.BROADCAST\n ): Promise<MailboxMessage[]> {\n const agentSet = this.agents.get(teamId);\n if (!agentSet || agentSet.size === 0) return [];\n\n const created: MailboxMessage[] = [];\n for (const agentId of agentSet) {\n // Don't send broadcast back to the sender\n if (agentId === from) continue;\n const message: MailboxMessage = {\n id: this.nextId(),\n from,\n to: agentId,\n content,\n timestamp: new Date(),\n type,\n read: false,\n };\n this.storeAndNotify(teamId, message);\n created.push(message);\n }\n return created;\n }\n\n async getMessages(\n teamId: string,\n agentId: string\n ): Promise<MailboxMessage[]> {\n const teamMap = this.messages.get(teamId);\n if (!teamMap) return [];\n return teamMap.get(agentId) ?? [];\n }\n\n async getUnreadMessages(\n teamId: string,\n agentId: string\n ): Promise<MailboxMessage[]> {\n const all = await this.getMessages(teamId, agentId);\n return all.filter((m) => !m.read);\n }\n\n async markAsRead(\n teamId: string,\n agentId: string,\n messageId: string\n ): Promise<void> {\n const all = await this.getMessages(teamId, agentId);\n const msg = all.find((m) => m.id === messageId);\n if (msg) {\n msg.read = true;\n console.log(\n `[Mailbox] ${teamId} | ${agentId} marked ${messageId} as read (from: ${msg.from})`\n );\n }\n }\n\n // -------------------------------------------------------------------------\n // Agent registration\n // -------------------------------------------------------------------------\n\n async registerAgent(teamId: string, agentId: string): Promise<void> {\n let agentSet = this.agents.get(teamId);\n if (!agentSet) {\n agentSet = new Set();\n this.agents.set(teamId, agentSet);\n }\n agentSet.add(agentId);\n }\n\n async unregisterAgent(teamId: string, agentId: string): Promise<void> {\n const agentSet = this.agents.get(teamId);\n if (agentSet) {\n agentSet.delete(agentId);\n }\n }\n\n async getRegisteredAgents(teamId: string): Promise<string[]> {\n const agentSet = this.agents.get(teamId);\n if (!agentSet) return [];\n return Array.from(agentSet);\n }\n\n // -------------------------------------------------------------------------\n // Events\n // -------------------------------------------------------------------------\n\n onMessage(\n teamId: string,\n agentId: string,\n callback: (msg: MailboxMessage) => void\n ): void {\n this.emitter.on(`${teamId}:${agentId}:message`, callback);\n }\n\n offMessage(\n teamId: string,\n agentId: string,\n callback: (msg: MailboxMessage) => void\n ): void {\n this.emitter.off(`${teamId}:${agentId}:message`, callback);\n }\n\n onTeamMessage(\n teamId: string,\n callback: (msg: MailboxMessage) => void\n ): void {\n this.emitter.on(`${teamId}:message`, callback);\n }\n\n offTeamMessage(\n teamId: string,\n callback: (msg: MailboxMessage) => void\n ): void {\n this.emitter.off(`${teamId}:message`, callback);\n }\n\n async getAllTeamMessages(teamId: string): Promise<MailboxMessage[]> {\n const teamMap = this.messages.get(teamId);\n if (!teamMap) return [];\n const allMessages: MailboxMessage[] = [];\n for (const messages of teamMap.values()) {\n allMessages.push(...messages);\n }\n return allMessages.sort(\n (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()\n );\n }\n\n // -------------------------------------------------------------------------\n // Utilities\n // -------------------------------------------------------------------------\n\n /** Remove all data for a team (messages + registrations). */\n clearTeam(teamId: string): void {\n this.messages.delete(teamId);\n this.agents.delete(teamId);\n }\n\n /** Remove all data across all teams. */\n clear(): void {\n this.messages.clear();\n this.agents.clear();\n }\n}\n","/**\n * Agent Team - Team Middleware\n *\n * createTeamMiddleware() provides the TeamLead agent with tools to\n * manage a dynamic team:\n *\n * create_team -- non-blocking: spawn teammates + populate task list\n * add_tasks -- add new tasks at any time (evolutionary)\n * assign_task -- set a task's assignee (reassign to a teammate)\n * set_task_status -- set a task's status (pending, claimed, in_progress, completed, failed)\n * set_task_dependencies -- set a task's dependency list\n * check_tasks -- get current task list status\n * send_message -- send message to a teammate\n * read_messages -- read unread messages from teammates\n *\n * Patterns referenced from deep_agent_new/middleware/subagents.ts:\n * - createMiddleware() + wrapModelCall for system prompt injection\n * - Agent creation via createAgent() from langchain\n * - State filtering (filterStateForSubagent logic)\n * - ToolMessage returns\n */\n\nimport { z } from \"zod/v3\";\nimport { createMiddleware, createAgent, tool, ToolMessage, type AgentMiddleware, type StructuredTool } from \"langchain\";\nimport { Command, getCurrentTaskInput } from \"@langchain/langgraph\";\nimport type { ReactAgent } from \"langchain\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport type { LanguageModelLike } from \"@langchain/core/language_models/base\";\nimport type { TaskListStore } from \"../stores/protocols.js\";\nimport type { MailboxStore } from \"../stores/protocols.js\";\nimport { type TeammateSpec, type TeamConfig, type TeamTask, type MailboxMessage, MessageType, TaskStatus } from \"../types.js\";\nimport { createTeammateTools } from \"./teammate_tools.js\";\nimport { formatMessagesAsMarkdown } from \"./formatMessages.js\";\nimport { getCheckpointSaver } from \"@memory_lattice/MemoryLatticeManager\";\nimport { agentWorkerGraph } from \"../../agent_worker/agent_worker_graph\";\nimport { registerTeammateAgent } from \"../../agent_lattice/index.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst TEAM_LEAD_AGENT_ID = \"team_lead\";\nconst DEFAULT_POLL_INTERVAL_MS = 5000;\nconst DEFAULT_SCHEDULE_LATTICE_KEY = \"default\";\n/** Max wait time for new messages using event mechanism (3 minutes) */\nconst READ_MESSAGES_TIMEOUT_MS = 180_000;\n\n/**\n * Team communication norms — shared by team_lead and all teammates.\n * Injected into both team leader and teammate system prompts so everyone follows the same rules.\n */\nconst TEAM_COMMUNICATION_NORMS = `\n### Team communication norms\n\n- **Roles**: One \\`team_lead\\` coordinates the work; all others are teammates. Teammates report to team_lead and collaborate with each other as needed.\n- **Notifying everyone**: When the team_lead needs to tell something to **all** teammates (e.g. \"submit your plan\", \"plan approved\", \"shut down\"), use \\`broadcast_message\\`. Do not send the same message to each teammate individually.\n- **Teammate → all**: When a teammate needs to share something with the whole team, use \\`broadcast_message\\`.\n- **One-to-one**: Use \\`send_message\\` for directed messages (e.g. teammate sending a plan to team_lead, or team_lead replying to one teammate).\n- **New tasks**: If a teammate needs **new tasks** to be created (e.g. discovered during work or scope change), they must notify the team_lead via \\`send_message\\` to \"team_lead\". Only the team_lead may add tasks via \\`add_tasks\\`; teammates do not create tasks themselves.\n- **Plans**: Teammates submit their execution plan to team_lead via \\`send_message\\` to \"team_lead\". Team_lead reviews and approves; no external user approval is required. Team_lead notifies all teammates of approval via \\`broadcast_message\\`.\n- **Shutdown — check task state first**: When anyone receives a shutdown message (from team_lead or system), they **must not** shut down immediately. First: (1) **Check current task state** via \\`check_tasks\\` (team_lead) or \\`check_tasks\\` (teammate). (2) **Discuss with the team** via \\`read_messages\\`, \\`send_message\\`, or \\`broadcast_message\\`: should we continue these tasks, or stop/cancel them? (3) Only after the team has agreed—either to **continue** (keep working) or to **stop/delete** the remaining tasks—may shutdown proceed. Team_lead must not call \\`disband_team\\` until task state is verified and the team has aligned; teammates must not exit until the same alignment is reached.`;\n\n/** Runtime context for a team, used by the scheduler handler to resume polling. */\ninterface TeamPollContext {\n teamId: string;\n /** Parent thread ID from team lead (for subagent-style thread derivation) */\n parentThreadId: string;\n taskListStore: TaskListStore;\n mailboxStore: MailboxStore;\n teammates: Map<string, TeammateSpec>;\n /** All teammate specs in this team (for injecting into teammate prompt) */\n allTeammateSpecs: TeammateSpec[];\n defaultModel: LanguageModelLike | string;\n pollIntervalMs: number;\n scheduleLatticeKey: string;\n /** Cached teammate agents: (teamId, agentId) -> agent */\n agentCache: Map<string, ReactAgent<any, any, any, any>>;\n}\n\n\n\n\nconst TEAM_SYSTEM_PROMPT = `## Agent Team\n\nYou are the team_lead. You have tools to manage a team of specialized agents that work in parallel:\n\n- \\`create_team\\`: Create a team with initial tasks and teammates. This is **non-blocking** -- teammates start working in the background immediately, and you stay free to continue the conversation.\n- \\`add_tasks\\`: Add new tasks at any time. Use the optional \\`assignee\\` field to assign a task to a specific teammate when you need that person to do the work; otherwise teammates will claim tasks. Sleeping teammates will wake up and claim new tasks.\n- \\`assign_task\\`: Set a task's assignee (reassign work to a specific teammate).\n- \\`set_task_status\\`: Set a task's status (pending, claimed, in_progress, completed, failed). Use to reopen a task or mark it failed.\n- \\`set_task_dependencies\\`: Set which task IDs must complete before this task can be claimed.\n- \\`check_tasks\\`: See current status of all tasks (pending, in_progress, completed, failed). Call it when \\`read_messages\\` indicates task changes to get full details.\n- \\`send_message\\`: Send a message to a specific teammate (one-to-one).\n- \\`read_messages\\`: Read unread messages from teammates (e.g. status updates, plans, requests). Returns immediately if messages exist, otherwise waits up to 3 minutes for new messages.\n- \\`broadcast_message\\`: Send a message to **all** teammates at once. Use this whenever you need to notify everyone (e.g. \"submit your plan\", \"plan approved\", \"shut down\"). Do not send the same message to each teammate individually.\n- \\`disband_team\\`: Disband the team when all work is done. This notifies all teammates and cleans up resources.\n${TEAM_COMMUNICATION_NORMS}\n\n### Workflow\n\n1. Analyze the user's request and plan the initial tasks + which teammates to assign.\n2. Call \\`create_team\\` to create the team with tasks.\n3. **Request execution plans**: After creating the team, use \\`broadcast_message\\` once to tell all teammates: \"Please submit your execution plan for review.\"\n4. **Wait for all plans**: Use \\`read_messages\\` until ALL teammates have submitted their plans. Do not proceed until every teammate has submitted.\n5. **Add plans to team tasks and assign to teammates (required)**:\n - Once you have collected execution plans from **all** teammates, you **must** add them to the team task list via \\`add_tasks\\`. Do not skip this step.\n - For each teammate's plan (or each step from an integrated plan), create a task with a unique \\`id\\` (e.g. task-01, task-02). Set \\`assignee\\` to the **corresponding teammate** who will execute that plan or that task (the teammate who proposed it, or the one you assign for that work).\n - If you **integrate or synthesize** multiple plans into one coherent plan, decompose it into concrete tasks and call \\`add_tasks\\` with each task's \\`assignee\\` set to the appropriate teammate. Use \\`dependencies\\` if task order matters.\n - If plans are acceptable as-is, still call \\`add_tasks\\` to add each teammate's execution plan as one or more tasks, with \\`assignee\\` set to that teammate. Then use \\`broadcast_message\\` (e.g. \"Plan approved. Task list has been updated. You may now start working.\").\n - If you need changes, \\`send_message\\` to the relevant teammate(s) with feedback and wait for revised plans; only after receiving revised plans, add tasks and assignees as above, then \\`broadcast_message\\` approval.\n6. **Monitor execution**: Once approved, teammates will start working. Periodically call \\`check_tasks\\` and \\`read_messages\\` to monitor progress.\n7. **When teammates request new tasks**: If a teammate notifies you (via \\`read_messages\\`) that they need new tasks, use \\`add_tasks\\` to add the tasks, then use \\`broadcast_message\\` to notify the team that new tasks have been added (e.g. \"New tasks have been added to the list. Check with check_tasks and claim as needed.\"). Re-run plan approval only if the new tasks change the overall plan.\n8. **When you need a specific teammate to do something**: Create a new task with \\`add_tasks\\` and set \\`assignee\\` to that teammate's name; optionally \\`send_message\\` to that teammate. To reassign an existing task use \\`assign_task\\`; to change dependencies use \\`set_task_dependencies\\`; to reopen or mark failed use \\`set_task_status\\`.\n9. Report status to the user based on \\`check_tasks\\` results. Proceed to final synthesis when all tasks are done.\n10. **Cleanup — only after verifying task state and team alignment**: Before shutting down the team:\n - Call \\`check_tasks\\` to get the current task state. If any tasks are still **pending**, **claimed**, or **in_progress**, do **not** broadcast shutdown yet.\n - Use \\`read_messages\\` and, if needed, \\`send_message\\` or \\`broadcast_message\\` to discuss with the team: should we continue these tasks or stop/cancel them?\n - If the team agrees to continue: let them work until tasks are done, then re-check with \\`check_tasks\\`.\n - If the team agrees to stop: use \\`set_task_status\\` to mark remaining tasks as **failed** or **completed** (with a note) as appropriate, then call \\`check_tasks\\` again to confirm.\n - Only when all tasks are in a terminal state (completed/failed) and the team has aligned, use \\`broadcast_message\\` to notify shutdown, then call \\`disband_team\\`.\n\n### Important Notes\n\n- The teammates you specify in \\`create_team\\` are created dynamically from name, role, and description.\n- Tasks can have dependencies -- a task won't be claimable until all its dependency tasks are completed.\n- You can add tasks and communicate with teammates at any time, even while they are working.\n- **Assigning work to a teammate**: When you need a specific teammate to do something, create a new task with \\`add_tasks\\` and set \\`assignee\\`, or use \\`assign_task\\` to reassign an existing task. Use \\`set_task_dependencies\\` to change task order; use \\`set_task_status\\` to reopen (pending) or mark failed.\n- **New task requests**: Teammates may request new tasks via \\`send_message\\`. When you receive such a request, use \\`add_tasks\\` then notify the team via \\`broadcast_message\\`.\n- **Plan approval and task sync**: After collecting all teammates' execution plans, you **must** add them to the team task list via \\`add_tasks\\` and set \\`assignee\\` for each task to the corresponding teammate. Then \\`broadcast_message\\` to approve (e.g. \"Plan approved. Task list has been updated. You may now start working.\"). Do not let teammates start working until you have added tasks with assignees and broadcast approval. You review and approve; no user confirmation is required.\n- **Permissions**: All teammates inherit your permission settings.\n- **Shutdown**: Only you may tell the team to shut down. Before doing so: (1) call \\`check_tasks\\` to verify task state; (2) if any tasks are still in progress, discuss with the team via \\`read_messages\\` and \\`broadcast_message\\`/\\`send_message\\` whether to continue or stop them; (3) only after aligning (continue until done, or stop/cancel tasks), use \\`broadcast_message\\` then \\`disband_team\\`. Do not disband while tasks are still pending/in_progress without team agreement.`;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Build a human-readable summary of all tasks.\n */\nexport function formatTaskSummary(tasks: TeamTask[]): string {\n if (tasks.length === 0) return \"No tasks in the task list.\";\n\n const statusCounts: Record<string, number> = {};\n for (const t of tasks) {\n statusCounts[t.status] = (statusCounts[t.status] || 0) + 1;\n }\n\n const taskBlocks = tasks.map((t) => {\n let block = `## ${t.id}\\n`;\n block += `- **Status**: ${t.status.toUpperCase()}\\n`;\n block += `- **Title**: ${t.title}\\n`;\n if (t.description) block += `- **Description**: ${t.description}\\n`;\n if (t.assignee) block += `- **Assignee**: ${t.assignee}\\n`;\n if (t.dependencies.length > 0) block += `- **Dependencies**: ${t.dependencies.join(\", \")}\\n`;\n if (t.result) block += `- **Result**: ${t.result.slice(0, 500)}\\n`;\n if (t.error) block += `- **Error**: ${t.error.slice(0, 500)}\\n`;\n return block;\n });\n\n const summary = Object.entries(statusCounts)\n .map(([s, c]) => `- ${s}: ${c}`)\n .join(\" | \");\n\n return `${taskBlocks.join(\"\\n---\\n\\n\")}\\n\\n## Summary\\n${summary}`;\n}\n\n/** Assistant ID format for teammate agents used by agentWorkerGraph. */\nfunction getTeammateAssistantId(teamId: string, agentName: string): string {\n return `team:${teamId}:${agentName}`;\n}\n\n/**\n * Get or create the teammate agent for a given (teamId, agentId).\n * Registers the agent in the agent lattice so agentWorkerGraph can invoke it.\n */\nasync function getOrCreateTeammateAgent(\n ctx: TeamPollContext,\n spec: TeammateSpec,\n teamTools?: StructuredTool[],\n teamMiddleware?: AgentMiddleware[]\n): Promise<ReactAgent<any, any, any, any>> {\n const cacheKey = `${ctx.teamId}:${spec.name}`;\n let agent = ctx.agentCache.get(cacheKey);\n if (agent) return agent;\n\n const builtinTeammateTools = createTeammateTools({\n teamId: ctx.teamId,\n agentId: spec.name,\n taskListStore: ctx.taskListStore,\n mailboxStore: ctx.mailboxStore,\n });\n const allTools = [...(teamTools ?? []), ...(spec.tools ?? []), ...builtinTeammateTools];\n\n // Build other-teammates summary from ctx for prompt injection (exclude self)\n const others = (ctx.allTeammateSpecs ?? [])\n .filter((s) => s.name !== spec.name)\n .map((s) => `${s.name} (role: ${s.role}${s.description ? `; ${s.description}` : \"\"})`);\n const teammatesBlock =\n others.length > 0\n ? `\\n\\nYour teammates in this team (you can \\`send_message\\` to them):\\n- team_lead (lead)\\n${others.map((o) => `- ${o}`).join(\"\\n\")}\\n`\n : \"\\n\\nYour teammates in this team: team_lead (lead).\\n\";\n\n const teammatePrompt =\n spec.systemPrompt ??\n `You are a team member. Your name in this team is \"${spec.name}\" and your role is \"${spec.role}\". You work independently with your own context window.${teammatesBlock}\n${TEAM_COMMUNICATION_NORMS}\n\nYour job:\n1. First, call \\`check_tasks\\` to see all tasks in the team.\n2. Submit your execution plan: Use \\`send_message\\` to send your plan to \"team_lead\". Explain how you will approach the task, what steps you will take, and any dependencies or considerations.\n3. **Wait for approval**: Do NOT start working immediately. Wait for the team_lead to approve your plan via \\`read_messages\\`. The lead will notify the whole team (e.g. by broadcast) with a message like \"Plan approved. You may now start working.\" Only then may you start.\n4. Only after receiving approval: Use \\`check_tasks\\` to see available tasks, then call \\`claim_task\\` with the \\`task_id\\` you choose. That sets the task's assignee to you; focus on that task until done.\n5. Use your tools to complete the task thoroughly.\n6. Call \\`complete_task\\` with a summary of your result, or \\`fail_task\\` if you cannot complete it.\n7. After completing a task, call \\`claim_task\\` again with another \\`task_id\\` to get the next task (only PENDING tasks whose dependencies are done can be claimed).\n8. **If you need new tasks**: If during work you discover that new tasks are needed (e.g. scope change, follow-up work), notify the team_lead via \\`send_message\\` to \"team_lead\". Describe what new tasks are needed; do not create tasks yourself. Only the team_lead adds tasks; wait for the lead to add them and broadcast before claiming new work.\n9. When no tasks are left to claim, call \\`read_messages\\` to wait for messages (it waits up to 3 minutes for new messages). Continue until you receive a shutdown message from the team_lead.\n10. **Shutdown — check task state and discuss first**: When you receive a shutdown message (e.g. \"All tasks are complete, you may now shut down\"):\n - **Do NOT shut down immediately.** First call \\`check_tasks\\` to check the current task state.\n - If there are still tasks in **pending**, **claimed**, or **in_progress**: use \\`send_message\\` to \"team_lead\" or \\`broadcast_message\\` to the team to discuss: \"I see tasks still in progress / pending. Should we continue these or stop/cancel them before shutdown?\"\n - Wait for team alignment (from \\`read_messages\\`): either (a) continue working until tasks are done, or (b) team_lead confirms tasks are stopped/cancelled.\n - Only after the team has agreed and either all your assigned work is done or tasks are explicitly stopped, then exit gracefully. Do not shut down on your own without checking task state and team agreement.\n\nImportant workflow:\n- NEVER start working on tasks before the team_lead has approved (you will see \"Plan approved\" or similar in \\`read_messages\\`)\n- Always submit your plan first via \\`send_message\\` to \"team_lead\"\n- If you need new tasks, notify team_lead via \\`send_message\\` to \"team_lead\"; only the lead adds tasks\n- If you receive feedback on your plan, revise and resubmit to team_lead\n\nYou have access to these tools:\n- \\`claim_task\\`: Pick a task by task_id to claim it (sets assignee to you; ONLY after plan is approved). Use check_tasks first.\n- \\`complete_task\\`: Mark a task as completed\n- \\`fail_task\\`: Mark a task as failed\n- \\`send_message\\`: Send a message to team_lead or a specific teammate\n- \\`broadcast_message\\`: Send a message to everyone in the team except yourself (use when sharing with the whole team)\n- \\`read_messages\\`: Read messages from team_lead or teammates\n- \\`check_tasks\\`: Get current status of all tasks in the team`;\n\n const assistantId = getTeammateAssistantId(ctx.teamId, spec.name);\n agent = createAgent({\n model: spec.model ?? ctx.defaultModel,\n systemPrompt: teammatePrompt,\n tools: allTools as any,\n description: spec.description,\n middleware: [...(teamMiddleware ?? []), ...(spec.middleware ?? [])],\n checkpointer: getCheckpointSaver(\"default\"),\n });\n registerTeammateAgent(assistantId, agent);\n\n const teammateThreadId = ctx.parentThreadId\n ? `${ctx.parentThreadId}____${ctx.teamId}_${spec.name}`\n : `standalone_${ctx.teamId}_${spec.name}`;\n const startMessage =\n \"Start working\";\n\n try {\n await agentWorkerGraph.invoke({\n assistant_id: assistantId,\n thread_id: teammateThreadId,\n input: { message: startMessage, messages: [{ role: \"human\", content: startMessage }] },\n });\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : \"Unknown error during teammate execution\";\n await ctx.mailboxStore.sendMessage(\n ctx.teamId,\n spec.name,\n TEAM_LEAD_AGENT_ID,\n `Teammate execution failed: ${errorMsg}`,\n MessageType.STATUS_UPDATE\n );\n }\n\n return agent;\n}\n\n/**\n * Spawn a teammate to process tasks.\n */\nasync function spawnTeammate(options: {\n teamId: string;\n spec: TeammateSpec;\n allTeammateSpecs: TeammateSpec[];\n taskListStore: TaskListStore;\n mailboxStore: MailboxStore;\n defaultModel: LanguageModelLike | string;\n parentThreadId?: string;\n teamTools?: StructuredTool[];\n teamMiddleware?: AgentMiddleware[];\n}): Promise<void> {\n const {\n teamId,\n spec,\n allTeammateSpecs,\n taskListStore,\n mailboxStore,\n defaultModel,\n parentThreadId = \"\",\n teamTools,\n teamMiddleware,\n } = options;\n\n const ctx: TeamPollContext = {\n teamId,\n parentThreadId,\n taskListStore,\n mailboxStore,\n teammates: new Map(),\n allTeammateSpecs,\n defaultModel,\n pollIntervalMs: DEFAULT_POLL_INTERVAL_MS,\n scheduleLatticeKey: DEFAULT_SCHEDULE_LATTICE_KEY,\n agentCache: new Map(),\n };\n\n await getOrCreateTeammateAgent(ctx, spec, teamTools, teamMiddleware);\n}\n\n// ---------------------------------------------------------------------------\n// Middleware options\n// ---------------------------------------------------------------------------\n\n/**\n * Options for creating the team middleware.\n */\nexport interface TeamMiddlewareOptions {\n /** Team configuration with teammate specs */\n teamConfig: TeamConfig;\n /** Task list store instance (shared across all agents) */\n taskListStore: TaskListStore;\n /** Mailbox store instance (shared across all agents) */\n mailboxStore: MailboxStore;\n}\n\n// ---------------------------------------------------------------------------\n// createTeamMiddleware\n// ---------------------------------------------------------------------------\n\n/**\n * Create the team middleware that gives the TeamLead agent tools to\n * manage a dynamic team with shared task list and mailbox.\n */\nexport function createTeamMiddleware(\n options: TeamMiddlewareOptions\n): AgentMiddleware {\n const { teamConfig, taskListStore, mailboxStore } = options;\n\n\n // Keep the actual model object/string as-is for teammates to use\n const defaultModel: LanguageModelLike | string =\n teamConfig.model ?? \"claude-sonnet-4-5-20250929\";\n\n // -------------------------------------------------------------------\n // create_team tool\n // -------------------------------------------------------------------\n const createTeamTool = tool(\n async (\n input: {\n tasks: Array<{ id: string; title: string; description: string; assignee?: string; dependencies?: string[] }>;\n teammates: Array<{ name: string; role: string; description: string }>;\n },\n config\n ) => {\n const state = getCurrentTaskInput<{ team?: { teamId: string } }>();\n if (state?.team?.teamId) {\n const existingId = state.team.teamId;\n const msg = new ToolMessage({\n content:\n `A team is already active (id: ${existingId}). Use this team_id for \\`check_tasks\\`, \\`read_messages\\`, \\`add_tasks\\`, \\`send_message\\`, \\`assign_task\\`, \\`set_task_status\\`, and \\`set_task_dependencies\\`. ` +\n `Do not call \\`create_team\\` again unless you need a fresh team for a new objective.`,\n tool_call_id: config.toolCall?.id as string,\n name: \"create_team\",\n });\n return msg;\n }\n\n const teamId = uuidv4();\n\n // 1. Populate task list\n const createdTasks = await taskListStore.addTasks(\n teamId,\n input.tasks.map((t) => ({\n id: t.id,\n title: t.title,\n description: t.description,\n assignee: t.assignee,\n dependencies: t.dependencies ?? [],\n }))\n );\n\n // 2. Match requested teammates against configured specs\n const matchedSpecs: TeammateSpec[] = [];\n const unmatchedNames: string[] = [];\n\n for (const req of input.teammates) {\n const spec = teamConfig.teammates.find(\n (s) => s.name === req.name || s.role === req.role\n );\n if (spec) {\n matchedSpecs.push(spec);\n } else {\n // Create a minimal spec from the request (no custom tools)\n matchedSpecs.push({\n name: req.name,\n role: req.role,\n description: req.description,\n });\n unmatchedNames.push(req.name);\n }\n }\n\n // 3. Register all agents with mailbox\n await mailboxStore.registerAgent(teamId, TEAM_LEAD_AGENT_ID);\n for (const spec of matchedSpecs) {\n await mailboxStore.registerAgent(teamId, spec.name);\n }\n\n // 4. Spawn all teammates as background promises\n const parentThreadId = config.configurable?.thread_id ?? \"\";\n matchedSpecs.forEach((spec) => {\n void spawnTeammate({\n teamId,\n spec,\n allTeammateSpecs: matchedSpecs,\n taskListStore,\n mailboxStore,\n defaultModel,\n parentThreadId,\n teamTools: teamConfig.tools,\n teamMiddleware: teamConfig.middleware,\n });\n });\n\n // 5. Return immediately (non-blocking)\n const teamJson = JSON.stringify({\n teamId,\n teamLeadId: TEAM_LEAD_AGENT_ID,\n teammates: matchedSpecs.map((s) => ({\n name: s.name,\n role: s.role,\n description: s.description,\n })),\n tasks: createdTasks.map((t) => ({\n id: t.id,\n title: t.title,\n description: t.description,\n status: t.status,\n })),\n }, null, 2);\n\n let summary = `Team created (id: ${teamId}):\\n`;\n summary += `- ${matchedSpecs.length} teammate(s): ${matchedSpecs.map((s) => s.name).join(\", \")}\\n`;\n summary += `- ${createdTasks.length} initial task(s): ${createdTasks.map((t) => `\"${t.title}\"`).join(\", \")}\\n`;\n if (unmatchedNames.length > 0) {\n summary += `- Teammates created with default prompts and tools.\\n`;\n }\n summary += `\\nTeammates are now working in the background. Keep calling \\`check_tasks\\` and \\`read_messages\\` until all tasks are completed or failed.`;\n summary += `\\n\\n\\`\\`\\`json\\n${teamJson}\\n\\`\\`\\``;\n\n const toolMessage = new ToolMessage({\n content: summary,\n tool_call_id: config.toolCall?.id as string,\n name: \"create_team\",\n });\n\n const teamState = {\n teamId,\n teamLeadId: TEAM_LEAD_AGENT_ID,\n teammates: matchedSpecs.map((s) => ({\n name: s.name,\n role: s.role,\n description: s.description,\n })),\n tasks: createdTasks.map((t) => ({\n id: t.id,\n title: t.title,\n description: t.description,\n status: t.status,\n })),\n createdAt: new Date().toISOString(),\n };\n\n return new Command({\n update: { team: teamState, messages: [toolMessage] },\n });\n },\n {\n name: \"create_team\",\n description: `Use this tool to create a team of specialized agents (teammates) to work on complex objectives that require multiple skills or parallel execution. The team lead (you) coordinates the work, while teammates execute tasks independently.\n\nWhen to Use This Tool\nUse this tool in these scenarios:\n\nComplex multi-step objectives - When the user's goal requires breaking into multiple tasks that can be executed in parallel or sequence\nParallel work needed - When multiple independent subtasks can be done simultaneously by different teammates\nDiverse expertise required - When the objective needs different skills (research, writing, coding, review, etc.)\nLong-running tasks - When tasks may take time and you want to monitor progress without blocking\n\nWhen NOT to Use This Tool\nSkip using this tool when:\n\nSimple single task - The objective can be completed in one straightforward step\nAlready have an active team - A team is already running for this session. Use check_tasks and read_messages to monitor instead\nQuick question or simple request - No need to create a team for trivial tasks\n\nIMPORTANT: Task ID Format\n- Task IDs MUST follow the format: task-01, task-02, task-03, etc.\n- Each task needs a unique ID starting from task-01\n- Use sequential IDs to help track task order and dependencies\n- Example: { id: \"task-01\", title: \"Research topic\", description: \"...\" }\n\nIMPORTANT: Dependencies\n- Use dependencies to express which tasks must complete before others can start\n- Dependencies should reference task IDs (e.g., [\"task-01\"])\n- Tasks without dependencies can be worked on immediately in parallel\n\nIMPORTANT: After Creating Team\nAfter calling create_team, you MUST:\n1. Use read_messages to receive updates from teammates (it waits up to 3 minutes for new messages)\n2. When messages indicate task changes, call check_tasks to get full task status\n3. Continue until all tasks show \"completed\" or \"failed\"\n4. Do NOT assume tasks are done - always verify with check_tasks`,\n schema: z.object({\n tasks: z\n .array(\n z.object({\n id: z.string().describe(\"Task ID in format task-01, task-02, etc.\"),\n title: z.string().describe(\"Short task title\"),\n description: z.string().describe(\"Detailed task description - what exactly needs to be done\"),\n dependencies: z\n .array(z.string())\n .optional()\n .default([])\n .describe(\"Array of task IDs that must complete before this task (e.g. [\\\"task-01\\\"])\"),\n })\n )\n .describe(\"List of tasks for teammates to work on. Each task needs unique ID (task-01, task-02, etc.).\"),\n teammates: z\n .array(\n z.object({\n name: z\n .string()\n .describe(\"Teammate name (must match a pre-configured teammate type)\"),\n role: z\n .string()\n .describe(\"Role category (e.g. researcher, writer, coder, reviewer)\"),\n description: z\n .string()\n .describe(\"What this teammate will focus on - specific instructions for their work\"),\n })\n )\n .describe(\"Teammate agents to create. Each should have a clear role and focus.\"),\n }),\n }\n );\n\n /** Resolve team_id from input or state.team.teamId */\n const resolveTeamId = (): string => {\n const state = getCurrentTaskInput<{ team?: { teamId: string } }>();\n if (state?.team?.teamId) return state.team.teamId;\n throw new Error(\"No team_id provided and no team in state. Call create_team first.\");\n };\n\n // -------------------------------------------------------------------\n // add_tasks tool\n // -------------------------------------------------------------------\n const addTasksTool = tool(\n async (\n input: {\n tasks: Array<{ id: string; title: string; description: string; assignee?: string; dependencies?: string[] }>;\n },\n config\n ) => {\n const teamId = resolveTeamId();\n const created = await taskListStore.addTasks(\n teamId,\n input.tasks.map((t) => ({\n id: t.id,\n title: t.title,\n description: t.description,\n assignee: t.assignee,\n dependencies: t.dependencies ?? [],\n }))\n );\n\n const summary = created\n .map((t) => `- ${t.id}: \"${t.title}\"`)\n .join(\"\\n\");\n\n return new ToolMessage({\n content: `Added ${created.length} task(s) to team ${teamId}:\\n${summary}\\nSleeping teammates will wake up and claim these.`,\n tool_call_id: config.toolCall?.id as string,\n name: \"add_tasks\",\n });\n },\n {\n name: \"add_tasks\",\n description: `Use this tool to add new tasks to an existing team's task list. \n\nWhen to Use This Tool\nUse this tool when:\n\nUser requests additional work - After the initial team was created, the user asks for more tasks\nTeammate feedback reveals new needs - A teammate's message indicates additional tasks are needed\nScope expansion - The original objective grows and requires more subtasks\nFollow-up tasks discovered - While working, teammates discover tasks that need to be done\n\nWhen NOT to Use This Tool\nSkip using this tool when:\n\nNo team exists - Use create_team first to create a team\nSimple message response - Just respond to teammates via send_message\nTask modification needed - Use assign_task, set_task_status, or set_task_dependencies to change existing tasks instead\n\nIMPORTANT: Task ID Format\n- New task IDs must be unique and follow format: task-01, task-02, etc.\n- If the team already has tasks (e.g., task-01, task-02), continue the sequence (task-03, task-04)\n- Check existing tasks first using check_tasks to determine the next ID\n\nIMPORTANT: Dependencies\n- Use dependencies to specify which existing tasks must complete before new tasks can start\n- Reference task IDs (e.g., [\"task-01\", \"task-02\"])\n\nIMPORTANT: Assigning to a specific teammate\n- When you need a particular teammate to do the work, set assignee to that teammate's name (e.g. assignee: \"researcher\"). They can then claim or see the task as assigned to them.`,\n schema: z.object({\n tasks: z\n .array(\n z.object({\n id: z.string().describe(\"Task ID in format task-01, task-02, etc. Must be unique.\"),\n title: z.string().describe(\"Short task title\"),\n description: z.string().describe(\"Detailed task description - what needs to be done\"),\n assignee: z.string().optional().describe(\"Teammate name to assign this task to (use when you need that person to do the work)\"),\n dependencies: z\n .array(z.string())\n .optional()\n .default([])\n .describe(\"Array of task IDs that must complete before this task\"),\n })\n )\n .describe(\"New tasks to add to the team\"),\n }),\n }\n );\n\n // -------------------------------------------------------------------\n // assign_task tool\n // -------------------------------------------------------------------\n const assignTaskTool = tool(\n async (input: { task_id: string; assignee: string }, config) => {\n const teamId = resolveTeamId();\n const task = await taskListStore.updateTask(teamId, input.task_id, {\n assignee: input.assignee,\n });\n if (!task) {\n return new ToolMessage({\n content: `Task ${input.task_id} not found in team ${teamId}.`,\n tool_call_id: config.toolCall?.id as string,\n name: \"assign_task\",\n });\n }\n return new ToolMessage({\n content: `Task \"${task.title}\" (${task.id}) assigned to ${input.assignee}.`,\n tool_call_id: config.toolCall?.id as string,\n name: \"assign_task\",\n });\n },\n {\n name: \"assign_task\",\n description:\n \"Assign a task to a specific teammate. Use when you need to reassign work to a different teammate. Omit team_id to use the active team from state.\",\n schema: z.object({\n task_id: z.string().describe(\"Task ID to assign\"),\n assignee: z.string().describe(\"Teammate name to assign this task to\"),\n }),\n }\n );\n\n // -------------------------------------------------------------------\n // set_task_status tool\n // -------------------------------------------------------------------\n const setTaskStatusTool = tool(\n async (\n input: { task_id: string; status: \"pending\" | \"claimed\" | \"in_progress\" | \"completed\" | \"failed\" },\n config\n ) => {\n const teamId = resolveTeamId();\n const task = await taskListStore.updateTask(teamId, input.task_id, {\n status: input.status as TaskStatus,\n });\n if (!task) {\n return new ToolMessage({\n content: `Task ${input.task_id} not found in team ${teamId}.`,\n tool_call_id: config.toolCall?.id as string,\n name: \"set_task_status\",\n });\n }\n return new ToolMessage({\n content: `Task \"${task.title}\" (${task.id}) status set to ${input.status}.`,\n tool_call_id: config.toolCall?.id as string,\n name: \"set_task_status\",\n });\n },\n {\n name: \"set_task_status\",\n description:\n \"Set a task's status. Use to reopen a task (set to pending), mark as failed, or correct status. Values: pending, claimed, in_progress, completed, failed. Omit team_id to use the active team from state.\",\n schema: z.object({\n task_id: z.string().describe(\"Task ID to update\"),\n status: z\n .enum([\"pending\", \"claimed\", \"in_progress\", \"completed\", \"failed\"])\n .describe(\"New status for the task\"),\n }),\n }\n );\n\n // -------------------------------------------------------------------\n // set_task_dependencies tool\n // -------------------------------------------------------------------\n const setTaskDependenciesTool = tool(\n async (input: { task_id: string; dependencies: string[] }, config) => {\n const teamId = resolveTeamId();\n const task = await taskListStore.updateTask(teamId, input.task_id, {\n dependencies: input.dependencies,\n });\n if (!task) {\n return new ToolMessage({\n content: `Task ${input.task_id} not found in team ${teamId}.`,\n tool_call_id: config.toolCall?.id as string,\n name: \"set_task_dependencies\",\n });\n }\n return new ToolMessage({\n content: `Task \"${task.title}\" (${task.id}) dependencies set to [${input.dependencies.join(\", \")}].`,\n tool_call_id: config.toolCall?.id as string,\n name: \"set_task_dependencies\",\n });\n },\n {\n name: \"set_task_dependencies\",\n description:\n \"Set which task IDs must complete before this task can be claimed. Pass an array of task IDs (e.g. [\\\"task-01\\\", \\\"task-02\\\"]). Use to fix task order or add/remove dependencies. Omit team_id to use the active team from state.\",\n schema: z.object({\n task_id: z.string().describe(\"Task ID to update\"),\n dependencies: z\n .array(z.string())\n .describe(\"Task IDs that must complete before this task can be claimed\"),\n }),\n }\n );\n\n // -------------------------------------------------------------------\n // check_tasks tool\n // -------------------------------------------------------------------\n const checkTasksTool = tool(\n async (input: object, config) => {\n const teamId = resolveTeamId();\n const tasks = await taskListStore.getAllTasks(teamId);\n const tasksSnapshot = tasks;\n return new Command({\n update: {\n tasks: tasksSnapshot,\n messages: [\n new ToolMessage({\n content: formatTaskSummary(tasks),\n tool_call_id: config.toolCall?.id as string,\n name: \"check_tasks\",\n }),\n ],\n },\n });\n },\n {\n name: \"check_tasks\",\n description: `Use this tool to get the current status of all tasks in a team. This is your primary way to monitor teammate progress.\n\nWhen to Use This Tool\nUse this tool:\n\nAfter creating a team - Check task status after create_team to verify tasks are being worked on\nWhen read_messages indicates task changes - Teammates report status via messages; call check_tasks to get full task list details\nBefore final synthesis - Verify all tasks are complete before reporting results to user\n\nIMPORTANT: How to Monitor\n1. Use read_messages to wait for updates from teammates (it polls internally).\n2. When you receive messages suggesting task progress or completion, call check_tasks to get the current task status.\n3. Look at each task's status: pending, in_progress, completed, or failed.\n4. NEVER assume tasks are done - always verify with check_tasks.\n\nTask Status Values:\n- pending: Task created but not yet claimed by any teammate\n- in_progress: Teammate is actively working on this task\n- completed: Task finished successfully\n- failed: Task encountered an error`,\n schema: z.object({\n team_id: z.string().optional().describe(\"Team ID (omit to use active team)\"),\n }),\n }\n );\n\n // -------------------------------------------------------------------\n // send_message tool\n // -------------------------------------------------------------------\n const sendMessageTool = tool(\n async (input: any, config) => {\n const teamId = resolveTeamId();\n await mailboxStore.sendMessage(\n teamId,\n TEAM_LEAD_AGENT_ID,\n input.to,\n input.content,\n MessageType.DIRECT_MESSAGE\n );\n return new ToolMessage({\n content: `Message sent to ${input.to}.`,\n tool_call_id: config.toolCall?.id as string,\n name: \"send_message\",\n });\n },\n {\n name: \"send_message\",\n description:\n \"Send a message to a specific teammate in the team. Omit team_id to use the active team from state.\",\n schema: z.object({\n to: z.string().describe(\"Recipient teammate name\"),\n content: z.string().describe(\"Message content\"),\n }),\n }\n );\n\n // -------------------------------------------------------------------\n // read_messages tool\n // -------------------------------------------------------------------\n const readMessagesTool = tool(\n async (input: object, config) => {\n const teamId = resolveTeamId();\n\n // Helper to format and mark messages as read\n const formatAndMarkAsRead = async (\n msgs: MailboxMessage[]\n ): Promise<string> => {\n for (const msg of msgs) {\n await mailboxStore.markAsRead(teamId, TEAM_LEAD_AGENT_ID, msg.id);\n }\n return formatMessagesAsMarkdown(msgs);\n };\n\n // Helper to get all team messages formatted for state\n const getAllTeamMessagesForState = async () => {\n const allMsgs = await mailboxStore.getAllTeamMessages(teamId);\n return allMsgs.map((msg) => ({\n id: msg.id,\n from: msg.from,\n to: msg.to,\n content: msg.content,\n timestamp: msg.timestamp instanceof Date ? msg.timestamp.toISOString() : msg.timestamp,\n type: msg.type,\n read: msg.read,\n }));\n };\n\n // 1. First check for existing unread messages\n let msgs = await mailboxStore.getUnreadMessages(\n teamId,\n TEAM_LEAD_AGENT_ID\n );\n if (msgs.length > 0) {\n const formatted = await formatAndMarkAsRead(msgs);\n \n // Update team_mailbox in state\n const allTeamMessages = await getAllTeamMessagesForState();\n \n const toolMessage = new ToolMessage({\n content: formatted,\n tool_call_id: config.toolCall?.id as string,\n name: \"read_messages\",\n });\n\n return new Command({\n update: { team_mailbox: allTeamMessages, messages: [toolMessage] },\n });\n }\n\n // 2. No existing messages - wait for new ones using event mechanism\n const messagePromise = new Promise<MailboxMessage[]>((resolve) => {\n const handler = async (msg: MailboxMessage) => {\n mailboxStore.offMessage(teamId, TEAM_LEAD_AGENT_ID, handler);\n const allMsgs = await mailboxStore.getUnreadMessages(\n teamId,\n TEAM_LEAD_AGENT_ID\n );\n resolve(allMsgs);\n };\n mailboxStore.onMessage(teamId, TEAM_LEAD_AGENT_ID, handler);\n });\n\n // 3. Set timeout (max 3 minutes)\n const timeoutPromise = new Promise<MailboxMessage[]>((resolve) => {\n setTimeout(() => resolve([]), READ_MESSAGES_TIMEOUT_MS);\n });\n\n // 4. Race: message arrives first or timeout\n msgs = await Promise.race([messagePromise, timeoutPromise]);\n\n // 5. Cleanup: unsubscribe if still subscribed\n mailboxStore.offMessage(\n teamId,\n TEAM_LEAD_AGENT_ID,\n () => {}\n );\n\n // Update team_mailbox in state\n const allTeamMessages = await getAllTeamMessagesForState();\n\n if (msgs.length === 0) {\n const toolMessage = new ToolMessage({\n content: \"No unread messages from teammates.\",\n tool_call_id: config.toolCall?.id as string,\n name: \"read_messages\",\n });\n\n return new Command({\n update: { team_mailbox: allTeamMessages, messages: [toolMessage] },\n });\n }\n\n const formatted = await formatAndMarkAsRead(msgs);\n const toolMessage = new ToolMessage({\n content: formatted,\n tool_call_id: config.toolCall?.id as string,\n name: \"read_messages\",\n });\n\n return new Command({\n update: { team_mailbox: allTeamMessages, messages: [toolMessage] },\n });\n },\n {\n name: \"read_messages\",\n description:\n \"Read unread messages from teammates. \" +\n \"Returns immediately if messages exist, otherwise waits for up to 3 minutes for new messages.\",\n schema: z.object({\n team_id: z.string().optional().describe(\"Team ID (omit to use active team)\"),\n }),\n }\n );\n\n // -------------------------------------------------------------------\n // disband_team\n // -------------------------------------------------------------------\n const disbandTeamTool = tool(\n async (input: any, config) => {\n const teamId = resolveTeamId();\n\n await mailboxStore.broadcastMessage(\n teamId,\n TEAM_LEAD_AGENT_ID,\n \"All tasks are complete. You may now shut down gracefully. Thank you for your work!\",\n MessageType.SHUTDOWN_REQUEST\n );\n\n await new Promise((r) => setTimeout(r, 2000));\n\n // taskListStore.clearTeam(teamId);\n // mailboxStore.clearTeam(teamId);\n\n return new ToolMessage({\n content: `Team ${teamId} has been disbanded. All teammates notified and resources cleaned up.`,\n tool_call_id: config.toolCall?.id as string,\n name: \"disband_team\",\n });\n },\n {\n name: \"disband_team\",\n description:\n \"Disband a team when all work is done. \" +\n \"Before calling: (1) Call check_tasks to verify no tasks are still pending/in_progress; (2) if any are, discuss with the team via read_messages and broadcast_message/send_message whether to continue or stop/cancel them; (3) only after alignment (all tasks completed/failed or explicitly stopped), then call this tool. \" +\n \"This will: 1) Send a shutdown message to all teammates, 2) Wait briefly for them to clean up, 3) Clear all tasks and messages. Omit team_id to use the active team from state.\",\n\n }\n );\n\n // -------------------------------------------------------------------\n // broadcast_message\n // -------------------------------------------------------------------\n const broadcastMessageTool = tool(\n async (input: { content: string }, config) => {\n const teamId = resolveTeamId();\n await mailboxStore.broadcastMessage(\n teamId,\n TEAM_LEAD_AGENT_ID,\n input.content,\n MessageType.BROADCAST\n );\n return new ToolMessage({\n content: `Broadcast message sent to all teammates.`,\n tool_call_id: config.toolCall?.id as string,\n name: \"broadcast_message\",\n });\n },\n {\n name: \"broadcast_message\",\n description:\n \"Send a message to all teammates at once. Use this to communicate with everyone in the team. Omit team_id to use the active team from state.\",\n schema: z.object({\n content: z.string().describe(\"Message content to broadcast to all teammates\"),\n }),\n }\n );\n\n // -------------------------------------------------------------------\n // Assemble middleware\n // -------------------------------------------------------------------\n return createMiddleware({\n name: \"teamMiddleware\",\n tools: [\n createTeamTool,\n addTasksTool,\n assignTaskTool,\n setTaskStatusTool,\n setTaskDependenciesTool,\n checkTasksTool,\n sendMessageTool,\n readMessagesTool,\n disbandTeamTool,\n broadcastMessageTool,\n ],\n wrapModelCall: async (request, handler) => {\n const currentPrompt = request.systemPrompt || \"\";\n const newPrompt = currentPrompt\n ? `${currentPrompt}\\n\\n${TEAM_SYSTEM_PROMPT}`\n : TEAM_SYSTEM_PROMPT;\n return handler({\n ...request,\n systemPrompt: newPrompt,\n });\n },\n });\n}\n","/**\n * Agent Team - Teammate Tools\n *\n * Factory that creates LangChain StructuredTools injected into each\n * teammate agent. These tools let teammates interact with the shared\n * TaskListStore and MailboxStore.\n *\n * Tools: claim_task, complete_task, fail_task, send_message, read_messages\n */\n\nimport { z } from \"zod/v3\";\nimport { tool, ToolMessage } from \"langchain\";\nimport { Command } from \"@langchain/langgraph\";\nimport type { StructuredTool } from \"@langchain/core/tools\";\nimport type { TaskListStore } from \"../stores/protocols.js\";\nimport type { MailboxStore } from \"../stores/protocols.js\";\nimport { MessageType, type MailboxMessage } from \"../types.js\";\nimport { formatMessagesAsMarkdown } from \"./formatMessages.js\";\nimport { formatTaskSummary } from \"./team.js\";\n\n/**\n * Options for creating teammate tools.\n */\nexport interface TeammateToolsOptions {\n /** Team identifier (scopes store operations) */\n teamId: string;\n /** This teammate's agent name / ID */\n agentId: string;\n /** Shared task list store */\n taskListStore: TaskListStore;\n /** Shared mailbox store */\n mailboxStore: MailboxStore;\n}\n\n/**\n * Create the set of tools injected into each teammate agent.\n *\n * These tools give the teammate access to:\n * - Task lifecycle: claim_task, complete_task, fail_task\n * - Communication: send_message, read_messages\n */\nexport function createTeammateTools(\n options: TeammateToolsOptions\n): StructuredTool[] {\n const { teamId, agentId, taskListStore, mailboxStore } = options;\n\n // -----------------------------------------------------------------------\n // claim_task\n // -----------------------------------------------------------------------\n const claimTaskTool = tool(\n async (input: { task_id: string }) => {\n const task = await taskListStore.claimTaskById(\n teamId,\n input.task_id,\n agentId\n );\n if (!task) {\n return (\n `Could not claim task \"${input.task_id}\". ` +\n \"Check that it exists, is PENDING, and all its dependencies are completed. \" +\n \"Use check_tasks to see available tasks and their status.\"\n );\n }\n return (\n `Claimed task ${task.id} \"${task.title}\". Focus on this task now. When done, call complete_task or fail_task with task_id \"${task.id}\".\\n` +\n JSON.stringify(\n {\n task_id: task.id,\n title: task.title,\n description: task.description,\n dependencies: task.dependencies,\n },\n null,\n 2\n )\n );\n },\n {\n name: \"claim_task\",\n description:\n \"Pick a task to work on by task_id. Use check_tasks first to see all tasks; \" +\n \"then call this with the task_id you choose. The task's assignee is set to you \" +\n \"and you should focus on that task until you complete_task or fail_task it.\",\n schema: z.object({\n task_id: z\n .string()\n .describe(\"ID of the task to claim (e.g. task-01). Use check_tasks to see IDs.\"),\n }),\n }\n );\n\n // -----------------------------------------------------------------------\n // complete_task\n // -----------------------------------------------------------------------\n const completeTaskTool = tool(\n async (input: { task_id: string; result: string }) => {\n const task = await taskListStore.completeTask(\n teamId,\n input.task_id,\n input.result\n );\n if (!task) {\n return `Task ${input.task_id} not found.`;\n }\n // Broadcast to team that this agent completed the task\n await mailboxStore.broadcastMessage(\n teamId,\n agentId,\n `Completed task ${task.id} \"${task.title}\": ${input.result}`,\n MessageType.BROADCAST\n );\n return `Task ${task.id} \"${task.title}\" marked as completed.`;\n },\n {\n name: \"complete_task\",\n description:\n \"Mark a claimed task as completed with a result summary. \" +\n \"Call this after you have finished working on a task.\",\n schema: z.object({\n task_id: z.string().describe(\"ID of the task to complete\"),\n result: z.string().describe(\"Summary of the task result\"),\n }),\n }\n );\n\n // -----------------------------------------------------------------------\n // fail_task\n // -----------------------------------------------------------------------\n const failTaskTool = tool(\n async (input: { task_id: string; error: string }) => {\n const task = await taskListStore.failTask(\n teamId,\n input.task_id,\n input.error\n );\n if (!task) {\n return `Task ${input.task_id} not found.`;\n }\n // Broadcast to team that this agent failed the task\n await mailboxStore.broadcastMessage(\n teamId,\n agentId,\n `Failed task ${task.id} \"${task.title}\": ${input.error}`,\n MessageType.BROADCAST\n );\n return `Task ${task.id} \"${task.title}\" marked as failed: ${input.error}`;\n },\n {\n name: \"fail_task\",\n description:\n \"Mark a claimed task as failed with an error description. \" +\n \"Call this if you cannot complete the task.\",\n schema: z.object({\n task_id: z.string().describe(\"ID of the task to fail\"),\n error: z\n .string()\n .describe(\"Description of why the task failed\"),\n }),\n }\n );\n\n // -----------------------------------------------------------------------\n // send_message\n // -----------------------------------------------------------------------\n const sendMessageTool = tool(\n async (input: { to: string; content: string }) => {\n await mailboxStore.sendMessage(\n teamId,\n agentId,\n input.to,\n input.content,\n MessageType.DIRECT_MESSAGE\n );\n return `Message sent to ${input.to}.`;\n },\n {\n name: \"send_message\",\n description:\n 'Send a message to the team lead or another teammate via the mailbox. ' +\n 'Use \"team_lead\" to message the team lead. ' +\n \"Use this to report discoveries, request guidance, or suggest new tasks.\",\n schema: z.object({\n to: z\n .string()\n .describe(\n 'Recipient agent name (e.g. \"team_lead\" or a teammate name)'\n ),\n content: z.string().describe(\"Message content\"),\n }),\n }\n );\n\n // -----------------------------------------------------------------------\n // read_messages\n // -----------------------------------------------------------------------\n const READ_MESSAGES_TIMEOUT_MS = 180_000; // 3 minutes max wait\n\n // Helper to get messages relevant to this agent (sent to or from this agent)\n const getRelevantMessagesForState = async (): Promise<any[]> => {\n const allMsgs = await mailboxStore.getAllTeamMessages(teamId);\n const relevantMsgs = allMsgs.filter(\n (msg) => msg.from === agentId || msg.to === agentId\n );\n return relevantMsgs.map((msg) => ({\n id: msg.id,\n from: msg.from,\n to: msg.to,\n content: msg.content,\n timestamp: msg.timestamp instanceof Date ? msg.timestamp.toISOString() : msg.timestamp,\n type: msg.type,\n read: msg.read,\n }));\n };\n\n const readMessagesTool = tool(\n async (input: object, config) => {\n // Helper to format and mark messages as read\n const formatAndMarkAsRead = async (\n msgs: MailboxMessage[]\n ): Promise<string> => {\n for (const msg of msgs) {\n await mailboxStore.markAsRead(teamId, agentId, msg.id);\n }\n return formatMessagesAsMarkdown(msgs);\n };\n\n // 1. First check for existing unread messages\n let msgs = await mailboxStore.getUnreadMessages(teamId, agentId);\n if (msgs.length > 0) {\n const formatted = await formatAndMarkAsRead(msgs);\n \n // Update team_mailbox in state with relevant messages\n const relevantMsgs = await getRelevantMessagesForState();\n \n const toolMessage = new ToolMessage({\n content: formatted,\n tool_call_id: config.toolCall?.id as string,\n name: \"read_messages\",\n });\n\n return new Command({\n update: { team_mailbox: relevantMsgs, messages: [toolMessage] },\n });\n }\n\n // 2. No existing messages - wait for new ones using event mechanism\n const messagePromise = new Promise<MailboxMessage[]>((resolve) => {\n const handler = async (msg: MailboxMessage) => {\n mailboxStore.offMessage(teamId, agentId, handler);\n const allMsgs = await mailboxStore.getUnreadMessages(teamId, agentId);\n resolve(allMsgs);\n };\n mailboxStore.onMessage(teamId, agentId, handler);\n });\n\n // 3. Set timeout (max 3 minutes)\n const timeoutPromise = new Promise<MailboxMessage[]>((resolve) => {\n setTimeout(() => resolve([]), READ_MESSAGES_TIMEOUT_MS);\n });\n\n // 4. Race: message arrives first or timeout\n msgs = await Promise.race([messagePromise, timeoutPromise]);\n\n // 5. Cleanup: unsubscribe if still subscribed\n mailboxStore.offMessage(teamId, agentId, () => {});\n\n // Update team_mailbox in state with relevant messages\n const relevantMsgs = await getRelevantMessagesForState();\n\n if (msgs.length === 0) {\n const toolMessage = new ToolMessage({\n content: \"No unread messages.\",\n tool_call_id: config.toolCall?.id as string,\n name: \"read_messages\",\n });\n\n return new Command({\n update: { team_mailbox: relevantMsgs, messages: [toolMessage] },\n });\n }\n\n const formatted = await formatAndMarkAsRead(msgs);\n const toolMessage = new ToolMessage({\n content: formatted,\n tool_call_id: config.toolCall?.id as string,\n name: \"read_messages\",\n });\n\n return new Command({\n update: { team_mailbox: relevantMsgs, messages: [toolMessage] },\n });\n },\n {\n name: \"read_messages\",\n description:\n \"Read unread messages from the mailbox. Returns immediately if messages exist, otherwise waits for up to 3 minutes for new messages.\",\n schema: z.object({}),\n }\n );\n\n // -----------------------------------------------------------------------\n // check_tasks\n // -----------------------------------------------------------------------\n const checkTasksTool = tool(\n async () => {\n const tasks = await taskListStore.getAllTasks(teamId);\n return formatTaskSummary(tasks);\n },\n {\n name: \"check_tasks\",\n description:\n \"Use this tool to get the current status of all tasks in a team. This is your primary way to monitor task progress.\",\n schema: z.object({}),\n }\n );\n\n // -----------------------------------------------------------------------\n // broadcast_message\n // -----------------------------------------------------------------------\n const broadcastMessageTool = tool(\n async (input: { content: string }) => {\n const allAgents = await mailboxStore.getRegisteredAgents(teamId);\n const recipients = allAgents.filter((a) => a !== agentId);\n\n const promises = recipients.map((recipient) =>\n mailboxStore.sendMessage(\n teamId,\n agentId,\n recipient,\n input.content,\n MessageType.BROADCAST\n )\n );\n await Promise.all(promises);\n\n return `Broadcast message sent to ${recipients.length} recipient(s): ${recipients.join(\", \")}`;\n },\n {\n name: \"broadcast_message\",\n description:\n \"Send a message to everyone in the team except yourself. \" +\n \"Use this to share updates or information with all teammates and the team lead at once.\",\n schema: z.object({\n content: z.string().describe(\"Message content to broadcast to others\"),\n }),\n }\n );\n\n return [\n claimTaskTool,\n completeTaskTool,\n failTaskTool,\n sendMessageTool,\n readMessagesTool,\n checkTasksTool,\n broadcastMessageTool,\n ] as StructuredTool[];\n}\n","/**\n * Agent Team - Message formatting for read_messages tool output\n *\n * Formats mailbox messages as Markdown with one section per message.\n */\n\nimport type { MailboxMessage } from \"../types.js\";\n\n/**\n * Format a list of mailbox messages as Markdown.\n * Each message is rendered as a separate section (separated by ---) with type, from, time, and content.\n */\nexport function formatMessagesAsMarkdown(msgs: MailboxMessage[]): string {\n if (msgs.length === 0) return \"No unread messages.\";\n\n const header = `## Unread messages (${msgs.length})\\n`;\n const sections = msgs.map((m, i) => {\n const title = `### ${i + 1}. From: **${m.from}**`;\n const meta = `- **Type:** \\`${m.type}\\`\\n- **Time:** ${m.timestamp.toISOString()}`;\n const body = m.content.trim() ? `\\n\\n${m.content.trim()}` : \"\";\n return `---\\n${title}\\n${meta}${body}`;\n });\n return header + sections.join(\"\\n\\n\");\n}\n","/**\n * Team Agent Graph Builder\n *\n * Implements AgentGraphBuilder for AgentType.TEAM.\n * Bridges the AgentConfig registration system with createAgentTeam(),\n * resolving tool keys and model keys into concrete instances.\n */\n\nimport type { AgentGraphBuilder } from \"../../agent_lattice/builders/AgentGraphBuilder\";\nimport type { AgentLattice, AgentBuildParams, AgentClient, MiddlewareConfig } from \"../../agent_lattice/types\";\nimport { isTeamAgentConfig } from \"../../agent_lattice/types\";\nimport { getCheckpointSaver } from \"@memory_lattice/MemoryLatticeManager\";\nimport { createAgentTeam } from \"../agent_team\";\nimport type { TeammateSpec, TeamConfig } from \"../types\";\nimport { getToolClient } from \"../../tool_lattice/ToolLatticeManager\";\nimport { AgentMiddleware } from \"langchain\";\nimport { createCommonMiddlewares } from \"../../agent_lattice/builders/commonMiddleware\";\nimport { createFilesystemBackendFactory } from \"../../agent_lattice/builders/filesystemBackend\";\nimport { StateBackend } from \"@deep_agent_new/backends/state\";\n\nexport class TeamAgentGraphBuilder implements AgentGraphBuilder {\n /**\n * Build a Team agent from the registered AgentLattice config.\n *\n * @param agentLattice - The AgentLattice containing the TeamAgentConfig\n * @param params - Build params with resolved tools and model\n * @returns AgentClient (the TeamLead ReactAgent)\n */\n build(agentLattice: AgentLattice, params: AgentBuildParams): AgentClient {\n const config = agentLattice.config;\n if (!isTeamAgentConfig(config)) {\n throw new Error(\n `TeamAgentGraphBuilder received non-TEAM config: ${config.type}`\n );\n }\n\n const tools = params.tools\n .map((t) => {\n const toolClient = getToolClient(t.key);\n return toolClient;\n })\n .filter((tool) => tool !== undefined);\n\n const teammates: TeammateSpec[] = params.subAgents.map((sa) => {\n const baseConfig = sa.config as { name: string; description: string; prompt?: string };\n return {\n name: baseConfig.name,\n role: baseConfig.name,\n description: baseConfig.description,\n systemPrompt: baseConfig.prompt,\n tools: tools as any,\n };\n });\n\n const middlewareConfigs = params.middleware || [];\n let filesystemBackend = createFilesystemBackendFactory(middlewareConfigs);\n const middlewares = createCommonMiddlewares(middlewareConfigs);\n if (!filesystemBackend) {\n filesystemBackend = async (config: { state: unknown; store?: any }) => {\n return new StateBackend(config);\n };\n }\n\n const teamConfig: TeamConfig = {\n teammates,\n maxConcurrency: config.maxConcurrency,\n model: params.model,\n systemPrompt: config.prompt || undefined,\n tools: tools as any,\n checkpointer: getCheckpointSaver(\"default\"),\n scheduleLatticeKey: config.scheduleLatticeKey,\n pollIntervalMs: config.pollIntervalMs,\n backend: filesystemBackend,\n middleware: middlewares as AgentMiddleware[],\n };\n\n const teamLead = createAgentTeam(teamConfig);\n\n return teamLead as AgentClient;\n }\n}\n","/**\n * Agent Graph Builder Factory\n *\n * 工厂类,根据Agent类型创建对应的Builder\n */\n\nimport { AgentType } from \"../types\";\nimport { AgentGraphBuilder } from \"./AgentGraphBuilder\";\nimport { ReActAgentGraphBuilder } from \"./ReActAgentGraphBuilder\";\nimport { DeepAgentGraphBuilder } from \"./DeepAgentGraphBuilder\";\nimport { TeamAgentGraphBuilder } from \"../../agent_team/builders/TeamAgentGraphBuilder\";\n\nexport class AgentGraphBuilderFactory {\n // 单例模式\n private static instance: AgentGraphBuilderFactory;\n\n // Builder缓存\n private builders: Map<AgentType, AgentGraphBuilder>;\n\n private constructor() {\n this.builders = new Map();\n this.registerDefaultBuilders();\n }\n\n /**\n * 获取单例实例\n */\n public static getInstance(): AgentGraphBuilderFactory {\n if (!AgentGraphBuilderFactory.instance) {\n AgentGraphBuilderFactory.instance = new AgentGraphBuilderFactory();\n }\n return AgentGraphBuilderFactory.instance;\n }\n\n /**\n * 注册默认的Builder\n */\n private registerDefaultBuilders(): void {\n this.builders.set(AgentType.REACT, new ReActAgentGraphBuilder());\n this.builders.set(AgentType.DEEP_AGENT, new DeepAgentGraphBuilder());\n this.builders.set(AgentType.TEAM, new TeamAgentGraphBuilder());\n }\n\n /**\n * 注册自定义Builder\n *\n * @param type Agent类型\n * @param builder Builder实例\n */\n public registerBuilder(type: AgentType, builder: AgentGraphBuilder): void {\n this.builders.set(type, builder);\n }\n\n /**\n * 获取Builder\n *\n * @param type Agent类型\n * @returns 返回对应的Builder\n */\n public getBuilder(type: AgentType): AgentGraphBuilder {\n const builder = this.builders.get(type);\n if (!builder) {\n throw new Error(`不支持的Agent类型: ${type}`);\n }\n return builder;\n }\n}\n","/**\n * Agent parameters builder\n *\n * responsible for preparing the parameters required for building the Agent\n */\n\nimport { toolLatticeManager } from \"../../tool_lattice/ToolLatticeManager\";\nimport { modelLatticeManager } from \"../../model_lattice/ModelLatticeManager\";\nimport { AgentLattice, AgentBuildParams, GraphBuildOptions } from \"../types\";\nimport {\n getToolsFromConfig,\n getSubAgentsFromConfig,\n isDeepAgentConfig,\n AgentConfig,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * Get Agent Lattice function type\n */\nexport type GetAgentLatticeFunction = (key: string) => AgentLattice | undefined;\n\n/**\n * Agent parameters builder\n */\nexport class AgentParamsBuilder {\n private getAgentLatticeFunc: GetAgentLatticeFunction;\n\n /**\n * constructor\n *\n * @param getAgentLatticeFunc get Agent Lattice function\n */\n constructor(getAgentLatticeFunc: GetAgentLatticeFunction) {\n this.getAgentLatticeFunc = getAgentLatticeFunc;\n }\n\n /**\n * build Agent parameters\n *\n * @param agentLattice Agent Lattice object\n * @param options build options\n * @returns Agent build parameters\n */\n public buildParams(\n agentLattice: AgentLattice,\n options?: GraphBuildOptions\n ): AgentBuildParams {\n // get tools (use type-safe helper)\n const skills = isDeepAgentConfig(agentLattice.config) ? agentLattice.config.skillCategories : undefined;\n const toolKeys =\n options?.overrideTools || getToolsFromConfig(agentLattice.config);\n const tools = toolKeys.map((toolKey: string) => {\n const toolLattice = toolLatticeManager.getToolLattice(toolKey);\n if (!toolLattice) {\n throw new Error(`Tool \"${toolKey}\" does not exist`);\n }\n return {\n key: toolKey,\n definition: toolLattice.config,\n executor: toolLattice.client,\n };\n });\n\n // get model\n const modelKey = options?.overrideModel || agentLattice.config.modelKey;\n const model = modelKey\n ? modelLatticeManager.getModelLattice(modelKey).client\n : modelLatticeManager.getModelLattice(\"default\").client;\n if (!model) {\n throw new Error(`Model \"${modelKey}\" does not exist`);\n }\n\n // get subAgents (use type-safe helper - only DeepAgentConfig has subAgents)\n const subAgentKeys = getSubAgentsFromConfig(agentLattice.config);\n const subAgents = subAgentKeys.map((agentKey: string) => {\n const subAgentLattice = this.getAgentLatticeFunc(agentKey);\n if (!subAgentLattice) {\n throw new Error(`SubAgent \"${agentKey}\" does not exist`);\n }\n return {\n key: agentKey,\n config: subAgentLattice.config,\n client: subAgentLattice.client,\n };\n });\n let internalSubAgents: any[] = [];\n if (isDeepAgentConfig(agentLattice.config)) {\n internalSubAgents =\n agentLattice.config.internalSubAgents?.map((i) => ({\n key: i.key,\n config: i,\n })) || [];\n }\n\n return {\n tools,\n model,\n subAgents: [...subAgents, ...internalSubAgents],\n prompt: agentLattice.config.prompt,\n stateSchema: agentLattice.config.schema,\n skillCategories: skills,\n middleware: agentLattice.config.middleware,\n };\n }\n}\n","/**\n * Utility for merging agent configurations in an inheritance chain.\n *\n * When a child agent extends a parent, unspecified fields are inherited\n * from the parent. Explicitly set fields in the child override the parent's.\n */\n\nimport { AgentConfig } from \"@axiom-lattice/protocols\";\n\n/**\n * Fields that should never be inherited from the parent.\n * - `key`: always the child's own identity\n * - `extendsAgent`: the inheritance reference itself, not propagated\n */\nconst NON_INHERITABLE_FIELDS: ReadonlySet<string> = new Set([\n \"key\",\n \"extendsAgent\",\n]);\n\n/**\n * Merge a parent agent config with a child agent config.\n *\n * The child's explicitly set (non-undefined) fields override the parent's.\n * Array fields (tools, middleware, subAgents, etc.) are replaced entirely\n * when set on the child, not merged element-by-element.\n *\n * @param parent - The fully resolved parent config\n * @param child - The child config containing overrides\n * @returns A new merged AgentConfig with the child's key and resolved values\n */\nexport function mergeAgentConfig(\n parent: AgentConfig,\n child: AgentConfig\n): AgentConfig {\n // Start with a shallow copy of the parent\n const merged: Record<string, any> = { ...parent };\n\n // Apply child overrides: any field explicitly set on the child wins\n for (const [key, value] of Object.entries(child)) {\n if (NON_INHERITABLE_FIELDS.has(key)) {\n continue;\n }\n if (value !== undefined) {\n merged[key] = value;\n }\n }\n\n // Always use the child's key\n merged.key = child.key;\n\n // Strip extendsAgent from the resolved config (inheritance is resolved)\n delete merged.extendsAgent;\n\n return merged as AgentConfig;\n}\n","import { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport {\n AgentConfig,\n AgentClient,\n AgentLattice,\n GraphBuildOptions,\n AgentBuildParams,\n AgentType,\n} from \"./types\";\nimport { AgentGraphBuilderFactory } from \"./builders/AgentGraphBuilderFactory\";\nimport { AgentParamsBuilder } from \"./builders/AgentParamsBuilder\";\nimport { mergeAgentConfig } from \"./utils/mergeAgentConfig\";\nimport \"../tool_lattice\";\nimport eventBus from \"../services/event_bus\";\nimport type { Assistant } from \"@axiom-lattice/protocols\";\nimport { getStoreLattice } from \"../store_lattice\";\n\nfunction assistantToConfig(assistant: Assistant): AgentConfig {\n const graphDef = typeof assistant.graphDefinition === \"object\" && assistant.graphDefinition !== null\n ? assistant.graphDefinition\n : {};\n\n const config: AgentConfig = {\n key: assistant.id,\n name: assistant.name ?? (graphDef as any).name ?? assistant.id,\n description: assistant.description ?? (graphDef as any).description ?? \"\",\n type: AgentType.REACT,\n prompt: typeof assistant.graphDefinition === \"string\"\n ? assistant.graphDefinition\n : JSON.stringify(assistant.graphDefinition),\n };\n\n if (graphDef) {\n Object.assign(config, graphDef);\n }\n return config;\n}\n\n/**\n * AgentLatticeManager - 单例Agent Lattice管理器\n * 负责注册、管理各种Agent Lattice\n */\nexport class AgentLatticeManager extends BaseLatticeManager<AgentLattice> {\n private static _instance: AgentLatticeManager;\n private initialized: boolean = false;\n\n /**\n * 获取AgentLatticeManager单例实例\n */\n public static getInstance(): AgentLatticeManager {\n if (!AgentLatticeManager._instance) {\n AgentLatticeManager._instance = new AgentLatticeManager();\n }\n return AgentLatticeManager._instance;\n }\n\n private constructor() {\n super();\n this.subscribeToAssistantEvents();\n }\n\n private async initializeStoredAssistants(): Promise<void> {\n if (this.initialized) return;\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"assistant\");\n const assistants = await storeLattice.store.getAllAssistants();\n\n for (const assistant of assistants) {\n if (this.has(assistant.id)) continue;\n const config = assistantToConfig(assistant);\n this.registerLattice(config);\n }\n\n this.initialized = true;\n } catch (error) {\n console.error(\"Failed to initialize stored assistants:\", error);\n }\n }\n\n private subscribeToAssistantEvents(): void {\n eventBus.subscribe(\"assistant:created\", (data: { id: string }) => {\n this.handleAssistantChange(data.id);\n });\n eventBus.subscribe(\"assistant:updated\", (data: { id: string }) => {\n this.handleAssistantChange(data.id);\n });\n eventBus.subscribe(\"assistant:deleted\", (data: { id: string }) => {\n this.handleAssistantDelete(data.id);\n });\n }\n\n private async handleAssistantChange(assistantId: string): Promise<void> {\n try {\n const storeLattice = getStoreLattice(\"default\", \"assistant\");\n const assistant = await storeLattice.store.getAssistantById(assistantId);\n\n if (assistant) {\n if (this.has(assistantId)) {\n this.remove(assistantId);\n }\n const config = assistantToConfig(assistant);\n this.registerLattice(config);\n }\n } catch (error) {\n console.error(`Failed to handle assistant change for ${assistantId}:`, error);\n }\n }\n\n private handleAssistantDelete(assistantId: string): void {\n if (this.has(assistantId)) {\n this.remove(assistantId);\n }\n }\n\n /**\n * 获取Lattice类型前缀\n */\n protected getLatticeType(): string {\n return \"agents\";\n }\n\n /**\n * 注册Agent Lattice\n * @param config Agent配置\n */\n public registerLattice(config: AgentConfig): void {\n // 创建Agent Lattice对象\n const agentLattice: AgentLattice = {\n config,\n client: undefined, // 客户端将在需要时由initializeClient创建\n };\n\n // 调用基类的register方法\n this.register(config.key, agentLattice);\n }\n\n /**\n * Register a pre-built teammate agent client for dynamic team spawning.\n * Used when spawning teammates via agentWorkerGraph - the agent must exist\n * in the lattice before the worker invokes it.\n *\n * @param key Unique key (e.g. `team:${teamId}:${agentName}`)\n * @param client Pre-built AgentClient (ReactAgent or CompiledGraph)\n */\n public registerTeammateAgent(key: string, client: AgentClient): void {\n const agentLattice: AgentLattice = {\n config: {\n key,\n name: key,\n description: `Teammate agent: ${key}`,\n type: AgentType.REACT,\n } as AgentConfig,\n client,\n };\n this.register(key, agentLattice);\n }\n\n /**\n * Unregister a teammate agent. Call when a team is done to clean up.\n */\n public unregisterTeammateAgent(key: string): boolean {\n return this.remove(key);\n }\n\n /**\n * 获取AgentLattice\n * @param key Lattice键名\n */\n public getAgentLattice(key: string): AgentLattice | undefined {\n return this.get(key);\n }\n\n /**\n * 获取所有Lattice\n */\n public getAllLattices(): AgentLattice[] {\n return this.getAll();\n }\n\n /**\n * 检查Lattice是否存在\n * @param key Lattice键名\n */\n public hasLattice(key: string): boolean {\n return this.has(key);\n }\n\n /**\n * 移除Lattice\n * @param key Lattice键名\n */\n public removeLattice(key: string): boolean {\n return this.remove(key);\n }\n\n /**\n * 获取Agent配置\n * @param key Lattice键名\n */\n public getAgentConfig(key: string): AgentConfig | undefined {\n return this.getAgentLattice(key)?.config;\n }\n\n /**\n * 获取所有Agent配置\n * code-configured 和 stored assistants 都已注册到 registry\n */\n public async getAllAgentConfigs(): Promise<AgentConfig[]> {\n await this.initializeStoredAssistants();\n return this.getAllLattices().map((lattice) => lattice.config);\n }\n\n /**\n * 验证Agent输入参数\n * @param key Lattice键名\n * @param input 输入参数\n */\n public validateAgentInput(key: string, input: any): boolean {\n const agentLattice = this.getAgentLattice(key);\n if (!agentLattice) {\n return false;\n }\n\n try {\n if (agentLattice.config.schema) {\n agentLattice.config.schema.parse(input);\n }\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Resolve inherited config by walking the extendsAgent chain.\n *\n * If config.extendsAgent is set, fetches the parent config, recursively\n * resolves the parent's own inheritance, then merges parent with child\n * (child's explicit fields override parent's).\n *\n * @param config - The agent config to resolve\n * @param visited - Set of visited keys to detect circular inheritance\n * @returns A fully resolved AgentConfig with inheritance applied\n */\n private resolveInheritedConfig(\n config: AgentConfig,\n visited: Set<string> = new Set()\n ): AgentConfig {\n if (!config.extendsAgent) {\n return config;\n }\n\n // Circular dependency detection\n if (visited.has(config.key)) {\n throw new Error(\n `Circular agent inheritance detected: \"${config.key}\" already visited in chain [${[...visited].join(\" -> \")}]`\n );\n }\n visited.add(config.key);\n\n const parentLattice = this.getAgentLattice(config.extendsAgent);\n if (!parentLattice) {\n throw new Error(\n `Parent agent \"${config.extendsAgent}\" not found when resolving inheritance for \"${config.key}\"`\n );\n }\n\n // Recursively resolve the parent's own inheritance first\n const resolvedParent = this.resolveInheritedConfig(\n parentLattice.config,\n visited\n );\n\n return mergeAgentConfig(resolvedParent, config);\n }\n\n /**\n * 构建Agent参数\n *\n * @param agentLattice Agent Lattice对象\n * @param options 构建选项\n * @returns 返回Agent构建参数\n */\n private buildAgentParams(\n agentLattice: AgentLattice,\n options?: GraphBuildOptions\n ): AgentBuildParams {\n // 创建参数构建器\n const paramsBuilder = new AgentParamsBuilder((key: string) => {\n this.initializeClient(key);\n return this.getAgentLattice(key);\n });\n\n // 构建参数\n return paramsBuilder.buildParams(agentLattice, options);\n }\n\n /**\n * Create an AgentClient from AgentLattice config\n *\n * @param agentLattice Agent Lattice object\n * @param options Build options\n * @returns AgentClient instance\n */\n public createAgentClientFromConfig(\n agentLattice: AgentLattice,\n options?: GraphBuildOptions\n ): AgentClient {\n // Resolve inheritance chain if extendsAgent is set\n const resolvedConfig = this.resolveInheritedConfig(agentLattice.config);\n const resolvedLattice: AgentLattice = {\n ...agentLattice,\n config: resolvedConfig,\n };\n\n // Get factory instance\n const factory = AgentGraphBuilderFactory.getInstance();\n\n // Get the builder for the resolved agent type\n const builder = factory.getBuilder(resolvedConfig.type);\n\n // Build params using the resolved config\n const params = this.buildAgentParams(resolvedLattice, options);\n\n // Use builder to build the graph\n return builder.build(resolvedLattice, params);\n }\n\n /**\n * 初始化Agent客户端\n *\n * 使用AgentGraphBuilderFactory构建Graph并设置为客户端\n *\n * @param key Lattice键名\n * @param options 构建选项\n * @returns 返回CompiledGraph对象\n */\n public initializeClient(\n key: string,\n options?: GraphBuildOptions\n ): AgentClient {\n const agentLattice = this.getAgentLattice(key);\n if (!agentLattice) {\n throw new Error(`Agent Lattice \"${key}\" 不存在`);\n }\n\n // If client already exists, return it directly\n if (agentLattice.client) {\n return agentLattice.client;\n }\n\n // Create agent client from config\n const graph = this.createAgentClientFromConfig(agentLattice, options);\n\n // Set as client\n agentLattice.client = graph;\n\n return graph;\n }\n}\n\n// 导出单例实例\nexport const agentLatticeManager = AgentLatticeManager.getInstance();\n\n// 导出便捷方法\nexport const registerAgentLattice = (config: AgentConfig) => {\n agentLatticeManager.registerLattice(config);\n};\n\nexport const registerAgentLattices = (configs: AgentConfig[]) => {\n configs.forEach((config) => {\n agentLatticeManager.registerLattice(config);\n });\n};\n\nexport const getAgentLattice = (key: string) =>\n agentLatticeManager.getAgentLattice(key);\n\nexport const getAgentConfig = (key: string) =>\n agentLatticeManager.getAgentConfig(key);\n\nexport const getAllAgentConfigs = () =>\n agentLatticeManager.getAllAgentConfigs();\n\nexport const validateAgentInput = (key: string, input: any) =>\n agentLatticeManager.validateAgentInput(key, input);\n\nexport const registerTeammateAgent = (key: string, client: AgentClient) =>\n agentLatticeManager.registerTeammateAgent(key, client);\n\nexport const unregisterTeammateAgent = (key: string) =>\n agentLatticeManager.unregisterTeammateAgent(key);\n\n/**\n * 获取或初始化Agent客户端\n *\n * @param key Agent Lattice键名\n * @param options 构建选项\n * @returns 返回CompiledGraph对象\n */\nexport const getAgentClient = (key: string, options?: GraphBuildOptions) =>\n agentLatticeManager.initializeClient(key, options);\n\nexport const createAgentClientFromAgentLattice = (\n agentLattice: AgentLattice,\n options?: GraphBuildOptions\n) => agentLatticeManager.createAgentClientFromConfig(agentLattice, options);\n","/**\n * ChunkBuffer Abstract Base Class\n *\n * Defines the interface for chunk buffer implementations\n */\n\nimport { MessageChunk } from \"@axiom-lattice/protocols\";\nimport { ThreadStatus, ThreadBuffer } from \"./types\";\n\nexport abstract class ChunkBuffer {\n /**\n * Add a chunk to a thread (creates thread if not exists)\n * Chunks are appended in order\n */\n abstract addChunk(threadId: string, content: MessageChunk): Promise<void>;\n\n /**\n * Mark thread as completed (explicit call)\n */\n abstract completeThread(threadId: string): Promise<void>;\n\n /**\n * Mark thread as aborted (explicit call)\n */\n abstract abortThread(threadId: string): Promise<void>;\n\n /**\n * Check if thread is still active\n */\n abstract isThreadActive(threadId: string): Promise<boolean>;\n\n /**\n * Get thread status (returns undefined if thread doesn't exist)\n */\n abstract getThreadStatus(threadId: string): Promise<ThreadStatus | undefined>;\n\n /**\n * Get thread buffer info including metadata\n */\n abstract getThreadBuffer(threadId: string): Promise<ThreadBuffer | undefined>;\n\n /**\n * Clear specific thread buffer\n */\n abstract clearThread(threadId: string): Promise<void>;\n\n /**\n * Get all active thread IDs\n */\n abstract getActiveThreads(): Promise<string[]>;\n\n /**\n * Get all thread IDs (regardless of status)\n */\n abstract getAllThreads(): Promise<string[]>;\n\n /**\n * Manually trigger cleanup of expired threads\n * Returns number of threads cleaned up\n */\n abstract cleanupExpiredThreads(): Promise<number>;\n\n /**\n * Extend thread TTL (reset expiration time)\n */\n abstract extendThreadTTL(\n threadId: string,\n additionalMs?: number\n ): Promise<void>;\n\n /**\n * Check if a thread exists (valid or expired)\n */\n abstract hasThread(threadId: string): Promise<boolean>;\n\n abstract getNewChunksSinceContentIterator(\n threadId: string,\n messageId: string,\n knownContent: string\n ): AsyncIterable<MessageChunk>;\n}\n","/**\n * ChunkBuffer Types\n *\n * Defines types for managing streaming chunks organized by thread\n */\n\nimport { MessageChunk } from \"@axiom-lattice/protocols\";\nimport { ReplaySubject } from \"rxjs\";\n\n/**\n * Represents a single chunk of data\n * Chunks are identified by their position in the sequence (no unique ID)\n */\nexport interface Chunk {\n messageId: string; // Message this chunk belongs to\n content: MessageChunk; // Chunk content\n}\n\n/**\n * Thread status - requires explicit state transitions\n */\nexport enum ThreadStatus {\n ACTIVE = \"active\",\n COMPLETED = \"completed\",\n ABORTED = \"aborted\",\n}\n\n/**\n * Thread buffer configuration\n */\nexport interface ThreadBufferConfig {\n ttl?: number; // Time-to-live in milliseconds (default: 1 hour)\n cleanupInterval?: number; // Optional: periodic cleanup interval in ms\n}\n\n/**\n * Thread buffer state\n */\nexport interface ThreadBuffer {\n threadId: string;\n chunks$: ReplaySubject<MessageChunk>; // Ordered list of chunks\n status: ThreadStatus;\n createdAt: number;\n updatedAt: number;\n expiresAt: number; // TTL expiration timestamp\n}\n\n/**\n * Buffer statistics\n */\nexport interface BufferStats {\n totalThreads: number;\n activeThreads: number;\n completedThreads: number;\n abortedThreads: number;\n config: Required<ThreadBufferConfig>;\n}\n","/**\n * InMemoryChunkBuffer\n *\n * In-memory implementation of ChunkBuffer with hybrid cleanup strategy:\n * - Lazy cleanup: expired threads are removed on access\n * - Optional periodic cleanup: background timer to clean expired threads\n */\n\nimport { MessageChunk } from \"@axiom-lattice/protocols\";\nimport { EventEmitter, once } from \"events\";\nimport { ChunkBuffer } from \"./ChunkBuffer\";\nimport {\n BufferStats,\n ThreadBuffer,\n ThreadBufferConfig,\n ThreadStatus,\n} from \"./types\";\nimport {\n ReplaySubject,\n Observable,\n Subscription,\n observeOn,\n asyncScheduler,\n} from \"rxjs\";\n\nexport class InMemoryChunkBuffer extends ChunkBuffer {\n private buffers: Map<string, ThreadBuffer>;\n private config: Required<ThreadBufferConfig> & { maxChunks?: number };\n private cleanupTimer?: NodeJS.Timeout;\n\n constructor(config?: ThreadBufferConfig & { maxChunks?: number }) {\n super();\n this.buffers = new Map();\n\n // Default: 1 hour TTL, no periodic cleanup (lazy only)\n this.config = {\n ttl: config?.ttl ?? 60 * 60 * 1000,\n cleanupInterval: config?.cleanupInterval ?? 0,\n maxChunks: config?.maxChunks ?? 100000, // Default max chunks per thread\n };\n\n // Start periodic cleanup only if cleanupInterval is specified\n if (this.config.cleanupInterval > 0) {\n this.startCleanupTimer();\n }\n }\n\n /**\n * Start automatic periodic cleanup timer\n */\n private startCleanupTimer(): void {\n if (this.config.cleanupInterval <= 0) return;\n\n this.cleanupTimer = setInterval(() => {\n this.cleanupExpiredThreads().catch(console.error);\n }, this.config.cleanupInterval);\n\n // Don't prevent process from exiting\n if (this.cleanupTimer.unref) {\n this.cleanupTimer.unref();\n }\n }\n\n /**\n * Stop cleanup timer (for cleanup/shutdown)\n */\n public stopCleanupTimer(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n }\n\n /**\n * Check if a buffer is expired (lazy cleanup helper)\n */\n private isExpired(buffer: ThreadBuffer): boolean {\n return buffer.expiresAt <= Date.now();\n }\n\n /**\n * Get buffer if valid, perform lazy cleanup if expired\n */\n private getBufferIfValid(threadId: string): ThreadBuffer | undefined {\n const buffer = this.buffers.get(threadId);\n\n if (buffer && this.isExpired(buffer)) {\n // Lazy cleanup: remove expired buffer on access\n this.buffers.delete(threadId);\n return undefined;\n }\n\n return buffer;\n }\n\n /**\n * Create or get thread buffer\n */\n private getOrCreateBuffer(threadId: string): ThreadBuffer {\n // First check with lazy cleanup\n let buffer = this.getBufferIfValid(threadId);\n if (!buffer) {\n const now = Date.now();\n buffer = {\n threadId,\n chunks$: new ReplaySubject<MessageChunk>(this.config.maxChunks),\n status: ThreadStatus.ACTIVE,\n createdAt: now,\n updatedAt: now,\n expiresAt: now + this.config.ttl,\n };\n this.buffers.set(threadId, buffer);\n }\n\n if (buffer.status !== ThreadStatus.ACTIVE) {\n buffer.status = ThreadStatus.ACTIVE;\n buffer.chunks$ = new ReplaySubject<MessageChunk>(this.config.maxChunks);\n buffer.updatedAt = Date.now();\n buffer.expiresAt = Date.now() + this.config.ttl;\n }\n\n return buffer;\n }\n\n async addChunk(threadId: string, content: MessageChunk): Promise<void> {\n const buffer = this.getOrCreateBuffer(threadId);\n\n const chunk: MessageChunk = content;\n buffer.chunks$.next(chunk);\n buffer.updatedAt = Date.now();\n\n // Auto-extend TTL on activity\n buffer.expiresAt = Date.now() + this.config.ttl;\n buffer.status = ThreadStatus.ACTIVE;\n\n // Notify listeners\n }\n\n async completeThread(threadId: string): Promise<void> {\n const buffer = this.getBufferIfValid(threadId);\n if (buffer) {\n buffer.status = ThreadStatus.COMPLETED;\n buffer.updatedAt = Date.now();\n buffer.chunks$.complete();\n }\n }\n\n async abortThread(threadId: string): Promise<void> {\n const buffer = this.getBufferIfValid(threadId);\n if (buffer) {\n buffer.status = ThreadStatus.ABORTED;\n buffer.updatedAt = Date.now();\n buffer.chunks$.error(new Error(\"Thread aborted\"));\n }\n }\n\n async isThreadActive(threadId: string): Promise<boolean> {\n const buffer = this.getBufferIfValid(threadId);\n return buffer?.status === ThreadStatus.ACTIVE;\n }\n\n async getThreadStatus(threadId: string): Promise<ThreadStatus | undefined> {\n return this.getBufferIfValid(threadId)?.status;\n }\n\n async getThreadBuffer(threadId: string): Promise<ThreadBuffer | undefined> {\n const buffer = this.getBufferIfValid(threadId);\n if (!buffer) return undefined;\n return buffer;\n }\n\n async clearThread(threadId: string): Promise<void> {\n this.buffers.delete(threadId);\n }\n\n async getActiveThreads(): Promise<string[]> {\n const activeThreads: string[] = [];\n\n for (const [threadId, buffer] of this.buffers.entries()) {\n // Apply lazy cleanup\n if (this.isExpired(buffer)) {\n this.buffers.delete(threadId);\n continue;\n }\n\n if (buffer.status === ThreadStatus.ACTIVE) {\n activeThreads.push(threadId);\n }\n }\n\n return activeThreads;\n }\n\n async getAllThreads(): Promise<string[]> {\n const validThreads: string[] = [];\n\n for (const [threadId, buffer] of this.buffers.entries()) {\n // Apply lazy cleanup\n if (this.isExpired(buffer)) {\n this.buffers.delete(threadId);\n } else {\n validThreads.push(threadId);\n }\n }\n\n return validThreads;\n }\n\n async hasThread(threadId: string): Promise<boolean> {\n return this.getBufferIfValid(threadId) !== undefined;\n }\n\n /**\n * Cleanup expired threads based on TTL\n * Returns number of threads cleaned up\n */\n async cleanupExpiredThreads(): Promise<number> {\n const now = Date.now();\n let cleanedCount = 0;\n\n for (const [threadId, buffer] of this.buffers.entries()) {\n if (buffer.expiresAt <= now) {\n this.buffers.delete(threadId);\n cleanedCount++;\n }\n }\n\n return cleanedCount;\n }\n\n async extendThreadTTL(\n threadId: string,\n additionalMs?: number\n ): Promise<void> {\n const buffer = this.getBufferIfValid(threadId);\n if (buffer) {\n const extension = additionalMs ?? this.config.ttl;\n buffer.expiresAt = Date.now() + extension;\n buffer.updatedAt = Date.now();\n }\n }\n\n async *getNewChunksSinceContentIterator(\n threadId: string,\n messageId: string,\n knownContent: string\n ): AsyncIterable<MessageChunk> {\n const buffer = this.getBufferIfValid(threadId);\n if (!buffer) return;\n\n let accumulatedContent = \"\";\n const queue: MessageChunk[] = [];\n let resolveNext: (() => void) | null = null;\n let errorNext: ((err: any) => void) | null = null;\n let isCompleted = false;\n let pendingError: Error | null = null; // Track errors that occur when not waiting\n\n const subscription = buffer.chunks$\n .pipe(observeOn(asyncScheduler))\n .subscribe({\n next: (chunk) => {\n queue.push(chunk);\n if (resolveNext) {\n const resolve = resolveNext;\n resolveNext = null;\n resolve();\n }\n },\n error: (err) => {\n pendingError = err; // Always store the error\n\n if (errorNext) {\n const reject = errorNext;\n errorNext = null;\n reject(err);\n } else if (resolveNext) {\n // If waiting on resolveNext, wake it up to check pendingError\n const resolve = resolveNext;\n resolveNext = null;\n resolve();\n }\n },\n complete: () => {\n isCompleted = true;\n if (resolveNext) {\n const resolve = resolveNext;\n resolveNext = null;\n resolve();\n }\n },\n });\n let startYieldChunk = false;\n\n try {\n while (true) {\n if (pendingError) {\n throw pendingError;\n }\n if (queue.length === 0) {\n if (isCompleted) break;\n await new Promise<void>((resolve, reject) => {\n resolveNext = resolve;\n errorNext = reject;\n });\n }\n // Check error again after waking up\n if (pendingError) {\n throw pendingError;\n }\n while (queue.length > 0) {\n const chunk = queue.shift();\n if (!chunk) continue;\n\n if (chunk.data?.id === messageId) {\n startYieldChunk = true;\n accumulatedContent += chunk.data?.content || \"\";\n }\n // if (accumulatedContent.length > knownContent.length) {\n // startYieldChunk = true;\n // }\n if (startYieldChunk) {\n yield chunk;\n }\n\n // if (accumulatedContent.length > knownContent.length) {\n // if (accumulatedContent.startsWith(knownContent)) {\n // yield chunk;\n // } else {\n // console.log(\n // \"accumulatedContent not starts with knownContent\",\n // accumulatedContent,\n // knownContent\n // );\n // }\n // }\n }\n }\n } finally {\n subscription.unsubscribe();\n }\n }\n\n public getStats(): BufferStats {\n let activeCount = 0;\n let completedCount = 0;\n let abortedCount = 0;\n\n const validBuffers: ThreadBuffer[] = [];\n for (const [threadId, buffer] of this.buffers.entries()) {\n if (this.isExpired(buffer)) {\n this.buffers.delete(threadId);\n } else {\n validBuffers.push(buffer);\n }\n }\n\n for (const buffer of validBuffers) {\n switch (buffer.status) {\n case ThreadStatus.ACTIVE:\n activeCount++;\n break;\n case ThreadStatus.COMPLETED:\n completedCount++;\n break;\n case ThreadStatus.ABORTED:\n abortedCount++;\n break;\n }\n }\n\n return {\n totalThreads: validBuffers.length,\n activeThreads: activeCount,\n completedThreads: completedCount,\n abortedThreads: abortedCount,\n\n config: this.config,\n };\n }\n\n public dispose(): void {\n this.stopCleanupTimer();\n this.buffers.clear();\n }\n}\n","/**\n * ChunkBufferLatticeManager\n * \n * Manages ChunkBuffer instances following the Lattice pattern\n */\n\nimport { BaseLatticeManager } from '../base/BaseLatticeManager';\nimport { ChunkBuffer } from './ChunkBuffer';\n\n/**\n * ChunkBuffer Lattice Manager\n */\nexport class ChunkBufferLatticeManager extends BaseLatticeManager<ChunkBuffer> {\n private static instance: ChunkBufferLatticeManager;\n \n /**\n * Private constructor for singleton pattern\n */\n private constructor() {\n super();\n }\n \n /**\n * Get singleton instance\n */\n public static getInstance(): ChunkBufferLatticeManager {\n if (!ChunkBufferLatticeManager.instance) {\n ChunkBufferLatticeManager.instance = new ChunkBufferLatticeManager();\n }\n return ChunkBufferLatticeManager.instance;\n }\n \n /**\n * Get Lattice type identifier\n */\n protected getLatticeType(): string {\n return 'chunk_buffer';\n }\n}\n\n// Convenience functions\nexport const getChunkBuffer = (key: string): ChunkBuffer | undefined =>\n ChunkBufferLatticeManager.getInstance().get(key);\n\nexport const registerChunkBuffer = (key: string, buffer: ChunkBuffer): void =>\n ChunkBufferLatticeManager.getInstance().register(key, buffer);\n\nexport const hasChunkBuffer = (key: string): boolean =>\n ChunkBufferLatticeManager.getInstance().has(key);\n\n","/**\n * ScheduleLatticeManager\n *\n * Schedule Lattice manager for registering and managing schedule services\n * Supports both one-time and cron-style recurring tasks\n */\n\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport {\n ScheduleLatticeProtocol,\n ScheduleConfig,\n ScheduleType,\n ScheduleClient,\n ScheduleStorage,\n ScheduledTaskDefinition,\n TaskHandler,\n ScheduleOnceOptions,\n ScheduleCronOptions,\n} from \"@axiom-lattice/protocols\";\nimport { DefaultScheduleClient } from \"./DefaultScheduleClient\";\nimport { MemoryScheduleStorage } from \"./MemoryScheduleStorage\";\n\n/**\n * Schedule Lattice interface\n */\nexport interface ScheduleLattice extends ScheduleLatticeProtocol {\n key: string;\n config: ScheduleConfig;\n client: ScheduleLatticeProtocol[\"client\"];\n}\n\n/**\n * ScheduleLatticeManager - Singleton schedule Lattice manager\n * Responsible for registering and managing various schedule service Lattices\n */\nexport class ScheduleLatticeManager extends BaseLatticeManager<ScheduleLattice> {\n private static _instance: ScheduleLatticeManager;\n\n /**\n * Get ScheduleLatticeManager singleton instance\n */\n public static getInstance(): ScheduleLatticeManager {\n if (!ScheduleLatticeManager._instance) {\n ScheduleLatticeManager._instance = new ScheduleLatticeManager();\n }\n return ScheduleLatticeManager._instance;\n }\n\n /**\n * Get Lattice type prefix\n */\n protected getLatticeType(): string {\n return \"schedules\";\n }\n\n /**\n * Register schedule Lattice\n * @param key Lattice key name\n * @param config Schedule configuration\n * @param client Optional schedule client. If not provided, will create based on config type.\n */\n public registerLattice(\n key: string,\n config: ScheduleConfig,\n client?: ScheduleClient\n ): void {\n // Create client based on schedule type if not provided\n let scheduleClient: ScheduleLatticeProtocol[\"client\"];\n\n if (client) {\n // Use provided client\n scheduleClient = client;\n // If storage is provided in config, set it on the client\n if (config.storage) {\n scheduleClient.setStorage(config.storage);\n }\n } else {\n // Create storage based on config\n let storage: ScheduleStorage;\n if (config.storage) {\n storage = config.storage;\n } else {\n // Default to memory storage\n storage = new MemoryScheduleStorage();\n }\n\n if (config.type === ScheduleType.MEMORY) {\n scheduleClient = new DefaultScheduleClient(storage);\n } else if (config.type === ScheduleType.POSTGRES) {\n // For Postgres, storage must be provided\n if (!config.storage) {\n throw new Error(\n `PostgreSQL schedule storage must be provided. Please install @axiom-lattice/pg-stores and pass the storage in config.storage.`\n );\n }\n scheduleClient = new DefaultScheduleClient(storage);\n } else {\n // Default to memory with memory storage\n scheduleClient = new DefaultScheduleClient(storage);\n }\n }\n\n // Create schedule Lattice object\n const scheduleLattice: ScheduleLattice = {\n key,\n config,\n client: scheduleClient,\n\n // Handler registration\n registerHandler: (taskType: string, handler: TaskHandler) => {\n scheduleClient.registerHandler(taskType, handler);\n },\n unregisterHandler: (taskType: string) => {\n return scheduleClient.unregisterHandler(taskType);\n },\n hasHandler: (taskType: string) => {\n return scheduleClient.hasHandler(taskType);\n },\n getHandlerTypes: () => {\n return scheduleClient.getHandlerTypes();\n },\n\n // One-time task scheduling\n scheduleOnce: async (\n taskId: string,\n taskType: string,\n payload: Record<string, any>,\n options: ScheduleOnceOptions\n ) => {\n return scheduleClient.scheduleOnce(taskId, taskType, payload, options);\n },\n\n // Cron task scheduling\n scheduleCron: async (\n taskId: string,\n taskType: string,\n payload: Record<string, any>,\n options: ScheduleCronOptions\n ) => {\n return scheduleClient.scheduleCron(taskId, taskType, payload, options);\n },\n\n // Task management\n cancel: async (taskId: string) => {\n return scheduleClient.cancel(taskId);\n },\n pause: async (taskId: string) => {\n return scheduleClient.pause(taskId);\n },\n resume: async (taskId: string) => {\n return scheduleClient.resume(taskId);\n },\n has: async (taskId: string) => {\n return scheduleClient.has(taskId);\n },\n getTask: async (\n taskId: string\n ): Promise<ScheduledTaskDefinition | null> => {\n return scheduleClient.getTask(taskId);\n },\n getRemainingTime: async (taskId: string) => {\n return scheduleClient.getRemainingTime(taskId);\n },\n getActiveTaskCount: async () => {\n return scheduleClient.getActiveTaskCount();\n },\n getActiveTaskIds: async () => {\n return scheduleClient.getActiveTaskIds();\n },\n cancelAll: async () => {\n return scheduleClient.cancelAll();\n },\n\n // Recovery\n restore: async () => {\n return scheduleClient.restore();\n },\n };\n\n // Call base class register method\n this.register(key, scheduleLattice);\n }\n\n /**\n * Get ScheduleLattice\n * @param key Lattice key name\n */\n public getScheduleLattice(key: string): ScheduleLattice {\n const scheduleLattice = this.get(key);\n if (!scheduleLattice) {\n throw new Error(`ScheduleLattice ${key} not found`);\n }\n return scheduleLattice;\n }\n\n /**\n * Get all Lattices\n */\n public getAllLattices(): ScheduleLattice[] {\n return this.getAll();\n }\n\n /**\n * Check if Lattice exists\n * @param key Lattice key name\n */\n public hasLattice(key: string): boolean {\n return this.has(key);\n }\n\n /**\n * Remove Lattice\n * @param key Lattice key name\n */\n public removeLattice(key: string): boolean {\n return this.remove(key);\n }\n\n /**\n * Clear all Lattices\n */\n public clearLattices(): void {\n this.clear();\n }\n\n /**\n * Get Lattice count\n */\n public getLatticeCount(): number {\n return this.count();\n }\n\n /**\n * Get Lattice key list\n */\n public getLatticeKeys(): string[] {\n return this.keys();\n }\n}\n\n// Export singleton instance\nexport const scheduleLatticeManager = ScheduleLatticeManager.getInstance();\n\n// Export convenience methods\nexport const registerScheduleLattice = (\n key: string,\n config: ScheduleConfig,\n client?: ScheduleClient\n) => scheduleLatticeManager.registerLattice(key, config, client);\n\nexport const getScheduleLattice = (key: string) =>\n scheduleLatticeManager.getScheduleLattice(key);\n","/**\n * DefaultScheduleClient\n *\n * Default schedule client implementation with full protocol support\n * Core scheduling engine that handles timer management, cron parsing, and task execution\n * Supports both one-time and cron-style recurring tasks\n * Storage backend is pluggable - uses MemoryScheduleStorage by default\n */\n\nimport {\n ScheduleClient,\n ScheduleStorage,\n ScheduledTaskDefinition,\n ScheduledTaskStatus,\n ScheduleExecutionType,\n TaskHandler,\n ScheduleOnceOptions,\n ScheduleCronOptions,\n} from \"@axiom-lattice/protocols\";\nimport { MemoryScheduleStorage } from \"./MemoryScheduleStorage\";\nimport { getNextCronTime, isValidCronExpression } from \"./CronParser\";\n\n/**\n * Active timer info for in-memory scheduling\n */\ninterface ActiveTimer {\n timerId: NodeJS.Timeout;\n taskId: string;\n}\n\n/**\n * Default schedule client implementation\n * Core scheduling engine with pluggable storage backend\n */\nexport class DefaultScheduleClient implements ScheduleClient {\n private static instance: DefaultScheduleClient | null = null;\n\n private handlers: Map<string, TaskHandler> = new Map();\n private timers: Map<string, ActiveTimer> = new Map();\n private storage: ScheduleStorage;\n\n constructor(storage?: ScheduleStorage) {\n this.storage = storage || new MemoryScheduleStorage();\n }\n\n /**\n * Get the singleton instance of DefaultScheduleClient\n */\n public static getInstance(storage?: ScheduleStorage): DefaultScheduleClient {\n if (!DefaultScheduleClient.instance) {\n DefaultScheduleClient.instance = new DefaultScheduleClient(storage);\n }\n return DefaultScheduleClient.instance;\n }\n\n /**\n * Reset the singleton instance (useful for testing)\n */\n public static resetInstance(): void {\n if (DefaultScheduleClient.instance) {\n DefaultScheduleClient.instance.cancelAll();\n DefaultScheduleClient.instance = null;\n }\n }\n\n // ===== Handler Registration =====\n\n registerHandler(taskType: string, handler: TaskHandler): void {\n this.handlers.set(taskType, handler);\n console.log(`[Scheduler] Handler registered for task type: ${taskType}`);\n }\n\n unregisterHandler(taskType: string): boolean {\n const result = this.handlers.delete(taskType);\n if (result) {\n console.log(\n `[Scheduler] Handler unregistered for task type: ${taskType}`\n );\n }\n return result;\n }\n\n hasHandler(taskType: string): boolean {\n return this.handlers.has(taskType);\n }\n\n getHandlerTypes(): string[] {\n return Array.from(this.handlers.keys());\n }\n\n // ===== One-time Task Scheduling =====\n\n async scheduleOnce(\n taskId: string,\n taskType: string,\n payload: Record<string, any>,\n options: ScheduleOnceOptions\n ): Promise<boolean> {\n // Validate handler exists\n if (!this.handlers.has(taskType)) {\n console.error(\n `[Scheduler] No handler registered for task type: ${taskType}`\n );\n return false;\n }\n\n // Calculate execute time\n let executeAt: number;\n if (options.executeAt !== undefined) {\n executeAt = options.executeAt;\n } else if (options.delayMs !== undefined) {\n executeAt = Date.now() + options.delayMs;\n } else {\n console.error(\"[Scheduler] Either executeAt or delayMs must be provided\");\n return false;\n }\n\n // Cancel existing task with same ID\n if (await this.has(taskId)) {\n await this.cancel(taskId);\n }\n\n const now = Date.now();\n const task: ScheduledTaskDefinition = {\n taskId,\n taskType,\n payload,\n assistantId: options.assistantId,\n threadId: options.threadId,\n executionType: ScheduleExecutionType.ONCE,\n executeAt,\n delayMs: options.delayMs,\n status: ScheduledTaskStatus.PENDING,\n runCount: 0,\n retryCount: 0,\n maxRetries: options.maxRetries ?? 0,\n createdAt: now,\n updatedAt: now,\n metadata: options.metadata,\n };\n\n // Save to storage\n await this.storage.save(task);\n\n // Schedule timer\n this.scheduleTimer(task);\n\n console.log(\n `[Scheduler] One-time task scheduled: ${taskId}, executes at ${new Date(\n executeAt\n ).toISOString()}`\n );\n return true;\n }\n\n // ===== Cron Task Scheduling =====\n\n async scheduleCron(\n taskId: string,\n taskType: string,\n payload: Record<string, any>,\n options: ScheduleCronOptions\n ): Promise<boolean> {\n // Validate handler exists\n if (!this.handlers.has(taskType)) {\n console.error(\n `[Scheduler] No handler registered for task type: ${taskType}`\n );\n return false;\n }\n\n // Validate cron expression\n if (!isValidCronExpression(options.cronExpression)) {\n console.error(\n `[Scheduler] Invalid cron expression: ${options.cronExpression}`\n );\n return false;\n }\n\n // Cancel existing task with same ID\n if (await this.has(taskId)) {\n await this.cancel(taskId);\n }\n\n const now = Date.now();\n const nextRunAt = getNextCronTime(options.cronExpression, new Date(now));\n\n const task: ScheduledTaskDefinition = {\n taskId,\n taskType,\n payload,\n assistantId: options.assistantId,\n threadId: options.threadId,\n executionType: ScheduleExecutionType.CRON,\n cronExpression: options.cronExpression,\n timezone: options.timezone,\n nextRunAt: nextRunAt.getTime(),\n status: ScheduledTaskStatus.PENDING,\n runCount: 0,\n maxRuns: options.maxRuns,\n retryCount: 0,\n maxRetries: options.maxRetries ?? 0,\n createdAt: now,\n updatedAt: now,\n expiresAt: options.expiresAt,\n metadata: options.metadata,\n };\n\n // Save to storage\n await this.storage.save(task);\n\n // Schedule timer\n this.scheduleTimer(task);\n\n console.log(\n `[Scheduler] Cron task scheduled: ${taskId}, expression: ${\n options.cronExpression\n }, next run: ${nextRunAt.toISOString()}`\n );\n return true;\n }\n\n // ===== Task Management =====\n\n async cancel(taskId: string): Promise<boolean> {\n // Clear timer\n const timer = this.timers.get(taskId);\n if (timer) {\n clearTimeout(timer.timerId);\n this.timers.delete(taskId);\n }\n\n // Update storage\n const task = await this.storage.get(taskId);\n if (task) {\n await this.storage.update(taskId, {\n status: ScheduledTaskStatus.CANCELLED,\n });\n console.log(`[Scheduler] Task cancelled: ${taskId}`);\n return true;\n }\n\n return false;\n }\n\n async pause(taskId: string): Promise<boolean> {\n const task = await this.storage.get(taskId);\n if (!task || task.executionType !== ScheduleExecutionType.CRON) {\n console.error(`[Scheduler] Can only pause CRON tasks: ${taskId}`);\n return false;\n }\n\n if (task.status !== ScheduledTaskStatus.PENDING) {\n console.error(`[Scheduler] Can only pause PENDING tasks: ${taskId}`);\n return false;\n }\n\n // Clear timer\n const timer = this.timers.get(taskId);\n if (timer) {\n clearTimeout(timer.timerId);\n this.timers.delete(taskId);\n }\n\n await this.storage.update(taskId, {\n status: ScheduledTaskStatus.PAUSED,\n });\n\n console.log(`[Scheduler] Task paused: ${taskId}`);\n return true;\n }\n\n async resume(taskId: string): Promise<boolean> {\n const task = await this.storage.get(taskId);\n if (!task || task.executionType !== ScheduleExecutionType.CRON) {\n console.error(`[Scheduler] Can only resume CRON tasks: ${taskId}`);\n return false;\n }\n\n if (task.status !== ScheduledTaskStatus.PAUSED) {\n console.error(`[Scheduler] Can only resume PAUSED tasks: ${taskId}`);\n return false;\n }\n\n // Calculate next run time\n const nextRunAt = getNextCronTime(task.cronExpression!);\n\n await this.storage.update(taskId, {\n status: ScheduledTaskStatus.PENDING,\n nextRunAt: nextRunAt.getTime(),\n });\n\n // Re-fetch updated task and schedule\n const updatedTask = await this.storage.get(taskId);\n if (updatedTask) {\n this.scheduleTimer(updatedTask);\n }\n\n console.log(`[Scheduler] Task resumed: ${taskId}`);\n return true;\n }\n\n async has(taskId: string): Promise<boolean> {\n const task = await this.storage.get(taskId);\n return task !== null;\n }\n\n async getTask(taskId: string): Promise<ScheduledTaskDefinition | null> {\n return this.storage.get(taskId);\n }\n\n async getRemainingTime(taskId: string): Promise<number> {\n const task = await this.storage.get(taskId);\n if (!task) {\n return -1;\n }\n\n const targetTime =\n task.executionType === ScheduleExecutionType.CRON\n ? task.nextRunAt\n : task.executeAt;\n\n if (targetTime === undefined) {\n return -1;\n }\n\n return Math.max(0, targetTime - Date.now());\n }\n\n async getActiveTaskCount(): Promise<number> {\n const tasks = await this.storage.getActiveTasks();\n return tasks.length;\n }\n\n async getActiveTaskIds(): Promise<string[]> {\n const tasks = await this.storage.getActiveTasks();\n return tasks.map((t) => t.taskId);\n }\n\n async cancelAll(): Promise<void> {\n // Clear all timers\n for (const timer of this.timers.values()) {\n clearTimeout(timer.timerId);\n }\n this.timers.clear();\n\n // Update all active tasks to cancelled\n const activeTasks = await this.storage.getActiveTasks();\n for (const task of activeTasks) {\n await this.storage.update(task.taskId, {\n status: ScheduledTaskStatus.CANCELLED,\n });\n }\n\n console.log(`[Scheduler] All tasks cancelled`);\n }\n\n // ===== Recovery =====\n\n async restore(): Promise<number> {\n const activeTasks = await this.storage.getActiveTasks();\n let restored = 0;\n\n for (const task of activeTasks) {\n // Skip if no handler registered\n if (!this.handlers.has(task.taskType)) {\n console.warn(\n `[Scheduler] No handler for task type ${task.taskType}, skipping restore for task ${task.taskId}`\n );\n continue;\n }\n\n // Skip paused tasks (they'll be resumed manually)\n if (task.status === ScheduledTaskStatus.PAUSED) {\n continue;\n }\n\n if (task.executionType === ScheduleExecutionType.ONCE) {\n // For one-time tasks, check if execution time has passed\n if (task.executeAt && task.executeAt <= Date.now()) {\n // Execute immediately\n console.log(\n `[Scheduler] Executing overdue one-time task: ${task.taskId}`\n );\n this.executeTask(task);\n } else {\n // Schedule for remaining time\n this.scheduleTimer(task);\n }\n } else if (task.executionType === ScheduleExecutionType.CRON) {\n // For cron tasks, calculate next run time\n const nextRunAt = getNextCronTime(task.cronExpression!);\n await this.storage.update(task.taskId, {\n nextRunAt: nextRunAt.getTime(),\n });\n\n const updatedTask = await this.storage.get(task.taskId);\n if (updatedTask) {\n this.scheduleTimer(updatedTask);\n }\n }\n\n restored++;\n }\n\n console.log(`[Scheduler] Restored ${restored} tasks`);\n return restored;\n }\n\n // ===== Storage =====\n\n setStorage(storage: ScheduleStorage): void {\n this.storage = storage;\n }\n\n getStorage(): ScheduleStorage | null {\n return this.storage;\n }\n\n // ===== Private Methods =====\n\n private scheduleTimer(task: ScheduledTaskDefinition): void {\n const targetTime =\n task.executionType === ScheduleExecutionType.CRON\n ? task.nextRunAt\n : task.executeAt;\n\n if (targetTime === undefined) {\n console.error(`[Scheduler] No execution time for task: ${task.taskId}`);\n return;\n }\n\n const delay = Math.max(0, targetTime - Date.now());\n\n const timerId = setTimeout(() => {\n this.executeTask(task);\n }, delay);\n\n this.timers.set(task.taskId, {\n timerId,\n taskId: task.taskId,\n });\n }\n\n private async executeTask(task: ScheduledTaskDefinition): Promise<void> {\n const handler = this.handlers.get(task.taskType);\n if (!handler) {\n console.error(\n `[Scheduler] No handler for task type: ${task.taskType}, task: ${task.taskId}`\n );\n await this.storage.update(task.taskId, {\n status: ScheduledTaskStatus.FAILED,\n lastError: `No handler registered for task type: ${task.taskType}`,\n });\n return;\n }\n\n // Update status to running\n await this.storage.update(task.taskId, {\n status: ScheduledTaskStatus.RUNNING,\n });\n\n console.log(`[Scheduler] Executing task: ${task.taskId}`);\n\n try {\n // Get latest task state\n const latestTask = await this.storage.get(task.taskId);\n if (!latestTask) {\n console.error(`[Scheduler] Task not found: ${task.taskId}`);\n return;\n }\n\n await handler(latestTask.payload, latestTask);\n\n const newRunCount = latestTask.runCount + 1;\n console.log(`[Scheduler] Task completed: ${task.taskId}`);\n\n // Handle completion based on execution type\n if (task.executionType === ScheduleExecutionType.ONCE) {\n await this.storage.update(task.taskId, {\n status: ScheduledTaskStatus.COMPLETED,\n runCount: newRunCount,\n lastRunAt: Date.now(),\n });\n this.timers.delete(task.taskId);\n } else if (task.executionType === ScheduleExecutionType.CRON) {\n // Check if max runs reached\n if (task.maxRuns !== undefined && newRunCount >= task.maxRuns) {\n await this.storage.update(task.taskId, {\n status: ScheduledTaskStatus.COMPLETED,\n runCount: newRunCount,\n lastRunAt: Date.now(),\n });\n this.timers.delete(task.taskId);\n console.log(\n `[Scheduler] Cron task completed (max runs): ${task.taskId}`\n );\n return;\n }\n\n // Check if expired\n if (task.expiresAt !== undefined && Date.now() >= task.expiresAt) {\n await this.storage.update(task.taskId, {\n status: ScheduledTaskStatus.COMPLETED,\n runCount: newRunCount,\n lastRunAt: Date.now(),\n });\n this.timers.delete(task.taskId);\n console.log(\n `[Scheduler] Cron task completed (expired): ${task.taskId}`\n );\n return;\n }\n\n // Schedule next run\n const nextRunAt = getNextCronTime(task.cronExpression!);\n await this.storage.update(task.taskId, {\n status: ScheduledTaskStatus.PENDING,\n runCount: newRunCount,\n lastRunAt: Date.now(),\n nextRunAt: nextRunAt.getTime(),\n retryCount: 0, // Reset retry count on success\n });\n\n const updatedTask = await this.storage.get(task.taskId);\n if (updatedTask) {\n this.scheduleTimer(updatedTask);\n console.log(\n `[Scheduler] Next cron run scheduled: ${\n task.taskId\n } at ${nextRunAt.toISOString()}`\n );\n }\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n console.error(`[Scheduler] Task failed: ${task.taskId}`, error);\n\n const latestTask = await this.storage.get(task.taskId);\n if (!latestTask) return;\n\n const newRetryCount = latestTask.retryCount + 1;\n\n // Check if can retry\n if (newRetryCount <= latestTask.maxRetries) {\n console.log(\n `[Scheduler] Retrying task: ${task.taskId} (attempt ${newRetryCount}/${latestTask.maxRetries})`\n );\n\n await this.storage.update(task.taskId, {\n status: ScheduledTaskStatus.PENDING,\n retryCount: newRetryCount,\n lastError: errorMessage,\n });\n\n // Retry with exponential backoff\n const retryDelay = Math.min(\n 1000 * Math.pow(2, newRetryCount - 1),\n 60000\n );\n const retryTask = await this.storage.get(task.taskId);\n if (retryTask) {\n if (task.executionType === ScheduleExecutionType.ONCE) {\n retryTask.executeAt = Date.now() + retryDelay;\n } else {\n retryTask.nextRunAt = Date.now() + retryDelay;\n }\n await this.storage.update(task.taskId, {\n executeAt: retryTask.executeAt,\n nextRunAt: retryTask.nextRunAt,\n });\n this.scheduleTimer(retryTask);\n }\n } else {\n // Max retries exceeded\n await this.storage.update(task.taskId, {\n status: ScheduledTaskStatus.FAILED,\n retryCount: newRetryCount,\n lastError: errorMessage,\n });\n this.timers.delete(task.taskId);\n console.error(\n `[Scheduler] Task failed permanently: ${task.taskId} (max retries exceeded)`\n );\n }\n }\n }\n}\n","/**\n * MemoryScheduleStorage\n *\n * In-memory storage implementation for scheduled tasks\n * Useful for development and testing, not recommended for production\n * Data is lost on service restart\n */\n\nimport {\n ScheduleStorage,\n ScheduledTaskDefinition,\n ScheduledTaskStatus,\n ScheduleExecutionType,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * In-memory storage for scheduled tasks\n */\nexport class MemoryScheduleStorage implements ScheduleStorage {\n private tasks: Map<string, ScheduledTaskDefinition> = new Map();\n\n /**\n * Save a new task\n */\n async save(task: ScheduledTaskDefinition): Promise<void> {\n this.tasks.set(task.taskId, { ...task });\n }\n\n /**\n * Get task by ID\n */\n async get(taskId: string): Promise<ScheduledTaskDefinition | null> {\n const task = this.tasks.get(taskId);\n return task ? { ...task } : null;\n }\n\n /**\n * Update task\n */\n async update(\n taskId: string,\n updates: Partial<ScheduledTaskDefinition>\n ): Promise<void> {\n const task = this.tasks.get(taskId);\n if (task) {\n this.tasks.set(taskId, {\n ...task,\n ...updates,\n updatedAt: Date.now(),\n });\n }\n }\n\n /**\n * Delete task\n */\n async delete(taskId: string): Promise<void> {\n this.tasks.delete(taskId);\n }\n\n /**\n * Get all active tasks (pending or paused)\n */\n async getActiveTasks(): Promise<ScheduledTaskDefinition[]> {\n const result: ScheduledTaskDefinition[] = [];\n for (const task of this.tasks.values()) {\n if (\n task.status === ScheduledTaskStatus.PENDING ||\n task.status === ScheduledTaskStatus.PAUSED\n ) {\n result.push({ ...task });\n }\n }\n return result;\n }\n\n /**\n * Get tasks by type\n */\n async getTasksByType(taskType: string): Promise<ScheduledTaskDefinition[]> {\n const result: ScheduledTaskDefinition[] = [];\n for (const task of this.tasks.values()) {\n if (task.taskType === taskType) {\n result.push({ ...task });\n }\n }\n return result;\n }\n\n /**\n * Get tasks by status\n */\n async getTasksByStatus(\n status: ScheduledTaskStatus\n ): Promise<ScheduledTaskDefinition[]> {\n const result: ScheduledTaskDefinition[] = [];\n for (const task of this.tasks.values()) {\n if (task.status === status) {\n result.push({ ...task });\n }\n }\n return result;\n }\n\n /**\n * Get tasks by execution type\n */\n async getTasksByExecutionType(\n executionType: ScheduleExecutionType\n ): Promise<ScheduledTaskDefinition[]> {\n const result: ScheduledTaskDefinition[] = [];\n for (const task of this.tasks.values()) {\n if (task.executionType === executionType) {\n result.push({ ...task });\n }\n }\n return result;\n }\n\n /**\n * Get tasks by assistant ID\n */\n async getTasksByAssistantId(\n assistantId: string\n ): Promise<ScheduledTaskDefinition[]> {\n const result: ScheduledTaskDefinition[] = [];\n for (const task of this.tasks.values()) {\n if (task.assistantId === assistantId) {\n result.push({ ...task });\n }\n }\n return result;\n }\n\n /**\n * Get tasks by thread ID\n */\n async getTasksByThreadId(\n threadId: string\n ): Promise<ScheduledTaskDefinition[]> {\n const result: ScheduledTaskDefinition[] = [];\n for (const task of this.tasks.values()) {\n if (task.threadId === threadId) {\n result.push({ ...task });\n }\n }\n return result;\n }\n\n /**\n * Get all tasks with optional filters\n */\n async getAllTasks(filters?: {\n status?: ScheduledTaskStatus;\n executionType?: ScheduleExecutionType;\n taskType?: string;\n assistantId?: string;\n threadId?: string;\n limit?: number;\n offset?: number;\n }): Promise<ScheduledTaskDefinition[]> {\n let result: ScheduledTaskDefinition[] = [];\n\n for (const task of this.tasks.values()) {\n let match = true;\n\n if (filters?.status !== undefined && task.status !== filters.status) {\n match = false;\n }\n if (\n filters?.executionType !== undefined &&\n task.executionType !== filters.executionType\n ) {\n match = false;\n }\n if (\n filters?.taskType !== undefined &&\n task.taskType !== filters.taskType\n ) {\n match = false;\n }\n if (\n filters?.assistantId !== undefined &&\n task.assistantId !== filters.assistantId\n ) {\n match = false;\n }\n if (\n filters?.threadId !== undefined &&\n task.threadId !== filters.threadId\n ) {\n match = false;\n }\n\n if (match) {\n result.push({ ...task });\n }\n }\n\n // Sort by createdAt descending\n result.sort((a, b) => b.createdAt - a.createdAt);\n\n // Apply offset and limit\n const offset = filters?.offset || 0;\n const limit = filters?.limit;\n\n if (limit !== undefined) {\n result = result.slice(offset, offset + limit);\n } else if (offset > 0) {\n result = result.slice(offset);\n }\n\n return result;\n }\n\n /**\n * Count tasks with optional filters\n */\n async countTasks(filters?: {\n status?: ScheduledTaskStatus;\n executionType?: ScheduleExecutionType;\n taskType?: string;\n assistantId?: string;\n threadId?: string;\n }): Promise<number> {\n let count = 0;\n\n for (const task of this.tasks.values()) {\n let match = true;\n\n if (filters?.status !== undefined && task.status !== filters.status) {\n match = false;\n }\n if (\n filters?.executionType !== undefined &&\n task.executionType !== filters.executionType\n ) {\n match = false;\n }\n if (\n filters?.taskType !== undefined &&\n task.taskType !== filters.taskType\n ) {\n match = false;\n }\n if (\n filters?.assistantId !== undefined &&\n task.assistantId !== filters.assistantId\n ) {\n match = false;\n }\n if (\n filters?.threadId !== undefined &&\n task.threadId !== filters.threadId\n ) {\n match = false;\n }\n\n if (match) {\n count++;\n }\n }\n\n return count;\n }\n\n /**\n * Delete completed/cancelled tasks older than specified time\n */\n async deleteOldTasks(olderThanMs: number): Promise<number> {\n const cutoff = Date.now() - olderThanMs;\n let deleted = 0;\n\n for (const [taskId, task] of this.tasks.entries()) {\n if (\n (task.status === ScheduledTaskStatus.COMPLETED ||\n task.status === ScheduledTaskStatus.CANCELLED ||\n task.status === ScheduledTaskStatus.FAILED) &&\n task.updatedAt < cutoff\n ) {\n this.tasks.delete(taskId);\n deleted++;\n }\n }\n\n return deleted;\n }\n\n /**\n * Clear all tasks (useful for testing)\n */\n clear(): void {\n this.tasks.clear();\n }\n\n /**\n * Get total task count (useful for debugging)\n */\n size(): number {\n return this.tasks.size;\n }\n}\n","/**\n * CronParser\n *\n * Simple cron expression parser for calculating next execution time\n * Supports standard 5-field cron format: minute hour day-of-month month day-of-week\n *\n * Field values:\n * minute: 0-59\n * hour: 0-23\n * day-of-month: 1-31\n * month: 1-12\n * day-of-week: 0-7 (0 and 7 are Sunday)\n *\n * Special characters:\n * asterisk (*) : any value\n * comma (,) : value list separator (1,3,5)\n * dash (-) : range of values (1-5)\n * slash (/) : step values (asterisk/5 = every 5)\n */\n\nexport interface CronFields {\n minute: number[];\n hour: number[];\n dayOfMonth: number[];\n month: number[];\n dayOfWeek: number[];\n}\n\n/**\n * Parse a cron expression into field arrays\n */\nexport function parseCronExpression(expression: string): CronFields {\n const parts = expression.trim().split(/\\s+/);\n\n if (parts.length !== 5) {\n throw new Error(\n `Invalid cron expression: expected 5 fields, got ${parts.length}`\n );\n }\n\n return {\n minute: parseField(parts[0], 0, 59),\n hour: parseField(parts[1], 0, 23),\n dayOfMonth: parseField(parts[2], 1, 31),\n month: parseField(parts[3], 1, 12),\n dayOfWeek: parseField(parts[4], 0, 7).map((d) => (d === 7 ? 0 : d)), // Normalize Sunday\n };\n}\n\n/**\n * Parse a single cron field\n */\nfunction parseField(field: string, min: number, max: number): number[] {\n const values = new Set<number>();\n\n // Handle comma-separated values\n const segments = field.split(\",\");\n\n for (const segment of segments) {\n // Handle step values (*/5 or 1-10/2)\n const [range, stepStr] = segment.split(\"/\");\n const step = stepStr ? parseInt(stepStr, 10) : 1;\n\n if (isNaN(step) || step < 1) {\n throw new Error(`Invalid step value: ${stepStr}`);\n }\n\n let rangeStart: number;\n let rangeEnd: number;\n\n if (range === \"*\") {\n rangeStart = min;\n rangeEnd = max;\n } else if (range.includes(\"-\")) {\n // Handle range (1-5)\n const [startStr, endStr] = range.split(\"-\");\n rangeStart = parseInt(startStr, 10);\n rangeEnd = parseInt(endStr, 10);\n\n if (isNaN(rangeStart) || isNaN(rangeEnd)) {\n throw new Error(`Invalid range: ${range}`);\n }\n } else {\n // Single value\n const value = parseInt(range, 10);\n if (isNaN(value)) {\n throw new Error(`Invalid value: ${range}`);\n }\n rangeStart = value;\n rangeEnd = value;\n }\n\n // Validate range\n if (rangeStart < min || rangeEnd > max || rangeStart > rangeEnd) {\n throw new Error(`Value out of range: ${range} (expected ${min}-${max})`);\n }\n\n // Add values with step\n for (let i = rangeStart; i <= rangeEnd; i += step) {\n values.add(i);\n }\n }\n\n return Array.from(values).sort((a, b) => a - b);\n}\n\n/**\n * Get the next execution time after the given date\n */\nexport function getNextCronTime(\n expression: string,\n after: Date = new Date(),\n timezone?: string\n): Date {\n const fields = parseCronExpression(expression);\n\n // Start from the next minute\n const next = new Date(after.getTime());\n next.setSeconds(0, 0);\n next.setMinutes(next.getMinutes() + 1);\n\n // Maximum iterations to prevent infinite loop\n const maxIterations = 366 * 24 * 60; // 1 year in minutes\n let iterations = 0;\n\n while (iterations < maxIterations) {\n iterations++;\n\n // Check month\n const month = next.getMonth() + 1; // JS months are 0-based\n if (!fields.month.includes(month)) {\n // Move to next valid month\n const nextMonth = fields.month.find((m) => m > month);\n if (nextMonth !== undefined) {\n next.setMonth(nextMonth - 1, 1);\n } else {\n // Next year, first valid month\n next.setFullYear(next.getFullYear() + 1);\n next.setMonth(fields.month[0] - 1, 1);\n }\n next.setHours(fields.hour[0], fields.minute[0], 0, 0);\n continue;\n }\n\n // Check day of month\n const dayOfMonth = next.getDate();\n const maxDayOfMonth = new Date(\n next.getFullYear(),\n next.getMonth() + 1,\n 0\n ).getDate();\n\n // Check day of week\n const dayOfWeek = next.getDay();\n\n // Both dayOfMonth and dayOfWeek must match if not wildcard\n const dayOfMonthMatch = fields.dayOfMonth.includes(dayOfMonth);\n const dayOfWeekMatch = fields.dayOfWeek.includes(dayOfWeek);\n\n // If either field is not *, both must match; if one is *, only the other needs to match\n const dayOfMonthWildcard =\n fields.dayOfMonth.length === 31 &&\n fields.dayOfMonth[0] === 1 &&\n fields.dayOfMonth[30] === 31;\n const dayOfWeekWildcard =\n fields.dayOfWeek.length >= 7 ||\n (fields.dayOfWeek.length === 1 && fields.dayOfWeek.includes(0));\n\n let dayMatch: boolean;\n if (dayOfMonthWildcard && dayOfWeekWildcard) {\n dayMatch = true;\n } else if (dayOfMonthWildcard) {\n dayMatch = dayOfWeekMatch;\n } else if (dayOfWeekWildcard) {\n dayMatch = dayOfMonthMatch;\n } else {\n // Standard cron behavior: OR between dayOfMonth and dayOfWeek when both are specified\n dayMatch = dayOfMonthMatch || dayOfWeekMatch;\n }\n\n if (!dayMatch || dayOfMonth > maxDayOfMonth) {\n // Move to next day\n next.setDate(next.getDate() + 1);\n next.setHours(fields.hour[0], fields.minute[0], 0, 0);\n continue;\n }\n\n // Check hour\n const hour = next.getHours();\n if (!fields.hour.includes(hour)) {\n const nextHour = fields.hour.find((h) => h > hour);\n if (nextHour !== undefined) {\n next.setHours(nextHour, fields.minute[0], 0, 0);\n } else {\n // Next day, first valid hour\n next.setDate(next.getDate() + 1);\n next.setHours(fields.hour[0], fields.minute[0], 0, 0);\n }\n continue;\n }\n\n // Check minute\n const minute = next.getMinutes();\n if (!fields.minute.includes(minute)) {\n const nextMinute = fields.minute.find((m) => m > minute);\n if (nextMinute !== undefined) {\n next.setMinutes(nextMinute, 0, 0);\n } else {\n // Next hour\n next.setHours(next.getHours() + 1, fields.minute[0], 0, 0);\n }\n continue;\n }\n\n // All fields match!\n return next;\n }\n\n throw new Error(\"Could not find next cron time within 1 year\");\n}\n\n/**\n * Validate a cron expression\n */\nexport function isValidCronExpression(expression: string): boolean {\n try {\n parseCronExpression(expression);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get a human-readable description of a cron expression\n */\nexport function describeCronExpression(expression: string): string {\n const fields = parseCronExpression(expression);\n\n const parts: string[] = [];\n\n // Minute\n if (fields.minute.length === 60) {\n parts.push(\"every minute\");\n } else if (fields.minute.length === 1) {\n parts.push(`at minute ${fields.minute[0]}`);\n } else {\n parts.push(`at minutes ${fields.minute.join(\", \")}`);\n }\n\n // Hour\n if (fields.hour.length === 24) {\n parts.push(\"of every hour\");\n } else if (fields.hour.length === 1) {\n parts.push(`of hour ${fields.hour[0]}`);\n } else {\n parts.push(`of hours ${fields.hour.join(\", \")}`);\n }\n\n // Day of month\n if (fields.dayOfMonth.length < 31) {\n if (fields.dayOfMonth.length === 1) {\n parts.push(`on day ${fields.dayOfMonth[0]}`);\n } else {\n parts.push(`on days ${fields.dayOfMonth.join(\", \")}`);\n }\n }\n\n // Month\n const monthNames = [\n \"\",\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ];\n if (fields.month.length < 12) {\n const months = fields.month.map((m) => monthNames[m]);\n parts.push(`in ${months.join(\", \")}`);\n }\n\n // Day of week\n const dayNames = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n const uniqueDays = [...new Set(fields.dayOfWeek)];\n if (uniqueDays.length < 7) {\n const days = uniqueDays.map((d) => dayNames[d]);\n parts.push(`on ${days.join(\", \")}`);\n }\n\n return parts.join(\" \");\n}\n","import { Embeddings } from \"@langchain/core/embeddings\";\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\n\n/**\n * Embeddings Lattice Interface\n * Defines the structure of an embeddings lattice entry\n */\nexport interface EmbeddingsLatticeInterface {\n key: string;\n client: Embeddings;\n}\n\n/**\n * EmbeddingsLatticeManager - Singleton embeddings Lattice manager\n * Responsible for registering and managing various embeddings model Lattices\n */\nexport class EmbeddingsLatticeManager extends BaseLatticeManager<EmbeddingsLatticeInterface> {\n private static _instance: EmbeddingsLatticeManager;\n\n /**\n * Get EmbeddingsLatticeManager singleton instance\n */\n public static getInstance(): EmbeddingsLatticeManager {\n if (!EmbeddingsLatticeManager._instance) {\n EmbeddingsLatticeManager._instance = new EmbeddingsLatticeManager();\n }\n return EmbeddingsLatticeManager._instance;\n }\n\n /**\n * Get Lattice type prefix\n */\n protected getLatticeType(): string {\n return \"embeddings\";\n }\n\n /**\n * Register embeddings Lattice\n * @param key Lattice key name\n * @param embeddings Embeddings instance\n */\n public registerLattice(key: string, embeddings: Embeddings): void {\n // Create embeddings Lattice object\n const embeddingsLattice: EmbeddingsLatticeInterface = {\n key,\n client: embeddings,\n };\n\n // Call base class register method\n this.register(key, embeddingsLattice);\n }\n\n /**\n * Get EmbeddingsLattice\n * @param key Lattice key name\n */\n public getEmbeddingsLattice(key: string): EmbeddingsLatticeInterface {\n const embeddingsLattice = this.get(key);\n if (!embeddingsLattice) {\n throw new Error(`EmbeddingsLattice ${key} not found`);\n }\n return embeddingsLattice;\n }\n\n /**\n * Get all Lattices\n */\n public getAllLattices(): EmbeddingsLatticeInterface[] {\n return this.getAll();\n }\n\n /**\n * Check if Lattice exists\n * @param key Lattice key name\n */\n public hasLattice(key: string): boolean {\n return this.has(key);\n }\n\n /**\n * Remove Lattice\n * @param key Lattice key name\n */\n public removeLattice(key: string): boolean {\n return this.remove(key);\n }\n\n /**\n * Clear all Lattices\n */\n public clearLattices(): void {\n this.clear();\n }\n\n /**\n * Get Lattice count\n */\n public getLatticeCount(): number {\n return this.count();\n }\n\n /**\n * Get Lattice key list\n */\n public getLatticeKeys(): string[] {\n return this.keys();\n }\n\n /**\n * Get embeddings client\n * @param key Lattice key name\n */\n public getEmbeddingsClient(key: string): Embeddings {\n const embeddingsLattice = this.getEmbeddingsLattice(key);\n return embeddingsLattice.client;\n }\n}\n\n// Export singleton instance\nexport const embeddingsLatticeManager = EmbeddingsLatticeManager.getInstance();\n\n// Export convenience methods\nexport const registerEmbeddingsLattice = (\n key: string,\n embeddings: Embeddings\n) => embeddingsLatticeManager.registerLattice(key, embeddings);\n\nexport const getEmbeddingsLattice = (key: string) =>\n embeddingsLatticeManager.getEmbeddingsLattice(key);\n\nexport const getEmbeddingsClient = (key: string) =>\n embeddingsLatticeManager.getEmbeddingsClient(key);\n","import { VectorStore } from \"@langchain/core/vectorstores\";\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\n\n/**\n * VectorStore Lattice Interface\n * Defines the structure of a vector store lattice entry\n */\nexport interface VectorStoreLatticeInterface {\n key: string;\n client: VectorStore;\n}\n\n/**\n * VectorStoreLatticeManager - Singleton vector store Lattice manager\n * Responsible for registering and managing various vector store Lattices\n */\nexport class VectorStoreLatticeManager extends BaseLatticeManager<VectorStoreLatticeInterface> {\n private static _instance: VectorStoreLatticeManager;\n\n /**\n * Get VectorStoreLatticeManager singleton instance\n */\n public static getInstance(): VectorStoreLatticeManager {\n if (!VectorStoreLatticeManager._instance) {\n VectorStoreLatticeManager._instance = new VectorStoreLatticeManager();\n }\n return VectorStoreLatticeManager._instance;\n }\n\n /**\n * Get Lattice type prefix\n */\n protected getLatticeType(): string {\n return \"vectorstores\";\n }\n\n /**\n * Register vector store Lattice\n * @param key Lattice key name\n * @param vectorStore VectorStore instance\n */\n public registerLattice(key: string, vectorStore: VectorStore): void {\n // Create vector store Lattice object\n const vectorStoreLattice: VectorStoreLatticeInterface = {\n key,\n client: vectorStore,\n };\n\n // Call base class register method\n this.register(key, vectorStoreLattice);\n }\n\n /**\n * Get VectorStoreLattice\n * @param key Lattice key name\n */\n public getVectorStoreLattice(key: string): VectorStoreLatticeInterface {\n const vectorStoreLattice = this.get(key);\n if (!vectorStoreLattice) {\n throw new Error(`VectorStoreLattice ${key} not found`);\n }\n return vectorStoreLattice;\n }\n\n /**\n * Get all Lattices\n */\n public getAllLattices(): VectorStoreLatticeInterface[] {\n return this.getAll();\n }\n\n /**\n * Check if Lattice exists\n * @param key Lattice key name\n */\n public hasLattice(key: string): boolean {\n return this.has(key);\n }\n\n /**\n * Remove Lattice\n * @param key Lattice key name\n */\n public removeLattice(key: string): boolean {\n return this.remove(key);\n }\n\n /**\n * Clear all Lattices\n */\n public clearLattices(): void {\n this.clear();\n }\n\n /**\n * Get Lattice count\n */\n public getLatticeCount(): number {\n return this.count();\n }\n\n /**\n * Get Lattice key list\n */\n public getLatticeKeys(): string[] {\n return this.keys();\n }\n\n /**\n * Get vector store client\n * @param key Lattice key name\n */\n public getVectorStoreClient(key: string): VectorStore {\n const vectorStoreLattice = this.getVectorStoreLattice(key);\n return vectorStoreLattice.client;\n }\n}\n\n// Export singleton instance\nexport const vectorStoreLatticeManager = VectorStoreLatticeManager.getInstance();\n\n// Export convenience methods\nexport const registerVectorStoreLattice = (key: string, vectorStore: VectorStore) =>\n vectorStoreLatticeManager.registerLattice(key, vectorStore);\n\nexport const getVectorStoreLattice = (key: string) =>\n vectorStoreLatticeManager.getVectorStoreLattice(key);\n\nexport const getVectorStoreClient = (key: string) =>\n vectorStoreLatticeManager.getVectorStoreClient(key);\n\n","/**\n * LoggerLatticeManager\n *\n * Logger Lattice manager for registering and managing logger services\n */\n\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport {\n LoggerLatticeProtocol,\n LoggerConfig,\n LoggerType,\n LoggerClient,\n} from \"@axiom-lattice/protocols\";\nimport { PinoLoggerClient } from \"./PinoLoggerClient\";\nimport { ConsoleLoggerClient } from \"./ConsoleLoggerClient\";\n\n/**\n * Logger Lattice interface\n */\nexport interface LoggerLattice extends LoggerLatticeProtocol {\n key: string;\n config: LoggerConfig;\n client: LoggerLatticeProtocol[\"client\"];\n}\n\n/**\n * LoggerLatticeManager - Singleton logger Lattice manager\n * Responsible for registering and managing various logger service Lattices\n */\nexport class LoggerLatticeManager extends BaseLatticeManager<LoggerLattice> {\n private static _instance: LoggerLatticeManager;\n\n /**\n * Get LoggerLatticeManager singleton instance\n */\n public static getInstance(): LoggerLatticeManager {\n if (!LoggerLatticeManager._instance) {\n LoggerLatticeManager._instance = new LoggerLatticeManager();\n }\n return LoggerLatticeManager._instance;\n }\n\n /**\n * Get Lattice type prefix\n */\n protected getLatticeType(): string {\n return \"loggers\";\n }\n\n /**\n * Register logger Lattice\n * @param key Lattice key name\n * @param config Logger configuration\n * @param client Optional logger client. If not provided, will create based on config type.\n */\n public registerLattice(\n key: string,\n config: LoggerConfig,\n client?: LoggerClient\n ): void {\n // Create client based on logger type if not provided\n let loggerClient: LoggerLatticeProtocol[\"client\"];\n\n if (client) {\n // Use provided client\n loggerClient = client;\n } else {\n if (config.type === LoggerType.PINO) {\n loggerClient = new PinoLoggerClient(config);\n } else if (config.type === LoggerType.CONSOLE) {\n loggerClient = new ConsoleLoggerClient(config);\n } else if (config.type === LoggerType.CUSTOM) {\n // For custom type, client must be provided\n throw new Error(\n `Custom logger client must be provided. Please pass the client to registerLattice.`\n );\n } else {\n // Default to pino\n loggerClient = new PinoLoggerClient(config);\n }\n }\n\n // Create logger Lattice object\n const loggerLattice: LoggerLattice = {\n key,\n config,\n client: loggerClient,\n\n // Logger operations\n info: (msg: string, obj?: object) => {\n loggerClient.info(msg, obj);\n },\n error: (msg: string, obj?: object | Error) => {\n loggerClient.error(msg, obj);\n },\n warn: (msg: string, obj?: object) => {\n loggerClient.warn(msg, obj);\n },\n debug: (msg: string, obj?: object) => {\n loggerClient.debug(msg, obj);\n },\n updateContext: loggerClient.updateContext\n ? (context) => {\n loggerClient.updateContext!(context);\n }\n : undefined,\n child: loggerClient.child\n ? (options) => {\n return loggerClient.child!(options);\n }\n : undefined,\n };\n\n // Call base class register method\n this.register(key, loggerLattice);\n }\n\n /**\n * Get LoggerLattice\n * @param key Lattice key name\n */\n public getLoggerLattice(key: string): LoggerLattice {\n const loggerLattice = this.get(key);\n if (!loggerLattice) {\n throw new Error(`LoggerLattice ${key} not found`);\n }\n return loggerLattice;\n }\n\n /**\n * Get all Lattices\n */\n public getAllLattices(): LoggerLattice[] {\n return this.getAll();\n }\n\n /**\n * Check if Lattice exists\n * @param key Lattice key name\n */\n public hasLattice(key: string): boolean {\n return this.has(key);\n }\n\n /**\n * Remove Lattice\n * @param key Lattice key name\n */\n public removeLattice(key: string): boolean {\n return this.remove(key);\n }\n\n /**\n * Clear all Lattices\n */\n public clearLattices(): void {\n this.clear();\n }\n\n /**\n * Get Lattice count\n */\n public getLatticeCount(): number {\n return this.count();\n }\n\n /**\n * Get Lattice key list\n */\n public getLatticeKeys(): string[] {\n return this.keys();\n }\n}\n\n// Export singleton instance\nexport const loggerLatticeManager = LoggerLatticeManager.getInstance();\n\n// Export convenience methods\nexport const registerLoggerLattice = (\n key: string,\n config: LoggerConfig,\n client?: LoggerClient\n) => loggerLatticeManager.registerLattice(key, config, client);\n\nexport const getLoggerLattice = (key: string) =>\n loggerLatticeManager.getLoggerLattice(key);\n","/**\n * PinoLoggerClient\n *\n * Pino-based logger client implementation\n */\n\nimport pino from \"pino\";\nimport \"pino-pretty\";\nimport \"pino-roll\";\nimport {\n LoggerClient,\n LoggerContext,\n LoggerConfig,\n PinoFileOptions,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * Pino-based logger client implementation\n * Supports custom file paths and pino configurations\n */\nexport class PinoLoggerClient implements LoggerClient {\n private pinoLogger: pino.Logger;\n private config: LoggerConfig;\n private context: LoggerContext;\n\n constructor(config: LoggerConfig) {\n this.config = config;\n this.context = config.context || {};\n\n // Create pino logger with custom configuration\n const loggerConfig: pino.LoggerOptions = {\n // Custom timestamp format\n timestamp: () => `,\"@timestamp\":\"${new Date().toISOString()}\"`,\n\n // Base metadata\n base: {\n \"@version\": \"1\",\n app_name: \"lattice\",\n service_name: config.serviceName || \"lattice-service\",\n thread_name: \"main\",\n logger_name: config.loggerName || config.name || \"lattice-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 // Determine if we should use file logging\n const useFileLogging = this.shouldUseFileLogging(config);\n const fileOptions = this.getFileOptions(config);\n\n if (useFileLogging && fileOptions) {\n // Use file logging with pino-roll\n try {\n this.pinoLogger = pino(\n loggerConfig,\n pino.transport({\n target: \"pino-roll\",\n options: {\n file: fileOptions.file || \"./logs/app\",\n frequency: fileOptions.frequency || \"daily\",\n mkdir: fileOptions.mkdir !== false, // Default to true\n size: fileOptions.size,\n maxFiles: fileOptions.maxFiles,\n },\n })\n );\n } catch (error) {\n console.error(\n \"Failed to initialize pino-roll logger, falling back to console\",\n error\n );\n // Fallback to console logging\n this.pinoLogger = pino({\n ...loggerConfig,\n transport: {\n target: \"pino-pretty\",\n options: {\n colorize: true,\n },\n },\n });\n }\n } else {\n // Use console logging with pretty output\n this.pinoLogger = pino({\n ...loggerConfig,\n transport: {\n target: \"pino-pretty\",\n options: {\n colorize: true,\n },\n },\n });\n }\n }\n\n /**\n * Determine if file logging should be used\n */\n private shouldUseFileLogging(config: LoggerConfig): boolean {\n // Use file logging if:\n // 1. file option is provided, OR\n // 2. NODE_ENV is production (unless explicitly disabled)\n const hasFileConfig = config.file !== undefined;\n const isProduction = process.env.NODE_ENV === \"production\";\n return hasFileConfig || isProduction;\n }\n\n /**\n * Get file options from config\n */\n private getFileOptions(config: LoggerConfig): PinoFileOptions | null {\n if (!config.file) {\n // If no file config but in production, use default\n if (process.env.NODE_ENV === \"production\") {\n return {\n file: \"./logs/app\",\n frequency: \"daily\",\n mkdir: true,\n };\n }\n return null;\n }\n\n // If file is a string, convert to PinoFileOptions\n if (typeof config.file === \"string\") {\n return {\n file: config.file,\n frequency: \"daily\",\n mkdir: true,\n };\n }\n\n // Otherwise, it's already PinoFileOptions\n return config.file;\n }\n\n /**\n * Get contextual logger with merged context\n */\n private getContextualLogger(additionalContext?: object): pino.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-thread-id\": this.context[\"x-thread-id\"] || \"\",\n service_name: this.config.serviceName || \"lattice-service\",\n logger_name:\n this.config.loggerName || this.config.name || \"lattice-logger\",\n ...additionalContext,\n };\n\n return this.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 updateContext(context: Partial<LoggerContext>): void {\n this.context = {\n ...this.context,\n ...context,\n };\n }\n\n child(options: Partial<LoggerConfig>): LoggerClient {\n // Create a new PinoLoggerClient with merged config\n return new PinoLoggerClient({\n ...this.config,\n ...options,\n context: {\n ...this.context,\n ...options.context,\n },\n });\n }\n}\n","/**\n * ConsoleLoggerClient\n *\n * Simple console-based logger client implementation\n */\n\nimport { LoggerClient, LoggerContext, LoggerConfig } from \"@axiom-lattice/protocols\";\n\n/**\n * Console-based logger client implementation\n */\nexport class ConsoleLoggerClient implements LoggerClient {\n private config: LoggerConfig;\n private context: LoggerContext;\n\n constructor(config: LoggerConfig) {\n this.config = config;\n this.context = config.context || {};\n }\n\n private formatMessage(level: string, msg: string, obj?: object): string {\n const timestamp = new Date().toISOString();\n const contextStr = Object.keys(this.context).length > 0\n ? ` [${JSON.stringify(this.context)}]`\n : \"\";\n const objStr = obj ? ` ${JSON.stringify(obj)}` : \"\";\n return `[${timestamp}] [${level}]${contextStr} ${msg}${objStr}`;\n }\n\n info(msg: string, obj?: object): void {\n console.log(this.formatMessage(\"INFO\", msg, obj));\n }\n\n error(msg: string, obj?: object | Error): void {\n console.error(this.formatMessage(\"ERROR\", msg, obj));\n }\n\n warn(msg: string, obj?: object): void {\n console.warn(this.formatMessage(\"WARN\", msg, obj));\n }\n\n debug(msg: string, obj?: object): void {\n console.debug(this.formatMessage(\"DEBUG\", msg, obj));\n }\n\n updateContext(context: Partial<LoggerContext>): void {\n this.context = {\n ...this.context,\n ...context,\n };\n }\n\n child(options: Partial<LoggerConfig>): LoggerClient {\n const childClient = new ConsoleLoggerClient({\n ...this.config,\n ...options,\n context: {\n ...this.context,\n ...options.context,\n },\n });\n return childClient;\n }\n}\n","/**\n * SkillLatticeManager\n *\n * Skill Lattice manager for registering and managing skill components\n */\n\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport {\n SkillConfig,\n SkillLatticeProtocol,\n SkillClient,\n SkillClientType,\n SkillStore,\n} from \"@axiom-lattice/protocols\";\nimport { storeLatticeManager } from \"../store_lattice/StoreLatticeManager\";\nimport { validateSkillName } from \"./skillNameValidator\";\n\n/**\n * Skill Lattice interface\n */\nexport interface SkillLattice {\n key: string;\n config: SkillConfig;\n client: SkillClient | null;\n}\n\n/**\n * SkillLatticeManager - Singleton skill Lattice manager\n * Responsible for registering and managing various skill Lattices\n */\nexport class SkillLatticeManager extends BaseLatticeManager<SkillLattice> {\n private static _instance: SkillLatticeManager;\n private storeKey?: string;\n\n /**\n * Get SkillLatticeManager singleton instance\n */\n public static getInstance(): SkillLatticeManager {\n if (!SkillLatticeManager._instance) {\n SkillLatticeManager._instance = new SkillLatticeManager();\n }\n return SkillLatticeManager._instance;\n }\n\n /**\n * Get Lattice type prefix\n */\n protected getLatticeType(): string {\n return \"skills\";\n }\n\n /**\n * Configure store for persistence\n * @param storeKey Store key name registered in StoreLatticeManager\n */\n public configureStore(storeKey: string): void {\n this.storeKey = storeKey;\n }\n\n /**\n * Get configured store\n * @returns SkillStore instance if configured, null otherwise\n */\n private getStore(): SkillStore | null {\n if (!this.storeKey) {\n return null;\n }\n\n try {\n const storeLattice = storeLatticeManager.getStoreLattice(\n this.storeKey,\n \"skill\"\n );\n return storeLattice.store;\n } catch {\n return null;\n }\n }\n\n /**\n * Inject store into client if client supports it\n * @param client Skill client instance\n * @param store Store instance to inject\n */\n private injectStoreIntoClient(client: SkillClientType, store: SkillStore): void {\n if (!client || typeof client !== \"object\") {\n return;\n }\n\n // Try setStore method first\n if (typeof client.setStore === \"function\") {\n client.setStore(store);\n }\n\n // Also set store property directly\n client.store = store;\n }\n\n /**\n * Register a skill Lattice\n * @param key Lattice key name\n * @param config Skill configuration\n * @param client Optional skill client implementation\n */\n public async registerLattice(\n key: string,\n config: SkillConfig,\n client?: SkillClient\n ): Promise<void> {\n // Validate required fields\n if (!config.name) {\n throw new Error(\"Skill name is required\");\n }\n if (!config.description) {\n throw new Error(\"Skill description is required\");\n }\n\n // Validate name format\n validateSkillName(config.name);\n\n // Validate that key equals name (name is used for path addressing)\n if (key !== config.name) {\n throw new Error(\n `Skill key \"${key}\" must equal name \"${config.name}\" (name is used for path addressing)`\n );\n }\n\n // Get store instance\n const store = this.getStore();\n\n // Inject store into client if provided\n if (client && store) {\n this.injectStoreIntoClient(client, store);\n }\n\n // Create skill Lattice object\n const skillLattice: SkillLattice = {\n key,\n config,\n client: client ?? null,\n };\n\n // Call base class register method\n this.register(key, skillLattice);\n\n // Persist to store if configured\n if (store) {\n try {\n await store.createSkill(key, {\n name: config.name,\n description: config.description,\n license: config.license,\n compatibility: config.compatibility,\n metadata: config.metadata,\n content: config.content,\n subSkills: config.subSkills,\n });\n } catch (error) {\n // Log error but don't fail registration\n console.warn(\n `Failed to persist skill ${key} to store:`,\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n }\n\n /**\n * Get skill Lattice by key\n * @param key Lattice key name\n */\n public getSkillLattice(key: string): SkillLattice | undefined {\n return this.get(key);\n }\n\n /**\n * Get all skill Lattices from store\n * Always reads from the configured store and merges with in-memory clients\n */\n public async getAllLattices(): Promise<SkillLattice[]> {\n const store = this.getStore();\n if (!store) {\n // If no store configured, fall back to memory\n return this.getAll();\n }\n\n const skills = await store.getAllSkills();\n\n return skills.map((skill) => {\n // Check if there's an in-memory lattice with a client\n const memoryLattice = this.get(skill.id);\n const client = memoryLattice?.client || null;\n\n // Inject store into client if it exists\n if (client && store) {\n this.injectStoreIntoClient(client, store);\n }\n\n return {\n key: skill.id,\n config: {\n name: skill.name,\n description: skill.description,\n license: skill.license,\n compatibility: skill.compatibility,\n metadata: skill.metadata,\n content: skill.content,\n subSkills: skill.subSkills,\n },\n client,\n };\n });\n }\n\n /**\n * Check if Lattice exists\n * @param key Lattice key name\n */\n public hasLattice(key: string): boolean {\n return this.has(key);\n }\n\n /**\n * Remove Lattice\n * @param key Lattice key name\n */\n public async removeLattice(key: string): Promise<boolean> {\n const removed = this.remove(key);\n\n // Remove from store if configured\n if (removed) {\n const store = this.getStore();\n if (store) {\n try {\n await store.deleteSkill(key);\n } catch (error) {\n // Log error but don't fail removal\n console.warn(\n `Failed to remove skill ${key} from store:`,\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n }\n\n return removed;\n }\n\n /**\n * Clear all Lattices\n */\n public clearLattices(): void {\n this.clear();\n }\n\n /**\n * Get Lattice count\n */\n public getLatticeCount(): number {\n return this.count();\n }\n\n /**\n * Get Lattice key name list\n */\n public getLatticeKeys(): string[] {\n return this.keys();\n }\n\n /**\n * Get skill configuration\n * @param key Lattice key name\n */\n public getSkillConfig(key: string): SkillConfig {\n const skillLattice = this.getSkillLattice(key);\n if (!skillLattice) {\n throw new Error(`SkillLattice ${key} not found`);\n }\n return skillLattice.config;\n }\n\n /**\n * Get skill client\n * Ensures client has store access if store is configured\n * @param key Lattice key name\n */\n public getSkillClient(key: string): SkillClient | null {\n const skillLattice = this.getSkillLattice(key);\n if (!skillLattice) {\n throw new Error(`SkillLattice ${key} not found`);\n }\n\n const client = skillLattice.client;\n if (!client) {\n return null;\n }\n\n // Ensure client has store access if store is configured\n const store = this.getStore();\n if (store && client) {\n this.injectStoreIntoClient(client, store);\n }\n\n return client;\n }\n\n /**\n * Get all skill configurations from store\n * Always reads from the configured store, not from memory\n */\n public async getAllSkillConfigs(): Promise<SkillConfig[]> {\n const lattices = await this.getAllLattices();\n return lattices.map((lattice) => lattice.config);\n }\n\n /**\n * Search skills by metadata\n * @param metadataKey Metadata key to search for\n * @param metadataValue Metadata value to match\n */\n public async searchByMetadata(\n metadataKey: string,\n metadataValue: string\n ): Promise<SkillLattice[]> {\n const lattices = await this.getAllLattices();\n return lattices.filter((lattice) => {\n return (\n lattice.config.metadata &&\n lattice.config.metadata[metadataKey] === metadataValue\n );\n });\n }\n\n /**\n * Filter skills by compatibility\n * @param compatibility Compatibility string to filter by\n */\n public async filterByCompatibility(compatibility: string): Promise<SkillLattice[]> {\n const lattices = await this.getAllLattices();\n return lattices.filter((lattice) => {\n return lattice.config.compatibility === compatibility;\n });\n }\n\n /**\n * Filter skills by license\n * @param license License string to filter by\n */\n public async filterByLicense(license: string): Promise<SkillLattice[]> {\n const lattices = await this.getAllLattices();\n return lattices.filter((lattice) => {\n return lattice.config.license === license;\n });\n }\n\n /**\n * Load skills from configured store\n * This method loads all skills from the store and registers them in memory\n */\n public async loadFromStore(): Promise<void> {\n const store = this.getStore();\n if (!store) {\n throw new Error(\"No store configured. Call configureStore() first.\");\n }\n\n const skills = await store.getAllSkills();\n for (const skill of skills) {\n // Register skill in memory without persisting back to store\n const skillLattice: SkillLattice = {\n key: skill.id,\n config: {\n name: skill.name,\n description: skill.description,\n license: skill.license,\n compatibility: skill.compatibility,\n metadata: skill.metadata,\n content: skill.content,\n subSkills: skill.subSkills,\n },\n client: null,\n };\n\n // Use base class register method directly to avoid double persistence\n this.register(skill.id, skillLattice);\n\n // Note: If a client is later added to this skill, it will receive store access\n // via getSkillClient() method\n }\n }\n\n /**\n * Update skill in store\n * @param key Skill key\n * @param updates Partial skill data to update\n */\n public async updateSkillInStore(\n key: string,\n updates: Partial<SkillConfig>\n ): Promise<void> {\n const store = this.getStore();\n if (!store) {\n throw new Error(\"No store configured. Call configureStore() first.\");\n }\n\n // Update in memory\n const skillLattice = this.getSkillLattice(key);\n if (!skillLattice) {\n throw new Error(`SkillLattice ${key} not found`);\n }\n\n const updatedConfig: SkillConfig = {\n ...skillLattice.config,\n ...updates,\n };\n\n skillLattice.config = updatedConfig;\n\n // Update in store\n await store.updateSkill(key, {\n name: updatedConfig.name,\n description: updatedConfig.description,\n license: updatedConfig.license,\n compatibility: updatedConfig.compatibility,\n metadata: updatedConfig.metadata,\n content: updatedConfig.content,\n subSkills: updatedConfig.subSkills,\n });\n }\n}\n\n// Export singleton instance\nexport const skillLatticeManager = SkillLatticeManager.getInstance();\n","/**\n * McpLatticeManager\n *\n * MCP Lattice Manager - Manages MCP client connections using MultiServerMCPClient\n * Follows the singleton pattern for global access\n */\n\nimport { MultiServerMCPClient } from \"@langchain/mcp-adapters\";\nimport { BaseLatticeManager } from \"../base/BaseLatticeManager\";\nimport type { Connection } from \"@langchain/mcp-adapters\";\nimport { toolLatticeManager } from \"../tool_lattice\";\n\nexport interface McpServerInfo {\n name: string;\n connection: Connection;\n}\n\nexport interface McpLatticeInterface {\n client: MultiServerMCPClient;\n servers: Map<string, McpServerInfo>;\n}\n\nexport class McpLatticeManager extends BaseLatticeManager<McpLatticeInterface> {\n private static _instance: McpLatticeManager;\n private client: MultiServerMCPClient | null = null;\n private servers: Map<string, McpServerInfo> = new Map();\n\n public static getInstance(): McpLatticeManager {\n if (!McpLatticeManager._instance) {\n McpLatticeManager._instance = new McpLatticeManager();\n }\n return McpLatticeManager._instance;\n }\n\n protected getLatticeType(): string {\n return \"mcp\";\n }\n\n public registerServers(servers: McpServerInfo[]): void {\n for (const server of servers) {\n if (this.servers.has(server.name)) {\n console.warn(`[MCP] Server '${server.name}' already registered, skipping`);\n continue;\n }\n this.servers.set(server.name, server);\n console.log(`[MCP] Registered server: ${server.name}`);\n }\n }\n\n public addServer(name: string, connection: Connection): void {\n this.registerServers([{ name, connection }]);\n }\n\n public removeServer(name: string): boolean {\n const deleted = this.servers.delete(name);\n if (deleted) {\n console.log(`[MCP] Removed server: ${name}`);\n }\n return deleted;\n }\n\n public async connect(): Promise<void> {\n if (this.client) {\n console.warn(\"[MCP] Client already connected\");\n return;\n }\n\n const serverConfigs: Record<string, Connection> = {};\n for (const [name, info] of this.servers) {\n serverConfigs[name] = info.connection;\n }\n\n if (Object.keys(serverConfigs).length === 0) {\n console.warn(\"[MCP] No servers registered\");\n return;\n }\n\n this.client = new MultiServerMCPClient({\n mcpServers: serverConfigs,\n });\n\n console.log(`[MCP] Connecting to ${this.servers.size} servers...`);\n await this.client.initializeConnections();\n console.log(\"[MCP] All servers connected\");\n }\n\n public async disconnect(): Promise<void> {\n if (this.client) {\n await this.client.close();\n this.client = null;\n console.log(\"[MCP] Disconnected\");\n }\n }\n\n public isConnected(): boolean {\n return this.client !== null;\n }\n\n public async getAllTools(): Promise<any[]> {\n if (!this.client) {\n throw new Error(\"MCP client not connected\");\n }\n return this.client.getTools();\n }\n\n public getServerNames(): string[] {\n return Array.from(this.servers.keys());\n }\n\n public hasServer(name: string): boolean {\n return this.servers.has(name);\n }\n\n /**\n * 将 MCP 工具注册到 Tool Lattice\n * @param prefix 工具键名前缀,用于区分不同服务器的工具\n */\n public async registerToolsToToolLattice(prefix?: string): Promise<void> {\n if (!this.client) {\n throw new Error(\"MCP client not connected\");\n }\n\n const tools = await this.getAllTools();\n console.log(`[MCP] Registering ${tools.length} tools to Tool Lattice...`);\n\n for (const tool of tools) {\n const toolKey = prefix ? `${prefix}_${tool.name}` : tool.name;\n tool.name = toolKey;\n toolLatticeManager.registerExistingTool(toolKey, tool);\n console.log(`[MCP] Registered tool: ${toolKey}`);\n }\n\n console.log(`[MCP] Successfully registered ${tools.length} tools to Tool Lattice`);\n }\n}\n\nexport const mcpManager = McpLatticeManager.getInstance();\n","/**\n * 全局加密工具\n * 用于敏感数据加密存储(如数据库密码、API 密钥等)\n * \n * @module @axiom-lattice/core/util/encryption\n */\n\nimport { createCipheriv, createDecipheriv, randomBytes, pbkdf2Sync } from 'crypto';\n\nconst ALGORITHM = 'aes-256-gcm';\nconst IV_LENGTH = 16;\nconst SALT_LENGTH = 32;\nconst ITERATIONS = 100000;\n\n// 默认密钥(仅开发环境使用)\nconst DEFAULT_ENCRYPTION_KEY = 'lattice-default-encryption-key-dev-only-32b!';\n\nlet cachedKey: Buffer | null = null;\nlet keyValidated = false;\n\n/**\n * 获取加密密钥\n * 优先从环境变量读取,否则使用默认值\n * @returns 32 字节的 Buffer 密钥\n */\nexport function getEncryptionKey(): Buffer {\n if (cachedKey) {\n return cachedKey;\n }\n \n const key = process.env.LATTICE_ENCRYPTION_KEY || DEFAULT_ENCRYPTION_KEY;\n cachedKey = pbkdf2Sync(key, 'lattice-encryption-salt', ITERATIONS, 32, 'sha256');\n \n // 仅在首次获取时验证\n if (!keyValidated) {\n keyValidated = true;\n validateEncryptionKey();\n }\n \n return cachedKey;\n}\n\n/**\n * 加密字符串\n * @param plaintext 明文字符串\n * @param key 可选的加密密钥,默认使用全局密钥\n * @returns 加密后的字符串 (salt:iv:ciphertext:authTag 的 base64 编码)\n */\nexport function encrypt(plaintext: string, key?: Buffer): string {\n const actualKey = key || getEncryptionKey();\n const salt = randomBytes(SALT_LENGTH);\n const iv = randomBytes(IV_LENGTH);\n \n const derivedKey = pbkdf2Sync(actualKey, salt, ITERATIONS, 32, 'sha256');\n const cipher = createCipheriv(ALGORITHM, derivedKey, iv);\n \n const encrypted = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);\n const authTag = cipher.getAuthTag();\n \n // 格式:salt:iv:encrypted:authTag (base64)\n return Buffer.concat([salt, iv, encrypted, authTag]).toString('base64');\n}\n\n/**\n * 解密字符串\n * @param encrypted 加密的字符串 (base64 编码)\n * @param key 可选的解密密钥,默认使用全局密钥\n * @returns 解密后的明文\n * @throws 如果解密失败(密钥错误或数据损坏)\n */\nexport function decrypt(encrypted: string, key?: Buffer): string {\n const actualKey = key || getEncryptionKey();\n const data = Buffer.from(encrypted, 'base64');\n \n const salt = data.subarray(0, SALT_LENGTH);\n const iv = data.subarray(SALT_LENGTH, SALT_LENGTH + IV_LENGTH);\n const authTag = data.subarray(-16);\n const ciphertext = data.subarray(SALT_LENGTH + IV_LENGTH, -16);\n \n const derivedKey = pbkdf2Sync(actualKey, salt, ITERATIONS, 32, 'sha256');\n const decipher = createDecipheriv(ALGORITHM, derivedKey, iv);\n decipher.setAuthTag(authTag);\n \n return Buffer.concat([decipher.update(ciphertext), decipher.final()]).toString('utf8');\n}\n\n/**\n * 检查是否使用默认密钥\n * @returns 如果使用默认密钥返回 true\n */\nexport function isUsingDefaultKey(): boolean {\n return !process.env.LATTICE_ENCRYPTION_KEY;\n}\n\n/**\n * 验证加密密钥\n * 生产环境未设置 LATTICE_ENCRYPTION_KEY 时会抛出错误\n * 开发环境仅输出警告\n */\nexport function validateEncryptionKey(): void {\n if (isUsingDefaultKey()) {\n if (process.env.NODE_ENV === 'production') {\n console.warn(\n '⚠️ WARNING: Using default encryption key in production environment.' +\n ' Set LATTICE_ENCRYPTION_KEY environment variable for security.'\n );\n } else {\n console.warn(\n '⚠️ WARNING: Using default encryption key. ' +\n 'Set LATTICE_ENCRYPTION_KEY environment variable in production.'\n );\n }\n }\n}\n\n/**\n * 清除缓存的密钥(用于测试或重新加载配置)\n */\nexport function clearEncryptionKeyCache(): void {\n cachedKey = null;\n keyValidated = false;\n}\n"],"mappings":"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","names":["tool","z","import_zod","z","import_zod","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_langgraph","import_protocols","import_zod","import_langgraph","import_langchain","import_sandbox","path","relative","import_langchain","import_langchain","import_langchain","import_langchain","path","colonIndex","key","value","import_zod","import_langchain","z","import_zod","import_langchain","z","import_zod","import_langchain","z","import_langchain","import_langgraph","import_zod","path","relative","micromatch","lines","path","relative","z3","result","path","import_langchain","tool","stateSchema","import_langchain","import_v3","import_langchain","import_langgraph","import_langgraph","import_protocols","resolve","import_langchain","import_messages","import_langgraph","path","relative","fs","path","import_micromatch","relative","stat","resolve","fg","micromatch","path","path","relative","import_langgraph","import_zod","import_langchain","tool","import_v3","import_langchain","TaskStatus","MessageType","import_events","import_events","import_v3","import_langchain","import_langgraph","import_v3","import_langchain","import_langgraph","READ_MESSAGES_TIMEOUT_MS","msgs","formatted","relevantMsgs","toolMessage","resolve","uuidv4","msgs","formatted","allTeamMessages","toolMessage","resolve","stateSchema","tool","config","import_protocols","ThreadStatus","resolve","import_protocols","import_protocols","import_protocols","import_protocols","pino","tool"]}
|