@axiom-lattice/gateway 4.0.0 → 4.0.2
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/{a2a-standard-U2XYG45L.mjs → a2a-standard-VYQCHMBV.mjs} +3 -10
- package/dist/a2a-standard-VYQCHMBV.mjs.map +1 -0
- package/dist/{chunk-IDOEIBCF.mjs → chunk-J4BK77PA.mjs} +13 -2
- package/dist/chunk-J4BK77PA.mjs.map +1 -0
- package/dist/index.js +1272 -148
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1212 -93
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -6
- package/dist/a2a-standard-U2XYG45L.mjs.map +0 -1
- package/dist/chunk-IDOEIBCF.mjs.map +0 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/controllers/assistant.ts","../src/services/local-a2a.ts","../src/utils/a2a-url.ts","../src/utils/local-a2a-runtime.ts","../src/controllers/run.ts","../src/controllers/memory.ts","../src/controllers/agent_task.ts","../src/controllers/threads.ts","../src/controllers/schedules.ts","../src/config.ts","../src/services/queue_service.ts","../src/controllers/config.ts","../src/controllers/models.ts","../src/controllers/health.ts","../src/services/skill_service.ts","../src/controllers/skills.ts","../src/services/collection_service.ts","../src/controllers/collections.ts","../src/controllers/embeddings.ts","../src/controllers/entries.ts","../src/controllers/tools.ts","../src/controllers/data-query.ts","../src/controllers/workflow-tracking.ts","../src/controllers/personal-assistant.ts","../src/services/ExportImportService.ts","../src/controllers/export-import.ts","../src/controllers/middleware-types.ts","../src/schemas/data-query.ts","../src/schemas/index.ts","../src/controllers/thread_status.ts","../src/services/sandbox_service.ts","../src/controllers/sandbox.ts","../src/controllers/workspace.ts","../src/controllers/database-configs.ts","../src/controllers/metrics-configs.ts","../src/controllers/connections.ts","../src/controllers/eval.ts","../src/services/eval-runner.ts","../src/controllers/users.ts","../src/controllers/tenants.ts","../src/controllers/auth.ts","../src/channels/lark/LarkChannelAdapter.ts","../src/channels/lark/parser.ts","../src/channels/lark/verification.ts","../src/channels/lark/controller.ts","../src/channels/lark/routes.ts","../src/channels/wechat/controller.ts","../src/channels/wechat/routes.ts","../src/channels/routes.ts","../src/controllers/channel-installations.ts","../src/routes/channel-installations.ts","../src/controllers/channel-bindings.ts","../src/routes/channel-bindings.ts","../src/controllers/menu-items.ts","../src/routes/menu-items.ts","../src/routes/a2a-bridge.ts","../src/routes/stt.ts","../src/controllers/local-a2a.ts","../src/config/local-a2a-templates.ts","../src/controllers/local-a2a-templates.ts","../src/routes/a2a-test-connection.ts","../src/controllers/tasks.ts","../src/routes/task-routes.ts","../src/routes/index.ts","../src/routes/resource-routes.ts","../src/export_registrations/index.ts","../src/export_registrations/skill.registration.ts","../src/export_registrations/agent.registration.ts","../src/export_registrations/database-config.registration.ts","../src/export_registrations/metrics-config.registration.ts","../src/export_registrations/mcp-config.registration.ts","../src/export_registrations/connection.registration.ts","../src/export_registrations/collection.registration.ts","../src/export_registrations/channel-installation.registration.ts","../src/export_registrations/menu.registration.ts","../src/export_registrations/eval.registration.ts","../src/router/MessageRouter.ts","../src/channels/registry.ts","../src/router/middlewares/deduplication.ts","../src/router/middlewares/rateLimit.ts","../src/router/middlewares/auditLogger.ts","../src/swagger.ts","../src/services/agent_task_consumer.ts"],"sourcesContent":["import \"dotenv/config\";\nimport fastify from \"fastify\";\nimport cors from \"@fastify/cors\";\nimport multipart from \"@fastify/multipart\";\nimport sensible from \"@fastify/sensible\";\nimport websocket from \"@fastify/websocket\";\nimport staticPlugin from \"@fastify/static\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { registerLatticeRoutes } from \"./routes\";\nimport { registerResourceRoutes } from \"./routes/resource-routes\";\nimport { registerAllBuiltinEntities } from \"./export_registrations\";\nimport type {\n ChannelInstallationStore,\n BindingRegistry,\n A2AApiKeyStore,\n AssistantStore,\n ProjectStore,\n TaskStore,\n} from \"@axiom-lattice/protocols\";\nimport { MessageRouter } from \"./router/MessageRouter\";\nimport { ChannelAdapterRegistry } from \"./channels/registry\";\nimport { createDeduplicationMiddleware, createRateLimitMiddleware, createAuditLoggerMiddleware } from \"./router/middlewares\";\nimport { setBindingRegistry, setMenuRegistry, setEvalRunService } from \"@axiom-lattice/core\";\nimport { larkChannelAdapter } from \"./channels/lark/LarkChannelAdapter\";\nimport { registerConsoleAuthHook } from \"./controllers/auth\";\nimport { setChannelControllerDeps } from \"./controllers/channel-installations\";\nimport { evalRunner } from \"./services/eval-runner\";\nimport { configureSwagger } from \"./swagger\";\nimport {\n setQueueServiceType,\n QueueServiceType,\n} from \"./services/queue_service\";\nimport { AgentTaskConsumer } from \"./services/agent_task_consumer\";\nimport {\n registerLoggerLattice,\n getLoggerLattice,\n loggerLatticeManager,\n sandboxLatticeManager,\n getStoreLattice,\n agentInstanceManager,\n createSandboxProvider,\n type CreateSandboxProviderConfig,\n TokenCache,\n mcpManager,\n} from \"@axiom-lattice/core\";\nimport {\n LoggerType,\n LoggerConfig,\n PinoFileOptions,\n McpServerConfigStore,\n} from \"@axiom-lattice/protocols\";\nprocess.on(\"unhandledRejection\", (reason, promise) => {\n console.error(\"未处理的Promise拒绝:\", reason);\n // 可以在这里进行日志记录或其他处理\n});\n\n// Default logger configuration\nconst DEFAULT_LOGGER_CONFIG: LoggerConfig = {\n name: \"default\",\n description: \"Default logger for lattice-gateway service\",\n type: LoggerType.PINO,\n serviceName: \"lattice/gateway\",\n loggerName: \"lattice/gateway\",\n};\n\n// Initialize logger with default config (can be overridden in start function)\nlet loggerLattice = initializeLogger(DEFAULT_LOGGER_CONFIG);\nlet logger = loggerLattice.client;\n\n/**\n * Initialize logger lattice with given configuration\n */\nfunction initializeLogger(config: LoggerConfig) {\n // Remove existing logger if it exists\n if (loggerLatticeManager.hasLattice(\"default\")) {\n loggerLatticeManager.removeLattice(\"default\");\n }\n\n // Register logger with provided config\n registerLoggerLattice(\"default\", config);\n\n // Get and return logger lattice instance\n return getLoggerLattice(\"default\");\n}\n\n// 创建 Fastify 应用\nconst app = fastify({\n logger: false,\n bodyLimit: Number(process.env.BODY_LIMIT) || 50 * 1024 * 1024,\n});\n\n// Custom content type parser to handle DELETE requests with Content-Type but no body\n// This prevents \"Body cannot be empty when content-type is set to 'application/json'\" error\napp.addContentTypeParser('application/json', { parseAs: 'string' }, function (request, body, done) {\n // For DELETE requests or empty body, return empty object\n if (request.method === 'DELETE' || !body || body.length === 0) {\n done(null, {});\n return;\n }\n try {\n const json = JSON.parse(body as string);\n done(null, json);\n } catch (err) {\n done(err as Error, undefined);\n }\n});\n\n\n// Helper: extract single header value (Fastify headers can be string | string[])\nconst getHeaderValue = (\n header: string | string[] | undefined\n): string | undefined => {\n if (Array.isArray(header)) {\n return header[0];\n }\n return header;\n};\n\nconst authRequired = process.env.AUTH_REQUIRED === \"true\";\n\n// Note: tokenSecret is resolved lazily inside the hook so that application\n// env (loaded after this module is imported) is honored.\nregisterConsoleAuthHook(app, { authRequired });\n\n// Add default header values for project/workspace isolation\napp.addHook(\"onRequest\", (request, reply, done) => {\n if (!request.headers[\"x-project-id\"]) {\n request.headers[\"x-project-id\"] = \"default\";\n }\n done();\n});\n\n// Add custom logging hooks\napp.addHook(\"onRequest\", (request, reply, done) => {\n const context = {\n \"x-tenant-id\": getHeaderValue(request.headers[\"x-tenant-id\"]),\n \"x-request-id\": getHeaderValue(request.headers[\"x-request-id\"]),\n \"x-user-id\": getHeaderValue(request.headers[\"x-user-id\"]),\n };\n // Update logger context for this request\n if (loggerLattice.updateContext) {\n loggerLattice.updateContext(context);\n }\n done();\n});\n\napp.addHook(\"onResponse\", (request, reply, done) => {\n const context = {\n \"x-tenant-id\": getHeaderValue(request.headers[\"x-tenant-id\"]),\n \"x-request-id\": getHeaderValue(request.headers[\"x-request-id\"]),\n \"x-user-id\": getHeaderValue(request.headers[\"x-user-id\"]),\n };\n //loggerLattice.info(`${request.method} ${request.url} - ${reply.statusCode}`);\n done();\n});\n\n// cors\napp.register(cors, {\n origin: true,\n methods: [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"OPTIONS\", \"PATCH\"],\n allowedHeaders: \"*\",\n exposedHeaders: [\"Content-Type\", \"Content-Disposition\"],\n credentials: true,\n});\napp.register(sensible);\napp.register(multipart, {\n limits: {\n fileSize: Number(process.env.BODY_LIMIT) || 50 * 1024 * 1024,\n },\n});\napp.register(websocket);\n\n// Register static file serving for SDK\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\napp.register(staticPlugin, {\n root: path.join(__dirname, \"../public\"),\n prefix: \"/\",\n});\n\n// Error handler\napp.setErrorHandler((error, request, reply) => {\n const context = {\n \"x-tenant-id\": getHeaderValue(request.headers[\"x-tenant-id\"]),\n \"x-request-id\": getHeaderValue(request.headers[\"x-request-id\"]),\n \"x-user-id\": getHeaderValue(request.headers[\"x-user-id\"]),\n };\n logger.error(\n `请求错误: ${request.method} ${request.url} error:${error.message}`,\n {\n ...context,\n error: error.message,\n stack: error.stack,\n statusCode: error.statusCode || 500,\n }\n );\n reply.status(error.statusCode || 500).send({\n success: false,\n error: error.message || \"服务器内部错误\",\n });\n});\n\n// Logger lattice will be decorated in start() function\n\n/**\n * Logger configuration for gateway\n */\nexport interface GatewayLoggerConfig {\n name?: string;\n description?: string;\n type?: LoggerType;\n serviceName?: string;\n loggerName?: string;\n file?: string | PinoFileOptions;\n context?: Record<string, any>;\n}\n\n// Gateway configuration interface\nexport interface LatticeGatewayConfig {\n port?: number;\n queueServiceConfig?: {\n type: QueueServiceType;\n defaultStartPollingQueue: boolean;\n };\n loggerConfig?: Partial<GatewayLoggerConfig>; // Optional logger configuration to override defaults\n}\n\nfunction getConfiguredSandboxProvider(): ReturnType<typeof createSandboxProvider> {\n const sandboxProviderType =\n (process.env.SANDBOX_PROVIDER_TYPE as CreateSandboxProviderConfig[\"type\"] | undefined) ||\n \"microsandbox-remote\";\n\n return createSandboxProvider({\n type: sandboxProviderType,\n remoteBaseURL: process.env.SANDBOX_BASE_URL,\n microsandboxServiceBaseURL: process.env.MICROSANDBOX_SERVICE_BASE_URL,\n e2bApiKey: process.env.E2B_API_KEY,\n e2bTemplate: process.env.E2B_TEMPLATE,\n e2bTimeoutMs: process.env.E2B_TIMEOUT_MS\n ? parseInt(process.env.E2B_TIMEOUT_MS, 10)\n : undefined,\n daytonaApiKey: process.env.DAYTONA_API_KEY,\n daytonaApiUrl: process.env.DAYTONA_API_URL,\n daytonaTarget: process.env.DAYTONA_TARGET,\n daytonaTimeout: process.env.DAYTONA_TIMEOUT\n ? parseInt(process.env.DAYTONA_TIMEOUT, 10)\n : undefined,\n daytonaVolumeName: process.env.DAYTONA_VOLUME_NAME,\n });\n}\n\n/**\n * Restore MCP server connections that were connected before gateway shutdown.\n * Loads configs with status \"connected\" from the store and reconnects them.\n */\nasync function restoreMcpConnections(): Promise<void> {\n try {\n const storeLattice = getStoreLattice(\"default\", \"mcp\");\n const store = storeLattice.store as McpServerConfigStore;\n if (!store) {\n logger.info(\"MCP store not configured, skipping connection restoration\");\n return;\n }\n\n const configs = await store.getAllConfigs(\"default\");\n const connectedConfigs = configs.filter((c) => c.status === \"connected\");\n\n if (connectedConfigs.length === 0) return;\n\n logger.info(`Restoring ${connectedConfigs.length} MCP server connections...`);\n\n const { convertToConnection } = await import(\"./controllers/mcp-configs\");\n\n for (const config of connectedConfigs) {\n try {\n const connection = convertToConnection(config.config);\n mcpManager.addServer(config.key, connection);\n } catch (err) {\n logger.warn(`Failed to prepare MCP server \"${config.key}\" for restoration`, { error: err });\n }\n }\n\n await mcpManager.connect();\n\n for (const config of connectedConfigs) {\n try {\n await mcpManager.registerToolsToToolLattice(config.key, config.selectedTools);\n logger.info(`MCP server \"${config.key}\" restored with ${config.selectedTools.length} tools`);\n } catch (err) {\n logger.warn(`Failed to register tools for MCP server \"${config.key}\"`, { error: err });\n }\n }\n\n logger.info(`MCP connection restoration complete: ${connectedConfigs.length} servers`);\n } catch (err) {\n logger.error(\"MCP connection restoration failed\", { error: err });\n }\n}\n\n// Start server\nconst start = async (config?: LatticeGatewayConfig) => {\n try {\n // Initialize or update logger configuration if provided\n if (config?.loggerConfig) {\n const loggerConfig: LoggerConfig = {\n ...DEFAULT_LOGGER_CONFIG,\n ...config.loggerConfig,\n // Merge file config if provided\n file: config.loggerConfig.file || DEFAULT_LOGGER_CONFIG.file,\n };\n loggerLattice = initializeLogger(loggerConfig);\n logger = loggerLattice.client;\n }\n\n // Decorate app with logger lattice (only once, in start function)\n // Access via: request.server.loggerLattice or app.loggerLattice\n app.decorate(\"loggerLattice\", loggerLattice);\n\n // Channel infrastructure: use stores from StoreLatticeManager.\n // Applications (e.g. deep_research) register stores via configureStores()\n // before calling startAsHttpEndpoint(). If no stores are registered,\n // channel features are gracefully skipped.\n let channelDeps: { router: MessageRouter; installationStore: ChannelInstallationStore } | undefined;\n const adapterRegistry = new ChannelAdapterRegistry();\n adapterRegistry.register(larkChannelAdapter);\n const { wechatChannelAdapter } = await import(\"./channels/wechat/WechatChannelAdapter\");\n adapterRegistry.register(wechatChannelAdapter);\n try {\n const { getStoreLattice: getStore } = await import(\"@axiom-lattice/core\");\n const bindingStore = getStore(\"default\", \"channelBinding\").store as BindingRegistry;\n const installationStore = getStore(\"default\", \"channelInstallation\").store as ChannelInstallationStore;\n\n setBindingRegistry(bindingStore);\n\n const router = new MessageRouter({\n middlewares: [\n createDeduplicationMiddleware(),\n createRateLimitMiddleware(),\n createAuditLoggerMiddleware(),\n ],\n bindingRegistry: bindingStore,\n adapterRegistry,\n installationStore,\n \n });\n\n channelDeps = { router, installationStore };\n } catch (err) {\n logger.warn(\"Channel infrastructure unavailable\", {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n\n setEvalRunService(evalRunner);\n\n // Initialize MenuRegistry for custom menu items\n try {\n const menuStore = getStoreLattice(\"default\", \"menu\").store;\n setMenuRegistry(menuStore);\n logger.info(\"Menu registry initialized\");\n } catch {\n // Menu store optional — custom menus won't work without it\n }\n\n // Register export/import entity types before routes\n registerAllBuiltinEntities();\n\n // Register all routes (channel routes only active if channelDeps is set)\n // Wire controller deps so enable/disable/delete can manage live connections\n if (channelDeps?.router) {\n setChannelControllerDeps({ adapterRegistry, router: channelDeps.router });\n }\n registerLatticeRoutes(app, channelDeps);\n\n // Register standard A2A 0.3 endpoints (agent card + JSON-RPC + test-call)\n // and the internal A2A key management routes.\n try {\n const { A2AAuthService, parseEnvKeys } = await import(\"./services/a2a/A2AAuthService\");\n const { registerA2AStandardRoutes } = await import(\"./routes/a2a-standard\");\n const a2a = await import(\"./routes/a2a\");\n\n const a2aKeyStore = getStoreLattice(\"default\", \"a2aApiKey\").store as A2AApiKeyStore;\n const assistantStore = getStoreLattice(\"default\", \"assistant\").store as AssistantStore;\n const projectStore = getStoreLattice(\"default\", \"project\").store as ProjectStore;\n const taskStore = getStoreLattice(\"default\", \"task\").store as TaskStore;\n\n const authService = new A2AAuthService({\n keyStore: a2aKeyStore,\n assistantStore,\n projectStore,\n envKeyMap: parseEnvKeys(process.env.A2A_API_KEYS || \"\"),\n allowUnauthenticated: process.env.A2A_ALLOW_UNAUTHENTICATED === \"true\",\n });\n await authService.refresh();\n\n a2a.setA2AKeyStore(a2aKeyStore);\n a2a.setA2AAuthService(authService);\n\n registerA2AStandardRoutes(app, {\n authService,\n getTaskStoreLattice: () => taskStore,\n getAssistantStore: () => assistantStore,\n getProjectStore: () => projectStore,\n });\n a2a.registerA2ARoutes(app);\n logger.info(\"A2A standard routes registered\");\n } catch (err) {\n logger.warn(\"A2A standard routes unavailable\", {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n\n // Register sandbox manager if not already registered\n if (!sandboxLatticeManager.hasLattice(\"default\")) {\n sandboxLatticeManager.registerLattice(\"default\", getConfiguredSandboxProvider());\n logger.info(\"Registered sandbox manager from env configuration\");\n }\n\n // Initialize resource share controller\n try {\n const { ResourceController } = await import(\"./controllers/resources\");\n const sharedResourceStore = getStoreLattice(\"default\", \"sharedResource\").store;\n const cache = new TokenCache();\n const resourceController = new ResourceController({\n store: sharedResourceStore,\n sandboxManager: sandboxLatticeManager,\n cache,\n logger,\n });\n registerResourceRoutes(app, resourceController);\n logger.info(\"Resource share routes registered\");\n } catch (err) {\n logger.warn(\"Resource share infrastructure unavailable\", {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n\n // Connect all enabled channel installations\n if (channelDeps && process.env.CHANNELS_ENABLED !== \"false\") {\n const { connectAllChannels } = await import(\"@axiom-lattice/core\");\n try {\n await connectAllChannels(\n (channel) => adapterRegistry.get(channel),\n { deps: { router: channelDeps.router } },\n );\n } catch (err) {\n logger.error(\"Failed to start channel connections\", {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const target_port = config?.port || Number(process.env.PORT) || 4001;\n\n await app.listen({ port: target_port, host: \"0.0.0.0\" });\n logger.info(`Lattice Gateway is running on port: ${target_port}`);\n\n // Configure queue service\n const queueServiceConfig = config?.queueServiceConfig;\n if (queueServiceConfig) {\n setQueueServiceType(queueServiceConfig.type);\n if (queueServiceConfig.defaultStartPollingQueue) {\n const agentTaskConsumer = new AgentTaskConsumer(target_port);\n agentTaskConsumer.startPollingQueue();\n }\n }\n\n // Restore agent instances with pending messages (fire-and-forget to avoid blocking startup)\n // Temporarily disabled: do not auto-consume pending messages on startup.\n if (process.env.AXIOM_RESTORE_PENDING_ON_STARTUP === \"true\") {\n agentInstanceManager.restore()\n .then((stats) => {\n logger.info(`Agent recovery complete: ${stats.restored} threads restored, ${stats.errors} errors`);\n })\n .catch((error) => {\n logger.error(\"Agent recovery failed\", { error });\n });\n }\n\n // Restore MCP server connections that were connected before shutdown\n restoreMcpConnections().catch((error) => {\n logger.error(\"MCP connection restoration failed\", { error });\n });\n } catch (err) {\n logger.error(\"Server start failed\", { error: err });\n process.exit(1);\n }\n};\n\nconst LatticeGateway = {\n startAsHttpEndpoint: start,\n configureSwagger,\n registerLatticeRoutes,\n app,\n AgentTaskConsumer,\n};\n\nexport { LatticeGateway };\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { agentInstanceManager, getStoreLattice } from \"@axiom-lattice/core\";\nimport type {\n Assistant,\n CreateAssistantRequest,\n} from \"@axiom-lattice/protocols\";\nimport { AgentType } from \"@axiom-lattice/protocols\";\nimport type { A2ARemoteAgentConfig } from \"@axiom-lattice/protocols\";\nimport { randomUUID } from \"crypto\";\nimport type { AgentConfig } from \"@axiom-lattice/core\";\nimport { agentLatticeManager, eventBus } from \"@axiom-lattice/core\";\nimport { localA2AService } from \"../services/local-a2a\";\nimport { normalizeA2AAgentCardUrl } from \"../utils/a2a-url\";\nimport {\n getAgentCardPort,\n validateLocalRuntimeCommand,\n validateLocalRuntimePort,\n} from \"../utils/local-a2a-runtime\";\n\n/**\n * Assistant Controller\n * Handles assistant-related CRUD operations\n * Merges code-configured agents (from @axiom-lattice/core) with in-memory stored assistants\n * GET operations return both code-configured and stored assistants\n * CUD operations only work on stored assistants\n */\n\n/**\n * Get tenant ID from authenticated user context\n * Falls back to request headers for backward compatibility\n */\nfunction getTenantId(request: FastifyRequest): string {\n // First try to get from authenticated user context\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) {\n return userTenantId;\n }\n\n // Fallback to request headers for backward compatibility\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\nfunction getUserId(request: FastifyRequest): string | undefined {\n const userId = (request as any).user?.id;\n if (userId) return userId;\n return (request.headers[\"x-user-id\"] as string) || undefined;\n}\n\n/**\n * Convert AgentConfig to Assistant format\n */\nfunction convertAgentConfigToAssistant(config: AgentConfig): Assistant {\n return {\n id: config.key,\n tenantId: \"default\", // Code-configured agents belong to default tenant\n name: config.name,\n description: config.description,\n graphDefinition: config, // Store the full config as graphDefinition\n createdAt: new Date(0), // Code-configured agents have no creation date\n updatedAt: new Date(0), // Code-configured agents have no update date\n };\n}\n\n/**\n * Assistant list response interface\n */\ninterface AssistantListResponse {\n success: boolean;\n message: string;\n data: {\n records: Assistant[];\n total: number;\n };\n}\n\n/**\n * Assistant response interface\n */\ninterface AssistantResponse {\n success: boolean;\n message: string;\n data?: Assistant;\n}\n\n/**\n * Assistant update request body interface\n */\ninterface AssistantUpdateBody {\n name?: string;\n description?: string;\n graphDefinition?: any;\n}\n\n/**\n * Get list of all assistants\n * Merges code-configured agents with stored assistants\n */\nexport async function getAssistantList(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<AssistantListResponse> {\n const tenantId = getTenantId(request);\n\n // Get code-configured agents for the tenant\n const agentConfigs = await agentLatticeManager.getAllAgentConfigsByTenant(tenantId);\n const codeConfiguredAssistants = agentConfigs.map(\n convertAgentConfigToAssistant\n );\n\n // Get stored assistants for the tenant\n const storeLattice = getStoreLattice(\"default\", \"assistant\");\n const assistantStore = storeLattice.store;\n const storedAssistants = await assistantStore.getAllAssistants(tenantId);\n\n // Merge both sources, stored assistants take precedence if ID conflicts\n const assistantMap = new Map<string, Assistant>();\n\n // First add code-configured agents\n codeConfiguredAssistants.forEach((assistant) => {\n assistantMap.set(assistant.id, assistant);\n });\n\n // Then add stored assistants (overwrite if ID exists)\n storedAssistants.forEach((assistant) => {\n assistantMap.set(assistant.id, assistant);\n });\n\n const allAssistants = Array.from(assistantMap.values());\n\n // Filter: exclude personal assistants owned by other users\n const userId = getUserId(request);\n const filtered = allAssistants.filter((a) => {\n if (!a.ownerUserId) return true;\n return a.ownerUserId === userId;\n });\n\n return {\n success: true,\n message: \"Successfully retrieved assistant list\",\n data: {\n records: filtered,\n total: filtered.length,\n },\n };\n}\n\n/**\n * Get a single assistant by ID\n * Checks both code-configured agents and stored assistants\n */\nexport async function getAssistant(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n): Promise<AssistantResponse> {\n const { id } = request.params;\n const tenantId = getTenantId(request);\n\n // First check stored assistants\n const storeLattice = getStoreLattice(\"default\", \"assistant\");\n const assistantStore = storeLattice.store;\n let assistant = await assistantStore.getAssistantById(tenantId, id);\n\n // If not found in store, check code-configured agents for the tenant\n if (!assistant) {\n const agentConfig = await agentLatticeManager.getAgentConfigWithTenant(tenantId, id);\n if (agentConfig) {\n assistant = convertAgentConfigToAssistant(agentConfig);\n }\n }\n\n if (!assistant) {\n return reply.status(404).send({\n success: false,\n message: \"Assistant not found\",\n });\n }\n\n return {\n success: true,\n message: \"Successfully retrieved assistant\",\n data: assistant,\n };\n}\n\n/**\n * Upsert assistant - create if not exists in store, update if exists\n */\nasync function upsertAssistant(\n tenantId: string,\n id: string,\n data: CreateAssistantRequest | AssistantUpdateBody,\n reply: FastifyReply,\n requireFields: boolean = false\n): Promise<AssistantResponse> {\n const storeLattice = getStoreLattice(\"default\", \"assistant\");\n const assistantStore = storeLattice.store;\n\n const exists = await assistantStore.hasAssistant(tenantId, id);\n\n let assistant: Assistant | null;\n if (exists) {\n assistant = await assistantStore.updateAssistant(tenantId, id, data);\n if (!assistant) {\n return reply.status(500).send({\n success: false,\n message: \"Failed to update assistant\",\n });\n }\n eventBus.publish(\"assistant:updated\", { id: assistant.id, name: assistant.name, tenantId });\n return {\n success: true,\n message: \"Updated assistant\",\n data: assistant,\n };\n }\n\n if (requireFields) {\n const createData = data as CreateAssistantRequest;\n if (!createData.name || !createData.graphDefinition) {\n return reply.status(400).send({\n success: false,\n message: \"name and graphDefinition are required\",\n });\n }\n }\n\n assistant = await assistantStore.createAssistant(tenantId, id, data as CreateAssistantRequest);\n eventBus.publish(\"assistant:created\", { id: assistant.id, name: assistant.name, tenantId });\n return reply.status(201).send({\n success: true,\n message: \"Created assistant\",\n data: assistant,\n });\n}\n\n/**\n * Create a new assistant\n */\nexport async function createAssistant(\n request: FastifyRequest<{ Body: CreateAssistantRequest & { id?: string } }>,\n reply: FastifyReply\n): Promise<AssistantResponse> {\n const tenantId = getTenantId(request);\n const data = request.body;\n\n if (!data.name || !data.graphDefinition) {\n return reply.status(400).send({\n success: false,\n message: \"name and graphDefinition are required\",\n });\n }\n\n const id = data.id ?? randomUUID();\n\n // A2A_REMOTE: validate agentCardUrl, check localRuntime conflicts\n if (\n data.graphDefinition &&\n (data.graphDefinition as AgentConfig).type === AgentType.A2A_REMOTE\n ) {\n const a2aConfig = data.graphDefinition as A2ARemoteAgentConfig;\n const warnings: string[] = [];\n const isLocalManaged = !!a2aConfig.localRuntime;\n a2aConfig.agentCardUrl = normalizeA2AAgentCardUrl(\n a2aConfig.agentCardUrl,\n isLocalManaged ? \"http://\" : \"https://\",\n );\n\n if (a2aConfig.localRuntime) {\n const commandValidation = validateLocalRuntimeCommand(\n a2aConfig.localRuntime,\n );\n if (!commandValidation.ok) {\n return reply.status(400).send({\n success: false,\n message: commandValidation.error,\n });\n }\n a2aConfig.localRuntime.command.executable =\n a2aConfig.localRuntime.command.executable.trim();\n\n a2aConfig.localRuntime.agentCardUrl = normalizeA2AAgentCardUrl(\n a2aConfig.localRuntime.agentCardUrl || a2aConfig.agentCardUrl,\n \"http://\",\n );\n a2aConfig.agentCardUrl = a2aConfig.localRuntime.agentCardUrl;\n\n const portValidation = validateLocalRuntimePort(\n a2aConfig.localRuntime,\n a2aConfig.agentCardUrl,\n );\n if (!portValidation.ok) {\n return reply.status(400).send({\n success: false,\n message: portValidation.error,\n });\n }\n }\n\n if (a2aConfig.localRuntime) {\n const existingAssistants = await getStoreLattice(\"default\", \"assistant\").store.getAllAssistants(tenantId);\n const targetPort = getAgentCardPort(a2aConfig.localRuntime.agentCardUrl);\n const duplicate = existingAssistants.find((a) => {\n if (a.id === id) return false;\n const gd = a.graphDefinition && typeof a.graphDefinition === \"object\"\n ? a.graphDefinition\n : undefined;\n if (!gd || (gd as { type?: unknown }).type !== AgentType.A2A_REMOTE) return false;\n const lr = (gd as A2ARemoteAgentConfig).localRuntime;\n if (!lr) return false;\n const existingAgentCardUrl = normalizeA2AAgentCardUrl(lr.agentCardUrl, \"http://\");\n const existingPort = getAgentCardPort(existingAgentCardUrl);\n if (targetPort !== null && existingPort !== null) {\n return existingPort === targetPort;\n }\n return existingAgentCardUrl === a2aConfig.localRuntime!.agentCardUrl;\n });\n if (duplicate) {\n const conflictDetail = targetPort === null\n ? `agentCardUrl \"${a2aConfig.localRuntime.agentCardUrl}\"`\n : `port ${targetPort}`;\n return reply.status(409).send({\n success: false,\n message: `A local managed A2A assistant using ${conflictDetail} already exists: \"${duplicate.name}\". Each local managed A2A assistant needs a unique port.`,\n });\n }\n }\n\n // Validate agentCardUrl reachability (non-blocking)\n try {\n const resp = await fetch(a2aConfig.agentCardUrl, {\n signal: AbortSignal.timeout(5000),\n });\n if (!resp.ok) {\n warnings.push(`agentCardUrl returned HTTP ${resp.status}`);\n }\n } catch {\n warnings.push(`agentCardUrl is not reachable: ${a2aConfig.agentCardUrl}`);\n }\n\n if (warnings.length > 0) {\n console.warn(`[createAssistant] A2A warnings for ${a2aConfig.agentCardUrl}:`, warnings);\n }\n }\n\n return upsertAssistant(tenantId, id, data, reply, true);\n}\n\n/**\n * Update an existing assistant by ID\n */\nexport async function updateAssistant(\n request: FastifyRequest<{\n Params: { id: string };\n Body: AssistantUpdateBody;\n }>,\n reply: FastifyReply\n): Promise<AssistantResponse> {\n const tenantId = getTenantId(request);\n const { id } = request.params;\n const updates = request.body;\n\n return upsertAssistant(tenantId, id, updates, reply, false);\n}\n\n/**\n * Delete an assistant by ID\n * For stored assistants: deletes from store\n * For local A2A agents: stops provider, unregisters from lattice, then deletes from store\n * For code-configured assistants: only deletes from store if exists (code registration remains)\n */\nexport async function deleteAssistant(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string }> {\n const tenantId = getTenantId(request);\n const { id } = request.params;\n\n const storeLattice = getStoreLattice(\"default\", \"assistant\");\n const assistantStore = storeLattice.store;\n\n const storedAssistant = await assistantStore.getAssistantById(tenantId, id);\n const graphDefinition = storedAssistant?.graphDefinition;\n const hasLocalRuntime =\n graphDefinition && typeof graphDefinition === \"object\"\n ? !!(graphDefinition as A2ARemoteAgentConfig).localRuntime\n : false;\n\n if (storedAssistant && hasLocalRuntime) {\n localA2AService.removeState(id);\n const deleted = await assistantStore.deleteAssistant(tenantId, id);\n if (!deleted) {\n return reply.status(500).send({\n success: false,\n message: \"Failed to delete assistant\",\n });\n }\n eventBus.publish(\"assistant:deleted\", { id, tenantId });\n return {\n success: true,\n message: \"Deleted local A2A assistant\",\n };\n }\n\n const agentConfig = await agentLatticeManager.getAgentConfigWithTenant(tenantId, id);\n const isCodeConfigured = !!agentConfig;\n\n if (isCodeConfigured) {\n if (!storedAssistant) {\n return reply.status(404).send({\n success: false,\n message: \"Assistant not found (code-configured assistants cannot be deleted from code, only from store)\",\n });\n }\n await assistantStore.deleteAssistant(tenantId, id);\n eventBus.publish(\"assistant:deleted\", { id, tenantId });\n return {\n success: true,\n message: \"Deleted assistant from store (code-configured registration remains)\",\n };\n }\n\n if (!storedAssistant) {\n return reply.status(404).send({\n success: false,\n message: \"Assistant not found\",\n });\n }\n\n const deleted = await assistantStore.deleteAssistant(tenantId, id);\n\n if (!deleted) {\n return reply.status(500).send({\n success: false,\n message: \"Failed to delete assistant\",\n });\n }\n\n eventBus.publish(\"assistant:deleted\", { id, tenantId });\n\n // Clean up UserTenantLink metadata if this was a personal assistant\n const userId = getUserId(request);\n if (userId) {\n try {\n const linkStore = getStoreLattice(\"default\", \"userTenantLink\").store;\n const link = await linkStore.getLink(userId, tenantId);\n const meta = (link?.metadata || {}) as Record<string, unknown>;\n if (meta.personalAssistantId === id) {\n delete meta.personalAssistantId;\n delete meta.personalProjectId;\n delete meta.personalWorkspaceId;\n await linkStore.updateLink(userId, tenantId, { metadata: meta } as any);\n }\n } catch { /* best effort */ }\n }\n\n return {\n success: true,\n message: \"Successfully deleted assistant\",\n };\n}\n\n/**\n * Get agent graph visualization\n */\nexport const getAgentGraph = async (\n request: FastifyRequest<{\n Params: { assistantId: string };\n }>,\n reply: FastifyReply\n) => {\n try {\n const { assistantId } = request.params;\n const tenant_id = getTenantId(request);\n\n const agent = agentInstanceManager.getAgent({ assistant_id: assistantId, tenant_id, thread_id: '' })\n\n // Call drawing service to get image data\n const imageData = await agent.get_draw_graph()\n\n // Set response header and return image data\n reply.header(\"Content-Type\", \"application/json\").send({\n image: imageData,\n });\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: error.message || \"Failed to get agent graph\",\n });\n }\n};\n\n/**\n * Aggregate runtime + eval stats for all assistants (governance card metrics).\n *\n * For each assistant:\n * - threads: total count, 7d/30d activity, last activity, daily activity arrays\n * - eval: latest score, pass rate, recent score trend (from the eval-{agentId} project)\n *\n * Results are cached per tenant for STATS_CACHE_TTL_MS (5 minutes): the\n * aggregation touches every assistant's threads and eval runs, so the card\n * grid should read from cache rather than recompute on every render.\n */\nconst STATS_CACHE_TTL_MS = 5 * 60 * 1000;\nconst statsCache = new Map<string, { data: unknown; expiresAt: number }>();\n\ninterface StatsCacheInfo {\n /** When this cached snapshot expires (ISO). */\n expiresAt: string;\n /** Milliseconds remaining until expiry. */\n remainingMs: number;\n /** Whether this response was served from cache. */\n cached: boolean;\n}\n\nexport async function getAssistantStats(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string; data?: unknown; cache?: StatsCacheInfo }> {\n const tenantId = getTenantId(request);\n\n // Serve from cache when fresh.\n const cached = statsCache.get(tenantId);\n if (cached && cached.expiresAt > Date.now()) {\n return {\n success: true,\n message: \"Ok (cached)\",\n data: cached.data,\n cache: {\n expiresAt: new Date(cached.expiresAt).toISOString(),\n remainingMs: cached.expiresAt - Date.now(),\n cached: true,\n },\n };\n }\n\n try {\n // Resolve assistants (same merge as getAssistantList).\n const agentConfigs = await agentLatticeManager.getAllAgentConfigsByTenant(tenantId);\n const codeConfiguredAssistants = agentConfigs.map(convertAgentConfigToAssistant);\n const storeLattice = getStoreLattice(\"default\", \"assistant\");\n const assistantStore = storeLattice.store;\n const storedAssistants = await assistantStore.getAllAssistants(tenantId);\n\n const assistantMap = new Map<string, Assistant>();\n codeConfiguredAssistants.forEach((a) => assistantMap.set(a.id, a));\n storedAssistants.forEach((a) => assistantMap.set(a.id, a));\n\n const userId = getUserId(request);\n const assistants = Array.from(assistantMap.values()).filter((a) => {\n if (!a.ownerUserId) return true;\n return a.ownerUserId === userId;\n });\n\n // Load threads + eval data in parallel.\n const threadStore = getStoreLattice(\"default\", \"thread\").store;\n const evalStore = getStoreLattice(\"default\", \"eval\").store;\n\n const now = Date.now();\n const ms7d = 7 * 86400000;\n const ms30d = 30 * 86400000;\n\n const records = await Promise.all(\n assistants.map(async (assistant) => {\n // ── Threads ──\n let threadCount = 0;\n let last7d = 0;\n let last30d = 0;\n let lastActive: Date | null = null;\n const daily7d: number[] = new Array(7).fill(0);\n const daily30d: number[] = new Array(30).fill(0);\n try {\n const threads = await threadStore.getThreadsByAssistantId(tenantId, assistant.id);\n threadCount = threads.length;\n for (const t of threads) {\n const created = new Date(t.createdAt).getTime();\n if (created >= now - ms7d) last7d++;\n if (created >= now - ms30d) last30d++;\n const idx7 = Math.floor((now - created) / 86400000);\n if (idx7 >= 0 && idx7 < 7) daily7d[6 - idx7]++;\n const idx30 = Math.floor((now - created) / 86400000);\n if (idx30 >= 0 && idx30 < 30) daily30d[29 - idx30]++;\n const updated = new Date(t.updatedAt).getTime();\n if (lastActive === null || updated > lastActive.getTime()) {\n lastActive = new Date(t.updatedAt);\n }\n }\n } catch { /* thread store unavailable — zeros */ }\n\n // ── Eval ──\n let evalScore: number | null = null;\n let evalPassRate: number | null = null;\n let evalRuns = 0;\n let evalTrend: number[] = [];\n try {\n const projects = await evalStore.getProjectsByTenant(tenantId);\n const project = projects.find((p: any) => p.name === `eval-${assistant.id}`);\n if (project) {\n const runs = await evalStore.getRunsByTenant(tenantId, { projectId: project.id });\n evalRuns = runs.length;\n const sorted = [...runs].sort(\n (a: any, b: any) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()\n );\n evalTrend = sorted\n .map((r: any) => (typeof r.avgScore === \"number\" ? r.avgScore : null))\n .filter((v): v is number => v !== null);\n const latest: any = sorted[sorted.length - 1];\n if (latest) {\n evalScore = typeof latest.avgScore === \"number\" ? latest.avgScore : null;\n if (latest.totalCases > 0) {\n evalPassRate = Math.round((latest.passedCases / latest.totalCases) * 100);\n }\n }\n }\n } catch { /* eval store unavailable — nulls */ }\n\n return {\n id: assistant.id,\n threadCount,\n last7d,\n last30d,\n lastActive: lastActive ? lastActive.toISOString() : null,\n daily7d,\n daily30d,\n evalScore,\n evalPassRate,\n evalRuns,\n evalTrend: evalTrend.slice(-8),\n };\n })\n );\n\n const payload = { records };\n const expiresAt = Date.now() + STATS_CACHE_TTL_MS;\n statsCache.set(tenantId, { data: payload, expiresAt });\n return {\n success: true,\n message: \"Ok\",\n data: payload,\n cache: {\n expiresAt: new Date(expiresAt).toISOString(),\n remainingMs: STATS_CACHE_TTL_MS,\n cached: false,\n },\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to get assistant stats\";\n return reply.status(500).send({ success: false, message });\n }\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { existsSync, statSync } from \"node:fs\";\nimport { dirname, join, parse, resolve } from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport {\n type LocalA2AProviderState,\n type LocalRuntimeConfig,\n} from \"@axiom-lattice/protocols\";\n\ninterface LocalA2AProcessState extends LocalA2AProviderState {\n enabled: boolean;\n localRuntime?: LocalRuntimeConfig;\n process?: ChildProcess;\n}\n\nconst STDERR_TAIL_LIMIT = 4096;\n\nfunction readBooleanEnv(\n name: string,\n defaultValue: boolean,\n env: NodeJS.ProcessEnv = process.env,\n): boolean {\n const value = env[name];\n if (value === undefined) return defaultValue;\n return value === \"1\" || value.toLowerCase() === \"true\";\n}\n\nexport function findWorkspaceRoot(startDir: string): string | null {\n let current = resolve(startDir);\n\n const { root } = parse(current);\n\n while (current !== root) {\n if (existsSync(join(current, \"pnpm-workspace.yaml\"))) {\n return current;\n }\n\n const parent = dirname(current);\n if (parent === current) return null;\n current = parent;\n }\n\n return null;\n}\n\nexport function resolveLocalA2AWorkingDirectory(options: {\n envWorkdir?: string;\n commandCwd?: string;\n currentCwd: string;\n}): string {\n if (options.envWorkdir) return options.envWorkdir;\n if (options.commandCwd) return options.commandCwd;\n return findWorkspaceRoot(options.currentCwd) || options.currentCwd;\n}\n\nfunction validateWorkingDirectory(cwd: string): string | null {\n try {\n const stat = statSync(cwd);\n if (!stat.isDirectory()) {\n return `Working directory is not a directory: ${cwd}`;\n }\n return null;\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return `Working directory is not accessible: ${cwd} (${message})`;\n }\n}\n\nexport function appendStderrTail(current: string, chunk: string): string {\n const next = `${current}${chunk}`;\n if (next.length <= STDERR_TAIL_LIMIT) return next;\n return next.slice(-STDERR_TAIL_LIMIT);\n}\n\nfunction formatExitMessage(exitReason: string | number, stderrTail: string): string {\n const stderr = stderrTail.trim();\n return stderr\n ? `Exited before becoming ready (${exitReason}): ${stderr}`\n : `Exited before becoming ready (${exitReason})`;\n}\n\nasync function probeReady(\n agentCardUrl: string,\n healthUrl: string | undefined,\n timeoutMs: number,\n): Promise<boolean> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n if (healthUrl) {\n const resp = await fetch(healthUrl, { signal: controller.signal });\n if (!resp.ok) return false;\n }\n const cardResp = await fetch(agentCardUrl, { signal: controller.signal });\n return cardResp.ok;\n } catch {\n return false;\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport class LocalA2AService {\n private static instance: LocalA2AService | null = null;\n private states: Map<string, LocalA2AProcessState> = new Map();\n private autoStartEnabled: boolean;\n\n constructor() {\n this.autoStartEnabled = readBooleanEnv(\"LOCAL_A2A_AUTO_START\", true);\n }\n\n public static getInstance(): LocalA2AService {\n if (!LocalA2AService.instance) {\n LocalA2AService.instance = new LocalA2AService();\n }\n return LocalA2AService.instance;\n }\n\n getOrCreateState(\n runtimeId: string,\n localRuntime: LocalRuntimeConfig,\n ): LocalA2AProcessState {\n let state = this.states.get(runtimeId);\n if (!state) {\n state = {\n runtimeId,\n label: localRuntime.label || runtimeId,\n status: this.autoStartEnabled ? \"stopped\" : \"disabled\",\n enabled: this.autoStartEnabled,\n assistantId: runtimeId,\n agentCardUrl: localRuntime.agentCardUrl,\n healthUrl: localRuntime.healthUrl,\n localRuntime,\n };\n this.states.set(runtimeId, state);\n } else {\n state.localRuntime = localRuntime;\n state.label = localRuntime.label || state.label;\n state.agentCardUrl = localRuntime.agentCardUrl;\n state.healthUrl = localRuntime.healthUrl;\n }\n return state;\n }\n\n async getRegisteredState(\n runtimeId: string,\n localRuntime: LocalRuntimeConfig,\n ): Promise<LocalA2AProviderState> {\n const state = this.getOrCreateState(runtimeId, localRuntime);\n\n if (state.process && state.status === \"running\") {\n const alive = await probeReady(\n localRuntime.agentCardUrl,\n localRuntime.healthUrl,\n 2000,\n );\n if (!alive) {\n state.process = undefined;\n state.pid = undefined;\n state.status = \"stopped\";\n state.message = \"Process exited unexpectedly\";\n }\n }\n\n return this.snapshotState(state);\n }\n\n async startProvider(\n runtimeId: string,\n localRuntime: LocalRuntimeConfig,\n ): Promise<LocalA2AProviderState> {\n const state = this.getOrCreateState(runtimeId, localRuntime);\n\n if (!state.enabled) {\n state.status = \"disabled\";\n state.message = \"Disabled by configuration\";\n return this.snapshotState(state);\n }\n\n if (state.process && state.status === \"running\") {\n return this.snapshotState(state);\n }\n\n state.enabled = true;\n const { executable, args, cwd, env: cmdEnv } = localRuntime.command;\n const resolvedCwd = resolveLocalA2AWorkingDirectory({\n envWorkdir: process.env.LOCAL_A2A_WORKDIR || undefined,\n commandCwd: cwd,\n currentCwd: process.cwd(),\n });\n const cwdError = validateWorkingDirectory(resolvedCwd);\n if (cwdError) {\n state.process = undefined;\n state.pid = undefined;\n state.status = \"failed\";\n state.message = cwdError;\n return this.snapshotState(state);\n }\n\n state.status = \"starting\";\n state.message = \"Starting\";\n let stderrTail = \"\";\n\n const childEnv = cmdEnv ? { ...process.env, ...cmdEnv } : process.env;\n\n const child = spawn(executable, args, {\n cwd: resolvedCwd,\n env: childEnv,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: false,\n });\n\n state.process = child;\n state.pid = child.pid ?? undefined;\n\n child.once(\"error\", (error: Error) => {\n const current = this.states.get(runtimeId);\n if (!current) return;\n current.process = undefined;\n current.pid = undefined;\n current.status = \"failed\";\n const stderr = stderrTail.trim();\n current.message = stderr\n ? `Failed to start: ${error.message}: ${stderr}`\n : `Failed to start: ${error.message}`;\n });\n\n child.stdout.on(\"data\", (chunk: Buffer) => {\n const text = chunk.toString(\"utf8\").trim();\n if (text) console.log(`[local-a2a:${runtimeId}] ${text}`);\n });\n child.stderr.on(\"data\", (chunk: Buffer) => {\n const rawText = chunk.toString(\"utf8\");\n stderrTail = appendStderrTail(stderrTail, rawText);\n const text = rawText.trim();\n if (text) console.error(`[local-a2a:${runtimeId}] ${text}`);\n });\n child.on(\"close\", (code, signal) => {\n const current = this.states.get(runtimeId);\n if (!current) return;\n current.process = undefined;\n current.pid = undefined;\n const exitReason = signal ?? code ?? \"unknown\";\n if (current.status === \"running\") {\n current.status = \"stopped\";\n current.message = `Stopped (${exitReason})`;\n } else if (current.status === \"starting\") {\n current.status = \"failed\";\n current.message = formatExitMessage(exitReason, stderrTail);\n }\n });\n\n const ready = await this.waitUntilReady(localRuntime, state, 15000);\n if (!ready) {\n if (state.process) {\n state.process.kill(\"SIGTERM\");\n }\n state.process = undefined;\n state.pid = undefined;\n if ((state.status as string) !== \"failed\") {\n state.status = \"failed\";\n state.message = \"Server did not become ready\";\n }\n return this.snapshotState(state);\n }\n\n state.status = \"running\";\n state.message = \"Running\";\n state.lastStartedAt = new Date().toISOString();\n return this.snapshotState(state);\n }\n\n async stopProvider(runtimeId: string): Promise<LocalA2AProviderState> {\n const state = this.states.get(runtimeId);\n if (!state) {\n return this.emptyState(runtimeId);\n }\n\n const child = state.process;\n if (child) {\n child.kill(\"SIGTERM\");\n await delay(750);\n if (child.exitCode === null) {\n child.kill(\"SIGKILL\");\n }\n state.process = undefined;\n }\n state.pid = undefined;\n state.status = \"stopped\";\n state.message = \"Stopped\";\n state.lastStoppedAt = new Date().toISOString();\n return this.snapshotState(state);\n }\n\n async restartProvider(\n runtimeId: string,\n localRuntime: LocalRuntimeConfig,\n ): Promise<LocalA2AProviderState> {\n await this.stopProvider(runtimeId);\n return this.startProvider(runtimeId, localRuntime);\n }\n\n removeState(runtimeId: string): void {\n const state = this.states.get(runtimeId);\n if (state?.process) {\n state.process.kill(\"SIGTERM\");\n state.process = undefined;\n }\n this.states.delete(runtimeId);\n }\n\n private async waitUntilReady(\n localRuntime: LocalRuntimeConfig,\n state: LocalA2AProcessState,\n timeoutMs: number,\n ): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n if (state.status === \"failed\") return false;\n if (await probeReady(localRuntime.agentCardUrl, localRuntime.healthUrl, 1500)) {\n return true;\n }\n await delay(500);\n }\n return false;\n }\n\n private emptyState(runtimeId: string): LocalA2AProviderState {\n return {\n runtimeId,\n label: runtimeId,\n status: \"stopped\",\n enabled: false,\n };\n }\n\n private snapshotState(state: LocalA2AProcessState): LocalA2AProviderState {\n return {\n runtimeId: state.runtimeId,\n label: state.label,\n status: state.status,\n enabled: state.enabled,\n assistantId: state.assistantId,\n agentCardUrl: state.agentCardUrl,\n healthUrl: state.healthUrl,\n pid: state.pid,\n message: state.message,\n lastStartedAt: state.lastStartedAt,\n lastStoppedAt: state.lastStoppedAt,\n };\n }\n}\n\nexport const localA2AService = LocalA2AService.getInstance();\n","const AGENT_CARD_PATH = \"/.well-known/agent-card.json\";\n\nexport function normalizeA2AAgentCardUrl(\n value: string | undefined,\n defaultProtocol: \"http://\" | \"https://\" = \"https://\"\n): string {\n const raw = value?.trim() ?? \"\";\n if (!raw) return \"\";\n\n const withProtocol = /^https?:\\/\\//i.test(raw)\n ? raw\n : `${defaultProtocol}${raw.replace(/^\\/+/, \"\")}`;\n const trimmed = withProtocol.replace(/\\/+$/, \"\");\n\n if (trimmed.endsWith(AGENT_CARD_PATH)) {\n return trimmed;\n }\n\n return `${trimmed}${AGENT_CARD_PATH}`;\n}\n","import type { LocalRuntimeConfig } from \"@axiom-lattice/protocols\";\n\nexport type LocalRuntimeValidationResult =\n | { ok: true }\n | { ok: false; error: string };\n\nexport function validateLocalRuntimeCommand(\n localRuntime: LocalRuntimeConfig,\n): LocalRuntimeValidationResult {\n const runtime = localRuntime as unknown as {\n command?: { executable?: unknown; args?: unknown };\n };\n const executable = runtime.command?.executable;\n if (typeof executable !== \"string\" || executable.trim().length === 0) {\n return {\n ok: false,\n error: \"Local managed A2A command executable is required\",\n };\n }\n\n const args = runtime.command?.args;\n if (!Array.isArray(args) || !args.every((arg) => typeof arg === \"string\")) {\n return {\n ok: false,\n error: \"Local managed A2A command args must be an array of strings\",\n };\n }\n\n return { ok: true };\n}\n\nexport function getAgentCardPort(agentCardUrl: string): number | null {\n let url: URL;\n try {\n url = new URL(agentCardUrl);\n } catch {\n return null;\n }\n\n if (url.port) {\n const port = Number(url.port);\n return Number.isInteger(port) ? port : null;\n }\n\n if (url.protocol === \"http:\") return 80;\n if (url.protocol === \"https:\") return 443;\n return null;\n}\n\nfunction parseCommandPort(args: string[]): number | null {\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n const match = /^(--port|-p)(?:[=\\s]+(\\d+))?$/.exec(arg);\n if (!match) continue;\n\n const inlinePort = match[2];\n if (inlinePort) return Number(inlinePort);\n\n const nextArg = args[index + 1];\n if (nextArg && /^\\d+$/.test(nextArg)) {\n return Number(nextArg);\n }\n }\n\n return null;\n}\n\nfunction isLoopbackHost(hostname: string): boolean {\n const normalized = hostname.toLowerCase();\n return (\n normalized === \"localhost\" ||\n normalized === \"127.0.0.1\" ||\n normalized === \"::1\" ||\n normalized === \"[::1]\"\n );\n}\n\nexport function validateLocalRuntimePort(\n localRuntime: LocalRuntimeConfig,\n agentCardUrl: string,\n): LocalRuntimeValidationResult {\n let url: URL;\n try {\n url = new URL(agentCardUrl);\n } catch {\n return { ok: true };\n }\n\n if (!isLoopbackHost(url.hostname) || !url.port) {\n return { ok: true };\n }\n\n const commandPort = parseCommandPort(localRuntime.command.args);\n if (commandPort === null) {\n return { ok: true };\n }\n\n const agentCardPort = Number(url.port);\n if (commandPort === agentCardPort) {\n return { ok: true };\n }\n\n return {\n ok: false,\n error: `Local managed A2A command port (${commandPort}) does not match agentCardUrl port (${agentCardPort}). Update the command args or Agent Card URL so they use the same port.`,\n };\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { CreateRunRequest } from \"../types\";\nimport { v4 } from \"uuid\";\nimport {\n Agent,\n ThreadStatus,\n agentLatticeManager,\n agentInstanceManager,\n QueueMode,\n} from \"@axiom-lattice/core\";\nimport { MessageChunkTypes } from \"@axiom-lattice/protocols\";\n\nfunction getUserId(request: FastifyRequest): string | undefined {\n const authUser = (request as any).user;\n if (authUser?.id) return authUser.id;\n return (request.headers[\"x-user-id\"] as string) || undefined;\n}\n\ninterface ResumeStreamRequest {\n thread_id: string;\n assistant_id: string\n message_id: string;\n known_content: string;\n poll_interval?: number;\n}\n\n// Create run\nexport const createRun = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const {\n assistant_id,\n thread_id,\n message_id,\n command,\n streaming,\n background,\n custom_run_config,\n mode,\n ...input\n } = request.body as CreateRunRequest;\n\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n const workspace_id = request.headers[\"x-workspace-id\"] as string;\n const project_id = request.headers[\"x-project-id\"] as string;\n const x_request_id = (request.headers[\"x-request-id\"] as string) || v4();\n const user_id = getUserId(request);\n\n // Merge user_id, project_id, workspace_id into custom_run_config for downstream propagation\n const mergedConfig = {\n ...custom_run_config,\n ...(user_id && { user_id }),\n };\n\n // Validate request\n if (!assistant_id) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n // Get or create Agent instance (ensures single instance per thread)\n const agent = agentInstanceManager.getAgent({\n assistant_id,\n thread_id,\n tenant_id,\n workspace_id,\n project_id,\n custom_run_config: mergedConfig,\n });\n\n\n // ADR-026: background mode — enqueue only, returns 202.\n // Chunk delivery is handled by the thread-level resume_stream SSE.\n if (background) {\n const messageInput = message_id\n ? { ...input, id: message_id }\n : input;\n\n const result = await agent.addMessage({\n input: messageInput,\n command,\n custom_run_config: mergedConfig,\n }, mode as QueueMode);\n\n reply.status(202).send({\n success: true,\n messageId: result.messageId,\n queued: true,\n });\n return;\n }\n\n // Handle streaming requests\n if (streaming) {\n // Setup SSE\n reply.hijack();\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n\n try {\n\n // Execute agent with streaming\n // Only pass id if message_id is provided (for backward compatibility)\n const messageInput = message_id \n ? { ...input, id: message_id }\n : input;\n \n const result = await agent.addMessage({\n input: messageInput,\n command,\n custom_run_config: mergedConfig,\n }, mode as QueueMode);\n\n // const agentStatus = await agent.getRunStatus()\n // console.log(agentStatus)\n // if (agentStatus === \"busy\") {\n // reply.status(200).send({\n // success: true,\n\n // });\n // return\n // }\n\n const stream = agent.chunkStream((result).messageId, [MessageChunkTypes.MESSAGE_COMPLETED, MessageChunkTypes.INTERRUPT, MessageChunkTypes.MESSAGE_FAILED])\n\n // Forward all chunks to SSE\n for await (const chunk of stream) {\n const success = reply.raw.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n if (!success) {\n await new Promise(resolve => reply.raw.once('drain', resolve));\n }\n }\n } catch (error: any) {\n // Send error as SSE event\n const errorEvent = {\n type: 'error',\n data: {\n id: v4(),\n content: error.message || 'Stream processing error',\n },\n };\n reply.raw.write(`data: ${JSON.stringify(errorEvent)}\\n\\n`);\n } finally {\n reply.raw.end();\n }\n } else {\n // Non-streaming: use agentExecutor\n const { message: msg, ...restInputNonStream } = input;\n const result = await agent.invoke({\n input: { message: msg, ...restInputNonStream },\n command,\n custom_run_config: mergedConfig,\n });\n reply.status(200).send({\n success: true,\n ...result,\n });\n }\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `创建运行时发生错误: ${error.message}`,\n });\n }\n};\n\n// Resume stream from known position\nexport const resumeStream = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n\n\n\n\n const { thread_id, message_id, assistant_id, known_content, poll_interval } =\n request.body as ResumeStreamRequest;\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n const workspace_id = request.headers[\"x-workspace-id\"] as string;\n const project_id = request.headers[\"x-project-id\"] as string;\n\n // Validate request data\n if (!thread_id || !message_id || !assistant_id || known_content === undefined) {\n reply.status(400).send({\n success: false,\n error: \"thread_id, message_id, assistant_id, and known_content are required\",\n });\n return;\n }\n\n // Notify Fastify that we will manually handle the response\n reply.hijack();\n\n // Set SSE response headers\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n\n try {\n // Create Agent instance for accessing chunk buffer\n // Get or create Agent instance (ensures single instance per thread)\n const agent = agentInstanceManager.getAgent({\n assistant_id,\n thread_id,\n tenant_id,\n workspace_id,\n project_id,\n });\n\n // ADR-026: Thread-level SSE, lives until client disconnect.\n // Empty stopTypes means the iterator never stops on its own —\n // MESSAGE_COMPLETED, THREAD_IDLE etc. pass through as data.\n // Client disconnect (close event) or client abort (reply.raw.destroyed)\n // terminate the loop.\n const stream = agent.chunkStream(message_id, []);\n let closed = false;\n request.raw.on('close', () => { closed = true; });\n\n for await (const chunk of stream) {\n if (closed || reply.raw.destroyed) break;\n reply.raw.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n }\n } catch (error: any) {\n // Send error as SSE event before closing (following MessageChunk format)\n const errorEvent = {\n type: 'error',\n data: {\n id: v4(),\n content: error.message || 'Resume stream processing error'\n }\n };\n reply.raw.write(`data: ${JSON.stringify(errorEvent)}\\n\\n`);\n } finally {\n reply.raw.end();\n }\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `Error resuming stream: ${error.message}`,\n });\n }\n};\n\n// Abort agent execution for a thread\nexport const abortRun = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, threadId } = request.params as {\n assistantId: string;\n threadId: string;\n };\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n const workspace_id = (request.headers[\"x-workspace-id\"] as string) || \"default\";\n const project_id = (request.headers[\"x-project-id\"] as string) || \"default\";\n\n const agent = agentInstanceManager.getAgent({\n assistant_id: assistantId,\n thread_id: threadId,\n tenant_id,\n workspace_id,\n project_id,\n });\n\n await agent.abort();\n\n reply.status(200).send({\n success: true,\n message: \"Agent aborted\",\n });\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `Abort failed: ${error.message}`,\n });\n }\n};\n\n/**\n * Recover agent execution after a crash or manual abort.\n *\n * Resumes the LangGraph from its last checkpoint if the graph was\n * mid-execution (BUSY). Otherwise cleans up stuck queue messages\n * and restarts the queue processor.\n *\n * Pairs with {@link abortRun} — use abort to stop, recover to continue.\n */\nexport const recoverRun = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, threadId } = request.params as {\n assistantId: string;\n threadId: string;\n };\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n const workspace_id = (request.headers[\"x-workspace-id\"] as string) || \"default\";\n const project_id = (request.headers[\"x-project-id\"] as string) || \"default\";\n\n const agent = agentInstanceManager.getAgent({\n assistant_id: assistantId,\n thread_id: threadId,\n tenant_id,\n workspace_id,\n project_id,\n });\n\n await agent.resumeTask();\n\n const status = await agent.getRunStatus();\n\n reply.status(200).send({\n success: true,\n threadId,\n status,\n });\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `Recover failed: ${error.message}`,\n });\n }\n};\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { agentInstanceManager } from \"@axiom-lattice/core\";\n\n// 设置内存项\nexport const setMemoryItem = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, key } = request.params as {\n assistantId: string;\n key: string;\n };\n const value = request.body;\n\n if (!assistantId || !key) {\n reply.status(400).send({\n success: false,\n error: \"助手ID和键是必需的\",\n });\n return;\n }\n\n if (value === undefined) {\n reply.status(400).send({\n success: false,\n error: \"值是必需的\",\n });\n return;\n }\n\n //const result = await memoryModel.setMemoryItem(assistantId, key, value);\n\n // if (!result.success) {\n reply.status(500).send();\n return;\n // }\n\n //reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `设置内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 获取内存项\nexport const getMemoryItem = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, key } = request.params as {\n assistantId: string;\n key: string;\n };\n\n if (!assistantId || !key) {\n reply.status(400).send({\n success: false,\n error: \"助手ID和键是必需的\",\n });\n return;\n }\n\n //const result = await memoryModel.getMemoryItem(assistantId, key);\n\n // if (!result.success) {\n reply.status(404).send();\n return;\n // }\n\n //reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `获取内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 获取所有内存项\nexport const getAllMemoryItems = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, thread_id } = request.params as {\n assistantId: string;\n thread_id: string;\n };\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n\n if (!thread_id) {\n reply.status(400).send({\n success: false,\n error: \"线程ID是必需的\",\n });\n return;\n }\n\n if (!assistantId) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n const agent = agentInstanceManager.getAgent({ assistant_id: assistantId, tenant_id, thread_id: thread_id })\n\n const result = await agent.getCurrentMessages();\n\n if (!result) {\n reply.status(500).send(result);\n return;\n }\n\n reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `获取所有内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 获取助手状态\nexport const getAgentState = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, thread_id } = request.params as {\n assistantId: string;\n thread_id: string;\n };\n\n if (!thread_id) {\n reply.status(400).send({\n success: false,\n error: \"线程ID是必需的\",\n });\n return;\n }\n\n if (!assistantId) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n const agent = agentInstanceManager.getAgent({ assistant_id: assistantId, tenant_id, thread_id: thread_id })\n\n // 1. 获取 LangGraph 状态(现有逻辑)\n const result = await agent.getCurrentState();\n const pendingMessages = await agent.getPendingMessages();\n\n\n if (!result) {\n reply.status(500).send(result);\n return;\n }\n\n // 3. 合并返回\n // Normalize pendingMessages content to string for consistent frontend format\n const normalizedPendingMessages = pendingMessages.map(msg => ({\n ...msg,\n content: typeof msg.content === 'object' && msg.content !== null\n ? ('message' in msg.content ? msg.content.message : JSON.stringify(msg.content))\n : String(msg.content || '')\n }));\n\n const mergedResult = {\n ...result,\n pendingMessages: normalizedPendingMessages\n };\n\n reply.send(mergedResult);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `获取助手状态时发生错误: ${error.message}`,\n });\n }\n};\n\n// 删除内存项\nexport const deleteMemoryItem = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, key } = request.params as {\n assistantId: string;\n key: string;\n };\n\n if (!assistantId || !key) {\n reply.status(400).send({\n success: false,\n error: \"助手ID和键是必需的\",\n });\n return;\n }\n\n //const result = await memoryModel.deleteMemoryItem(assistantId, key);\n\n // if (!result.success) {\n reply.status(500).send();\n return;\n // }\n\n reply.status(204).send();\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `删除内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 清除内存\nexport const clearMemory = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId } = request.params as { assistantId: string };\n\n if (!assistantId) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n let result: any; //= await memoryModel.clearMemory(assistantId);\n\n if (!result.success) {\n reply.status(500).send(result);\n return;\n }\n\n reply.status(204).send();\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `清除内存时发生错误: ${error.message}`,\n });\n }\n};\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { AgentManager } from \"@axiom-lattice/core\";\n\n/**\n * Request body interface for triggering agent task\n */\ninterface TriggerAgentTaskRequest {\n assistant_id: string;\n thread_id: string;\n input: any;\n command?: any;\n}\n\n/**\n * Trigger an agent task\n * This endpoint triggers an agent task through the AgentManager,\n * which publishes the task to the event bus for processing\n */\nexport const triggerAgentTask = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistant_id, thread_id, input, command } =\n request.body as TriggerAgentTaskRequest;\n\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n const workspace_id = request.headers[\"x-workspace-id\"] as string | undefined;\n const project_id = request.headers[\"x-project-id\"] as string | undefined;\n\n // Validate required fields\n if (!assistant_id) {\n reply.status(400).send({\n success: false,\n error: \"assistant_id is required\",\n });\n return;\n }\n\n if (!thread_id) {\n reply.status(400).send({\n success: false,\n error: \"thread_id is required\",\n });\n return;\n }\n\n // Get AgentManager instance and trigger the task\n const agentManager = AgentManager.getInstance();\n const result = await agentManager.callAgentInQueue({\n assistant_id,\n thread_id,\n input,\n command,\n \"x-tenant-id\": tenant_id,\n runConfig: {\n workspaceId: workspace_id,\n projectId: project_id,\n user_id: (request as any).user?.id,\n },\n });\n\n reply.status(200).send({\n success: true,\n });\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `Failed to trigger agent task: ${error.message}`,\n });\n }\n};\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { getStoreLattice } from \"@axiom-lattice/core\";\nimport { Thread, CreateThreadRequest } from \"../types\";\nimport { randomUUID } from \"crypto\";\n\n/**\n * Thread Controller\n * Handles thread-related CRUD operations for a specific assistant\n * All operations are scoped to a tenant ID and assistant ID\n */\n\n/**\n * Get tenant ID from authenticated user context\n * Falls back to request headers for backward compatibility\n */\nfunction getTenantId(request: FastifyRequest): string {\n // First try to get from authenticated user context\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) {\n return userTenantId;\n }\n\n // Fallback to request headers for backward compatibility\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\n/**\n * Thread list response interface\n */\ninterface ThreadListResponse {\n success: boolean;\n message: string;\n data: {\n records: Thread[];\n total: number;\n };\n}\n\n/**\n * Thread response interface\n */\ninterface ThreadResponse {\n success: boolean;\n message: string;\n data?: Thread;\n}\n\n/**\n * Thread update request body interface\n */\ninterface ThreadUpdateBody {\n metadata?: Record<string, any>;\n}\n\n/**\n * Get list of all threads for a specific assistant\n */\nexport async function getThreadList(\n request: FastifyRequest<{\n Params: { assistantId: string };\n }>,\n reply: FastifyReply\n): Promise<ThreadListResponse> {\n const tenantId = getTenantId(request);\n const { assistantId } = request.params;\n\n // Build metadata filter from headers (workspace/project isolation)\n const metadataFilter: Record<string, string> = {};\n const workspaceId = request.headers[\"x-workspace-id\"] as string | undefined;\n const projectId = request.headers[\"x-project-id\"] as string | undefined;\n \n if (workspaceId) {\n metadataFilter.workspaceId = workspaceId;\n }\n if (projectId) {\n metadataFilter.projectId = projectId;\n }\n\n const storeLattice = getStoreLattice(\"default\", \"thread\");\n const threadStore = storeLattice.store;\n const threads = await threadStore.getThreadsByAssistantId(\n tenantId,\n assistantId,\n Object.keys(metadataFilter).length > 0 ? metadataFilter : undefined\n );\n\n return {\n success: true,\n message: \"Successfully retrieved thread list\",\n data: {\n records: threads,\n total: threads.length,\n },\n };\n}\n\n/**\n * Get a single thread by ID for a specific tenant\n */\nexport async function getThread(\n request: FastifyRequest<{\n Params: { assistantId: string; threadId: string };\n }>,\n reply: FastifyReply\n): Promise<ThreadResponse> {\n const tenantId = getTenantId(request);\n const { threadId } = request.params;\n\n const storeLattice = getStoreLattice(\"default\", \"thread\");\n const threadStore = storeLattice.store;\n const thread = await threadStore.getThreadById(tenantId, threadId);\n\n if (!thread) {\n return reply.status(404).send({\n success: false,\n message: \"Thread not found\",\n });\n }\n\n return {\n success: true,\n message: \"Successfully retrieved thread\",\n data: thread,\n };\n}\n\n/**\n * Create a new thread for an assistant\n */\nexport async function createThread(\n request: FastifyRequest<{\n Params: { assistantId: string };\n Body: CreateThreadRequest;\n }>,\n reply: FastifyReply\n): Promise<ThreadResponse> {\n const tenantId = getTenantId(request);\n const { assistantId } = request.params;\n const data = request.body;\n\n // Generate thread ID if not provided\n const threadId = randomUUID();\n\n // Extract workspace and project from headers\n const workspaceId = request.headers[\"x-workspace-id\"] as string | undefined;\n const projectId = request.headers[\"x-project-id\"] as string | undefined;\n\n // Enrich metadata with tenant/workspace/project\n const enrichedMetadata: Record<string, any> = {\n ...data.metadata,\n tenantId,\n };\n\n if (workspaceId) {\n enrichedMetadata.workspaceId = workspaceId;\n }\n if (projectId) {\n enrichedMetadata.projectId = projectId;\n }\n\n // Create thread with enriched metadata\n const storeLattice = getStoreLattice(\"default\", \"thread\");\n const threadStore = storeLattice.store;\n const newThread = await threadStore.createThread(tenantId, assistantId, threadId, {\n metadata: enrichedMetadata,\n });\n\n return reply.status(201).send({\n success: true,\n message: \"Successfully created thread\",\n data: newThread,\n });\n}\n\n/**\n * Update an existing thread by ID\n */\nexport async function updateThread(\n request: FastifyRequest<{\n Params: { assistantId: string; threadId: string };\n Body: ThreadUpdateBody;\n }>,\n reply: FastifyReply\n): Promise<ThreadResponse> {\n const tenantId = getTenantId(request);\n const { threadId } = request.params;\n const updates = request.body;\n\n const storeLattice = getStoreLattice(\"default\", \"thread\");\n const threadStore = storeLattice.store;\n\n // Check if thread exists\n const exists = await threadStore.hasThread(tenantId, threadId);\n if (!exists) {\n return reply.status(404).send({\n success: false,\n message: \"Thread not found\",\n });\n }\n\n // Update thread\n const updatedThread = await threadStore.updateThread(\n tenantId,\n threadId,\n updates\n );\n\n if (!updatedThread) {\n return reply.status(500).send({\n success: false,\n message: \"Failed to update thread\",\n });\n }\n\n return {\n success: true,\n message: \"Successfully updated thread\",\n data: updatedThread,\n };\n}\n\n/**\n * Delete a thread by ID\n */\nexport async function deleteThread(\n request: FastifyRequest<{\n Params: { assistantId: string; threadId: string };\n }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string }> {\n const tenantId = getTenantId(request);\n const { threadId } = request.params;\n\n const storeLattice = getStoreLattice(\"default\", \"thread\");\n const threadStore = storeLattice.store;\n\n // Check if thread exists\n const exists = await threadStore.hasThread(tenantId, threadId);\n if (!exists) {\n return reply.status(404).send({\n success: false,\n message: \"Thread not found\",\n });\n }\n\n // Delete the thread\n const deleted = await threadStore.deleteThread(tenantId, threadId);\n\n if (!deleted) {\n return reply.status(500).send({\n success: false,\n message: \"Failed to delete thread\",\n });\n }\n\n return {\n success: true,\n message: \"Successfully deleted thread\",\n };\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { scheduleLatticeManager } from \"@axiom-lattice/core\";\nimport {\n ScheduledTaskDefinition,\n ScheduledTaskStatus,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * Schedule Controller\n * Handles schedule-related operations for viewing and managing scheduled tasks\n * All operations are scoped to a tenant ID\n */\n\n/**\n * Get tenant ID from request headers or user context\n */\nfunction getTenantId(request: FastifyRequest): string {\n // First try to get from authenticated user context\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) {\n return userTenantId;\n }\n\n // Fallback to request headers for backward compatibility\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\n/**\n * Scheduled tasks list response interface\n */\ninterface ScheduledTasksListResponse {\n success: boolean;\n message: string;\n data: {\n records: ScheduledTaskDefinition[];\n total: number;\n };\n}\n\n/**\n * Scheduled task response interface\n */\ninterface ScheduledTaskResponse {\n success: boolean;\n message: string;\n data?: ScheduledTaskDefinition | null;\n}\n\n/**\n * Helper function to get the schedule lattice safely\n * Returns null if no schedule lattice is registered\n */\nfunction getScheduleLattice() {\n // Try to get the first available schedule lattice\n const keys = scheduleLatticeManager.getLatticeKeys();\n if (keys.length === 0) {\n return null;\n }\n // Use \"default\" if available, otherwise use the first one\n if (scheduleLatticeManager.hasLattice(\"default\")) {\n return scheduleLatticeManager.getScheduleLattice(\"default\");\n }\n return scheduleLatticeManager.getScheduleLattice(keys[0]);\n}\n\n/**\n * Get scheduled tasks for a specific thread\n */\nexport async function getThreadSchedules(\n request: FastifyRequest<{\n Params: { assistantId: string; threadId: string };\n Querystring: {\n status?: ScheduledTaskStatus;\n limit?: string;\n offset?: string;\n };\n }>,\n reply: FastifyReply\n): Promise<ScheduledTasksListResponse> {\n const { assistantId, threadId } = request.params;\n const { status, limit, offset } = request.query;\n\n try {\n const scheduleLattice = getScheduleLattice();\n\n // If no schedule lattice is registered, return empty result\n if (!scheduleLattice) {\n return {\n success: true,\n message: \"No schedule lattice configured\",\n data: {\n records: [],\n total: 0,\n },\n };\n }\n\n const storage = scheduleLattice.client.getStorage();\n\n if (!storage) {\n return {\n success: true,\n message: \"No schedule storage configured\",\n data: {\n records: [],\n total: 0,\n },\n };\n }\n\n const tenantId = getTenantId(request);\n\n const filters: {\n tenantId: string;\n threadId: string;\n assistantId?: string;\n status?: ScheduledTaskStatus;\n limit?: number;\n offset?: number;\n } = {\n tenantId,\n threadId,\n assistantId,\n };\n\n if (status) {\n filters.status = status;\n }\n if (limit) {\n filters.limit = parseInt(limit, 10);\n }\n if (offset) {\n filters.offset = parseInt(offset, 10);\n }\n\n const tasks = await storage.getAllTasks(filters);\n const total = await storage.countTasks({\n tenantId,\n threadId,\n assistantId,\n status,\n });\n\n return {\n success: true,\n message: \"Successfully retrieved scheduled tasks\",\n data: {\n records: tasks,\n total,\n },\n };\n } catch (error) {\n request.log.error(error, \"Failed to get thread schedules\");\n return reply.status(500).send({\n success: false,\n message: \"Failed to retrieve scheduled tasks\",\n data: {\n records: [],\n total: 0,\n },\n });\n }\n}\n\n/**\n * Get a single scheduled task by ID\n */\nexport async function getScheduledTask(\n request: FastifyRequest<{\n Params: { taskId: string };\n }>,\n reply: FastifyReply\n): Promise<ScheduledTaskResponse> {\n const { taskId } = request.params;\n\n try {\n const scheduleLattice = getScheduleLattice();\n\n if (!scheduleLattice) {\n return reply.status(404).send({\n success: false,\n message: \"No schedule lattice configured\",\n });\n }\n\n const task = await scheduleLattice.client.getTask(taskId);\n\n if (!task) {\n return reply.status(404).send({\n success: false,\n message: \"Scheduled task not found\",\n });\n }\n\n return {\n success: true,\n message: \"Successfully retrieved scheduled task\",\n data: task,\n };\n } catch (error) {\n request.log.error(error, \"Failed to get scheduled task\");\n return reply.status(500).send({\n success: false,\n message: \"Failed to retrieve scheduled task\",\n });\n }\n}\n\n/**\n * Cancel a scheduled task\n */\nexport async function cancelScheduledTask(\n request: FastifyRequest<{\n Params: { taskId: string };\n }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string }> {\n const { taskId } = request.params;\n\n try {\n const scheduleLattice = getScheduleLattice();\n\n if (!scheduleLattice) {\n return reply.status(404).send({\n success: false,\n message: \"No schedule lattice configured\",\n });\n }\n\n const result = await scheduleLattice.client.cancel(taskId);\n\n if (!result) {\n return reply.status(404).send({\n success: false,\n message: \"Scheduled task not found or already cancelled\",\n });\n }\n\n return {\n success: true,\n message: \"Successfully cancelled scheduled task\",\n };\n } catch (error) {\n request.log.error(error, \"Failed to cancel scheduled task\");\n return reply.status(500).send({\n success: false,\n message: \"Failed to cancel scheduled task\",\n });\n }\n}\n\n/**\n * Pause a scheduled cron task\n */\nexport async function pauseScheduledTask(\n request: FastifyRequest<{\n Params: { taskId: string };\n }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string }> {\n const { taskId } = request.params;\n\n try {\n const scheduleLattice = getScheduleLattice();\n\n if (!scheduleLattice) {\n return reply.status(404).send({\n success: false,\n message: \"No schedule lattice configured\",\n });\n }\n\n const result = await scheduleLattice.client.pause(taskId);\n\n if (!result) {\n return reply.status(404).send({\n success: false,\n message: \"Scheduled task not found or cannot be paused\",\n });\n }\n\n return {\n success: true,\n message: \"Successfully paused scheduled task\",\n };\n } catch (error) {\n request.log.error(error, \"Failed to pause scheduled task\");\n return reply.status(500).send({\n success: false,\n message: \"Failed to pause scheduled task\",\n });\n }\n}\n\n/**\n * Resume a paused cron task\n */\nexport async function resumeScheduledTask(\n request: FastifyRequest<{\n Params: { taskId: string };\n }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string }> {\n const { taskId } = request.params;\n\n try {\n const scheduleLattice = getScheduleLattice();\n\n if (!scheduleLattice) {\n return reply.status(404).send({\n success: false,\n message: \"No schedule lattice configured\",\n });\n }\n\n const result = await scheduleLattice.client.resume(taskId);\n\n if (!result) {\n return reply.status(404).send({\n success: false,\n message: \"Scheduled task not found or cannot be resumed\",\n });\n }\n\n return {\n success: true,\n message: \"Successfully resumed scheduled task\",\n };\n } catch (error) {\n request.log.error(error, \"Failed to resume scheduled task\");\n return reply.status(500).send({\n success: false,\n message: \"Failed to resume scheduled task\",\n });\n }\n}\n","/**\n * Configuration service\n * Manages environment variables and supports dynamic updates\n */\n\nexport interface GatewayConfig {\n port?: number;\n queueServiceType?: string;\n redisUrl?: string;\n redisPassword?: string;\n queueName?: string;\n [key: string]: any; // Allow additional config keys\n}\n\n/**\n * Get configuration from environment variables\n * Supports dynamic updates via updateConfig method\n */\nclass ConfigService {\n private config: GatewayConfig;\n\n constructor() {\n this.config = this.loadFromEnv();\n }\n\n /**\n * Load configuration from environment variables\n */\n private loadFromEnv(): GatewayConfig {\n return {\n port: process.env.PORT ? Number(process.env.PORT) : undefined,\n queueServiceType: process.env.QUEUE_SERVICE_TYPE,\n redisUrl: process.env.REDIS_URL,\n redisPassword: process.env.REDIS_PASSWORD,\n queueName: process.env.QUEUE_NAME,\n };\n }\n\n /**\n * Update configuration from JSON object\n * This will update both the internal config and process.env\n */\n updateConfig(jsonConfig: Record<string, any>): void {\n // Update process.env for all provided keys\n for (const [key, value] of Object.entries(jsonConfig)) {\n if (value !== null && value !== undefined) {\n // Convert nested objects to environment variable format\n if (typeof value === \"object\" && !Array.isArray(value)) {\n // Handle nested objects like supabase: { url: \"...\", key: \"...\" }\n for (const [nestedKey, nestedValue] of Object.entries(value)) {\n const envKey = `${key.toUpperCase()}_${nestedKey.toUpperCase()}`;\n process.env[envKey] = String(nestedValue);\n }\n } else {\n // Handle flat keys\n process.env[key.toUpperCase()] = String(value);\n }\n }\n }\n\n // Reload config from updated environment variables\n this.config = this.loadFromEnv();\n\n // Deep merge the JSON config into our config object\n this.config = this.deepMerge(this.config, jsonConfig);\n }\n\n /**\n * Deep merge two objects\n */\n private deepMerge(target: any, source: any): any {\n const output = { ...target };\n if (this.isObject(target) && this.isObject(source)) {\n Object.keys(source).forEach((key) => {\n if (this.isObject(source[key])) {\n if (!(key in target)) {\n Object.assign(output, { [key]: source[key] });\n } else {\n output[key] = this.deepMerge(target[key], source[key]);\n }\n } else {\n Object.assign(output, { [key]: source[key] });\n }\n });\n }\n return output;\n }\n\n /**\n * Check if value is a plain object\n */\n private isObject(item: any): boolean {\n return item && typeof item === \"object\" && !Array.isArray(item);\n }\n\n /**\n * Get current configuration\n */\n getConfig(): GatewayConfig {\n return { ...this.config };\n }\n}\n\n// Export singleton instance\nexport const configService = new ConfigService();\n\n// Export config getter for backward compatibility\nexport const config = {\n get port() {\n return configService.getConfig().port;\n },\n get queueServiceType() {\n return configService.getConfig().queueServiceType;\n },\n get redisUrl() {\n return configService.getConfig().redisUrl;\n },\n get redisPassword() {\n return configService.getConfig().redisPassword;\n },\n get queueName() {\n return configService.getConfig().queueName;\n },\n};\n","// Queue service adapter that uses QueueLatticeManager from core package\n// Provides backward-compatible API for gateway services\n\nimport {\n queueLatticeManager,\n registerQueueLattice,\n getQueueLattice,\n} from \"@axiom-lattice/core\";\nimport { QueueType } from \"@axiom-lattice/protocols\";\nimport type { QueueConfig, QueueClient } from \"@axiom-lattice/protocols\";\nimport { RedisQueueClient } from \"@axiom-lattice/queue-redis\";\n\nexport type QueueServiceType = \"memory\" | \"redis\";\n\n// Default queue key\nconst DEFAULT_QUEUE_KEY = \"default\";\n\n// Global configuration for queue service type\n// Can be set via environment variable QUEUE_SERVICE_TYPE or via LatticeGateway configuration\nlet queueServiceType: QueueServiceType =\n (process.env.QUEUE_SERVICE_TYPE as QueueServiceType) || \"memory\";\n\n/**\n * Configure the queue service type\n * This will register or update the default queue service\n * @param type - \"memory\" or \"redis\"\n */\nexport const setQueueServiceType = (type: QueueServiceType): void => {\n queueServiceType = type;\n console.log(`Queue service type set to: ${type}`);\n\n // Register or update the queue service\n const queueName = process.env.QUEUE_NAME || \"tasks\";\n const config: QueueConfig = {\n name: \"Default Queue Service\",\n description: `Default ${type} queue service`,\n type: type === \"redis\" ? QueueType.REDIS : QueueType.MEMORY,\n queueName,\n options:\n type === \"redis\"\n ? {\n redisUrl: process.env.REDIS_URL,\n redisPassword: process.env.REDIS_PASSWORD,\n }\n : undefined,\n };\n\n // Remove existing queue if it exists\n if (queueLatticeManager.hasLattice(DEFAULT_QUEUE_KEY)) {\n queueLatticeManager.removeLattice(DEFAULT_QUEUE_KEY);\n }\n\n // Create client for Redis type\n let client: QueueClient | undefined;\n if (type === \"redis\") {\n client = new RedisQueueClient(queueName, {\n redisUrl: process.env.REDIS_URL,\n redisPassword: process.env.REDIS_PASSWORD,\n });\n }\n\n // Register the new queue service\n registerQueueLattice(DEFAULT_QUEUE_KEY, config, client);\n};\n\n/**\n * Get the current queue service type\n */\nexport const getQueueServiceType = (): QueueServiceType => {\n return queueServiceType;\n};\n\n/**\n * Get the default queue service\n * If not registered, register it with the current configuration\n */\nconst getQueueService = () => {\n // Check if queue is already registered\n if (!queueLatticeManager.hasLattice(DEFAULT_QUEUE_KEY)) {\n // Auto-register with current configuration\n setQueueServiceType(queueServiceType);\n }\n\n return getQueueLattice(DEFAULT_QUEUE_KEY);\n};\n\n/**\n * Push agent task to queue\n * @param agentTask - Agent task to push\n */\nexport const pushAgentTaskToQueue = async (agentTask: any) => {\n const queue = getQueueService();\n const result = await queue.push(agentTask);\n return result;\n};\n\n/**\n * Pop agent task from queue\n */\nexport const popAgentTaskFromQueue = async () => {\n const queue = getQueueService();\n const result = await queue.pop();\n return result;\n};\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { configService } from \"../config\";\nimport {\n setQueueServiceType,\n QueueServiceType,\n} from \"../services/queue_service\";\n\n/**\n * Configuration Controller\n * Handles configuration updates from frontend\n */\n\ninterface UpdateConfigRequest {\n Body: {\n config: Record<string, any>;\n };\n}\n\n/**\n * Update gateway configuration\n * Accepts JSON config and loads it into environment variables\n */\nexport async function updateConfig(\n request: FastifyRequest<UpdateConfigRequest>,\n reply: FastifyReply\n) {\n try {\n const { config: jsonConfig } = request.body;\n\n if (!jsonConfig || typeof jsonConfig !== \"object\") {\n return reply.status(400).send({\n success: false,\n error: \"Invalid configuration: config must be an object\",\n });\n }\n\n // Update configuration service\n configService.updateConfig(jsonConfig);\n\n const warnings: string[] = [];\n const requiresRestart: string[] = [];\n\n // Check if port is being changed (requires restart)\n if (jsonConfig.port !== undefined) {\n requiresRestart.push(\"PORT\");\n warnings.push(\"Port change requires server restart to take effect\");\n }\n\n // If queue service type is being updated, reconfigure the queue service\n if (jsonConfig.queueServiceType) {\n setQueueServiceType(jsonConfig.queueServiceType as QueueServiceType);\n }\n\n // If Redis configuration is being updated and queue service is Redis, reconfigure\n if (\n (jsonConfig.redisUrl || jsonConfig.redisPassword) &&\n (process.env.QUEUE_SERVICE_TYPE === \"redis\" ||\n jsonConfig.queueServiceType === \"redis\")\n ) {\n // Reconfigure queue service to pick up new Redis settings\n const currentType =\n (jsonConfig.queueServiceType as QueueServiceType) ||\n (process.env.QUEUE_SERVICE_TYPE as QueueServiceType) ||\n \"memory\";\n if (currentType === \"redis\") {\n setQueueServiceType(\"redis\");\n }\n }\n\n // Get updated config (without sensitive data)\n const updatedConfig = configService.getConfig();\n const safeConfig = {\n ...updatedConfig,\n redisPassword: updatedConfig.redisPassword\n ? \"***\"\n : updatedConfig.redisPassword,\n };\n\n return reply.send({\n success: true,\n message: \"Configuration updated successfully\",\n data: safeConfig,\n warnings: warnings.length > 0 ? warnings : undefined,\n requiresRestart: requiresRestart.length > 0 ? requiresRestart : undefined,\n });\n } catch (error: any) {\n console.error(\"Failed to update configuration\", {\n error: error.message,\n stack: error.stack,\n });\n return reply.status(500).send({\n success: false,\n error: error.message || \"Failed to update configuration\",\n });\n }\n}\n\n/**\n * Get current gateway configuration\n * Returns current configuration (with sensitive data masked)\n */\nexport async function getConfig(request: FastifyRequest, reply: FastifyReply) {\n try {\n const currentConfig = configService.getConfig();\n const safeConfig = {\n ...currentConfig,\n redisPassword: currentConfig.redisPassword\n ? \"***\"\n : currentConfig.redisPassword,\n };\n\n return reply.send({\n success: true,\n data: safeConfig,\n });\n } catch (error: any) {\n console.error(\"Failed to get configuration\", {\n error: error.message,\n stack: error.stack,\n });\n return reply.status(500).send({\n success: false,\n error: error.message || \"Failed to get configuration\",\n });\n }\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { registerModelLattice, modelLatticeManager } from \"@axiom-lattice/core\";\nimport type { LLMConfig } from \"@axiom-lattice/protocols\";\n\n/**\n * Models Controller\n * Handles model lattice registration and management\n * Models are tenant-isolated using key prefix: {tenantId}:{modelKey}\n */\n\n/**\n * Get tenant ID from request headers or user context\n */\nfunction getTenantId(request: FastifyRequest): string {\n // First try to get from authenticated user context\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) {\n return userTenantId;\n }\n\n // Fallback to request headers for backward compatibility\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\n/**\n * Get tenant-scoped model key\n */\nfunction getTenantModelKey(tenantId: string, modelKey: string): string {\n return `${tenantId}:${modelKey}`;\n}\n\n/**\n * Extract model key from tenant-scoped key\n */\nfunction extractModelKey(tenantId: string, tenantModelKey: string): string {\n const prefix = `${tenantId}:`;\n if (tenantModelKey.startsWith(prefix)) {\n return tenantModelKey.substring(prefix.length);\n }\n return tenantModelKey;\n}\n\ninterface ModelConfig {\n key: string;\n model: string;\n displayName?: string;\n provider: \"azure\" | \"openai\" | \"deepseek\" | \"siliconcloud\" | \"volcengine\";\n streaming?: boolean;\n apiKey?: string;\n baseURL?: string;\n maxTokens?: number;\n temperature?: number;\n timeout?: number;\n maxRetries?: number;\n}\n\ninterface UpdateModelsRequest {\n Body: {\n models: ModelConfig[];\n };\n}\n\ninterface UpdateModelsRequest {\n Body: {\n models: ModelConfig[];\n };\n}\n\n/**\n * Get all registered models\n */\nexport async function getModels(request: FastifyRequest, reply: FastifyReply) {\n try {\n const allLattices = modelLatticeManager.getAllLattices();\n const models = allLattices.map((lattice) => {\n // Extract config from the lattice client\n // Note: This is a simplified approach - you may need to adjust based on actual implementation\n const config = (lattice.client as any).config || {};\n // Use provided displayName or auto-generate from key\n const displayName = config.displayName || lattice.key\n .split('-')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n return {\n key: lattice.key,\n model: config.model || \"\",\n provider: config.provider || \"openai\",\n displayName: displayName,\n streaming: config.streaming || false,\n apiKey: config.apiKey || \"\",\n baseURL: config.baseURL || \"\",\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n timeout: config.timeout,\n maxRetries: config.maxRetries,\n };\n });\n\n return reply.send({\n success: true,\n data: models,\n });\n } catch (error: any) {\n console.error(\"Failed to get models\", {\n error: error.message,\n stack: error.stack,\n });\n return reply.status(500).send({\n success: false,\n error: error.message || \"Failed to get models\",\n });\n }\n}\n\n/**\n * Update models configuration\n * Registers or updates model lattices\n */\nexport async function updateModels(\n request: FastifyRequest<UpdateModelsRequest>,\n reply: FastifyReply\n) {\n try {\n const { models } = request.body;\n\n if (!models || !Array.isArray(models)) {\n return reply.status(400).send({\n success: false,\n error: \"Invalid request: models must be an array\",\n });\n }\n\n const registeredModels: string[] = [];\n const errors: string[] = [];\n\n for (const modelConfig of models) {\n if (!modelConfig.key || !modelConfig.model || !modelConfig.provider) {\n errors.push(\n `Model configuration is incomplete: key, model, and provider are required`\n );\n continue;\n }\n\n try {\n // Remove existing model with the same key if it exists\n if (modelLatticeManager.hasLattice(modelConfig.key)) {\n modelLatticeManager.removeLattice(modelConfig.key);\n }\n\n // Convert to LLMConfig format\n const llmConfig: LLMConfig = {\n provider: modelConfig.provider,\n model: modelConfig.model,\n displayName: modelConfig.displayName,\n streaming: modelConfig.streaming ?? false,\n apiKey: modelConfig.apiKey,\n baseURL: modelConfig.baseURL,\n maxTokens: modelConfig.maxTokens,\n temperature: modelConfig.temperature,\n timeout: modelConfig.timeout,\n maxRetries: modelConfig.maxRetries,\n };\n\n // Register the new model lattice\n registerModelLattice(modelConfig.key, llmConfig);\n registeredModels.push(modelConfig.key);\n } catch (error: any) {\n errors.push(\n `Failed to register model ${modelConfig.key}: ${error.message}`\n );\n }\n }\n\n if (errors.length > 0 && registeredModels.length === 0) {\n return reply.status(400).send({\n success: false,\n error: errors.join(\"; \"),\n });\n }\n\n return reply.send({\n success: true,\n message: `Successfully registered ${registeredModels.length} model(s)`,\n data: {\n registered: registeredModels,\n errors: errors.length > 0 ? errors : undefined,\n },\n });\n } catch (error: any) {\n console.error(\"Failed to update models\", {\n error: error.message,\n stack: error.stack,\n });\n return reply.status(500).send({\n success: false,\n error: error.message || \"Failed to update models\",\n });\n }\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\n\n/**\n * Health Controller\n * Handles health check endpoints for monitoring and load balancer checks\n */\n\n/**\n * Health check endpoint\n * Returns service status and basic information\n */\nexport async function getHealth(\n request: FastifyRequest,\n reply: FastifyReply\n) {\n try {\n const healthStatus = {\n status: \"healthy\",\n timestamp: new Date().toISOString(),\n uptime: process.uptime(),\n service: \"lattice-gateway\",\n version: process.env.npm_package_version || \"1.0.0\",\n };\n\n return reply.send({\n success: true,\n data: healthStatus,\n });\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n status: \"unhealthy\",\n error: error.message || \"Health check failed\",\n });\n }\n}\n","/**\n * SkillService\n *\n * Business logic layer for skill management.\n * Wraps SandboxSkillStore from @axiom-lattice/core.\n * Controllers should consume this service, not directly manipulate storage.\n */\n\nimport { SandboxSkillStore } from \"@axiom-lattice/core\";\nimport type {\n Skill,\n SkillStoreContext,\n CreateSkillRequest,\n} from \"@axiom-lattice/protocols\";\nimport { FastifyRequest } from \"fastify\";\n\nfunction getTenantId(request: FastifyRequest): string {\n return (request as any).user?.tenantId || (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\nfunction getWorkspaceId(request: FastifyRequest): string | undefined {\n return request.headers[\"x-workspace-id\"] as string | undefined;\n}\n\nfunction getProjectId(request: FastifyRequest): string | undefined {\n return request.headers[\"x-project-id\"] as string | undefined;\n}\n\nfunction buildContext(request: FastifyRequest): SkillStoreContext {\n return {\n workspaceId: getWorkspaceId(request),\n projectId: getProjectId(request),\n };\n}\n\nexport class SkillService {\n private store: SandboxSkillStore;\n\n constructor() {\n this.store = new SandboxSkillStore();\n }\n\n async getAllSkills(request: FastifyRequest): Promise<Skill[]> {\n const tenantId = getTenantId(request);\n return this.store.getAllSkills(tenantId, buildContext(request));\n }\n\n async getSkillById(request: FastifyRequest, id: string): Promise<Skill | null> {\n const tenantId = getTenantId(request);\n return this.store.getSkillById(tenantId, id, buildContext(request));\n }\n\n async createSkill(\n request: FastifyRequest,\n id: string,\n data: CreateSkillRequest\n ): Promise<Skill> {\n const tenantId = getTenantId(request);\n return this.store.createSkill(tenantId, id, data, buildContext(request));\n }\n\n async updateSkill(\n request: FastifyRequest,\n id: string,\n updates: Partial<CreateSkillRequest>\n ): Promise<Skill | null> {\n const tenantId = getTenantId(request);\n return this.store.updateSkill(tenantId, id, updates, buildContext(request));\n }\n\n async deleteSkill(request: FastifyRequest, id: string): Promise<boolean> {\n const tenantId = getTenantId(request);\n return this.store.deleteSkill(tenantId, id, buildContext(request));\n }\n\n async searchByMetadata(\n request: FastifyRequest,\n key: string,\n value: string\n ): Promise<Skill[]> {\n const tenantId = getTenantId(request);\n return this.store.searchByMetadata(tenantId, key, value, buildContext(request));\n }\n\n async filterByCompatibility(\n request: FastifyRequest,\n compatibility: string\n ): Promise<Skill[]> {\n const tenantId = getTenantId(request);\n return this.store.filterByCompatibility(tenantId, compatibility, buildContext(request));\n }\n\n async filterByLicense(request: FastifyRequest, license: string): Promise<Skill[]> {\n const tenantId = getTenantId(request);\n return this.store.filterByLicense(tenantId, license, buildContext(request));\n }\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { SkillService } from \"../services/skill_service\";\nimport type { Skill, CreateSkillRequest } from \"@axiom-lattice/protocols\";\n\nconst skillService = new SkillService();\n\nfunction serializeSkill(skill: Skill): any {\n const serialized: any = {\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 content: skill.content,\n subSkills: skill.subSkills,\n createdAt: skill.createdAt instanceof Date ? skill.createdAt.toISOString() : new Date().toISOString(),\n updatedAt: skill.updatedAt instanceof Date ? skill.updatedAt.toISOString() : new Date().toISOString(),\n };\n Object.keys(serialized).forEach((key) => {\n if (serialized[key] === undefined) delete serialized[key];\n });\n return serialized;\n}\n\ninterface SkillListResponse {\n success: boolean;\n message: string;\n data: { records: any[]; total: number };\n}\n\ninterface SkillResponse {\n success: boolean;\n message: string;\n data?: any;\n}\n\ninterface SkillUpdateBody {\n name?: string;\n description?: string;\n license?: string;\n compatibility?: string;\n metadata?: Record<string, string>;\n content?: string;\n subSkills?: string[];\n}\n\nexport async function getSkillList(request: FastifyRequest, reply: FastifyReply): Promise<SkillListResponse> {\n try {\n const skills = await skillService.getAllSkills(request);\n return {\n success: true,\n message: \"Successfully retrieved skill list\",\n data: { records: skills.map(serializeSkill), total: skills.length },\n };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to retrieve skills: ${error.message}`,\n data: { records: [], total: 0 },\n });\n }\n}\n\nexport async function getSkill(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n): Promise<SkillResponse> {\n try {\n const { id } = request.params;\n const skill = await skillService.getSkillById(request, id);\n\n if (!skill) {\n return reply.status(404).send({ success: false, message: \"Skill not found\" });\n }\n\n return { success: true, message: \"Successfully retrieved skill\", data: serializeSkill(skill) };\n } catch (error: any) {\n return reply.status(500).send({ success: false, message: `Failed to retrieve skill: ${error.message}` });\n }\n}\n\nexport async function createSkill(\n request: FastifyRequest<{ Body: CreateSkillRequest }>,\n reply: FastifyReply\n): Promise<SkillResponse> {\n try {\n const data = request.body;\n if (!data.name) {\n return reply.status(400).send({ success: false, message: \"name is required\" });\n }\n if (!data.description) {\n return reply.status(400).send({ success: false, message: \"description is required\" });\n }\n\n const id = (request.body as any).id || data.name;\n if (id !== data.name) {\n return reply.status(400).send({\n success: false,\n message: `id \"${id}\" must equal name \"${data.name}\"`,\n });\n }\n\n const skill = await skillService.createSkill(request, id, data);\n return reply.status(201).send({\n success: true,\n message: \"Successfully created skill\",\n data: serializeSkill(skill),\n });\n } catch (error: any) {\n if (error.message?.includes(\"already exists\")) {\n return reply.status(409).send({ success: false, message: error.message });\n }\n if (error.message?.includes(\"built-in skill\")) {\n return reply.status(403).send({ success: false, message: error.message });\n }\n if (error.message?.includes(\"must equal name\") || error.message?.includes(\"Invalid skill name\")) {\n return reply.status(400).send({ success: false, message: error.message });\n }\n return reply.status(500).send({ success: false, message: `Failed to create skill: ${error.message}` });\n }\n}\n\nexport async function updateSkill(\n request: FastifyRequest<{ Params: { id: string }; Body: SkillUpdateBody }>,\n reply: FastifyReply\n): Promise<SkillResponse> {\n try {\n const { id } = request.params;\n const updates = request.body;\n\n const skill = await skillService.updateSkill(request, id, updates);\n\n if (!skill) {\n return reply.status(404).send({ success: false, message: \"Skill not found\" });\n }\n\n return { success: true, message: \"Successfully updated skill\", data: serializeSkill(skill) };\n } catch (error: any) {\n if (error.message?.includes(\"built-in skill\")) {\n return reply.status(403).send({ success: false, message: error.message });\n }\n if (error.message?.includes(\"Invalid skill name\")) {\n return reply.status(400).send({ success: false, message: error.message });\n }\n return reply.status(500).send({ success: false, message: `Failed to update skill: ${error.message}` });\n }\n}\n\nexport async function deleteSkill(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string }> {\n try {\n const { id } = request.params;\n const result = await skillService.deleteSkill(request, id);\n\n if (!result) {\n return reply.status(404).send({ success: false, message: \"Skill not found\" });\n }\n\n return { success: true, message: \"Successfully deleted skill\" };\n } catch (error: any) {\n if (error.message?.includes(\"built-in skill\")) {\n return reply.status(403).send({ success: false, message: error.message });\n }\n return reply.status(500).send({ success: false, message: `Failed to delete skill: ${error.message}` });\n }\n}\n\nexport async function searchSkillsByMetadata(\n request: FastifyRequest<{ Querystring: { key: string; value: string } }>,\n reply: FastifyReply\n): Promise<SkillListResponse> {\n try {\n const { key, value } = request.query;\n if (!key || !value) {\n return reply.status(400).send({\n success: false,\n message: \"key and value query parameters are required\",\n data: { records: [], total: 0 },\n });\n }\n\n const skills = await skillService.searchByMetadata(request, key, value);\n return {\n success: true,\n message: \"Successfully searched skills\",\n data: { records: skills.map(serializeSkill), total: skills.length },\n };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to search skills: ${error.message}`,\n data: { records: [], total: 0 },\n });\n }\n}\n\nexport async function filterSkillsByCompatibility(\n request: FastifyRequest<{ Querystring: { compatibility: string } }>,\n reply: FastifyReply\n): Promise<SkillListResponse> {\n try {\n const { compatibility } = request.query;\n if (!compatibility) {\n return reply.status(400).send({\n success: false,\n message: \"compatibility query parameter is required\",\n data: { records: [], total: 0 },\n });\n }\n\n const skills = await skillService.filterByCompatibility(request, compatibility);\n return {\n success: true,\n message: \"Successfully filtered skills\",\n data: { records: skills.map(serializeSkill), total: skills.length },\n };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to filter skills: ${error.message}`,\n data: { records: [], total: 0 },\n });\n }\n}\n\nexport async function filterSkillsByLicense(\n request: FastifyRequest<{ Querystring: { license: string } }>,\n reply: FastifyReply\n): Promise<SkillListResponse> {\n try {\n const { license } = request.query;\n if (!license) {\n return reply.status(400).send({\n success: false,\n message: \"license query parameter is required\",\n data: { records: [], total: 0 },\n });\n }\n\n const skills = await skillService.filterByLicense(request, license);\n return {\n success: true,\n message: \"Successfully filtered skills\",\n data: { records: skills.map(serializeSkill), total: skills.length },\n };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to filter skills: ${error.message}`,\n data: { records: [], total: 0 },\n });\n }\n}\n","/**\n * CollectionService\n *\n * Business logic layer for collection management and entry operations.\n * Uses CollectionLatticeManager for registration, VectorStoreLatticeManager for storage,\n * and EmbeddingsLatticeManager for vector embedding.\n * All vector store operations are tenant-isolated.\n */\n\nimport { v4 as uuidv4 } from \"uuid\";\nimport { Document } from \"@langchain/core/documents\";\nimport {\n collectionLatticeManager,\n embeddingsLatticeManager,\n getOrCreateCollectionVectorStore,\n getCollectionEntryCount,\n listCollectionEntries,\n removeCollectionVectorStore,\n} from \"@axiom-lattice/core\";\nimport type {\n Collection,\n CreateCollectionRequest,\n UpdateCollectionRequest,\n} from \"@axiom-lattice/protocols\";\nimport { FastifyRequest } from \"fastify\";\n\nfunction getTenantId(request: FastifyRequest): string {\n return (\n (request as any).user?.tenantId ||\n (request.headers[\"x-tenant-id\"] as string) ||\n \"default\"\n );\n}\n\nexport interface EntryResponse {\n id: string;\n content: string;\n metadata: Record<string, unknown>;\n score?: number;\n}\n\nexport class CollectionService {\n // ─── Collection CRUD ──────────────────────────────────────────\n\n async getAllCollections(request: FastifyRequest): Promise<Collection[]> {\n const tenantId = getTenantId(request);\n const collections = await collectionLatticeManager.getAllCollections(tenantId);\n\n for (const c of collections) {\n try {\n (c as any)._entryCount = await getCollectionEntryCount(c.name, c.embeddingKey, c.tenantId);\n } catch {\n (c as any)._entryCount = 0;\n }\n }\n\n return collections;\n }\n\n async getCollectionByName(\n request: FastifyRequest,\n name: string\n ): Promise<Collection | null> {\n const tenantId = getTenantId(request);\n return collectionLatticeManager.getCollection(tenantId, name);\n }\n\n async createCollection(\n request: FastifyRequest,\n data: CreateCollectionRequest\n ): Promise<Collection> {\n const tenantId = getTenantId(request);\n const collection = await collectionLatticeManager.registerCollection(tenantId, data);\n\n try {\n await getOrCreateCollectionVectorStore(data.name, data.embeddingKey, tenantId);\n } catch (err) {\n console.warn(`[CollectionService] Failed to init vector store for ${data.name}:`, err);\n }\n\n return collection;\n }\n\n async updateCollection(\n request: FastifyRequest,\n name: string,\n updates: UpdateCollectionRequest\n ): Promise<Collection | null> {\n const tenantId = getTenantId(request);\n return collectionLatticeManager.updateCollection(tenantId, name, updates);\n }\n\n async deleteCollection(\n request: FastifyRequest,\n name: string\n ): Promise<boolean> {\n const tenantId = getTenantId(request);\n await removeCollectionVectorStore(name, tenantId);\n return collectionLatticeManager.removeCollection(tenantId, name);\n }\n\n // ─── Entry CRUD ───────────────────────────────────────────────\n\n async getEntries(\n request: FastifyRequest,\n collectionName: string\n ): Promise<EntryResponse[]> {\n const collection = await this.getCollectionByName(request, collectionName);\n if (!collection) throw new Error(`Collection \"${collectionName}\" not found`);\n\n const docs = await listCollectionEntries(collectionName, collection.embeddingKey, collection.tenantId);\n\n return docs.map((doc: Document) => ({\n id: (doc.metadata._id as string) || \"\",\n content: doc.pageContent,\n metadata: Object.fromEntries(\n Object.entries(doc.metadata).filter(([k]) => !k.startsWith(\"_\"))\n ),\n }));\n }\n\n async createEntry(\n request: FastifyRequest,\n collectionName: string,\n data: { content: string; metadata?: Record<string, unknown> }\n ): Promise<EntryResponse> {\n const collection = await this.getCollectionByName(request, collectionName);\n if (!collection) throw new Error(`Collection \"${collectionName}\" not found`);\n\n const vectorStore = await getOrCreateCollectionVectorStore(\n collectionName, collection.embeddingKey, collection.tenantId\n );\n\n const entryId = uuidv4();\n const now = new Date().toISOString();\n const doc = new Document({\n pageContent: data.content,\n metadata: {\n _id: entryId,\n _created_at: now,\n _updated_at: now,\n ...(data.metadata || {}),\n },\n });\n\n await vectorStore.addDocuments([doc]);\n\n return { id: entryId, content: data.content, metadata: data.metadata || {} };\n }\n\n async getEntry(\n request: FastifyRequest,\n collectionName: string,\n entryId: string\n ): Promise<EntryResponse | null> {\n const collection = await this.getCollectionByName(request, collectionName);\n if (!collection) throw new Error(`Collection \"${collectionName}\" not found`);\n\n const docs = await listCollectionEntries(collectionName, collection.embeddingKey, collection.tenantId);\n const doc = docs.find((d: Document) => d.metadata._id === entryId);\n if (!doc) return null;\n return {\n id: entryId,\n content: doc.pageContent,\n metadata: Object.fromEntries(\n Object.entries(doc.metadata).filter(([k]) => !k.startsWith(\"_\"))\n ),\n };\n }\n\n async updateEntry(\n request: FastifyRequest,\n collectionName: string,\n entryId: string,\n data: { content?: string; metadata?: Record<string, unknown> }\n ): Promise<EntryResponse | null> {\n const existing = await this.getEntry(request, collectionName, entryId);\n if (!existing) return null;\n\n const collection = await this.getCollectionByName(request, collectionName);\n if (!collection) throw new Error(`Collection \"${collectionName}\" not found`);\n\n const vectorStore = await getOrCreateCollectionVectorStore(\n collectionName, collection.embeddingKey, collection.tenantId\n );\n\n try {\n await vectorStore.delete({ filter: { _id: entryId } } as any);\n } catch {\n // best effort\n }\n\n const now = new Date().toISOString();\n const mergedMetadata = { ...existing.metadata, ...(data.metadata || {}) };\n const doc = new Document({\n pageContent: data.content ?? existing.content,\n metadata: { _id: entryId, _created_at: now, _updated_at: now, ...mergedMetadata },\n });\n\n await vectorStore.addDocuments([doc]);\n\n return { id: entryId, content: data.content ?? existing.content, metadata: mergedMetadata };\n }\n\n async deleteEntry(\n request: FastifyRequest,\n collectionName: string,\n entryId: string\n ): Promise<boolean> {\n const collection = await this.getCollectionByName(request, collectionName);\n if (!collection) throw new Error(`Collection \"${collectionName}\" not found`);\n\n const vectorStore = await getOrCreateCollectionVectorStore(\n collectionName, collection.embeddingKey, collection.tenantId\n );\n\n try {\n await vectorStore.delete({ filter: { _id: entryId } } as any);\n return true;\n } catch {\n return false;\n }\n }\n\n async searchEntries(\n request: FastifyRequest,\n collectionName: string,\n params: { query: string; filter?: Record<string, unknown>; top_k?: number }\n ): Promise<EntryResponse[]> {\n const collection = await this.getCollectionByName(request, collectionName);\n if (!collection) throw new Error(`Collection \"${collectionName}\" not found`);\n\n const vectorStore = await getOrCreateCollectionVectorStore(\n collectionName, collection.embeddingKey, collection.tenantId\n );\n\n let embeddings;\n try {\n embeddings = embeddingsLatticeManager.getEmbeddingsClient(collection.embeddingKey);\n } catch {\n embeddings = embeddingsLatticeManager.getEmbeddingsClient(\"default\");\n }\n\n const queryVector = await embeddings.embedQuery(params.query);\n const results = await vectorStore.similaritySearchVectorWithScore(\n queryVector, params.top_k || 5, params.filter as any\n );\n\n return results.map(([doc, score]: [Document, number]) => ({\n id: (doc.metadata._id as string) || uuidv4(),\n content: doc.pageContent,\n metadata: Object.fromEntries(\n Object.entries(doc.metadata).filter(([k]) => !k.startsWith(\"_\"))\n ),\n score,\n }));\n }\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { CollectionService } from \"../services/collection_service\";\nimport type {\n Collection,\n CreateCollectionRequest,\n UpdateCollectionRequest,\n} from \"@axiom-lattice/protocols\";\n\nconst collectionService = new CollectionService();\n\nfunction serializeCollection(collection: Collection): any {\n return {\n id: collection.id,\n name: collection.name,\n label: collection.label,\n embeddingKey: collection.embeddingKey,\n schema: collection.schema,\n entryCount: (collection as any)._entryCount ?? 0,\n createdAt:\n collection.createdAt instanceof Date\n ? collection.createdAt.toISOString()\n : new Date().toISOString(),\n updatedAt:\n collection.updatedAt instanceof Date\n ? collection.updatedAt.toISOString()\n : new Date().toISOString(),\n };\n}\n\nexport async function getCollectionList(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<any> {\n try {\n const collections = await collectionService.getAllCollections(request);\n return {\n success: true,\n message: \"Successfully retrieved collection list\",\n data: {\n records: collections.map(serializeCollection),\n total: collections.length,\n },\n };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to retrieve collections: ${error.message}`,\n data: { records: [], total: 0 },\n });\n }\n}\n\nexport async function getCollection(\n request: FastifyRequest<{ Params: { name: string } }>,\n reply: FastifyReply\n): Promise<any> {\n try {\n const { name } = request.params;\n const collection = await collectionService.getCollectionByName(request, name);\n\n if (!collection) {\n return reply\n .status(404)\n .send({ success: false, message: \"Collection not found\" });\n }\n\n return {\n success: true,\n message: \"Successfully retrieved collection\",\n data: serializeCollection(collection),\n };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to retrieve collection: ${error.message}`,\n });\n }\n}\n\nexport async function createCollection(\n request: FastifyRequest<{ Body: CreateCollectionRequest }>,\n reply: FastifyReply\n): Promise<any> {\n try {\n const data = request.body;\n if (!data.name) {\n return reply\n .status(400)\n .send({ success: false, message: \"name is required\" });\n }\n if (!data.label) {\n return reply\n .status(400)\n .send({ success: false, message: \"label is required\" });\n }\n if (!data.embeddingKey) {\n return reply\n .status(400)\n .send({ success: false, message: \"embeddingKey is required\" });\n }\n\n const collection = await collectionService.createCollection(request, data);\n return reply.status(201).send({\n success: true,\n message: \"Successfully created collection\",\n data: serializeCollection(collection),\n });\n } catch (error: any) {\n if (error.message?.includes(\"already exists\")) {\n return reply.status(409).send({ success: false, message: error.message });\n }\n return reply.status(500).send({\n success: false,\n message: `Failed to create collection: ${error.message}`,\n });\n }\n}\n\nexport async function updateCollection(\n request: FastifyRequest<{\n Params: { name: string };\n Body: UpdateCollectionRequest;\n }>,\n reply: FastifyReply\n): Promise<any> {\n try {\n const { name } = request.params;\n const updates = request.body;\n\n const collection = await collectionService.updateCollection(\n request,\n name,\n updates\n );\n\n if (!collection) {\n return reply\n .status(404)\n .send({ success: false, message: \"Collection not found\" });\n }\n\n return {\n success: true,\n message: \"Successfully updated collection\",\n data: serializeCollection(collection),\n };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to update collection: ${error.message}`,\n });\n }\n}\n\nexport async function deleteCollection(\n request: FastifyRequest<{ Params: { name: string } }>,\n reply: FastifyReply\n): Promise<any> {\n try {\n const { name } = request.params;\n const result = await collectionService.deleteCollection(request, name);\n\n if (!result) {\n return reply\n .status(404)\n .send({ success: false, message: \"Collection not found\" });\n }\n\n return { success: true, message: \"Successfully deleted collection\" };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to delete collection: ${error.message}`,\n });\n }\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { embeddingsLatticeManager } from \"@axiom-lattice/core\";\n\nexport async function listEmbeddings(\n _request: FastifyRequest,\n _reply: FastifyReply\n): Promise<any> {\n try {\n const info = embeddingsLatticeManager.getAllEmbeddingsInfo();\n return {\n success: true,\n message: \"Successfully retrieved embedding models\",\n data: { records: info, total: info.length },\n };\n } catch (error: any) {\n return {\n success: false,\n message: `Failed to retrieve embeddings: ${error.message}`,\n data: { records: [], total: 0 },\n };\n }\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { CollectionService } from \"../services/collection_service\";\n\nconst collectionService = new CollectionService();\n\nexport async function listEntries(\n request: FastifyRequest<{ Params: { name: string } }>,\n reply: FastifyReply\n): Promise<any> {\n try {\n const { name } = request.params;\n const entries = await collectionService.getEntries(request, name);\n return {\n success: true,\n message: \"Successfully retrieved entries\",\n data: { records: entries, total: entries.length },\n };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to retrieve entries: ${error.message}`,\n data: { records: [], total: 0 },\n });\n }\n}\n\nexport async function createEntry(\n request: FastifyRequest<{ Params: { name: string }; Body: { content: string; metadata?: Record<string, unknown> } }>,\n reply: FastifyReply\n): Promise<any> {\n try {\n const { name } = request.params;\n const data = request.body;\n if (!data.content) {\n return reply.status(400).send({ success: false, message: \"content is required\" });\n }\n\n const entry = await collectionService.createEntry(request, name, data);\n return reply.status(201).send({\n success: true,\n message: \"Successfully created entry\",\n data: entry,\n });\n } catch (error: any) {\n if (error.message?.includes(\"not found\")) {\n return reply.status(404).send({ success: false, message: error.message });\n }\n return reply.status(500).send({\n success: false,\n message: `Failed to create entry: ${error.message}`,\n });\n }\n}\n\nexport async function getEntry(\n request: FastifyRequest<{ Params: { name: string; id: string } }>,\n reply: FastifyReply\n): Promise<any> {\n try {\n const { name, id } = request.params;\n const entry = await collectionService.getEntry(request, name, id);\n\n if (!entry) {\n return reply.status(404).send({ success: false, message: \"Entry not found\" });\n }\n\n return {\n success: true,\n message: \"Successfully retrieved entry\",\n data: entry,\n };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to retrieve entry: ${error.message}`,\n });\n }\n}\n\nexport async function updateEntry(\n request: FastifyRequest<{ Params: { name: string; id: string }; Body: { content?: string; metadata?: Record<string, unknown> } }>,\n reply: FastifyReply\n): Promise<any> {\n try {\n const { name, id } = request.params;\n const data = request.body;\n\n const entry = await collectionService.updateEntry(request, name, id, data);\n\n if (!entry) {\n return reply.status(404).send({ success: false, message: \"Entry not found\" });\n }\n\n return {\n success: true,\n message: \"Successfully updated entry\",\n data: entry,\n };\n } catch (error: any) {\n if (error.message?.includes(\"not found\")) {\n return reply.status(404).send({ success: false, message: error.message });\n }\n return reply.status(500).send({\n success: false,\n message: `Failed to update entry: ${error.message}`,\n });\n }\n}\n\nexport async function deleteEntry(\n request: FastifyRequest<{ Params: { name: string; id: string } }>,\n reply: FastifyReply\n): Promise<any> {\n try {\n const { name, id } = request.params;\n const result = await collectionService.deleteEntry(request, name, id);\n\n if (!result) {\n return reply.status(404).send({ success: false, message: \"Entry not found\" });\n }\n\n return { success: true, message: \"Successfully deleted entry\" };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to delete entry: ${error.message}`,\n });\n }\n}\n\nexport async function searchEntries(\n request: FastifyRequest<{\n Params: { name: string };\n Body: { query: string; filter?: Record<string, unknown>; top_k?: number };\n }>,\n reply: FastifyReply\n): Promise<any> {\n try {\n const { name } = request.params;\n const { query, filter, top_k } = request.body;\n\n if (!query) {\n return reply.status(400).send({ success: false, message: \"query is required\" });\n }\n\n const entries = await collectionService.searchEntries(request, name, {\n query,\n filter,\n top_k,\n });\n\n return {\n success: true,\n message: \"Search completed\",\n data: { records: entries, total: entries.length },\n };\n } catch (error: any) {\n if (error.message?.includes(\"not found\")) {\n return reply.status(404).send({ success: false, message: error.message });\n }\n return reply.status(500).send({\n success: false,\n message: `Search failed: ${error.message}`,\n data: { records: [], total: 0 },\n });\n }\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { toolLatticeManager } from \"@axiom-lattice/core\";\nimport type {\n ToolConfig,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * Tools Controller\n * Handles tool-related operations\n */\n\n/**\n * Tool config meta response interface\n */\ninterface ToolConfigMetaResponse {\n success: boolean;\n message: string;\n data: {\n records: Array<{\n id: string;\n name: string;\n description: string;\n schema?: any; // Serialized schema\n returnDirect?: boolean;\n needUserApprove?: boolean;\n }>;\n total: number;\n };\n}\n\n/**\n * Serialize ZodSchema to JSON-serializable format\n * Attempts to extract schema information for API response\n */\nfunction serializeSchema(schema: any): any {\n if (!schema) {\n return undefined;\n }\n\n try {\n // Try to get JSON schema if available (zod-to-json-schema or similar)\n if (schema._def) {\n // For Zod schemas, try to extract basic info\n const def = schema._def;\n if (def.typeName === \"ZodObject\") {\n // Extract shape information\n const shape = def.shape();\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n const fieldDef = (value as any)._def;\n if (fieldDef) {\n properties[key] = {\n type: fieldDef.typeName === \"ZodString\" ? \"string\" :\n fieldDef.typeName === \"ZodNumber\" ? \"number\" :\n fieldDef.typeName === \"ZodBoolean\" ? \"boolean\" :\n fieldDef.typeName === \"ZodArray\" ? \"array\" :\n fieldDef.typeName === \"ZodObject\" ? \"object\" : \"unknown\",\n description: fieldDef.description,\n };\n if (!(value as any).isOptional()) {\n required.push(key);\n }\n }\n }\n\n return {\n type: \"object\",\n properties,\n required: required.length > 0 ? required : undefined,\n };\n }\n }\n\n // Fallback: return schema description or type name\n return {\n type: \"object\",\n description: schema.description || \"Schema definition\",\n };\n } catch (error) {\n // If serialization fails, return a safe fallback\n return {\n type: \"object\",\n description: \"Schema definition\",\n };\n }\n}\n\n/**\n * Get tool config meta from ToolLatticeManager\n * Exposes tool configuration metadata via /api/tools endpoint\n */\nexport async function getToolConfigs(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<ToolConfigMetaResponse> {\n try {\n const allLattices = toolLatticeManager.getAllLattices();\n \n const toolConfigs = allLattices.map((lattice) => {\n const config = { ...lattice.config };\n \n // Serialize schema if present\n const serializedSchema = config.schema ? serializeSchema(config.schema) : undefined;\n\n return {\n id: lattice.key,\n name: config.name,\n description: config.description,\n schema: serializedSchema,\n returnDirect: config.returnDirect,\n needUserApprove: config.needUserApprove,\n };\n });\n\n return reply.send({\n success: true,\n message: \"Successfully retrieved tool configs\",\n data: {\n records: toolConfigs,\n total: toolConfigs.length,\n },\n });\n } catch (error: any) {\n console.error(\"Failed to get tool configs\", {\n error: error.message,\n stack: error.stack,\n });\n return reply.status(500).send({\n success: false,\n message: `Failed to retrieve tool configs: ${error.message}`,\n data: {\n records: [],\n total: 0,\n },\n });\n }\n}","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport {\n getStoreLattice,\n metricsServerManager,\n SemanticMetricsClient,\n} from \"@axiom-lattice/core\";\nimport type {\n MetricsServerConfigStore,\n SemanticMetricsServerConfig,\n SemanticMetricsFilter,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * Get tenant ID from request headers\n */\nfunction getTenantId(request: FastifyRequest): string {\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\n/**\n * Data query request body\n */\ninterface DataQueryRequest {\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 customSql?: string;\n params?: Record<string, string | number | boolean>;\n limit?: number;\n}\n\n/**\n * Data query response - 只返回原始数据\n */\ninterface DataQueryResponse {\n success: boolean;\n message: string;\n data?: {\n // 语义查询结果\n semanticModel?: string;\n columns: Array<{ name: string; type: string }>;\n rows?: Array<Array<unknown>>;\n rowsObject?: Array<Record<string, unknown>>;\n // SQL 查询结果\n tableName?: string;\n executedSql?: string;\n // 通用元数据\n metadata: {\n rowCount: number;\n executionTimeMs?: number;\n };\n };\n}\n\n/**\n * Execute data query (semantic or SQL)\n */\nexport async function executeDataQuery(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<DataQueryResponse> {\n const tenantId = getTenantId(request);\n const body = request.body as DataQueryRequest;\n\n try {\n // Validate request\n if (!body.serverKey && !body.datasourceId) {\n reply.code(400);\n return {\n success: false,\n message: \"Either serverKey or datasourceId must be provided\",\n };\n }\n\n // Determine query type\n const isSemanticQuery = body.metrics && body.metrics.length > 0;\n const isSqlQuery = body.customSql && body.customSql.trim().length > 0;\n\n if (!isSemanticQuery && !isSqlQuery) {\n reply.code(400);\n return {\n success: false,\n message: \"Either metrics (for semantic query) or customSql (for SQL query) must be provided\",\n };\n }\n\n if (isSemanticQuery && isSqlQuery) {\n reply.code(400);\n return {\n success: false,\n message: \"Cannot provide both metrics and customSql. Use one query type only.\",\n };\n }\n\n // Get server config\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n if (!body.serverKey) {\n reply.code(400);\n return {\n success: false,\n message: \"serverKey is required\",\n };\n }\n\n const config = await store.getConfigByKey(tenantId, body.serverKey);\n if (!config) {\n reply.code(404);\n return {\n success: false,\n message: `Metrics server configuration not found: ${body.serverKey}`,\n };\n }\n\n if (config.config.type !== \"semantic\") {\n reply.code(400);\n return {\n success: false,\n message: \"This endpoint only supports semantic metrics servers\",\n };\n }\n\n if (!body.datasourceId) {\n reply.code(400);\n return {\n success: false,\n message: \"datasourceId is required\",\n };\n }\n\n // Get client from manager (queries store for latest config)\n let client: SemanticMetricsClient;\n try {\n client = await metricsServerManager.getClient(tenantId, body.serverKey) as SemanticMetricsClient;\n } catch {\n reply.code(400);\n return {\n success: false,\n message: `Metrics server not registered: ${body.serverKey}. Please register the server first.`,\n };\n }\n\n // Execute query based on type\n if (isSemanticQuery) {\n return await executeSemanticQuery(client, body, reply);\n } else {\n return await executeSqlQuery(client, body, reply);\n }\n } catch (error) {\n console.error(\"Failed to execute data query:\", error);\n reply.code(500);\n return {\n success: false,\n message: `Failed to execute data query: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Execute semantic query\n */\nasync function executeSemanticQuery(\n client: SemanticMetricsClient,\n body: DataQueryRequest,\n reply: FastifyReply\n): Promise<DataQueryResponse> {\n const semanticFilters: SemanticMetricsFilter[] = (body.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: body.datasourceId!,\n metrics: body.metrics!,\n groupBy: body.groupBy,\n filters: semanticFilters,\n limit: body.limit || 1000,\n });\n\n // 直接返回原始数据,不做 ECharts 转换\n return {\n success: true,\n message: \"Semantic query executed successfully\",\n data: {\n semanticModel: result.semanticModel,\n columns: result.columns,\n rows: result.rows,\n rowsObject: result.rowsObject,\n metadata: {\n rowCount: result.rowCount,\n executionTimeMs: result.executionTimeMs,\n },\n },\n };\n}\n\n/**\n * Execute SQL query\n */\nasync function executeSqlQuery(\n client: SemanticMetricsClient,\n body: DataQueryRequest,\n reply: FastifyReply\n): Promise<DataQueryResponse> {\n const result = await client.executeSqlQuery({\n datasourceId: body.datasourceId!,\n customSql: body.customSql!,\n params: body.params,\n limit: body.limit || 100,\n });\n\n // 直接返回原始数据,不做 ECharts 转换\n return {\n success: true,\n message: \"SQL query executed successfully\",\n data: {\n tableName: result.tableName,\n columns: result.columns.map(name => ({ name, type: 'unknown' })),\n rows: result.rows,\n rowsObject: result.rowsObject,\n executedSql: result.executedSql,\n metadata: {\n rowCount: result.rowCount,\n executionTimeMs: result.executionTimeMs,\n },\n },\n };\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { getStoreLattice, agentInstanceManager, ThreadStatus, abortWorkflowRun as signalAbort } from \"@axiom-lattice/core\";\nimport type { WorkflowTrackingStore, WorkflowRun, RunStep } from \"@axiom-lattice/protocols\";\nimport { MessageChunkTypes } from \"@axiom-lattice/protocols\";\n\nfunction getTenantId(request: FastifyRequest): string {\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) return userTenantId;\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\nfunction getTrackingStore(): WorkflowTrackingStore | null {\n try {\n const storeLattice = getStoreLattice(\"default\", \"workflowTracking\");\n return storeLattice.store;\n } catch {\n return null;\n }\n}\n\ninterface ApiResponse<T = any> {\n success: boolean;\n message: string;\n data?: T;\n}\n\nasync function getDefinitionsFromAssistants(tenantId: string): Promise<Array<{\n assistantId: string;\n assistantName: string;\n description?: string;\n topologyEdges: { from: string; to: string; purpose: string }[];\n totalEdges: number;\n}>> {\n try {\n const storeLattice = getStoreLattice(\"default\", \"assistant\");\n const assistantStore = storeLattice.store;\n const assistants = await assistantStore.getAllAssistants(tenantId);\n\n const results: Array<{\n assistantId: string;\n assistantName: string;\n description?: string;\n topologyEdges: { from: string; to: string; purpose: string }[];\n totalEdges: number;\n }> = [];\n\n for (const a of assistants) {\n const def = a.graphDefinition;\n if (!def || def.type !== \"processing\") continue;\n if (!def.middleware) continue;\n for (const mw of def.middleware) {\n if (mw.type === \"topology\" && mw.enabled) {\n results.push({\n assistantId: a.id,\n assistantName: a.name,\n description: a.description,\n topologyEdges: mw.config.edges,\n totalEdges: mw.config.edges.length,\n });\n }\n }\n }\n return results;\n } catch {\n return [];\n }\n}\n\nexport async function getAllWorkflowDefinitions(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<ApiResponse<{ records: any[] }>> {\n const tenantId = getTenantId(request);\n\n try {\n // Get definitions from assistant configs (always available, even before first run)\n const configDefs = await getDefinitionsFromAssistants(tenantId);\n\n if (configDefs.length === 0) {\n return {\n success: true,\n message: \"No workflow definitions found\",\n data: { records: [] },\n };\n }\n\n // Merge in run-derived data (lastRunAt, runCount) if tracking store exists\n const runMap = new Map<string, { lastRunAt?: string; runCount: number }>();\n try {\n const store = getTrackingStore();\n if (store) {\n const runs = await store.getWorkflowRunsByTenantId(tenantId);\n for (const r of runs) {\n const entry = runMap.get(r.assistantId) || { runCount: 0 };\n entry.runCount++;\n if (!entry.lastRunAt || new Date(r.startedAt) > new Date(entry.lastRunAt)) {\n entry.lastRunAt = r.startedAt instanceof Date ? r.startedAt.toISOString() : String(r.startedAt);\n }\n runMap.set(r.assistantId, entry);\n }\n }\n } catch {\n // tracking store unavailable, definitions from config only\n }\n\n const definitions = configDefs.map((d) => {\n const runInfo = runMap.get(d.assistantId);\n return {\n ...d,\n lastRunAt: runInfo?.lastRunAt || null,\n runCount: runInfo?.runCount || 0,\n };\n });\n\n return {\n success: true,\n message: \"Successfully retrieved workflow definitions\",\n data: { records: definitions },\n };\n } catch (error) {\n request.log.error(error, \"Failed to get workflow definitions\");\n return reply.status(500).send({ success: false, message: \"Failed to retrieve workflow definitions\" });\n }\n}\n\nexport async function getAllWorkflowRuns(\n request: FastifyRequest<{ Querystring: { assistantId?: string; status?: string } }>,\n reply: FastifyReply\n): Promise<ApiResponse<{ records: any[]; total: number }>> {\n const tenantId = getTenantId(request);\n const { assistantId, status } = request.query;\n\n try {\n const store = getTrackingStore();\n if (!store) {\n return reply.status(404).send({ success: false, message: \"No workflow tracking store configured\" });\n }\n\n // Resolve assistant names\n const nameMap: Record<string, string> = {};\n try {\n const asStoreLattice = getStoreLattice(\"default\", \"assistant\");\n const assistantStore = asStoreLattice.store;\n const assistants = await assistantStore.getAllAssistants(tenantId);\n for (const a of assistants) {\n nameMap[a.id] = a.name;\n }\n } catch {\n // names unavailable, will fall back to ID\n }\n\n let runs: WorkflowRun[];\n if (assistantId) {\n runs = await store.getWorkflowRunsByAssistantId(tenantId, assistantId);\n } else {\n runs = await store.getWorkflowRunsByTenantId(tenantId);\n }\n\n if (status) {\n runs = runs.filter(r => r.status === status);\n }\n\n // Enrich runs with step counts (more accurate than edge-based counts for branching workflows)\n const enrichedRuns = await Promise.all(\n runs.map(async (run) => {\n try {\n const steps = await store.getRunSteps(run.id);\n const totalSteps = steps.length;\n const completedSteps = steps.filter(s => s.status === 'completed').length;\n return { ...run, totalSteps, completedSteps, assistantName: nameMap[run.assistantId] || run.assistantId };\n } catch {\n return { ...run, totalSteps: 0, completedSteps: 0, assistantName: nameMap[run.assistantId] || run.assistantId };\n }\n })\n );\n\n return {\n success: true,\n message: \"Successfully retrieved workflow runs\",\n data: { records: enrichedRuns, total: enrichedRuns.length },\n };\n } catch (error) {\n request.log.error({ tenantId, assistantId, status, error: (error as Error).stack || (error as Error).message }, \"Failed to get workflow runs\");\n return reply.status(500).send({\n success: false,\n message: `Failed to retrieve workflow runs: ${(error as Error).message}`,\n });\n }\n}\n\n// GET /api/workflows/inbox\n// Pagination semantics:\n// - No page/pageSize → legacy mode: all interrupted items, data = { records } (unchanged shape).\n// - page and/or pageSize → paged mode: store-level pagination over interrupted runs,\n// data = { records, total, page, pageSize }. total = number of interrupted RUNS\n// (each run expands to 0..N inbox items after the agent-state check).\nconst INBOX_DEFAULT_PAGE_SIZE = 20;\nconst INBOX_MAX_PAGE_SIZE = 100;\n\nexport async function getInboxItems(\n request: FastifyRequest<{ Querystring: { page?: string; pageSize?: string } }>,\n reply: FastifyReply\n): Promise<ApiResponse<{ records: any[]; total?: number; page?: number; pageSize?: number }>> {\n const tenantId = getTenantId(request);\n\n try {\n const store = getTrackingStore();\n if (!store) {\n return { success: true, message: \"No tracking store configured\", data: { records: [] } };\n }\n\n // Resolve assistant names\n const nameMap: Record<string, string> = {};\n try {\n const asStoreLattice = getStoreLattice(\"default\", \"assistant\");\n const assistantStore = asStoreLattice.store;\n const assistants = await assistantStore.getAllAssistants(tenantId);\n for (const a of assistants) {\n nameMap[a.id] = a.name;\n }\n } catch {\n // names unavailable, will fall back to ID\n }\n\n const { page: pageParam, pageSize: pageSizeParam } = request.query;\n const paged = pageParam !== undefined || pageSizeParam !== undefined;\n const page = Math.max(1, parseInt(pageParam ?? \"\", 10) || 1);\n const pageSize = Math.min(INBOX_MAX_PAGE_SIZE, Math.max(1, parseInt(pageSizeParam ?? \"\", 10) || INBOX_DEFAULT_PAGE_SIZE));\n\n let pendingRuns: WorkflowRun[];\n let total: number | undefined;\n if (paged) {\n const result = await store.queryWorkflowRuns(tenantId, {\n status: \"interrupted\",\n limit: pageSize,\n offset: (page - 1) * pageSize,\n });\n pendingRuns = result.records;\n total = result.total;\n } else {\n const result = await store.queryWorkflowRuns(tenantId, { status: \"interrupted\" });\n pendingRuns = result.records;\n }\n\n if (pendingRuns.length === 0) {\n return {\n success: true,\n message: \"No pending workflows\",\n data: paged ? { records: [], total, page, pageSize } : { records: [] },\n };\n }\n\n // Parallelize agent checks across interrupted workflows\n const checkPromises = pendingRuns.map(async (r) => {\n try {\n const [steps, agent] = await Promise.all([\n store.getRunSteps(r.id).catch(() => []),\n (async () => {\n try {\n return agentInstanceManager.getAgent({\n assistant_id: r.assistantId,\n thread_id: r.threadId,\n tenant_id: r.tenantId,\n });\n } catch {\n return null;\n }\n })(),\n ]);\n\n if (!agent) {\n // Agent not available — still return raw item so UI knows a human step exists\n return [{\n runId: r.id,\n assistantId: r.assistantId,\n assistantName: nameMap[r.assistantId] || r.assistantId,\n threadId: r.threadId,\n tenantId: r.tenantId,\n status: r.status,\n startedAt: r.startedAt,\n totalEdges: r.totalEdges,\n completedEdges: r.completedEdges,\n steps,\n }];\n }\n\n const runStatus = await agent.getRunStatus();\n if (runStatus !== \"interrupted\") return [];\n\n const state = await agent.getCurrentState();\n const interrupts = state.tasks\n ?.flatMap((t: any) => t.interrupts || []) || [];\n\n return interrupts.map((i: any) => ({\n runId: r.id,\n assistantId: r.assistantId,\n assistantName: nameMap[r.assistantId] || r.assistantId,\n threadId: r.threadId,\n tenantId: r.tenantId,\n interruptId: i.id,\n interruptValue: i.value,\n status: r.status,\n startedAt: r.startedAt,\n totalEdges: r.totalEdges,\n completedEdges: r.completedEdges,\n steps,\n }));\n } catch (err) {\n request.log.warn({ runId: r.id, error: (err as Error).message }, \"Agent check skipped\");\n return [];\n }\n });\n\n const results = await Promise.all(checkPromises);\n const inboxItems = results.flat();\n // Runs are already sorted by updatedAt DESC, id DESC from queryWorkflowRuns.\n // flatMap preserves run order within each run.\n\n return {\n success: true,\n message: \"Successfully retrieved inbox items\",\n data: paged ? { records: inboxItems, total, page, pageSize } : { records: inboxItems },\n };\n } catch (error) {\n request.log.error(error, \"Failed to get inbox items\");\n return reply.status(500).send({ success: false, message: \"Failed to retrieve inbox items\" });\n }\n}\n\nexport async function getWorkflowDefinitions(\n request: FastifyRequest<{ Params: { assistantId: string } }>,\n reply: FastifyReply\n): Promise<ApiResponse<{ records: any[] }>> {\n const { assistantId } = request.params;\n const tenantId = getTenantId(request);\n\n try {\n const store = getTrackingStore();\n if (!store) {\n return reply.status(404).send({ success: false, message: \"No workflow tracking store configured\" });\n }\n\n const runs = await store.getWorkflowRunsByAssistantId(tenantId, assistantId);\n const seen = new Set<string>();\n const definitions = runs\n .filter(r => {\n const key = JSON.stringify(r.topologyEdges);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n })\n .map(r => ({\n assistantId: r.assistantId,\n topologyEdges: r.topologyEdges,\n totalEdges: r.totalEdges,\n lastRunAt: r.startedAt,\n }));\n\n return {\n success: true,\n message: \"Successfully retrieved workflow definitions\",\n data: { records: definitions },\n };\n } catch (error) {\n request.log.error(error, \"Failed to get workflow definitions\");\n return reply.status(500).send({ success: false, message: \"Failed to retrieve workflow definitions\" });\n }\n}\n\nexport async function getWorkflowRuns(\n request: FastifyRequest<{ Params: { assistantId: string; threadId: string } }>,\n reply: FastifyReply\n): Promise<ApiResponse<{ records: WorkflowRun[]; total: number }>> {\n const { threadId } = request.params;\n const tenantId = getTenantId(request);\n\n try {\n const store = getTrackingStore();\n if (!store) {\n return reply.status(404).send({ success: false, message: \"No workflow tracking store configured\" });\n }\n\n const runs = await store.getWorkflowRunsByThreadId(tenantId, threadId);\n return {\n success: true,\n message: \"Successfully retrieved workflow runs\",\n data: { records: runs, total: runs.length },\n };\n } catch (error) {\n request.log.error(error, \"Failed to get workflow runs\");\n return reply.status(500).send({ success: false, message: \"Failed to retrieve workflow runs\" });\n }\n}\n\nexport async function getWorkflowRun(\n request: FastifyRequest<{ Params: { runId: string } }>,\n reply: FastifyReply\n): Promise<ApiResponse<WorkflowRun>> {\n const { runId } = request.params;\n\n try {\n const store = getTrackingStore();\n if (!store) {\n return reply.status(404).send({ success: false, message: \"No workflow tracking store configured\" });\n }\n\n const run = await store.getWorkflowRun(runId);\n if (!run) {\n return reply.status(404).send({ success: false, message: \"Workflow run not found\" });\n }\n\n return { success: true, message: \"Successfully retrieved workflow run\", data: run };\n } catch (error) {\n request.log.error(error, \"Failed to get workflow run\");\n return reply.status(500).send({ success: false, message: \"Failed to retrieve workflow run\" });\n }\n}\n\nexport async function deleteWorkflowRun(\n request: FastifyRequest<{ Params: { runId: string } }>,\n reply: FastifyReply\n): Promise<ApiResponse> {\n const { runId } = request.params;\n const tenantId = getTenantId(request);\n\n try {\n const store = getTrackingStore();\n if (!store) {\n return reply.status(404).send({ success: false, message: \"No workflow tracking store configured\" });\n }\n\n const run = await store.getWorkflowRun(runId);\n if (!run) {\n return reply.status(404).send({ success: false, message: \"Workflow run not found\" });\n }\n\n // If run is still running, abort the agent first\n if (run.status === \"running\") {\n try {\n const workspace_id = request.headers[\"x-workspace-id\"] as string;\n const project_id = request.headers[\"x-project-id\"] as string;\n const agent = agentInstanceManager.getAgent({\n assistant_id: run.assistantId,\n thread_id: run.threadId,\n tenant_id: tenantId,\n workspace_id,\n project_id,\n });\n await agent.abort();\n } catch (err) {\n request.log.warn({ runId, error: (err as Error).message }, \"Failed to abort agent, deleting tracking records anyway\");\n }\n }\n\n await store.deleteWorkflowRun(runId);\n\n return { success: true, message: \"Workflow run deleted\" };\n } catch (error) {\n request.log.error(error, \"Failed to delete workflow run\");\n return reply.status(500).send({ success: false, message: \"Failed to delete workflow run\" });\n }\n}\n\nexport async function getRunSteps(\n request: FastifyRequest<{ Params: { runId: string }; Querystring: { step_type?: string; status?: string } }>,\n reply: FastifyReply\n): Promise<ApiResponse<{ records: RunStep[]; total: number }>> {\n const { runId } = request.params;\n const { step_type, status: stepStatus } = request.query;\n\n try {\n const store = getTrackingStore();\n if (!store) {\n return reply.status(404).send({ success: false, message: \"No workflow tracking store configured\" });\n }\n\n let steps: RunStep[];\n if (step_type) {\n steps = await store.getRunStepsByType(runId, step_type as any);\n } else {\n steps = await store.getRunSteps(runId);\n }\n\n if (stepStatus) {\n steps = steps.filter(s => s.status === stepStatus);\n }\n\n return {\n success: true,\n message: \"Successfully retrieved run steps\",\n data: { records: steps, total: steps.length },\n };\n } catch (error) {\n request.log.error({ runId, error: (error as Error).stack || (error as Error).message }, \"Failed to get run steps\");\n return reply.status(500).send({\n success: false,\n message: `Failed to retrieve run steps: ${(error as Error).message}`,\n });\n }\n}\n\nexport async function getRunTasks(\n request: FastifyRequest<{ Params: { runId: string } }>,\n reply: FastifyReply\n): Promise<ApiResponse<{ records: RunStep[]; total: number }>> {\n const { runId } = request.params;\n\n try {\n const store = getTrackingStore();\n if (!store) {\n return reply.status(404).send({ success: false, message: \"No workflow tracking store configured\" });\n }\n\n const steps = await store.getInterruptedSteps(runId);\n return {\n success: true,\n message: \"Successfully retrieved user tasks\",\n data: { records: steps, total: steps.length },\n };\n } catch (error) {\n request.log.error(error, \"Failed to get run tasks\");\n return reply.status(500).send({ success: false, message: \"Failed to retrieve user tasks\" });\n }\n}\n\n// 简化的 Inbox 任务回复接口\ninterface ReplyInboxRequest {\n runId: string;\n answers: Array<{\n questionIndex: number;\n selectedOptions: string[];\n }>;\n}\n\nexport async function replyInboxTask(\n request: FastifyRequest<{ Body: ReplyInboxRequest }>,\n reply: FastifyReply\n): Promise<void> {\n const { runId, answers } = request.body;\n const tenantId = getTenantId(request);\n\n try {\n // 1. 获取 WorkflowRun 信息\n const store = getTrackingStore();\n if (!store) {\n return reply.status(404).send({ \n success: false, \n message: \"No workflow tracking store configured\" \n });\n }\n\n const run = await store.getWorkflowRun(runId);\n if (!run) {\n return reply.status(404).send({ \n success: false, \n message: \"Workflow run not found\" \n });\n }\n\n // 2. 获取 Agent 实例(补齐参数,与 createRun 一致)\n const workspace_id = request.headers[\"x-workspace-id\"] as string;\n const project_id = request.headers[\"x-project-id\"] as string;\n const agent = agentInstanceManager.getAgent({\n assistant_id: run.assistantId,\n thread_id: run.threadId,\n tenant_id: tenantId,\n workspace_id,\n project_id,\n });\n\n // 3. 检查 graph 是否处于中断状态\n const runStatus = await agent.getRunStatus();\n if (runStatus !== ThreadStatus.INTERRUPTED) {\n return reply.status(409).send({\n success: false,\n message: `Cannot resume: graph is not interrupted (current status: ${runStatus})`,\n data: { runId: run.id, assistantId: run.assistantId, threadId: run.threadId, status: runStatus },\n });\n }\n\n // 4. 直接在后台触发 resume 执行(不等待,不阻塞 HTTP 响应)\n agent.addMessage({\n input: { message: \"Clarification answers submitted\" },\n command: {\n resume: {\n action: \"submit\",\n data: { answers },\n message: \"Clarification answers submitted\",\n },\n },\n }).then((result) => {\n // addMessage 成功后,触发 chunkStream 消费(驱动执行)\n // 不 await stream,让它在后台运行\n const stream = agent.chunkStream(\n result.messageId, \n [MessageChunkTypes.MESSAGE_COMPLETED]\n );\n // 消费 stream 但不阻塞(后台驱动 agent 执行)\n (async () => {\n for await (const _ of stream) { /* 丢弃 chunks */ }\n })().catch((error) => {\n request.log.error(error, \"Background chunk stream error\");\n });\n }).catch((error) => {\n request.log.error(error, \"Background resume failed\");\n });\n\n // 5. 立即返回成功(不等待 agent 执行完成)\n return reply.status(200).send({\n success: true,\n message: \"Resume request submitted successfully\",\n data: {\n runId: run.id,\n assistantId: run.assistantId,\n threadId: run.threadId,\n status: \"resuming\",\n },\n });\n\n } catch (error) {\n request.log.error(error, \"Failed to reply inbox task\");\n return reply.status(500).send({ \n success: false, \n message: \"Failed to submit resume request\" \n });\n }\n}\n\n/**\n * Abort a running workflow.\n *\n * Stops the main graph execution AND signals all in-progress\n * sub-agent invokes to cancel.\n */\nexport async function abortWorkflowRun(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> {\n try {\n const { runId } = request.params as { runId: string };\n const tenantId = getTenantId(request);\n\n const store = getTrackingStore();\n if (!store) {\n return reply.status(404).send({\n success: false,\n message: \"No workflow tracking store configured\",\n });\n }\n\n const run = await store.getWorkflowRun(runId);\n if (!run) {\n return reply.status(404).send({\n success: false,\n message: \"Workflow run not found\",\n });\n }\n\n // Persist abort intent FIRST — prevents restart after server crash\n await store.updateWorkflowRun(runId, {\n status: \"cancelled\",\n errorMessage: \"Aborted by user\",\n completedAt: new Date(),\n }).catch(() => {});\n\n // Stop the main graph execution\n const workspace_id = request.headers[\"x-workspace-id\"] as string;\n const project_id = request.headers[\"x-project-id\"] as string;\n const agent = agentInstanceManager.getAgent({\n assistant_id: run.assistantId,\n thread_id: run.threadId,\n tenant_id: tenantId,\n workspace_id,\n project_id,\n });\n await agent.abort();\n\n // Signal sub-agents via AbortController registry\n signalAbort(runId);\n\n return reply.status(200).send({\n success: true,\n message: \"Workflow aborted\",\n data: { runId, assistantId: run.assistantId, threadId: run.threadId },\n });\n } catch (error) {\n request.log.error(error, \"Failed to abort workflow run\");\n return reply.status(500).send({\n success: false,\n message: `Abort failed: ${(error as Error).message}`,\n });\n }\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { getStoreLattice, PersonalAssistantConfig } from \"@axiom-lattice/core\";\nimport type { Assistant, CreateAssistantRequest } from \"@axiom-lattice/protocols\";\nimport { randomUUID } from \"crypto\";\nfunction getWorkspaceId(request: FastifyRequest): string {\n return (request.headers[\"x-workspace-id\"] as string) || \"default\";\n}\n\nfunction getTenantId(request: FastifyRequest): string {\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) return userTenantId;\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\nfunction getUserId(request: FastifyRequest): string {\n const userId = (request as any).user?.id\n || (request.headers[\"x-user-id\"] as string);\n if (!userId) throw new Error(\"User ID is required\");\n return userId;\n}\n\ninterface CreatePersonalAssistantBody {\n name: string;\n personality: string;\n}\n\ninterface PersonalAssistantStatus {\n id: string;\n name: string;\n projectId: string;\n workspaceId?: string;\n createdAt: Date;\n}\n\ninterface PersonalAssistantResponse {\n success: boolean;\n message: string;\n data?: PersonalAssistantStatus;\n}\n\nfunction getLinkStore() {\n return getStoreLattice(\"default\", \"userTenantLink\").store;\n}\n\nfunction getAssistantStore() {\n return getStoreLattice(\"default\", \"assistant\").store;\n}\n\nfunction getProjectStore() {\n return getStoreLattice(\"default\", \"project\").store;\n}\n\nasync function getLinkMeta(userId: string, tenantId: string) {\n const link = await getLinkStore().getLink(userId, tenantId);\n return (link?.metadata || {}) as Record<string, unknown>;\n}\n\nasync function updateLinkMeta(userId: string, tenantId: string, meta: Record<string, unknown>) {\n await getLinkStore().updateLink(userId, tenantId, { metadata: meta } as any);\n}\n\n/**\n * Create a personal assistant for the authenticated user.\n * Random IDs for both assistant and project, stored in UserTenantLink.metadata.\n */\nexport async function createPersonalAssistant(\n request: FastifyRequest<{ Body: CreatePersonalAssistantBody }>,\n reply: FastifyReply\n): Promise<PersonalAssistantResponse> {\n const tenantId = getTenantId(request);\n const userId = getUserId(request);\n const { name, personality } = request.body;\n\n if (!name || !personality) {\n return reply.status(400).send({ success: false, message: \"name and personality are required\" });\n }\n\n const store = getAssistantStore();\n\n const existing = await store.getByOwner(tenantId, userId);\n if (existing) {\n return reply.status(409).send({ success: false, message: \"You already have a personal assistant\" });\n }\n\n const assistantId = randomUUID();\n\n // Create a personal project under the current workspace\n const projectStore = getProjectStore();\n const projectId = randomUUID();\n const wsId = getWorkspaceId(request);\n await projectStore.createProject(tenantId, wsId, projectId, {\n name: `${name}'s Space`,\n description: \"Personal workspace for your assistant\",\n kind: \"personal\",\n });\n\n const config = PersonalAssistantConfig.get();\n config.key = assistantId;\n PersonalAssistantConfig.render(config, name, personality);\n\n const data: CreateAssistantRequest = { name, graphDefinition: config, ownerUserId: userId };\n const assistant = await store.createAssistant(tenantId, assistantId, data);\n\n // Store in UserTenantLink.metadata\n const meta = await getLinkMeta(userId, tenantId);\n meta.personalAssistantId = assistantId;\n meta.personalProjectId = projectId;\n meta.personalWorkspaceId = wsId;\n await updateLinkMeta(userId, tenantId, meta);\n\n return reply.status(201).send({\n success: true,\n message: \"Personal assistant created\",\n data: { id: assistant.id, name: assistant.name, projectId, workspaceId: wsId, createdAt: assistant.createdAt },\n });\n}\n\n/**\n * Get the authenticated user's personal assistant.\n */\nexport async function getPersonalAssistant(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<PersonalAssistantResponse> {\n const tenantId = getTenantId(request);\n const userId = getUserId(request);\n\n const store = getAssistantStore();\n const assistant = await store.getByOwner(tenantId, userId);\n\n if (!assistant) {\n return reply.status(404).send({ success: false, message: \"No personal assistant found\" });\n }\n\n const meta = await getLinkMeta(userId, tenantId);\n const projectId = (meta.personalProjectId as string) || \"default\";\n const workspaceId = (meta.personalWorkspaceId as string) || \"default\";\n\n return {\n success: true,\n message: \"Personal assistant found\",\n data: { id: assistant.id, name: assistant.name, projectId, workspaceId, createdAt: assistant.createdAt },\n };\n}\n\n/**\n * Delete the authenticated user's personal assistant.\n */\nexport async function deletePersonalAssistant(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string }> {\n const tenantId = getTenantId(request);\n const userId = getUserId(request);\n\n const store = getAssistantStore();\n const assistant = await store.getByOwner(tenantId, userId);\n\n if (!assistant) {\n return reply.status(404).send({ success: false, message: \"No personal assistant found\" });\n }\n\n const deleted = await store.deleteAssistant(tenantId, assistant.id);\n if (!deleted) {\n return reply.status(500).send({ success: false, message: \"Failed to delete personal assistant\" });\n }\n\n // Delete all threads\n const threadStore = getStoreLattice(\"default\", \"thread\").store;\n try {\n const threads = await threadStore.getThreadsByAssistantId(tenantId, assistant.id);\n for (const t of threads) {\n await threadStore.deleteThread(tenantId, t.id);\n }\n } catch { /* best effort */ }\n\n // Clean up the project\n const meta = await getLinkMeta(userId, tenantId);\n const projectId = meta.personalProjectId as string;\n const wsId = meta.personalWorkspaceId as string;\n if (projectId && wsId) {\n try { await getProjectStore().deleteProject(tenantId, projectId); } catch { /* best effort */ }\n }\n\n // Clean up UserTenantLink.metadata\n delete meta.personalAssistantId;\n delete meta.personalProjectId;\n delete meta.personalWorkspaceId;\n await updateLinkMeta(userId, tenantId, meta);\n\n return { success: true, message: \"Personal assistant deleted\" };\n}","/**\n * Core orchestration service for tenant configuration export and import.\n *\n * @module @axiom-lattice/gateway/services/ExportImportService\n */\n\nimport { ExportableEntityRegistry, DependencyResolver, IdRemapper, isBuiltInSkill } from '@axiom-lattice/core';\nimport type {\n ExportBundle,\n ExportableEntity,\n ExportableFile,\n ExportContext,\n ImportPreviewResult,\n ImportApplyResolution,\n Resolution,\n ImportApplyResult,\n ImportEntityResult,\n} from '@axiom-lattice/core';\nimport { randomUUID } from 'crypto';\nimport * as fs from 'fs/promises';\nimport * as os from 'os';\nimport * as path from 'path';\nimport * as tar from 'tar';\nimport * as zlib from 'zlib';\n\n/** Bundle + file content for one export job. */\nexport interface ExportJobData {\n bundle: ExportBundle;\n /** Archive path → file content (e.g. `files/skills/my-skill/SKILL.md`). */\n files: Map<string, Buffer>;\n}\n\ninterface JobEntry {\n data: ExportJobData;\n tenantId: string;\n createdAt: number;\n}\n\n/** Ephemeral in-memory job store (jobs expire after TTL). */\nconst exportJobs = new Map<string, JobEntry>();\n\n/** TTL: 1 hour */\nconst JOB_TTL_MS = 60 * 60 * 1000;\n\nconst MAX_ARCHIVE_ENTRIES = 10_000;\nconst MAX_ARCHIVE_FILE_BYTES = 100 * 1024 * 1024;\nconst MAX_ARCHIVE_TOTAL_BYTES = 512 * 1024 * 1024;\n\nfunction cleanExpiredJobs(): void {\n const now = Date.now();\n for (const [id, entry] of exportJobs) {\n if (now - entry.createdAt > JOB_TTL_MS) {\n exportJobs.delete(id);\n }\n }\n}\n\n/** Archive entry path for a file belonging to an entity type. */\nfunction archiveFileKey(entityType: string, entityId: string, relPath: string): string {\n return `files/${entityType}/${entityId}/${relPath}`;\n}\n\nexport class ExportImportService {\n private registry = ExportableEntityRegistry.getInstance();\n\n /**\n * Preview an export: check which types would be auto-included, which dependencies are missing.\n */\n async exportPreview(\n tenantId: string,\n selectedTypes: string[],\n entityIds?: Record<string, string[]>,\n context?: ExportContext,\n ): Promise<{ missingDependencies: string[]; cascadeAdditions: string[] }> {\n const allDefs = this.registry.getAll();\n\n const expanded = DependencyResolver.expandCascade(allDefs, selectedTypes);\n const cascadeAdditions = expanded.filter((t) => !selectedTypes.includes(t));\n\n const deps = DependencyResolver.computeDependencies(allDefs, expanded);\n const registeredTypes = new Set(allDefs.map((d) => d.entityType));\n const missingDependencies = deps.missing.filter((t) => registeredTypes.has(t));\n\n await this.resolveExportSelection(tenantId, selectedTypes, entityIds, context);\n\n return { missingDependencies, cascadeAdditions };\n }\n\n /**\n * Generate a full export (bundle + file content) for the given tenant and entity types.\n * Stores the data in-memory and returns a jobId for download.\n */\n async export(\n tenantId: string,\n entityTypes: string[],\n entityIds?: Record<string, string[]>,\n context?: ExportContext,\n ): Promise<{ jobId: string; data: ExportJobData }> {\n const { dependencyOrder, entities: rawEntities } = await this.resolveExportSelection(\n tenantId,\n entityTypes,\n entityIds,\n context,\n );\n const entities: Record<string, ExportableEntity[]> = {};\n const files = new Map<string, Buffer>();\n let exportCounter = 0;\n\n for (const type of dependencyOrder) {\n const def = this.registry.get(type);\n const raw = rawEntities[type];\n\n entities[type] = raw.map((e) => ({\n ...e,\n _exportId: `exp-${type}-${String(++exportCounter).padStart(3, '0')}`,\n data: this.sanitizeEntityData(e.data),\n }));\n\n // Collect file content for this entity type (skills etc.)\n if (def.listFilesForExport && entities[type].length > 0) {\n const entityFiles = await def.listFilesForExport(tenantId, entities[type], context);\n for (const f of entityFiles) {\n files.set(archiveFileKey(type, f.entityId, f.path), f.content);\n }\n }\n }\n\n // Build reverse map: raw entity ID → _exportId\n const rawIdToExportId = new Map<string, string>();\n for (const [, entityList] of Object.entries(entities)) {\n for (const entity of entityList) {\n const rawId = entity.data.id as string;\n if (rawId) {\n rawIdToExportId.set(rawId, entity._exportId);\n }\n }\n }\n\n // Rewrite reference fields to @type/exportId format\n for (const [type, entityList] of Object.entries(entities)) {\n const def = this.registry.get(type);\n const refFields = def.referenceFields || {};\n for (const entity of entityList) {\n for (const [fieldName, refEntityType] of Object.entries(refFields)) {\n const rawValue = entity.data[fieldName];\n if (typeof rawValue === 'string' && rawValue) {\n const exportId = rawIdToExportId.get(rawValue);\n if (exportId) {\n entity.data[fieldName] = `@${refEntityType}/${exportId}`;\n }\n }\n }\n }\n }\n\n const bundle: ExportBundle = {\n version: 1,\n exportedAt: new Date().toISOString(),\n sourceTenantId: tenantId,\n entities,\n dependencyOrder,\n _warning: 'This file contains plaintext secrets (passwords, API keys, tokens). Store it securely and delete after import.',\n };\n\n const jobId = randomUUID();\n exportJobs.set(jobId, { data: { bundle, files }, tenantId, createdAt: Date.now() });\n\n return { jobId, data: { bundle, files } };\n }\n\n /**\n * Retrieve a previously generated export job data by jobId with tenant validation.\n */\n getExportJob(jobId: string, tenantId: string): ExportJobData | undefined {\n cleanExpiredJobs();\n const entry = exportJobs.get(jobId);\n if (!entry || entry.tenantId !== tenantId) return undefined;\n return entry.data;\n }\n\n /**\n * Pack an ExportJobData into a tar.gz buffer.\n * Layout: bundle.json at root, files under files/{entityType}/{entityId}/{path}.\n */\n async packTarGz(data: ExportJobData): Promise<Buffer> {\n const { bundle, files } = data;\n\n // Stage files in a temp dir, then tar.c them\n const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'lattice-export-'));\n try {\n await fs.writeFile(path.join(tmpDir, 'bundle.json'), JSON.stringify(bundle, null, 2), 'utf-8');\n for (const [relPath, content] of files.entries()) {\n const fullPath = path.join(tmpDir, relPath);\n await fs.mkdir(path.dirname(fullPath), { recursive: true });\n await fs.writeFile(fullPath, content);\n }\n\n // tar.c produces a tar.gz stream (gzip: true)\n const stream = tar.c({ gzip: true, portable: true, cwd: tmpDir }, ['./bundle.json', ...Array.from(files.keys())]);\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(Buffer.from(chunk));\n }\n return Buffer.concat(chunks);\n } finally {\n await fs.rm(tmpDir, { recursive: true, force: true });\n }\n }\n\n /**\n * Unpack a tar.gz buffer into an ExportJobData (bundle + files).\n */\n async unpackTarGz(buffer: Buffer): Promise<ExportJobData> {\n const files = new Map<string, Buffer>();\n let bundle: ExportBundle | undefined;\n const gunzip = zlib.createGunzip();\n\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n let entryCount = 0;\n let declaredTotalBytes = 0;\n let decompressedBytes = 0;\n let activeEntry: tar.ReadEntry | undefined;\n const paths = new Set<string>();\n\n const fail = (reason: unknown): void => {\n if (settled) return;\n settled = true;\n const error = reason instanceof Error ? reason : new Error(String(reason));\n reject(error);\n try {\n activeEntry?.destroy(error);\n } catch {\n // The parser may already have destroyed the current entry.\n }\n try {\n parser.abort(error);\n } catch {\n // Abort can race with a parser-originated terminal error.\n }\n gunzip.destroy(error);\n };\n\n const countEntry = (): boolean => {\n entryCount += 1;\n if (entryCount <= MAX_ARCHIVE_ENTRIES) return true;\n fail(new Error(`Invalid export archive: exceeds ${MAX_ARCHIVE_ENTRIES.toLocaleString('en-US')} entries`));\n return false;\n };\n\n const parser = tar.t({\n gzip: false,\n onentry: (entry) => {\n activeEntry = entry;\n if (!countEntry()) return;\n\n entry.on('error', fail);\n entry.on('end', () => {\n if (activeEntry === entry) activeEntry = undefined;\n });\n\n const isDirectory = entry.type === 'Directory';\n if (!isDirectory && entry.type !== 'File' && entry.type !== 'OldFile') {\n fail(new Error(`Invalid export archive: unsupported entry type \"${entry.type}\"`));\n return;\n }\n\n const rawPath = entry.path;\n if (rawPath.startsWith('/') || rawPath.includes('\\\\') || rawPath.includes('\\0')) {\n fail(new Error(`Invalid export archive path: \"${rawPath}\"`));\n return;\n }\n const entryPath = rawPath.startsWith('./') ? rawPath.slice(2) : rawPath;\n const pathToValidate = isDirectory && entryPath.endsWith('/') ? entryPath.slice(0, -1) : entryPath;\n const segments = pathToValidate.split('/');\n if (segments.some((segment) => segment === '' || segment === '.' || segment === '..')\n || (isDirectory\n ? !(pathToValidate === 'files' || pathToValidate.startsWith('files/'))\n : (entryPath !== 'bundle.json' && !(entryPath.startsWith('files/') && segments.length > 1)))) {\n fail(new Error(`Invalid export archive path: \"${rawPath}\"`));\n return;\n }\n if (isDirectory) {\n entry.resume();\n return;\n }\n if (paths.has(entryPath)) {\n fail(new Error(`Invalid export archive: duplicate path \"${entryPath}\"`));\n return;\n }\n paths.add(entryPath);\n\n if (!Number.isSafeInteger(entry.size) || entry.size < 0 || entry.size > MAX_ARCHIVE_FILE_BYTES) {\n fail(new Error('Invalid export archive: regular file size exceeds 100 MB'));\n return;\n }\n declaredTotalBytes += entry.size;\n if (declaredTotalBytes > MAX_ARCHIVE_TOTAL_BYTES) {\n fail(new Error('Invalid export archive: total uncompressed size exceeds 512 MB'));\n return;\n }\n\n // These limits apply to decompressed tar contents; no compressed-ratio heuristic is used.\n const chunks: Buffer[] = [];\n let streamedEntryBytes = 0;\n entry.on('data', (chunk: Buffer) => {\n if (settled) return;\n streamedEntryBytes += chunk.length;\n if (streamedEntryBytes > MAX_ARCHIVE_FILE_BYTES) {\n fail(new Error('Invalid export archive: regular file size exceeds 100 MB'));\n return;\n }\n chunks.push(chunk);\n });\n entry.on('end', () => {\n if (settled) return;\n const content = Buffer.concat(chunks, streamedEntryBytes);\n if (entryPath === 'bundle.json') {\n try {\n bundle = JSON.parse(content.toString('utf-8')) as ExportBundle;\n } catch (error) {\n fail(new Error(\n `Invalid export archive: malformed bundle.json: ${error instanceof Error ? error.message : String(error)}`,\n ));\n }\n } else {\n files.set(entryPath, content);\n }\n });\n },\n });\n\n gunzip.on('data', (chunk: Buffer) => {\n if (settled) return;\n decompressedBytes += chunk.length;\n if (decompressedBytes > MAX_ARCHIVE_TOTAL_BYTES) {\n fail(new Error('Invalid export archive: total uncompressed size exceeds 512 MB'));\n }\n });\n gunzip.on('error', fail);\n parser.on('ignoredEntry', (entry: tar.ReadEntry) => {\n if (!countEntry()) return;\n fail(new Error(`Invalid export archive: unsupported entry type \"${entry.type}\"`));\n });\n parser.on('meta', () => {\n if (!countEntry()) return;\n fail(new Error('Invalid export archive: unsupported metadata entry'));\n });\n parser.on('error', fail);\n parser.on('end', () => {\n if (settled) return;\n settled = true;\n resolve();\n });\n gunzip.pipe(parser);\n gunzip.end(buffer);\n });\n\n if (!bundle) {\n throw new Error('Invalid export archive: missing bundle.json');\n }\n return { bundle, files };\n }\n\n /**\n * Preview import: validate bundle and detect conflicts.\n */\n async previewImport(\n tenantId: string,\n bundle: ExportBundle,\n context?: ExportContext,\n ): Promise<ImportPreviewResult> {\n const dependencyOrder = this.validateBundle(bundle);\n\n const allConflicts: ImportPreviewResult['conflicts'] = [];\n const allInsertions: ImportPreviewResult['insertions'] = [];\n const allErrors: ImportPreviewResult['errors'] = [];\n\n for (const entityType of dependencyOrder) {\n const entities = bundle.entities[entityType];\n if (entities.length === 0) continue;\n\n try {\n const def = this.registry.get(entityType);\n const result = await def.previewImport(tenantId, entities, context);\n\n allConflicts.push(...result.conflicts);\n allInsertions.push(...result.insertions);\n allErrors.push(...result.errors);\n } catch (err) {\n for (const entity of entities) {\n allErrors.push({\n _exportId: entity._exportId,\n entityType,\n error: `Preview failed: ${(err as Error).message}`,\n });\n }\n }\n }\n\n return { conflicts: allConflicts, insertions: allInsertions, errors: allErrors };\n }\n\n /**\n * Apply import: create entities in dependency order with ID remapping.\n * File content (if any) is passed to registrations via the `files` map.\n */\n async applyImport(\n tenantId: string,\n bundle: ExportBundle,\n resolutions: Record<string, Resolution>,\n files?: Map<string, Buffer>,\n context?: ExportContext,\n ): Promise<ImportApplyResult> {\n const dependencyOrder = this.validateBundle(bundle);\n\n const results: ImportEntityResult[] = [];\n const idMap: Record<string, string> = {};\n const unresolvedExportIds = new Set<string>();\n // Track skill old id → new id for agent graphDefinition implicit refs\n const skillIdRemap: Record<string, string> = {};\n const skillSourceToTarget = new Map<string, string>();\n const unresolvedSkillReferences = new Map<string, string>();\n\n const skillEntities = bundle.entities.skill ?? [];\n const skillConflicts = skillEntities.length > 0\n ? await this.registry.get('skill').previewImport(tenantId, skillEntities, context)\n : { conflicts: [] } as Pick<ImportPreviewResult, 'conflicts'>;\n const skillConflictByExportId = new Map(\n skillConflicts.conflicts.map((conflict) => [conflict._exportId, conflict]),\n );\n for (const entity of skillEntities) {\n const resolution = resolutions[entity._exportId];\n const sourceId = entity.data.id as string;\n const targetId = resolution?.action === 'skip'\n ? skillConflictByExportId.get(entity._exportId)?.existingId\n : resolution?.action === 'rename' && resolution.newId\n ? resolution.newId\n : sourceId;\n if (targetId) skillSourceToTarget.set(sourceId, targetId);\n }\n for (const entity of skillEntities) {\n const subSkills = entity.data.subSkills;\n if (!Array.isArray(subSkills)) continue;\n const unresolved = subSkills.find((id): id is string => (\n typeof id === 'string'\n && !skillSourceToTarget.has(id)\n && !isBuiltInSkill(id)\n ));\n if (unresolved) unresolvedSkillReferences.set(entity._exportId, unresolved);\n }\n\n for (const entityType of dependencyOrder) {\n const entities = bundle.entities[entityType];\n if (!entities || entities.length === 0) continue;\n\n const def = this.registry.get(entityType);\n const remapper = new IdRemapper(idMap);\n\n let insertions = new Set<string>();\n let conflicts = new Set<string>();\n let conflictByExportId = new Map<string, ImportPreviewResult['conflicts'][number]>();\n let previewError: string | undefined;\n try {\n const preview = await def.previewImport(tenantId, entities, context);\n insertions = new Set(preview.insertions.map((item) => item._exportId));\n conflicts = new Set(preview.conflicts.map((item) => item._exportId));\n conflictByExportId = new Map(preview.conflicts.map((item) => [item._exportId, item]));\n } catch (err) {\n previewError = (err as Error).message;\n }\n\n for (const entity of entities) {\n let resolution: ImportApplyResolution | undefined = resolutions[entity._exportId];\n\n if (resolution?.action === 'skip') {\n const conflict = conflictByExportId.get(entity._exportId);\n if (conflict && !conflict.existingId) {\n unresolvedExportIds.add(entity._exportId);\n results.push({\n _exportId: entity._exportId,\n entityType,\n status: 'failed',\n error: 'Cannot skip conflict without an existing ID',\n });\n continue;\n }\n if (conflict?.existingId) {\n idMap[entity._exportId] = conflict.existingId;\n }\n results.push({\n _exportId: entity._exportId,\n entityType,\n status: 'skipped',\n newId: conflict?.existingId,\n });\n continue;\n }\n\n const pendingValues: unknown[] = [entity.data];\n let unresolvedReference: string | undefined;\n while (pendingValues.length > 0 && !unresolvedReference) {\n const value = pendingValues.pop();\n if (typeof value === 'string') {\n const match = value.match(/^@\\w+\\/(.+)$/);\n if (match && unresolvedExportIds.has(match[1])) {\n unresolvedReference = match[1];\n }\n } else if (Array.isArray(value)) {\n pendingValues.push(...value);\n } else if (value && typeof value === 'object') {\n pendingValues.push(...Object.values(value));\n }\n }\n if (unresolvedReference) {\n unresolvedExportIds.add(entity._exportId);\n results.push({\n _exportId: entity._exportId,\n entityType,\n status: 'failed',\n error: `Unresolved reference to failed import entity \"${unresolvedReference}\"`,\n });\n continue;\n }\n\n if (!resolution) {\n if (previewError || conflicts.has(entity._exportId) || !insertions.has(entity._exportId)) {\n results.push({\n _exportId: entity._exportId,\n entityType,\n status: 'failed',\n error: previewError\n ? `Unable to verify missing conflict resolution: ${previewError}`\n : 'Missing conflict resolution',\n });\n continue;\n }\n\n resolution = {\n _exportId: entity._exportId,\n action: 'insert',\n };\n }\n\n try {\n const remappedData = remapper.remapReferences(entity.data) as Record<string, unknown>;\n\n if (entityType === 'skill') {\n const unresolvedSkill = unresolvedSkillReferences.get(entity._exportId);\n if (unresolvedSkill) {\n results.push({\n _exportId: entity._exportId,\n entityType,\n status: 'failed',\n error: `Unresolved subSkill reference \"${unresolvedSkill}\"`,\n });\n continue;\n }\n if (Array.isArray(remappedData.subSkills)) {\n remappedData.subSkills = remappedData.subSkills.map((id) => (\n typeof id === 'string' ? (skillSourceToTarget.get(id) ?? id) : id\n ));\n }\n }\n\n // Remap implicit skill references in agent graphDefinition.skillIds\n if (entityType === 'agent' && Object.keys(skillIdRemap).length > 0) {\n const skillRemapper = new IdRemapper({});\n remappedData.graphDefinition = skillRemapper.remapSkillIds(\n (remappedData.graphDefinition as Record<string, unknown>) || {},\n skillIdRemap,\n );\n }\n\n if (resolution.action === 'rename' && resolution.newId) {\n remappedData.id = resolution.newId;\n }\n\n // Extract file content for this entity (e.g. skill files from archive).\n // Archive files are keyed by the ORIGINAL entity id (entity.data.id),\n // so use that — NOT the remapped id (which may be a renamed newId).\n const entityFiles = this.extractEntityFiles(\n entityType,\n entity.data.id as string,\n files,\n );\n\n const entityWithRemappedData = { ...entity, data: remappedData };\n const { newId } = await def.applyImport(\n tenantId,\n entityWithRemappedData,\n resolution,\n entityFiles,\n context,\n );\n\n if (newId) {\n idMap[entity._exportId] = newId;\n // Track skill ID renames for agent graphDefinition remapping.\n // oldSkillId is the ORIGINAL id from the bundle; newId is the created id.\n if (entityType === 'skill' && newId) {\n const oldSkillId = entity.data.id as string;\n if (oldSkillId !== newId) {\n skillIdRemap[oldSkillId] = newId;\n }\n }\n results.push({\n _exportId: entity._exportId,\n entityType,\n status: resolution.action === 'overwrite' ? 'updated' : 'created',\n newId,\n });\n }\n } catch (err) {\n results.push({\n _exportId: entity._exportId,\n entityType,\n status: 'failed',\n error: (err as Error).message,\n });\n }\n }\n }\n\n return { results, idMap };\n }\n\n /**\n * List all registered exportable types (for frontend).\n */\n listExportableTypes() {\n return this.registry.listTypes();\n }\n\n /**\n * Extract file content for a single entity from the archive files map.\n * Keys are `files/{entityType}/{entityId}/{path}`; returns a Map of relative path → Buffer.\n */\n private extractEntityFiles(\n entityType: string,\n entityId: string,\n files?: Map<string, Buffer>,\n ): Map<string, Buffer> | undefined {\n if (!files || files.size === 0) return undefined;\n const prefix = `files/${entityType}/${entityId}/`;\n const result = new Map<string, Buffer>();\n for (const [path, content] of files.entries()) {\n if (path.startsWith(prefix)) {\n result.set(path.slice(prefix.length), content);\n }\n }\n return result.size > 0 ? result : undefined;\n }\n\n private async resolveExportSelection(\n tenantId: string,\n entityTypes: string[],\n entityIds?: Record<string, string[]>,\n context?: ExportContext,\n ): Promise<{ dependencyOrder: string[]; entities: Record<string, ExportableEntity[]> }> {\n const allDefs = this.registry.getAll();\n const registeredTypes = new Set(allDefs.map((def) => def.entityType));\n for (const type of entityTypes) {\n if (!registeredTypes.has(type)) {\n throw new Error(`Exportable entity type is not registered: \"${type}\"`);\n }\n }\n const expanded = DependencyResolver.expandCascade(allDefs, entityTypes);\n const dependencies = DependencyResolver.computeDependencies(allDefs, expanded).missing;\n const finalTypeSet = new Set([...expanded, ...dependencies]);\n const dependencyOrder = DependencyResolver.resolveOrder(\n allDefs.filter((def) => finalTypeSet.has(def.entityType)),\n );\n const availableByType = new Map<string, Map<string, ExportableEntity>>();\n const selectedIds = new Map<string, Set<string>>();\n const processedIds = new Map<string, Set<string>>();\n\n for (const type of dependencyOrder) {\n const raw = await this.registry.get(type).listForExport(tenantId, context);\n availableByType.set(type, new Map(raw.map((entity) => [entity.data.id as string, entity])));\n if (entityIds && Object.prototype.hasOwnProperty.call(entityIds, type)) {\n selectedIds.set(type, new Set(entityIds[type]));\n } else if (expanded.includes(type)) {\n selectedIds.set(type, new Set(raw.map((entity) => entity.data.id as string)));\n } else {\n selectedIds.set(type, new Set());\n }\n processedIds.set(type, new Set());\n }\n\n let referencesAdded = true;\n while (referencesAdded) {\n referencesAdded = false;\n for (const type of dependencyOrder) {\n const def = this.registry.get(type);\n if (!def.getReferencedEntityIds) continue;\n const processed = processedIds.get(type)!;\n const available = availableByType.get(type)!;\n const unprocessed = [...selectedIds.get(type)!]\n .filter((id) => !processed.has(id))\n .map((id) => available.get(id))\n .filter((entity): entity is ExportableEntity => entity !== undefined);\n if (unprocessed.length === 0) continue;\n for (const entity of unprocessed) processed.add(entity.data.id as string);\n\n const references = await def.getReferencedEntityIds(tenantId, unprocessed, context);\n for (const [referencedType, ids] of Object.entries(references)) {\n if (!finalTypeSet.has(referencedType)) {\n throw new Error(\n `Unresolved reference from ${type}: entity type \"${referencedType}\" is not in its registered dependency closure`,\n );\n }\n const targetSelection = selectedIds.get(referencedType)!;\n const targetEntities = availableByType.get(referencedType)!;\n const explicitSelection = entityIds && Object.prototype.hasOwnProperty.call(entityIds, referencedType)\n ? new Set(entityIds[referencedType])\n : undefined;\n for (const id of new Set(ids)) {\n if (referencedType === 'skill' && isBuiltInSkill(id)) continue;\n if (explicitSelection && !explicitSelection.has(id)) {\n throw new Error(\n `Required reference from ${type} to ${referencedType} \"${id}\" is omitted by entityIds.${referencedType}`,\n );\n }\n if (!targetEntities.has(id)) {\n throw new Error(`Unresolved reference from ${type} to ${referencedType} \"${id}\"`);\n }\n if (!targetSelection.has(id)) {\n targetSelection.add(id);\n referencesAdded = true;\n }\n }\n }\n }\n }\n\n const entities: Record<string, ExportableEntity[]> = {};\n for (const type of dependencyOrder) {\n const ids = selectedIds.get(type)!;\n entities[type] = [...availableByType.get(type)!.values()]\n .filter((entity) => ids.has(entity.data.id as string));\n }\n return { dependencyOrder, entities };\n }\n\n private validateBundle(bundle: ExportBundle): string[] {\n if (bundle.version !== 1) {\n throw new Error(`Unsupported bundle version: ${bundle.version}. Expected: 1`);\n }\n if (!bundle.entities || typeof bundle.entities !== 'object' || Array.isArray(bundle.entities)) {\n throw new Error('Invalid bundle: missing entities');\n }\n if (!Array.isArray(bundle.dependencyOrder)) {\n throw new Error('Invalid bundle: missing dependencyOrder');\n }\n\n const orderSet = new Set(bundle.dependencyOrder);\n if (orderSet.size !== bundle.dependencyOrder.length) {\n throw new Error('Invalid bundle: duplicate type in dependencyOrder');\n }\n\n const entityTypes = Object.keys(bundle.entities);\n for (const entityType of entityTypes) {\n if (!Array.isArray(bundle.entities[entityType])) {\n throw new Error(`Invalid bundle: entities.${entityType} must be an array`);\n }\n if (!orderSet.has(entityType)) {\n throw new Error(`Invalid bundle: dependencyOrder omits entities type \"${entityType}\"`);\n }\n }\n for (const entityType of bundle.dependencyOrder) {\n if (!Object.prototype.hasOwnProperty.call(bundle.entities, entityType)) {\n throw new Error(`Invalid bundle: missing entities key for dependencyOrder type \"${entityType}\"`);\n }\n const def = this.registry.getAll().find((candidate) => candidate.entityType === entityType);\n if (!def) {\n throw new Error(`Invalid bundle: unregistered entity type \"${entityType}\"`);\n }\n for (const dependency of def.dependsOn) {\n const dependencyRegistered = this.registry.getAll().some((candidate) => candidate.entityType === dependency);\n if (dependencyRegistered && !orderSet.has(dependency)) {\n throw new Error(\n `Invalid bundle: missing registered dependency \"${dependency}\" required by \"${entityType}\"`,\n );\n }\n }\n }\n\n const exportIds = new Set<string>();\n for (const entityType of entityTypes) {\n const ids = new Set<string>();\n for (const entity of bundle.entities[entityType]) {\n if (!entity || typeof entity !== 'object' || typeof entity._exportId !== 'string') {\n throw new Error(`Invalid bundle: malformed entity in \"${entityType}\"`);\n }\n if (exportIds.has(entity._exportId)) {\n throw new Error(`Invalid bundle: duplicate _exportId \"${entity._exportId}\"`);\n }\n exportIds.add(entity._exportId);\n\n const id = entity.data?.id;\n if (typeof id !== 'string') {\n throw new Error(`Invalid bundle: entity ID in \"${entityType}\" must be a string`);\n }\n if (ids.has(id)) {\n throw new Error(`Invalid bundle: duplicate entity ID in \"${entityType}\": \"${id}\"`);\n }\n ids.add(id);\n }\n }\n\n const typeSet = new Set(entityTypes);\n const canonicalOrder = DependencyResolver.resolveOrder(\n this.registry.getAll().filter((def) => typeSet.has(def.entityType)),\n );\n if (canonicalOrder.length !== bundle.dependencyOrder.length\n || canonicalOrder.some((type, index) => bundle.dependencyOrder[index] !== type)) {\n throw new Error(\n `Invalid bundle: dependencyOrder is not canonical; expected ${canonicalOrder.join(', ')}`,\n );\n }\n return canonicalOrder;\n }\n\n private sanitizeEntityData(data: Record<string, unknown>): Record<string, unknown> {\n const sanitized = { ...data };\n delete sanitized.tenantId;\n delete sanitized.createdAt;\n delete sanitized.updatedAt;\n return sanitized;\n }\n}\n","import type { FastifyRequest, FastifyReply } from 'fastify';\nimport { ExportImportService } from '../services/ExportImportService';\nimport { ExportableEntityRegistry } from '@axiom-lattice/core';\nimport type { ExportBundle, ExportContext, Resolution } from '@axiom-lattice/core';\n\nconst service = new ExportImportService();\n\ntype JsonImportBody = {\n bundle?: unknown;\n resolutions?: unknown;\n};\n\ntype ResolutionMap = Record<string, Resolution>;\n\nclass TenantScopeError extends Error {\n readonly statusCode = 403;\n}\n\nfunction resolveTenantId(request: FastifyRequest, routeTenantId?: string): string {\n const authenticatedTenantId = (request as FastifyRequest & {\n user?: { tenantId?: string };\n }).user?.tenantId;\n const header = request.headers['x-tenant-id'];\n const headerTenantId = Array.isArray(header) ? header[0] : header;\n\n if (authenticatedTenantId) {\n if (headerTenantId && headerTenantId !== authenticatedTenantId) {\n throw new TenantScopeError(\n `Tenant scope mismatch: header tenant \"${headerTenantId}\" does not match authenticated tenant \"${authenticatedTenantId}\"`,\n );\n }\n if (routeTenantId && routeTenantId !== authenticatedTenantId) {\n throw new TenantScopeError(\n `Tenant scope mismatch: route tenant \"${routeTenantId}\" does not match authenticated tenant \"${authenticatedTenantId}\"`,\n );\n }\n return authenticatedTenantId;\n }\n\n return headerTenantId || routeTenantId || 'default';\n}\n\nfunction getContext(request: FastifyRequest): ExportContext {\n return {\n workspaceId: (request.headers['x-workspace-id'] as string) || undefined,\n projectId: (request.headers['x-project-id'] as string) || undefined,\n };\n}\n\nfunction safeArchiveFilename(sourceTenantId: string): string {\n const safeTenantId = sourceTenantId.replace(/[^A-Za-z0-9._-]/g, '_');\n return `tenant-export-${safeTenantId}.tar.gz`;\n}\n\nfunction assertCompleteFile(file: { truncated: boolean }): void {\n if (file.truncated) {\n throw new Error('Uploaded file was truncated because it exceeds the configured file size limit');\n }\n}\n\nfunction parseResolutions(value: unknown): ResolutionMap {\n let parsed: unknown = value;\n if (typeof value === 'string') {\n try {\n parsed = JSON.parse(value) as unknown;\n } catch {\n throw new Error('resolutions must be valid JSON');\n }\n }\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('resolutions must be a JSON object');\n }\n return parsed as ResolutionMap;\n}\n\nfunction requireJsonBundle(request: FastifyRequest, body: JsonImportBody): ExportBundle {\n const contentType = request.headers['content-type']?.split(';', 1)[0]?.trim().toLowerCase();\n if (contentType !== 'application/json' || body.bundle === undefined) {\n throw new Error('Provide a multipart tar.gz file or an application/json body with \"bundle\"');\n }\n return body.bundle as ExportBundle;\n}\n\nasync function readPreviewArchive(request: FastifyRequest): Promise<Buffer> {\n const part = await request.file();\n if (!part || part.fieldname !== 'file') {\n throw new Error('Multipart import requires a tar.gz file field named \"file\"');\n }\n const archive = await part.toBuffer();\n assertCompleteFile(part.file);\n return archive;\n}\n\nasync function readApplyMultipart(\n request: FastifyRequest,\n): Promise<{ archive: Buffer; resolutions: ResolutionMap }> {\n let archive: Buffer | undefined;\n let resolutionsValue: unknown;\n\n for await (const part of request.parts()) {\n if (part.type === 'file') {\n if (part.fieldname !== 'file' || archive !== undefined) {\n part.file.resume();\n throw new Error('Multipart import requires exactly one tar.gz file field named \"file\"');\n }\n archive = await part.toBuffer();\n assertCompleteFile(part.file);\n } else if (part.fieldname === 'resolutions') {\n if (resolutionsValue !== undefined) {\n throw new Error('Multipart import requires exactly one \"resolutions\" field');\n }\n resolutionsValue = part.value;\n }\n }\n\n if (!archive) {\n throw new Error('Multipart import requires a tar.gz file field named \"file\"');\n }\n if (resolutionsValue === undefined) {\n throw new Error('Multipart import requires a \"resolutions\" JSON field');\n }\n return { archive, resolutions: parseResolutions(resolutionsValue) };\n}\n\n/** GET /api/tenants/exportable-types */\nexport async function getExportableTypes(\n _request: FastifyRequest,\n reply: FastifyReply,\n): Promise<void> {\n const types = service.listExportableTypes();\n return reply.send({ success: true, data: types });\n}\n\n/** POST /api/tenants/:tenantId/export */\nexport async function exportConfig(\n request: FastifyRequest<{ Params: { tenantId: string }; Body: { entityTypes: string[]; entityIds?: Record<string, string[]> } }>,\n reply: FastifyReply,\n): Promise<void> {\n const tenantId = resolveTenantId(request, request.params.tenantId);\n const { entityTypes, entityIds } = request.body;\n\n if (!Array.isArray(entityTypes) || entityTypes.length === 0) {\n return reply.status(400).send({ success: false, message: 'entityTypes must be a non-empty array' });\n }\n\n const preview = await service.exportPreview(\n tenantId,\n entityTypes,\n entityIds,\n getContext(request),\n );\n\n if (preview.missingDependencies.length > 0 || preview.cascadeAdditions.length > 0) {\n return reply.send({\n success: true,\n data: {\n needsConfirmation: true,\n missingDependencies: preview.missingDependencies,\n cascadeAdditions: preview.cascadeAdditions,\n },\n });\n }\n\n const { jobId, data } = await service.export(tenantId, entityTypes, entityIds, getContext(request));\n return reply.send({\n success: true,\n data: {\n jobId,\n summary: Object.fromEntries(\n Object.entries(data.bundle.entities).map(([type, entities]) => [type, entities.length]),\n ),\n },\n });\n}\n\n/** POST /api/tenants/:tenantId/export/confirm */\nexport async function exportConfigConfirm(\n request: FastifyRequest<{ Params: { tenantId: string }; Body: { entityTypes: string[]; entityIds?: Record<string, string[]> } }>,\n reply: FastifyReply,\n): Promise<void> {\n const tenantId = resolveTenantId(request, request.params.tenantId);\n const { entityTypes, entityIds } = request.body;\n\n const { jobId, data } = await service.export(tenantId, entityTypes, entityIds, getContext(request));\n return reply.send({\n success: true,\n data: {\n jobId,\n summary: Object.fromEntries(\n Object.entries(data.bundle.entities).map(([type, entities]) => [type, entities.length]),\n ),\n },\n });\n}\n\n/** POST /api/tenants/:tenantId/export/entities */\nexport async function previewEntities(\n request: FastifyRequest<{ Params: { tenantId: string }; Body: { entityTypes: string[] } }>,\n reply: FastifyReply,\n): Promise<void> {\n const tenantId = resolveTenantId(request, request.params.tenantId);\n const { entityTypes } = request.body;\n const context = getContext(request);\n\n try {\n const registry = ExportableEntityRegistry.getInstance();\n const result: Record<string, Array<{ id: string; name: string; description?: string }>> = {};\n\n for (const type of entityTypes) {\n const def = registry.get(type);\n const entities = await def.listForExport(tenantId, context);\n result[type] = entities.map((e) => ({\n id: e.data.id as string,\n name: (e.data.name as string) || (e.data.id as string),\n description: e.data.description as string | undefined,\n }));\n }\n\n return reply.send({ success: true, data: result });\n } catch (err) {\n return reply.status(400).send({ success: false, message: (err as Error).message });\n }\n}\n\n/** GET /api/tenants/:tenantId/export/:jobId/download */\nexport async function downloadExport(\n request: FastifyRequest<{ Params: { tenantId: string; jobId: string } }>,\n reply: FastifyReply,\n): Promise<void> {\n const tenantId = resolveTenantId(request, request.params.tenantId);\n const data = service.getExportJob(request.params.jobId, tenantId);\n\n if (!data) {\n return reply.status(404).send({ success: false, message: 'Export job not found or expired' });\n }\n\n const tarGz = await service.packTarGz(data);\n const filename = safeArchiveFilename(data.bundle.sourceTenantId);\n reply.type('application/gzip');\n reply.header('Content-Disposition', `attachment; filename=\"${filename}\"`);\n return reply.send(tarGz);\n}\n\n/** POST /api/tenants/:tenantId/import/preview */\nexport async function importPreview(\n request: FastifyRequest<{\n Params: { tenantId: string };\n Body: JsonImportBody;\n }>,\n reply: FastifyReply,\n): Promise<void> {\n const tenantId = resolveTenantId(request, request.params.tenantId);\n\n try {\n const data = request.isMultipart()\n ? await service.unpackTarGz(await readPreviewArchive(request))\n : { bundle: requireJsonBundle(request, request.body), files: undefined };\n\n const preview = await service.previewImport(tenantId, data.bundle, getContext(request));\n return reply.send({ success: true, data: preview });\n } catch (err) {\n return reply.status(400).send({\n success: false,\n message: `Invalid export file: ${(err as Error).message}`,\n });\n }\n}\n\n/** POST /api/tenants/:tenantId/import/apply */\nexport async function importApply(\n request: FastifyRequest<{\n Params: { tenantId: string };\n Body: JsonImportBody;\n }>,\n reply: FastifyReply,\n): Promise<void> {\n const tenantId = resolveTenantId(request, request.params.tenantId);\n\n try {\n const multipart = request.isMultipart() ? await readApplyMultipart(request) : undefined;\n const data = multipart\n ? await service.unpackTarGz(multipart.archive)\n : { bundle: requireJsonBundle(request, request.body), files: undefined };\n const resolutions = multipart?.resolutions ?? parseResolutions(request.body.resolutions);\n\n const result = await service.applyImport(tenantId, data.bundle, resolutions, data.files, getContext(request));\n return reply.send({ success: true, data: result });\n } catch (err) {\n return reply.status(400).send({\n success: false,\n message: `Import failed: ${(err as Error).message}`,\n });\n }\n}\n","import type { FastifyInstance } from \"fastify\";\nimport { PluginRegistry } from \"@axiom-lattice/core\";\n\n/**\n * GET /api/middleware-types\n *\n * Returns all registered plugin metas (builtin + custom).\n * hasTest / hasDiscover are auto-detected by serializePluginMeta.\n */\nexport function middlewareTypesRoutes(fastify: FastifyInstance): void {\n fastify.get(\"/api/middleware-types\", async (_request, reply) => {\n const metas = PluginRegistry.listMeta();\n return reply.send(metas);\n });\n}\n","import { FastifySchema } from \"fastify\";\n\nexport const dataQuerySchema: FastifySchema = {\n description: \"Execute data query (semantic or SQL)\",\n tags: [\"Data Query\"],\n summary: \"Query Data\",\n body: {\n type: \"object\",\n properties: {\n serverKey: { \n type: \"string\", \n description: \"Target semantic metrics server key (optional if configured in runConfig)\" \n },\n datasourceId: { \n type: \"string\", \n description: \"Data source ID (optional if configured in runConfig)\" \n },\n // Semantic query parameters\n metrics: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Array of metric names for semantic query\"\n },\n groupBy: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Optional array of dimensions to group by\"\n },\n filters: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n dimension: { type: \"string\" },\n operator: { type: \"string\" },\n values: {\n type: \"array\",\n items: { type: [\"string\", \"number\", \"boolean\"] }\n }\n },\n required: [\"dimension\", \"operator\", \"values\"]\n },\n description: \"Optional array of filters\"\n },\n // SQL query parameters\n customSql: {\n type: \"string\",\n description: \"Custom SQL query string with named parameters\"\n },\n params: {\n type: \"object\",\n additionalProperties: { type: [\"string\", \"number\", \"boolean\"] },\n description: \"Optional parameters for SQL query\"\n },\n // Common parameters\n limit: {\n type: \"number\",\n description: \"Maximum number of results (default: 1000)\"\n },\n format: {\n type: \"string\",\n enum: [\"echarts\", \"raw\"],\n description: \"Response format (default: echarts)\"\n }\n }\n },\n // Response schema temporarily removed - format not yet finalized\n // TODO: Add proper response schema once data format is confirmed\n};\n","import { FastifySchema } from \"fastify\";\n\n// Create Run Schemas\nexport const createRunSchema: FastifySchema = {\n description: \"Create a new agent run\",\n tags: [\"Runs\"],\n summary: \"Create Agent Run\",\n body: {\n type: \"object\",\n properties: {\n thread_id: { type: \"string\", description: \"Thread ID\" },\n assistant_id: { type: \"string\", description: \"Assistant ID\" },\n message: { type: \"string\", description: \"Message data for the run\" },\n command: {\n type: \"object\",\n description: \"Command data for the run\",\n nullable: true,\n },\n streaming: {\n type: \"boolean\",\n description: \"Whether to stream the response\",\n nullable: true,\n },\n background: {\n type: \"boolean\",\n description: \"Whether to run in background\",\n nullable: true,\n },\n },\n required: [\"thread_id\", \"assistant_id\", \"message\"],\n },\n response: {\n 200: {},\n 400: {},\n },\n};\n\n// Memory Schemas\nexport const getAllMemoryItemsSchema: FastifySchema = {\n description: \"Get all memory items for an assistant thread\",\n tags: [\"Memory\"],\n summary: \"Get All Memory Items\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n thread_id: { type: \"string\", description: \"Thread ID\" },\n },\n required: [\"assistantId\", \"thread_id\"],\n },\n response: {\n 200: {},\n 400: {},\n 500: {},\n },\n};\n\nexport const getAgentStateSchema: FastifySchema = {\n description: \"Get agent state for an assistant thread\",\n tags: [\"Memory\"],\n summary: \"Get Agent State\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n thread_id: { type: \"string\", description: \"Thread ID\" },\n },\n required: [\"assistantId\", \"thread_id\"],\n },\n response: {\n 200: {},\n },\n};\n\nexport const getMemoryItemSchema: FastifySchema = {\n description: \"Get a specific memory item by key\",\n tags: [\"Memory\"],\n summary: \"Get Memory Item\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n key: { type: \"string\", description: \"Memory key\" },\n },\n required: [\"assistantId\", \"key\"],\n },\n response: {\n 200: {},\n },\n};\n\nexport const setMemoryItemSchema: FastifySchema = {\n description: \"Set or update a memory item\",\n tags: [\"Memory\"],\n summary: \"Set Memory Item\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n key: { type: \"string\", description: \"Memory key\" },\n },\n required: [\"assistantId\", \"key\"],\n },\n body: {\n type: \"object\",\n description: \"Memory item data\",\n },\n response: {\n 200: {},\n },\n};\n\nexport const deleteMemoryItemSchema: FastifySchema = {\n description: \"Delete a specific memory item\",\n tags: [\"Memory\"],\n summary: \"Delete Memory Item\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n key: { type: \"string\", description: \"Memory key\" },\n },\n required: [\"assistantId\", \"key\"],\n },\n response: {\n 200: {},\n },\n};\n\nexport const clearMemorySchema: FastifySchema = {\n description: \"Clear all memory items for an assistant\",\n tags: [\"Memory\"],\n summary: \"Clear Memory\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n },\n required: [\"assistantId\"],\n },\n response: {\n 200: {},\n },\n};\n\n// Graph Schema\nexport const getAgentGraphSchema: FastifySchema = {\n description: \"Get agent graph visualization\",\n tags: [\"Graph\"],\n summary: \"Get Agent Graph\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n },\n required: [\"assistantId\"],\n },\n response: {\n 200: {},\n },\n};\n\n// Resume Stream Schema\nexport const resumeStreamSchema: FastifySchema = {\n description: \"Resume streaming from a known position\",\n tags: [\"Streaming\"],\n summary: \"Resume Stream\",\n body: {\n type: \"object\",\n properties: {\n thread_id: { type: \"string\", description: \"Thread ID\" },\n message_id: {\n type: \"string\",\n description: \"Message ID (usually run_id)\",\n },\n known_content: {\n type: \"string\",\n description: \"Content already received\",\n },\n poll_interval: {\n type: \"number\",\n description: \"Polling interval in milliseconds\",\n nullable: true,\n default: 100,\n },\n },\n required: [\"thread_id\", \"message_id\"],\n },\n response: {\n 200: {},\n 400: {},\n 500: {},\n },\n};\n\n// Trigger Agent Task Schema\nexport const triggerAgentTaskSchema: FastifySchema = {\n description: \"Trigger an agent task\",\n tags: [\"Agent Tasks\"],\n summary: \"Trigger Agent Task\",\n body: {\n type: \"object\",\n properties: {\n assistant_id: {\n type: \"string\",\n description: \"Assistant ID\",\n },\n thread_id: {\n type: \"string\",\n description: \"Thread ID\",\n },\n input: {\n type: \"object\",\n description: \"Task input data\",\n },\n command: {\n type: \"object\",\n description: \"Command data for the task\",\n nullable: true,\n },\n },\n required: [\"assistant_id\", \"thread_id\"],\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n result: { type: \"object\" },\n },\n },\n 400: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n error: { type: \"string\" },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n error: { type: \"string\" },\n },\n },\n },\n};\n\n// Configuration Schemas\nexport const updateConfigSchema: FastifySchema = {\n description: \"Update gateway configuration\",\n tags: [\"Configuration\"],\n summary: \"Update Configuration\",\n body: {\n type: \"object\",\n properties: {\n config: {\n type: \"object\",\n description: \"Configuration object to update\",\n properties: {\n port: { type: \"number\", description: \"Server port\" },\n queueServiceType: {\n type: \"string\",\n enum: [\"memory\", \"redis\"],\n description: \"Queue service type\",\n },\n redisUrl: { type: \"string\", description: \"Redis URL\" },\n redisPassword: { type: \"string\", description: \"Redis password\" },\n queueName: { type: \"string\", description: \"Queue name\" },\n },\n },\n },\n required: [\"config\"],\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: { type: \"object\" },\n },\n },\n 400: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n error: { type: \"string\" },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n error: { type: \"string\" },\n },\n },\n },\n};\n\nexport const getConfigSchema: FastifySchema = {\n description: \"Get current gateway configuration\",\n tags: [\"Configuration\"],\n summary: \"Get Configuration\",\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n data: { type: \"object\" },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n error: { type: \"string\" },\n },\n },\n },\n};\n\n// Health Check Schema\nexport const getHealthSchema: FastifySchema = {\n description: \"Health check endpoint for monitoring and load balancer checks\",\n tags: [\"Health\"],\n summary: \"Health Check\",\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n data: {\n type: \"object\",\n properties: {\n status: { type: \"string\", enum: [\"healthy\", \"unhealthy\"] },\n timestamp: { type: \"string\" },\n uptime: { type: \"number\" },\n service: { type: \"string\" },\n version: { type: \"string\" },\n },\n },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n status: { type: \"string\" },\n error: { type: \"string\" },\n },\n },\n },\n};\n\n// Skills Schemas\nexport const getSkillListSchema: FastifySchema = {\n description: \"Get list of all skills\",\n tags: [\"Skills\"],\n summary: \"Get Skill List\",\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n },\n};\n\nexport const getSkillSchema: FastifySchema = {\n description: \"Get a single skill by ID\",\n tags: [\"Skills\"],\n summary: \"Get Skill\",\n params: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Skill ID\" },\n },\n required: [\"id\"],\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: { type: \"object\" },\n },\n },\n 404: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n },\n};\n\nexport const createSkillSchema: FastifySchema = {\n description: \"Create a new skill\",\n tags: [\"Skills\"],\n summary: \"Create Skill\",\n body: {\n type: \"object\",\n properties: {\n id: { \n type: \"string\", \n description: \"Skill ID (optional, defaults to name if not provided; must equal name, name is used for path addressing)\" \n },\n name: { \n type: \"string\", \n description: \"Skill name (1-64 chars, lowercase alphanumeric with single hyphens, pattern: ^[a-z0-9]+(-[a-z0-9]+)*$)\",\n pattern: \"^[a-z0-9]+(-[a-z0-9]+)*$\",\n minLength: 1,\n maxLength: 64\n },\n description: { type: \"string\", description: \"Skill description\" },\n license: { type: \"string\", description: \"License information\" },\n compatibility: { type: \"string\", description: \"Compatibility information\" },\n metadata: {\n type: \"object\",\n additionalProperties: { type: \"string\" },\n description: \"Additional metadata\",\n },\n content: { type: \"string\", description: \"Skill detailed content (markdown)\" },\n subSkills: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Array of sub-skill names (hierarchical structure)\",\n },\n },\n required: [\"name\", \"description\"],\n },\n response: {\n 201: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: { type: \"object\" },\n },\n },\n 400: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n 409: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n },\n};\n\nexport const updateSkillSchema: FastifySchema = {\n description: \"Update an existing skill\",\n tags: [\"Skills\"],\n summary: \"Update Skill\",\n params: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Skill ID\" },\n },\n required: [\"id\"],\n },\n body: {\n type: \"object\",\n properties: {\n name: { \n type: \"string\", \n description: \"Skill name (1-64 chars, lowercase alphanumeric with single hyphens, pattern: ^[a-z0-9]+(-[a-z0-9]+)*$)\",\n pattern: \"^[a-z0-9]+(-[a-z0-9]+)*$\",\n minLength: 1,\n maxLength: 64\n },\n description: { type: \"string\", description: \"Skill description\" },\n license: { type: \"string\", description: \"License information\" },\n compatibility: { type: \"string\", description: \"Compatibility information\" },\n metadata: {\n type: \"object\",\n additionalProperties: { type: \"string\" },\n description: \"Additional metadata\",\n },\n content: { type: \"string\", description: \"Skill detailed content (markdown)\" },\n subSkills: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Array of sub-skill names (hierarchical structure)\",\n },\n },\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: { type: \"object\" },\n },\n },\n 400: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n 404: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n },\n};\n\nexport const deleteSkillSchema: FastifySchema = {\n description: \"Delete a skill by ID\",\n tags: [\"Skills\"],\n summary: \"Delete Skill\",\n params: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Skill ID\" },\n },\n required: [\"id\"],\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n 404: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n },\n};\n\nexport const searchSkillsByMetadataSchema: FastifySchema = {\n description: \"Search skills by metadata\",\n tags: [\"Skills\"],\n summary: \"Search Skills by Metadata\",\n querystring: {\n type: \"object\",\n properties: {\n key: { type: \"string\", description: \"Metadata key\" },\n value: { type: \"string\", description: \"Metadata value\" },\n },\n required: [\"key\", \"value\"],\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n 400: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n },\n};\n\nexport const filterSkillsByCompatibilitySchema: FastifySchema = {\n description: \"Filter skills by compatibility\",\n tags: [\"Skills\"],\n summary: \"Filter Skills by Compatibility\",\n querystring: {\n type: \"object\",\n properties: {\n compatibility: { type: \"string\", description: \"Compatibility string\" },\n },\n required: [\"compatibility\"],\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n 400: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n },\n};\n\nexport const filterSkillsByLicenseSchema: FastifySchema = {\n description: \"Filter skills by license\",\n tags: [\"Skills\"],\n summary: \"Filter Skills by License\",\n querystring: {\n type: \"object\",\n properties: {\n license: { type: \"string\", description: \"License string\" },\n },\n required: [\"license\"],\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n 400: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n },\n};\n\nexport const getSandboxUrlSchema: FastifySchema = {\n description: \"Get sandbox URL based on assistant and thread configuration\",\n tags: [\"Sandbox\"],\n summary: \"Get Sandbox URL\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n threadId: { type: \"string\", description: \"Thread ID\" },\n },\n required: [\"assistantId\", \"threadId\"],\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n sandboxUrl: { type: \"string\", description: \"Sandbox URL\" },\n sandboxName: { type: \"string\", description: \"Sandbox name\" },\n vmIsolation: {\n type: \"string\",\n enum: [\"agent\", \"project\", \"global\"],\n description: \"Sandbox isolation level\",\n },\n },\n },\n },\n },\n 404: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n },\n};\n\n// Data Query Schema\nexport { dataQuerySchema } from \"./data-query\";\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { agentInstanceManager } from \"@axiom-lattice/core\";\n\n/**\n * DELETE /api/assistants/:assistant_id/threads/:thread_id/pending-messages/:message_id\n * Remove pending message from queue\n */\nexport async function removePendingMessageHandler(\n request: FastifyRequest,\n reply: FastifyReply\n) {\n try {\n const { assistant_id, thread_id, message_id } = request.params as {\n assistant_id: string;\n thread_id: string;\n message_id: string;\n };\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n const workspace_id = request.headers[\"x-workspace-id\"] as string;\n const project_id = request.headers[\"x-project-id\"] as string;\n\n if (!tenant_id) {\n return reply.code(400).send({ error: \"Missing x-tenant-id header\" });\n }\n\n if (!assistant_id) {\n return reply.code(400).send({ error: \"Missing assistant_id parameter\" });\n }\n\n // Get agent instance\n const agent = agentInstanceManager.getAgent({\n assistant_id,\n thread_id,\n tenant_id,\n workspace_id,\n project_id,\n });\n\n if (!agent) {\n return reply.code(404).send({\n error: \"Thread not found\",\n threadId: thread_id,\n });\n }\n\n const success = await agent.removePendingMessage(message_id);\n\n if (!success) {\n return reply.code(404).send({\n error: \"Message not found\",\n messageId: message_id,\n });\n }\n\n return reply.send({\n success: true,\n messageId: message_id,\n });\n } catch (error) {\n console.error(\"Error removing pending message:\", error);\n return reply.code(500).send({\n error: \"Internal server error\",\n message: error instanceof Error ? error.message : String(error),\n });\n }\n}\n","import { agentLatticeManager, getSandBoxManager, normalizeSandboxName, sandboxLatticeManager } from \"@axiom-lattice/core\";\nimport { SandboxMiddlewareConfig } from \"@axiom-lattice/protocols\";\n\n\nconst ERROR_HTML = `<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Sandbox 连接错误</title>\n <style>\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n }\n .container {\n background: white;\n border-radius: 16px;\n padding: 40px;\n max-width: 500px;\n width: 100%;\n box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n }\n .error-icon {\n width: 80px;\n height: 80px;\n background: #fee2e2;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 24px;\n }\n .error-icon svg {\n width: 40px;\n height: 40px;\n color: #dc2626;\n }\n h1 { color: #1f2937; margin-bottom: 16px; text-align: center; }\n p { color: #6b7280; margin-bottom: 12px; line-height: 1.6; }\n .info {\n background: #f3f4f6;\n border-radius: 8px;\n padding: 16px;\n margin: 20px 0;\n }\n .info-item {\n display: flex;\n justify-content: space-between;\n padding: 8px 0;\n border-bottom: 1px solid #e5e7eb;\n }\n .info-item:last-child { border-bottom: none; }\n .label { color: #6b7280; font-size: 14px; }\n .value { color: #1f2937; font-weight: 500; font-family: monospace; }\n .retry-btn {\n width: 100%;\n padding: 14px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n border: none;\n border-radius: 8px;\n font-size: 16px;\n cursor: pointer;\n transition: transform 0.2s;\n }\n .retry-btn:hover { transform: translateY(-2px); }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"error-icon\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"/>\n </svg>\n </div>\n <h1>无法连接到 Sandbox</h1>\n <p>无法连接到沙箱环境,请检查配置后重试。</p>\n <div class=\"info\">\n <div class=\"info-item\">\n <span class=\"label\">Assistant ID</span>\n <span class=\"value\" id=\"assistantId\">-</span>\n </div>\n <div class=\"info-item\">\n <span class=\"label\">Thread ID</span>\n <span class=\"value\" id=\"threadId\">-</span>\n </div>\n <div class=\"info-item\">\n <span class=\"label\">隔离级别</span>\n <span class=\"value\" id=\"vmIsolation\">-</span>\n </div>\n <div class=\"info-item\">\n <span class=\"label\">错误信息</span>\n <span class=\"value\" id=\"errorMsg\">-</span>\n </div>\n </div>\n <button class=\"retry-btn\" onclick=\"window.location.reload()\">重新连接</button>\n </div>\n <script>\n const params = new URLSearchParams(window.location.search);\n document.getElementById('assistantId').textContent = params.get('assistantId') || '-';\n document.getElementById('threadId').textContent = params.get('threadId') || '-';\n document.getElementById('vmIsolation').textContent = params.get('vmIsolation') || '-';\n document.getElementById('errorMsg').textContent = params.get('error') || '未知错误';\n </script>\n</body>\n</html>`;\n\nexport class SandboxService {\n\n getFilesystemVmIsolation(tenantId: string, assistantId: string): \"agent\" | \"project\" | \"global\" | null {\n const agentLattice = agentLatticeManager.getAgentLatticeWithTenant(tenantId, assistantId);\n if (!agentLattice) {\n return null;\n }\n\n const filesystemConfig = agentLattice?.config?.middleware?.find((m: any) => m.type === \"filesystem\");\n if (!filesystemConfig) {\n return null;\n }\n\n const config = filesystemConfig.config as SandboxMiddlewareConfig;\n return config?.vmIsolation || null;\n }\n\n computeSandboxName(\n assistantId: string,\n threadId: string,\n vmIsolation: string,\n tenantId?: string,\n workspaceId?: string,\n projectId?: string,\n ): string {\n switch (vmIsolation) {\n case \"agent\":\n return normalizeSandboxName(`${tenantId ?? \"default\"}-${assistantId}`);\n case \"project\":\n return normalizeSandboxName(\n `${tenantId ?? \"default\"}-${workspaceId ?? \"default\"}-${projectId ?? \"default\"}`\n );\n case \"global\":\n default:\n return \"global\";\n }\n }\n\n private getBrowserSandboxBaseURL(): string {\n return process.env.AGENT_INFRA_SANDBOX_BASE_URL || \"http://localhost:8080\";\n }\n\n getTargetUrl(sandboxName: string): string {\n return `${this.getBrowserSandboxBaseURL()}/sandbox/${sandboxName}`;\n }\n\n async getVncHtml(sandboxName: string): Promise<string> {\n const response = await fetch(`${this.getTargetUrl(sandboxName)}/vnc/index.html`);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch VNC HTML: ${response.statusText}`);\n }\n\n return response.text();\n }\n\n rewriteHtml(\n html: string,\n assistantId: string,\n threadId: string\n ): string {\n const prefix = `/api/assistants/${assistantId}/threads/${threadId}/sandbox/vnc`;\n\n let rewritten = html;\n\n rewritten = rewritten.replace(\n /(src|href)=[\"']([^\"']*)[\"']/g,\n (match, attr, url) => {\n if (url.startsWith(\"http://\") || url.startsWith(\"https://\") || url.startsWith(\"//\")) {\n return match;\n }\n const rewrittenUrl = url.startsWith(\"/\") ? `${prefix}${url}` : `${prefix}/${url}`;\n return `${attr}=\"${rewrittenUrl}\"`;\n }\n );\n\n rewritten = rewritten.replace(\n /path=sandbox\\/[^&\"']+/g,\n (match) => {\n return `path=${prefix}/websockify`;\n }\n );\n\n rewritten = rewritten.replace(\n /new WebSocket\\([^)]*\\?path=sandbox[^)]*\\)/g,\n (match) => {\n return match.replace(/path=sandbox[^)]+/, `path=${prefix}/websockify`);\n }\n );\n\n return rewritten;\n }\n\n generateErrorHtml(\n assistantId: string,\n threadId: string,\n vmIsolation: string,\n errorMessage: string\n ): string {\n const encodedError = encodeURIComponent(errorMessage);\n return ERROR_HTML\n .replace(\"{assistantId}\", assistantId)\n .replace(\"{threadId}\", threadId)\n .replace(\"{vmIsolation}\", vmIsolation)\n .replace(\"{errorMessage}\", errorMessage);\n }\n}\n\nexport const sandboxService = new SandboxService();\n","import { FastifyInstance } from \"fastify\";\nimport { sandboxService } from \"../services/sandbox_service\";\nimport { getSandBoxManager } from \"@axiom-lattice/core\";\nimport { getContentTypeFromFilename, getFilenameFromPath } from \"../utils/mime\";\n\ninterface SandboxParams {\n assistantId: string;\n threadId: string;\n}\n\nexport function registerSandboxProxyRoutes(app: FastifyInstance): void {\n // Register uploadfile route FIRST before wildcard routes to ensure it matches\n app.post<{ Params: SandboxParams }>(\n \"/api/assistants/:assistantId/threads/:threadId/sandbox/uploadfile\",\n async (request, reply) => {\n console.log(\"[Sandbox Upload] Route matched:\", request.url);\n const { assistantId, threadId } = request.params;\n const tenantId = (request.headers[\"x-tenant-id\"] as string) || \"default\";\n\n const vmIsolation = sandboxService.getFilesystemVmIsolation(tenantId, assistantId);\n if (!vmIsolation) {\n return reply.status(500).send({ error: \"Assistant sandbox config not found\" });\n }\n\n const workspaceId = request.headers[\"x-workspace-id\"] as string;\n const projectId = request.headers[\"x-project-id\"] as string;\n\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({\n assistant_id: assistantId,\n thread_id: threadId,\n tenantId,\n workspaceId,\n projectId,\n vmIsolation,\n });\n\n try {\n const data = await request.file();\n if (!data) {\n return reply.status(400).send({ error: \"No file in request\" });\n }\n\n const buffer = await data.toBuffer();\n const pathEntry = data.fields?.path;\n const pathValue =\n pathEntry && typeof pathEntry === \"object\" && \"value\" in pathEntry\n ? String((pathEntry as { value: unknown }).value)\n : typeof pathEntry === \"string\"\n ? pathEntry\n : undefined;\n\n const filePath = `/uploads/${pathValue ? pathValue : \"\"}${data.filename}`;\n try {\n await sandbox.file.uploadFile({ file: filePath, data: buffer });\n } catch (err) {\n reply.status(500).send({ error: String(err) });\n return;\n }\n\n const relativePath = filePath.replace(`~/`, \"\");\n const result = { id: relativePath, name: data.filename, size: buffer.length };\n\n return reply.status(200).send({ message: \"File uploaded successfully\", ...result });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return reply.status(502).send({ error: `Upload proxy error: ${message}` });\n }\n }\n );\n\n // Download file from sandbox: GET with query param path (file path in sandbox, e.g. /home/gem/uploads/foo.txt)\n app.get<{\n Params: SandboxParams;\n Querystring: { path: string };\n }>(\n \"/api/assistants/:assistantId/threads/:threadId/sandbox/downloadfile\",\n async (request, reply) => {\n const { assistantId, threadId } = request.params;\n const { path: filePath } = request.query;\n const tenantId = (request.headers[\"x-tenant-id\"] as string) || \"default\";\n\n if (!filePath || typeof filePath !== \"string\") {\n return reply.status(400).send({ error: \"Query parameter 'path' is required\" });\n }\n\n const vmIsolation = sandboxService.getFilesystemVmIsolation(tenantId, assistantId);\n if (!vmIsolation) {\n return reply.status(500).send({ error: \"Assistant filesystem vmIsolation not found\" });\n }\n\n const workspaceId = request.headers[\"x-workspace-id\"] as string;\n const projectId = request.headers[\"x-project-id\"] as string;\n\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({\n assistant_id: assistantId,\n thread_id: threadId,\n tenantId,\n workspaceId,\n projectId,\n vmIsolation,\n });\n\n try {\n // Normalize path to /-prefixed absolute path\n const resolvedPath = filePath.startsWith(\"/\") ? filePath : `/${filePath}`;\n const filename = getFilenameFromPath(resolvedPath);\n const inferredContentType = getContentTypeFromFilename(filename);\n\n try {\n const buf = await sandbox.file.downloadFile({ file: resolvedPath });\n const contentDisposition = `inline; filename=\"${filename.replace(/\"/g, '\\\\\"')}\"; filename*=UTF-8''${encodeURIComponent(filename)}`;\n reply = reply.status(200).type(inferredContentType).header(\"Content-Disposition\", contentDisposition).send(buf);\n return reply;\n } catch (err) {\n reply.status(500).send({ error: String(err) });\n return;\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return reply.status(502).send({ error: `Download proxy error: ${message}` });\n }\n }\n );\n\n // app.get<{ Params: SandboxParams }>(\n // \"/api/assistants/:assistantId/threads/:threadId/sandbox/browser\",\n // async (request, reply) => {\n // const { assistantId, threadId } = request.params;\n\n // const sandboxConfig = sandboxService.getSandboxConfig(assistantId);\n // if (!sandboxConfig) {\n // const errorHtml = sandboxService.generateErrorHtml(\n // assistantId,\n // threadId,\n // \"unknown\",\n // `Assistant ${assistantId} not found`\n // );\n // return reply.status(404).type(\"text/html\").send(errorHtml);\n // }\n\n // const { vmIsolation } = sandboxConfig;\n // const sandboxName = sandboxService.computeSandboxName(\n // assistantId,\n // threadId,\n // vmIsolation\n // );\n\n // try {\n // const html = await sandboxService.getVncHtml(sandboxName);\n // const rewrittenHtml = sandboxService.rewriteHtml(html, assistantId, threadId);\n // return reply.type(\"text/html\").send(rewrittenHtml);\n // } catch (error: any) {\n // const errorHtml = sandboxService.generateErrorHtml(\n // assistantId,\n // threadId,\n // vmIsolation,\n // error.message || \"Failed to connect to sandbox\"\n // );\n // return reply.status(502).type(\"text/html\").send(errorHtml);\n // }\n // }\n // );\n\n\n // app.get<{ Params: SandboxParams }>(\n // \"/api/assistants/:assistantId/threads/:threadId/sandbox/websockify\",\n // { websocket: true },\n\n // (connection, request) => {\n\n // const url = (connection?.url) as string;\n // console.log(`[WebSocket] Received connection from URL: ${url}`);\n\n // const urlMatch = url.match(/\\/api\\/assistants\\/([^/]+)\\/threads\\/([^/]+)\\/sandbox\\/websockify/);\n // if (!urlMatch) {\n // console.error(`[WebSocket] Failed to parse params from URL: ${url}`);\n // connection.close(1008, \"Invalid URL format\");\n // return;\n // }\n\n // const assistantId = urlMatch[1];\n // const threadId = urlMatch[2];\n // console.log(`[WebSocket] Parsed params - assistantId: ${assistantId}, threadId: ${threadId}`);\n\n // const sandboxConfig = sandboxService.getSandboxConfig(assistantId);\n // if (!sandboxConfig) {\n // console.error(`[WebSocket] Assistant ${assistantId} not found`);\n // connection.close(1008, \"Assistant not found\");\n // return;\n // }\n\n // const { vmIsolation } = sandboxConfig;\n // const sandboxName = sandboxService.computeSandboxName(\n // assistantId,\n // threadId,\n // vmIsolation\n // );\n\n // const targetUrl = sandboxService.getTargetUrl(sandboxName);\n // const targetWsUrl = targetUrl.replace(/^http/, \"ws\").replace(/^https/, \"wss\") + \"/websockify\";\n\n // console.log(`[WebSocket] Connecting to target: ${targetWsUrl}`);\n\n // const targetSocket = new WebSocket(targetWsUrl);\n // const clientStream = createWebSocketStream(connection, { encoding: \"utf8\" });\n\n // const targetStream = createWebSocketStream(targetSocket, { encoding: \"utf8\" });\n\n // const forward = pipeline(clientStream, targetStream);\n // const backward = pipeline(targetStream, clientStream);\n\n // Promise.all([forward, backward]).catch((err) => {\n // console.error(`[WebSocket] Proxy pipeline failed:`, err.message);\n // targetSocket.terminate();\n // connection.terminate();\n // });\n // }\n // );\n\n // app.get<{ Params: ProxyParams }>(\n // \"/api/assistants/:assistantId/threads/:threadId/sandbox/browser/vnc/*\",\n // async (request, reply) => {\n // const { assistantId, threadId, \"*\": restPath } = request.params;\n\n // const sandboxConfig = sandboxService.getSandboxConfig(assistantId);\n // if (!sandboxConfig) {\n // return reply.status(404).send(\"Assistant not found\");\n // }\n\n // const { vmIsolation } = sandboxConfig;\n // const sandboxName = sandboxService.computeSandboxName(\n // assistantId,\n // threadId,\n // vmIsolation\n // );\n\n // const targetPath = restPath ? `/vnc/${restPath}` : \"/vnc/\";\n // const targetUrl = `${sandboxService.getTargetUrl(sandboxName)}${targetPath}`;\n\n // try {\n // const response = await fetch(targetUrl);\n // const contentType = response.headers.get(\"content-type\") || \"application/octet-stream\";\n\n // const body = await response.arrayBuffer();\n // reply.status(response.status).type(contentType).send(Buffer.from(body));\n // } catch (error: any) {\n // reply.status(502).send(`Proxy error: ${error.message}`);\n // }\n // }\n // );\n\n\n}\n","/**\n * WorkspaceController\n *\n * Controller for workspace and project management\n * Handles CRUD operations, file browsing, and file uploads\n */\n\nimport { FastifyInstance, FastifyRequest, FastifyReply } from \"fastify\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { constants as fsConstants } from \"fs\";\nimport * as os from \"os\";\nimport { getStoreLattice } from \"@axiom-lattice/core\";\nimport { SandboxFilesystem, FilesystemBackend } from \"@axiom-lattice/core\";\nimport { getSandBoxManager } from \"@axiom-lattice/core\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { getContentTypeFromFilename, getFilenameFromPath } from \"../utils/mime\";\nimport {\n saveProjectFile,\n isBinaryContentType,\n filesystemRootDirectory,\n ProjectFileValidationError,\n} from \"../services/workspace-file-service\";\nimport {\n isPathWithinRoot,\n PathOutsideRootError,\n resolvePathWithinRoot,\n} from \"../utils/path-containment\";\nimport type {\n CreateWorkspaceRequest,\n UpdateWorkspaceRequest,\n CreateProjectRequest,\n UpdateProjectRequest,\n Workspace,\n Project,\n ProjectKind,\n} from \"@axiom-lattice/protocols\";\n\ninterface WorkspaceParams {\n workspaceId: string;\n}\n\ninterface ProjectParams {\n workspaceId: string;\n projectId: string;\n}\n\ninterface ListPathQuery {\n path?: string;\n assistantId?: string;\n}\n\ninterface ReadFileQuery {\n path: string;\n offset?: number;\n limit?: number;\n assistantId?: string;\n}\n\nexport class WorkspaceController {\n private workspaceStore;\n private projectStore;\n\n constructor() {\n this.workspaceStore = getStoreLattice(\"default\", \"workspace\").store;\n this.projectStore = getStoreLattice(\"default\", \"project\").store;\n }\n\n private getTenantId(request: FastifyRequest): string {\n // First try to get from authenticated user context\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) {\n return userTenantId;\n }\n\n // Try to get from query parameters (for direct URL access like file downloads)\n const queryTenantId = (request.query as any)?.tenantId;\n if (queryTenantId) {\n return String(queryTenantId);\n }\n\n // Fallback to request headers for backward compatibility\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n }\n\n // ==================== Workspace CRUD ====================\n\n async listWorkspaces(request: FastifyRequest, reply: FastifyReply) {\n const tenantId = this.getTenantId(request);\n const workspaces = await this.workspaceStore.getAllWorkspaces(tenantId);\n return { success: true, data: workspaces };\n }\n\n async createWorkspace(\n request: FastifyRequest<{ Body: CreateWorkspaceRequest }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const data = request.body;\n const id = uuidv4();\n\n const workspace = await this.workspaceStore.createWorkspace(\n tenantId,\n id,\n data\n );\n\n return reply.status(201).send({ success: true, data: workspace });\n }\n\n async getWorkspace(\n request: FastifyRequest<{ Params: WorkspaceParams }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId } = request.params;\n\n const workspace = await this.workspaceStore.getWorkspaceById(\n tenantId,\n workspaceId\n );\n\n if (!workspace) {\n return reply.status(404).send({ success: false, error: \"Workspace not found\" });\n }\n\n return { success: true, data: workspace };\n }\n\n async updateWorkspace(\n request: FastifyRequest<{\n Params: WorkspaceParams;\n Body: UpdateWorkspaceRequest;\n }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId } = request.params;\n const updates = request.body;\n\n const workspace = await this.workspaceStore.updateWorkspace(\n tenantId,\n workspaceId,\n updates\n );\n\n if (!workspace) {\n return reply.status(404).send({ success: false, error: \"Workspace not found\" });\n }\n\n return { success: true, data: workspace };\n }\n\n async deleteWorkspace(\n request: FastifyRequest<{ Params: WorkspaceParams }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId } = request.params;\n\n const deleted = await this.workspaceStore.deleteWorkspace(\n tenantId,\n workspaceId\n );\n\n if (!deleted) {\n return reply.status(404).send({ success: false, error: \"Workspace not found\" });\n }\n\n return { success: true };\n }\n\n // ==================== Project CRUD ====================\n\n async listProjects(\n request: FastifyRequest<{\n Params: WorkspaceParams;\n Querystring: { kind?: string };\n }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId } = request.params;\n const kindFilter = request.query.kind as ProjectKind | undefined;\n\n await this.ensureTrainingProject(tenantId, workspaceId);\n\n const projects = kindFilter\n ? await this.projectStore.getProjectsByWorkspace(tenantId, workspaceId, {\n kind: kindFilter,\n })\n : await this.projectStore.getProjectsByWorkspace(tenantId, workspaceId);\n\n return { success: true, data: projects };\n }\n\n /**\n * Ensure at least one training project exists per tenant/workspace.\n *\n * Multiple training projects are allowed; this only creates the first one\n * when none exist so the frontend always has a default to select.\n */\n private async ensureTrainingProject(\n tenantId: string,\n workspaceId: string\n ): Promise<void> {\n const existing = await this.projectStore.getProjectsByWorkspace(\n tenantId,\n workspaceId,\n { kind: \"training\" }\n );\n if (existing.length > 0) {\n return;\n }\n\n await this.projectStore.createProject(tenantId, workspaceId, uuidv4(), {\n name: \"Training\",\n description: \"Shared workspace for agent training\",\n kind: \"training\",\n });\n }\n\n async createProject(\n request: FastifyRequest<{\n Params: WorkspaceParams;\n Body: CreateProjectRequest;\n }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId } = request.params;\n const data = request.body;\n const id = uuidv4();\n\n const project = await this.projectStore.createProject(\n tenantId,\n workspaceId,\n id,\n data\n );\n\n return reply.status(201).send({ success: true, data: project });\n }\n\n async getProject(\n request: FastifyRequest<{ Params: ProjectParams }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { projectId } = request.params;\n\n const project = await this.projectStore.getProjectById(tenantId, projectId);\n\n if (!project) {\n return reply.status(404).send({ success: false, error: \"Project not found\" });\n }\n\n return { success: true, data: project };\n }\n\n async updateProject(\n request: FastifyRequest<{\n Params: ProjectParams;\n Body: UpdateProjectRequest;\n }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { projectId } = request.params;\n const updates = request.body;\n\n const project = await this.projectStore.updateProject(\n tenantId,\n projectId,\n updates\n );\n\n if (!project) {\n return reply.status(404).send({ success: false, error: \"Project not found\" });\n }\n\n return { success: true, data: project };\n }\n\n async deleteProject(\n request: FastifyRequest<{ Params: ProjectParams }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId, projectId } = request.params;\n\n const project = await this.projectStore.getProjectById(tenantId, projectId);\n\n if (!project) {\n return reply.status(404).send({ success: false, error: \"Project not found\" });\n }\n\n // Always keep at least one training project per workspace: the frontend\n // auto-selects it as the default training context.\n if (project.kind === \"training\") {\n const training = await this.projectStore.getProjectsByWorkspace(\n tenantId,\n workspaceId,\n { kind: \"training\" }\n );\n if (training.length <= 1) {\n return reply.status(409).send({\n success: false,\n error: \"The last training project cannot be deleted\",\n });\n }\n }\n\n const deleted = await this.projectStore.deleteProject(tenantId, projectId);\n\n if (!deleted) {\n return reply.status(404).send({ success: false, error: \"Project not found\" });\n }\n\n return { success: true };\n }\n\n // ==================== File Operations ====================\n\n private async getBackend(tenantId: string, workspaceId: string, projectId: string, assistantId?: string, filePath?: string) {\n const workspace = await this.workspaceStore.getWorkspaceById(\n tenantId,\n workspaceId\n );\n\n if (!workspace) {\n throw new Error(\"Workspace not found\");\n }\n\n console.log(`[getBackend] storageType=${workspace.storageType} filePath=${filePath}`);\n\n if (workspace.storageType === \"sandbox\") {\n const sandboxManager = getSandBoxManager();\n\n const volumeConfig = {\n assistant_id: assistantId || \"\",\n thread_id: \"\",\n tenantId,\n workspaceId,\n projectId,\n };\n\n console.log(`[getBackend] trying volume backend for path=${filePath} assistant_id=${assistantId}`);\n const volumeBackend = await sandboxManager.getVolumeBackendForPath(volumeConfig, filePath || \"/project\");\n if (volumeBackend) {\n console.log(`[getBackend] using VolumeFilesystem`);\n return { backend: volumeBackend, workspace };\n }\n\n console.log(`[getBackend] volume not found, falling back to SandboxFilesystem`);\n const sandbox = await sandboxManager.getSandboxFromConfig(volumeConfig);\n console.log(`[getBackend] sandbox acquired, name=${(sandbox as any).name || \"unknown\"}`);\n return {\n backend: new SandboxFilesystem({\n sandboxInstance: sandbox,\n }), workspace\n };\n }\n\n // Filesystem storage: use default /lattice_store path\n const rootDir = filesystemRootDirectory(\n tenantId,\n workspaceId,\n projectId,\n );\n\n console.log(`[getBackend] using FilesystemBackend rootDir=${rootDir}`);\n return {\n backend: new FilesystemBackend({\n rootDir,\n virtualMode: true,\n }), workspace\n };\n }\n\n\n async downloadFile(\n request: FastifyRequest<{\n Params: ProjectParams;\n Querystring: { path: string; assistantId?: string };\n }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId, projectId } = request.params;\n const filePath = request.query.path;\n const assistantId = request.query.assistantId;\n\n if (!filePath) {\n return reply.status(400).send({ success: false, error: \"Path is required\" });\n }\n\n try {\n const { workspace } = await this.getBackend(tenantId, workspaceId, projectId, assistantId);\n const resolvedPath = filePath;\n\n if (workspace.storageType === \"sandbox\") {\n const sandboxManager = getSandBoxManager();\n const volumeConfig = {\n assistant_id: assistantId || \"\",\n thread_id: \"\",\n tenantId,\n workspaceId,\n projectId,\n };\n\n const filename = getFilenameFromPath(resolvedPath);\n // Use volume backend when available; fall back to sandbox\n const volumeBackend = await sandboxManager.getVolumeBackendForPath(volumeConfig, resolvedPath);\n\n let buf: Buffer;\n if (volumeBackend) {\n if (volumeBackend.readBinary) {\n buf = await volumeBackend.readBinary(resolvedPath);\n } else {\n const fileData = await volumeBackend.readRaw(resolvedPath);\n buf = Buffer.from(fileData.content.join(\"\\n\"), \"utf-8\");\n }\n } else {\n const sandbox = await sandboxManager.getSandboxFromConfig(volumeConfig);\n buf = await sandbox.file.downloadFile({ file: resolvedPath });\n }\n\n const inferredContentType = getContentTypeFromFilename(filename);\n\n const contentDisposition = `attachment; filename*=UTF-8''${encodeURIComponent(filename)}`;\n return reply.status(200).type(inferredContentType).header(\"Content-Disposition\", contentDisposition).send(buf);\n }\n\n const { backend } = await this.getBackend(tenantId, workspaceId, projectId, assistantId, resolvedPath);\n if (!backend.readBinary) {\n throw new Error(\"Filesystem backend does not support binary reads\");\n }\n const buffer = await backend.readBinary(resolvedPath);\n const filename = getFilenameFromPath(resolvedPath);\n const mimeType = getContentTypeFromFilename(filename);\n\n return reply\n .status(200)\n .type(mimeType)\n .header(\"Content-Disposition\", `attachment; filename*=UTF-8''${encodeURIComponent(filename)}`)\n .send(buffer);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return reply.status(502).send({ success: false, error: `Download proxy error: ${message}` });\n }\n }\n\n /**\n * View a file inline in the browser (not download).\n * Returns file content with inline Content-Disposition for preview.\n */\n async viewFile(\n request: FastifyRequest<{\n Params: ProjectParams;\n Querystring: { path: string; assistantId?: string };\n }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId, projectId } = request.params;\n const filePath = request.query.path;\n const assistantId = request.query.assistantId;\n\n if (!filePath) {\n return reply.status(400).send({ success: false, error: \"Path is required\" });\n }\n\n try {\n const { workspace } = await this.getBackend(tenantId, workspaceId, projectId, assistantId);\n const resolvedPath = filePath;\n\n if (workspace.storageType === \"sandbox\") {\n const sandboxManager = getSandBoxManager();\n const volumeConfig = {\n assistant_id: assistantId || \"\",\n thread_id: \"\",\n tenantId,\n workspaceId,\n projectId,\n };\n\n const filename = getFilenameFromPath(resolvedPath);\n const isBinary = isBinaryContentType(filename);\n\n // Use volume backend when available; fall back to sandbox\n const volumeBackend = await sandboxManager.getVolumeBackendForPath(volumeConfig, resolvedPath);\n\n let buf: Buffer;\n if (volumeBackend) {\n if (isBinary && volumeBackend.readBinary) {\n buf = await volumeBackend.readBinary(resolvedPath);\n } else {\n const fileData = await volumeBackend.readRaw(resolvedPath);\n buf = Buffer.from(fileData.content.join(\"\\n\"), \"utf-8\");\n }\n } else {\n const sandbox = await sandboxManager.getSandboxFromConfig(volumeConfig);\n buf = await sandbox.file.downloadFile({ file: resolvedPath });\n }\n\n const inferredContentType = getContentTypeFromFilename(filename);\n\n try {\n const contentType = inferredContentType;\n\n // Inject AI2APP context script for HTML files (sandbox storage)\n const isHtml = contentType?.toLowerCase().includes(\"text/html\") || \n filename.toLowerCase().endsWith(\".html\") || \n filename.toLowerCase().endsWith(\".htm\");\n let outputBuf = buf;\n if (isHtml) {\n console.log(`[viewFile] Injecting AI2APP context for sandbox HTML file: ${filename}, tenantId: ${tenantId}, contentType: ${contentType}`);\n let content = buf.toString(\"utf-8\");\n const contextScript = `<script>window.__AI2APP_CONTEXT__=${JSON.stringify({\n tenantId,\n workspaceId,\n projectId,\n timestamp: Date.now()\n })};</script>`;\n \n if (content.toLowerCase().includes(\"</head>\")) {\n content = content.replace(/<\\/head>/i, `${contextScript}</head>`);\n console.log(`[viewFile] Context script injected before </head>`);\n } else if (content.toLowerCase().includes(\"<html>\")) {\n content = content.replace(/<html>/i, `<html>${contextScript}`);\n console.log(`[viewFile] Context script injected after <html>`);\n } else {\n content = contextScript + content;\n console.log(`[viewFile] Context script prepended to content`);\n }\n outputBuf = Buffer.from(content, \"utf-8\");\n }\n\n return reply\n .status(200)\n .type(contentType)\n .header(\"Content-Disposition\", \"inline\")\n .send(outputBuf);\n } catch (err) {\n return reply.status(502).send({ success: false, error: String(err) });\n }\n }\n\n const { backend } = await this.getBackend(tenantId, workspaceId, projectId, assistantId, resolvedPath);\n const content = await backend.read(resolvedPath, 0, Infinity);\n const filename = getFilenameFromPath(resolvedPath);\n const mimeType = getContentTypeFromFilename(filename);\n\n // Inject AI2APP context script for HTML files\n let finalContent = content;\n const isHtmlFs = mimeType?.toLowerCase().includes(\"text/html\") || \n filename.toLowerCase().endsWith(\".html\") || \n filename.toLowerCase().endsWith(\".htm\");\n if (isHtmlFs) {\n console.log(`[viewFile] Injecting AI2APP context for filesystem HTML file: ${filename}, tenantId: ${tenantId}, mimeType: ${mimeType}`);\n const contextScript = `<script>window.__AI2APP_CONTEXT__=${JSON.stringify({\n tenantId,\n workspaceId,\n projectId,\n timestamp: Date.now()\n })};</script>`;\n // Insert before </head> or </html>\n if (content.toLowerCase().includes(\"</head>\")) {\n finalContent = content.replace(/<\\/head>/i, `${contextScript}</head>`);\n console.log(`[viewFile] Context script injected before </head>`);\n } else if (content.toLowerCase().includes(\"</html>\")) {\n finalContent = content.replace(/<\\/html>/i, `${contextScript}</html>`);\n console.log(`[viewFile] Context script injected before </html>`);\n } else {\n finalContent = content + contextScript;\n console.log(`[viewFile] Context script appended to content`);\n }\n }\n\n const buffer = Buffer.from(finalContent, \"utf-8\");\n\n return reply\n .status(200)\n .type(mimeType)\n .header(\"Content-Disposition\", \"inline\")\n .send(buffer);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return reply.status(502).send({ success: false, error: `View proxy error: ${message}` });\n }\n }\n\n async listPath(\n request: FastifyRequest<{\n Params: ProjectParams;\n Querystring: ListPathQuery;\n }>\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId, projectId } = request.params;\n const path = (request.query.path as string) || \"/\";\n const assistantId = request.query.assistantId;\n\n console.log(`[listPath] tenantId=${tenantId} workspaceId=${workspaceId} projectId=${projectId} path=${path} assistantId=${assistantId}`);\n\n const { backend } = await this.getBackend(tenantId, workspaceId, projectId, assistantId, path);\n console.log(`[listPath] backend type=${backend.constructor.name} calling lsInfo(${path})`);\n\n const files = await backend.lsInfo(path);\n console.log(`[listPath] result count=${files.length}`);\n\n return { success: true, data: files };\n }\n\n async readFile(\n request: FastifyRequest<{\n Params: ProjectParams;\n Querystring: ReadFileQuery;\n }>\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId, projectId } = request.params;\n const { path, offset = 0, limit = 1000, assistantId } = request.query;\n\n const { backend } = await this.getBackend(tenantId, workspaceId, projectId, assistantId, path);\n const content = await backend.read(path, Number(offset), Number(limit));\n\n return { success: true, data: { content, offset, limit } };\n }\n\n /**\n * Upload a file to the workspace project storage.\n *\n * Route: POST /api/workspaces/:workspaceId/projects/:projectId/uploadfile\n * Accepts multipart/form-data with:\n * - `file`: the file to upload (required)\n * - `path`: optional directory path relative to project root (e.g., \"docs\", \"src/utils\")\n * - `assistantId`: optional query parameter for sandbox identity matching\n * For sandbox storage, delegates to the sandbox upload API.\n * For filesystem storage, writes under the same project root used by the file backend.\n */\n async uploadFile(\n request: FastifyRequest<{\n Params: ProjectParams;\n Querystring: { assistantId?: string };\n }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId, projectId } = request.params;\n const assistantId = (request.query as any).assistantId || (request.headers[\"x-assistant-id\"] as string);\n\n const workspace = await this.workspaceStore.getWorkspaceById(\n tenantId,\n workspaceId\n );\n\n if (!workspace) {\n return reply\n .status(404)\n .send({ success: false, error: \"Workspace not found\" });\n }\n\n try {\n const data = await (request as any).file();\n if (!data) {\n return reply\n .status(400)\n .send({ success: false, error: \"No file in request\" });\n }\n\n const buffer: Buffer = await data.toBuffer();\n const filename: string = data.filename || \"file\";\n\n const pathEntry = data.fields?.path;\n const pathValue =\n pathEntry && typeof pathEntry === \"object\" && \"value\" in pathEntry\n ? String((pathEntry as { value: unknown }).value)\n : typeof pathEntry === \"string\"\n ? pathEntry\n : undefined;\n\n if (pathValue && !/^[a-zA-Z0-9_./~-]+$/.test(pathValue)) {\n return reply\n .status(400)\n .send({ success: false, error: \"Invalid path parameter\" });\n }\n\n const saved = await saveProjectFile({\n tenantId,\n workspaceId,\n projectId,\n name: filename,\n bytes: buffer,\n ...(pathValue ? { path: pathValue } : {}),\n assistantId,\n });\n\n return reply.status(200).send({\n success: true,\n data: {\n path: saved.uri,\n name: saved.name,\n is_dir: false,\n size: saved.size,\n modified_at: new Date().toISOString(),\n },\n });\n } catch (error: unknown) {\n if (error instanceof ProjectFileValidationError) {\n return reply.status(400).send({ success: false, error: error.message });\n }\n const message = error instanceof Error ? error.message : String(error);\n return reply.status(500).send({\n success: false,\n error: `Upload handler error: ${message}`,\n });\n }\n }\n /**\n * Browse local filesystem directories for the folder picker.\n *\n * Security constraints:\n * - Restricted to os.homedir()\n * - Blacklists system directories\n * - Returns only directory names, no file contents or hidden files\n */\n async browseFilesystem(\n request: FastifyRequest<{\n Querystring: { path?: string };\n }>,\n reply: FastifyReply\n ) {\n const homeDir = os.homedir();\n const requestedPath = request.query.path || homeDir;\n\n const SYSTEM_BLACKLIST = [\"/etc\", \"/sys\", \"/proc\", \"/var\", \"/tmp\", \"/dev\"];\n\n try {\n const resolved = await resolvePathWithinRoot(homeDir, requestedPath);\n const normalized = resolved.targetPath;\n\n for (const blacklisted of SYSTEM_BLACKLIST) {\n if (isPathWithinRoot(blacklisted, normalized)) {\n return reply.status(403).send({\n success: false,\n error: `Cannot browse system directory: ${blacklisted}`,\n });\n }\n }\n\n const entries = await fs.readdir(normalized, { withFileTypes: true });\n const dirEntries = entries\n .filter((entry) => !entry.name.startsWith(\".\") && entry.isDirectory())\n .map((entry) => ({\n name: entry.name,\n path: path.join(normalized, entry.name),\n isDirectory: true,\n }));\n\n const parentPath = path.dirname(normalized);\n const hasParent =\n parentPath !== normalized &&\n isPathWithinRoot(resolved.rootPath, parentPath);\n\n return {\n success: true,\n data: {\n path: normalized,\n parentPath: hasParent ? parentPath : undefined,\n entries: dirEntries,\n },\n };\n } catch (error: unknown) {\n if (error instanceof PathOutsideRootError) {\n return reply.status(403).send({\n success: false,\n error: \"Browse restricted to home directory\",\n });\n }\n const message = error instanceof Error ? error.message : String(error);\n return reply.status(400).send({\n success: false,\n error: `Cannot read directory: ${message}`,\n });\n }\n }\n}\n\nexport function registerWorkspaceRoutes(app: FastifyInstance) {\n const controller = new WorkspaceController();\n\n // Workspace routes\n app.get(\"/api/workspaces\", controller.listWorkspaces.bind(controller));\n app.post(\"/api/workspaces\", controller.createWorkspace.bind(controller));\n app.get(\n \"/api/workspaces/:workspaceId\",\n controller.getWorkspace.bind(controller)\n );\n app.patch(\n \"/api/workspaces/:workspaceId\",\n controller.updateWorkspace.bind(controller)\n );\n app.delete(\n \"/api/workspaces/:workspaceId\",\n controller.deleteWorkspace.bind(controller)\n );\n\n // Project routes\n app.get(\n \"/api/workspaces/:workspaceId/projects\",\n controller.listProjects.bind(controller)\n );\n app.post(\n \"/api/workspaces/:workspaceId/projects\",\n controller.createProject.bind(controller)\n );\n app.get(\n \"/api/workspaces/:workspaceId/projects/:projectId\",\n controller.getProject.bind(controller)\n );\n app.patch(\n \"/api/workspaces/:workspaceId/projects/:projectId\",\n controller.updateProject.bind(controller)\n );\n app.delete(\n \"/api/workspaces/:workspaceId/projects/:projectId\",\n controller.deleteProject.bind(controller)\n );\n\n // File operations\n app.get(\n \"/api/workspaces/:workspaceId/projects/:projectId/listpath\",\n controller.listPath.bind(controller)\n );\n app.get(\n \"/api/workspaces/:workspaceId/projects/:projectId/readfile\",\n controller.readFile.bind(controller)\n );\n app.post(\n \"/api/workspaces/:workspaceId/projects/:projectId/uploadfile\",\n controller.uploadFile.bind(controller)\n );\n app.get(\n \"/api/workspaces/:workspaceId/projects/:projectId/downloadfile\",\n controller.downloadFile.bind(controller)\n );\n app.get(\n \"/api/workspaces/:workspaceId/projects/:projectId/viewfile\",\n controller.viewFile.bind(controller)\n );\n\n // Filesystem browsing for folder picker\n app.get(\n \"/api/filesystem/browse\",\n controller.browseFilesystem.bind(controller)\n );\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport {\n getStoreLattice,\n sqlDatabaseManager,\n} from \"@axiom-lattice/core\";\nimport type {\n DatabaseConfigStore,\n DatabaseConfigEntry,\n CreateDatabaseConfigRequest,\n UpdateDatabaseConfigRequest,\n DatabaseConfig,\n} from \"@axiom-lattice/protocols\";\nimport { randomUUID } from \"crypto\";\n\n/**\n * Database Config Controller\n * Handles database configuration CRUD operations\n */\n\n/**\n * Get tenant ID from authenticated user context\n * Falls back to request headers for backward compatibility\n */\nfunction getTenantId(request: FastifyRequest): string {\n // First try to get from authenticated user context\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) {\n return userTenantId;\n }\n\n // Fallback to request headers for backward compatibility\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\n/**\n * Database config list response\n */\ninterface DatabaseConfigListResponse {\n success: boolean;\n message: string;\n data: {\n records: DatabaseConfigEntry[];\n total: number;\n };\n}\n\n/**\n * Database config response\n */\ninterface DatabaseConfigResponse {\n success: boolean;\n message: string;\n data?: DatabaseConfigEntry;\n}\n\n/**\n * Test connection response\n */\ninterface TestConnectionResponse {\n success: boolean;\n message: string;\n data?: {\n connected: boolean;\n latency?: number;\n error?: string;\n };\n}\n\n/**\n * Get all database configs for a tenant\n */\nexport async function getDatabaseConfigList(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<DatabaseConfigListResponse> {\n const tenantId = getTenantId(request);\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"database\");\n const store: DatabaseConfigStore = storeLattice.store;\n\n const configs = await store.getAllConfigs(tenantId);\n \n console.log('Backend: getAllConfigs returned:', configs);\n if (configs.length > 0) {\n console.log('Backend: First config key:', configs[0].key);\n }\n\n return {\n success: true,\n message: \"Database configurations retrieved successfully\",\n data: {\n records: configs,\n total: configs.length,\n },\n };\n } catch (error) {\n console.error(\"Failed to get database configs:\", error);\n return {\n success: false,\n message: \"Failed to retrieve database configurations\",\n data: {\n records: [],\n total: 0,\n },\n };\n }\n}\n\n/**\n * Get database config by key\n */\nexport async function getDatabaseConfig(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<DatabaseConfigResponse> {\n const tenantId = getTenantId(request);\n const { key } = request.params as { key: string };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"database\");\n const store: DatabaseConfigStore = storeLattice.store;\n\n const config = await store.getConfigByKey(tenantId, key);\n\n if (!config) {\n return {\n success: false,\n message: \"Database configuration not found\",\n };\n }\n\n return {\n success: true,\n message: \"Database configuration retrieved successfully\",\n data: config,\n };\n } catch (error) {\n console.error(\"Failed to get database config:\", error);\n return {\n success: false,\n message: \"Failed to retrieve database configuration\",\n };\n }\n}\n\n/**\n * Create new database config\n */\nexport async function createDatabaseConfig(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<DatabaseConfigResponse> {\n const tenantId = getTenantId(request);\n const body = request.body as CreateDatabaseConfigRequest & { id?: string };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"database\");\n const store: DatabaseConfigStore = storeLattice.store;\n\n // Check if key already exists\n const existing = await store.getConfigByKey(tenantId, body.key);\n if (existing) {\n reply.code(409);\n return {\n success: false,\n message: \"Database configuration with this key already exists\",\n };\n }\n\n const id = body.id || randomUUID();\n const config = await store.createConfig(tenantId, id, body);\n\n // Auto-register to SqlDatabaseManager\n try {\n sqlDatabaseManager.registerDatabase(tenantId, config.key, config.config);\n } catch (error) {\n console.warn(\"Failed to auto-register database:\", error);\n }\n\n reply.code(201);\n return {\n success: true,\n message: \"Database configuration created successfully\",\n data: config,\n };\n } catch (error) {\n console.error(\"Failed to create database config:\", error);\n return {\n success: false,\n message: \"Failed to create database configuration\",\n };\n }\n}\n\n/**\n * Update database config\n */\nexport async function updateDatabaseConfig(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<DatabaseConfigResponse> {\n const tenantId = getTenantId(request);\n const { key } = request.params as { key: string };\n const updates = request.body as Partial<UpdateDatabaseConfigRequest>;\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"database\");\n const store: DatabaseConfigStore = storeLattice.store;\n\n const existing = await store.getConfigByKey(tenantId, key);\n if (!existing) {\n reply.code(404);\n return {\n success: false,\n message: \"Database configuration not found\",\n };\n }\n\n const updated = await store.updateConfig(tenantId, existing.id, updates);\n\n if (!updated) {\n return {\n success: false,\n message: \"Failed to update database configuration\",\n };\n }\n\n // Re-register to SqlDatabaseManager if config changed\n if (updates.config) {\n try {\n sqlDatabaseManager.registerDatabase(tenantId, updated.key, updated.config);\n } catch (error) {\n console.warn(\"Failed to re-register database:\", error);\n }\n }\n\n return {\n success: true,\n message: \"Database configuration updated successfully\",\n data: updated,\n };\n } catch (error) {\n console.error(\"Failed to update database config:\", error);\n return {\n success: false,\n message: \"Failed to update database configuration\",\n };\n }\n}\n\n/**\n * Delete database config by key or id\n */\nexport async function deleteDatabaseConfig(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<DatabaseConfigResponse> {\n const tenantId = getTenantId(request);\n const { keyOrId } = request.params as { keyOrId: string };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"database\");\n const store: DatabaseConfigStore = storeLattice.store;\n\n console.log('Delete request - keyOrId:', keyOrId);\n\n // Try to find by key first, then by id\n let config = await store.getConfigByKey(tenantId, keyOrId);\n let configKey = keyOrId;\n\n if (!config) {\n // Try to find by id\n config = await store.getConfigById(tenantId, keyOrId);\n if (config) {\n configKey = config.key;\n }\n }\n\n if (!config) {\n reply.code(404);\n return {\n success: false,\n message: \"Database configuration not found\",\n };\n }\n\n console.log('Found config to delete:', { id: config.id, key: config.key });\n\n const deleted = await store.deleteConfig(tenantId, config.id);\n\n if (!deleted) {\n return {\n success: false,\n message: \"Failed to delete database configuration\",\n };\n }\n\n // Remove from SqlDatabaseManager\n try {\n if (sqlDatabaseManager.hasDatabase(tenantId, configKey)) {\n await sqlDatabaseManager.removeDatabase(tenantId, configKey);\n }\n } catch (error) {\n console.warn(\"Failed to remove from SqlDatabaseManager:\", error);\n }\n\n return {\n success: true,\n message: \"Database configuration deleted successfully\",\n };\n } catch (error) {\n console.error(\"Failed to delete database config:\", error);\n return {\n success: false,\n message: \"Failed to delete database configuration\",\n };\n }\n}\n\n/**\n * Test database connection\n */\nexport async function testDatabaseConnection(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<TestConnectionResponse> {\n const tenantId = getTenantId(request);\n const { key } = request.params as { key: string };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"database\");\n const store: DatabaseConfigStore = storeLattice.store;\n\n const config = await store.getConfigByKey(tenantId, key);\n if (!config) {\n reply.code(404);\n return {\n success: false,\n message: \"Database configuration not found\",\n };\n }\n\n // Register temporarily for testing\n const testKey = `__test_${key}_${Date.now()}`;\n sqlDatabaseManager.registerDatabase(tenantId, testKey, config.config);\n\n const startTime = Date.now();\n const db = await sqlDatabaseManager.getDatabase(tenantId, testKey);\n\n try {\n // Try to connect and list tables\n await db.connect();\n await db.listTables();\n const latency = Date.now() - startTime;\n\n // Disconnect gracefully with delay to ensure all operations complete\n await new Promise(resolve => setTimeout(resolve, 100));\n await db.disconnect();\n \n // Cleanup\n await sqlDatabaseManager.removeDatabase(tenantId, testKey);\n\n return {\n success: true,\n message: \"Connection test successful\",\n data: {\n connected: true,\n latency,\n },\n };\n } catch (error) {\n // Cleanup on error\n try {\n await db.disconnect();\n await sqlDatabaseManager.removeDatabase(tenantId, testKey);\n } catch { /* cleanup error, ignore */ }\n\n return {\n success: true,\n message: \"Connection test failed\",\n data: {\n connected: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n };\n }\n } catch (error) {\n console.error(\"Failed to test database connection:\", error);\n return {\n success: false,\n message: \"Failed to test database connection\",\n data: {\n connected: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n };\n }\n}\n\n/**\n * Register database config routes\n */\nexport function registerDatabaseConfigRoutes(app: any): void {\n // Get all configs\n app.get(\n \"/api/database-configs\",\n getDatabaseConfigList\n );\n\n // Get config by key\n app.get(\n \"/api/database-configs/:key\",\n getDatabaseConfig\n );\n\n // Create config\n app.post(\n \"/api/database-configs\",\n createDatabaseConfig\n );\n\n // Update config\n app.put(\n \"/api/database-configs/:key\",\n updateDatabaseConfig\n );\n\n // Delete config by key or id\n app.delete(\n \"/api/database-configs/:keyOrId\",\n deleteDatabaseConfig\n );\n\n // Test connection\n app.post(\n \"/api/database-configs/:key/test\",\n testDatabaseConnection\n );\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport {\n getStoreLattice,\n metricsServerManager,\n SemanticMetricsClient,\n} from \"@axiom-lattice/core\";\nimport type {\n MetricsServerConfigStore,\n MetricsServerConfigEntry,\n CreateMetricsServerConfigRequest,\n UpdateMetricsServerConfigRequest,\n MetricsServerConfig,\n DataSource,\n SemanticMetricsQueryRequest,\n SemanticMetricsServerConfig,\n} from \"@axiom-lattice/protocols\";\nimport { randomUUID } from \"crypto\";\n\n/**\n * Metrics Server Config Controller\n * Handles metrics server configuration CRUD operations\n */\n\n/**\n * Get tenant ID from authenticated user context\n * Falls back to request headers for backward compatibility\n */\nfunction getTenantId(request: FastifyRequest): string {\n // First try to get from authenticated user context\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) {\n return userTenantId;\n }\n\n // Fallback to request headers for backward compatibility\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\n/**\n * Metrics server config list response\n */\ninterface MetricsServerConfigListResponse {\n success: boolean;\n message: string;\n data: {\n records: MetricsServerConfigEntry[];\n total: number;\n };\n}\n\n/**\n * Metrics server config response\n */\ninterface MetricsServerConfigResponse {\n success: boolean;\n message: string;\n data?: MetricsServerConfigEntry;\n}\n\n/**\n * Test connection response\n */\ninterface TestConnectionResponse {\n success: boolean;\n message: string;\n data?: {\n connected: boolean;\n latency?: number;\n error?: string;\n };\n}\n\n/**\n * List available metrics response\n */\ninterface ListMetricsResponse {\n success: boolean;\n message: string;\n data?: {\n metrics: Array<{\n name: string;\n type?: string;\n description?: string;\n }>;\n };\n}\n\n/**\n * Query metric data response\n */\ninterface QueryMetricDataResponse {\n success: boolean;\n message: string;\n data?: {\n metricName: string;\n dataPoints: Array<{\n timestamp: number;\n value: number;\n labels?: Record<string, string>;\n }>;\n };\n}\n\n/**\n * Data sources list response\n */\ninterface DataSourcesResponse {\n success: boolean;\n message: string;\n data?: {\n datasources: DataSource[];\n };\n}\n\n/**\n * Datasource metrics response\n */\ninterface DatasourceMetricsResponse {\n success: boolean;\n message: string;\n data?: {\n index: {\n datasourceId: number;\n datasourceName: string;\n catalogVersion: string;\n domainCategories: string[];\n metrics: Array<{\n metricName: string;\n displayName: string;\n domain: string;\n shortDesc: string;\n searchKeywords: string[];\n registered: boolean;\n }>;\n tables?: Array<{\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 metricsDetails: Array<{\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 tablesDetails?: Array<{\n tableName: string;\n docType: string;\n docTypeEn: string;\n objTypeCode?: number;\n mainTable?: string;\n lineTable?: string;\n selectSql: string;\n columns: Array<{\n name: string;\n label: string;\n description?: string;\n type?: string;\n example?: string;\n } | null>;\n }>;\n };\n}\n\n/**\n * Semantic query response\n */\ninterface SemanticQueryResponse {\n success: boolean;\n message: string;\n data?: {\n semanticModel: string;\n columns: string[];\n dataPoints: Array<{\n timestamp?: number;\n value: number;\n labels?: Record<string, string>;\n }>;\n metadata?: {\n rowCount?: number;\n columnCount?: number;\n };\n };\n}\n\n/**\n * Get all metrics server configs for a tenant\n */\nexport async function getMetricsServerConfigList(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<MetricsServerConfigListResponse> {\n const tenantId = getTenantId(request);\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n const configs = await store.getAllConfigs(tenantId);\n\n return {\n success: true,\n message: \"Metrics server configurations retrieved successfully\",\n data: {\n records: configs,\n total: configs.length,\n },\n };\n } catch (error) {\n console.error(\"Failed to get metrics server configs:\", error);\n return {\n success: false,\n message: \"Failed to retrieve metrics server configurations\",\n data: {\n records: [],\n total: 0,\n },\n };\n }\n}\n\n/**\n * Get metrics server config by key\n */\nexport async function getMetricsServerConfig(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<MetricsServerConfigResponse> {\n const tenantId = getTenantId(request);\n const { key } = request.params as { key: string };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n const config = await store.getConfigByKey(tenantId, key);\n\n if (!config) {\n return {\n success: false,\n message: \"Metrics server configuration not found\",\n };\n }\n\n return {\n success: true,\n message: \"Metrics server configuration retrieved successfully\",\n data: config,\n };\n } catch (error) {\n console.error(\"Failed to get metrics server config:\", error);\n return {\n success: false,\n message: \"Failed to retrieve metrics server configuration\",\n };\n }\n}\n\n/**\n * Create new metrics server config\n */\nexport async function createMetricsServerConfig(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<MetricsServerConfigResponse> {\n const tenantId = getTenantId(request);\n const body = request.body as CreateMetricsServerConfigRequest & { \n id?: string;\n selectedDataSources?: string[];\n };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n // Check if key already exists\n const existing = await store.getConfigByKey(tenantId, body.key);\n if (existing) {\n reply.code(409);\n return {\n success: false,\n message: \"Metrics server configuration with this key already exists\",\n };\n }\n\n if (body.config.type === \"semantic\" && !body.selectedDataSources) {\n reply.code(400);\n return {\n success: false,\n message: \"selectedDataSources is required for semantic metrics servers\",\n };\n }\n\n const id = body.id || randomUUID();\n const configData: CreateMetricsServerConfigRequest = {\n key: body.key,\n name: body.name,\n description: body.description,\n config: body.config.type === \"semantic\" \n ? {\n ...body.config,\n selectedDataSources: body.selectedDataSources || [],\n } as SemanticMetricsServerConfig\n : body.config,\n };\n\n const config = await store.createConfig(tenantId, id, configData);\n\n // Auto-register to MetricsServerManager\n try {\n metricsServerManager.registerServer(tenantId, config.key, config.config);\n } catch (error) {\n console.warn(\"Failed to auto-register metrics server:\", error);\n }\n\n reply.code(201);\n return {\n success: true,\n message: \"Metrics server configuration created successfully\",\n data: config,\n };\n } catch (error) {\n console.error(\"Failed to create metrics server config:\", error);\n return {\n success: false,\n message: \"Failed to create metrics server configuration\",\n };\n }\n}\n\n/**\n * Update metrics server config\n */\nexport async function updateMetricsServerConfig(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<MetricsServerConfigResponse> {\n const tenantId = getTenantId(request);\n const { key } = request.params as { key: string };\n const updates = request.body as Partial<UpdateMetricsServerConfigRequest> & {\n selectedDataSources?: string[];\n };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n const existing = await store.getConfigByKey(tenantId, key);\n if (!existing) {\n reply.code(404);\n return {\n success: false,\n message: \"Metrics server configuration not found\",\n };\n }\n\n const isSemantic = updates.config?.type === \"semantic\" ||\n (existing.config.type === \"semantic\" && !updates.config?.type);\n\n if (isSemantic && updates.selectedDataSources !== undefined) {\n updates.config = {\n ...existing.config,\n ...updates.config,\n type: \"semantic\",\n selectedDataSources: updates.selectedDataSources,\n } as SemanticMetricsServerConfig;\n }\n\n const updated = await store.updateConfig(tenantId, existing.id, updates);\n\n if (!updated) {\n return {\n success: false,\n message: \"Failed to update metrics server configuration\",\n };\n }\n\n if (updates.config) {\n try {\n metricsServerManager.registerServer(tenantId, updated.key, updated.config);\n } catch (error) {\n console.warn(\"Failed to re-register metrics server:\", error);\n }\n }\n\n return {\n success: true,\n message: \"Metrics server configuration updated successfully\",\n data: updated,\n };\n } catch (error) {\n console.error(\"Failed to update metrics server config:\", error);\n return {\n success: false,\n message: \"Failed to update metrics server configuration\",\n };\n }\n}\n\n/**\n * Delete metrics server config by key or id\n */\nexport async function deleteMetricsServerConfig(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<MetricsServerConfigResponse> {\n const tenantId = getTenantId(request);\n const { keyOrId } = request.params as { keyOrId: string };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n // Try to find by key first, then by id\n let config = await store.getConfigByKey(tenantId, keyOrId);\n let configKey = keyOrId;\n\n if (!config) {\n // Try to find by id\n config = await store.getConfigById(tenantId, keyOrId);\n if (config) {\n configKey = config.key;\n }\n }\n\n if (!config) {\n reply.code(404);\n return {\n success: false,\n message: \"Metrics server configuration not found\",\n };\n }\n\n const deleted = await store.deleteConfig(tenantId, config.id);\n\n if (!deleted) {\n return {\n success: false,\n message: \"Failed to delete metrics server configuration\",\n };\n }\n\n // Remove from MetricsServerManager\n try {\n if (metricsServerManager.hasServer(tenantId, configKey)) {\n metricsServerManager.removeServer(tenantId, configKey);\n }\n } catch (error) {\n console.warn(\"Failed to remove from MetricsServerManager:\", error);\n }\n\n return {\n success: true,\n message: \"Metrics server configuration deleted successfully\",\n };\n } catch (error) {\n console.error(\"Failed to delete metrics server config:\", error);\n return {\n success: false,\n message: \"Failed to delete metrics server configuration\",\n };\n }\n}\n\n/**\n * Test metrics server connection\n */\nexport async function testMetricsServerConnection(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<TestConnectionResponse> {\n const tenantId = getTenantId(request);\n const { key } = request.params as { key: string };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n const config = await store.getConfigByKey(tenantId, key);\n if (!config) {\n reply.code(404);\n return {\n success: false,\n message: \"Metrics server configuration not found\",\n };\n }\n\n // Register temporarily for testing\n const testKey = `__test_${key}_${Date.now()}`;\n metricsServerManager.registerServer(tenantId, testKey, config.config);\n\n try {\n const client = await metricsServerManager.getClient(tenantId, testKey);\n const result = await client.testConnection();\n\n // Cleanup\n metricsServerManager.removeServer(tenantId, testKey);\n\n return {\n success: true,\n message: result.connected ? \"Connection test successful\" : \"Connection test failed\",\n data: result,\n };\n } catch (error) {\n // Cleanup on error\n try {\n metricsServerManager.removeServer(tenantId, testKey);\n } catch { /* cleanup error, ignore */ }\n\n return {\n success: true,\n message: \"Connection test failed\",\n data: {\n connected: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n };\n }\n } catch (error) {\n console.error(\"Failed to test metrics server connection:\", error);\n return {\n success: false,\n message: \"Failed to test metrics server connection\",\n data: {\n connected: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n };\n }\n}\n\n/**\n * List available metrics from a server\n */\nexport async function listAvailableMetrics(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<ListMetricsResponse> {\n const tenantId = getTenantId(request);\n const { key } = request.params as { key: string };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n const config = await store.getConfigByKey(tenantId, key);\n if (!config) {\n reply.code(404);\n return {\n success: false,\n message: \"Metrics server configuration not found\",\n };\n }\n\n // Ensure server is registered\n if (!metricsServerManager.hasServer(tenantId, key)) {\n metricsServerManager.registerServer(tenantId, key, config.config);\n }\n\n const client = await metricsServerManager.getClient(tenantId, key);\n const metrics = await client.listMetrics();\n\n return {\n success: true,\n message: \"Metrics retrieved successfully\",\n data: {\n metrics: metrics.map(m => ({\n name: m.name,\n type: m.type,\n description: m.description,\n })),\n },\n };\n } catch (error) {\n console.error(\"Failed to list metrics:\", error);\n return {\n success: false,\n message: \"Failed to retrieve metrics\",\n };\n }\n}\n\n/**\n * Query metric data from a server\n */\nexport async function queryMetricsData(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<QueryMetricDataResponse> {\n const tenantId = getTenantId(request);\n const { key } = request.params as { key: string };\n const { metricName, startTime, endTime, step, labels } = request.body as {\n metricName: string;\n startTime?: number;\n endTime?: number;\n step?: number;\n labels?: Record<string, string>;\n };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n const config = await store.getConfigByKey(tenantId, key);\n if (!config) {\n reply.code(404);\n return {\n success: false,\n message: \"Metrics server configuration not found\",\n };\n }\n\n if (!metricName) {\n reply.code(400);\n return {\n success: false,\n message: \"metricName is required\",\n };\n }\n\n // Ensure server is registered\n if (!metricsServerManager.hasServer(tenantId, key)) {\n metricsServerManager.registerServer(tenantId, key, config.config);\n }\n\n const client = await metricsServerManager.getClient(tenantId, key);\n const result = await client.queryMetricData(metricName, {\n startTime,\n endTime,\n step,\n labels,\n });\n\n return {\n success: true,\n message: \"Metric data retrieved successfully\",\n data: {\n metricName: result.metricName,\n dataPoints: result.dataPoints,\n },\n };\n } catch (error) {\n console.error(\"Failed to query metric data:\", error);\n return {\n success: false,\n message: \"Failed to query metric data\",\n };\n }\n}\n\n/**\n * Get data sources for a semantic metrics server\n * GET /api/metrics-configs/:key/datasources\n */\nexport async function getDataSources(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<DataSourcesResponse> {\n const tenantId = getTenantId(request);\n const { key } = request.params as { key: string };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n const config = await store.getConfigByKey(tenantId, key);\n if (!config) {\n reply.code(404);\n return {\n success: false,\n message: \"Metrics server configuration not found\",\n };\n }\n\n if (config.config.type !== \"semantic\") {\n reply.code(400);\n return {\n success: false,\n message: \"This endpoint is only available for semantic metrics servers\",\n };\n }\n\n const semanticConfig = config.config as SemanticMetricsServerConfig;\n\n const client = new SemanticMetricsClient(semanticConfig);\n const allDatasources = await client.getDataSources();\n\n // Filter datasources by selectedDataSources if configured\n const selectedIds = semanticConfig.selectedDataSources || [];\n const filteredDatasources = selectedIds.length > 0\n ? allDatasources.filter(ds => selectedIds.includes(String(ds.id)))\n : allDatasources;\n\n return {\n success: true,\n message: \"Data sources retrieved successfully\",\n data: {\n datasources: filteredDatasources,\n },\n };\n } catch (error) {\n console.error(\"Failed to get data sources:\", error);\n return {\n success: false,\n message: \"Failed to retrieve data sources\",\n };\n }\n}\n\n/**\n * Get metrics for a specific data source\n * GET /api/metrics-configs/:key/datasources/:datasourceId/metrics\n */\nexport async function getDatasourceMetrics(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<DatasourceMetricsResponse> {\n const tenantId = getTenantId(request);\n const { key, datasourceId } = request.params as { key: string; datasourceId: string };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n const config = await store.getConfigByKey(tenantId, key);\n if (!config) {\n reply.code(404);\n return {\n success: false,\n message: \"Metrics server configuration not found\",\n };\n }\n\n if (config.config.type !== \"semantic\") {\n reply.code(400);\n return {\n success: false,\n message: \"This endpoint is only available for semantic metrics servers\",\n };\n }\n\n const semanticConfig = config.config as SemanticMetricsServerConfig;\n\n const client = new SemanticMetricsClient(semanticConfig);\n const metrics = await client.getDatasourceMetrics(datasourceId);\n\n return {\n success: true,\n message: \"Datasource metrics retrieved successfully\",\n data: metrics,\n };\n } catch (error) {\n console.error(\"Failed to get datasource metrics:\", error);\n return {\n success: false,\n message: \"Failed to retrieve datasource metrics\",\n };\n }\n}\n\n/**\n * Query semantic metrics data\n * POST /api/metrics-configs/:key/semantic-query\n */\nexport async function querySemanticMetrics(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<SemanticQueryResponse> {\n const tenantId = getTenantId(request);\n const { key } = request.params as { key: string };\n const body = request.body as SemanticMetricsQueryRequest;\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n const config = await store.getConfigByKey(tenantId, key);\n if (!config) {\n reply.code(404);\n return {\n success: false,\n message: \"Metrics server configuration not found\",\n };\n }\n\n if (config.config.type !== \"semantic\") {\n reply.code(400);\n return {\n success: false,\n message: \"This endpoint is only available for semantic metrics servers\",\n };\n }\n\n if (!body.datasourceId || !body.metrics || body.metrics.length === 0) {\n reply.code(400);\n return {\n success: false,\n message: \"datasourceId and metrics array are required\",\n };\n }\n\n const semanticConfig = config.config as SemanticMetricsServerConfig;\n\n const client = new SemanticMetricsClient(semanticConfig);\n const result = await client.semanticQuery(body);\n\n // Transform SemanticMetricsQueryResponse to response format\n // The response contains columns and rows arrays\n const columnNames = result.columns.map(col => col.name);\n const allDataPoints: Array<{\n timestamp?: number;\n value: number;\n labels?: Record<string, string>;\n }> = [];\n\n // Find timestamp column and value column indices\n const timestampColIdx = columnNames.findIndex(col => \n col.toLowerCase().includes('date') || col.toLowerCase().includes('time')\n );\n const valueColIdx = columnNames.findIndex(col => \n col.toLowerCase().includes('value') || col.toLowerCase().includes('rate') || col.toLowerCase().includes('amt')\n );\n\n for (const row of result.rows ?? []) {\n const timestamp = timestampColIdx >= 0 ? row[timestampColIdx] : undefined;\n const value = valueColIdx >= 0 ? row[valueColIdx] : row[row.length - 1];\n \n allDataPoints.push({\n timestamp: timestamp ? new Date(String(timestamp)).getTime() : undefined,\n value: typeof value === 'number' ? value : Number(value) || 0,\n labels: Object.fromEntries(\n columnNames.map((col, idx) => [col, String(row[idx] ?? '')])\n ),\n });\n }\n\n return {\n success: true,\n message: \"Semantic query executed successfully\",\n data: {\n semanticModel: result.semanticModel,\n columns: columnNames,\n dataPoints: allDataPoints,\n metadata: {\n rowCount: result.rows?.length ?? 0,\n columnCount: result.columns.length,\n },\n },\n };\n } catch (error) {\n console.error(\"Failed to query semantic metrics:\", error);\n return {\n success: false,\n message: \"Failed to query semantic metrics\",\n };\n }\n}\n\n/**\n * Test datasources endpoint without saving config\n * Used for multi-step configuration flow\n * POST /api/metrics-configs/test-datasources\n */\nexport async function testSemanticDataSources(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<DataSourcesResponse> {\n const body = request.body as {\n serverUrl: string;\n apiKey?: string;\n username?: string;\n password?: string;\n headers?: Record<string, string>;\n };\n\n try {\n if (!body.serverUrl) {\n reply.code(400);\n return {\n success: false,\n message: \"serverUrl is required\",\n };\n }\n\n const testConfig: SemanticMetricsServerConfig = {\n type: \"semantic\",\n serverUrl: body.serverUrl,\n apiKey: body.apiKey,\n username: body.username,\n password: body.password,\n headers: body.headers,\n };\n\n const client = new SemanticMetricsClient(testConfig);\n\n const datasources = await client.getDataSources();\n\n return {\n success: true,\n message: \"Data sources retrieved successfully\",\n data: {\n datasources,\n },\n };\n } catch (error) {\n console.error(\"Failed to test datasources:\", error);\n return {\n success: false,\n message: `Failed to retrieve data sources: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Test datasource metrics endpoint without saving config\n * Used for multi-step configuration flow\n * POST /api/metrics-configs/test-datasources/:datasourceId/metrics\n */\nexport async function testDatasourceMetrics(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<DatasourceMetricsResponse> {\n const { datasourceId } = request.params as { datasourceId: string };\n const body = request.body as {\n serverUrl: string;\n apiKey?: string;\n username?: string;\n password?: string;\n headers?: Record<string, string>;\n };\n\n try {\n if (!body.serverUrl) {\n reply.code(400);\n return {\n success: false,\n message: \"serverUrl is required\",\n };\n }\n\n const testConfig: SemanticMetricsServerConfig = {\n type: \"semantic\",\n serverUrl: body.serverUrl,\n apiKey: body.apiKey,\n username: body.username,\n password: body.password,\n headers: body.headers,\n };\n\n const client = new SemanticMetricsClient(testConfig);\n const metrics = await client.getDatasourceMetrics(datasourceId);\n\n return {\n success: true,\n message: \"Datasource metrics retrieved successfully\",\n data: metrics,\n };\n } catch (error) {\n console.error(\"Failed to test datasource metrics:\", error);\n return {\n success: false,\n message: `Failed to retrieve datasource metrics: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Register metrics server config routes\n */\nexport function registerMetricsServerConfigRoutes(app: any): void {\n // Get all configs\n app.get(\"/api/metrics-configs\", getMetricsServerConfigList);\n\n // Get config by key\n app.get(\"/api/metrics-configs/:key\", getMetricsServerConfig);\n\n // Create config\n app.post(\"/api/metrics-configs\", createMetricsServerConfig);\n\n // Update config\n app.put(\"/api/metrics-configs/:key\", updateMetricsServerConfig);\n\n // Delete config by key or id\n app.delete(\"/api/metrics-configs/:keyOrId\", deleteMetricsServerConfig);\n\n // Test connection\n app.post(\"/api/metrics-configs/:key/test\", testMetricsServerConnection);\n\n // List available metrics\n app.get(\"/api/metrics-configs/:key/metrics\", listAvailableMetrics);\n\n // Query metric data\n app.post(\"/api/metrics-configs/:key/query\", queryMetricsData);\n\n // Semantic-specific routes\n // Get data sources for a semantic server\n app.get(\"/api/metrics-configs/:key/datasources\", getDataSources);\n\n // Get metrics meta for a specific datasource\n app.get(\"/api/metrics-configs/:key/datasources/:datasourceId/meta\", getDatasourceMetrics);\n\n // Query semantic metrics data\n app.post(\"/api/metrics-configs/:key/semantic-query\", querySemanticMetrics);\n\n // Test datasources without saving config (for multi-step config flow)\n app.post(\"/api/metrics-configs/test-datasources\", testSemanticDataSources);\n\n // Test datasource metrics meta without saving config (for multi-step config flow)\n app.post(\"/api/metrics-configs/test-datasources/:datasourceId/meta\", testDatasourceMetrics);\n}\n","import type { FastifyInstance, FastifyRequest } from \"fastify\";\nimport { ConnectionRegistry, PluginRegistry } from \"@axiom-lattice/core\";\nimport { z } from \"zod\";\n\nconst createBody = z.object({\n type: z.string().min(1),\n key: z.string().min(1),\n name: z.string().min(1),\n description: z.string().optional(),\n config: z.record(z.unknown()),\n});\n\nconst testOrDiscoverBody = z.object({\n key: z.string().optional(),\n config: z.record(z.unknown()).optional(),\n});\n\nfunction getTenant(request: FastifyRequest): string {\n // First try to get from authenticated user context\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) {\n return userTenantId;\n }\n\n // Fallback to request headers for backward compatibility\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\nfunction maskSecrets(config: Record<string, unknown>): Record<string, unknown> {\n const sensitive = new Set([\n \"password\", \"secret\", \"token\", \"apikey\", \"api_key\", \"session\",\n \"privatekey\", \"private_key\", \"accesskey\", \"access_key\",\n ]);\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(config)) {\n out[k] = sensitive.has(k.toLowerCase()) ? \"********\" : v;\n }\n return out;\n}\n\n/** Resolve target config: stored connection (by key) takes priority over inline config */\nasync function resolveConfig(\n type: string, body: { key?: string; config?: Record<string, unknown> }, tenantId: string,\n): Promise<Record<string, unknown>> {\n if (body.key) {\n const entry = await ConnectionRegistry.get(type, body.key, tenantId);\n if (!entry) throw { status: 404, error: `Connection \"${body.key}\" not found` };\n return entry.config;\n }\n if (body.config) return body.config;\n throw { status: 400, error: \"Either 'key' or 'config' is required\" };\n}\n\nexport function connectionRoutes(fastify: FastifyInstance): void {\n // List connections by type\n fastify.get(\"/api/connections\", async (request, reply) => {\n const { type } = request.query as { type?: string };\n if (!type) return reply.status(400).send({ error: \"query 'type' required\" });\n const entries = await ConnectionRegistry.list(type, getTenant(request));\n return reply.send({\n success: true,\n data: { records: entries.map((e) => ({ ...e, config: maskSecrets(e.config) })), total: entries.length },\n });\n });\n\n // Create connection\n fastify.post(\"/api/connections\", async (request, reply) => {\n const parsed = createBody.parse(request.body);\n const entry = await ConnectionRegistry.create({\n tenantId: getTenant(request),\n type: parsed.type,\n key: parsed.key,\n name: parsed.name,\n description: parsed.description,\n config: parsed.config,\n });\n return reply.status(201).send({\n success: true,\n data: { ...entry, config: maskSecrets(entry.config) },\n });\n });\n\n // Update connection (type in query, key in path)\n fastify.put(\"/api/connections/:key\", async (request, reply) => {\n const { type } = request.query as { type?: string };\n if (!type) return reply.status(400).send({ error: \"query 'type' required\" });\n\n const { key } = request.params as { key: string };\n const body = request.body as Record<string, unknown>;\n const tenantId = getTenant(request);\n\n const existing = await ConnectionRegistry.get(type, key, tenantId);\n if (!existing) return reply.status(404).send({ error: \"not found\" });\n\n const updates: Record<string, unknown> = {};\n if (body.name !== undefined) updates.name = body.name;\n if (body.description !== undefined) updates.description = body.description;\n if (body.config) {\n updates.config = { ...existing.config, ...(body.config as Record<string, unknown>) };\n }\n\n const entry = await ConnectionRegistry.update(tenantId, type, key, updates);\n return reply.send({\n success: true,\n data: { ...entry, config: maskSecrets(entry?.config ?? {}) },\n });\n });\n\n // Delete connection\n fastify.delete(\"/api/connections/:key\", async (request, reply) => {\n const { type } = request.query as { type?: string };\n if (!type) return reply.status(400).send({ error: \"query 'type' required\" });\n\n const { key } = request.params as { key: string };\n const ok = await ConnectionRegistry.delete(getTenant(request), type, key);\n return reply.send({ success: ok });\n });\n\n // Test connection (supports key-based stored connection or inline config)\n fastify.post(\"/api/connections/test\", async (request, reply) => {\n const { type } = request.query as { type: string };\n if (!type) return reply.status(400).send({ error: \"query 'type' required\" });\n\n const plugin = PluginRegistry.get(type);\n if (!plugin?.connection?.test) {\n return reply.status(400).send({ error: \"plugin does not support connection testing\" });\n }\n\n try {\n const body = testOrDiscoverBody.parse(request.body);\n const targetConfig = await resolveConfig(type, body, getTenant(request));\n const result = await plugin.connection.test(targetConfig);\n return reply.send(result);\n } catch (err) {\n if ((err as Record<string, unknown>)?.status === 404) {\n return reply.status(404).send(err);\n }\n if ((err as Record<string, unknown>)?.status === 400) {\n return reply.status(400).send(err);\n }\n if (err instanceof z.ZodError) {\n return reply.status(400).send({ error: err.errors });\n }\n return reply.status(500).send({\n ok: false,\n message: err instanceof Error ? err.message : String(err),\n });\n }\n });\n\n // Resource discovery (supports key-based stored connection or inline config)\n fastify.post(\"/api/connections/discover\", async (request, reply) => {\n const { type } = request.query as { type: string };\n if (!type) return reply.status(400).send({ error: \"query 'type' required\" });\n\n const plugin = PluginRegistry.get(type);\n if (!plugin?.connection?.discover) {\n return reply.status(400).send({ error: \"plugin does not support resource discovery\" });\n }\n\n try {\n const body = testOrDiscoverBody.parse(request.body);\n const targetConfig = await resolveConfig(type, body, getTenant(request));\n const resources = await plugin.connection.discover(targetConfig);\n return reply.send({ resources });\n } catch (err) {\n if ((err as Record<string, unknown>)?.status === 404) {\n return reply.status(404).send(err);\n }\n if ((err as Record<string, unknown>)?.status === 400) {\n return reply.status(400).send(err);\n }\n if (err instanceof z.ZodError) {\n return reply.status(400).send({ error: err.errors });\n }\n return reply.status(500).send({\n error: err instanceof Error ? err.message : String(err),\n });\n }\n });\n}\n","import { FastifyInstance, FastifyRequest, FastifyReply } from \"fastify\";\nimport { getStoreLattice } from \"@axiom-lattice/core\";\nimport { EvalStore } from \"@axiom-lattice/protocols\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { evalRunner, EvalStreamEvent } from \"../services/eval-runner\";\n\nfunction getTenantId(request: FastifyRequest): string {\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) {\n return userTenantId;\n }\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\nfunction getEvalStore(): EvalStore {\n return getStoreLattice(\"default\", \"eval\").store as EvalStore;\n}\n\nexport async function createProject(\n request: FastifyRequest<{ Body: Record<string, unknown> }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string; data?: unknown }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const id = uuidv4();\n const data = request.body as any;\n\n // Project name must be unique per tenant. The agent-eval convention\n // (`eval-{agent-id}`) relies on this to associate a project with an agent.\n const existing = await store.getProjectsByTenant(tenantId);\n if (existing.some((p) => p.name === data.name)) {\n return reply.status(409).send({\n success: false,\n message: `Eval project with name \"${data.name}\" already exists`,\n });\n }\n\n const serverCfg = (data.targetServerConfig || {}) as Record<string, unknown>;\n const judgeCfg = (data.judgeModelConfig || {}) as Record<string, unknown>;\n const modelKey = (judgeCfg.modelKey as string) || \"\";\n if (modelKey) {\n const { modelLatticeManager } = await import(\"@axiom-lattice/core\");\n if (!modelLatticeManager.hasLattice(modelKey)) {\n return reply.status(400).send({ success: false, message: `Judge model \"${modelKey}\" is not registered` });\n }\n }\n const project = await store.createProject(tenantId, id, {\n name: data.name,\n description: data.description,\n version: data.version,\n judgeModelConfig: {\n modelKey,\n displayName: (judgeCfg.displayName as string) || \"\",\n },\n targetServerConfig: {\n base_url: (serverCfg.base_url as string) || \"\",\n api_key: (serverCfg.api_key as string) || \"\",\n // Project↔agent association pointer (see manage_eval create_project).\n ...(serverCfg.targetAgentId ? { targetAgentId: serverCfg.targetAgentId as string } : {}),\n },\n concurrency: data.concurrency ?? 1,\n reportConfig: data.reportConfig,\n });\n return reply.status(201).send({\n success: true,\n message: \"Successfully created project\",\n data: project,\n });\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to create project\";\n // TOCTOU guard: the pre-check above can race two concurrent creates;\n // the DB unique constraint (pg 23505 / sqlite UNIQUE constraint failed)\n // is the source of truth. Map it to 409, not a raw 500.\n const code = (err as { code?: string }).code;\n const isUniqueViolation =\n code === \"23505\" ||\n typeof message === \"string\" && message.includes(\"UNIQUE constraint failed\");\n if (isUniqueViolation) {\n return reply.status(409).send({\n success: false,\n message: `Eval project with name \"${(request.body as Record<string, unknown>).name}\" already exists`,\n });\n }\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function listProjects(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string; data?: unknown }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n let projects = await store.getProjectsByTenant(tenantId);\n\n // Seed a default project for new tenants\n if (projects.length === 0) {\n try {\n const { modelLatticeManager } = await import(\"@axiom-lattice/core\");\n const models = modelLatticeManager.getAllLattices();\n const first = models[0];\n const judgeModel = first\n ? { modelKey: first.key }\n : {};\n\n const host = request.hostname || \"localhost\";\n const baseUrl = `http://${host}:${process.env.PORT || 4001}`;\n\n await store.createProject(tenantId, uuidv4(), {\n name: \"Default\",\n description: \"Built-in project for testing eval against this server\",\n judgeModelConfig: judgeModel,\n targetServerConfig: { base_url: baseUrl, api_key: \"\" },\n concurrency: 3,\n });\n projects = await store.getProjectsByTenant(tenantId);\n } catch { /* seed failure is non-fatal */ }\n }\n\n return {\n success: true,\n message: \"Ok\",\n data: { records: projects, total: projects.length },\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to list projects\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function getProject(\n request: FastifyRequest<{ Params: { pid: string } }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string; data?: unknown }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const { pid } = request.params;\n const project = await store.getProjectById(tenantId, pid);\n if (!project) {\n return reply.status(404).send({ success: false, message: \"Project not found\" });\n }\n const suites = await store.getSuitesByProject(tenantId, pid);\n return {\n success: true,\n message: \"Ok\",\n data: { project, suites },\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to get project\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function updateProject(\n request: FastifyRequest<{ Params: { pid: string }; Body: Record<string, unknown> }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string; data?: unknown }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const { pid } = request.params;\n const existing = await store.getProjectById(tenantId, pid);\n if (!existing) {\n return reply.status(404).send({ success: false, message: \"Project not found\" });\n }\n const body = request.body as Record<string, unknown>;\n const updateData: Record<string, unknown> = { ...body };\n // Strip in_process from user input — it is server-controlled\n const serverCfg = (body.targetServerConfig || {}) as Record<string, unknown>;\n if (body.targetServerConfig !== undefined) {\n updateData.targetServerConfig = {\n base_url: (serverCfg.base_url as string) || \"\",\n api_key: (serverCfg.api_key as string) || \"\",\n };\n }\n // Only allow modelKey/displayName — never raw provider/apiKey/baseURL\n if (body.judgeModelConfig !== undefined) {\n const judgeCfg = (body.judgeModelConfig || {}) as Record<string, unknown>;\n const modelKey = (judgeCfg.modelKey as string) || \"\";\n if (modelKey) {\n const { modelLatticeManager } = await import(\"@axiom-lattice/core\");\n if (!modelLatticeManager.hasLattice(modelKey)) {\n return reply.status(400).send({ success: false, message: `Judge model \"${modelKey}\" is not registered` });\n }\n }\n updateData.judgeModelConfig = {\n modelKey,\n displayName: (judgeCfg.displayName as string) || \"\",\n };\n }\n const updated = await store.updateProject(tenantId, pid, updateData);\n return {\n success: true,\n message: \"Successfully updated project\",\n data: updated,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to update project\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function deleteProject(\n request: FastifyRequest<{ Params: { pid: string } }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const { pid } = request.params;\n const existing = await store.getProjectById(tenantId, pid);\n if (!existing) {\n return reply.status(404).send({ success: false, message: \"Project not found\" });\n }\n const deleted = await store.deleteProject(tenantId, pid);\n if (!deleted) {\n return reply.status(500).send({ success: false, message: \"Failed to delete project\" });\n }\n return { success: true, message: \"Successfully deleted project\" };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to delete project\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function createSuite(\n request: FastifyRequest<{ Params: { pid: string }; Body: Record<string, unknown> }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string; data?: unknown }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const { pid } = request.params;\n const project = await store.getProjectById(tenantId, pid);\n if (!project) {\n return reply.status(404).send({ success: false, message: \"Project not found\" });\n }\n const id = uuidv4();\n const data = request.body as any;\n const suite = await store.createSuite(tenantId, pid, id, { name: data.name });\n return reply.status(201).send({\n success: true,\n message: \"Successfully created suite\",\n data: suite,\n });\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to create suite\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function updateSuite(\n request: FastifyRequest<{ Params: { pid: string; sid: string }; Body: Record<string, unknown> }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string; data?: unknown }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const { sid } = request.params;\n const existing = await store.getSuiteById(tenantId, sid);\n if (!existing) {\n return reply.status(404).send({ success: false, message: \"Suite not found\" });\n }\n const updated = await store.updateSuite(tenantId, sid, request.body as any);\n return {\n success: true,\n message: \"Successfully updated suite\",\n data: updated,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to update suite\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function deleteSuite(\n request: FastifyRequest<{ Params: { pid: string; sid: string } }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const { sid } = request.params;\n const existing = await store.getSuiteById(tenantId, sid);\n if (!existing) {\n return reply.status(404).send({ success: false, message: \"Suite not found\" });\n }\n const deleted = await store.deleteSuite(tenantId, sid);\n if (!deleted) {\n return reply.status(500).send({ success: false, message: \"Failed to delete suite\" });\n }\n return { success: true, message: \"Successfully deleted suite\" };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to delete suite\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function createCase(\n request: FastifyRequest<{ Params: { pid: string; sid: string }; Body: Record<string, unknown> }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string; data?: unknown }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const { sid } = request.params;\n const suite = await store.getSuiteById(tenantId, sid);\n if (!suite) {\n return reply.status(404).send({ success: false, message: \"Suite not found\" });\n }\n const id = uuidv4();\n const data = request.body as any;\n const created = await store.createCase(tenantId, sid, id, {\n inputMessage: data.inputMessage,\n inputFiles: data.inputFiles,\n steps: data.steps ?? [],\n outputType: data.outputType ?? \"message_content\",\n contentAssertion: data.contentAssertion ?? \"\",\n rubrics: data.rubrics,\n interruptPolicy: data.interruptPolicy,\n });\n return reply.status(201).send({\n success: true,\n message: \"Successfully created case\",\n data: created,\n });\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to create case\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function listCasesForSuite(\n request: FastifyRequest<{ Params: { pid: string; sid: string } }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string; data?: unknown }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const { sid } = request.params;\n const cases = await store.getCasesBySuite(tenantId, sid);\n return {\n success: true,\n message: \"Ok\",\n data: { records: cases, total: cases.length },\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to list cases\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function updateCase(\n request: FastifyRequest<{ Params: { pid: string; sid: string; cid: string }; Body: Record<string, unknown> }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string; data?: unknown }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const { cid } = request.params;\n const existing = await store.getCaseById(tenantId, cid);\n if (!existing) {\n return reply.status(404).send({ success: false, message: \"Case not found\" });\n }\n const updated = await store.updateCase(tenantId, cid, request.body as any);\n return {\n success: true,\n message: \"Successfully updated case\",\n data: updated,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to update case\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function deleteCase(\n request: FastifyRequest<{ Params: { pid: string; sid: string; cid: string } }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const { cid } = request.params;\n const existing = await store.getCaseById(tenantId, cid);\n if (!existing) {\n return reply.status(404).send({ success: false, message: \"Case not found\" });\n }\n const deleted = await store.deleteCase(tenantId, cid);\n if (!deleted) {\n return reply.status(500).send({ success: false, message: \"Failed to delete case\" });\n }\n return { success: true, message: \"Successfully deleted case\" };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to delete case\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport function registerEvalRoutes(app: FastifyInstance): void {\n app.post(\"/api/eval/projects\", createProject);\n app.get(\"/api/eval/projects\", listProjects);\n app.get(\"/api/eval/projects/:pid\", getProject);\n app.put(\"/api/eval/projects/:pid\", updateProject);\n app.delete(\"/api/eval/projects/:pid\", deleteProject);\n\n app.post(\"/api/eval/projects/:pid/suites\", createSuite);\n app.put(\"/api/eval/projects/:pid/suites/:sid\", updateSuite);\n app.delete(\"/api/eval/projects/:pid/suites/:sid\", deleteSuite);\n\n app.post(\"/api/eval/projects/:pid/suites/:sid/cases\", createCase);\n app.get(\"/api/eval/projects/:pid/suites/:sid/cases\", listCasesForSuite);\n app.put(\"/api/eval/projects/:pid/suites/:sid/cases/:cid\", updateCase);\n app.delete(\"/api/eval/projects/:pid/suites/:sid/cases/:cid\", deleteCase);\n\n // POST /api/eval/projects/:pid/runs — trigger run\n app.post(\"/api/eval/projects/:pid/runs\", async (request, reply) => {\n try {\n const tenantId = getTenantId(request);\n const { pid } = request.params as { pid: string };\n const body = (request.body ?? {}) as {\n suiteIds?: string[]; caseIds?: string[];\n runConfig?: { workspaceId?: string; projectId?: string };\n taskId?: string;\n };\n // Runtime environment: prefer explicit body.runConfig (from the UI's\n // project selector). Fall back to request headers for backward compat.\n // NOT from the eval project's targetServerConfig.\n const bodyWs = (request.headers[\"x-workspace-id\"] as string) || \"\";\n const bodyPj = (request.headers[\"x-project-id\"] as string) || \"\";\n const runConfig = {\n workspaceId: body?.runConfig?.workspaceId ?? bodyWs,\n projectId: body?.runConfig?.projectId ?? bodyPj,\n };\n const runId = await evalRunner.startRun(tenantId, pid, body?.suiteIds, body?.caseIds, runConfig, body?.taskId);\n reply.status(202).send({ success: true, message: \"Run started\", data: { run_id: runId } });\n } catch (err) {\n const msg = (err as Error).message;\n const code = msg === \"Project not found\" ? 404\n : msg.includes(\"already in progress\") ? 409\n : msg.includes(\"No suites match\") || msg.includes(\"No cases match\") ? 400\n : 500;\n reply.status(code).send({ success: false, message: msg });\n }\n });\n\n // GET /api/eval/runs — list runs\n app.get(\"/api/eval/runs\", async (request, reply) => {\n try {\n const tenantId = getTenantId(request);\n const query = request.query as { project_id?: string; status?: string };\n const runs = await getEvalStore().getRunsByTenant(tenantId, { projectId: query.project_id, status: query.status });\n reply.send({ success: true, message: \"Ok\", data: { records: runs, total: runs.length } });\n } catch (err) {\n reply.status(500).send({ success: false, message: (err as Error).message });\n }\n });\n\n // GET /api/eval/runs/:rid — get run detail with results\n app.get(\"/api/eval/runs/:rid\", async (request, reply) => {\n try {\n const tenantId = getTenantId(request);\n const { rid } = request.params as { rid: string };\n const run = await getEvalStore().getRunById(tenantId, rid);\n if (!run) return reply.status(404).send({ success: false, message: \"Run not found\" });\n const results = await getEvalStore().getResultsByRun(tenantId, rid);\n reply.send({ success: true, message: \"Ok\", data: { ...run, results } });\n } catch (err) {\n reply.status(500).send({ success: false, message: (err as Error).message });\n }\n });\n\n // GET /api/eval/runs/:rid/stream — SSE progress stream\n app.get(\"/api/eval/runs/:rid/stream\", async (request, reply) => {\n reply.hijack();\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n\n const { rid } = request.params as { rid: string };\n const emitter = evalRunner.getEventEmitter();\n const eventKey = `run:${rid}`;\n\n if (!evalRunner.isRunning(rid)) {\n const tenantId = getTenantId(request);\n const run = await getEvalStore().getRunById(tenantId, rid);\n if (run) {\n const eventType = run.status === \"completed\" ? \"completed\" : \"error\";\n reply.raw.write(`event: ${eventType}\\ndata: ${JSON.stringify({ passed: run.passedCases, failed: run.failedCases, avgScore: run.avgScore })}\\n\\n`);\n }\n reply.raw.end();\n return;\n }\n\n const handler = (event: EvalStreamEvent): void => {\n reply.raw.write(`event: ${event.type}\\ndata: ${JSON.stringify(event.data)}\\n\\n`);\n if (event.type === \"completed\" || event.type === \"error\") {\n emitter.off(eventKey, handler);\n reply.raw.end();\n }\n };\n\n emitter.on(eventKey, handler);\n\n request.raw.on(\"close\", () => {\n emitter.off(eventKey, handler);\n });\n });\n\n // POST /api/eval/runs/:rid/abort — abort run\n app.post(\"/api/eval/runs/:rid/abort\", async (request, reply) => {\n try {\n const { rid } = request.params as { rid: string };\n const aborted = await evalRunner.abortRun(rid);\n if (!aborted) return reply.status(404).send({ success: false, message: \"Run not found or not running\" });\n reply.send({ success: true, message: \"Run aborted\" });\n } catch (err) {\n reply.status(500).send({ success: false, message: (err as Error).message });\n }\n });\n\n // DELETE /api/eval/runs/:rid — delete run and results\n app.delete(\"/api/eval/runs/:rid\", async (request, reply) => {\n try {\n const tenantId = getTenantId(request);\n const { rid } = request.params as { rid: string };\n const deleted = await getEvalStore().deleteRun(tenantId, rid);\n if (!deleted) return reply.status(404).send({ success: false, message: \"Run not found\" });\n reply.send({ success: true, message: \"Run deleted\" });\n } catch (err) {\n reply.status(500).send({ success: false, message: (err as Error).message });\n }\n });\n\n // GET /api/eval/reports/projects/:pid — aggregated report\n app.get(\"/api/eval/reports/projects/:pid\", async (request, reply) => {\n try {\n const tenantId = getTenantId(request);\n const { pid } = request.params as { pid: string };\n const report = await getEvalStore().getProjectReport(tenantId, pid);\n if (!report) return reply.status(404).send({ success: false, message: \"Project not found\" });\n reply.send({ success: true, message: \"Ok\", data: report });\n } catch (err) {\n reply.status(500).send({ success: false, message: (err as Error).message });\n }\n });\n}\n","import { EventEmitter } from \"events\";\nimport {\n getStoreLattice,\n modelLatticeManager,\n LatticeEvalProject,\n} from \"@axiom-lattice/core\";\nimport type { EvalStore } from \"@axiom-lattice/protocols\";\nimport type {\n CaseRunResult,\n LatticeEvalBatchReport,\n LatticeEvalProjectType,\n LatticeEvalSuiteType,\n LatticeEvalLogEvent,\n} from \"@axiom-lattice/core\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nexport interface EvalStreamEvent {\n type: \"progress\" | \"completed\" | \"error\";\n runId: string;\n data: Record<string, unknown>;\n}\n\ninterface RunContext {\n runId: string;\n projectId: string;\n tenantId: string;\n abortController: AbortController;\n promise: Promise<{ report: LatticeEvalBatchReport }>;\n taskId?: string;\n}\n\nfunction mapLogs(logs: LatticeEvalLogEvent[]): Array<{ timestamp: string; level: string; message: string; data?: unknown }> {\n return logs.map((l) => ({\n timestamp: l.ts,\n level: l.level,\n message: l.message,\n data: l.data,\n }));\n}\n\n/**\n * EvalRunner — in-process evaluation run scheduler.\n *\n * @remarks\n * Single-instance assumption: run state lives in an in-memory Map plus a\n * per-instance EventEmitter. Deploying multiple gateway instances requires\n * a distributed lease (runner instance id + heartbeat) before the orphan\n * cleanup below is safe — without it, instance B could mark instance A's\n * live run failed. The createdAt guard limits cleanup to runs created\n * BEFORE this process started, which are true orphans of a restart.\n */\nclass EvalRunner {\n private runs = new Map<string, RunContext>();\n private eventEmitter = new EventEmitter();\n private readonly processStartedAt = new Date();\n\n getEventEmitter(): EventEmitter {\n return this.eventEmitter;\n }\n\n async startRun(\n tenantId: string,\n projectId: string,\n suiteIds?: string[],\n caseIds?: string[],\n runConfig?: { workspaceId?: string; projectId?: string },\n taskId?: string\n ): Promise<string> {\n const store = this.getEvalStore();\n const project = await store.getProjectById(tenantId, projectId);\n if (!project) throw new Error(\"Project not found\");\n\n for (const ctx of this.runs.values()) {\n if (ctx.projectId === projectId) {\n throw new Error(\"A run is already in progress for this project\");\n }\n }\n\n const existingRuns = await store.getRunsByTenant(tenantId, { projectId, status: \"running\" });\n for (const run of existingRuns) {\n // Only clean runs created before this process started: they are true\n // orphans of a gateway restart. Runs created after startup but missing\n // from memory belong to another live instance — leave them alone.\n const orphaned = !this.runs.has(run.id) && run.createdAt < this.processStartedAt;\n if (orphaned) {\n await store.updateRunStatus(tenantId, run.id, {\n status: \"failed\",\n error: \"Gateway restarted — run orphaned\",\n completedAt: new Date(),\n });\n }\n }\n const stillRunning = await store.getRunsByTenant(tenantId, { projectId, status: \"running\" });\n if (stillRunning.length > 0) {\n throw new Error(\"A run is already in progress for this project\");\n }\n\n let suites = await store.getSuitesByProject(tenantId, projectId);\n if (suiteIds && suiteIds.length > 0) {\n suites = suites.filter((s) => suiteIds.includes(s.id));\n if (suites.length === 0) {\n throw new Error(\"No suites match the requested suiteIds filter\");\n }\n }\n const evalSuites: LatticeEvalSuiteType[] = [];\n let totalCases = 0;\n\n for (const suite of suites) {\n let cases = await store.getCasesBySuite(tenantId, suite.id);\n if (caseIds && caseIds.length > 0) {\n cases = cases.filter((c) => caseIds.includes(c.id));\n if (cases.length === 0) continue;\n }\n totalCases += cases.length;\n evalSuites.push({\n suiteName: suite.name,\n cases: cases.map((c) => ({\n caseId: c.id,\n input: { message: c.inputMessage, files: c.inputFiles },\n steps: c.steps,\n output: { type: \"message_content\" },\n interruptPolicy: c.interruptPolicy,\n eval: {\n content_assertion: c.contentAssertion,\n eval_rubrics: c.rubrics?.map((r) => ({\n dimension: r.name,\n weight: r.weight,\n description: r.description,\n })),\n },\n })),\n });\n }\n\n if (caseIds && caseIds.length > 0 && evalSuites.length === 0) {\n throw new Error(\"No cases match the requested caseIds filter\");\n }\n\n const judgeCfg = (project.judgeModelConfig ?? {}) as Record<string, unknown>;\n const judgeModelKey = (judgeCfg.modelKey as string) || \"\";\n let resolvedJudgeModelKey: string;\n\n if (judgeModelKey) {\n if (!modelLatticeManager.hasLattice(judgeModelKey)) {\n throw new Error(`Judge model \"${judgeModelKey}\" is not registered`);\n }\n resolvedJudgeModelKey = judgeModelKey;\n } else {\n // No explicit judge — prefer the model registered under the \"default\"\n // key (the app convention, see examples), else the first registered one.\n const models = modelLatticeManager.getAllLattices();\n const defaultModel = models.find((m) => m.key === \"default\");\n resolvedJudgeModelKey = defaultModel?.key ?? models[0]?.key ?? \"\";\n if (!resolvedJudgeModelKey) {\n throw new Error(\"No model registered — cannot run eval without a judge model\");\n }\n if (!defaultModel) {\n console.warn(`[eval-runner] Project \"${project.name}\" has no judge modelKey and no \"default\" model — falling back to first registered model \"${resolvedJudgeModelKey}\"`);\n }\n }\n\n const runId = uuidv4();\n const concurrency = Math.max(1, Math.floor((project as unknown as Record<string, unknown>).concurrency as number) || 3);\n // Hold-out isolation: a run covering ONLY validation suites is a\n // holdout run — its per-case results are withheld from agents.\n const isHoldout = suites.length > 0 && suites.every((s) => s.name.endsWith(\"-validation\"));\n // Runtime environment comes from the CALLER's runConfig (runConfig\n // param), NOT from the eval project's targetServerConfig. Test cases\n // are environment-agnostic — the run environment is decided at run time.\n const workspaceId = runConfig?.workspaceId || \"\";\n const projectIdFromConfig = runConfig?.projectId || \"\";\n await store.createRun(tenantId, projectId, runId, {\n totalCases, concurrency, holdout: isHoldout,\n envWorkspaceId: workspaceId || undefined,\n envProjectId: projectIdFromConfig || undefined,\n taskId,\n });\n\n const projectConfig: LatticeEvalProjectType = {\n projectName: project.name,\n version: project.version,\n description: project.description,\n suites: evalSuites,\n judge_agent_config: { modelKey: resolvedJudgeModelKey },\n lattice_server_config: {\n tenant_id: tenantId,\n workspace_id: workspaceId,\n project_id: projectIdFromConfig,\n },\n concurrency,\n };\n\n const abortController = new AbortController();\n const stats = { passed: 0, failed: 0, interrupted: 0, totalScore: 0 };\n\n const onCaseComplete = async (result: CaseRunResult, suiteName: string): Promise<void> => {\n // HITL-paused cases are judged like any other case (the pause is\n // business behavior) — the interrupted flag is informational metadata.\n const passed = result.result?.pass ?? false;\n const score = result.result?.final_score ?? 0;\n\n if (passed) stats.passed++; else stats.failed++;\n stats.totalScore += score;\n if (result.interrupted) stats.interrupted++;\n\n const completedCount = stats.passed + stats.failed;\n\n await store.createRunResult(tenantId, runId, uuidv4(), {\n suiteName,\n caseId: result.caseId,\n pass: passed,\n score,\n summary: result.result?.summary,\n dimensionResults: result.result?.dimension_results?.map((d) => ({\n name: d.name,\n score: d.score,\n reason: d.reason,\n })),\n durationMs: result.duration_ms,\n messages: result.messages,\n logs: mapLogs(result.logs),\n error: result.error,\n interrupted: result.interrupted,\n });\n\n const avgScore = completedCount > 0 ? stats.totalScore / completedCount : 0;\n await store.updateRunStatus(tenantId, runId, {\n passedCases: stats.passed,\n failedCases: stats.failed,\n interruptedCases: stats.interrupted,\n avgScore,\n });\n\n this.eventEmitter.emit(`run:${runId}`, {\n type: \"progress\",\n runId,\n data: { suiteName, caseId: result.caseId, pass: passed, score, interrupted: result.interrupted ?? false, completed: completedCount, total: totalCases },\n } satisfies EvalStreamEvent);\n };\n\n const runPromise = (async () => {\n try {\n const evalProject = new LatticeEvalProject(projectConfig, onCaseComplete);\n const calibration = await evalProject.calibrateJudge();\n if (!calibration.ok && !calibration.bypassed) {\n await store.updateRunStatus(tenantId, runId, {\n status: \"failed\",\n error: `Judge calibration failed: ${calibration.reason}`,\n completedAt: new Date(),\n });\n throw new Error(`Judge calibration failed: ${calibration.reason}`);\n }\n if (calibration.bypassed) {\n console.warn(`[eval-runner] Judge calibration bypassed — judge may be unreliable: ${calibration.reason}`);\n }\n const { report } = await evalProject.runAllSuitesBatch(concurrency, abortController.signal);\n\n if (!abortController.signal.aborted) {\n const completedCount = stats.passed + stats.failed;\n await store.updateRunStatus(tenantId, runId, {\n status: \"completed\",\n completedAt: new Date(),\n passedCases: stats.passed,\n failedCases: stats.failed,\n interruptedCases: stats.interrupted,\n avgScore: completedCount > 0 ? stats.totalScore / completedCount : 0,\n });\n\n this.eventEmitter.emit(`run:${runId}`, {\n type: \"completed\",\n runId,\n data: { passed: stats.passed, failed: stats.failed, avgScore: completedCount > 0 ? stats.totalScore / completedCount : 0 },\n } satisfies EvalStreamEvent);\n }\n\n return { report };\n } catch (err) {\n const errorMsg = (err as Error).message;\n if (!abortController.signal.aborted) {\n await store.updateRunStatus(tenantId, runId, {\n status: \"failed\",\n error: errorMsg,\n completedAt: new Date(),\n });\n\n this.eventEmitter.emit(`run:${runId}`, {\n type: \"error\",\n runId,\n data: { message: errorMsg },\n } satisfies EvalStreamEvent);\n }\n\n throw err;\n } finally {\n this.runs.delete(runId);\n }\n })();\n\n this.runs.set(runId, { runId, projectId, tenantId, abortController, promise: runPromise, taskId });\n runPromise.catch(() => {});\n\n return runId;\n }\n\n async abortRun(runId: string): Promise<boolean> {\n const ctx = this.runs.get(runId);\n if (!ctx) return false;\n ctx.abortController.abort();\n const store = this.getEvalStore();\n await store.updateRunStatus(ctx.tenantId, runId, { status: \"aborted\", completedAt: new Date() });\n return true;\n }\n\n async waitForRun(runId: string): Promise<LatticeEvalBatchReport> {\n const ctx = this.runs.get(runId);\n if (!ctx) throw new Error(\"Run not found or no longer in memory\");\n const { report } = await ctx.promise;\n return report;\n }\n\n isRunning(runId: string): boolean {\n return this.runs.has(runId);\n }\n\n private getEvalStore(): EvalStore {\n return getStoreLattice(\"default\", \"eval\").store as EvalStore;\n }\n}\n\nexport const evalRunner = new EvalRunner();\n","import { FastifyInstance, FastifyRequest, FastifyReply } from \"fastify\";\nimport { getStoreLattice } from \"@axiom-lattice/core\";\nimport type {\n CreateUserRequest,\n UpdateUserRequest,\n} from \"@axiom-lattice/protocols\";\nimport { v4 as uuidv4 } from \"uuid\";\n\ninterface UserParams {\n userId: string;\n}\n\ninterface ListUsersQuery {\n email?: string;\n}\n\nexport class UsersController {\n private userStore;\n\n constructor() {\n this.userStore = getStoreLattice(\"default\", \"user\").store;\n }\n\n async listUsers(\n request: FastifyRequest<{ Querystring: ListUsersQuery }>,\n reply: FastifyReply\n ) {\n const { email } = request.query;\n\n if (email) {\n const user = await this.userStore.getUserByEmail(email);\n return { success: true, data: user ? [user] : [] };\n }\n\n const users = await this.userStore.getAllUsers();\n return { success: true, data: users };\n }\n\n async createUser(\n request: FastifyRequest<{ Body: CreateUserRequest }>,\n reply: FastifyReply\n ) {\n const data = request.body;\n const id = uuidv4();\n\n const existingUser = await this.userStore.getUserByEmail(data.email);\n if (existingUser) {\n return reply.status(409).send({\n success: false,\n error: `User with email ${data.email} already exists`,\n });\n }\n\n const user = await this.userStore.createUser(id, data);\n return reply.status(201).send({ success: true, data: user });\n }\n\n async getUser(\n request: FastifyRequest<{ Params: UserParams }>,\n reply: FastifyReply\n ) {\n const { userId } = request.params;\n\n const user = await this.userStore.getUserById(userId);\n\n if (!user) {\n return reply.status(404).send({\n success: false,\n error: \"User not found\",\n });\n }\n\n return { success: true, data: user };\n }\n\n async updateUser(\n request: FastifyRequest<{\n Params: UserParams;\n Body: UpdateUserRequest;\n }>,\n reply: FastifyReply\n ) {\n const { userId } = request.params;\n const updates = request.body;\n\n if (updates.email) {\n const existingUser = await this.userStore.getUserByEmail(updates.email);\n if (existingUser && existingUser.id !== userId) {\n return reply.status(409).send({\n success: false,\n error: `User with email ${updates.email} already exists`,\n });\n }\n }\n\n const user = await this.userStore.updateUser(userId, updates);\n\n if (!user) {\n return reply.status(404).send({\n success: false,\n error: \"User not found\",\n });\n }\n\n return { success: true, data: user };\n }\n\n async deleteUser(\n request: FastifyRequest<{ Params: UserParams }>,\n reply: FastifyReply\n ) {\n const { userId } = request.params;\n\n const deleted = await this.userStore.deleteUser(userId);\n\n if (!deleted) {\n return reply.status(404).send({\n success: false,\n error: \"User not found\",\n });\n }\n\n return { success: true };\n }\n}\n\nexport function registerUserRoutes(app: FastifyInstance) {\n const controller = new UsersController();\n\n app.get(\"/api/users\", controller.listUsers.bind(controller));\n app.post(\"/api/users\", controller.createUser.bind(controller));\n app.get(\"/api/users/:userId\", controller.getUser.bind(controller));\n app.patch(\"/api/users/:userId\", controller.updateUser.bind(controller));\n app.delete(\"/api/users/:userId\", controller.deleteUser.bind(controller));\n}\n","/**\n * TenantsController\n *\n * Controller for tenant management\n * Handles CRUD operations for tenants (top-level entities)\n */\n\nimport { FastifyInstance, FastifyRequest, FastifyReply } from \"fastify\";\nimport { getStoreLattice } from \"@axiom-lattice/core\";\nimport type {\n CreateTenantRequest,\n UpdateTenantRequest,\n} from \"@axiom-lattice/protocols\";\nimport { v4 as uuidv4 } from \"uuid\";\n\ninterface TenantParams {\n tenantId: string;\n}\n\nexport class TenantsController {\n private tenantStore;\n\n constructor() {\n this.tenantStore = getStoreLattice(\"default\", \"tenant\").store;\n }\n\n // ==================== Tenant CRUD ====================\n\n async listTenants(request: FastifyRequest, reply: FastifyReply) {\n const tenants = await this.tenantStore.getAllTenants();\n return { success: true, data: tenants };\n }\n\n async createTenant(\n request: FastifyRequest<{ Body: CreateTenantRequest }>,\n reply: FastifyReply\n ) {\n const data = request.body;\n const id = uuidv4();\n\n const tenant = await this.tenantStore.createTenant(id, data);\n return reply.status(201).send({ success: true, data: tenant });\n }\n\n async getTenant(\n request: FastifyRequest<{ Params: TenantParams }>,\n reply: FastifyReply\n ) {\n const { tenantId } = request.params;\n\n const tenant = await this.tenantStore.getTenantById(tenantId);\n\n if (!tenant) {\n return reply.status(404).send({\n success: false,\n error: \"Tenant not found\",\n });\n }\n\n return { success: true, data: tenant };\n }\n\n async updateTenant(\n request: FastifyRequest<{\n Params: TenantParams;\n Body: UpdateTenantRequest;\n }>,\n reply: FastifyReply\n ) {\n const { tenantId } = request.params;\n const updates = request.body;\n\n const tenant = await this.tenantStore.updateTenant(tenantId, updates);\n\n if (!tenant) {\n return reply.status(404).send({\n success: false,\n error: \"Tenant not found\",\n });\n }\n\n return { success: true, data: tenant };\n }\n\n async deleteTenant(\n request: FastifyRequest<{ Params: TenantParams }>,\n reply: FastifyReply\n ) {\n const { tenantId } = request.params;\n\n // Prevent deletion of the default tenant\n if (tenantId === \"default\") {\n return reply.status(403).send({\n success: false,\n error: \"Cannot delete the default tenant\",\n });\n }\n\n const deleted = await this.tenantStore.deleteTenant(tenantId);\n\n if (!deleted) {\n return reply.status(404).send({\n success: false,\n error: \"Tenant not found\",\n });\n }\n\n return { success: true };\n }\n}\n\nexport function registerTenantRoutes(app: FastifyInstance) {\n const controller = new TenantsController();\n\n // Tenant routes\n app.get(\"/api/tenants\", controller.listTenants.bind(controller));\n app.post(\"/api/tenants\", controller.createTenant.bind(controller));\n app.get(\"/api/tenants/:tenantId\", controller.getTenant.bind(controller));\n app.patch(\"/api/tenants/:tenantId\", controller.updateTenant.bind(controller));\n app.delete(\"/api/tenants/:tenantId\", controller.deleteTenant.bind(controller));\n}\n","import { FastifyInstance, FastifyRequest, FastifyReply } from \"fastify\";\nimport { getStoreLattice } from \"@axiom-lattice/core\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { createHmac, randomBytes, timingSafeEqual } from \"node:crypto\";\nimport type { CreateUserRequest, CreateTenantRequest, UserTenantRole } from \"@axiom-lattice/protocols\";\n\ninterface RegisterRequest {\n email: string;\n password: string;\n name: string;\n}\n\ninterface LoginRequest {\n email: string;\n password: string;\n}\n\ninterface SelectTenantRequest {\n tenantId: string;\n}\n\ninterface ApproveUserRequest {\n userId: string;\n approved: boolean;\n}\n\ninterface AssignTenantRequest {\n userId: string;\n tenantId: string;\n role?: UserTenantRole;\n}\n\ninterface ChangePasswordRequest {\n currentPassword: string;\n newPassword: string;\n}\n\nexport interface AuthConfig {\n autoApproveUsers: boolean;\n allowTenantRegistration: boolean;\n jwtSecret?: string;\n tokenExpiration: number;\n}\n\n/** Identity embedded in a signed console session token. */\nexport interface ConsoleSessionPayload {\n userId: string;\n tenantId?: string;\n exp: number;\n}\n\n/** Configuration for the gateway-wide console authentication hook. */\nexport interface ConsoleAuthHookOptions {\n authRequired: boolean;\n tokenSecret?: string;\n}\n\nconst defaultAuthConfig: AuthConfig = {\n autoApproveUsers: true,\n allowTenantRegistration: true,\n tokenExpiration: 86400,\n};\n\nexport class AuthController {\n private userStore;\n private tenantStore;\n private userTenantLinkStore;\n private config: AuthConfig;\n\n constructor(config: Partial<AuthConfig> = {}) {\n this.userStore = getStoreLattice(\"default\", \"user\").store;\n this.tenantStore = getStoreLattice(\"default\", \"tenant\").store;\n this.userTenantLinkStore = getStoreLattice(\"default\", \"userTenantLink\").store;\n this.config = { ...defaultAuthConfig, ...config };\n }\n\n async register(\n request: FastifyRequest<{ Body: RegisterRequest }>,\n reply: FastifyReply\n ) {\n const { email, password, name } = request.body;\n\n try {\n const existingUser = await this.userStore.getUserByEmail(email);\n if (existingUser) {\n return reply.status(409).send({\n success: false,\n error: \"User with this email already exists\",\n });\n }\n\n const userId = uuidv4();\n const userStatus = this.config.autoApproveUsers ? \"active\" : \"pending\";\n \n const userData: CreateUserRequest = {\n email,\n name,\n status: userStatus,\n metadata: {\n passwordHash: await this.hashPassword(password),\n },\n };\n\n const user = await this.userStore.createUser(userId, userData);\n\n return reply.status(201).send({\n success: true,\n message: this.config.autoApproveUsers\n ? \"Registration successful\"\n : \"Registration successful. Please wait for admin approval.\",\n data: {\n user: {\n id: user.id,\n email: user.email,\n name: user.name,\n status: user.status,\n },\n },\n });\n } catch (error) {\n console.error(\"Registration error:\", error);\n return reply.status(500).send({\n success: false,\n error: \"Registration failed\",\n });\n }\n }\n\n async login(\n request: FastifyRequest<{ Body: LoginRequest }>,\n reply: FastifyReply\n ) {\n const { email, password } = request.body;\n\n try {\n const user = await this.userStore.getUserByEmail(email);\n if (!user) {\n return reply.status(401).send({\n success: false,\n error: \"Invalid credentials\",\n });\n }\n\n if (user.status !== \"active\") {\n return reply.status(403).send({\n success: false,\n error: `Account is ${user.status}. Please wait for admin approval.`,\n });\n }\n\n const isValidPassword = await this.verifyPassword(\n password,\n user.metadata?.passwordHash || \"\"\n );\n\n if (!isValidPassword) {\n return reply.status(401).send({\n success: false,\n error: \"Invalid credentials\",\n });\n }\n\n const tenantLinks = await this.userTenantLinkStore.getTenantsByUser(user.id);\n \n // Scope the token to the tenant when the user has exactly one, so\n // tenant-scoped endpoints (e.g. A2A key management) can authorize without\n // a separate select-tenant round trip. Multi-tenant users still receive a\n // user-only token and must select a tenant.\n const singleTenantId =\n tenantLinks.length === 1 ? tenantLinks[0].tenantId : undefined;\n const token = await this.generateToken(user.id, singleTenantId);\n\n return {\n success: true,\n data: {\n user: {\n id: user.id,\n email: user.email,\n name: user.name,\n status: user.status,\n },\n tenants: tenantLinks.map(link => ({\n id: link.tenantId,\n role: link.role,\n })),\n token,\n requiresTenantSelection: tenantLinks.length > 1,\n hasTenants: tenantLinks.length > 0,\n },\n };\n } catch (error) {\n console.error(\"Login error:\", error);\n return reply.status(500).send({\n success: false,\n error: \"Login failed\",\n });\n }\n }\n\n async getUserTenants(\n request: FastifyRequest,\n reply: FastifyReply\n ) {\n const userId = (request as any).user?.id;\n \n if (!userId) {\n return reply.status(401).send({\n success: false,\n error: \"Unauthorized\",\n });\n }\n\n try {\n const links = await this.userTenantLinkStore.getTenantsByUser(userId);\n \n const tenantsWithDetails = await Promise.all(\n links.map(async (link) => {\n const tenant = await this.tenantStore.getTenantById(link.tenantId);\n return {\n ...link,\n tenant: tenant || null,\n };\n })\n );\n\n return {\n success: true,\n data: tenantsWithDetails,\n };\n } catch (error) {\n console.error(\"Get user tenants error:\", error);\n return reply.status(500).send({\n success: false,\n error: \"Failed to get user tenants\",\n });\n }\n }\n\n async selectTenant(\n request: FastifyRequest<{ Body: SelectTenantRequest }>,\n reply: FastifyReply\n ) {\n const userId = (request as any).user?.id;\n const { tenantId } = request.body;\n\n if (!userId) {\n return reply.status(401).send({\n success: false,\n error: \"Unauthorized\",\n });\n }\n\n try {\n const hasLink = await this.userTenantLinkStore.hasLink(userId, tenantId);\n \n if (!hasLink) {\n return reply.status(403).send({\n success: false,\n error: \"You do not have access to this tenant\",\n });\n }\n\n const tenant = await this.tenantStore.getTenantById(tenantId);\n \n if (!tenant) {\n return reply.status(404).send({\n success: false,\n error: \"Tenant not found\",\n });\n }\n\n const token = await this.generateToken(userId, tenantId);\n\n // Check for personal assistant in this tenant\n const link = await this.userTenantLinkStore.getLink(userId, tenantId);\n const linkMeta = (link?.metadata || {}) as Record<string, unknown>;\n\n let personalAssistant = null;\n if (linkMeta.personalAssistantId) {\n const assistantStore = getStoreLattice(\"default\", \"assistant\").store;\n const exists = await assistantStore.hasAssistant(tenantId, linkMeta.personalAssistantId as string);\n if (exists) {\n personalAssistant = {\n assistantId: linkMeta.personalAssistantId as string,\n projectId: linkMeta.personalProjectId as string || \"default\",\n workspaceId: linkMeta.personalWorkspaceId as string || \"default\",\n };\n }\n }\n\n return {\n success: true,\n data: {\n tenant,\n token,\n personalAssistant,\n },\n };\n } catch (error) {\n console.error(\"Select tenant error:\", error);\n return reply.status(500).send({\n success: false,\n error: \"Failed to select tenant\",\n });\n }\n }\n\n async approveUser(\n request: FastifyRequest<{ Body: ApproveUserRequest }>,\n reply: FastifyReply\n ) {\n const { userId, approved } = request.body;\n\n try {\n const user = await this.userStore.getUserById(userId);\n if (!user) {\n return reply.status(404).send({\n success: false,\n error: \"User not found\",\n });\n }\n\n if (user.status !== \"pending\") {\n return reply.status(400).send({\n success: false,\n error: `User is already ${user.status}`,\n });\n }\n\n const updatedUser = await this.userStore.updateUser(userId, {\n status: approved ? \"active\" : \"suspended\",\n });\n\n return {\n success: true,\n data: updatedUser,\n };\n } catch (error) {\n console.error(\"Approval error:\", error);\n return reply.status(500).send({\n success: false,\n error: \"Approval failed\",\n });\n }\n }\n\n async listPendingUsers(\n request: FastifyRequest,\n reply: FastifyReply\n ) {\n try {\n const users = await this.userStore.getAllUsers();\n const pendingUsers = users.filter((u) => u.status === \"pending\");\n\n return {\n success: true,\n data: pendingUsers,\n };\n } catch (error) {\n console.error(\"List pending users error:\", error);\n return reply.status(500).send({\n success: false,\n error: \"Failed to list pending users\",\n });\n }\n }\n\n async assignTenant(\n request: FastifyRequest<{ Body: AssignTenantRequest }>,\n reply: FastifyReply\n ) {\n const { userId, tenantId, role = \"member\" } = request.body;\n\n try {\n const user = await this.userStore.getUserById(userId);\n if (!user) {\n return reply.status(404).send({\n success: false,\n error: \"User not found\",\n });\n }\n\n const tenant = await this.tenantStore.getTenantById(tenantId);\n if (!tenant) {\n return reply.status(404).send({\n success: false,\n error: \"Tenant not found\",\n });\n }\n\n const link = await this.userTenantLinkStore.createLink({\n userId,\n tenantId,\n role,\n });\n\n return {\n success: true,\n data: link,\n };\n } catch (error) {\n console.error(\"Assign tenant error:\", error);\n return reply.status(500).send({\n success: false,\n error: \"Failed to assign tenant\",\n });\n }\n }\n\n private async hashPassword(password: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(password + \"salt\");\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n }\n\n private async verifyPassword(password: string, hash: string): Promise<boolean> {\n const hashedPassword = await this.hashPassword(password);\n return hashedPassword === hash;\n }\n\n private async generateToken(userId: string, tenantId?: string): Promise<string> {\n if (!this.config.jwtSecret) {\n throw new Error(\"AUTH_TOKEN_SECRET is required to issue console sessions\");\n }\n const payload: ConsoleSessionPayload = {\n userId,\n exp: Date.now() + this.config.tokenExpiration * 1000,\n };\n if (tenantId) {\n payload.tenantId = tenantId;\n }\n return createConsoleSessionToken(payload, this.config.jwtSecret);\n }\n\n async changePassword(\n request: FastifyRequest<{ Body: ChangePasswordRequest }>,\n reply: FastifyReply\n ) {\n const userId = (request as any).user?.id;\n const { currentPassword, newPassword } = request.body;\n\n if (!userId) {\n return reply.status(401).send({\n success: false,\n error: \"Unauthorized\",\n });\n }\n\n try {\n const user = await this.userStore.getUserById(userId);\n if (!user) {\n return reply.status(404).send({\n success: false,\n error: \"User not found\",\n });\n }\n\n // Verify current password\n const isValidPassword = await this.verifyPassword(\n currentPassword,\n user.metadata?.passwordHash || \"\"\n );\n\n if (!isValidPassword) {\n return reply.status(401).send({\n success: false,\n error: \"Current password is incorrect\",\n });\n }\n\n // Validate new password length\n if (newPassword.length < 6) {\n return reply.status(400).send({\n success: false,\n error: \"New password must be at least 6 characters\",\n });\n }\n\n // Update password\n await this.userStore.updateUser(userId, {\n metadata: {\n ...user.metadata,\n passwordHash: await this.hashPassword(newPassword),\n },\n });\n\n return reply.send({\n success: true,\n message: \"Password changed successfully\",\n });\n } catch (error) {\n console.error(\"Change password error:\", error);\n return reply.status(500).send({\n success: false,\n error: \"Failed to change password\",\n });\n }\n }\n}\n\n/**\n * Resolve the console session signing secret.\n *\n * Preference order:\n * 1. `AUTH_TOKEN_SECRET`\n * 2. `JWT_SECRET` (legacy alias, kept so pre-existing configurations keep working)\n * 3. an in-process random fallback so console login always works out of the box\n * (tokens stay unforgeable since the fallback is never a known constant)\n *\n * @remarks\n * - The in-process fallback is regenerated on every restart, so sessions issued\n * before a restart are invalidated. This is acceptable for local/dev/example\n * deployments but NOT for production or multi-replica gateways: set a stable\n * `AUTH_TOKEN_SECRET` (or legacy `JWT_SECRET`) there, otherwise tokens signed\n * by one replica will not verify on another and restarts sign out every user.\n *\n * @param authRequired - retained for API stability; behavior is identical for\n * both modes because login must always be possible\n * @returns the secret to use (never undefined)\n */\nexport function resolveConsoleTokenSecret(_authRequired?: boolean): string {\n const configured = process.env.AUTH_TOKEN_SECRET || process.env.JWT_SECRET;\n if (configured) return configured;\n devSessionSecret ??= randomBytes(32).toString(\"hex\");\n console.warn(\n \"[auth] AUTH_TOKEN_SECRET/JWT_SECRET is not set; using an in-process generated signing secret \" +\n \"(sessions are invalidated on restart). Set AUTH_TOKEN_SECRET for production.\",\n );\n return devSessionSecret;\n}\n\nlet devSessionSecret: string | undefined;\n\n/** Create an HMAC-SHA256 signed console session token. */\nexport function createConsoleSessionToken(\n payload: ConsoleSessionPayload,\n secret: string,\n): string {\n const encodedPayload = Buffer.from(JSON.stringify(payload)).toString(\"base64url\");\n const signature = createHmac(\"sha256\", secret)\n .update(encodedPayload)\n .digest(\"base64url\");\n return `${encodedPayload}.${signature}`;\n}\n\nfunction isConsoleSessionPayload(value: unknown): value is ConsoleSessionPayload {\n if (typeof value !== \"object\" || value === null) return false;\n const payload = value as Record<string, unknown>;\n return (\n typeof payload.userId === \"string\" &&\n payload.userId.length > 0 &&\n typeof payload.exp === \"number\" &&\n (payload.tenantId === undefined || typeof payload.tenantId === \"string\")\n );\n}\n\n/** Verify a signed Bearer console session and return its request identity. */\nexport function extractUserFromAuthHeader(\n authHeader: string | undefined,\n secret?: string,\n): { id: string; tenantId?: string } | undefined {\n if (!secret || !authHeader?.startsWith(\"Bearer \")) return undefined;\n const token = authHeader.substring(7);\n const parts = token.split(\".\");\n if (parts.length !== 2) return undefined;\n const [encodedPayload, encodedSignature] = parts;\n if (!/^[A-Za-z0-9_-]{43}$/.test(encodedSignature)) return undefined;\n try {\n const actualSignature = Buffer.from(encodedSignature, \"base64url\");\n if (actualSignature.toString(\"base64url\") !== encodedSignature) return undefined;\n const expectedSignature = createHmac(\"sha256\", secret)\n .update(encodedPayload)\n .digest();\n if (\n actualSignature.length !== expectedSignature.length ||\n !timingSafeEqual(actualSignature, expectedSignature)\n ) {\n return undefined;\n }\n const payload: unknown = JSON.parse(\n Buffer.from(encodedPayload, \"base64url\").toString(\"utf8\"),\n );\n if (!isConsoleSessionPayload(payload) || payload.exp < Date.now()) {\n return undefined;\n }\n return {\n id: payload.userId,\n tenantId: payload.tenantId,\n };\n } catch {\n return undefined;\n }\n}\n\nconst PUBLIC_ROUTES = [\"/api/auth/login\", \"/api/auth/register\", \"/health\", \"/api/stt/models\"];\n\nfunction bypassesConsoleAuth(request: FastifyRequest): boolean {\n const path = request.url.split(\"?\")[0];\n if (\n request.method === \"GET\" &&\n /^\\/api\\/a2a\\/agents\\/[^/]+\\/\\.well-known\\/agent-card\\.json$/.test(path)\n ) {\n return true;\n }\n return (\n request.method === \"POST\" &&\n /^\\/api\\/a2a\\/agents\\/[^/]+\\/jsonrpc$/.test(path)\n );\n}\n\n/** Register console session extraction and required-auth enforcement. */\nexport function registerConsoleAuthHook(\n app: FastifyInstance,\n options: ConsoleAuthHookOptions,\n): void {\n app.addHook(\"preHandler\", async (request, reply) => {\n if (bypassesConsoleAuth(request)) return;\n\n // Resolve the secret lazily per request. The gateway module may be imported\n // before application code loads its environment (e.g. dotenv/loadLocalEnv),\n // so resolving at registration time would freeze an in-process random secret\n // and break tokens issued later by login with the configured secret.\n const secret = options.tokenSecret ?? resolveConsoleTokenSecret(options.authRequired);\n const user = extractUserFromAuthHeader(request.headers.authorization, secret);\n if (user) {\n (request as unknown as { user?: typeof user }).user = user;\n return;\n }\n\n if (!options.authRequired || request.method === \"OPTIONS\") return;\n if (PUBLIC_ROUTES.some((route) => request.url === route)) return;\n if (request.url.startsWith(\"/s/\")) return;\n\n const path = request.url.split(\"?\")[0];\n if (\n path.includes(\"/viewfile\") ||\n path.includes(\"/downloadfile\") ||\n path.includes(\"/uploadfile\") ||\n path.startsWith(\"/f/\") ||\n path === \"/f\"\n ) {\n return;\n }\n\n await reply.status(401).send({\n success: false,\n error: \"Unauthorized - Missing or invalid token\",\n });\n });\n}\n\nexport function registerAuthRoutes(\n app: FastifyInstance,\n config?: Partial<AuthConfig>\n) {\n const controller = new AuthController(config);\n\n const authHook = async (request: FastifyRequest, reply: FastifyReply) => {\n const user = extractUserFromAuthHeader(\n request.headers.authorization,\n config?.jwtSecret,\n );\n if (!user) {\n return reply.status(401).send({\n success: false,\n error: \"Unauthorized\",\n });\n }\n (request as any).user = user;\n };\n\n app.post(\"/api/auth/register\", controller.register.bind(controller));\n app.post(\"/api/auth/login\", controller.login.bind(controller));\n app.get(\"/api/auth/tenants\", { preHandler: authHook }, (req, res) => controller.getUserTenants(req, res));\n app.post(\"/api/auth/select-tenant\", { preHandler: authHook }, (req, res) => controller.selectTenant(req as any, res));\n app.post(\"/api/auth/approve\", { preHandler: authHook }, (req, res) => controller.approveUser(req as any, res));\n app.get(\"/api/auth/pending\", { preHandler: authHook }, (req, res) => controller.listPendingUsers(req, res));\n app.post(\"/api/auth/assign-tenant\", { preHandler: authHook }, (req, res) => controller.assignTenant(req as any, res));\n app.post(\"/api/auth/change-password\", { preHandler: authHook }, \n (req, res) => controller.changePassword(req as any, res)\n );\n}\n","import { z } from \"zod\";\nimport type {\n ChannelAdapter,\n InboundMessage,\n OutboundMessage,\n ReplyTarget,\n ChannelInstallation,\n} from \"@axiom-lattice/protocols\";\nimport type { LarkChannelInstallationConfig } from \"@axiom-lattice/protocols\";\nimport { parseLarkMessageEvent } from \"./parser\";\nimport { Logger } from \"../../logger/Logger\";\nimport * as Lark from \"@larksuiteoapi/node-sdk\";\n\nconst logger = new Logger({ serviceName: \"lattice/gateway/lark\" });\n\n// ─── WS connection state ──────────────────────────────────────────────────\n\nconst activeConnections = new Map<string, Lark.WSClient>();\n\n// ─── WS message parsing (shared with lark-ws) ─────────────────────────────\n\ninterface LarkWSMessageEvent {\n sender?: { sender_id?: { open_id?: string } };\n message?: {\n message_id?: string;\n chat_id?: string;\n chat_type?: string;\n message_type?: string;\n content?: string;\n };\n}\n\nfunction parseTextContent(content: string | undefined): string | null {\n if (!content) return null;\n try {\n const parsed = JSON.parse(content) as { text?: string };\n return typeof parsed.text === \"string\" ? parsed.text : null;\n } catch { return null; }\n}\n\nfunction normalizeChatType(chatType: string | undefined): \"direct\" | \"group\" {\n return chatType === \"p2p\" ? \"direct\" : \"group\";\n}\n\nfunction wsEventToInbound(\n event: LarkWSMessageEvent,\n installationId: string,\n tenantId: string,\n): InboundMessage | null {\n const messageId = event.message?.message_id;\n const chatId = event.message?.chat_id;\n const openId = event.sender?.sender_id?.open_id;\n if (!messageId || !chatId || !openId) return null;\n if (event.message?.message_type !== \"text\") return null;\n\n const text = parseTextContent(event.message.content);\n if (!text) return null;\n\n const chatType = normalizeChatType(event.message.chat_type);\n return {\n channel: \"lark\",\n channelInstallationId: installationId,\n tenantId,\n sender: { id: openId, displayName: undefined },\n content: { text, metadata: { chatId, chatType, messageId } },\n conversation: { id: chatId, type: chatType },\n replyTarget: {\n adapterChannel: \"lark\",\n channelInstallationId: installationId,\n rawTarget: { chatId, messageId, chatType },\n },\n };\n}\n\n// ─── Adapter ──────────────────────────────────────────────────────────────\n\nexport const larkConfigSchema = z.object({\n appId: z.string(),\n appSecret: z.string(),\n verificationToken: z.string().optional(),\n encryptKey: z.string().optional(),\n});\n\nexport const larkChannelAdapter: ChannelAdapter<LarkChannelInstallationConfig> = {\n channel: \"lark\",\n\n configSchema: larkConfigSchema,\n\n async receive(\n rawPayload: unknown,\n installation: ChannelInstallation<LarkChannelInstallationConfig>,\n ): Promise<InboundMessage | null> {\n const event = parseLarkMessageEvent(rawPayload);\n if (!event) return null;\n\n return {\n channel: \"lark\",\n channelInstallationId: installation.id,\n tenantId: installation.tenantId,\n sender: { id: event.openId, displayName: undefined },\n content: {\n text: event.text,\n metadata: { chatId: event.chatId, chatType: event.chatType, messageId: event.messageId },\n },\n conversation: { id: event.chatId, type: event.chatType },\n replyTarget: {\n adapterChannel: \"lark\",\n channelInstallationId: installation.id,\n rawTarget: { chatId: event.chatId, messageId: event.messageId, chatType: event.chatType },\n },\n };\n },\n\n async sendReply(\n replyTarget: ReplyTarget,\n message: OutboundMessage,\n installation: ChannelInstallation<LarkChannelInstallationConfig>,\n ): Promise<void> {\n const { createLarkSender } = await import(\"./sender\");\n const sender = await createLarkSender(installation.config);\n await sender.sendTextReply({\n chatId: replyTarget.rawTarget.chatId as string,\n text: message.text,\n });\n },\n\n resolveThreadId(message: InboundMessage, binding: unknown): string {\n const date = new Date().toISOString().split(\"T\")[0];\n const chatType = message.conversation?.type === \"direct\" ? \"dm\" : \"group\";\n const agentId = (binding as { agentId: string }).agentId;\n if (chatType === \"dm\") {\n return `lark:dm:${message.sender.id}:${agentId}:${date}`;\n }\n return `lark:group:${message.conversation?.id ?? \"unknown\"}:${agentId}:${date}`;\n },\n\n async connect(\n installation: ChannelInstallation<LarkChannelInstallationConfig>,\n deps?: unknown,\n ): Promise<void> {\n const { id: installationId, tenantId, config } = installation;\n\n if (!config.appId || !config.appSecret) {\n logger.warn(\"Lark installation missing credentials, skipping\", { installationId });\n return;\n }\n\n if (activeConnections.has(installationId)) {\n logger.warn(\"Lark WS already connected for installation, skipping\", { installationId });\n return;\n }\n\n logger.info(\"Lark WS client starting\", { installationId, tenantId });\n\n const router = (deps as { router?: { dispatch(msg: InboundMessage): Promise<unknown> } })?.router;\n\n const eventDispatcher = new Lark.EventDispatcher({}).register({\n \"im.message.receive_v1\": async (data: LarkWSMessageEvent) => {\n try {\n const inbound = wsEventToInbound(data, installationId, tenantId);\n if (!inbound) return;\n\n logger.info(\"Lark WS message received\", {\n installationId,\n senderId: inbound.sender.id,\n chatId: data.message?.chat_id,\n });\n\n if (router) {\n const result = await router.dispatch(inbound);\n if (!(result as { success?: boolean }).success) {\n logger.warn(\"Lark WS dispatch failed\", {\n installationId,\n error: (result as { error?: { message?: string } }).error?.message,\n });\n }\n }\n } catch (err) {\n logger.error(\"Lark WS event handler error\", {\n installationId,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n },\n });\n\n const client = new Lark.WSClient({\n appId: config.appId,\n appSecret: config.appSecret,\n loggerLevel: Lark.LoggerLevel.info,\n });\n\n await client.start({ eventDispatcher });\n activeConnections.set(installationId, client);\n logger.info(\"Lark WS client connected\", { installationId });\n },\n\n async disconnect(installationId: string): Promise<void> {\n const client = activeConnections.get(installationId);\n if (!client) {\n logger.warn(\"Lark WS not connected, nothing to disconnect\", { installationId });\n return;\n }\n\n logger.info(\"Lark WS client disconnecting\", { installationId });\n try {\n client.close({ force: true });\n } catch (err) {\n logger.error(\"Lark WS client stop error\", {\n installationId,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n activeConnections.delete(installationId);\n logger.info(\"Lark WS client disconnected\", { installationId });\n },\n};\n","import type { ParsedLarkMessageEvent } from \"./types\";\n\ninterface RawLarkPayload {\n header?: {\n event_type?: string;\n };\n event?: {\n sender?: {\n sender_id?: {\n open_id?: string;\n };\n };\n message?: {\n message_id?: string;\n chat_id?: string;\n chat_type?: string;\n message_type?: string;\n content?: string;\n };\n };\n}\n\nexport function parseLarkMessageEvent(\n payload: unknown,\n): ParsedLarkMessageEvent | null {\n const raw = payload as RawLarkPayload;\n\n if (raw.header?.event_type !== \"im.message.receive_v1\") {\n return null;\n }\n\n const message = raw.event?.message;\n const openId = raw.event?.sender?.sender_id?.open_id;\n\n if (!message || !openId || message.message_type !== \"text\") {\n return null;\n }\n\n const parsedContent = parseLarkTextContent(message.content);\n if (!message.message_id || !message.chat_id || !parsedContent) {\n return null;\n }\n\n return {\n messageId: message.message_id,\n openId,\n chatId: message.chat_id,\n chatType: normalizeChatType(message.chat_type),\n text: parsedContent,\n };\n}\n\nfunction parseLarkTextContent(content: string | undefined): string | null {\n if (!content) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(content) as { text?: string };\n return typeof parsed.text === \"string\" ? parsed.text : null;\n } catch {\n return null;\n }\n}\n\nfunction normalizeChatType(chatType: string | undefined): \"direct\" | \"group\" {\n return chatType === \"p2p\" ? \"direct\" : \"group\";\n}\n","import crypto from \"crypto\";\nimport type { LarkUrlVerificationPayload } from \"./types\";\n\nexport function parseLarkRequestBody(\n body: unknown,\n encryptKey?: string,\n): LarkUrlVerificationPayload {\n const parsed = (body || {}) as LarkUrlVerificationPayload;\n\n if (encryptKey && typeof parsed.encrypt === \"string\") {\n return decryptLarkPayload(encryptKey, parsed.encrypt);\n }\n\n return parsed;\n}\n\nexport function decryptLarkPayload(\n encryptKey: string,\n encryptedPayload: string,\n): LarkUrlVerificationPayload {\n const key = crypto.createHash(\"sha256\").update(encryptKey).digest();\n const buffer = Buffer.from(encryptedPayload, \"base64\");\n const iv = buffer.subarray(0, 16);\n const ciphertext = buffer.subarray(16);\n const decipher = crypto.createDecipheriv(\"aes-256-cbc\", key, iv);\n const plaintext = Buffer.concat([\n decipher.update(ciphertext),\n decipher.final(),\n ]).toString(\"utf8\");\n\n return JSON.parse(plaintext) as LarkUrlVerificationPayload;\n}\n","import type { FastifyReply, FastifyRequest } from \"fastify\";\nimport type { ChannelInstallation, ChannelInstallationStore, LarkChannelInstallationConfig } from \"@axiom-lattice/protocols\";\nimport { larkChannelAdapter } from \"./LarkChannelAdapter\";\nimport type { MessageRouter } from \"../../router/MessageRouter\";\nimport { parseLarkRequestBody } from \"./verification\";\nimport { Logger } from \"../../logger/Logger\";\n\nconst logger = new Logger({ serviceName: \"lattice/gateway/lark\" });\n\nexport function createLarkEventHandler(deps: {\n installationStore: ChannelInstallationStore;\n router: MessageRouter;\n}) {\n return async function handleLarkEvent(\n request: FastifyRequest,\n reply: FastifyReply,\n ): Promise<void> {\n const { installationId } = request.params as { installationId: string };\n\n const installation = await deps.installationStore.getInstallationById(installationId);\n if (!installation || installation.channel !== \"lark\") {\n reply.status(404).send({ success: false, message: \"Installation not found\" });\n return;\n }\n\n const larkInstallation = installation as ChannelInstallation<LarkChannelInstallationConfig>;\n const body = parseLarkRequestBody(request.body, larkInstallation.config.encryptKey);\n\n if (body.type === \"url_verification\" && body.challenge) {\n reply.status(200).send({ challenge: body.challenge });\n return;\n }\n\n const inboundMessage = await larkChannelAdapter.receive(request.body, larkInstallation);\n if (!inboundMessage) {\n reply.status(200).send();\n return;\n }\n\n deps.router.dispatch(inboundMessage).catch((error) => {\n logger.error(\"Lark message dispatch error\", {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n\n reply.status(200).send();\n };\n}\n","import type { FastifyInstance } from \"fastify\";\nimport { createLarkEventHandler } from \"./controller\";\nimport type { MessageRouter } from \"../../router/MessageRouter\";\nimport type { ChannelInstallationStore } from \"@axiom-lattice/protocols\";\n\nexport function registerLarkChannelRoutes(\n app: FastifyInstance,\n deps: {\n installationStore: ChannelInstallationStore;\n router: MessageRouter;\n },\n): void {\n const handler = createLarkEventHandler({\n installationStore: deps.installationStore,\n router: deps.router,\n });\n\n app.post(\n \"/api/channels/lark/installations/:installationId/events\",\n handler,\n );\n}\n","import type { FastifyReply, FastifyRequest } from \"fastify\";\nimport { getQrCode, getQrCodeStatus } from \"./wechat-client\";\nimport type { QrSession } from \"./types\";\n\nconst qrSessions = new Map<string, QrSession>();\nconst SESSION_TTL_MS = 5 * 60 * 1000; // 5 minutes\n\nfunction cleanupExpiredSessions(): void {\n const now = Date.now();\n for (const [key, session] of qrSessions) {\n if (now - session.createdAt > SESSION_TTL_MS) {\n qrSessions.delete(key);\n }\n }\n}\n\nexport async function handleGetQrCode(\n _request: FastifyRequest,\n reply: FastifyReply,\n): Promise<void> {\n try {\n cleanupExpiredSessions();\n const { qrcode, qrcodeImgUrl } = await getQrCode();\n qrSessions.set(qrcode, { qrcode, createdAt: Date.now() });\n reply.send({ success: true, data: { qrcode, qrcodeImgUrl } });\n } catch (err) {\n reply.status(500).send({\n success: false,\n message: err instanceof Error ? err.message : \"Failed to get QR code\",\n });\n }\n}\n\nexport async function handleGetQrCodeStatus(\n request: FastifyRequest,\n reply: FastifyReply,\n): Promise<void> {\n const { qrcode } = request.query as { qrcode?: string };\n if (!qrcode) {\n reply.status(400).send({ success: false, message: \"qrcode is required\" });\n return;\n }\n\n const session = qrSessions.get(qrcode);\n if (!session) {\n reply.status(404).send({ success: false, message: \"Session not found or expired\" });\n return;\n }\n\n try {\n const result = await getQrCodeStatus(qrcode);\n reply.send({ success: true, data: result });\n } catch (err) {\n reply.status(500).send({\n success: false,\n message: err instanceof Error ? err.message : \"Failed to check QR status\",\n });\n }\n}\n","import type { FastifyInstance } from \"fastify\";\nimport { handleGetQrCode, handleGetQrCodeStatus } from \"./controller\";\n\nexport function registerWechatChannelRoutes(app: FastifyInstance): void {\n app.get(\"/api/channels/wechat/setup/qrcode\", handleGetQrCode);\n app.get(\"/api/channels/wechat/setup/status\", handleGetQrCodeStatus);\n}\n","import type { FastifyInstance } from \"fastify\";\nimport { registerLarkChannelRoutes } from \"./lark/routes\";\nimport { registerWechatChannelRoutes } from \"./wechat/routes\";\nimport type { MessageRouter } from \"../router/MessageRouter\";\nimport type { ChannelInstallationStore } from \"@axiom-lattice/protocols\";\n\ninterface ChannelRouteDependencies {\n router: MessageRouter;\n installationStore: ChannelInstallationStore;\n}\n\ntype ChannelRouteRegistrar = (\n app: FastifyInstance,\n dependencies: ChannelRouteDependencies,\n) => void;\n\nconst channelRouteRegistrars: ChannelRouteRegistrar[] = [\n (app, deps) => registerLarkChannelRoutes(app, deps),\n (app, _deps) => registerWechatChannelRoutes(app),\n];\n\nexport function registerChannelRoutes(\n app: FastifyInstance,\n dependencies?: ChannelRouteDependencies,\n): void {\n if (!dependencies) return;\n for (const registerRoutes of channelRouteRegistrars) {\n registerRoutes(app, dependencies);\n }\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { randomUUID } from \"crypto\";\nimport {\n ChannelInstallationStore,\n ChannelInstallation,\n CreateChannelInstallationRequest,\n UpdateChannelInstallationRequest,\n ChannelInstallationType,\n} from \"@axiom-lattice/protocols\";\nimport type { ChannelAdapterRegistry } from \"../channels/registry\";\n\n/**\n * Controller-scoped deps for channel lifecycle management.\n * Set by the gateway during route registration so that\n * enable/disable/deletion can start/stop live connections.\n */\nlet _adapterRegistry: ChannelAdapterRegistry | undefined;\nlet _router: { dispatch(msg: unknown): Promise<unknown> } | undefined;\n\nexport function setChannelControllerDeps(deps: {\n adapterRegistry: ChannelAdapterRegistry;\n router: { dispatch(msg: unknown): Promise<unknown> };\n}): void {\n _adapterRegistry = deps.adapterRegistry;\n _router = deps.router;\n}\n\n/**\n * Channel Installation Controller\n * Handles channel installation CRUD operations for Lark/Feishu and future channels\n * All operations are scoped to a tenant ID\n */\n\n/**\n * Get tenant ID from authenticated user context\n * Falls back to request headers for backward compatibility\n */\nfunction getTenantId(request: FastifyRequest): string {\n // First try to get from authenticated user context\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) {\n return userTenantId;\n }\n\n // Fallback to request headers for backward compatibility\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\n/**\n * Channel installation list response\n */\ninterface ChannelInstallationListResponse {\n success: boolean;\n message: string;\n data: {\n records: ChannelInstallation[];\n total: number;\n };\n}\n\n/**\n * Channel installation response\n */\ninterface ChannelInstallationResponse {\n success: boolean;\n message: string;\n data?: ChannelInstallation;\n}\n\nfunction snapshotPlainObject(value: unknown): Record<string, unknown> | null {\n try {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return null;\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) return null;\n\n const snapshot: Record<string, unknown> = {};\n for (const [key, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(value))) {\n if (!descriptor.enumerable) continue;\n if (!(\"value\" in descriptor)) return null;\n snapshot[key] = descriptor.value;\n }\n return snapshot;\n } catch {\n return null;\n }\n}\n\n/**\n * Get channel installation store\n */\nasync function getInstallationStore(): Promise<ChannelInstallationStore> {\n // Use registered store from StoreLatticeManager (supports both PG and in-memory)\n const { getStoreLattice } = await import(\"@axiom-lattice/core\");\n const store = getStoreLattice(\"default\", \"channelInstallation\").store as ChannelInstallationStore | undefined;\n if (store) return store;\n\n // Fallback: create PG store directly (legacy path)\n const { PostgreSQLChannelInstallationStore } = await import(\"@axiom-lattice/pg-stores\");\n const databaseUrl = process.env.DATABASE_URL;\n if (!databaseUrl) {\n throw new Error(\"DATABASE_URL is required for channel installation store\");\n }\n return new PostgreSQLChannelInstallationStore({\n poolConfig: databaseUrl,\n });\n}\n\n/**\n * Get all channel installations for a tenant\n */\nexport async function getChannelInstallationList(\n request: FastifyRequest<{\n Querystring: { channel?: ChannelInstallationType };\n }>,\n reply: FastifyReply,\n): Promise<ChannelInstallationListResponse> {\n const tenantId = getTenantId(request);\n const { channel } = request.query;\n\n try {\n const store = await getInstallationStore();\n const installations = await store.getInstallationsByTenant(tenantId, channel);\n\n return {\n success: true,\n message: \"Channel installations retrieved successfully\",\n data: {\n records: installations,\n total: installations.length,\n },\n };\n } catch (error) {\n console.error(\"Failed to get channel installations:\", error);\n return {\n success: false,\n message: \"Failed to retrieve channel installations\",\n data: {\n records: [],\n total: 0,\n },\n };\n }\n}\n\n/**\n * Get a single channel installation by ID\n */\nexport async function getChannelInstallation(\n request: FastifyRequest<{\n Params: { installationId: string };\n }>,\n reply: FastifyReply,\n): Promise<ChannelInstallationResponse> {\n const tenantId = getTenantId(request);\n const { installationId } = request.params;\n\n try {\n const store = await getInstallationStore();\n const installation = await store.getInstallationById(installationId);\n\n if (!installation) {\n reply.code(404);\n return {\n success: false,\n message: \"Channel installation not found\",\n };\n }\n\n // Verify tenant access\n if (installation.tenantId !== tenantId) {\n reply.code(403);\n return {\n success: false,\n message: \"Access denied\",\n };\n }\n\n return {\n success: true,\n message: \"Channel installation retrieved successfully\",\n data: installation,\n };\n } catch (error) {\n console.error(\"Failed to get channel installation:\", error);\n return {\n success: false,\n message: \"Failed to retrieve channel installation\",\n };\n }\n}\n\n/**\n * Create new channel installation\n */\nexport async function createChannelInstallation(\n request: FastifyRequest<{\n Body: CreateChannelInstallationRequest;\n }>,\n reply: FastifyReply,\n): Promise<ChannelInstallationResponse> {\n const tenantId = getTenantId(request);\n const bodySnapshot = snapshotPlainObject(request.body);\n\n try {\n const allowedKeys = new Set([\n \"channel\",\n \"name\",\n \"config\",\n \"enabled\",\n \"fallbackAgentId\",\n \"rejectWhenNoBinding\",\n ]);\n if (!bodySnapshot || Object.keys(bodySnapshot).some((key) => !allowedKeys.has(key))) {\n reply.code(400);\n return {\n success: false,\n message: \"Invalid request body\",\n };\n }\n\n const body = bodySnapshot as unknown as CreateChannelInstallationRequest;\n\n // Validate required fields\n if (!body.channel) {\n reply.code(400);\n return {\n success: false,\n message: \"Channel type is required\",\n };\n }\n\n if (!body.config) {\n reply.code(400);\n return {\n success: false,\n message: \"Configuration is required\",\n };\n }\n\n // Validate Lark-specific config\n if (body.channel === \"lark\") {\n const larkConfig = body.config;\n if (!larkConfig.appId || !larkConfig.appSecret) {\n reply.code(400);\n return {\n success: false,\n message: \"appId and appSecret are required for Lark installations\",\n };\n }\n if (!larkConfig.assistantId) {\n reply.code(400);\n return {\n success: false,\n message: \"assistantId is required for Lark installations\",\n };\n }\n }\n\n const store = await getInstallationStore();\n const installationId = randomUUID();\n \n const installation = await store.createInstallation(\n tenantId,\n installationId,\n body,\n );\n\n // Start live connection for channels that need it (e.g. WeChat polling, Lark WS)\n if (body.enabled !== false && _adapterRegistry) {\n const adapter = _adapterRegistry.get(body.channel);\n if (adapter?.connect) {\n try {\n await adapter.connect(installation, { router: _router });\n } catch (err) {\n console.error(\"Failed to start channel connection after creation:\", err);\n }\n }\n }\n\n reply.code(201);\n return {\n success: true,\n message: \"Channel installation created successfully\",\n data: installation,\n };\n } catch (error: any) {\n console.error(\"Failed to create channel installation:\", error);\n \n // Check for duplicate key error\n const errorMessage = error.message?.toLowerCase();\n if (errorMessage?.includes(\"duplicate\") || errorMessage?.includes(\"unique constraint\") || error.code === \"23505\") {\n reply.code(409);\n return {\n success: false,\n message: \"Channel installation with this ID already exists\",\n };\n }\n\n return {\n success: false,\n message: \"Failed to create channel installation\",\n };\n }\n}\n\n/**\n * Update channel installation\n */\nexport async function updateChannelInstallation(\n request: FastifyRequest<{\n Params: { installationId: string };\n Body: UpdateChannelInstallationRequest;\n }>,\n reply: FastifyReply,\n): Promise<ChannelInstallationResponse> {\n const tenantId = getTenantId(request);\n const { installationId } = request.params;\n const body = request.body;\n\n try {\n const store = await getInstallationStore();\n\n // Verify installation exists and belongs to tenant\n const existing = await store.getInstallationById(installationId);\n if (!existing) {\n reply.code(404);\n return {\n success: false,\n message: \"Channel installation not found\",\n };\n }\n\n if (existing.tenantId !== tenantId) {\n reply.code(403);\n return {\n success: false,\n message: \"Access denied\",\n };\n }\n\n const installation = await store.updateInstallation(\n tenantId,\n installationId,\n body,\n );\n\n if (!installation) {\n reply.code(404);\n return {\n success: false,\n message: \"Channel installation not found\",\n };\n }\n\n // Handle enable/disable — start/stop live connections\n if (body.enabled !== undefined && body.enabled !== existing.enabled) {\n const adapter = _adapterRegistry?.get(existing.channel);\n if (body.enabled && adapter?.connect) {\n // Re-connect: pass router deps so the adapter can dispatch messages\n await adapter.connect(installation, { router: _router });\n } else if (!body.enabled && adapter?.disconnect) {\n await adapter.disconnect(installationId);\n }\n }\n\n return {\n success: true,\n message: \"Channel installation updated successfully\",\n data: installation,\n };\n } catch (error) {\n console.error(\"Failed to update channel installation:\", error);\n return {\n success: false,\n message: \"Failed to update channel installation\",\n };\n }\n}\n\n/**\n * Delete channel installation\n */\nexport async function deleteChannelInstallation(\n request: FastifyRequest<{\n Params: { installationId: string };\n }>,\n reply: FastifyReply,\n): Promise<{ success: boolean; message: string }> {\n const tenantId = getTenantId(request);\n const { installationId } = request.params;\n\n try {\n const store = await getInstallationStore();\n\n // Verify installation exists and belongs to tenant\n const existing = await store.getInstallationById(installationId);\n if (!existing) {\n reply.code(404);\n return {\n success: false,\n message: \"Channel installation not found\",\n };\n }\n\n if (existing.tenantId !== tenantId) {\n reply.code(403);\n return {\n success: false,\n message: \"Access denied\",\n };\n }\n\n // Disconnect live connection before removing from DB\n if (_adapterRegistry) {\n const adapter = _adapterRegistry.get(existing.channel);\n if (adapter?.disconnect) {\n try {\n await adapter.disconnect(installationId);\n } catch (err) {\n console.error(\"Failed to disconnect channel adapter:\", err);\n }\n }\n }\n\n const deleted = await store.deleteInstallation(tenantId, installationId);\n\n if (!deleted) {\n reply.code(404);\n return {\n success: false,\n message: \"Channel installation not found\",\n };\n }\n\n return {\n success: true,\n message: \"Channel installation deleted successfully\",\n };\n } catch (error) {\n console.error(\"Failed to delete channel installation:\", error);\n return {\n success: false,\n message: \"Failed to delete channel installation\",\n };\n }\n}\n","import { FastifyInstance } from \"fastify\";\nimport type { CreateChannelInstallationRequest } from \"@axiom-lattice/protocols\";\nimport * as channelInstallationController from \"../controllers/channel-installations\";\n\n/**\n * Register channel installation management routes\n */\nexport function registerChannelInstallationRoutes(app: FastifyInstance): void {\n // List all installations for current tenant\n app.get<{\n Querystring: { channel?: \"lark\" };\n }>(\"/api/channel-installations\", channelInstallationController.getChannelInstallationList);\n\n // Get single installation by ID\n app.get<{\n Params: { installationId: string };\n }>(\"/api/channel-installations/:installationId\", channelInstallationController.getChannelInstallation);\n\n // Create new installation\n app.post<{\n Body: CreateChannelInstallationRequest;\n }>(\"/api/channel-installations\", channelInstallationController.createChannelInstallation);\n\n // Update installation\n app.put<{\n Params: { installationId: string };\n Body: any;\n }>(\"/api/channel-installations/:installationId\", channelInstallationController.updateChannelInstallation);\n\n // Delete installation\n app.delete<{\n Params: { installationId: string };\n }>(\"/api/channel-installations/:installationId\", channelInstallationController.deleteChannelInstallation);\n}\n","import type { FastifyRequest, FastifyReply } from \"fastify\";\nimport type { CreateBindingInput } from \"@axiom-lattice/protocols\";\nimport { getBindingRegistry } from \"@axiom-lattice/core\";\n\nfunction getTenantId(request: FastifyRequest): string {\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) return userTenantId;\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\nexport async function getBindingList(\n request: FastifyRequest<{\n Querystring: {\n channel?: string;\n agentId?: string;\n channelInstallationId?: string;\n limit?: number;\n offset?: number;\n };\n }>,\n _reply: FastifyReply,\n) {\n const tenantId = getTenantId(request);\n const { channel, agentId, channelInstallationId, limit, offset } = request.query;\n try {\n const registry = getBindingRegistry();\n const bindings = await registry.list({ channel, agentId, tenantId, channelInstallationId, limit, offset });\n return { success: true, message: \"Bindings retrieved\", data: { records: bindings, total: bindings.length } };\n } catch (error) {\n console.error(\"Failed to get bindings:\", error);\n return { success: false, message: \"Failed to retrieve bindings\", data: { records: [], total: 0 } };\n }\n}\n\nexport async function getBinding(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply,\n) {\n const tenantId = getTenantId(request);\n try {\n const registry = getBindingRegistry();\n const bindings = await registry.list({ tenantId });\n const binding = bindings.find((b) => b.id === request.params.id);\n if (!binding || binding.tenantId !== tenantId) {\n reply.status(404);\n return { success: false, message: \"Binding not found\" };\n }\n return { success: true, message: \"Binding retrieved\", data: binding };\n } catch (error) {\n console.error(\"Failed to get binding:\", error);\n return { success: false, message: \"Failed to retrieve binding\" };\n }\n}\n\nexport async function createBinding(\n request: FastifyRequest<{ Body: CreateBindingInput }>,\n reply: FastifyReply,\n) {\n const tenantId = getTenantId(request);\n try {\n const registry = getBindingRegistry();\n const binding = await registry.create({ ...request.body, tenantId });\n reply.status(201);\n return { success: true, message: \"Binding created\", data: binding };\n } catch (error) {\n console.error(\"Failed to create binding:\", error);\n reply.status(500);\n return { success: false, message: \"Failed to create binding\" };\n }\n}\n\nexport async function updateBinding(\n request: FastifyRequest<{ Params: { id: string }; Body: Partial<CreateBindingInput & { enabled: boolean }> }>,\n reply: FastifyReply,\n) {\n try {\n const tenantId = getTenantId(request);\n const registry = getBindingRegistry();\n const bindings = await registry.list({ tenantId });\n const existing = bindings.find((b) => b.id === request.params.id);\n if (!existing || existing.tenantId !== tenantId) {\n reply.status(404);\n return { success: false, message: \"Binding not found\" };\n }\n const binding = await registry.update(request.params.id, request.body);\n return { success: true, message: \"Binding updated\", data: binding };\n } catch (error) {\n console.error(\"Failed to update binding:\", error);\n reply.status(500);\n return { success: false, message: \"Failed to update binding\" };\n }\n}\n\nexport async function deleteBinding(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply,\n) {\n try {\n const tenantId = getTenantId(request);\n const registry = getBindingRegistry();\n const bindings = await registry.list({ tenantId });\n const existing = bindings.find((b) => b.id === request.params.id);\n if (!existing || existing.tenantId !== tenantId) {\n reply.status(404);\n return { success: false, message: \"Binding not found\" };\n }\n await registry.delete(request.params.id);\n return { success: true, message: \"Binding deleted\" };\n } catch (error) {\n console.error(\"Failed to delete binding:\", error);\n reply.status(500);\n return { success: false, message: \"Failed to delete binding\" };\n }\n}\n\nexport async function resolveBinding(\n request: FastifyRequest<{\n Querystring: { channel: string; senderId: string; channelInstallationId: string };\n }>,\n _reply: FastifyReply,\n) {\n const tenantId = getTenantId(request);\n const { channel, senderId, channelInstallationId } = request.query;\n try {\n const registry = getBindingRegistry();\n const binding = await registry.resolve({ channel, senderId, channelInstallationId, tenantId });\n if (!binding) {\n return { success: false, message: \"No binding found\", data: null };\n }\n return { success: true, message: \"Binding found\", data: binding };\n } catch (error) {\n console.error(\"Failed to resolve binding:\", error);\n return { success: false, message: \"Failed to resolve binding\", data: null };\n }\n}\n","import type { FastifyInstance } from \"fastify\";\nimport * as bindingsController from \"../controllers/channel-bindings\";\n\nexport function registerChannelBindingRoutes(app: FastifyInstance): void {\n app.get(\"/api/channel-bindings\", bindingsController.getBindingList);\n app.get(\"/api/channel-bindings/resolve\", bindingsController.resolveBinding);\n app.post(\"/api/channel-bindings\", bindingsController.createBinding);\n app.get(\"/api/channel-bindings/:id\", bindingsController.getBinding);\n app.put(\"/api/channel-bindings/:id\", bindingsController.updateBinding);\n app.delete(\"/api/channel-bindings/:id\", bindingsController.deleteBinding);\n}\n","import type { FastifyRequest, FastifyReply } from \"fastify\";\nimport type { CreateMenuItemInput } from \"@axiom-lattice/protocols\";\nimport { getMenuRegistry } from \"@axiom-lattice/core\";\n\nfunction getTenantId(request: FastifyRequest): string {\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) return userTenantId;\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\nfunction errorMessage(err: unknown): string {\n return err instanceof Error ? err.message : \"Unexpected error\";\n}\n\nexport async function getMenuItemList(\n request: FastifyRequest<{\n Querystring: { menuTarget?: string };\n }>,\n _reply: FastifyReply,\n) {\n const tenantId = getTenantId(request);\n try {\n const registry = getMenuRegistry();\n const items = await registry.list({ tenantId, menuTarget: request.query.menuTarget as \"sidebar\" | \"workspace\" | undefined });\n return { success: true, message: \"Menu items retrieved\", data: { records: items, total: items.length } };\n } catch (error) {\n const msg = errorMessage(error);\n console.error(\"Failed to get menu items:\", msg);\n return { success: false, message: msg, data: { records: [], total: 0 } };\n }\n}\n\nexport async function getMenuItem(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply,\n) {\n const tenantId = getTenantId(request);\n try {\n const registry = getMenuRegistry();\n const item = await registry.getById(request.params.id);\n if (!item || item.tenantId !== tenantId) {\n reply.status(404);\n return { success: false, message: \"Menu item not found\" };\n }\n return { success: true, message: \"Menu item retrieved\", data: item };\n } catch (error) {\n const msg = errorMessage(error);\n console.error(\"Failed to get menu item:\", msg);\n reply.status(500);\n return { success: false, message: msg };\n }\n}\n\nexport async function createMenuItem(\n request: FastifyRequest<{ Body: CreateMenuItemInput }>,\n reply: FastifyReply,\n) {\n const tenantId = getTenantId(request);\n try {\n const registry = getMenuRegistry();\n const item = await registry.create({ ...request.body, tenantId });\n reply.status(201);\n return { success: true, message: \"Menu item created\", data: item };\n } catch (error) {\n const msg = errorMessage(error);\n console.error(\"Failed to create menu item:\", msg);\n reply.status(500);\n return { success: false, message: msg };\n }\n}\n\nexport async function updateMenuItem(\n request: FastifyRequest<{ Params: { id: string }; Body: Partial<CreateMenuItemInput & { enabled: boolean }> }>,\n reply: FastifyReply,\n) {\n try {\n const tenantId = getTenantId(request);\n const registry = getMenuRegistry();\n const existing = await registry.getById(request.params.id);\n if (!existing || existing.tenantId !== tenantId) {\n reply.status(404);\n return { success: false, message: \"Menu item not found\" };\n }\n const item = await registry.update(request.params.id, request.body);\n return { success: true, message: \"Menu item updated\", data: item };\n } catch (error) {\n const msg = errorMessage(error);\n console.error(\"Failed to update menu item:\", msg);\n reply.status(500);\n return { success: false, message: msg };\n }\n}\n\nexport async function deleteMenuItem(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply,\n) {\n try {\n const tenantId = getTenantId(request);\n const registry = getMenuRegistry();\n const existing = await registry.getById(request.params.id);\n if (!existing || existing.tenantId !== tenantId) {\n reply.status(404);\n return { success: false, message: \"Menu item not found\" };\n }\n await registry.delete(request.params.id);\n return { success: true, message: \"Menu item deleted\" };\n } catch (error) {\n const msg = errorMessage(error);\n console.error(\"Failed to delete menu item:\", msg);\n reply.status(500);\n return { success: false, message: msg };\n }\n}\n","import type { FastifyInstance } from \"fastify\";\nimport * as menuController from \"../controllers/menu-items\";\n\nexport function registerMenuItemRoutes(app: FastifyInstance): void {\n app.get(\"/api/menu-items\", menuController.getMenuItemList);\n app.post(\"/api/menu-items\", menuController.createMenuItem);\n app.get(\"/api/menu-items/:id\", menuController.getMenuItem);\n app.put(\"/api/menu-items/:id\", menuController.updateMenuItem);\n app.delete(\"/api/menu-items/:id\", menuController.deleteMenuItem);\n}\n","/**\n * A2A Bridge — WebSocket-based reverse proxy for agents behind NAT.\n *\n * Agents open an outbound WebSocket to the gateway. The gateway stores\n * the connection and exposes an HTTP proxy endpoint per agent. When the\n * orchestrator calls the agent, the gateway proxies the HTTP request\n * over the persistent WebSocket instead of trying to reach a private IP.\n *\n * Agent flow:\n * 1. Connect ws://gateway/api/a2a/bridge\n * 2. Send { type: \"agent:register\", agentId: \"...\", agentCard: {...} }\n * 3. Wait for { type: \"http:request\", requestId, method, path, headers, body }\n * 4. Process locally, respond with { type: \"http:response\", requestId, status, headers, body }\n *\n * Gateway flow:\n * 1. Accept WebSocket, store connection by agentId\n * 2. Expose GET/POST /api/a2a/bridge/proxy/{agentId}/*\n * 3. When HTTP request arrives, push over WebSocket, await response, relay\n */\n\nimport type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify';\nimport type { WebSocket } from 'ws';\nimport { v4 } from 'uuid';\n\n// ─── Logging ────────────────────────────────────────────────────────────────\n\nconst log = {\n info(msg: string, ctx?: Record<string, unknown>) {\n console.log(JSON.stringify({ level: 'info', msg, ...ctx }));\n },\n warn(msg: string, ctx?: Record<string, unknown>) {\n console.warn(JSON.stringify({ level: 'warn', msg, ...ctx }));\n },\n error(msg: string, ctx?: Record<string, unknown>) {\n console.error(JSON.stringify({ level: 'error', msg, ...ctx }));\n },\n};\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\ninterface PendingRequest {\n resolve: (response: BridgeHttpResponse) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n /** The agent owning this pending request — used for cleanup on disconnect */\n agentId: string;\n}\n\ninterface BridgeHttpResponse {\n status: number;\n headers: Record<string, string>;\n body: string;\n}\n\ninterface AgentConnection {\n ws: WebSocket;\n agentId: string;\n agentCard: Record<string, unknown>;\n connectedAt: number;\n}\n\n// ─── Connection Registry ────────────────────────────────────────────────────\n\nconst connections = new Map<string, AgentConnection>();\nconst pending = new Map<string, PendingRequest>();\n\nfunction getAgentIdFromPath(path: string): string | null {\n // Path: /api/a2a/bridge/proxy/{agentId}/...\n const match = path.match(/^\\/api\\/a2a\\/bridge\\/proxy\\/([^/]+)/);\n return match ? match[1] : null;\n}\n\n// ─── WebSocket Handler ──────────────────────────────────────────────────────\n\nfunction handleBridgeConnection(socket: WebSocket, _request: FastifyRequest): void {\n let agentId: string | null = null;\n\n log.info('Bridge WebSocket connected');\n\n socket.on('message', (raw) => {\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(raw.toString());\n } catch {\n log.warn('Bridge invalid message');\n return;\n }\n\n switch (msg.type) {\n case 'agent:register': {\n agentId = msg.agentId as string;\n if (!agentId) {\n socket.send(JSON.stringify({ type: 'error', message: 'agentId required' }));\n socket.close();\n return;\n }\n connections.set(agentId, {\n ws: socket,\n agentId,\n agentCard: msg.agentCard as Record<string, unknown> ?? {},\n connectedAt: Date.now(),\n });\n log.info('Agent registered via bridge', { agentId });\n socket.send(JSON.stringify({ type: 'agent:registered', agentId }));\n break;\n }\n\n case 'http:response': {\n const requestId = msg.requestId as string;\n const p = pending.get(requestId);\n if (p) {\n clearTimeout(p.timer);\n pending.delete(requestId);\n p.resolve({\n status: (msg.status as number) ?? 200,\n headers: (msg.headers as Record<string, string>) ?? {},\n body: (msg.body as string) ?? '',\n });\n }\n break;\n }\n\n case 'http:error': {\n const requestId = msg.requestId as string;\n const p = pending.get(requestId);\n if (p) {\n clearTimeout(p.timer);\n pending.delete(requestId);\n p.reject(new Error((msg.message as string) ?? 'Agent error'));\n }\n break;\n }\n }\n });\n\n socket.on('close', () => {\n if (agentId) {\n connections.delete(agentId);\n log.info('Bridge WebSocket disconnected', { agentId });\n // Reject only this agent's pending requests\n for (const [reqId, p] of pending) {\n if (p.agentId === agentId) {\n clearTimeout(p.timer);\n p.reject(new Error('Agent disconnected'));\n pending.delete(reqId);\n }\n }\n }\n });\n\n socket.on('error', (err) => {\n log.error('Bridge WebSocket error', { agentId, error: err.message });\n });\n}\n\n// ─── HTTP Proxy Handler ─────────────────────────────────────────────────────\n\nasync function handleBridgeProxy(\n request: FastifyRequest,\n reply: FastifyReply,\n): Promise<void> {\n const agentId = getAgentIdFromPath(request.url);\n if (!agentId) {\n reply.status(400).send({ error: 'Agent ID not found in path' });\n return;\n }\n\n const conn = connections.get(agentId);\n if (!conn) {\n reply.status(503).send({\n error: 'Agent not connected',\n message: `Agent \"${agentId}\" is not connected via WebSocket bridge`,\n });\n return;\n }\n\n const requestId = v4();\n\n // Build sub-path (strip the proxy prefix)\n const subPath = request.url.replace(`/api/a2a/bridge/proxy/${agentId}`, '') || '/';\n\n // Read body\n let body: string | undefined;\n if (request.method === 'POST' || request.method === 'PUT') {\n body = typeof request.body === 'string'\n ? request.body\n : JSON.stringify(request.body ?? {});\n }\n\n const bridgeRequest = {\n type: 'http:request',\n requestId,\n method: request.method,\n path: subPath,\n headers: {\n 'content-type': request.headers['content-type'] ?? 'application/json',\n 'accept': request.headers['accept'] ?? '*/*',\n },\n body: body ?? '',\n };\n\n const timeout = 300_000; // 5 min\n\n try {\n const response = await new Promise<BridgeHttpResponse>((resolve, reject) => {\n const timer = setTimeout(() => {\n pending.delete(requestId);\n reject(new Error(`Bridge request timeout after ${timeout}ms`));\n }, timeout);\n\n pending.set(requestId, { resolve, reject, timer, agentId });\n\n try {\n if (conn.ws.readyState !== conn.ws.OPEN) {\n pending.delete(requestId);\n reject(new Error('WebSocket not open'));\n return;\n }\n conn.ws.send(JSON.stringify(bridgeRequest));\n } catch (err) {\n clearTimeout(timer);\n pending.delete(requestId);\n reject(err as Error);\n }\n });\n\n // Relay response headers\n for (const [key, value] of Object.entries(response.headers)) {\n if (!['content-length', 'transfer-encoding', 'connection'].includes(key.toLowerCase())) {\n reply.header(key, value);\n }\n }\n\n reply.status(response.status);\n\n // Try to send as JSON if possible\n try {\n const parsed = JSON.parse(response.body);\n reply.send(parsed);\n } catch {\n reply.send(response.body);\n }\n } catch (err) {\n log.error('Bridge proxy error', { agentId, error: (err as Error).message });\n reply.status(502).send({\n error: 'Bridge proxy error',\n message: (err as Error).message,\n });\n }\n}\n\n// ─── Route Registration ─────────────────────────────────────────────────────\n\nexport function registerA2ABridgeRoutes(app: FastifyInstance): void {\n // WebSocket endpoint for agents to connect\n app.get('/api/a2a/bridge', { websocket: true }, (socket, req) => {\n handleBridgeConnection(socket, req);\n });\n\n // HTTP proxy endpoint — all paths under /api/a2a/bridge/proxy/{agentId}/\n app.route({\n method: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'],\n url: '/api/a2a/bridge/proxy/*',\n handler: handleBridgeProxy,\n });\n}\n","import { FastifyInstance } from \"fastify\";\nimport { getSTTClient, sttModelLatticeManager } from \"@axiom-lattice/core\";\n\nconst ALLOWED_AUDIO_FORMATS = new Set([\n \"webm\",\n \"wav\",\n \"mp3\",\n \"m4a\",\n \"ogg\",\n \"flac\",\n \"aac\",\n]);\n\nconst MAX_AUDIO_FILE_SIZE = 25 * 1024 * 1024;\n\n/**\n * Register STT (speech-to-text) transcription route.\n *\n * POST /api/stt/transcribe\n * Content-Type: multipart/form-data\n * Body: { file: File }\n * Query: ?model=default\n * Response: { text: string, confidence?: number }\n */\nexport const registerSTTRoutes = (app: FastifyInstance): void => {\n // List registered STT models\n app.get(\"/api/stt/models\", async (_request, reply) => {\n const models = sttModelLatticeManager.getAllSTTModelInfo();\n return reply.send({ models });\n });\n\n app.post<{ Querystring: { model?: string } }>(\n \"/api/stt/transcribe\",\n {\n schema: {\n querystring: {\n type: \"object\",\n properties: {\n model: { type: \"string\" },\n },\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n text: { type: \"string\" },\n confidence: { type: \"number\" },\n },\n },\n },\n },\n },\n async (request, reply) => {\n const modelKey = request.query.model || \"default\";\n const data = await request.file({\n limits: { fileSize: MAX_AUDIO_FILE_SIZE },\n });\n\n if (!data) {\n return reply.status(400).send({ error: \"No audio file provided\" });\n }\n\n const buffer = await data.toBuffer();\n if (buffer.length === 0) {\n return reply.status(400).send({ error: \"Empty audio file\" });\n }\n\n const format = (data.filename.split(\".\").pop() || \"webm\").toLowerCase();\n\n if (!ALLOWED_AUDIO_FORMATS.has(format)) {\n return reply\n .status(400)\n .send({ error: `Unsupported audio format: ${format}` });\n }\n\n try {\n let client;\n try {\n client = getSTTClient(modelKey);\n } catch {\n return reply.status(404).send({ error: `STT model \"${modelKey}\" not found` });\n }\n const result = await client.transcribe(buffer, format);\n\n return reply.send({\n text: result.text,\n confidence: result.confidence,\n });\n } catch (error: unknown) {\n const sanitizedMessage =\n error instanceof Error ? error.message : \"Transcription failed\";\n request.log.error(\n { error: sanitizedMessage },\n \"STT transcription failed\",\n );\n return reply\n .status(500)\n .send({ error: \"Transcription service error. Please try again.\" });\n }\n },\n );\n};\n","import { FastifyReply, FastifyRequest } from \"fastify\";\nimport { getStoreLattice } from \"@axiom-lattice/core\";\nimport { localA2AService } from \"../services/local-a2a\";\nimport {\n AgentType,\n type Assistant,\n type A2ARemoteAgentConfig,\n} from \"@axiom-lattice/protocols\";\n\nfunction getTenantId(request: FastifyRequest): string {\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) return userTenantId;\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\nfunction getLocalRuntime(assistant: Assistant): A2ARemoteAgentConfig[\"localRuntime\"] | undefined {\n const graphDefinition = assistant.graphDefinition;\n if (!graphDefinition || typeof graphDefinition !== \"object\") return undefined;\n if ((graphDefinition as { type?: unknown }).type !== AgentType.A2A_REMOTE) return undefined;\n return (graphDefinition as A2ARemoteAgentConfig).localRuntime;\n}\n\nasync function getLocalA2AAssistants(\n tenantId: string,\n): Promise<Array<{ assistant: Assistant; localRuntime: NonNullable<A2ARemoteAgentConfig[\"localRuntime\"]> }>> {\n const storeLattice = getStoreLattice(\"default\", \"assistant\");\n const assistants = await storeLattice.store.getAllAssistants(tenantId);\n const results: Array<{\n assistant: Assistant;\n localRuntime: NonNullable<A2ARemoteAgentConfig[\"localRuntime\"]>;\n }> = [];\n\n for (const assistant of assistants) {\n const runtime = getLocalRuntime(assistant);\n if (runtime) {\n results.push({ assistant, localRuntime: runtime });\n }\n }\n\n return results;\n}\n\nasync function getLocalA2AAssistant(\n tenantId: string,\n assistantId: string,\n): Promise<{\n assistant: Assistant;\n localRuntime: NonNullable<A2ARemoteAgentConfig[\"localRuntime\"]>;\n} | null> {\n const storeLattice = getStoreLattice(\"default\", \"assistant\");\n const assistant = await storeLattice.store.getAssistantById(tenantId, assistantId);\n if (!assistant) return null;\n\n const runtime = getLocalRuntime(assistant);\n if (!runtime) return null;\n\n return { assistant, localRuntime: runtime };\n}\n\nasync function requireManagedAssistant(\n request: FastifyRequest<{ Params: { assistantId: string } }>,\n reply: FastifyReply,\n): Promise<{\n assistantId: string;\n localRuntime: NonNullable<A2ARemoteAgentConfig[\"localRuntime\"]>;\n} | null> {\n const assistantId = request.params.assistantId;\n if (!assistantId) {\n reply.status(400).send({ success: false, error: \"assistantId is required\" });\n return null;\n }\n\n const registered = await getLocalA2AAssistant(getTenantId(request), assistantId);\n if (!registered) {\n reply.status(404).send({\n success: false,\n error: `Assistant ${assistantId} is not a local managed A2A assistant`,\n });\n return null;\n }\n\n return { assistantId, localRuntime: registered.localRuntime };\n}\n\nexport async function getLocalA2AStatus(\n request: FastifyRequest,\n reply: FastifyReply,\n): Promise<void> {\n const tenantId = getTenantId(request);\n const managed = await getLocalA2AAssistants(tenantId);\n const states = await Promise.all(\n managed.map(({ assistant, localRuntime }) =>\n localA2AService.getRegisteredState(assistant.id, localRuntime),\n ),\n );\n reply.send({ success: true, data: { records: states, total: states.length } });\n}\n\nexport async function getLocalA2AProvider(\n request: FastifyRequest<{ Params: { assistantId: string } }>,\n reply: FastifyReply,\n): Promise<void> {\n const registered = await requireManagedAssistant(request, reply);\n if (!registered) return;\n const state = await localA2AService.getRegisteredState(\n registered.assistantId,\n registered.localRuntime,\n );\n reply.send({ success: true, data: state });\n}\n\nexport async function startLocalA2AProvider(\n request: FastifyRequest<{ Params: { assistantId: string } }>,\n reply: FastifyReply,\n): Promise<void> {\n const registered = await requireManagedAssistant(request, reply);\n if (!registered) return;\n\n const state = await localA2AService.startProvider(\n registered.assistantId,\n registered.localRuntime,\n );\n reply.send({ success: true, data: state });\n}\n\nexport async function stopLocalA2AProvider(\n request: FastifyRequest<{ Params: { assistantId: string } }>,\n reply: FastifyReply,\n): Promise<void> {\n const registered = await requireManagedAssistant(request, reply);\n if (!registered) return;\n\n const state = await localA2AService.stopProvider(registered.assistantId);\n reply.send({ success: true, data: state });\n}\n\nexport async function restartLocalA2AProvider(\n request: FastifyRequest<{ Params: { assistantId: string } }>,\n reply: FastifyReply,\n): Promise<void> {\n const registered = await requireManagedAssistant(request, reply);\n if (!registered) return;\n\n const state = await localA2AService.restartProvider(\n registered.assistantId,\n registered.localRuntime,\n );\n reply.send({ success: true, data: state });\n}\n","import { cliA2AEntryPath } from \"@axiom-lattice/cli-a2a/cli-path\";\nimport type { LocalA2ATemplateDefinition } from \"@axiom-lattice/protocols\";\n\ntype LocalProviderKey = \"claude\" | \"codex\" | \"opencode\";\n\nfunction buildCliA2ACommand(\n provider: LocalProviderKey,\n agentName: string,\n agentDescription: string,\n): LocalA2ATemplateDefinition[\"command\"] {\n return {\n executable: process.execPath,\n args: [\n cliA2AEntryPath,\n \"--provider\",\n provider,\n \"--hostname\",\n \"localhost\",\n \"--advertise-host\",\n \"localhost\",\n \"--agent-name\",\n agentName,\n \"--agent-description\",\n agentDescription,\n \"--log-level\",\n \"info\",\n ],\n };\n}\n\nexport const LOCAL_A2A_TEMPLATES: LocalA2ATemplateDefinition[] = [\n {\n key: \"claude\",\n name: \"Claude Code\",\n command: buildCliA2ACommand(\n \"claude\",\n \"Claude Code\",\n \"Local Claude Code wrapper exposed through A2A.\",\n ),\n },\n {\n key: \"codex\",\n name: \"Codex\",\n command: buildCliA2ACommand(\n \"codex\",\n \"Codex\",\n \"Local Codex wrapper exposed through A2A.\",\n ),\n },\n {\n key: \"opencode\",\n name: \"OpenCode\",\n command: buildCliA2ACommand(\n \"opencode\",\n \"OpenCode\",\n \"Local OpenCode wrapper exposed through A2A.\",\n ),\n },\n];\n","import { FastifyReply, FastifyRequest } from \"fastify\";\nimport { LOCAL_A2A_TEMPLATES } from \"../config/local-a2a-templates\";\n\n/**\n * List all configured Local A2A templates (read-only static config).\n */\nexport async function getLocalA2ATemplates(\n _request: FastifyRequest,\n reply: FastifyReply,\n): Promise<void> {\n reply.send({\n success: true,\n data: {\n records: LOCAL_A2A_TEMPLATES,\n total: LOCAL_A2A_TEMPLATES.length,\n },\n });\n}\n","import { FastifyInstance } from \"fastify\";\nimport { randomUUID } from \"node:crypto\";\nimport type { AgentCard, LocalRuntimeConfig } from \"@axiom-lattice/protocols\";\nimport { localA2AService } from \"../services/local-a2a\";\nimport { normalizeA2AAgentCardUrl } from \"../utils/a2a-url\";\nimport {\n validateLocalRuntimeCommand,\n validateLocalRuntimePort,\n} from \"../utils/local-a2a-runtime\";\n\ntype TestConnectionError = Error & {\n code?: string;\n cause?: unknown;\n};\n\nfunction describeTestConnectionError(error: unknown, agentCardUrl: string): string {\n if (!(error instanceof Error)) {\n return `Failed to fetch agent card from ${agentCardUrl}: ${String(error)}`;\n }\n\n const cause = (error as TestConnectionError).cause;\n const causeParts: string[] = [];\n if (cause instanceof Error) {\n causeParts.push(cause.message);\n const causeCode = (cause as TestConnectionError).code;\n if (causeCode && !causeParts.some((part) => part.includes(causeCode))) {\n causeParts.push(causeCode);\n }\n } else if (typeof cause === \"object\" && cause !== null) {\n const code = \"code\" in cause ? String(cause.code) : \"\";\n const message = \"message\" in cause ? String(cause.message) : \"\";\n if (message) causeParts.push(message);\n if (code && !message.includes(code)) causeParts.push(code);\n }\n\n const detail = causeParts.length > 0 ? ` (${causeParts.join(\", \")})` : \"\";\n return `Failed to fetch agent card from ${agentCardUrl}: ${error.message}${detail}`;\n}\n\nasync function ensureLocalRuntimeForConnectionTest(\n localRuntime: LocalRuntimeConfig,\n agentCardUrl: string,\n): Promise<{ runtimeId: string } | { error: string }> {\n const commandValidation = validateLocalRuntimeCommand(localRuntime);\n if (!commandValidation.ok) {\n return { error: commandValidation.error };\n }\n const testRuntime = {\n ...localRuntime,\n agentCardUrl,\n command: {\n ...localRuntime.command,\n executable: localRuntime.command.executable.trim(),\n },\n };\n const portValidation = validateLocalRuntimePort(testRuntime, agentCardUrl);\n if (!portValidation.ok) {\n return { error: portValidation.error };\n }\n\n const state = await localA2AService.startProvider(\n `test-${randomUUID()}`,\n testRuntime,\n );\n if (state.status === \"running\") return { runtimeId: state.runtimeId };\n const detail = state.message ? ` ${state.message}` : \"\";\n localA2AService.removeState(state.runtimeId);\n return { error: `Local managed A2A server could not start for connection test.${detail}` };\n}\n\nasync function readShortResponseBody(resp: Response): Promise<string> {\n const body = await resp.text().catch(() => \"\");\n return body.length > 500 ? `${body.slice(0, 500)}...` : body;\n}\n\nexport function registerA2ATestConnectionRoute(app: FastifyInstance): void {\n app.post(\"/api/a2a/test-connection\", async (request, reply) => {\n const { agentCardUrl, apiKey, localRuntime } = (request.body ?? {}) as {\n agentCardUrl?: string;\n apiKey?: string;\n localRuntime?: LocalRuntimeConfig;\n };\n const normalizedAgentCardUrl = normalizeA2AAgentCardUrl(\n agentCardUrl,\n localRuntime ? \"http://\" : \"https://\",\n );\n if (!normalizedAgentCardUrl) {\n return reply.status(400).send({ success: false, error: \"agentCardUrl is required\" });\n }\n\n let testRuntimeId: string | null = null;\n try {\n const headers: Record<string, string> = {};\n if (apiKey) headers[\"Authorization\"] = `Bearer ${apiKey}`;\n\n if (localRuntime) {\n const localStartResult = await ensureLocalRuntimeForConnectionTest(localRuntime, normalizedAgentCardUrl);\n if (\"error\" in localStartResult) {\n return reply.send({ success: true, data: { reachable: false, error: localStartResult.error } });\n }\n testRuntimeId = localStartResult.runtimeId;\n }\n\n const resp = await fetch(normalizedAgentCardUrl, { headers, signal: AbortSignal.timeout(8000) });\n if (!resp.ok) {\n const body = await readShortResponseBody(resp);\n const suffix = body ? `: ${body}` : \"\";\n return reply.send({ success: true, data: { reachable: false, error: `HTTP ${resp.status} ${resp.statusText}${suffix}` } });\n }\n const card = await resp.json() as AgentCard;\n return reply.send({ success: true, data: { reachable: true, agentName: card.name, agentCard: card } });\n } catch (error: unknown) {\n return reply.send({\n success: true,\n data: {\n reachable: false,\n error: describeTestConnectionError(error, normalizedAgentCardUrl),\n },\n });\n } finally {\n if (testRuntimeId) {\n localA2AService.removeState(testRuntimeId);\n }\n }\n });\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport {\n getStoreLattice,\n} from \"@axiom-lattice/core\";\nimport type {\n AssistantStore,\n TaskStore,\n TaskItem,\n CreateTaskRequest,\n UpdateTaskRequest,\n TaskWorkItemStore,\n} from \"@axiom-lattice/protocols\";\n\ninterface CompleteTaskBody {\n result?: string;\n beliefImpact?: Array<{ key: string; after: number; basis: string }>;\n}\n\ninterface TaskControllerResponse {\n success: boolean;\n data?: TaskItem;\n code?: string;\n error?: string;\n hint?: string;\n}\n\nconst AGENT_CREATE_STATUSES = new Set<TaskItem[\"status\"]>([\"pending\"]);\nconst FORBIDDEN_AGENT_CREATE_KEYS = new Set([\n \"beliefImpact\",\n \"beliefState\",\n \"cancelledAt\",\n \"completedAt\",\n \"completionEvidence\",\n \"evidenceId\",\n \"failureReason\",\n \"failedAt\",\n \"interruption\",\n \"lifecycle_completion_audit\",\n \"lifecycle_resume_audit\",\n \"requireReview\",\n \"result\",\n \"reviewedAt\",\n \"status\",\n \"interruptedAt\",\n]);\n\nfunction containsLifecycleField(value: unknown): boolean {\n if (!value || typeof value !== \"object\") return false;\n if (Array.isArray(value)) return value.some(containsLifecycleField);\n return Object.entries(value).some(([key, nested]) =>\n FORBIDDEN_AGENT_CREATE_KEYS.has(key) || key.startsWith(\"lifecycle_\") || containsLifecycleField(nested));\n}\n\nfunction governedAgentCreateError(body: CreateTaskRequest): {\n code: string;\n error: string;\n} | undefined {\n if (body.ownerType !== \"agent\") return undefined;\n if (body.status && !AGENT_CREATE_STATUSES.has(body.status)) {\n return {\n code: \"TASK_LIFECYCLE_TRANSITION_REQUIRED\",\n error: \"Public agent tasks can only be created pending.\",\n };\n }\n const raw = body as CreateTaskRequest & Record<string, unknown>;\n if (\n Object.prototype.hasOwnProperty.call(raw, \"result\") ||\n Object.prototype.hasOwnProperty.call(raw, \"failureReason\") ||\n Object.prototype.hasOwnProperty.call(raw, \"requireReview\") ||\n Object.prototype.hasOwnProperty.call(raw, \"createdAt\") ||\n Object.prototype.hasOwnProperty.call(raw, \"updatedAt\") ||\n containsLifecycleField(body.context) ||\n containsLifecycleField(body.metadata)\n ) {\n return {\n code: \"TASK_LIFECYCLE_CONTEXT_FORBIDDEN\",\n error: \"Agent lifecycle results, review policy, interruption state, and audit fields require a trusted lifecycle adapter.\",\n };\n }\n return undefined;\n}\n\nfunction getTenantId(request: FastifyRequest): string {\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) return userTenantId;\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\nfunction getUserId(request: FastifyRequest): string {\n const userId = (request as any).user?.id\n || (request.headers[\"x-user-id\"] as string);\n if (!userId) throw new Error(\"User ID is required\");\n return userId;\n}\n\nfunction getStore(): TaskStore {\n return getStoreLattice(\"default\", \"task\").store as TaskStore;\n}\n\nfunction getAssistantStore(): AssistantStore {\n return getStoreLattice(\"default\", \"assistant\").store as AssistantStore;\n}\n\nfunction governedAgentUpdateError(task: TaskItem, updates: UpdateTaskRequest): string | undefined {\n const has = (key: keyof UpdateTaskRequest): boolean => Object.prototype.hasOwnProperty.call(updates, key);\n if (\n (has(\"ownerType\") && updates.ownerType !== task.ownerType) ||\n (has(\"ownerId\") && updates.ownerId !== task.ownerId)\n ) {\n return \"TASK_OWNERSHIP_IMMUTABLE\";\n }\n if (task.ownerType !== \"agent\") return undefined;\n\n if (\n (has(\"parentId\") && updates.parentId !== task.parentId) ||\n (has(\"requireReview\") && updates.requireReview !== task.requireReview) ||\n has(\"result\") ||\n has(\"failureReason\") ||\n has(\"status\")\n ) {\n return \"TASK_LIFECYCLE_TRANSITION_REQUIRED\";\n }\n\n // TaskStore context updates replace the whole value, so no agent context write\n // can preserve a concurrently-written lifecycle interruption atomically.\n if (has(\"context\") || has(\"description\")) {\n return \"COMPLETION_CONTEXT_MUTATION\";\n }\n\n return undefined;\n}\n\n/** Maps lifecycle service failure codes to their public HTTP status. */\nexport function taskLifecycleFailureStatus(code: string): number {\n if (code === \"TASK_NOT_FOUND\") return 404;\n if (\n code === \"TASK_STATUS_CONFLICT\" ||\n code === \"TASK_PARENT_NOT_FOUND_OR_INACCESSIBLE\" ||\n code === \"REVIEW_REQUIRED\" ||\n code === \"LEGACY_REVIEW_UNSUPPORTED\"\n ) return 409;\n if (code.endsWith(\"_FAILED\")) return 500;\n return 400;\n}\n\nexport async function listTasks(\n request: FastifyRequest\n): Promise<{ success: boolean; data?: TaskItem[]; count?: number; error?: string }> {\n try {\n const tenantId = getTenantId(request);\n const userId = getUserId(request);\n const query = request.query as Record<string, string>;\n const ownerType = query.ownerType as 'user' | 'agent' | undefined;\n const mixedOwnership = ownerType === undefined;\n const limit = query.limit ? parseInt(query.limit) : undefined;\n const offset = query.offset ? parseInt(query.offset) : undefined;\n\n const store = getStore();\n const tasks = await store.list({\n tenantId,\n status: query.status,\n priority: query.priority,\n ...(ownerType === 'user' ? { ownerType, ownerId: userId } : {}),\n ...(ownerType === 'agent' ? { ownerType, ...(query.ownerId && { ownerId: query.ownerId }) } : {}),\n ...(mixedOwnership && query.ownerId ? { ownerId: query.ownerId } : {}),\n ...(query.parentId && { parentId: query.parentId }),\n metadata: query.metadata ? JSON.parse(query.metadata) : undefined,\n projectId: query.projectId,\n ...(!mixedOwnership && limit !== undefined ? { limit } : {}),\n ...(!mixedOwnership && offset !== undefined ? { offset } : {}),\n });\n const visibleTasks = mixedOwnership\n ? tasks.filter((task) => task.ownerType === 'agent' || (task.ownerType === 'user' && task.ownerId === userId))\n : tasks;\n const pageOffset = mixedOwnership ? offset ?? 0 : 0;\n const page = mixedOwnership\n ? visibleTasks.slice(pageOffset, limit === undefined ? undefined : pageOffset + limit)\n : visibleTasks;\n\n return { success: true, data: page, count: page.length };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n}\n\nexport async function getTask(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n): Promise<{ success: boolean; data?: TaskItem; error?: string }> {\n try {\n const tenantId = getTenantId(request);\n const userId = getUserId(request);\n const { id } = request.params;\n\n const store = getStore();\n const task = await store.getById(tenantId, id);\n if (!task) {\n return reply.status(404).send({ success: false, error: \"Task not found\" });\n }\n\n if (task.ownerType === 'user' && task.ownerId !== userId) {\n return reply.status(403).send({ success: false, error: \"Access denied\" });\n }\n\n return { success: true, data: task };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n}\n\nexport async function createTask(\n request: FastifyRequest<{ Body: CreateTaskRequest }>,\n reply: FastifyReply\n): Promise<{ success: boolean; data?: TaskItem; error?: string }> {\n try {\n const tenantId = getTenantId(request);\n const userId = getUserId(request);\n const body = request.body;\n\n if (!body.title) {\n return reply.status(400).send({ success: false, error: \"title is required\" });\n }\n\n const lifecycleError = governedAgentCreateError(body);\n if (lifecycleError) {\n return reply.status(409).send({ success: false, ...lifecycleError });\n }\n\n const ownerType = (body.ownerType || \"user\") as 'user' | 'agent';\n const ownerId = body.ownerId || userId;\n if (ownerType === \"agent\") {\n const assistant = await getAssistantStore().getAssistantById(tenantId, ownerId);\n if (!assistant || assistant.tenantId !== tenantId) {\n return reply.status(404).send({\n success: false,\n code: \"AGENT_OWNER_NOT_FOUND\",\n error: \"Agent owner was not found in the current tenant.\",\n });\n }\n }\n\n const store = getStore();\n const task = await store.create({\n ...body,\n tenantId,\n ownerType,\n ownerId,\n });\n\n return reply.status(201).send({ success: true, data: task });\n } catch (error: any) {\n return reply.status(500).send({ success: false, error: error.message });\n }\n}\n\nexport async function updateTask(\n request: FastifyRequest<{ Params: { id: string }; Body: UpdateTaskRequest }>,\n reply: FastifyReply\n): Promise<{ success: boolean; data?: TaskItem; error?: string }> {\n try {\n const tenantId = getTenantId(request);\n const userId = getUserId(request);\n const { id } = request.params;\n\n const store = getStore();\n const existing = await store.getById(tenantId, id);\n if (!existing) {\n return reply.status(404).send({ success: false, error: \"Task not found\" });\n }\n\n if (existing.ownerType === 'user' && existing.ownerId !== userId) {\n return reply.status(403).send({ success: false, error: \"Access denied\" });\n }\n\n const lifecycleError = governedAgentUpdateError(existing, request.body);\n if (lifecycleError) {\n return reply.status(409).send({\n success: false,\n code: lifecycleError,\n error: lifecycleError === \"COMPLETION_CONTEXT_MUTATION\"\n ? \"Agent completion context is owned by the task lifecycle service.\"\n : lifecycleError === \"TASK_OWNERSHIP_IMMUTABLE\"\n ? \"Task ownership is immutable after creation.\"\n : \"Agent ownership, hierarchy, and lifecycle transitions require a trusted lifecycle adapter.\",\n });\n }\n\n const task = await store.update(tenantId, id, request.body);\n if (!task) {\n return reply.status(404).send({ success: false, error: \"Task not found\" });\n }\n return { success: true, data: task };\n } catch (error: any) {\n return reply.status(500).send({ success: false, error: error.message });\n }\n}\n\nexport async function deleteTask(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message?: string; error?: string }> {\n try {\n const tenantId = getTenantId(request);\n const userId = getUserId(request);\n const { id } = request.params;\n\n const store = getStore();\n const existing = await store.getById(tenantId, id);\n if (!existing) {\n return reply.status(404).send({ success: false, error: \"Task not found\" });\n }\n\n if (existing.ownerType === 'user' && existing.ownerId !== userId) {\n return reply.status(403).send({ success: false, error: \"Access denied\" });\n }\n\n if (existing.ownerType === \"agent\") {\n return reply.status(403).send({\n success: false,\n code: \"AGENT_RUNTIME_REQUIRED\",\n error: \"Agent-owned tasks can only be deleted by a trusted agent runtime.\",\n });\n }\n\n const deleted = await store.delete(tenantId, id);\n if (!deleted) {\n return reply.status(404).send({ success: false, error: \"Task not found\" });\n }\n\n return { success: true, message: \"Task deleted\" };\n } catch (error: any) {\n return reply.status(500).send({ success: false, error: error.message });\n }\n}\n\nexport async function completeTask(\n request: FastifyRequest<{ Params: { id: string }; Body: CompleteTaskBody }>,\n reply: FastifyReply\n): Promise<TaskControllerResponse> {\n try {\n const tenantId = getTenantId(request);\n const userId = getUserId(request);\n const { id } = request.params;\n\n const store = getStore();\n const existing = await store.getById(tenantId, id);\n if (!existing) {\n return reply.status(404).send({ success: false, error: \"Task not found\" });\n }\n\n if (existing.ownerType === 'user' && existing.ownerId !== userId) {\n return reply.status(403).send({ success: false, error: \"Access denied\" });\n }\n\n const body = request.body ?? {};\n if (existing.ownerType === \"user\") {\n const task = await store.update(tenantId, id, {\n status: \"completed\",\n ...(body.result === undefined ? {} : { result: body.result }),\n });\n if (!task) return reply.status(404).send({ success: false, error: \"Task not found\" });\n return { success: true, data: task };\n }\n\n return reply.status(403).send({\n success: false,\n code: \"AGENT_RUNTIME_REQUIRED\",\n error: \"Agent-owned tasks can only be completed by a trusted agent runtime.\",\n });\n } catch (error: any) {\n return reply.status(500).send({ success: false, error: error.message });\n }\n}\n\nfunction getTaskWorkItemStore(): TaskWorkItemStore {\n return getStoreLattice(\"default\", \"taskWorkItem\").store as TaskWorkItemStore;\n}\n\nexport async function listTaskWorkItems(\n request: FastifyRequest<{ \n Params: { id: string }; \n Querystring: { action?: string; limit?: number; offset?: number } \n }>,\n reply: FastifyReply\n) {\n const tenantId = getTenantId(request);\n const userId = getUserId(request);\n const { id } = request.params;\n const { action, limit, offset } = request.query;\n\n const task = await getStore().getById(tenantId, id);\n if (!task) {\n return reply.status(404).send({ success: false, error: \"Task not found\" });\n }\n if (task.ownerType === 'user' && task.ownerId !== userId) {\n return reply.status(403).send({ success: false, error: \"Access denied\" });\n }\n\n const store = getTaskWorkItemStore();\n const items = await store.list({ \n tenantId, \n taskId: id, \n action, \n limit: limit ? Number(limit) : undefined, \n offset: offset ? Number(offset) : undefined \n });\n return reply.send({ success: true, data: items });\n}\n","import type { FastifyInstance } from \"fastify\";\nimport * as tasksController from \"../controllers/tasks\";\n\n/** Registers task CRUD and the lifecycle-governed completion boundary. */\nexport function registerTaskRoutes(app: FastifyInstance): void {\n app.get(\"/api/tasks\", tasksController.listTasks);\n app.get(\"/api/tasks/:id\", tasksController.getTask);\n app.post(\"/api/tasks\", tasksController.createTask);\n app.put(\"/api/tasks/:id\", tasksController.updateTask);\n app.patch(\"/api/tasks/:id\", tasksController.updateTask);\n app.delete(\"/api/tasks/:id\", tasksController.deleteTask);\n app.patch(\"/api/tasks/:id/complete\", tasksController.completeTask);\n app.get(\"/api/tasks/:id/work-items\", tasksController.listTaskWorkItems);\n}\n","import { FastifyInstance } from \"fastify\";\nimport { ScheduledTaskStatus } from \"@axiom-lattice/protocols\";\nimport * as assistantController from \"../controllers/assistant\";\nimport * as runController from \"../controllers/run\";\nimport * as memoryController from \"../controllers/memory\";\nimport * as graphController from \"../controllers/assistant\";\nimport * as agentTaskController from \"../controllers/agent_task\";\nimport * as threadsController from \"../controllers/threads\";\nimport * as schedulesController from \"../controllers/schedules\";\nimport * as configController from \"../controllers/config\";\nimport * as modelsController from \"../controllers/models\";\nimport * as healthController from \"../controllers/health\";\nimport * as skillsController from \"../controllers/skills\";\nimport * as collectionController from \"../controllers/collections\";\nimport * as embeddingsController from \"../controllers/embeddings\";\nimport * as entriesController from \"../controllers/entries\";\nimport * as toolsController from \"../controllers/tools\";\nimport * as dataQueryController from \"../controllers/data-query\";\nimport * as workflowTrackingController from \"../controllers/workflow-tracking\";\nimport * as paController from \"../controllers/personal-assistant\";\nimport * as exportImportController from \"../controllers/export-import\";\nimport { middlewareTypesRoutes } from \"../controllers/middleware-types\";\nimport {\n createRunSchema,\n getAllMemoryItemsSchema,\n getAgentStateSchema,\n getMemoryItemSchema,\n setMemoryItemSchema,\n deleteMemoryItemSchema,\n clearMemorySchema,\n getAgentGraphSchema,\n resumeStreamSchema,\n triggerAgentTaskSchema,\n updateConfigSchema,\n getConfigSchema,\n getHealthSchema,\n getSandboxUrlSchema,\n dataQuerySchema,\n} from \"../schemas\";\nimport { removePendingMessageHandler } from \"../controllers/thread_status\";\nimport { registerSandboxProxyRoutes } from \"../controllers/sandbox\";\nimport { registerWorkspaceRoutes } from \"../controllers/workspace\";\nimport { registerDatabaseConfigRoutes } from \"../controllers/database-configs\";\nimport { registerMetricsServerConfigRoutes } from \"../controllers/metrics-configs\";\nimport { connectionRoutes } from \"../controllers/connections\";\nimport { registerMcpServerConfigRoutes } from \"../controllers/mcp-configs\";\nimport { registerEvalRoutes } from \"../controllers/eval\";\nimport { registerUserRoutes } from \"../controllers/users\";\nimport { registerTenantRoutes } from \"../controllers/tenants\";\nimport { registerAuthRoutes, resolveConsoleTokenSecret } from \"../controllers/auth\";\nimport { registerChannelRoutes } from \"../channels/routes\";\nimport { registerChannelInstallationRoutes } from \"./channel-installations\";\nimport { registerChannelBindingRoutes } from \"./channel-bindings\";\nimport { registerMenuItemRoutes } from \"./menu-items\";\nimport type { MessageRouter } from \"../router/MessageRouter\";\nimport type { ChannelInstallationStore } from \"@axiom-lattice/protocols\";\n// import {\n// getThreadStatusHandler,\n// getAgentThreadsHandler,\n// getActiveThreadsHandler,\n// addMessageHandler,\n// removeMessageHandler,\n// updateQueueConfigHandler,\n// } from \"../controllers/thread_status\";\n\nimport { registerA2ABridgeRoutes } from './a2a-bridge';\nimport { registerSTTRoutes } from './stt';\nimport {\n getLocalA2AProvider,\n getLocalA2AStatus,\n restartLocalA2AProvider,\n startLocalA2AProvider,\n stopLocalA2AProvider,\n} from \"../controllers/local-a2a\";\nimport {\n getLocalA2ATemplates,\n} from \"../controllers/local-a2a-templates\";\nimport { registerA2ATestConnectionRoute } from \"./a2a-test-connection\";\nimport { registerTaskRoutes } from \"./task-routes\";\n\nexport const registerLatticeRoutes = (app: FastifyInstance, channelDeps?: { router: MessageRouter; installationStore: ChannelInstallationStore }): void => {\n // A2A Bridge — WebSocket-based reverse proxy for agents behind NAT\n registerA2ABridgeRoutes(app);\n\n // STT (speech-to-text) transcription\n registerSTTRoutes(app);\n\n // Local A2A runtime management\n app.get(\"/api/local-a2a\", getLocalA2AStatus);\n\n app.get(\"/api/local-a2a/templates\", getLocalA2ATemplates);\n\n app.get(\"/api/local-a2a/:assistantId\", getLocalA2AProvider);\n app.post(\"/api/local-a2a/:assistantId/start\", startLocalA2AProvider);\n app.post(\"/api/local-a2a/:assistantId/stop\", stopLocalA2AProvider);\n app.post(\"/api/local-a2a/:assistantId/restart\", restartLocalA2AProvider);\n\n registerA2ATestConnectionRoute(app);\n\n // 运行路由\n app.post<{\n Body: any;\n }>(\"/api/runs\", runController.createRun);\n\n // Resume stream route\n app.post<{\n Body: any;\n }>(\"/api/resume_stream\", runController.resumeStream);\n\n // Abort agent execution for a thread\n app.post<{\n Params: { assistantId: string; threadId: string };\n }>(\"/api/assistants/:assistantId/threads/:threadId/abort\", runController.abortRun);\n\n // Recover agent execution after a crash or manual abort\n app.post<{\n Params: { assistantId: string; threadId: string };\n }>(\"/api/assistants/:assistantId/threads/:threadId/recover\", runController.recoverRun);\n\n // app.get<{\n // Params: { id: string };\n // }>(\"/api/runs/:id\", runController.getRun);\n\n // app.get<{\n // Params: { assistantId: string };\n // }>(\"/api/assistants/:assistantId/runs\", runController.getRunsByAssistant);\n\n // app.post<{\n // Params: { id: string };\n // }>(\"/api/runs/:id/cancel\", runController.cancelRun);\n\n // 内存路由\n app.get<{\n Params: { assistantId: string; thread_id: string };\n }>(\n \"/api/assistants/:assistantId/:thread_id/memory\",\n { schema: getAllMemoryItemsSchema },\n memoryController.getAllMemoryItems\n );\n\n app.get<{\n Params: { assistantId: string; thread_id: string };\n }>(\n \"/api/assistants/:assistantId/:thread_id/state\",\n { schema: getAgentStateSchema },\n memoryController.getAgentState\n );\n\n app.get<{\n Params: { assistantId: string; key: string };\n }>(\n \"/api/assistants/:assistantId/memory/:key\",\n { schema: getMemoryItemSchema },\n memoryController.getMemoryItem\n );\n\n app.put<{\n Params: { assistantId: string; key: string };\n Body: any;\n }>(\n \"/api/assistants/:assistantId/memory/:key\",\n { schema: setMemoryItemSchema },\n memoryController.setMemoryItem\n );\n\n app.delete<{\n Params: { assistantId: string; key: string };\n }>(\n \"/api/assistants/:assistantId/memory/:key\",\n { schema: deleteMemoryItemSchema },\n memoryController.deleteMemoryItem\n );\n\n app.delete<{\n Params: { assistantId: string };\n }>(\n \"/api/assistants/:assistantId/memory\",\n { schema: clearMemorySchema },\n memoryController.clearMemory\n );\n\n // Assistant CRUD routes\n app.get(\"/api/assistants\", assistantController.getAssistantList);\n\n // Aggregate stats (must be registered before /:id so \"stats\" isn't captured)\n app.get(\"/api/assistants/stats\", assistantController.getAssistantStats);\n\n app.get<{\n Params: { id: string };\n }>(\"/api/assistants/:id\", assistantController.getAssistant);\n\n app.post<{\n Body: any;\n }>(\"/api/assistants\", assistantController.createAssistant);\n\n app.put<{\n Params: { id: string };\n Body: any;\n }>(\"/api/assistants/:id\", assistantController.updateAssistant);\n\n app.delete<{\n Params: { id: string };\n }>(\"/api/assistants/:id\", assistantController.deleteAssistant);\n\n // Personal Assistant routes\n app.post<{ Body: any }>(\"/api/personal-assistant\", paController.createPersonalAssistant);\n app.get(\"/api/personal-assistant\", paController.getPersonalAssistant);\n app.delete(\"/api/personal-assistant\", paController.deletePersonalAssistant);\n\n registerTaskRoutes(app);\n\n // 图表路由\n app.get<{\n Params: { assistantId: string };\n }>(\n \"/api/assistants/:assistantId/graph\",\n { schema: getAgentGraphSchema },\n graphController.getAgentGraph\n );\n\n // Agent Task路由\n app.post<{\n Body: any;\n }>(\n \"/api/agent-tasks/trigger\",\n { schema: triggerAgentTaskSchema },\n agentTaskController.triggerAgentTask\n );\n\n // Thread CRUD routes for a specific assistant\n app.get<{\n Params: { assistantId: string };\n }>(\"/api/assistants/:assistantId/threads\", threadsController.getThreadList);\n\n app.get<{\n Params: { assistantId: string; threadId: string };\n }>(\n \"/api/assistants/:assistantId/threads/:threadId\",\n threadsController.getThread\n );\n\n app.post<{\n Params: { assistantId: string };\n Body: any;\n }>(\"/api/assistants/:assistantId/threads\", threadsController.createThread);\n\n app.put<{\n Params: { assistantId: string; threadId: string };\n Body: any;\n }>(\n \"/api/assistants/:assistantId/threads/:threadId\",\n threadsController.updateThread\n );\n\n app.delete<{\n Params: { assistantId: string; threadId: string };\n }>(\n \"/api/assistants/:assistantId/threads/:threadId\",\n threadsController.deleteThread\n );\n\n // Configuration routes\n app.get(\n \"/api/config\",\n { schema: getConfigSchema },\n configController.getConfig\n );\n\n app.put<{\n Body: { config: Record<string, any> };\n }>(\n \"/api/config\",\n { schema: updateConfigSchema },\n configController.updateConfig\n );\n\n // Models routes\n app.get(\"/api/models\", modelsController.getModels);\n\n app.put<{\n Body: { models: any[] };\n }>(\"/api/models\", modelsController.updateModels);\n\n // Tools config meta route\n app.get(\"/api/tools\", toolsController.getToolConfigs);\n\n // Health check route\n app.get(\n \"/health\",\n { schema: getHealthSchema },\n healthController.getHealth\n );\n\n // Schedule routes for viewing scheduled tasks by thread\n app.get<{\n Params: { assistantId: string; threadId: string };\n Querystring: {\n status?: ScheduledTaskStatus;\n limit?: string;\n offset?: string;\n };\n }>(\n \"/api/assistants/:assistantId/threads/:threadId/schedules\",\n schedulesController.getThreadSchedules\n );\n\n // Get a specific scheduled task\n app.get<{\n Params: { taskId: string };\n }>(\"/api/schedules/:taskId\", schedulesController.getScheduledTask);\n\n // Cancel a scheduled task\n app.post<{\n Params: { taskId: string };\n }>(\"/api/schedules/:taskId/cancel\", schedulesController.cancelScheduledTask);\n\n // Pause a scheduled cron task\n app.post<{\n Params: { taskId: string };\n }>(\"/api/schedules/:taskId/pause\", schedulesController.pauseScheduledTask);\n\n // Resume a paused cron task\n app.post<{\n Params: { taskId: string };\n }>(\"/api/schedules/:taskId/resume\", schedulesController.resumeScheduledTask);\n\n // Skills CRUD routes\n app.get(\"/api/skills\", skillsController.getSkillList);\n\n app.get<{\n Params: { id: string };\n }>(\n \"/api/skills/:id\",\n skillsController.getSkill\n );\n\n app.post<{\n Body: any;\n }>(\n \"/api/skills\",\n skillsController.createSkill\n );\n\n app.put<{\n Params: { id: string };\n Body: any;\n }>(\n \"/api/skills/:id\",\n skillsController.updateSkill\n );\n\n app.delete<{\n Params: { id: string };\n }>(\n \"/api/skills/:id\",\n skillsController.deleteSkill\n );\n\n // Skills search and filter routes\n app.get<{\n Querystring: { key: string; value: string };\n }>(\n \"/api/skills/search/metadata\",\n skillsController.searchSkillsByMetadata\n );\n\n app.get<{\n Querystring: { compatibility: string };\n }>(\n \"/api/skills/filter/compatibility\",\n skillsController.filterSkillsByCompatibility\n );\n\n app.get<{\n Querystring: { license: string };\n }>(\n \"/api/skills/filter/license\",\n skillsController.filterSkillsByLicense\n );\n\n // Collections CRUD routes\n app.get(\"/api/collections\", collectionController.getCollectionList);\n\n app.get<{\n Params: { name: string };\n }>(\"/api/collections/:name\", collectionController.getCollection);\n\n app.post<{\n Body: any;\n }>(\"/api/collections\", collectionController.createCollection);\n\n app.put<{\n Params: { name: string };\n Body: any;\n }>(\"/api/collections/:name\", collectionController.updateCollection);\n\n app.delete<{\n Params: { name: string };\n }>(\"/api/collections/:name\", collectionController.deleteCollection);\n\n // Embeddings route\n app.get(\"/api/embeddings\", embeddingsController.listEmbeddings);\n\n // Collection entries routes\n app.get<{\n Params: { name: string };\n }>(\"/api/collections/:name/entries\", entriesController.listEntries);\n\n app.post<{\n Params: { name: string };\n Body: any;\n }>(\"/api/collections/:name/entries\", entriesController.createEntry);\n\n app.get<{\n Params: { name: string; id: string };\n }>(\"/api/collections/:name/entries/:id\", entriesController.getEntry);\n\n app.put<{\n Params: { name: string; id: string };\n Body: any;\n }>(\"/api/collections/:name/entries/:id\", entriesController.updateEntry);\n\n app.delete<{\n Params: { name: string; id: string };\n }>(\"/api/collections/:name/entries/:id\", entriesController.deleteEntry);\n\n app.post<{\n Params: { name: string };\n Body: any;\n }>(\"/api/collections/:name/search\", entriesController.searchEntries);\n\n registerSandboxProxyRoutes(app);\n\n registerEvalRoutes(app);\n\n registerWorkspaceRoutes(app);\n\n registerDatabaseConfigRoutes(app);\n\n registerMetricsServerConfigRoutes(app);\n\n connectionRoutes(app);\n\n // Plugin middleware types discovery\n middlewareTypesRoutes(app);\n\n // Data query route\n app.post<{\n Body: any;\n }>(\n \"/api/data/query\",\n { schema: dataQuerySchema },\n dataQueryController.executeDataQuery\n );\n\n registerMcpServerConfigRoutes(app);\n\n registerUserRoutes(app);\n\n registerTenantRoutes(app);\n\n registerAuthRoutes(app, {\n autoApproveUsers: process.env.AUTO_APPROVE_USERS !== \"false\",\n allowTenantRegistration: process.env.ALLOW_TENANT_REGISTRATION !== \"false\",\n jwtSecret: resolveConsoleTokenSecret(process.env.AUTH_REQUIRED === \"true\"),\n });\n\n registerChannelRoutes(app, channelDeps);\n\n registerChannelInstallationRoutes(app);\n\n registerMenuItemRoutes(app);\n\n if (channelDeps) {\n registerChannelBindingRoutes(app);\n }\n\n // Direct inbound message dispatch\n if (channelDeps?.router) {\n app.post(\"/api/channels/inbound\", async (request, reply) => {\n try {\n const router = channelDeps.router;\n const msg = request.body as Record<string, unknown>;\n\n if (!msg.channel || !msg.sender || !msg.content) {\n reply.status(400).send({\n success: false,\n message: \"Missing required fields: channel, sender, content\",\n });\n return;\n }\n\n const inboundMessage = {\n channel: msg.channel as string,\n channelInstallationId: (msg.channelInstallationId || \"\") as string,\n tenantId: msg.tenantId as string | undefined,\n sender: {\n id: (msg.sender as Record<string, unknown>).id as string,\n displayName: (msg.sender as Record<string, unknown>).displayName as string | undefined,\n },\n content: {\n text: (msg.content as Record<string, unknown>).text as string,\n metadata: (msg.content as Record<string, unknown>).metadata as Record<string, unknown> | undefined,\n },\n conversation: msg.conversation as { id: string; type: string } | undefined,\n replyTarget: msg.replyTarget as Record<string, unknown> | undefined,\n } as Parameters<typeof router.dispatch>[0];\n\n await router.dispatch(inboundMessage).catch((error) => {\n console.error(JSON.stringify({\n event: \"inbound:dispatch_error\",\n error: error instanceof Error ? error.message : String(error),\n channel: inboundMessage.channel,\n senderId: inboundMessage.sender.id,\n }));\n });\n\n reply.status(200).send({ accepted: true });\n } catch (error) {\n console.error(\"Inbound route error:\", error);\n reply.status(500).send({ success: false, message: \"Internal error\" });\n }\n });\n }\n\n // Workflow tracking routes\n app.get(\n \"/api/workflows/definitions\",\n workflowTrackingController.getAllWorkflowDefinitions\n );\n\n app.get<{\n Querystring: { assistantId?: string; status?: string };\n }>(\n \"/api/workflows/runs\",\n workflowTrackingController.getAllWorkflowRuns\n );\n\n app.get<{\n Querystring: { page?: string; pageSize?: string };\n }>(\n \"/api/workflows/inbox\",\n workflowTrackingController.getInboxItems\n );\n\n app.get<{\n Params: { assistantId: string };\n }>(\n \"/api/assistants/:assistantId/workflows/definitions\",\n workflowTrackingController.getWorkflowDefinitions\n );\n\n app.get<{\n Params: { assistantId: string; threadId: string };\n }>(\n \"/api/assistants/:assistantId/threads/:threadId/workflows/runs\",\n workflowTrackingController.getWorkflowRuns\n );\n\n app.get<{\n Params: { runId: string };\n }>(\"/api/workflows/runs/:runId\", workflowTrackingController.getWorkflowRun);\n\n app.delete<{\n Params: { runId: string };\n }>(\"/api/workflows/runs/:runId\", workflowTrackingController.deleteWorkflowRun);\n\n app.get<{\n Params: { runId: string };\n Querystring: { step_type?: string; status?: string };\n }>(\"/api/workflows/runs/:runId/steps\", workflowTrackingController.getRunSteps);\n\n app.get<{\n Params: { runId: string };\n }>(\"/api/workflows/runs/:runId/tasks\", workflowTrackingController.getRunTasks);\n\n // Abort a running workflow — stops graph + all sub-agents\n app.post<{\n Params: { runId: string };\n }>(\"/api/workflows/runs/:runId/abort\", workflowTrackingController.abortWorkflowRun);\n\n // 简化的 Inbox 任务回复接口(后台 streaming 执行,立即返回)\n app.post<{\n Body: { runId: string; answers: Array<{ questionIndex: number; selectedOptions: string[] }> };\n }>(\"/api/workflows/inbox/reply\", workflowTrackingController.replyInboxTask);\n\n // // Thread 状态查询路由\n // app.get(\"/api/threads/:thread_id/status\", getThreadStatusHandler);\n // app.get(\"/api/assistants/:assistant_id/threads/status\", getAgentThreadsHandler);\n // app.get(\"/api/threads/active\", getActiveThreadsHandler);\n\n // // Thread 消息队列路由\n // app.post(\"/api/threads/:thread_id/messages\", addMessageHandler);\n // app.delete(\"/api/threads/:thread_id/messages/:message_id\", removeMessageHandler);\n // app.put(\"/api/threads/:thread_id/queue-config\", updateQueueConfigHandler);\n\n // Delete pending message route\n app.delete<{\n Params: { assistant_id: string; thread_id: string; message_id: string };\n }>(\n \"/api/assistants/:assistant_id/threads/:thread_id/pending-messages/:message_id\",\n removePendingMessageHandler\n );\n\n // Export/Import endpoints\n app.get(\"/api/tenants/exportable-types\", exportImportController.getExportableTypes);\n\n app.post<{ Params: { tenantId: string }; Body: { entityTypes: string[]; entityIds?: Record<string, string[]> } }>(\n \"/api/tenants/:tenantId/export\",\n exportImportController.exportConfig,\n );\n\n app.post<{ Params: { tenantId: string }; Body: { entityTypes: string[]; entityIds?: Record<string, string[]> } }>(\n \"/api/tenants/:tenantId/export/confirm\",\n exportImportController.exportConfigConfirm,\n );\n\n app.post<{ Params: { tenantId: string }; Body: { entityTypes: string[] } }>(\n \"/api/tenants/:tenantId/export/entities\",\n exportImportController.previewEntities,\n );\n\n app.get<{ Params: { tenantId: string; jobId: string } }>(\n \"/api/tenants/:tenantId/export/:jobId/download\",\n exportImportController.downloadExport,\n );\n\n app.post<{ Params: { tenantId: string }; Body: { bundle?: unknown; resolutions?: unknown } }>(\n \"/api/tenants/:tenantId/import/preview\",\n exportImportController.importPreview,\n );\n\n app.post<{ Params: { tenantId: string }; Body: { bundle?: unknown; resolutions?: unknown } }>(\n \"/api/tenants/:tenantId/import/apply\",\n exportImportController.importApply,\n );\n};\n","import { FastifyInstance } from \"fastify\";\nimport { ResourceController } from \"../controllers/resources\";\n\nexport function registerResourceRoutes(\n app: FastifyInstance,\n controller: ResourceController\n) {\n // Public share access — MUST be before /api/** wildcard routes\n app.get(\"/s/:token\", controller.resolveResource.bind(controller));\n app.get(\"/s/:token/*\", controller.resolveResource.bind(controller));\n app.post(\"/s/:token/*\", controller.resolveResource.bind(controller));\n app.put(\"/s/:token/*\", controller.resolveResource.bind(controller));\n app.delete(\"/s/:token/*\", controller.resolveResource.bind(controller));\n app.post(\"/s/:token/unlock\", controller.unlockShare.bind(controller));\n app.options(\"/s/:token\", async (_req, reply) => {\n reply.header(\"Access-Control-Allow-Origin\", \"*\");\n reply.header(\"Access-Control-Allow-Methods\", \"GET, OPTIONS, POST\");\n reply.header(\"Access-Control-Allow-Headers\", \"Content-Type\");\n return reply.status(204).send();\n });\n\n // Internal file access: /f/{tenant}/{workspace}/{project}/*\n const dirFile = controller.resolveDirectFile.bind(controller);\n app.get(\"/f/:tid/:wid/:pid\", dirFile);\n app.get(\"/f/:tid/:wid/:pid/*\", dirFile);\n app.post(\"/f/:tid/:wid/:pid/*\", dirFile);\n app.put(\"/f/:tid/:wid/:pid/*\", dirFile);\n app.delete(\"/f/:tid/:wid/:pid/*\", dirFile);\n\n // Management API\n app.post(\"/api/resources/share\", controller.createShare.bind(controller));\n app.get(\"/api/resources/shares\", controller.listShares.bind(controller));\n app.patch(\"/api/resources/share/:token\", controller.updateShare.bind(controller));\n app.delete(\"/api/resources/share/:token\", controller.revokeShare.bind(controller));\n}\n","import { ExportableEntityRegistry } from '@axiom-lattice/core';\nimport { skillRegistration } from './skill.registration';\nimport { agentRegistration } from './agent.registration';\nimport { databaseConfigRegistration } from './database-config.registration';\nimport { metricsConfigRegistration } from './metrics-config.registration';\nimport { mcpConfigRegistration } from './mcp-config.registration';\nimport { connectionRegistration } from './connection.registration';\nimport { collectionRegistration } from './collection.registration';\nimport { channelInstallationRegistration } from './channel-installation.registration';\nimport { menuRegistration } from './menu.registration';\nimport { evalRegistration } from './eval.registration';\n\nexport function registerAllBuiltinEntities(): void {\n const registry = ExportableEntityRegistry.getInstance();\n registry.register(skillRegistration);\n registry.register(agentRegistration);\n registry.register(databaseConfigRegistration);\n registry.register(metricsConfigRegistration);\n registry.register(mcpConfigRegistration);\n registry.register(connectionRegistration);\n registry.register(collectionRegistration);\n registry.register(channelInstallationRegistration);\n registry.register(menuRegistration);\n registry.register(evalRegistration);\n}\n","import type { ExportableEntityDefinition, ExportableEntity, ExportableFile, ImportPreviewResult, ExportContext } from '@axiom-lattice/core';\nimport { SandboxSkillStore, isBuiltInSkill } from '@axiom-lattice/core';\nimport type { SkillStoreContext } from '@axiom-lattice/protocols';\n\n/**\n * Skill export/import uses the SandboxSkillStore — the same store the runtime\n * uses (per-project sandbox volume at /root/.agents/skills/). This matches how\n * agents, tools, and the skill middleware load skills, NOT the local filesystem\n * default (FileSystemSkillStore → lattice_store/skills/).\n */\nfunction getStore(context?: ExportContext): SandboxSkillStore {\n return new SandboxSkillStore({\n workspaceId: context?.workspaceId,\n projectId: context?.projectId,\n });\n}\n\nfunction toStoreContext(context?: ExportContext): SkillStoreContext | undefined {\n if (!context) return undefined;\n return { workspaceId: context.workspaceId, projectId: context.projectId };\n}\n\nexport const skillRegistration: ExportableEntityDefinition = {\n entityType: 'skill',\n label: 'Skill(技能)',\n category: 'core',\n dependsOn: [],\n cascadeParents: [],\n\n async listForExport(tenantId: string, context?: ExportContext): Promise<ExportableEntity[]> {\n const store = getStore(context);\n const skills = await store.getAllSkills(tenantId, toStoreContext(context));\n return skills.filter((s) => !isBuiltInSkill(s.id)).map((s) => ({\n _exportId: '',\n data: {\n id: s.id,\n name: s.name,\n description: s.description,\n license: s.license,\n compatibility: s.compatibility,\n metadata: s.metadata,\n content: s.content,\n subSkills: s.subSkills,\n },\n }));\n },\n\n async getReferencedEntityIds(_tenantId, entities) {\n const subSkillIds = new Set<string>();\n for (const entity of entities) {\n const subSkills = entity.data.subSkills;\n if (!Array.isArray(subSkills)) continue;\n for (const id of subSkills) {\n if (typeof id === 'string' && id) subSkillIds.add(id);\n }\n }\n return { skill: [...subSkillIds] };\n },\n\n async listFilesForExport(\n tenantId: string,\n entities: ExportableEntity[],\n context?: ExportContext,\n ): Promise<ExportableFile[]> {\n const store = getStore(context);\n const ctx = toStoreContext(context);\n const files: ExportableFile[] = [];\n\n for (const entity of entities) {\n const skillId = entity.data.id as string;\n if (!skillId) continue;\n\n // Metadata remains authoritative in bundle.json; this entry carries the parsed body.\n const content = entity.data.content as string | undefined;\n files.push({\n entityId: skillId,\n path: 'SKILL.md',\n content: Buffer.from(content ?? '', 'utf-8'),\n });\n\n // Bundle resources/ (scripts, references, assets)\n try {\n const resources = await store.listSkillResources?.(tenantId, skillId, ctx);\n if (resources) {\n for (const resourcePath of resources) {\n const resourceContent = typeof store.loadSkillResourceRaw === 'function'\n ? await store.loadSkillResourceRaw(tenantId, skillId, resourcePath, ctx)\n : await store.loadSkillResource?.(tenantId, skillId, resourcePath, ctx);\n if (resourceContent !== null && resourceContent !== undefined) {\n files.push({\n entityId: skillId,\n path: `resources/${resourcePath}`,\n content: Buffer.isBuffer(resourceContent) ? resourceContent : Buffer.from(resourceContent, 'utf-8'),\n });\n }\n }\n }\n } catch {\n // Store does not support resources — skip\n }\n }\n\n return files;\n },\n\n async previewImport(\n tenantId: string,\n entities: ExportableEntity[],\n context?: ExportContext,\n ): Promise<ImportPreviewResult> {\n const store = getStore(context);\n const existing = await store.getAllSkills(tenantId, toStoreContext(context));\n const existingIds = new Set(existing.map((s) => s.id));\n\n const conflicts: ImportPreviewResult['conflicts'] = [];\n const insertions: ImportPreviewResult['insertions'] = [];\n\n for (const entity of entities) {\n const id = entity.data.id as string;\n if (isBuiltInSkill(id)) continue;\n if (existingIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'skill',\n conflictType: 'id_exists',\n existingId: id,\n existingName: (entity.data.name as string) || id,\n });\n } else {\n insertions.push({\n _exportId: entity._exportId,\n entityType: 'skill',\n name: (entity.data.name as string) || id,\n });\n }\n }\n\n return { conflicts, insertions, errors: [] };\n },\n\n async applyImport(tenantId, entity, resolution, files, context) {\n const store = getStore(context);\n const ctx = toStoreContext(context);\n const data = entity.data as Record<string, unknown>;\n const originalName = data.name as string;\n const targetName = resolution.action === 'rename' ? resolution.newId : originalName;\n if (typeof targetName !== 'string' || targetName.trim().length === 0) {\n throw new Error('Skill import target name must not be empty');\n }\n\n await store.createSkill(tenantId, targetName, {\n name: targetName,\n description: data.description as string,\n license: data.license as string | undefined,\n compatibility: data.compatibility as string | undefined,\n metadata: data.metadata as Record<string, string> | undefined,\n content: data.content as string | undefined,\n subSkills: data.subSkills as string[] | undefined,\n }, ctx);\n\n // Write bundled files (SKILL.md, resources) back to the skill directory\n if (files && files.size > 0) {\n for (const [relPath, content] of files.entries()) {\n if (relPath === 'SKILL.md') {\n // SKILL.md body is already written via createSkill above.\n // If bundled content differs, update via the store's update method.\n const fileContent = content.toString('utf-8');\n if (fileContent !== data.content && typeof store.updateSkill === 'function') {\n await store.updateSkill(tenantId, targetName, { content: fileContent }, ctx);\n }\n } else if (relPath.startsWith('resources/')) {\n const resourcePath = relPath.slice('resources/'.length);\n if (typeof store.writeSkillResourceRaw === 'function') {\n await store.writeSkillResourceRaw(tenantId, targetName, resourcePath, content, ctx);\n } else if (typeof store.writeSkillResource === 'function') {\n await store.writeSkillResource(tenantId, targetName, resourcePath, content.toString('utf-8'), ctx);\n }\n }\n }\n }\n\n return { newId: targetName };\n },\n};\n","import type { ExportableEntityDefinition, ExportableEntity, ImportPreviewResult } from '@axiom-lattice/core';\nimport { getStoreLattice } from '@axiom-lattice/core';\nimport type { AssistantStore } from '@axiom-lattice/protocols';\n\nfunction getStore(): AssistantStore {\n return getStoreLattice('default', 'assistant').store as unknown as AssistantStore;\n}\n\nexport const agentRegistration: ExportableEntityDefinition = {\n entityType: 'agent',\n label: 'Agent(智能体)',\n category: 'core',\n dependsOn: ['skill'],\n cascadeParents: [],\n\n async listForExport(tenantId: string): Promise<ExportableEntity[]> {\n const store = getStore();\n const agents = await store.getAllAssistants(tenantId);\n return agents.map((a) => ({\n _exportId: '',\n data: {\n id: a.id,\n name: a.name,\n description: a.description,\n graphDefinition: a.graphDefinition,\n },\n }));\n },\n\n async getReferencedEntityIds(_tenantId, entities) {\n const skillIds = new Set<string>();\n for (const entity of entities) {\n const graphDefinition = entity.data.graphDefinition;\n if (!graphDefinition || typeof graphDefinition !== 'object') continue;\n const ids = (graphDefinition as Record<string, unknown>).skillIds;\n if (!Array.isArray(ids)) continue;\n for (const id of ids) {\n if (typeof id === 'string' && id) skillIds.add(id);\n }\n }\n return { skill: [...skillIds] };\n },\n\n async previewImport(\n tenantId: string,\n entities: ExportableEntity[],\n ): Promise<ImportPreviewResult> {\n const store = getStore();\n const existing = await store.getAllAssistants(tenantId);\n const existingIds = new Set(existing.map((a) => a.id));\n\n const conflicts: ImportPreviewResult['conflicts'] = [];\n const insertions: ImportPreviewResult['insertions'] = [];\n\n for (const entity of entities) {\n const id = entity.data.id as string;\n if (existingIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'agent',\n conflictType: 'id_exists',\n existingId: id,\n existingName: (entity.data.name as string) || id,\n });\n } else {\n insertions.push({\n _exportId: entity._exportId,\n entityType: 'agent',\n name: (entity.data.name as string) || id,\n });\n }\n }\n\n return { conflicts, insertions, errors: [] };\n },\n\n async applyImport(tenantId, entity, resolution) {\n const store = getStore();\n const data = entity.data as Record<string, unknown>;\n const id = resolution.action === 'rename' && resolution.newId ? resolution.newId : data.id as string;\n\n if (resolution.action === 'overwrite') {\n try { await store.deleteAssistant(tenantId, id); } catch { /* may not exist */ }\n }\n\n await store.createAssistant(tenantId, id, {\n name: data.name as string,\n description: (data.description as string) || '',\n graphDefinition: data.graphDefinition as Record<string, unknown>,\n });\n\n return { newId: id };\n },\n};\n","import type { ExportableEntityDefinition, ExportableEntity, ImportPreviewResult } from '@axiom-lattice/core';\nimport { getStoreLattice } from '@axiom-lattice/core';\nimport type { DatabaseConfigStore } from '@axiom-lattice/protocols';\n\nfunction getStore(): DatabaseConfigStore {\n return getStoreLattice('default', 'database').store as unknown as DatabaseConfigStore;\n}\n\nexport const databaseConfigRegistration: ExportableEntityDefinition = {\n entityType: 'database_config',\n label: 'Database Config(数据库配置)',\n category: 'core',\n dependsOn: [],\n cascadeParents: [],\n\n async listForExport(tenantId: string): Promise<ExportableEntity[]> {\n const store = getStore();\n const configs = await store.getAllConfigs(tenantId);\n return configs.map((c) => ({\n _exportId: '',\n data: {\n id: c.id,\n key: c.key,\n name: c.name,\n description: c.description,\n config: c.config,\n },\n }));\n },\n\n async previewImport(\n tenantId: string,\n entities: ExportableEntity[],\n ): Promise<ImportPreviewResult> {\n const store = getStore();\n const existing = await store.getAllConfigs(tenantId);\n const existingIds = new Set(existing.map((c) => c.id));\n const existingKeys = new Set(existing.map((c) => c.key));\n\n const conflicts: ImportPreviewResult['conflicts'] = [];\n const insertions: ImportPreviewResult['insertions'] = [];\n\n for (const entity of entities) {\n const d = entity.data as Record<string, unknown>;\n const id = d.id as string;\n const key = d.key as string;\n\n if (existingIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'database_config',\n conflictType: 'id_exists',\n existingId: id,\n existingName: (d.name as string) || key,\n });\n } else if (key && existingKeys.has(key)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'database_config',\n conflictType: 'unique_constraint',\n existingName: (d.name as string) || key,\n field: 'key',\n });\n } else {\n insertions.push({\n _exportId: entity._exportId,\n entityType: 'database_config',\n name: (d.name as string) || key,\n });\n }\n }\n\n return { conflicts, insertions, errors: [] };\n },\n\n async applyImport(tenantId, entity, resolution) {\n const store = getStore();\n const data = entity.data as Record<string, unknown>;\n const id = resolution.action === 'rename' && resolution.newId ? resolution.newId : data.id as string;\n\n if (resolution.action === 'overwrite') {\n try { await store.deleteConfig(tenantId, id); } catch { /* may not exist */ }\n }\n\n await store.createConfig(tenantId, id, {\n key: data.key as string,\n name: data.name as string | undefined,\n description: data.description as string | undefined,\n config: data.config as any,\n });\n\n return { newId: id };\n },\n};\n","import type { ExportableEntityDefinition, ExportableEntity, ImportPreviewResult } from '@axiom-lattice/core';\nimport { getStoreLattice } from '@axiom-lattice/core';\nimport type { MetricsServerConfigStore } from '@axiom-lattice/protocols';\n\nfunction getStore(): MetricsServerConfigStore {\n return getStoreLattice('default', 'metrics').store as unknown as MetricsServerConfigStore;\n}\n\nexport const metricsConfigRegistration: ExportableEntityDefinition = {\n entityType: 'metrics_config',\n label: 'Metrics Config(指标配置)',\n category: 'core',\n dependsOn: [],\n cascadeParents: [],\n\n async listForExport(tenantId: string): Promise<ExportableEntity[]> {\n const store = getStore();\n const configs = await store.getAllConfigs(tenantId);\n return configs.map((c) => ({\n _exportId: '',\n data: {\n id: c.id,\n key: c.key,\n name: c.name,\n description: c.description,\n config: c.config,\n },\n }));\n },\n\n async previewImport(\n tenantId: string,\n entities: ExportableEntity[],\n ): Promise<ImportPreviewResult> {\n const store = getStore();\n const existing = await store.getAllConfigs(tenantId);\n const existingIds = new Set(existing.map((c) => c.id));\n const existingKeys = new Set(existing.map((c) => c.key));\n\n const conflicts: ImportPreviewResult['conflicts'] = [];\n const insertions: ImportPreviewResult['insertions'] = [];\n\n for (const entity of entities) {\n const d = entity.data as Record<string, unknown>;\n const id = d.id as string;\n const key = d.key as string;\n\n if (existingIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'metrics_config',\n conflictType: 'id_exists',\n existingId: id,\n existingName: (d.name as string) || key,\n });\n } else if (key && existingKeys.has(key)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'metrics_config',\n conflictType: 'unique_constraint',\n existingName: (d.name as string) || key,\n field: 'key',\n });\n } else {\n insertions.push({\n _exportId: entity._exportId,\n entityType: 'metrics_config',\n name: (d.name as string) || key,\n });\n }\n }\n\n return { conflicts, insertions, errors: [] };\n },\n\n async applyImport(tenantId, entity, resolution) {\n const store = getStore();\n const data = entity.data as Record<string, unknown>;\n const id = resolution.action === 'rename' && resolution.newId ? resolution.newId : data.id as string;\n\n if (resolution.action === 'overwrite') {\n try { await store.deleteConfig(tenantId, id); } catch { /* may not exist */ }\n }\n\n await store.createConfig(tenantId, id, {\n key: data.key as string,\n name: data.name as string | undefined,\n description: data.description as string | undefined,\n config: data.config as any,\n });\n\n return { newId: id };\n },\n};\n","import type { ExportableEntityDefinition, ExportableEntity, ImportPreviewResult } from '@axiom-lattice/core';\nimport { getStoreLattice } from '@axiom-lattice/core';\nimport type { McpServerConfigStore } from '@axiom-lattice/protocols';\n\nfunction getStore(): McpServerConfigStore {\n return getStoreLattice('default', 'mcp').store as unknown as McpServerConfigStore;\n}\n\nexport const mcpConfigRegistration: ExportableEntityDefinition = {\n entityType: 'mcp_config',\n label: 'MCP Config(MCP配置)',\n category: 'core',\n dependsOn: [],\n cascadeParents: [],\n\n async listForExport(tenantId: string): Promise<ExportableEntity[]> {\n const store = getStore();\n const configs = await store.getAllConfigs(tenantId);\n return configs.map((c) => ({\n _exportId: '',\n data: {\n id: c.id,\n key: c.key,\n name: c.name,\n description: c.description,\n config: c.config,\n selectedTools: c.selectedTools,\n status: c.status,\n },\n }));\n },\n\n async previewImport(\n tenantId: string,\n entities: ExportableEntity[],\n ): Promise<ImportPreviewResult> {\n const store = getStore();\n const existing = await store.getAllConfigs(tenantId);\n const existingIds = new Set(existing.map((c) => c.id));\n const existingKeys = new Set(existing.map((c) => c.key));\n\n const conflicts: ImportPreviewResult['conflicts'] = [];\n const insertions: ImportPreviewResult['insertions'] = [];\n\n for (const entity of entities) {\n const d = entity.data as Record<string, unknown>;\n const id = d.id as string;\n const key = d.key as string;\n\n if (existingIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'mcp_config',\n conflictType: 'id_exists',\n existingId: id,\n existingName: (d.name as string) || key,\n });\n } else if (key && existingKeys.has(key)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'mcp_config',\n conflictType: 'unique_constraint',\n existingName: (d.name as string) || key,\n field: 'key',\n });\n } else {\n insertions.push({\n _exportId: entity._exportId,\n entityType: 'mcp_config',\n name: (d.name as string) || key,\n });\n }\n }\n\n return { conflicts, insertions, errors: [] };\n },\n\n async applyImport(tenantId, entity, resolution) {\n const store = getStore();\n const data = entity.data as Record<string, unknown>;\n const id = resolution.action === 'rename' && resolution.newId ? resolution.newId : data.id as string;\n\n if (resolution.action === 'overwrite') {\n try { await store.deleteConfig(tenantId, id); } catch { /* may not exist */ }\n }\n\n await store.createConfig(tenantId, id, {\n key: data.key as string,\n name: data.name as string | undefined,\n description: data.description as string | undefined,\n config: data.config as any,\n selectedTools: data.selectedTools as string[] | undefined,\n });\n\n return { newId: id };\n },\n};\n","import type { ExportableEntityDefinition, ExportableEntity, ImportPreviewResult } from '@axiom-lattice/core';\nimport { getStoreLattice } from '@axiom-lattice/core';\nimport type { ConnectionEntry, ConnectionStore } from '@axiom-lattice/protocols';\n\nfunction getStore(): ConnectionStore {\n return getStoreLattice('default', 'connection').store as unknown as ConnectionStore;\n}\n\nasync function listAllConnections(tenantId: string): Promise<ConnectionEntry[]> {\n const store = getStore();\n if (typeof store.listByTenant !== 'function') {\n throw new Error('ConnectionStore.listByTenant is not implemented. SQL bypass removed — upgrade your store adapter.');\n }\n return store.listByTenant(tenantId);\n}\n\nexport const connectionRegistration: ExportableEntityDefinition = {\n entityType: 'connection',\n label: 'Connection(连接)',\n category: 'core',\n dependsOn: [],\n cascadeParents: [],\n\n async listForExport(tenantId: string): Promise<ExportableEntity[]> {\n const connections = await listAllConnections(tenantId);\n return connections.map((c) => ({\n _exportId: '',\n data: {\n id: c.id,\n type: c.type,\n key: c.key,\n name: c.name,\n description: c.description,\n config: c.config,\n },\n }));\n },\n\n async previewImport(\n tenantId: string,\n entities: ExportableEntity[],\n ): Promise<ImportPreviewResult> {\n const existing = await listAllConnections(tenantId);\n const existingCompositeKeys = new Set(\n existing.map((c) => `${c.type}:${c.key}`),\n );\n\n const conflicts: ImportPreviewResult['conflicts'] = [];\n const insertions: ImportPreviewResult['insertions'] = [];\n\n for (const entity of entities) {\n const d = entity.data as Record<string, unknown>;\n const compositeKey = `${d.type}:${d.key}`;\n if (existingCompositeKeys.has(compositeKey)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'connection',\n conflictType: 'unique_constraint',\n existingName: `${d.type}:${d.key}`,\n field: 'type+key',\n });\n } else {\n insertions.push({\n _exportId: entity._exportId,\n entityType: 'connection',\n name: `${d.type}:${d.key}`,\n });\n }\n }\n\n return { conflicts, insertions, errors: [] };\n },\n\n async applyImport(tenantId, entity, resolution) {\n if (resolution.action === 'skip') return {};\n\n const store = getStore();\n const d = entity.data as Record<string, unknown>;\n const type = d.type as string;\n const key = d.key as string;\n\n if (resolution.action === 'overwrite') {\n try { await store.delete(tenantId, type, key); } catch { /* may not exist */ }\n }\n\n await store.create({\n tenantId,\n type,\n key,\n name: d.name as string,\n description: d.description as string | undefined,\n config: d.config as Record<string, unknown>,\n });\n\n return { newId: undefined };\n },\n};\n","import type { ExportableEntityDefinition, ExportableEntity, ImportPreviewResult } from '@axiom-lattice/core';\nimport { getStoreLattice } from '@axiom-lattice/core';\nimport type { CollectionStore } from '@axiom-lattice/protocols';\n\nfunction getStore(): CollectionStore {\n return getStoreLattice('default', 'collection').store as unknown as CollectionStore;\n}\n\nexport const collectionRegistration: ExportableEntityDefinition = {\n entityType: 'collection',\n label: 'Collection(知识库)',\n category: 'core',\n dependsOn: [],\n cascadeParents: [],\n\n async listForExport(tenantId: string): Promise<ExportableEntity[]> {\n const store = getStore();\n const collections = await store.getAllCollections(tenantId);\n return collections.map((c) => ({\n _exportId: '',\n data: {\n id: c.id,\n name: c.name,\n label: c.label,\n embeddingKey: c.embeddingKey,\n schema: c.schema,\n },\n }));\n },\n\n async previewImport(\n tenantId: string,\n entities: ExportableEntity[],\n ): Promise<ImportPreviewResult> {\n const store = getStore();\n const existing = await store.getAllCollections(tenantId);\n const existingNames = new Set(existing.map((c) => c.name));\n\n const conflicts: ImportPreviewResult['conflicts'] = [];\n const insertions: ImportPreviewResult['insertions'] = [];\n\n for (const entity of entities) {\n const d = entity.data as Record<string, unknown>;\n const name = d.name as string;\n if (existingNames.has(name)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'collection',\n conflictType: 'unique_constraint',\n existingName: name,\n field: 'name',\n });\n } else {\n insertions.push({\n _exportId: entity._exportId,\n entityType: 'collection',\n name: name,\n });\n }\n }\n\n return { conflicts, insertions, errors: [] };\n },\n\n async applyImport(tenantId, entity, resolution) {\n if (resolution.action === 'skip') return {};\n\n const store = getStore();\n const d = entity.data as Record<string, unknown>;\n const name = d.name as string;\n\n if (resolution.action === 'overwrite') {\n try { await store.deleteCollection(tenantId, name); } catch { /* may not exist */ }\n }\n\n await store.createCollection(tenantId, {\n name,\n label: d.label as string,\n embeddingKey: d.embeddingKey as string,\n schema: d.schema as any,\n });\n\n return { newId: undefined };\n },\n};\n","import type { ExportableEntityDefinition, ExportableEntity, ImportPreviewResult } from '@axiom-lattice/core';\nimport { getStoreLattice } from '@axiom-lattice/core';\nimport type { ChannelInstallationStore, LarkChannelInstallationConfig } from '@axiom-lattice/protocols';\nimport { randomUUID } from 'crypto';\n\nconst UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nfunction getStore(): ChannelInstallationStore {\n return getStoreLattice('default', 'channelInstallation').store as unknown as ChannelInstallationStore;\n}\n\nexport const channelInstallationRegistration: ExportableEntityDefinition = {\n entityType: 'channel_installation',\n label: 'Channel Installation(渠道安装)',\n category: 'core',\n dependsOn: ['agent'],\n cascadeParents: [],\n referenceFields: { fallbackAgentId: 'agent' },\n\n async listForExport(tenantId: string): Promise<ExportableEntity[]> {\n const store = getStore();\n const installations = await store.getInstallationsByTenant(tenantId);\n return installations.map((i) => ({\n _exportId: '',\n data: {\n id: i.id,\n channel: i.channel,\n name: i.name,\n config: i.config,\n enabled: i.enabled,\n fallbackAgentId: i.fallbackAgentId,\n rejectWhenNoBinding: i.rejectWhenNoBinding,\n },\n }));\n },\n\n async previewImport(\n tenantId: string,\n entities: ExportableEntity[],\n ): Promise<ImportPreviewResult> {\n const store = getStore();\n const conflicts: ImportPreviewResult['conflicts'] = [];\n const insertions: ImportPreviewResult['insertions'] = [];\n\n for (const entity of entities) {\n const d = entity.data as Record<string, unknown>;\n const id = d.id as string;\n const existing = UUID_PATTERN.test(id) ? await store.getInstallationById(id) : null;\n if (existing) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'channel_installation',\n conflictType: 'id_exists',\n existingId: id,\n existingName: existing.name || id,\n });\n } else {\n insertions.push({\n _exportId: entity._exportId,\n entityType: 'channel_installation',\n name: (d.name as string) || id,\n });\n }\n }\n\n return { conflicts, insertions, errors: [] };\n },\n\n async applyImport(tenantId, entity, resolution) {\n const store = getStore();\n const data = entity.data as Record<string, unknown>;\n const sourceId = data.id as string;\n const commonData = {\n name: data.name as string | undefined,\n enabled: data.enabled as boolean | undefined,\n fallbackAgentId: data.fallbackAgentId as string | undefined,\n rejectWhenNoBinding: data.rejectWhenNoBinding as boolean | undefined,\n };\n\n if (resolution.action === 'overwrite') {\n const existing = await store.getInstallationById(sourceId);\n if (!existing || !UUID_PATTERN.test(existing.id)) {\n throw new Error('Channel installation overwrite target must be an existing UUID');\n }\n const updated = await store.updateInstallation(tenantId, existing.id, {\n ...commonData,\n config: data.config as Record<string, unknown>,\n });\n if (!updated) {\n throw new Error('Channel installation overwrite target is not available in the target tenant');\n }\n return { newId: existing.id };\n }\n\n let id: string;\n if (resolution.action === 'rename') {\n if (!resolution.newId || !UUID_PATTERN.test(resolution.newId)) {\n throw new Error('Channel installation rename ID must be a valid UUID');\n }\n id = resolution.newId;\n } else if (UUID_PATTERN.test(sourceId)) {\n if (await store.getInstallationById(sourceId)) {\n throw new Error(`Channel installation UUID already exists: ${sourceId}`);\n }\n id = sourceId;\n } else {\n id = randomUUID();\n }\n\n await store.createInstallation(tenantId, id, {\n channel: data.channel as 'lark' | 'email' | 'slack' | 'wechat',\n ...commonData,\n config: data.config as LarkChannelInstallationConfig,\n });\n\n return { newId: id };\n },\n};\n","import type { ExportableEntityDefinition, ExportableEntity, ImportPreviewResult } from '@axiom-lattice/core';\nimport { getStoreLattice } from '@axiom-lattice/core';\nimport type { MenuRegistry } from '@axiom-lattice/protocols';\n\nfunction getStore(): MenuRegistry {\n return getStoreLattice('default', 'menu').store as unknown as MenuRegistry;\n}\n\nexport const menuRegistration: ExportableEntityDefinition = {\n entityType: 'menu',\n label: 'Menu(菜单)',\n category: 'core',\n dependsOn: ['agent'],\n cascadeParents: [],\n\n async listForExport(tenantId: string): Promise<ExportableEntity[]> {\n const store = getStore();\n const menus = await store.list({ tenantId });\n return menus.map((m) => ({\n _exportId: '',\n data: {\n id: m.id,\n menuTarget: m.menuTarget,\n group: m.group,\n name: m.name,\n icon: m.icon,\n sortOrder: m.sortOrder,\n contentType: m.contentType,\n contentConfig: m.contentConfig,\n enabled: m.enabled,\n },\n }));\n },\n\n async previewImport(\n tenantId: string,\n entities: ExportableEntity[],\n ): Promise<ImportPreviewResult> {\n const store = getStore();\n const existing = await store.list({ tenantId });\n const existingIds = new Set(existing.map((m) => m.id));\n\n const conflicts: ImportPreviewResult['conflicts'] = [];\n const insertions: ImportPreviewResult['insertions'] = [];\n\n for (const entity of entities) {\n const d = entity.data as Record<string, unknown>;\n const id = d.id as string;\n if (existingIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'menu',\n conflictType: 'id_exists',\n existingId: id,\n existingName: (d.name as string) || id,\n });\n } else {\n insertions.push({\n _exportId: entity._exportId,\n entityType: 'menu',\n name: (d.name as string) || id,\n });\n }\n }\n\n return { conflicts, insertions, errors: [] };\n },\n\n async applyImport(tenantId, entity, resolution) {\n const store = getStore();\n const d = entity.data as Record<string, unknown>;\n const id = resolution.action === 'rename' && resolution.newId ? resolution.newId : d.id as string;\n\n if (resolution.action === 'overwrite') {\n try { await store.delete(id); } catch { /* may not exist */ }\n }\n\n await store.create({\n tenantId,\n menuTarget: d.menuTarget as 'sidebar' | 'workspace',\n group: d.group as string | undefined,\n name: d.name as string,\n icon: d.icon as string | undefined,\n sortOrder: d.sortOrder as number | undefined,\n contentType: d.contentType as 'agent' | 'html' | 'custom',\n contentConfig: d.contentConfig as any,\n });\n\n return { newId: undefined };\n },\n};\n","import type { ExportableEntityDefinition, ExportableEntity, ImportPreviewResult } from '@axiom-lattice/core';\nimport { getStoreLattice } from '@axiom-lattice/core';\nimport type { EvalStore } from '@axiom-lattice/protocols';\n\nfunction getStore(): EvalStore {\n return getStoreLattice('default', 'eval').store as unknown as EvalStore;\n}\n\nexport const evalRegistration: ExportableEntityDefinition = {\n entityType: 'eval',\n label: 'Eval(评估)',\n category: 'core',\n dependsOn: [],\n cascadeParents: [],\n referenceFields: { suiteId: 'eval_suite', projectId: 'eval_project', runId: 'eval_run', caseId: 'eval_case' },\n\n async listForExport(tenantId: string): Promise<ExportableEntity[]> {\n const store = getStore();\n const projects = await store.getProjectsByTenant(tenantId);\n const entities: ExportableEntity[] = [];\n\n for (const project of projects) {\n entities.push({\n _exportId: '',\n data: {\n _subType: 'eval_project',\n id: project.id,\n name: project.name,\n description: project.description,\n version: project.version,\n judgeModelConfig: project.judgeModelConfig,\n targetServerConfig: project.targetServerConfig,\n concurrency: project.concurrency,\n reportConfig: project.reportConfig,\n },\n });\n\n const suites = await store.getSuitesByProject(tenantId, project.id);\n for (const suite of suites) {\n entities.push({\n _exportId: '',\n data: {\n _subType: 'eval_suite',\n id: suite.id,\n projectId: suite.projectId,\n name: suite.name,\n },\n });\n\n const cases = await store.getCasesBySuite(tenantId, suite.id);\n for (const c of cases) {\n entities.push({\n _exportId: '',\n data: {\n _subType: 'eval_case',\n id: c.id,\n suiteId: c.suiteId,\n inputMessage: c.inputMessage,\n inputFiles: c.inputFiles,\n steps: c.steps,\n outputType: c.outputType,\n contentAssertion: c.contentAssertion,\n rubrics: c.rubrics,\n },\n });\n }\n }\n\n const runs = await store.getRunsByTenant(tenantId, { projectId: project.id });\n for (const run of runs) {\n entities.push({\n _exportId: '',\n data: {\n _subType: 'eval_run',\n id: run.id,\n projectId: run.projectId,\n status: run.status,\n concurrency: run.concurrency,\n totalCases: run.totalCases,\n passedCases: run.passedCases,\n failedCases: run.failedCases,\n avgScore: run.avgScore,\n error: run.error,\n },\n });\n\n const results = await store.getResultsByRun(tenantId, run.id);\n for (const result of results) {\n entities.push({\n _exportId: '',\n data: {\n _subType: 'eval_run_result',\n id: result.id,\n runId: result.runId,\n suiteName: result.suiteName,\n caseId: result.caseId,\n pass: result.pass,\n score: result.score,\n summary: result.summary,\n dimensionResults: result.dimensionResults,\n durationMs: result.durationMs,\n messages: result.messages,\n logs: result.logs,\n error: result.error,\n },\n });\n }\n }\n }\n\n return entities;\n },\n\n async previewImport(\n tenantId: string,\n entities: ExportableEntity[],\n ): Promise<ImportPreviewResult> {\n const store = getStore();\n\n const existingProjects = await store.getProjectsByTenant(tenantId);\n const existingProjectIds = new Set(existingProjects.map((p) => p.id));\n const existingProjectNames = new Set(existingProjects.map((p) => p.name));\n\n const existingSuites: Map<string, Set<string>> = new Map();\n const existingSuiteIds = new Set<string>();\n const existingCaseIds = new Set<string>();\n const existingRunIds = new Set<string>();\n const existingResultIds = new Set<string>();\n\n for (const project of existingProjects) {\n const suites = await store.getSuitesByProject(tenantId, project.id);\n existingSuites.set(project.id, new Set(suites.map((s) => `${s.projectId}:${s.name}`)));\n for (const s of suites) {\n existingSuiteIds.add(s.id);\n try {\n const cases = await store.getCasesBySuite(tenantId, s.id);\n for (const c of cases) existingCaseIds.add(c.id);\n } catch { /* suite may not exist */ }\n }\n }\n\n for (const project of existingProjects) {\n const runs = await store.getRunsByTenant(tenantId, { projectId: project.id });\n for (const run of runs) {\n existingRunIds.add(run.id);\n try {\n const results = await store.getResultsByRun(tenantId, run.id);\n for (const r of results) existingResultIds.add(r.id);\n } catch { /* run may not exist */ }\n }\n }\n\n const conflicts: ImportPreviewResult['conflicts'] = [];\n const insertions: ImportPreviewResult['insertions'] = [];\n\n for (const entity of entities) {\n const d = entity.data as Record<string, unknown>;\n const subType = d._subType as string;\n const id = d.id as string;\n\n switch (subType) {\n case 'eval_project': {\n const name = d.name as string;\n if (existingProjectIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'eval_project',\n conflictType: 'id_exists',\n existingId: id,\n existingName: name,\n });\n } else if (name && existingProjectNames.has(name)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'eval_project',\n conflictType: 'unique_constraint',\n existingName: name,\n field: 'name',\n });\n } else {\n insertions.push({ _exportId: entity._exportId, entityType: 'eval_project', name });\n }\n break;\n }\n case 'eval_suite': {\n const projectId = d.projectId as string;\n const name = d.name as string;\n const suiteKey = `${projectId}:${name}`;\n const projectSuites = existingSuites.get(projectId);\n if (existingSuiteIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'eval_suite',\n conflictType: 'id_exists',\n existingId: id,\n existingName: name,\n });\n } else if (projectSuites?.has(suiteKey)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'eval_suite',\n conflictType: 'unique_constraint',\n existingName: name,\n field: 'projectId+name',\n });\n } else {\n insertions.push({ _exportId: entity._exportId, entityType: 'eval_suite', name });\n }\n break;\n }\n case 'eval_case': {\n if (existingCaseIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'eval_case',\n conflictType: 'id_exists',\n existingId: id,\n });\n } else {\n insertions.push({ _exportId: entity._exportId, entityType: 'eval_case', name: id });\n }\n break;\n }\n case 'eval_run': {\n if (existingRunIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'eval_run',\n conflictType: 'id_exists',\n existingId: id,\n });\n } else {\n insertions.push({ _exportId: entity._exportId, entityType: 'eval_run', name: id });\n }\n break;\n }\n case 'eval_run_result': {\n if (existingResultIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'eval_run_result',\n conflictType: 'id_exists',\n existingId: id,\n });\n } else {\n insertions.push({ _exportId: entity._exportId, entityType: 'eval_run_result', name: id });\n }\n break;\n }\n }\n }\n\n return { conflicts, insertions, errors: [] };\n },\n\n async applyImport(tenantId, entity, resolution) {\n if (resolution.action === 'skip') return {};\n const store = getStore();\n const d = entity.data as Record<string, unknown>;\n const subType = d._subType as string;\n const id = resolution.action === 'rename' && resolution.newId ? resolution.newId : d.id as string;\n\n switch (subType) {\n case 'eval_project': {\n if (resolution.action === 'overwrite') {\n try { await store.deleteProject(tenantId, id); } catch { /* may not exist */ }\n }\n await store.createProject(tenantId, id, {\n name: d.name as string,\n description: d.description as string | undefined,\n version: d.version as string | undefined,\n judgeModelConfig: d.judgeModelConfig as Record<string, unknown>,\n targetServerConfig: d.targetServerConfig as Record<string, unknown>,\n concurrency: d.concurrency as number | undefined,\n reportConfig: d.reportConfig as Record<string, unknown> | undefined,\n });\n break;\n }\n case 'eval_suite': {\n if (resolution.action === 'overwrite') {\n try { await store.deleteSuite(tenantId, id); } catch { /* may not exist */ }\n }\n await store.createSuite(tenantId, d.projectId as string, id, {\n name: d.name as string,\n });\n break;\n }\n case 'eval_case': {\n if (resolution.action === 'overwrite') {\n try { await store.deleteCase(tenantId, id); } catch { /* may not exist */ }\n }\n await store.createCase(tenantId, d.suiteId as string, id, {\n inputMessage: d.inputMessage as string,\n inputFiles: d.inputFiles as Record<string, string> | undefined,\n steps: d.steps as Array<{ agent_id: string; override_message?: string }>,\n outputType: d.outputType as 'file_content' | 'message_content',\n contentAssertion: d.contentAssertion as string,\n rubrics: d.rubrics as Array<{ name: string; weight: number; description: string }> | undefined,\n });\n break;\n }\n case 'eval_run': {\n if (resolution.action === 'overwrite') {\n try { await store.deleteRun(tenantId, id); } catch { /* may not exist */ }\n }\n await store.createRun(tenantId, d.projectId as string, id, {\n totalCases: d.totalCases as number,\n concurrency: d.concurrency as number,\n });\n break;\n }\n case 'eval_run_result': {\n if (resolution.action === 'overwrite') {\n try { await store.deleteRunResult(tenantId, entity.data.id as string); } catch { /* may not exist */ }\n }\n await store.createRunResult(tenantId, d.runId as string, id, {\n suiteName: d.suiteName as string,\n caseId: d.caseId as string | undefined,\n pass: d.pass as boolean,\n score: d.score as number,\n summary: d.summary as string | undefined,\n dimensionResults: d.dimensionResults as Array<{ name: string; score: number; reason: string }> | undefined,\n durationMs: d.durationMs as number | undefined,\n messages: d.messages as Array<{ role: string; content: string; id?: string }> | undefined,\n logs: d.logs as Array<{ timestamp: string; level: string; message: string; data?: unknown }> | undefined,\n error: d.error as string | undefined,\n });\n break;\n }\n }\n\n return { newId: id };\n },\n};\n","import {\n getStoreLattice,\n agentInstanceManager,\n} from \"@axiom-lattice/core\";\nimport type {\n InboundMessage,\n DispatchResult,\n BindingRegistry,\n Binding,\n ChannelInstallationStore,\n} from \"@axiom-lattice/protocols\";\nimport { ChannelAdapterRegistry } from \"../channels/registry\";\nimport type { MessageContext, MessageMiddleware } from \"./MessageContext\";\nimport { randomUUID } from \"crypto\";\n\nexport class BindingNotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"BindingNotFoundError\";\n }\n}\n\nexport class ChannelInstallationNotFoundError extends Error {\n constructor() {\n super(\"Channel installation is unavailable\");\n this.name = \"ChannelInstallationNotFoundError\";\n }\n}\n\nexport class InvalidChannelInstallationError extends Error {\n constructor(message = \"Channel installation is not valid for this message\") {\n super(message);\n this.name = \"InvalidChannelInstallationError\";\n }\n}\n\n/**\n * Configuration for {@link MessageRouter}.\n *\n * @param middlewares - Ordered middleware chain executed before dispatch\n * @param bindingRegistry - Resolves sender-to-agent bindings\n * @param adapterRegistry - Registry of {@link ChannelAdapter} implementations\n * @param installationStore - Persisted channel installation configs\n */\nexport interface MessageRouterConfig {\n middlewares: MessageMiddleware[];\n bindingRegistry: BindingRegistry;\n adapterRegistry: ChannelAdapterRegistry;\n installationStore: ChannelInstallationStore;\n}\n\n/**\n * Core message router for external channel integration.\n *\n * Receives normalized {@link InboundMessage} objects from channel adapters,\n * resolves the target agent via {@link BindingRegistry}, manages thread\n * lifecycle, and sends AI responses back to the channel via\n * `ChannelAdapter.sendReply`.\n *\n * ## Reply flow\n *\n * The router uses a counter-based deduplication scheme on the internal\n * {@link Agent.reply:ready} event:\n *\n * 1. Before `agent.addMessage()`, it subscribes to `reply:ready` on the agent.\n * 2. Multiple concurrent dispatches on the same thread increment a counter;\n * only the first registers the `EventEmitter.once` listener.\n * 3. When `reply:ready` fires, the callback extracts the last AI message from\n * the LangGraph state and sends it via `ChannelAdapter.sendReply`.\n * 4. The counter is decremented; the subscription is only removed when the\n * counter reaches 0.\n * 5. Stale subscriptions are cleaned up after a 1-hour timeout.\n *\n * The `replyTarget` is carried through by injecting `_replyTarget` into\n * `custom_run_config` on {@link Agent.addMessage}, and retrieved from the\n * `reply:ready` event payload.\n *\n * @see {@link ChannelAdapter.sendReply}\n * @see {@link InboundMessage.replyTarget}\n */\nexport class MessageRouter {\n private middlewares: MessageMiddleware[];\n private bindingRegistry: BindingRegistry;\n private adapterRegistry: ChannelAdapterRegistry;\n private installationStore: ChannelInstallationStore;\n\n /**\n * Tracks reply subscriptions per thread+channel to avoid duplicate\n * `subscribeOnce` registrations and ensure proper cleanup.\n *\n * Key format: `{threadId}:{adapterChannel}:reply`\n */\n private _replySubs: Map<string, { count: number; timer: NodeJS.Timeout }> = new Map();\n\n constructor(config: MessageRouterConfig) {\n this.middlewares = [...config.middlewares];\n this.bindingRegistry = config.bindingRegistry;\n this.adapterRegistry = config.adapterRegistry;\n this.installationStore = config.installationStore;\n }\n\n /**\n * Register an additional middleware at the end of the chain.\n *\n * @param middleware - A {@link MessageMiddleware} function\n */\n use(middleware: MessageMiddleware): void {\n this.middlewares.push(middleware);\n }\n\n /**\n * Dispatch an inbound channel message to the bound agent.\n *\n * Full pipeline: middleware chain → binding resolution → thread lifecycle\n * → agent.addMessage() → (async) reply via {@link ChannelAdapter.sendReply}.\n *\n * If the message has a {@link InboundMessage.replyTarget}, the router subscribes\n * to the agent's `reply:ready` event before enqueuing the message, and sends\n * the AI response back to the channel when it arrives.\n *\n * @param message - Normalized inbound message from a channel adapter\n * @returns {@link DispatchResult} with success status, bindingId, and threadId\n */\n async dispatch(message: InboundMessage): Promise<DispatchResult> {\n const ctx: MessageContext = {\n inboundMessage: message,\n metadata: {},\n };\n\n let binding: Binding | null = null;\n let threadId: string | undefined;\n let agentId: string | undefined;\n\n try {\n const installation = await this.installationStore.getInstallationById(\n message.channelInstallationId,\n );\n if (!installation) {\n throw new ChannelInstallationNotFoundError();\n }\n if (installation.enabled !== true) {\n throw new InvalidChannelInstallationError(\"Channel installation is disabled\");\n }\n if (\n installation.channel !== message.channel\n || (message.tenantId !== undefined && message.tenantId !== installation.tenantId)\n ) {\n throw new InvalidChannelInstallationError();\n }\n const tenantId = installation.tenantId;\n\n await this.runMiddlewares(ctx, async () => {\n console.log({ event: \"dispatch:start\", channel: message.channel, senderId: message.sender.id, tenantId }, \"Message dispatch started\");\n\n // 检查 adapter 是否支持自定义 thread 策略\n const adapter = this.adapterRegistry.get(message.channel);\n const hasAdapterThreadStrategy = !!adapter?.resolveThreadId;\n\n binding = await this.bindingRegistry.resolve({\n channel: message.channel,\n senderId: message.sender.id,\n channelInstallationId: message.channelInstallationId,\n tenantId,\n });\n\n if (!binding) {\n if (installation.rejectWhenNoBinding) {\n console.warn({\n event: \"dispatch:no_binding\",\n channel: message.channel,\n senderId: message.sender.id,\n tenantId,\n channelInstallationId: message.channelInstallationId,\n }, \"No binding found and rejectWhenNoBinding is enabled\");\n throw new BindingNotFoundError(\n `No binding for sender \"${message.sender.id}\" on channel \"${message.channel}\"`,\n );\n }\n\n if (installation.fallbackAgentId) {\n console.warn({\n event: \"dispatch:fallback\",\n channel: message.channel,\n senderId: message.sender.id,\n fallbackAgentId: installation.fallbackAgentId,\n }, \"No binding found, falling back to fallbackAgentId\");\n binding = {\n id: \"fallback\",\n channel: message.channel,\n channelInstallationId: message.channelInstallationId,\n tenantId,\n senderId: message.sender.id,\n agentId: installation.fallbackAgentId,\n threadId: undefined,\n threadMode: \"fixed\" as const,\n enabled: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n } else if (!hasAdapterThreadStrategy) {\n // 只有当 adapter 没有自定义 thread 策略且没有 fallback 时才报错\n console.error({\n event: \"dispatch:no_fallback\",\n channel: message.channel,\n senderId: message.sender.id,\n tenantId,\n }, \"No binding found and no fallbackAgentId configured\");\n throw new BindingNotFoundError(\n `No binding for sender \"${message.sender.id}\" and no fallback configured`,\n );\n }\n }\n\n ctx.binding = binding ?? undefined;\n\n if (binding) {\n console.log({\n event: \"dispatch:binding\",\n bindingId: binding.id,\n agentId: binding.agentId,\n threadId: binding.threadId,\n threadMode: binding.threadMode,\n workspaceId: binding.workspaceId,\n projectId: binding.projectId,\n }, \"Binding resolved\");\n\n if (!binding.enabled) {\n console.warn({\n event: \"dispatch:binding_disabled\",\n bindingId: binding.id,\n agentId: binding.agentId,\n senderId: message.sender.id,\n }, \"Binding is disabled, rejecting message\");\n throw new BindingNotFoundError(\n `Binding for sender \"${message.sender.id}\" is disabled`,\n );\n }\n }\n\n // 确定 agentId\n agentId = binding?.agentId ?? installation.fallbackAgentId;\n if (!agentId) {\n throw new BindingNotFoundError(\n `No agent configured for sender \"${message.sender.id}\"`,\n );\n }\n\n // 优先使用 adapter 的自定义 thread 策略\n if (hasAdapterThreadStrategy) {\n const resolvedThreadId = await adapter!.resolveThreadId!(message, binding);\n threadId = resolvedThreadId;\n console.log({\n event: \"dispatch:thread:adapter\",\n threadId,\n channel: message.channel,\n adapterChannel: adapter!.channel,\n }, \"Thread resolved by adapter strategy\");\n\n // 确保 thread 存在(adapter 的策略可能有重复,例如同一天)\n const threadStore = getStoreLattice(\"default\", \"thread\").store;\n try {\n await threadStore.createThread(\n tenantId!,\n agentId,\n threadId,\n {\n metadata: {\n channel: message.channel,\n channelInstallationId: message.channelInstallationId,\n senderId: message.sender.id,\n bindingId: binding?.id,\n ...(message.conversation ? {\n conversationId: message.conversation.id,\n conversationType: message.conversation.type,\n } : {}),\n },\n },\n );\n console.log({\n event: \"dispatch:thread:adapter:created\",\n threadId,\n }, \"Thread created by adapter strategy\");\n } catch {\n // Thread already exists from a previous message — 复用\n console.log({\n event: \"dispatch:thread:adapter:reuse\",\n threadId,\n }, \"Thread already exists, reusing\");\n }\n } else if (binding) {\n // 默认策略:per_conversation 总是创建新线程,fixed 复用已有线程\n if (binding.threadMode === \"per_conversation\") {\n threadId = undefined; // 创建新线程\n } else {\n threadId = binding.threadId; // 复用 fixed 线程\n }\n }\n\n if (!threadId) {\n const threadStore = getStoreLattice(\"default\", \"thread\").store;\n const newThreadId = randomUUID();\n console.log({\n event: \"dispatch:thread:create\",\n agentId,\n newThreadId,\n tenantId: tenantId!,\n }, \"Creating new thread for binding\");\n const newThread = await threadStore.createThread(\n tenantId!,\n agentId,\n newThreadId,\n {\n metadata: {\n channel: message.channel,\n channelInstallationId: message.channelInstallationId,\n senderId: message.sender.id,\n bindingId: binding?.id,\n ...(message.conversation ? {\n conversationId: message.conversation.id,\n conversationType: message.conversation.type,\n } : {}),\n },\n },\n );\n threadId = newThread.id;\n if (binding && binding.id !== \"fallback\") {\n await this.bindingRegistry.update(binding.id, { threadId });\n binding.threadId = threadId;\n } else if (binding) {\n binding.threadId = threadId;\n }\n }\n\n console.log({\n event: \"dispatch:agent\",\n agentId,\n threadId,\n senderId: message.sender.id,\n contentLength: message.content.text.length,\n }, \"Dispatching to agent\");\n\n const agent = agentInstanceManager.getAgent({\n tenant_id: tenantId!,\n assistant_id: agentId,\n thread_id: threadId,\n workspace_id: binding?.workspaceId || \"\",\n project_id: binding?.projectId || \"\",\n });\n\n /**\n * Subscribe to reply:ready before addMessage to avoid a race with\n * an already-running queue processor.\n *\n * The `_replySubs` map uses a counter (not a boolean) so that multiple\n * concurrent dispatches on the same thread each get a callback invocation.\n * The `subscribeOnce` listener is only registered when the counter goes\n * from 0 → 1, and removed when it goes back to 0. A 1-hour timeout\n * protects against leaked subscriptions due to agent errors/aborts.\n */\n if (message.replyTarget) {\n const replySubKey = `${threadId}:${message.replyTarget.adapterChannel}:reply`;\n const adapter = this.adapterRegistry.get(message.replyTarget.adapterChannel);\n if (adapter) {\n const existing = this._replySubs.get(replySubKey);\n if (!existing || existing.count === 0) {\n // First subscriber for this thread+channel — register the event listener\n const timer = setTimeout(() => {\n // Cleanup if reply never fires (agent aborted, errored, etc.)\n const entry = this._replySubs.get(replySubKey);\n if (entry) {\n this._replySubs.delete(replySubKey);\n console.warn({\n event: \"dispatch:reply:timeout\",\n threadId,\n channel: message.replyTarget!.adapterChannel,\n }, \"Reply subscription timed out — no reply:ready fired within 1h\");\n }\n }, 3_600_000);\n\n this._replySubs.set(replySubKey, { count: 1, timer });\n\n console.log({\n event: \"dispatch:reply:subscribed\",\n threadId,\n channel: message.replyTarget.adapterChannel,\n senderId: message.sender.id,\n }, \"Subscribed to reply:ready for thread\");\n\n agent.subscribeOnce('reply:ready', (data: any) => {\n const messages = data.state?.values?.messages;\n const lastAI = messages\n ?.filter((m: any) => m.type === 'ai' || m.getType?.() === 'ai')\n .pop();\n const replyText = lastAI?.content ?? '';\n\n // Decrement counter; unsubscribe only when count reaches 0\n const entry = this._replySubs.get(replySubKey);\n if (entry) {\n entry.count--;\n if (entry.count <= 0) {\n clearTimeout(entry.timer);\n this._replySubs.delete(replySubKey);\n }\n }\n\n if (replyText) {\n console.log({\n event: \"dispatch:reply:sending\",\n threadId,\n channel: message.replyTarget!.adapterChannel,\n replyLength: replyText.length,\n }, \"Sending channel reply\");\n adapter.sendReply(message.replyTarget!, { text: replyText }, installation)\n .then(() => {\n console.log({\n event: \"dispatch:reply:sent\",\n threadId,\n channel: message.replyTarget!.adapterChannel,\n }, \"Channel reply sent successfully\");\n })\n .catch((err) => console.error({\n event: \"dispatch:reply:failed\",\n threadId,\n channel: message.replyTarget!.adapterChannel,\n error: err instanceof Error ? err.message : String(err),\n }, \"Failed to send channel reply\"));\n } else {\n console.warn({\n event: \"dispatch:reply:empty\",\n threadId,\n channel: message.replyTarget!.adapterChannel,\n }, \"Agent produced no text output — skipping reply\");\n }\n });\n } else {\n // Another dispatch already subscribed — increment counter\n existing.count++;\n console.log({\n event: \"dispatch:reply:incremented\",\n threadId,\n channel: message.replyTarget.adapterChannel,\n count: existing.count,\n }, \"Incremented reply counter for thread (already subscribed)\");\n }\n }\n }\n\n const addResult = await agent.addMessage({\n input: { message: message.content.text },\n custom_run_config: message.replyTarget\n ? { ...(message.content.metadata || {}), _replyTarget: message.replyTarget }\n : (message.content.metadata || {}),\n });\n\n console.log({\n event: \"dispatch:complete\",\n agentId,\n threadId,\n messageId: (addResult as Record<string, unknown>)?.messageId,\n result: JSON.stringify(addResult),\n }, \"Agent dispatch complete — messageId = \" + ((addResult as Record<string, unknown>)?.messageId || \"N/A\"));\n });\n\n return {\n success: true,\n bindingId: ctx.binding?.id,\n threadId,\n result: ctx.result,\n };\n } catch (error) {\n ctx.error = error instanceof Error ? error : new Error(String(error));\n console.error({ event: \"dispatch:error\", error: ctx.error.message, channel: message.channel, senderId: message.sender.id }, \"Message dispatch failed\");\n return {\n success: false,\n bindingId: ctx.binding?.id,\n threadId: ctx.binding?.threadId,\n error: ctx.error,\n };\n }\n }\n\n private async runMiddlewares(\n ctx: MessageContext,\n finalHandler: () => Promise<void>,\n ): Promise<void> {\n const dispatch = (index: number): Promise<void> => {\n if (index >= this.middlewares.length) {\n return finalHandler();\n }\n const middleware = this.middlewares[index];\n return middleware(ctx, () => dispatch(index + 1));\n };\n return dispatch(0);\n }\n}\n","import type { ChannelAdapter } from \"@axiom-lattice/protocols\";\n\nexport class ChannelAdapterRegistry {\n private adapters = new Map<string, ChannelAdapter>();\n\n register(adapter: ChannelAdapter): void {\n if (this.adapters.has(adapter.channel)) {\n throw new Error(`Channel adapter \"${adapter.channel}\" already registered`);\n }\n this.adapters.set(adapter.channel, adapter);\n }\n\n get(channel: string): ChannelAdapter | undefined {\n return this.adapters.get(channel);\n }\n\n list(): string[] {\n return Array.from(this.adapters.keys());\n }\n}\n","import type { MessageMiddleware } from \"../MessageContext\";\n\nconst processedMessages = new Map<string, number>();\n\nexport function createDeduplicationMiddleware(\n ttlMs: number = 5 * 60 * 1000,\n): MessageMiddleware {\n return async (ctx, next) => {\n const msg = ctx.inboundMessage;\n const msgId = msg.content.metadata?.messageId as string | undefined;\n const key = msgId\n ? `${msg.channel}:${msg.channelInstallationId}:${msgId}`\n : null;\n\n if (key) {\n const now = Date.now();\n const lastProcessed = processedMessages.get(key);\n if (lastProcessed && (now - lastProcessed) < ttlMs) {\n console.warn({\n event: \"dedup:blocked\",\n channel: msg.channel,\n senderId: msg.sender.id,\n messageId: msgId,\n }, \"Duplicate message blocked by deduplication\");\n return;\n }\n processedMessages.set(key, now);\n }\n\n if (processedMessages.size > 10000) {\n const oldest = Array.from(processedMessages.entries())\n .sort((a, b) => a[1] - b[1])[0];\n if (oldest) processedMessages.delete(oldest[0]);\n }\n\n await next();\n };\n}\n","import type { MessageMiddleware } from \"../MessageContext\";\n\nexport class RateLimitError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"RateLimitError\";\n }\n}\n\ninterface Counter { count: number; resetAt: number; }\nconst rateCounters = new Map<string, Counter>();\n\nexport function createRateLimitMiddleware(\n maxRequests: number = 10,\n windowMs: number = 60 * 1000,\n maxEntries: number = 10000,\n): MessageMiddleware {\n return async (ctx, next) => {\n const senderKey = `${ctx.inboundMessage.channel}:${ctx.inboundMessage.sender.id}`;\n const now = Date.now();\n let counter = rateCounters.get(senderKey);\n if (!counter || now > counter.resetAt) {\n counter = { count: 0, resetAt: now + windowMs };\n }\n counter.count++;\n rateCounters.set(senderKey, counter);\n\n if (rateCounters.size > maxEntries) {\n const oldest = Array.from(rateCounters.entries())\n .sort((a, b) => a[1].resetAt - b[1].resetAt)[0];\n if (oldest) rateCounters.delete(oldest[0]);\n }\n\n if (counter.count > maxRequests) {\n console.warn({\n event: \"ratelimit:blocked\",\n channel: ctx.inboundMessage.channel,\n senderId: ctx.inboundMessage.sender.id,\n count: counter.count,\n maxRequests,\n }, \"Rate limit exceeded\");\n throw new RateLimitError(`Rate limit exceeded`);\n }\n await next();\n };\n}\n","import type { MessageMiddleware } from \"../MessageContext\";\nimport { Logger } from \"../../logger/Logger\";\n\nconst logger = new Logger({ serviceName: \"lattice/gateway/audit\" });\n\nexport function createAuditLoggerMiddleware(): MessageMiddleware {\n return async (ctx, next) => {\n const start = Date.now();\n try {\n await next();\n logger.info(\"message routed\", {\n event: \"message:routed\",\n channel: ctx.inboundMessage.channel,\n senderId: ctx.inboundMessage.sender.id,\n agentId: ctx.binding?.agentId,\n threadId: ctx.binding?.threadId,\n duration: Date.now() - start,\n status: \"success\",\n });\n } catch (error) {\n logger.error(\n error instanceof Error ? error.message : String(error),\n {\n event: \"message:error\",\n channel: ctx.inboundMessage.channel,\n senderId: ctx.inboundMessage.sender.id,\n duration: Date.now() - start,\n status: \"error\",\n },\n );\n throw error;\n }\n };\n}\n","import { FastifyInstance } from \"fastify\";\nimport swagger from \"@fastify/swagger\";\nimport swaggerUi from \"@fastify/swagger-ui\";\n// Example usage:\n// configureSwagger(app)\n// configureSwagger(app, { openapi: { info: { version: \"2.0.0\" } } })\n// configureSwagger(app, undefined, { routePrefix: \"/docs\" })\n\n// Default swagger configuration\nexport const defaultSwaggerConfig = {\n openapi: {\n openapi: \"3.0.0\",\n info: {\n title: \"Axiom Lattice Gateway API\",\n description: \"API Gateway for LangGraph agent-based applications\",\n version: \"1.0.0\",\n contact: {\n name: \"Axiom Lattice Team\",\n email: \"support@axiom-lattice.com\",\n },\n },\n servers: [\n {\n url: \"http://localhost:4001\",\n description: \"Development environment\",\n },\n ],\n components: {\n securitySchemes: {\n bearerAuth: {\n type: \"http\" as const,\n scheme: \"bearer\" as const,\n bearerFormat: \"JWT\",\n },\n },\n },\n security: [\n {\n bearerAuth: [],\n },\n ],\n tags: [\n { name: \"Runs\", description: \"Agent run management\" },\n { name: \"Memory\", description: \"Agent memory management\" },\n { name: \"Graph\", description: \"Agent graph visualization\" },\n { name: \"Health\", description: \"System health checks\" },\n ],\n },\n};\n\n// Default swagger UI configuration\nexport const defaultSwaggerUiConfig = {\n routePrefix: \"/api-docs\",\n uiConfig: {\n docExpansion: \"full\" as const,\n deepLinking: false,\n },\n staticCSP: true,\n transformStaticCSP: (header: string) => header,\n};\n\n// Configure Swagger with optional custom configuration\nexport const configureSwagger = async (\n app: FastifyInstance,\n customSwaggerConfig?: Partial<typeof defaultSwaggerConfig>,\n customSwaggerUiConfig?: Partial<typeof defaultSwaggerUiConfig>\n) => {\n // Merge default config with custom config\n const swaggerConfig = { ...defaultSwaggerConfig, ...customSwaggerConfig };\n const swaggerUiConfig = {\n ...defaultSwaggerUiConfig,\n ...customSwaggerUiConfig,\n };\n\n await app.register(swagger, swaggerConfig);\n await app.register(swaggerUi, swaggerUiConfig);\n};\n","import { eventBus, AGENT_TASK_EVENT, agentInstanceManager, QueueMode } from \"@axiom-lattice/core\";\nimport { popAgentTaskFromQueue } from \"./queue_service\";\n\n// 任务请求结构\nexport interface AgentTaskRequest {\n assistant_id: string;\n input: any;\n thread_id: string;\n \"x-tenant-id\": string;\n command?: any;\n callback_event?: string;\n runConfig?: Record<string, any>;\n main_thread_id?: string;\n main_tenant_id?: string;\n main_assistant_id?: string;\n}\n\n/**\n * 处理Agent任务事件\n * @param taskRequest 任务请求\n * @param retryCount 重试次数\n */\nconst handleAgentTask = async (\n taskRequest: AgentTaskRequest,\n retryCount: number = 0\n): Promise<boolean> => {\n const {\n assistant_id,\n input = {},\n thread_id,\n \"x-tenant-id\": tenant_id,\n command,\n callback_event,\n runConfig,\n main_thread_id,\n main_tenant_id,\n main_assistant_id,\n } = taskRequest;\n\n\n try {\n console.log(\n `开始处理任务 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n\n // 检查API服务器是否可用\n // const apiUrl = AgentTaskConsumer.agent_run_endpoint;\n\n // console.log(`apiUrl: ${apiUrl}`);\n const agent = agentInstanceManager.getAgent({ assistant_id, thread_id, tenant_id, workspace_id: runConfig?.workspaceId, project_id: runConfig?.projectId, custom_run_config: runConfig })\n await agent.addMessage({ input, command, custom_run_config: runConfig }, QueueMode.STEER);\n if (callback_event) {\n agent.subscribeOnce(\"message:completed\", (evt) => {\n eventBus.publish(callback_event, {\n success: true,\n state: evt.state,\n });\n\n if (main_thread_id && main_tenant_id) {\n try {\n const mainAgent = agentInstanceManager.getAgent({\n assistant_id: main_assistant_id ?? assistant_id,\n thread_id: main_thread_id,\n tenant_id: main_tenant_id,\n workspace_id: runConfig?.workspaceId,\n project_id: runConfig?.projectId,\n });\n if (mainAgent) {\n const messages = evt.state?.values?.messages;\n const lastAIMessage = messages\n ?.filter((m: any) => m.type === 'ai' || m.getType?.() === 'ai')\n .pop();\n const summary = lastAIMessage?.content\n ?.substring(0, 500) ?? '(no output)';\n\n mainAgent.addMessage(\n {\n input: {\n message: `[Async task completed]\\ntask_id: ${thread_id}\\n${summary}`,\n },\n },\n ).catch((err: Error) => {\n console.error('Failed to notify main thread:', err);\n });\n\n mainAgent.updateAsyncTaskStatus(thread_id, 'completed');\n }\n } catch (err) {\n console.error('Failed to notify main thread:', err);\n }\n }\n })\n agent.subscribeOnce(\"message:interrupted\", (evt) => {\n eventBus.publish(callback_event, {\n success: true,\n state: evt.state,\n });\n })\n }\n\n return true;\n\n\n\n } catch (error) {\n console.error(\n `Agent任务执行失败: ${assistant_id}, 线程: ${thread_id}`,\n error\n );\n\n // 重试逻辑,暂不用重试\n const maxRetries = 0;\n if (retryCount < maxRetries) {\n const nextRetryCount = retryCount + 1;\n const delayMs = Math.pow(2, nextRetryCount) * 1000; // 指数退避策略\n\n console.log(\n `将在 ${delayMs}ms 后重试任务 (${nextRetryCount}/${maxRetries})`\n );\n\n // 延迟后重试\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n return handleAgentTask(taskRequest, nextRetryCount);\n }\n\n if (callback_event) {\n eventBus.publish(callback_event, {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n console.error(\n `任务处理失败,已达到最大重试次数 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n return false;\n }\n};\n\n/**\n * Agent任务消费者\n * 负责监听和执行Agent任务事件,同时从队列中消费任务\n */\nexport class AgentTaskConsumer {\n private isPolling: boolean = false;\n private pollingInterval: NodeJS.Timeout | null = null;\n private pollingIntervalMs: number = 5000; // 默认5秒轮询一次\n private maxConcurrentTasks: number = 15; // 最大并发任务数\n private activeTasks: number = 0; // 当前活跃的任务数\n private processing: boolean = false; // 是否正在处理任务批次\n private immediateProcessingEnabled: boolean = true; // 是否启用即时处理模式\n public gatewayPort: number = 4001;\n public static agent_run_endpoint: string = \"http://localhost:4001/api/runs\";\n\n constructor(gatewayPort: number, pollingIntervalMs?: number) {\n this.gatewayPort = gatewayPort;\n AgentTaskConsumer.agent_run_endpoint = `http://localhost:${this.gatewayPort}/api/runs`;\n if (pollingIntervalMs) {\n this.pollingIntervalMs = pollingIntervalMs;\n }\n this.initialize();\n }\n\n /**\n * 初始化事件监听和队列轮询\n */\n private initialize(): void {\n // 监听事件总线上的任务\n eventBus.subscribe(AGENT_TASK_EVENT, this.trigger_agent_task.bind(this));\n\n // 启动队列轮询\n this.startPollingQueue();\n\n console.log(\"Agent任务消费者已启动并监听任务事件和队列\");\n }\n\n /**\n * 启动队列轮询\n */\n startPollingQueue(): void {\n if (this.isPolling) {\n return;\n }\n\n this.isPolling = true;\n\n this.pollingInterval = setInterval(async () => {\n try {\n // 如果上一批次任务还在处理中,跳过本次轮询\n if (this.processing) {\n console.log(\"队列处理中,跳过本次轮询\");\n return;\n }\n\n await this.consumeFromQueue();\n } catch (error) {\n console.error(\"队列轮询出错:\", error);\n }\n }, this.pollingIntervalMs);\n\n console.log(\n `开始轮询队列,间隔: ${this.pollingIntervalMs}ms,最大并发任务数: ${this.maxConcurrentTasks}`\n );\n }\n\n /**\n * 停止队列轮询\n */\n stopPollingQueue(): void {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n this.pollingInterval = null;\n this.isPolling = false;\n console.log(\"已停止队列轮询\");\n }\n }\n\n /**\n * 处理单个任务并在完成后立即尝试处理下一个\n */\n async processNextTask(): Promise<boolean> {\n try {\n // 从队列中获取任务\n const queueResult = await popAgentTaskFromQueue();\n\n // 检查队列结果\n if (queueResult && queueResult.data) {\n const taskItem = queueResult.data;\n\n if (taskItem && typeof taskItem === \"object\") {\n const taskRequest = taskItem as AgentTaskRequest;\n\n console.log(\n `从队列中获取到任务 [assistant: ${taskRequest.assistant_id}, thread: ${taskRequest.thread_id}]`\n );\n\n // 增加活跃任务计数\n this.activeTasks++;\n\n // 处理任务(不使用await,允许并发执行)\n handleAgentTask(taskRequest)\n .then((success) => {\n if (!success) {\n console.error(`任务 处理失败`);\n // 可以在这里记录失败任务或执行补偿逻辑\n } else {\n console.log(`任务 处理成功`);\n }\n })\n .catch((error) => {\n console.error(`任务 处理时出错:`, error);\n })\n .finally(() => {\n // 减少活跃任务计数\n this.activeTasks--;\n\n // 如果启用了即时处理模式,尝试处理更多任务\n if (this.immediateProcessingEnabled && !this.processing) {\n this.checkQueueForTasks();\n }\n });\n\n // 任务已派发,返回true表示有任务被处理\n return true;\n } else {\n console.log(\"队列任务格式无效:\", taskItem);\n return false;\n }\n } else {\n // 队列为空\n return false;\n }\n } catch (error) {\n console.error(\"处理任务失败:\", error);\n return false;\n }\n }\n\n /**\n * 检查队列中是否有任务并处理\n */\n async checkQueueForTasks(): Promise<void> {\n // 如果已经在处理中或者并发任务已达上限,则不处理\n if (this.processing || this.activeTasks >= this.maxConcurrentTasks) {\n return;\n }\n\n this.processing = true;\n\n try {\n // 尝试获取并处理任务,直到达到并发上限\n while (this.activeTasks < this.maxConcurrentTasks) {\n const taskProcessed = await this.processNextTask();\n if (!taskProcessed) {\n // 没有更多任务,退出循环\n break;\n }\n }\n } catch (error) {\n console.error(\"检查队列任务失败:\", error);\n } finally {\n this.processing = false;\n }\n }\n\n /**\n * 从队列中消费任务\n */\n async consumeFromQueue(): Promise<void> {\n // 如果已经在处理中,跳过\n if (this.processing) {\n return;\n }\n\n // 调用任务检查方法\n await this.checkQueueForTasks();\n }\n\n /**\n * 处理通过事件触发的任务\n */\n trigger_agent_task(taskRequest: AgentTaskRequest): void {\n console.log(\n `通过事件触发任务: [assistant: ${taskRequest.assistant_id}, thread: ${taskRequest.thread_id}]`\n );\n\n // 处理任务,不阻塞事件处理流程\n handleAgentTask(taskRequest).catch((error) => {\n console.error(\"处理Agent任务时发生未捕获的错误:\", error);\n\n // 如果有回调事件,确保即使发生错误也能通知\n if (taskRequest.callback_event) {\n eventBus.publish(taskRequest.callback_event, {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n // 如果启用了即时处理且当前活跃任务数低于阈值,检查队列\n if (\n this.immediateProcessingEnabled &&\n this.activeTasks < this.maxConcurrentTasks\n ) {\n setImmediate(() => this.checkQueueForTasks());\n }\n }\n}\n"],"mappings":"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","names":["path","start","deleted","t","agentInstanceManager","getUserId","resolve","agentInstanceManager","getStoreLattice","randomUUID","getTenantId","getTenantId","getTenantId","getTenantId","c","embeddingsLatticeManager","collectionService","getStoreLattice","getTenantId","getStoreLattice","agentInstanceManager","ThreadStatus","MessageChunkTypes","getTenantId","t","getStoreLattice","randomUUID","getWorkspaceId","getTenantId","getUserId","t","randomUUID","t","resolve","path","ExportableEntityRegistry","multipart","fastify","agentInstanceManager","agentLatticeManager","errorMessage","getSandBoxManager","app","getSandBoxManager","fs","path","os","getStoreLattice","getSandBoxManager","uuidv4","getStoreLattice","uuidv4","getSandBoxManager","filename","content","path","app","getStoreLattice","randomUUID","getTenantId","resolve","app","getStoreLattice","metricsServerManager","SemanticMetricsClient","randomUUID","getTenantId","app","PluginRegistry","fastify","getStoreLattice","uuidv4","getStoreLattice","modelLatticeManager","uuidv4","c","getTenantId","getStoreLattice","uuidv4","modelLatticeManager","app","getStoreLattice","uuidv4","app","getStoreLattice","uuidv4","app","getStoreLattice","uuidv4","path","app","z","normalizeChatType","z","crypto","logger","app","app","app","randomUUID","getTenantId","getStoreLattice","errorMessage","app","getTenantId","app","getTenantId","app","v4","path","resolve","app","app","getStoreLattice","AgentType","getTenantId","getStoreLattice","randomUUID","randomUUID","app","getStoreLattice","getTenantId","getUserId","getAssistantStore","getTenantId","getUserId","getAssistantStore","getStoreLattice","app","app","app","ExportableEntityRegistry","SandboxSkillStore","isBuiltInSkill","getStore","getStoreLattice","getStore","getStoreLattice","getStore","c","getStoreLattice","getStore","c","getStoreLattice","getStore","c","getStoreLattice","getStore","connections","c","getStoreLattice","getStore","c","getStoreLattice","randomUUID","getStore","getStoreLattice","getStore","getStoreLattice","getStore","c","ExportableEntityRegistry","getStoreLattice","agentInstanceManager","randomUUID","adapter","logger","start","app","eventBus","agentInstanceManager","QueueMode","agentInstanceManager","QueueMode","eventBus","resolve","sandboxLatticeManager","getStoreLattice","agentInstanceManager","logger","path","c","getStore"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/controllers/assistant.ts","../src/services/local-a2a.ts","../src/utils/a2a-url.ts","../src/utils/local-a2a-runtime.ts","../src/controllers/run.ts","../src/services/agents/ScopedAgentExecution.ts","../src/services/streaming/pipeAsyncIterableToSse.ts","../src/controllers/memory.ts","../src/controllers/agent_task.ts","../src/controllers/threads.ts","../src/controllers/schedules.ts","../src/config.ts","../src/services/queue_service.ts","../src/controllers/config.ts","../src/controllers/models.ts","../src/controllers/health.ts","../src/services/skill_service.ts","../src/controllers/skills.ts","../src/services/collection_service.ts","../src/controllers/collections.ts","../src/controllers/embeddings.ts","../src/controllers/entries.ts","../src/controllers/tools.ts","../src/controllers/data-query.ts","../src/controllers/workflow-tracking.ts","../src/controllers/personal-assistant.ts","../src/services/ExportImportService.ts","../src/controllers/export-import.ts","../src/controllers/middleware-types.ts","../src/schemas/data-query.ts","../src/schemas/index.ts","../src/controllers/thread_status.ts","../src/services/sandbox_service.ts","../src/controllers/sandbox.ts","../src/controllers/workspace.ts","../src/controllers/database-configs.ts","../src/controllers/metrics-configs.ts","../src/controllers/connections.ts","../src/controllers/eval.ts","../src/services/eval-runner.ts","../src/controllers/users.ts","../src/controllers/tenants.ts","../src/controllers/auth.ts","../src/channels/lark/LarkChannelAdapter.ts","../src/channels/lark/parser.ts","../src/channels/lark/verification.ts","../src/channels/lark/controller.ts","../src/channels/lark/routes.ts","../src/channels/wechat/controller.ts","../src/channels/wechat/routes.ts","../src/channels/routes.ts","../src/controllers/channel-installations.ts","../src/routes/channel-installations.ts","../src/controllers/channel-bindings.ts","../src/routes/channel-bindings.ts","../src/controllers/menu-items.ts","../src/routes/menu-items.ts","../src/routes/a2a-bridge.ts","../src/routes/stt.ts","../src/controllers/local-a2a.ts","../src/config/local-a2a-templates.ts","../src/controllers/local-a2a-templates.ts","../src/routes/a2a-test-connection.ts","../src/controllers/tasks.ts","../src/routes/task-routes.ts","../src/routes/index.ts","../src/services/agent-web-app/AgentWebAppService.ts","../src/routes/agent-web-apps.ts","../src/schemas/agent-web-app.ts","../src/routes/agent-web-app-runtime.ts","../src/services/agent-web-app/AgentWebAppRuntimeService.ts","../src/services/agent-web-app/AgentWebAppStreamProjector.ts","../src/services/agent-web-app/AgentWebAppAttachmentRef.ts","../src/routes/resource-routes.ts","../src/export_registrations/index.ts","../src/export_registrations/skill.registration.ts","../src/export_registrations/agent.registration.ts","../src/export_registrations/database-config.registration.ts","../src/export_registrations/metrics-config.registration.ts","../src/export_registrations/mcp-config.registration.ts","../src/export_registrations/connection.registration.ts","../src/export_registrations/collection.registration.ts","../src/export_registrations/channel-installation.registration.ts","../src/export_registrations/menu.registration.ts","../src/export_registrations/eval.registration.ts","../src/router/MessageRouter.ts","../src/channels/registry.ts","../src/router/middlewares/deduplication.ts","../src/router/middlewares/rateLimit.ts","../src/router/middlewares/auditLogger.ts","../src/swagger.ts","../src/services/agent_task_consumer.ts"],"sourcesContent":["import \"dotenv/config\";\nimport fastify from \"fastify\";\nimport cors from \"@fastify/cors\";\nimport multipart from \"@fastify/multipart\";\nimport sensible from \"@fastify/sensible\";\nimport websocket from \"@fastify/websocket\";\nimport staticPlugin from \"@fastify/static\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { registerLatticeRoutes } from \"./routes\";\nimport { registerResourceRoutes } from \"./routes/resource-routes\";\nimport { registerAllBuiltinEntities } from \"./export_registrations\";\nimport type {\n ChannelInstallationStore,\n BindingRegistry,\n A2AApiKeyStore,\n AssistantStore,\n ProjectStore,\n TaskStore,\n} from \"@axiom-lattice/protocols\";\nimport { MessageRouter } from \"./router/MessageRouter\";\nimport { ChannelAdapterRegistry } from \"./channels/registry\";\nimport { createDeduplicationMiddleware, createRateLimitMiddleware, createAuditLoggerMiddleware } from \"./router/middlewares\";\nimport { setBindingRegistry, setMenuRegistry, setEvalRunService } from \"@axiom-lattice/core\";\nimport { larkChannelAdapter } from \"./channels/lark/LarkChannelAdapter\";\nimport { registerConsoleAuthHook } from \"./controllers/auth\";\nimport { setChannelControllerDeps } from \"./controllers/channel-installations\";\nimport { evalRunner } from \"./services/eval-runner\";\nimport { configureSwagger } from \"./swagger\";\nimport {\n setQueueServiceType,\n QueueServiceType,\n} from \"./services/queue_service\";\nimport { AgentTaskConsumer } from \"./services/agent_task_consumer\";\nimport {\n registerLoggerLattice,\n getLoggerLattice,\n loggerLatticeManager,\n sandboxLatticeManager,\n getStoreLattice,\n agentInstanceManager,\n createSandboxProvider,\n type CreateSandboxProviderConfig,\n TokenCache,\n mcpManager,\n} from \"@axiom-lattice/core\";\nimport {\n LoggerType,\n LoggerConfig,\n PinoFileOptions,\n McpServerConfigStore,\n} from \"@axiom-lattice/protocols\";\nprocess.on(\"unhandledRejection\", (reason, promise) => {\n console.error(\"未处理的Promise拒绝:\", reason);\n // 可以在这里进行日志记录或其他处理\n});\n\n// Default logger configuration\nconst DEFAULT_LOGGER_CONFIG: LoggerConfig = {\n name: \"default\",\n description: \"Default logger for lattice-gateway service\",\n type: LoggerType.PINO,\n serviceName: \"lattice/gateway\",\n loggerName: \"lattice/gateway\",\n};\n\n// Initialize logger with default config (can be overridden in start function)\nlet loggerLattice = initializeLogger(DEFAULT_LOGGER_CONFIG);\nlet logger = loggerLattice.client;\n\n/**\n * Initialize logger lattice with given configuration\n */\nfunction initializeLogger(config: LoggerConfig) {\n // Remove existing logger if it exists\n if (loggerLatticeManager.hasLattice(\"default\")) {\n loggerLatticeManager.removeLattice(\"default\");\n }\n\n // Register logger with provided config\n registerLoggerLattice(\"default\", config);\n\n // Get and return logger lattice instance\n return getLoggerLattice(\"default\");\n}\n\n// 创建 Fastify 应用\nconst app = fastify({\n logger: false,\n bodyLimit: Number(process.env.BODY_LIMIT) || 50 * 1024 * 1024,\n});\n\n// Custom content type parser to handle DELETE requests with Content-Type but no body\n// This prevents \"Body cannot be empty when content-type is set to 'application/json'\" error\napp.addContentTypeParser('application/json', { parseAs: 'string' }, function (request, body, done) {\n // For DELETE requests or empty body, return empty object\n if (request.method === 'DELETE' || !body || body.length === 0) {\n done(null, {});\n return;\n }\n try {\n const json = JSON.parse(body as string);\n done(null, json);\n } catch (err) {\n done(err as Error, undefined);\n }\n});\n\n\n// Helper: extract single header value (Fastify headers can be string | string[])\nconst getHeaderValue = (\n header: string | string[] | undefined\n): string | undefined => {\n if (Array.isArray(header)) {\n return header[0];\n }\n return header;\n};\n\nconst authRequired = process.env.AUTH_REQUIRED === \"true\";\n\n// Note: tokenSecret is resolved lazily inside the hook so that application\n// env (loaded after this module is imported) is honored.\nregisterConsoleAuthHook(app, { authRequired });\n\n// Add default header values for project/workspace isolation\napp.addHook(\"onRequest\", (request, reply, done) => {\n if (!request.headers[\"x-project-id\"]) {\n request.headers[\"x-project-id\"] = \"default\";\n }\n done();\n});\n\n// Add custom logging hooks\napp.addHook(\"onRequest\", (request, reply, done) => {\n const context = {\n \"x-tenant-id\": getHeaderValue(request.headers[\"x-tenant-id\"]),\n \"x-request-id\": getHeaderValue(request.headers[\"x-request-id\"]),\n \"x-user-id\": getHeaderValue(request.headers[\"x-user-id\"]),\n };\n // Update logger context for this request\n if (loggerLattice.updateContext) {\n loggerLattice.updateContext(context);\n }\n done();\n});\n\napp.addHook(\"onResponse\", (request, reply, done) => {\n const context = {\n \"x-tenant-id\": getHeaderValue(request.headers[\"x-tenant-id\"]),\n \"x-request-id\": getHeaderValue(request.headers[\"x-request-id\"]),\n \"x-user-id\": getHeaderValue(request.headers[\"x-user-id\"]),\n };\n //loggerLattice.info(`${request.method} ${request.url} - ${reply.statusCode}`);\n done();\n});\n\n// cors\napp.register(cors, {\n origin: true,\n methods: [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"OPTIONS\", \"PATCH\"],\n allowedHeaders: \"*\",\n exposedHeaders: [\"Content-Type\", \"Content-Disposition\"],\n credentials: true,\n});\napp.register(sensible);\napp.register(multipart, {\n limits: {\n fileSize: Number(process.env.BODY_LIMIT) || 50 * 1024 * 1024,\n },\n});\napp.register(websocket);\n\n// Register static file serving for SDK\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\napp.register(staticPlugin, {\n root: path.join(__dirname, \"../public\"),\n prefix: \"/\",\n});\n\n// Error handler\napp.setErrorHandler((error, request, reply) => {\n const context = {\n \"x-tenant-id\": getHeaderValue(request.headers[\"x-tenant-id\"]),\n \"x-request-id\": getHeaderValue(request.headers[\"x-request-id\"]),\n \"x-user-id\": getHeaderValue(request.headers[\"x-user-id\"]),\n };\n logger.error(\n `请求错误: ${request.method} ${request.url} error:${error.message}`,\n {\n ...context,\n error: error.message,\n stack: error.stack,\n statusCode: error.statusCode || 500,\n }\n );\n reply.status(error.statusCode || 500).send({\n success: false,\n error: error.message || \"服务器内部错误\",\n });\n});\n\n// Logger lattice will be decorated in start() function\n\n/**\n * Logger configuration for gateway\n */\nexport interface GatewayLoggerConfig {\n name?: string;\n description?: string;\n type?: LoggerType;\n serviceName?: string;\n loggerName?: string;\n file?: string | PinoFileOptions;\n context?: Record<string, any>;\n}\n\n// Gateway configuration interface\nexport interface LatticeGatewayConfig {\n port?: number;\n queueServiceConfig?: {\n type: QueueServiceType;\n defaultStartPollingQueue: boolean;\n };\n loggerConfig?: Partial<GatewayLoggerConfig>; // Optional logger configuration to override defaults\n}\n\nfunction getConfiguredSandboxProvider(): ReturnType<typeof createSandboxProvider> {\n const sandboxProviderType =\n (process.env.SANDBOX_PROVIDER_TYPE as CreateSandboxProviderConfig[\"type\"] | undefined) ||\n \"microsandbox-remote\";\n\n return createSandboxProvider({\n type: sandboxProviderType,\n remoteBaseURL: process.env.SANDBOX_BASE_URL,\n microsandboxServiceBaseURL: process.env.MICROSANDBOX_SERVICE_BASE_URL,\n e2bApiKey: process.env.E2B_API_KEY,\n e2bTemplate: process.env.E2B_TEMPLATE,\n e2bTimeoutMs: process.env.E2B_TIMEOUT_MS\n ? parseInt(process.env.E2B_TIMEOUT_MS, 10)\n : undefined,\n daytonaApiKey: process.env.DAYTONA_API_KEY,\n daytonaApiUrl: process.env.DAYTONA_API_URL,\n daytonaTarget: process.env.DAYTONA_TARGET,\n daytonaTimeout: process.env.DAYTONA_TIMEOUT\n ? parseInt(process.env.DAYTONA_TIMEOUT, 10)\n : undefined,\n daytonaVolumeName: process.env.DAYTONA_VOLUME_NAME,\n });\n}\n\n/**\n * Restore MCP server connections that were connected before gateway shutdown.\n * Loads configs with status \"connected\" from the store and reconnects them.\n */\nasync function restoreMcpConnections(): Promise<void> {\n try {\n const storeLattice = getStoreLattice(\"default\", \"mcp\");\n const store = storeLattice.store as McpServerConfigStore;\n if (!store) {\n logger.info(\"MCP store not configured, skipping connection restoration\");\n return;\n }\n\n const configs = await store.getAllConfigs(\"default\");\n const connectedConfigs = configs.filter((c) => c.status === \"connected\");\n\n if (connectedConfigs.length === 0) return;\n\n logger.info(`Restoring ${connectedConfigs.length} MCP server connections...`);\n\n const { convertToConnection } = await import(\"./controllers/mcp-configs\");\n\n for (const config of connectedConfigs) {\n try {\n const connection = convertToConnection(config.config);\n mcpManager.addServer(config.key, connection);\n } catch (err) {\n logger.warn(`Failed to prepare MCP server \"${config.key}\" for restoration`, { error: err });\n }\n }\n\n await mcpManager.connect();\n\n for (const config of connectedConfigs) {\n try {\n await mcpManager.registerToolsToToolLattice(config.key, config.selectedTools);\n logger.info(`MCP server \"${config.key}\" restored with ${config.selectedTools.length} tools`);\n } catch (err) {\n logger.warn(`Failed to register tools for MCP server \"${config.key}\"`, { error: err });\n }\n }\n\n logger.info(`MCP connection restoration complete: ${connectedConfigs.length} servers`);\n } catch (err) {\n logger.error(\"MCP connection restoration failed\", { error: err });\n }\n}\n\n// Start server\nconst start = async (config?: LatticeGatewayConfig) => {\n try {\n // Initialize or update logger configuration if provided\n if (config?.loggerConfig) {\n const loggerConfig: LoggerConfig = {\n ...DEFAULT_LOGGER_CONFIG,\n ...config.loggerConfig,\n // Merge file config if provided\n file: config.loggerConfig.file || DEFAULT_LOGGER_CONFIG.file,\n };\n loggerLattice = initializeLogger(loggerConfig);\n logger = loggerLattice.client;\n }\n\n // Decorate app with logger lattice (only once, in start function)\n // Access via: request.server.loggerLattice or app.loggerLattice\n app.decorate(\"loggerLattice\", loggerLattice);\n\n // Channel infrastructure: use stores from StoreLatticeManager.\n // Applications (e.g. deep_research) register stores via configureStores()\n // before calling startAsHttpEndpoint(). If no stores are registered,\n // channel features are gracefully skipped.\n let channelDeps: { router: MessageRouter; installationStore: ChannelInstallationStore } | undefined;\n const adapterRegistry = new ChannelAdapterRegistry();\n adapterRegistry.register(larkChannelAdapter);\n const { wechatChannelAdapter } = await import(\"./channels/wechat/WechatChannelAdapter\");\n adapterRegistry.register(wechatChannelAdapter);\n try {\n const { getStoreLattice: getStore } = await import(\"@axiom-lattice/core\");\n const bindingStore = getStore(\"default\", \"channelBinding\").store as BindingRegistry;\n const installationStore = getStore(\"default\", \"channelInstallation\").store as ChannelInstallationStore;\n\n setBindingRegistry(bindingStore);\n\n const router = new MessageRouter({\n middlewares: [\n createDeduplicationMiddleware(),\n createRateLimitMiddleware(),\n createAuditLoggerMiddleware(),\n ],\n bindingRegistry: bindingStore,\n adapterRegistry,\n installationStore,\n \n });\n\n channelDeps = { router, installationStore };\n } catch (err) {\n logger.warn(\"Channel infrastructure unavailable\", {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n\n setEvalRunService(evalRunner);\n\n // Initialize MenuRegistry for custom menu items\n try {\n const menuStore = getStoreLattice(\"default\", \"menu\").store;\n setMenuRegistry(menuStore);\n logger.info(\"Menu registry initialized\");\n } catch {\n // Menu store optional — custom menus won't work without it\n }\n\n // Register export/import entity types before routes\n registerAllBuiltinEntities();\n\n // Register all routes (channel routes only active if channelDeps is set)\n // Wire controller deps so enable/disable/delete can manage live connections\n if (channelDeps?.router) {\n setChannelControllerDeps({ adapterRegistry, router: channelDeps.router });\n }\n registerLatticeRoutes(app, channelDeps);\n\n // Register standard A2A 0.3 endpoints (agent card + JSON-RPC + test-call)\n // and the internal A2A key management routes.\n try {\n const { A2AAuthService, parseEnvKeys } = await import(\"./services/a2a/A2AAuthService\");\n const { registerA2AStandardRoutes } = await import(\"./routes/a2a-standard\");\n const a2a = await import(\"./routes/a2a\");\n\n const a2aKeyStore = getStoreLattice(\"default\", \"a2aApiKey\").store as A2AApiKeyStore;\n const assistantStore = getStoreLattice(\"default\", \"assistant\").store as AssistantStore;\n const projectStore = getStoreLattice(\"default\", \"project\").store as ProjectStore;\n const taskStore = getStoreLattice(\"default\", \"task\").store as TaskStore;\n\n const authService = new A2AAuthService({\n keyStore: a2aKeyStore,\n assistantStore,\n projectStore,\n envKeyMap: parseEnvKeys(process.env.A2A_API_KEYS || \"\"),\n allowUnauthenticated: process.env.A2A_ALLOW_UNAUTHENTICATED === \"true\",\n });\n await authService.refresh();\n\n a2a.setA2AKeyStore(a2aKeyStore);\n a2a.setA2AAuthService(authService);\n\n registerA2AStandardRoutes(app, {\n authService,\n getTaskStoreLattice: () => taskStore,\n getAssistantStore: () => assistantStore,\n getProjectStore: () => projectStore,\n });\n a2a.registerA2ARoutes(app);\n logger.info(\"A2A standard routes registered\");\n } catch (err) {\n logger.warn(\"A2A standard routes unavailable\", {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n\n // Register sandbox manager if not already registered\n if (!sandboxLatticeManager.hasLattice(\"default\")) {\n sandboxLatticeManager.registerLattice(\"default\", getConfiguredSandboxProvider());\n logger.info(\"Registered sandbox manager from env configuration\");\n }\n\n // Initialize resource share controller\n try {\n const { ResourceController } = await import(\"./controllers/resources\");\n const sharedResourceStore = getStoreLattice(\"default\", \"sharedResource\").store;\n const cache = new TokenCache();\n const resourceController = new ResourceController({\n store: sharedResourceStore,\n sandboxManager: sandboxLatticeManager,\n cache,\n logger,\n });\n registerResourceRoutes(app, resourceController);\n logger.info(\"Resource share routes registered\");\n } catch (err) {\n logger.warn(\"Resource share infrastructure unavailable\", {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n\n // Connect all enabled channel installations\n if (channelDeps && process.env.CHANNELS_ENABLED !== \"false\") {\n const { connectAllChannels } = await import(\"@axiom-lattice/core\");\n try {\n await connectAllChannels(\n (channel) => adapterRegistry.get(channel),\n { deps: { router: channelDeps.router } },\n );\n } catch (err) {\n logger.error(\"Failed to start channel connections\", {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const target_port = config?.port || Number(process.env.PORT) || 4001;\n\n await app.listen({ port: target_port, host: \"0.0.0.0\" });\n logger.info(`Lattice Gateway is running on port: ${target_port}`);\n\n // Configure queue service\n const queueServiceConfig = config?.queueServiceConfig;\n if (queueServiceConfig) {\n setQueueServiceType(queueServiceConfig.type);\n if (queueServiceConfig.defaultStartPollingQueue) {\n const agentTaskConsumer = new AgentTaskConsumer(target_port);\n agentTaskConsumer.startPollingQueue();\n }\n }\n\n // Restore agent instances with pending messages (fire-and-forget to avoid blocking startup)\n // Temporarily disabled: do not auto-consume pending messages on startup.\n if (process.env.AXIOM_RESTORE_PENDING_ON_STARTUP === \"true\") {\n agentInstanceManager.restore()\n .then((stats) => {\n logger.info(`Agent recovery complete: ${stats.restored} threads restored, ${stats.errors} errors`);\n })\n .catch((error) => {\n logger.error(\"Agent recovery failed\", { error });\n });\n }\n\n // Restore MCP server connections that were connected before shutdown\n restoreMcpConnections().catch((error) => {\n logger.error(\"MCP connection restoration failed\", { error });\n });\n } catch (err) {\n logger.error(\"Server start failed\", { error: err });\n process.exit(1);\n }\n};\n\nconst LatticeGateway = {\n startAsHttpEndpoint: start,\n configureSwagger,\n registerLatticeRoutes,\n app,\n AgentTaskConsumer,\n};\n\nexport { LatticeGateway };\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { agentInstanceManager, getStoreLattice } from \"@axiom-lattice/core\";\nimport type {\n Assistant,\n CreateAssistantRequest,\n} from \"@axiom-lattice/protocols\";\nimport { AgentType } from \"@axiom-lattice/protocols\";\nimport type { A2ARemoteAgentConfig } from \"@axiom-lattice/protocols\";\nimport { randomUUID } from \"crypto\";\nimport type { AgentConfig } from \"@axiom-lattice/core\";\nimport { agentLatticeManager, eventBus } from \"@axiom-lattice/core\";\nimport { localA2AService } from \"../services/local-a2a\";\nimport { normalizeA2AAgentCardUrl } from \"../utils/a2a-url\";\nimport {\n getAgentCardPort,\n validateLocalRuntimeCommand,\n validateLocalRuntimePort,\n} from \"../utils/local-a2a-runtime\";\n\n/**\n * Assistant Controller\n * Handles assistant-related CRUD operations\n * Merges code-configured agents (from @axiom-lattice/core) with in-memory stored assistants\n * GET operations return both code-configured and stored assistants\n * CUD operations only work on stored assistants\n */\n\n/**\n * Get tenant ID from authenticated user context\n * Falls back to request headers for backward compatibility\n */\nfunction getTenantId(request: FastifyRequest): string {\n // First try to get from authenticated user context\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) {\n return userTenantId;\n }\n\n // Fallback to request headers for backward compatibility\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\nfunction getUserId(request: FastifyRequest): string | undefined {\n const userId = (request as any).user?.id;\n if (userId) return userId;\n return (request.headers[\"x-user-id\"] as string) || undefined;\n}\n\n/**\n * Convert AgentConfig to Assistant format\n */\nfunction convertAgentConfigToAssistant(config: AgentConfig): Assistant {\n return {\n id: config.key,\n tenantId: \"default\", // Code-configured agents belong to default tenant\n name: config.name,\n description: config.description,\n graphDefinition: config, // Store the full config as graphDefinition\n createdAt: new Date(0), // Code-configured agents have no creation date\n updatedAt: new Date(0), // Code-configured agents have no update date\n };\n}\n\n/**\n * Assistant list response interface\n */\ninterface AssistantListResponse {\n success: boolean;\n message: string;\n data: {\n records: Assistant[];\n total: number;\n };\n}\n\n/**\n * Assistant response interface\n */\ninterface AssistantResponse {\n success: boolean;\n message: string;\n data?: Assistant;\n}\n\n/**\n * Assistant update request body interface\n */\ninterface AssistantUpdateBody {\n name?: string;\n description?: string;\n graphDefinition?: any;\n}\n\n/**\n * Get list of all assistants\n * Merges code-configured agents with stored assistants\n */\nexport async function getAssistantList(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<AssistantListResponse> {\n const tenantId = getTenantId(request);\n\n // Get code-configured agents for the tenant\n const agentConfigs = await agentLatticeManager.getAllAgentConfigsByTenant(tenantId);\n const codeConfiguredAssistants = agentConfigs.map(\n convertAgentConfigToAssistant\n );\n\n // Get stored assistants for the tenant\n const storeLattice = getStoreLattice(\"default\", \"assistant\");\n const assistantStore = storeLattice.store;\n const storedAssistants = await assistantStore.getAllAssistants(tenantId);\n\n // Merge both sources, stored assistants take precedence if ID conflicts\n const assistantMap = new Map<string, Assistant>();\n\n // First add code-configured agents\n codeConfiguredAssistants.forEach((assistant) => {\n assistantMap.set(assistant.id, assistant);\n });\n\n // Then add stored assistants (overwrite if ID exists)\n storedAssistants.forEach((assistant) => {\n assistantMap.set(assistant.id, assistant);\n });\n\n const allAssistants = Array.from(assistantMap.values());\n\n // Filter: exclude personal assistants owned by other users\n const userId = getUserId(request);\n const filtered = allAssistants.filter((a) => {\n if (!a.ownerUserId) return true;\n return a.ownerUserId === userId;\n });\n\n return {\n success: true,\n message: \"Successfully retrieved assistant list\",\n data: {\n records: filtered,\n total: filtered.length,\n },\n };\n}\n\n/**\n * Get a single assistant by ID\n * Checks both code-configured agents and stored assistants\n */\nexport async function getAssistant(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n): Promise<AssistantResponse> {\n const { id } = request.params;\n const tenantId = getTenantId(request);\n\n // First check stored assistants\n const storeLattice = getStoreLattice(\"default\", \"assistant\");\n const assistantStore = storeLattice.store;\n let assistant = await assistantStore.getAssistantById(tenantId, id);\n\n // If not found in store, check code-configured agents for the tenant\n if (!assistant) {\n const agentConfig = await agentLatticeManager.getAgentConfigWithTenant(tenantId, id);\n if (agentConfig) {\n assistant = convertAgentConfigToAssistant(agentConfig);\n }\n }\n\n if (!assistant) {\n return reply.status(404).send({\n success: false,\n message: \"Assistant not found\",\n });\n }\n\n return {\n success: true,\n message: \"Successfully retrieved assistant\",\n data: assistant,\n };\n}\n\n/**\n * Upsert assistant - create if not exists in store, update if exists\n */\nasync function upsertAssistant(\n tenantId: string,\n id: string,\n data: CreateAssistantRequest | AssistantUpdateBody,\n reply: FastifyReply,\n requireFields: boolean = false\n): Promise<AssistantResponse> {\n const storeLattice = getStoreLattice(\"default\", \"assistant\");\n const assistantStore = storeLattice.store;\n\n const exists = await assistantStore.hasAssistant(tenantId, id);\n\n let assistant: Assistant | null;\n if (exists) {\n assistant = await assistantStore.updateAssistant(tenantId, id, data);\n if (!assistant) {\n return reply.status(500).send({\n success: false,\n message: \"Failed to update assistant\",\n });\n }\n eventBus.publish(\"assistant:updated\", { id: assistant.id, name: assistant.name, tenantId });\n return {\n success: true,\n message: \"Updated assistant\",\n data: assistant,\n };\n }\n\n if (requireFields) {\n const createData = data as CreateAssistantRequest;\n if (!createData.name || !createData.graphDefinition) {\n return reply.status(400).send({\n success: false,\n message: \"name and graphDefinition are required\",\n });\n }\n }\n\n assistant = await assistantStore.createAssistant(tenantId, id, data as CreateAssistantRequest);\n eventBus.publish(\"assistant:created\", { id: assistant.id, name: assistant.name, tenantId });\n return reply.status(201).send({\n success: true,\n message: \"Created assistant\",\n data: assistant,\n });\n}\n\n/**\n * Create a new assistant\n */\nexport async function createAssistant(\n request: FastifyRequest<{ Body: CreateAssistantRequest & { id?: string } }>,\n reply: FastifyReply\n): Promise<AssistantResponse> {\n const tenantId = getTenantId(request);\n const data = request.body;\n\n if (!data.name || !data.graphDefinition) {\n return reply.status(400).send({\n success: false,\n message: \"name and graphDefinition are required\",\n });\n }\n\n const id = data.id ?? randomUUID();\n\n // A2A_REMOTE: validate agentCardUrl, check localRuntime conflicts\n if (\n data.graphDefinition &&\n (data.graphDefinition as AgentConfig).type === AgentType.A2A_REMOTE\n ) {\n const a2aConfig = data.graphDefinition as A2ARemoteAgentConfig;\n const warnings: string[] = [];\n const isLocalManaged = !!a2aConfig.localRuntime;\n a2aConfig.agentCardUrl = normalizeA2AAgentCardUrl(\n a2aConfig.agentCardUrl,\n isLocalManaged ? \"http://\" : \"https://\",\n );\n\n if (a2aConfig.localRuntime) {\n const commandValidation = validateLocalRuntimeCommand(\n a2aConfig.localRuntime,\n );\n if (!commandValidation.ok) {\n return reply.status(400).send({\n success: false,\n message: commandValidation.error,\n });\n }\n a2aConfig.localRuntime.command.executable =\n a2aConfig.localRuntime.command.executable.trim();\n\n a2aConfig.localRuntime.agentCardUrl = normalizeA2AAgentCardUrl(\n a2aConfig.localRuntime.agentCardUrl || a2aConfig.agentCardUrl,\n \"http://\",\n );\n a2aConfig.agentCardUrl = a2aConfig.localRuntime.agentCardUrl;\n\n const portValidation = validateLocalRuntimePort(\n a2aConfig.localRuntime,\n a2aConfig.agentCardUrl,\n );\n if (!portValidation.ok) {\n return reply.status(400).send({\n success: false,\n message: portValidation.error,\n });\n }\n }\n\n if (a2aConfig.localRuntime) {\n const existingAssistants = await getStoreLattice(\"default\", \"assistant\").store.getAllAssistants(tenantId);\n const targetPort = getAgentCardPort(a2aConfig.localRuntime.agentCardUrl);\n const duplicate = existingAssistants.find((a) => {\n if (a.id === id) return false;\n const gd = a.graphDefinition && typeof a.graphDefinition === \"object\"\n ? a.graphDefinition\n : undefined;\n if (!gd || (gd as { type?: unknown }).type !== AgentType.A2A_REMOTE) return false;\n const lr = (gd as A2ARemoteAgentConfig).localRuntime;\n if (!lr) return false;\n const existingAgentCardUrl = normalizeA2AAgentCardUrl(lr.agentCardUrl, \"http://\");\n const existingPort = getAgentCardPort(existingAgentCardUrl);\n if (targetPort !== null && existingPort !== null) {\n return existingPort === targetPort;\n }\n return existingAgentCardUrl === a2aConfig.localRuntime!.agentCardUrl;\n });\n if (duplicate) {\n const conflictDetail = targetPort === null\n ? `agentCardUrl \"${a2aConfig.localRuntime.agentCardUrl}\"`\n : `port ${targetPort}`;\n return reply.status(409).send({\n success: false,\n message: `A local managed A2A assistant using ${conflictDetail} already exists: \"${duplicate.name}\". Each local managed A2A assistant needs a unique port.`,\n });\n }\n }\n\n // Validate agentCardUrl reachability (non-blocking)\n try {\n const resp = await fetch(a2aConfig.agentCardUrl, {\n signal: AbortSignal.timeout(5000),\n });\n if (!resp.ok) {\n warnings.push(`agentCardUrl returned HTTP ${resp.status}`);\n }\n } catch {\n warnings.push(`agentCardUrl is not reachable: ${a2aConfig.agentCardUrl}`);\n }\n\n if (warnings.length > 0) {\n console.warn(`[createAssistant] A2A warnings for ${a2aConfig.agentCardUrl}:`, warnings);\n }\n }\n\n return upsertAssistant(tenantId, id, data, reply, true);\n}\n\n/**\n * Update an existing assistant by ID\n */\nexport async function updateAssistant(\n request: FastifyRequest<{\n Params: { id: string };\n Body: AssistantUpdateBody;\n }>,\n reply: FastifyReply\n): Promise<AssistantResponse> {\n const tenantId = getTenantId(request);\n const { id } = request.params;\n const updates = request.body;\n\n return upsertAssistant(tenantId, id, updates, reply, false);\n}\n\n/**\n * Delete an assistant by ID\n * For stored assistants: deletes from store\n * For local A2A agents: stops provider, unregisters from lattice, then deletes from store\n * For code-configured assistants: only deletes from store if exists (code registration remains)\n */\nexport async function deleteAssistant(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string }> {\n const tenantId = getTenantId(request);\n const { id } = request.params;\n\n const storeLattice = getStoreLattice(\"default\", \"assistant\");\n const assistantStore = storeLattice.store;\n\n const storedAssistant = await assistantStore.getAssistantById(tenantId, id);\n const graphDefinition = storedAssistant?.graphDefinition;\n const hasLocalRuntime =\n graphDefinition && typeof graphDefinition === \"object\"\n ? !!(graphDefinition as A2ARemoteAgentConfig).localRuntime\n : false;\n\n if (storedAssistant && hasLocalRuntime) {\n localA2AService.removeState(id);\n const deleted = await assistantStore.deleteAssistant(tenantId, id);\n if (!deleted) {\n return reply.status(500).send({\n success: false,\n message: \"Failed to delete assistant\",\n });\n }\n eventBus.publish(\"assistant:deleted\", { id, tenantId });\n return {\n success: true,\n message: \"Deleted local A2A assistant\",\n };\n }\n\n const agentConfig = await agentLatticeManager.getAgentConfigWithTenant(tenantId, id);\n const isCodeConfigured = !!agentConfig;\n\n if (isCodeConfigured) {\n if (!storedAssistant) {\n return reply.status(404).send({\n success: false,\n message: \"Assistant not found (code-configured assistants cannot be deleted from code, only from store)\",\n });\n }\n await assistantStore.deleteAssistant(tenantId, id);\n eventBus.publish(\"assistant:deleted\", { id, tenantId });\n return {\n success: true,\n message: \"Deleted assistant from store (code-configured registration remains)\",\n };\n }\n\n if (!storedAssistant) {\n return reply.status(404).send({\n success: false,\n message: \"Assistant not found\",\n });\n }\n\n const deleted = await assistantStore.deleteAssistant(tenantId, id);\n\n if (!deleted) {\n return reply.status(500).send({\n success: false,\n message: \"Failed to delete assistant\",\n });\n }\n\n eventBus.publish(\"assistant:deleted\", { id, tenantId });\n\n // Clean up UserTenantLink metadata if this was a personal assistant\n const userId = getUserId(request);\n if (userId) {\n try {\n const linkStore = getStoreLattice(\"default\", \"userTenantLink\").store;\n const link = await linkStore.getLink(userId, tenantId);\n const meta = (link?.metadata || {}) as Record<string, unknown>;\n if (meta.personalAssistantId === id) {\n delete meta.personalAssistantId;\n delete meta.personalProjectId;\n delete meta.personalWorkspaceId;\n await linkStore.updateLink(userId, tenantId, { metadata: meta } as any);\n }\n } catch { /* best effort */ }\n }\n\n return {\n success: true,\n message: \"Successfully deleted assistant\",\n };\n}\n\n/**\n * Get agent graph visualization\n */\nexport const getAgentGraph = async (\n request: FastifyRequest<{\n Params: { assistantId: string };\n }>,\n reply: FastifyReply\n) => {\n try {\n const { assistantId } = request.params;\n const tenant_id = getTenantId(request);\n\n const agent = agentInstanceManager.getAgent({ assistant_id: assistantId, tenant_id, thread_id: '' })\n\n // Call drawing service to get image data\n const imageData = await agent.get_draw_graph()\n\n // Set response header and return image data\n reply.header(\"Content-Type\", \"application/json\").send({\n image: imageData,\n });\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: error.message || \"Failed to get agent graph\",\n });\n }\n};\n\n/**\n * Aggregate runtime + eval stats for all assistants (governance card metrics).\n *\n * For each assistant:\n * - threads: total count, 7d/30d activity, last activity, daily activity arrays\n * - eval: latest score, pass rate, recent score trend (from the eval-{agentId} project)\n *\n * Results are cached per tenant for STATS_CACHE_TTL_MS (5 minutes): the\n * aggregation touches every assistant's threads and eval runs, so the card\n * grid should read from cache rather than recompute on every render.\n */\nconst STATS_CACHE_TTL_MS = 5 * 60 * 1000;\nconst statsCache = new Map<string, { data: unknown; expiresAt: number }>();\n\ninterface StatsCacheInfo {\n /** When this cached snapshot expires (ISO). */\n expiresAt: string;\n /** Milliseconds remaining until expiry. */\n remainingMs: number;\n /** Whether this response was served from cache. */\n cached: boolean;\n}\n\nexport async function getAssistantStats(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string; data?: unknown; cache?: StatsCacheInfo }> {\n const tenantId = getTenantId(request);\n\n // Serve from cache when fresh.\n const cached = statsCache.get(tenantId);\n if (cached && cached.expiresAt > Date.now()) {\n return {\n success: true,\n message: \"Ok (cached)\",\n data: cached.data,\n cache: {\n expiresAt: new Date(cached.expiresAt).toISOString(),\n remainingMs: cached.expiresAt - Date.now(),\n cached: true,\n },\n };\n }\n\n try {\n // Resolve assistants (same merge as getAssistantList).\n const agentConfigs = await agentLatticeManager.getAllAgentConfigsByTenant(tenantId);\n const codeConfiguredAssistants = agentConfigs.map(convertAgentConfigToAssistant);\n const storeLattice = getStoreLattice(\"default\", \"assistant\");\n const assistantStore = storeLattice.store;\n const storedAssistants = await assistantStore.getAllAssistants(tenantId);\n\n const assistantMap = new Map<string, Assistant>();\n codeConfiguredAssistants.forEach((a) => assistantMap.set(a.id, a));\n storedAssistants.forEach((a) => assistantMap.set(a.id, a));\n\n const userId = getUserId(request);\n const assistants = Array.from(assistantMap.values()).filter((a) => {\n if (!a.ownerUserId) return true;\n return a.ownerUserId === userId;\n });\n\n // Load threads + eval data in parallel.\n const threadStore = getStoreLattice(\"default\", \"thread\").store;\n const evalStore = getStoreLattice(\"default\", \"eval\").store;\n\n const now = Date.now();\n const ms7d = 7 * 86400000;\n const ms30d = 30 * 86400000;\n\n const records = await Promise.all(\n assistants.map(async (assistant) => {\n // ── Threads ──\n let threadCount = 0;\n let last7d = 0;\n let last30d = 0;\n let lastActive: Date | null = null;\n const daily7d: number[] = new Array(7).fill(0);\n const daily30d: number[] = new Array(30).fill(0);\n try {\n const threads = await threadStore.getThreadsByAssistantId(tenantId, assistant.id);\n threadCount = threads.length;\n for (const t of threads) {\n const created = new Date(t.createdAt).getTime();\n if (created >= now - ms7d) last7d++;\n if (created >= now - ms30d) last30d++;\n const idx7 = Math.floor((now - created) / 86400000);\n if (idx7 >= 0 && idx7 < 7) daily7d[6 - idx7]++;\n const idx30 = Math.floor((now - created) / 86400000);\n if (idx30 >= 0 && idx30 < 30) daily30d[29 - idx30]++;\n const updated = new Date(t.updatedAt).getTime();\n if (lastActive === null || updated > lastActive.getTime()) {\n lastActive = new Date(t.updatedAt);\n }\n }\n } catch { /* thread store unavailable — zeros */ }\n\n // ── Eval ──\n let evalScore: number | null = null;\n let evalPassRate: number | null = null;\n let evalRuns = 0;\n let evalTrend: number[] = [];\n try {\n const projects = await evalStore.getProjectsByTenant(tenantId);\n const project = projects.find((p: any) => p.name === `eval-${assistant.id}`);\n if (project) {\n const runs = await evalStore.getRunsByTenant(tenantId, { projectId: project.id });\n evalRuns = runs.length;\n const sorted = [...runs].sort(\n (a: any, b: any) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()\n );\n evalTrend = sorted\n .map((r: any) => (typeof r.avgScore === \"number\" ? r.avgScore : null))\n .filter((v): v is number => v !== null);\n const latest: any = sorted[sorted.length - 1];\n if (latest) {\n evalScore = typeof latest.avgScore === \"number\" ? latest.avgScore : null;\n if (latest.totalCases > 0) {\n evalPassRate = Math.round((latest.passedCases / latest.totalCases) * 100);\n }\n }\n }\n } catch { /* eval store unavailable — nulls */ }\n\n return {\n id: assistant.id,\n threadCount,\n last7d,\n last30d,\n lastActive: lastActive ? lastActive.toISOString() : null,\n daily7d,\n daily30d,\n evalScore,\n evalPassRate,\n evalRuns,\n evalTrend: evalTrend.slice(-8),\n };\n })\n );\n\n const payload = { records };\n const expiresAt = Date.now() + STATS_CACHE_TTL_MS;\n statsCache.set(tenantId, { data: payload, expiresAt });\n return {\n success: true,\n message: \"Ok\",\n data: payload,\n cache: {\n expiresAt: new Date(expiresAt).toISOString(),\n remainingMs: STATS_CACHE_TTL_MS,\n cached: false,\n },\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to get assistant stats\";\n return reply.status(500).send({ success: false, message });\n }\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { existsSync, statSync } from \"node:fs\";\nimport { dirname, join, parse, resolve } from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport {\n type LocalA2AProviderState,\n type LocalRuntimeConfig,\n} from \"@axiom-lattice/protocols\";\n\ninterface LocalA2AProcessState extends LocalA2AProviderState {\n enabled: boolean;\n localRuntime?: LocalRuntimeConfig;\n process?: ChildProcess;\n}\n\nconst STDERR_TAIL_LIMIT = 4096;\n\nfunction readBooleanEnv(\n name: string,\n defaultValue: boolean,\n env: NodeJS.ProcessEnv = process.env,\n): boolean {\n const value = env[name];\n if (value === undefined) return defaultValue;\n return value === \"1\" || value.toLowerCase() === \"true\";\n}\n\nexport function findWorkspaceRoot(startDir: string): string | null {\n let current = resolve(startDir);\n\n const { root } = parse(current);\n\n while (current !== root) {\n if (existsSync(join(current, \"pnpm-workspace.yaml\"))) {\n return current;\n }\n\n const parent = dirname(current);\n if (parent === current) return null;\n current = parent;\n }\n\n return null;\n}\n\nexport function resolveLocalA2AWorkingDirectory(options: {\n envWorkdir?: string;\n commandCwd?: string;\n currentCwd: string;\n}): string {\n if (options.envWorkdir) return options.envWorkdir;\n if (options.commandCwd) return options.commandCwd;\n return findWorkspaceRoot(options.currentCwd) || options.currentCwd;\n}\n\nfunction validateWorkingDirectory(cwd: string): string | null {\n try {\n const stat = statSync(cwd);\n if (!stat.isDirectory()) {\n return `Working directory is not a directory: ${cwd}`;\n }\n return null;\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return `Working directory is not accessible: ${cwd} (${message})`;\n }\n}\n\nexport function appendStderrTail(current: string, chunk: string): string {\n const next = `${current}${chunk}`;\n if (next.length <= STDERR_TAIL_LIMIT) return next;\n return next.slice(-STDERR_TAIL_LIMIT);\n}\n\nfunction formatExitMessage(exitReason: string | number, stderrTail: string): string {\n const stderr = stderrTail.trim();\n return stderr\n ? `Exited before becoming ready (${exitReason}): ${stderr}`\n : `Exited before becoming ready (${exitReason})`;\n}\n\nasync function probeReady(\n agentCardUrl: string,\n healthUrl: string | undefined,\n timeoutMs: number,\n): Promise<boolean> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n if (healthUrl) {\n const resp = await fetch(healthUrl, { signal: controller.signal });\n if (!resp.ok) return false;\n }\n const cardResp = await fetch(agentCardUrl, { signal: controller.signal });\n return cardResp.ok;\n } catch {\n return false;\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport class LocalA2AService {\n private static instance: LocalA2AService | null = null;\n private states: Map<string, LocalA2AProcessState> = new Map();\n private autoStartEnabled: boolean;\n\n constructor() {\n this.autoStartEnabled = readBooleanEnv(\"LOCAL_A2A_AUTO_START\", true);\n }\n\n public static getInstance(): LocalA2AService {\n if (!LocalA2AService.instance) {\n LocalA2AService.instance = new LocalA2AService();\n }\n return LocalA2AService.instance;\n }\n\n getOrCreateState(\n runtimeId: string,\n localRuntime: LocalRuntimeConfig,\n ): LocalA2AProcessState {\n let state = this.states.get(runtimeId);\n if (!state) {\n state = {\n runtimeId,\n label: localRuntime.label || runtimeId,\n status: this.autoStartEnabled ? \"stopped\" : \"disabled\",\n enabled: this.autoStartEnabled,\n assistantId: runtimeId,\n agentCardUrl: localRuntime.agentCardUrl,\n healthUrl: localRuntime.healthUrl,\n localRuntime,\n };\n this.states.set(runtimeId, state);\n } else {\n state.localRuntime = localRuntime;\n state.label = localRuntime.label || state.label;\n state.agentCardUrl = localRuntime.agentCardUrl;\n state.healthUrl = localRuntime.healthUrl;\n }\n return state;\n }\n\n async getRegisteredState(\n runtimeId: string,\n localRuntime: LocalRuntimeConfig,\n ): Promise<LocalA2AProviderState> {\n const state = this.getOrCreateState(runtimeId, localRuntime);\n\n if (state.process && state.status === \"running\") {\n const alive = await probeReady(\n localRuntime.agentCardUrl,\n localRuntime.healthUrl,\n 2000,\n );\n if (!alive) {\n state.process = undefined;\n state.pid = undefined;\n state.status = \"stopped\";\n state.message = \"Process exited unexpectedly\";\n }\n }\n\n return this.snapshotState(state);\n }\n\n async startProvider(\n runtimeId: string,\n localRuntime: LocalRuntimeConfig,\n ): Promise<LocalA2AProviderState> {\n const state = this.getOrCreateState(runtimeId, localRuntime);\n\n if (!state.enabled) {\n state.status = \"disabled\";\n state.message = \"Disabled by configuration\";\n return this.snapshotState(state);\n }\n\n if (state.process && state.status === \"running\") {\n return this.snapshotState(state);\n }\n\n state.enabled = true;\n const { executable, args, cwd, env: cmdEnv } = localRuntime.command;\n const resolvedCwd = resolveLocalA2AWorkingDirectory({\n envWorkdir: process.env.LOCAL_A2A_WORKDIR || undefined,\n commandCwd: cwd,\n currentCwd: process.cwd(),\n });\n const cwdError = validateWorkingDirectory(resolvedCwd);\n if (cwdError) {\n state.process = undefined;\n state.pid = undefined;\n state.status = \"failed\";\n state.message = cwdError;\n return this.snapshotState(state);\n }\n\n state.status = \"starting\";\n state.message = \"Starting\";\n let stderrTail = \"\";\n\n const childEnv = cmdEnv ? { ...process.env, ...cmdEnv } : process.env;\n\n const child = spawn(executable, args, {\n cwd: resolvedCwd,\n env: childEnv,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: false,\n });\n\n state.process = child;\n state.pid = child.pid ?? undefined;\n\n child.once(\"error\", (error: Error) => {\n const current = this.states.get(runtimeId);\n if (!current) return;\n current.process = undefined;\n current.pid = undefined;\n current.status = \"failed\";\n const stderr = stderrTail.trim();\n current.message = stderr\n ? `Failed to start: ${error.message}: ${stderr}`\n : `Failed to start: ${error.message}`;\n });\n\n child.stdout.on(\"data\", (chunk: Buffer) => {\n const text = chunk.toString(\"utf8\").trim();\n if (text) console.log(`[local-a2a:${runtimeId}] ${text}`);\n });\n child.stderr.on(\"data\", (chunk: Buffer) => {\n const rawText = chunk.toString(\"utf8\");\n stderrTail = appendStderrTail(stderrTail, rawText);\n const text = rawText.trim();\n if (text) console.error(`[local-a2a:${runtimeId}] ${text}`);\n });\n child.on(\"close\", (code, signal) => {\n const current = this.states.get(runtimeId);\n if (!current) return;\n current.process = undefined;\n current.pid = undefined;\n const exitReason = signal ?? code ?? \"unknown\";\n if (current.status === \"running\") {\n current.status = \"stopped\";\n current.message = `Stopped (${exitReason})`;\n } else if (current.status === \"starting\") {\n current.status = \"failed\";\n current.message = formatExitMessage(exitReason, stderrTail);\n }\n });\n\n const ready = await this.waitUntilReady(localRuntime, state, 15000);\n if (!ready) {\n if (state.process) {\n state.process.kill(\"SIGTERM\");\n }\n state.process = undefined;\n state.pid = undefined;\n if ((state.status as string) !== \"failed\") {\n state.status = \"failed\";\n state.message = \"Server did not become ready\";\n }\n return this.snapshotState(state);\n }\n\n state.status = \"running\";\n state.message = \"Running\";\n state.lastStartedAt = new Date().toISOString();\n return this.snapshotState(state);\n }\n\n async stopProvider(runtimeId: string): Promise<LocalA2AProviderState> {\n const state = this.states.get(runtimeId);\n if (!state) {\n return this.emptyState(runtimeId);\n }\n\n const child = state.process;\n if (child) {\n child.kill(\"SIGTERM\");\n await delay(750);\n if (child.exitCode === null) {\n child.kill(\"SIGKILL\");\n }\n state.process = undefined;\n }\n state.pid = undefined;\n state.status = \"stopped\";\n state.message = \"Stopped\";\n state.lastStoppedAt = new Date().toISOString();\n return this.snapshotState(state);\n }\n\n async restartProvider(\n runtimeId: string,\n localRuntime: LocalRuntimeConfig,\n ): Promise<LocalA2AProviderState> {\n await this.stopProvider(runtimeId);\n return this.startProvider(runtimeId, localRuntime);\n }\n\n removeState(runtimeId: string): void {\n const state = this.states.get(runtimeId);\n if (state?.process) {\n state.process.kill(\"SIGTERM\");\n state.process = undefined;\n }\n this.states.delete(runtimeId);\n }\n\n private async waitUntilReady(\n localRuntime: LocalRuntimeConfig,\n state: LocalA2AProcessState,\n timeoutMs: number,\n ): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n if (state.status === \"failed\") return false;\n if (await probeReady(localRuntime.agentCardUrl, localRuntime.healthUrl, 1500)) {\n return true;\n }\n await delay(500);\n }\n return false;\n }\n\n private emptyState(runtimeId: string): LocalA2AProviderState {\n return {\n runtimeId,\n label: runtimeId,\n status: \"stopped\",\n enabled: false,\n };\n }\n\n private snapshotState(state: LocalA2AProcessState): LocalA2AProviderState {\n return {\n runtimeId: state.runtimeId,\n label: state.label,\n status: state.status,\n enabled: state.enabled,\n assistantId: state.assistantId,\n agentCardUrl: state.agentCardUrl,\n healthUrl: state.healthUrl,\n pid: state.pid,\n message: state.message,\n lastStartedAt: state.lastStartedAt,\n lastStoppedAt: state.lastStoppedAt,\n };\n }\n}\n\nexport const localA2AService = LocalA2AService.getInstance();\n","const AGENT_CARD_PATH = \"/.well-known/agent-card.json\";\n\nexport function normalizeA2AAgentCardUrl(\n value: string | undefined,\n defaultProtocol: \"http://\" | \"https://\" = \"https://\"\n): string {\n const raw = value?.trim() ?? \"\";\n if (!raw) return \"\";\n\n const withProtocol = /^https?:\\/\\//i.test(raw)\n ? raw\n : `${defaultProtocol}${raw.replace(/^\\/+/, \"\")}`;\n const trimmed = withProtocol.replace(/\\/+$/, \"\");\n\n if (trimmed.endsWith(AGENT_CARD_PATH)) {\n return trimmed;\n }\n\n return `${trimmed}${AGENT_CARD_PATH}`;\n}\n","import type { LocalRuntimeConfig } from \"@axiom-lattice/protocols\";\n\nexport type LocalRuntimeValidationResult =\n | { ok: true }\n | { ok: false; error: string };\n\nexport function validateLocalRuntimeCommand(\n localRuntime: LocalRuntimeConfig,\n): LocalRuntimeValidationResult {\n const runtime = localRuntime as unknown as {\n command?: { executable?: unknown; args?: unknown };\n };\n const executable = runtime.command?.executable;\n if (typeof executable !== \"string\" || executable.trim().length === 0) {\n return {\n ok: false,\n error: \"Local managed A2A command executable is required\",\n };\n }\n\n const args = runtime.command?.args;\n if (!Array.isArray(args) || !args.every((arg) => typeof arg === \"string\")) {\n return {\n ok: false,\n error: \"Local managed A2A command args must be an array of strings\",\n };\n }\n\n return { ok: true };\n}\n\nexport function getAgentCardPort(agentCardUrl: string): number | null {\n let url: URL;\n try {\n url = new URL(agentCardUrl);\n } catch {\n return null;\n }\n\n if (url.port) {\n const port = Number(url.port);\n return Number.isInteger(port) ? port : null;\n }\n\n if (url.protocol === \"http:\") return 80;\n if (url.protocol === \"https:\") return 443;\n return null;\n}\n\nfunction parseCommandPort(args: string[]): number | null {\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n const match = /^(--port|-p)(?:[=\\s]+(\\d+))?$/.exec(arg);\n if (!match) continue;\n\n const inlinePort = match[2];\n if (inlinePort) return Number(inlinePort);\n\n const nextArg = args[index + 1];\n if (nextArg && /^\\d+$/.test(nextArg)) {\n return Number(nextArg);\n }\n }\n\n return null;\n}\n\nfunction isLoopbackHost(hostname: string): boolean {\n const normalized = hostname.toLowerCase();\n return (\n normalized === \"localhost\" ||\n normalized === \"127.0.0.1\" ||\n normalized === \"::1\" ||\n normalized === \"[::1]\"\n );\n}\n\nexport function validateLocalRuntimePort(\n localRuntime: LocalRuntimeConfig,\n agentCardUrl: string,\n): LocalRuntimeValidationResult {\n let url: URL;\n try {\n url = new URL(agentCardUrl);\n } catch {\n return { ok: true };\n }\n\n if (!isLoopbackHost(url.hostname) || !url.port) {\n return { ok: true };\n }\n\n const commandPort = parseCommandPort(localRuntime.command.args);\n if (commandPort === null) {\n return { ok: true };\n }\n\n const agentCardPort = Number(url.port);\n if (commandPort === agentCardPort) {\n return { ok: true };\n }\n\n return {\n ok: false,\n error: `Local managed A2A command port (${commandPort}) does not match agentCardUrl port (${agentCardPort}). Update the command args or Agent Card URL so they use the same port.`,\n };\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { CreateRunRequest } from \"../types\";\nimport { v4 } from \"uuid\";\nimport {\n Agent,\n ThreadStatus,\n agentLatticeManager,\n agentInstanceManager,\n QueueMode,\n} from \"@axiom-lattice/core\";\nimport { MessageChunkTypes } from \"@axiom-lattice/protocols\";\nimport { executeScopedAgentMessage } from \"../services/agents/ScopedAgentExecution\";\nimport { pipeAsyncIterableToSse } from \"../services/streaming/pipeAsyncIterableToSse\";\n\nfunction getUserId(request: FastifyRequest): string | undefined {\n const authUser = (request as any).user;\n if (authUser?.id) return authUser.id;\n return (request.headers[\"x-user-id\"] as string) || undefined;\n}\n\ninterface ResumeStreamRequest {\n thread_id: string;\n assistant_id: string\n message_id: string;\n known_content: string;\n poll_interval?: number;\n}\n\n// Create run\nexport const createRun = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const {\n assistant_id,\n thread_id,\n message_id,\n command,\n streaming,\n background,\n custom_run_config,\n mode,\n ...input\n } = request.body as CreateRunRequest;\n\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n const workspace_id = request.headers[\"x-workspace-id\"] as string;\n const project_id = request.headers[\"x-project-id\"] as string;\n const x_request_id = (request.headers[\"x-request-id\"] as string) || v4();\n const user_id = getUserId(request);\n\n // Merge user_id, project_id, workspace_id into custom_run_config for downstream propagation\n const mergedConfig = {\n ...custom_run_config,\n ...(user_id && { user_id }),\n };\n\n // Validate request\n if (!assistant_id) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n // Get or create Agent instance (ensures single instance per thread)\n const agent = agentInstanceManager.getAgent({\n assistant_id,\n thread_id,\n tenant_id,\n workspace_id,\n project_id,\n custom_run_config: mergedConfig,\n });\n\n\n // ADR-026: background mode — enqueue only, returns 202.\n // Chunk delivery is handled by the thread-level resume_stream SSE.\n if (background) {\n const messageInput = message_id\n ? { ...input, id: message_id }\n : input;\n\n const result = await agent.addMessage({\n input: messageInput,\n command,\n custom_run_config: mergedConfig,\n }, mode as QueueMode);\n\n reply.status(202).send({\n success: true,\n messageId: result.messageId,\n queued: true,\n });\n return;\n }\n\n // Handle streaming requests\n if (streaming) {\n // Setup SSE\n reply.hijack();\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n\n try {\n\n // Execute agent with streaming\n // Only pass id if message_id is provided (for backward compatibility)\n const messageInput = message_id \n ? { ...input, id: message_id }\n : input;\n \n const result = await executeScopedAgentMessage(agent, {\n input: messageInput,\n command,\n custom_run_config: mergedConfig,\n }, [MessageChunkTypes.MESSAGE_COMPLETED, MessageChunkTypes.INTERRUPT, MessageChunkTypes.MESSAGE_FAILED], {\n queueMode: mode as QueueMode,\n });\n\n // const agentStatus = await agent.getRunStatus()\n // console.log(agentStatus)\n // if (agentStatus === \"busy\") {\n // reply.status(200).send({\n // success: true,\n\n // });\n // return\n // }\n\n await pipeAsyncIterableToSse(reply.raw, result.stream, {\n onError: (error) => [{\n type: \"error\",\n data: {\n id: v4(),\n content: error instanceof Error ? error.message : \"Stream processing error\",\n },\n }],\n });\n } catch (error: any) {\n // Send error as SSE event\n const errorEvent = {\n type: 'error',\n data: {\n id: v4(),\n content: error.message || 'Stream processing error',\n },\n };\n reply.raw.write(`data: ${JSON.stringify(errorEvent)}\\n\\n`);\n } finally {\n if (!reply.raw.writableEnded && !reply.raw.destroyed) reply.raw.end();\n }\n } else {\n // Non-streaming: use agentExecutor\n const { message: msg, ...restInputNonStream } = input;\n const result = await agent.invoke({\n input: { message: msg, ...restInputNonStream },\n command,\n custom_run_config: mergedConfig,\n });\n reply.status(200).send({\n success: true,\n ...result,\n });\n }\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `创建运行时发生错误: ${error.message}`,\n });\n }\n};\n\n// Resume stream from known position\nexport const resumeStream = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n\n\n\n\n const { thread_id, message_id, assistant_id, known_content, poll_interval } =\n request.body as ResumeStreamRequest;\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n const workspace_id = request.headers[\"x-workspace-id\"] as string;\n const project_id = request.headers[\"x-project-id\"] as string;\n\n // Validate request data\n if (!thread_id || !message_id || !assistant_id || known_content === undefined) {\n reply.status(400).send({\n success: false,\n error: \"thread_id, message_id, assistant_id, and known_content are required\",\n });\n return;\n }\n\n // Notify Fastify that we will manually handle the response\n reply.hijack();\n\n // Set SSE response headers\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n\n try {\n // Create Agent instance for accessing chunk buffer\n // Get or create Agent instance (ensures single instance per thread)\n const agent = agentInstanceManager.getAgent({\n assistant_id,\n thread_id,\n tenant_id,\n workspace_id,\n project_id,\n });\n\n // ADR-026: Thread-level SSE, lives until client disconnect.\n // Empty stopTypes means the iterator never stops on its own —\n // MESSAGE_COMPLETED, THREAD_IDLE etc. pass through as data.\n // Client disconnect (close event) or client abort (reply.raw.destroyed)\n // terminate the loop.\n await pipeAsyncIterableToSse(reply.raw, agent.chunkStream(message_id, []), {\n closeSource: request.raw,\n onError: (error) => [{\n type: \"error\",\n data: {\n id: v4(),\n content: error instanceof Error ? error.message : \"Resume stream processing error\",\n },\n }],\n });\n } catch (error: any) {\n // Send error as SSE event before closing (following MessageChunk format)\n const errorEvent = {\n type: 'error',\n data: {\n id: v4(),\n content: error.message || 'Resume stream processing error'\n }\n };\n reply.raw.write(`data: ${JSON.stringify(errorEvent)}\\n\\n`);\n } finally {\n if (!reply.raw.writableEnded && !reply.raw.destroyed) reply.raw.end();\n }\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `Error resuming stream: ${error.message}`,\n });\n }\n};\n\n// Abort agent execution for a thread\nexport const abortRun = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, threadId } = request.params as {\n assistantId: string;\n threadId: string;\n };\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n const workspace_id = (request.headers[\"x-workspace-id\"] as string) || \"default\";\n const project_id = (request.headers[\"x-project-id\"] as string) || \"default\";\n\n const agent = agentInstanceManager.getAgent({\n assistant_id: assistantId,\n thread_id: threadId,\n tenant_id,\n workspace_id,\n project_id,\n });\n\n await agent.abort();\n\n reply.status(200).send({\n success: true,\n message: \"Agent aborted\",\n });\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `Abort failed: ${error.message}`,\n });\n }\n};\n\n/**\n * Recover agent execution after a crash or manual abort.\n *\n * Resumes the LangGraph from its last checkpoint if the graph was\n * mid-execution (BUSY). Otherwise cleans up stuck queue messages\n * and restarts the queue processor.\n *\n * Pairs with {@link abortRun} — use abort to stop, recover to continue.\n */\nexport const recoverRun = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, threadId } = request.params as {\n assistantId: string;\n threadId: string;\n };\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n const workspace_id = (request.headers[\"x-workspace-id\"] as string) || \"default\";\n const project_id = (request.headers[\"x-project-id\"] as string) || \"default\";\n\n const agent = agentInstanceManager.getAgent({\n assistant_id: assistantId,\n thread_id: threadId,\n tenant_id,\n workspace_id,\n project_id,\n });\n\n await agent.resumeTask();\n\n const status = await agent.getRunStatus();\n\n reply.status(200).send({\n success: true,\n threadId,\n status,\n });\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `Recover failed: ${error.message}`,\n });\n }\n};\n","import type { MessageChunk, MessageChunkType } from \"@axiom-lattice/protocols\";\n\nexport interface ScopedAgentExecutionAgent<TRequest, TQueueMode = unknown> {\n addMessage(request: TRequest, queueMode?: TQueueMode): Promise<{ messageId: string }>;\n chunkStream(messageId: string, stopTypes: MessageChunkType[]): AsyncIterable<MessageChunk>;\n}\n\n/**\n * Execute one message against an already authorized Agent scope.\n * Console and WebApp are adapters over this primitive and retain their own\n * authorization, HTTP, and event projection policies.\n */\nexport async function executeScopedAgentMessage<TRequest, TQueueMode = unknown>(\n agent: ScopedAgentExecutionAgent<TRequest, TQueueMode>,\n request: TRequest,\n stopTypes: MessageChunkType[],\n options?: { queueMode: TQueueMode | undefined },\n): Promise<{ messageId: string; stream: AsyncIterable<MessageChunk> }> {\n const { messageId } = options === undefined\n ? await agent.addMessage(request)\n : await agent.addMessage(request, options.queueMode);\n return { messageId, stream: agent.chunkStream(messageId, stopTypes) };\n}\n","export interface SseWritable {\n destroyed: boolean;\n writableEnded: boolean;\n write(value: string): boolean;\n end(): void;\n once(event: \"drain\", listener: (...args: unknown[]) => void): unknown;\n on(event: \"close\" | \"error\", listener: (...args: unknown[]) => void): unknown;\n removeListener(event: \"drain\" | \"close\" | \"error\", listener: (...args: unknown[]) => void): unknown;\n}\n\nexport interface SseCloseSource {\n on(event: \"close\" | \"error\", listener: (...args: unknown[]) => void): unknown;\n removeListener(event: \"close\" | \"error\", listener: (...args: unknown[]) => void): unknown;\n}\n\nexport interface PipeAsyncIterableToSseOptions<T, TEvent> {\n project?: (value: T) => Iterable<TEvent>;\n serialize?: (event: TEvent) => string;\n onError?: (error: unknown) => Iterable<TEvent>;\n closeSource?: SseCloseSource;\n}\n\n/** Pump adapter-projected events to SSE while honoring backpressure and disconnects. */\nexport async function pipeAsyncIterableToSse<T, TEvent = T>(\n raw: SseWritable,\n stream: AsyncIterable<T>,\n options: PipeAsyncIterableToSseOptions<T, TEvent> = {},\n): Promise<void> {\n const iterator = stream[Symbol.asyncIterator]();\n const project = options.project ?? ((value: T) => [value as unknown as TEvent]);\n const serialize = options.serialize ?? ((event: TEvent) => `data: ${JSON.stringify(event)}\\n\\n`);\n const closeSources = options.closeSource && options.closeSource !== raw\n ? [raw, options.closeSource]\n : [raw];\n let closed = raw.destroyed || raw.writableEnded;\n let returned = false;\n let resolveClosed: (() => void) | undefined;\n const closedPromise = new Promise<void>((resolve) => { resolveClosed = resolve; });\n const returnConsumer = (): void => {\n if (returned) return;\n returned = true;\n void Promise.resolve(iterator.return?.()).catch(() => undefined);\n };\n const onClose = (): void => {\n closed = true;\n returnConsumer();\n resolveClosed?.();\n };\n for (const source of closeSources) {\n source.on(\"close\", onClose);\n source.on(\"error\", onClose);\n }\n try {\n while (!closed) {\n const next = await Promise.race([\n iterator.next().then((result) => ({ kind: \"next\" as const, result })),\n closedPromise.then(() => ({ kind: \"closed\" as const })),\n ]);\n if (next.kind === \"closed\" || next.result.done) break;\n for (const event of project(next.result.value)) {\n if (!await writeSse(raw, serialize(event), closedPromise)) {\n closed = true;\n returnConsumer();\n break;\n }\n }\n }\n } catch (error) {\n if (!options.onError) throw error;\n if (!closed && !raw.destroyed && !raw.writableEnded) {\n for (const event of options.onError(error)) {\n if (!await writeSse(raw, serialize(event), closedPromise)) break;\n }\n }\n returnConsumer();\n } finally {\n for (const source of closeSources) {\n source.removeListener(\"close\", onClose);\n source.removeListener(\"error\", onClose);\n }\n if (!closed && !raw.destroyed && !raw.writableEnded) raw.end();\n }\n}\n\nasync function writeSse(raw: SseWritable, value: string, closed: Promise<void>): Promise<boolean> {\n if (raw.destroyed || raw.writableEnded) return false;\n if (raw.write(value)) return true;\n return new Promise<boolean>((resolve) => {\n let settled = false;\n const onDrain = (): void => finish(!raw.destroyed && !raw.writableEnded);\n const finish = (writable: boolean): void => {\n if (settled) return;\n settled = true;\n raw.removeListener(\"drain\", onDrain);\n resolve(writable);\n };\n raw.once(\"drain\", onDrain);\n void closed.then(() => finish(false));\n });\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { agentInstanceManager } from \"@axiom-lattice/core\";\n\n// 设置内存项\nexport const setMemoryItem = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, key } = request.params as {\n assistantId: string;\n key: string;\n };\n const value = request.body;\n\n if (!assistantId || !key) {\n reply.status(400).send({\n success: false,\n error: \"助手ID和键是必需的\",\n });\n return;\n }\n\n if (value === undefined) {\n reply.status(400).send({\n success: false,\n error: \"值是必需的\",\n });\n return;\n }\n\n //const result = await memoryModel.setMemoryItem(assistantId, key, value);\n\n // if (!result.success) {\n reply.status(500).send();\n return;\n // }\n\n //reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `设置内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 获取内存项\nexport const getMemoryItem = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, key } = request.params as {\n assistantId: string;\n key: string;\n };\n\n if (!assistantId || !key) {\n reply.status(400).send({\n success: false,\n error: \"助手ID和键是必需的\",\n });\n return;\n }\n\n //const result = await memoryModel.getMemoryItem(assistantId, key);\n\n // if (!result.success) {\n reply.status(404).send();\n return;\n // }\n\n //reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `获取内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 获取所有内存项\nexport const getAllMemoryItems = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, thread_id } = request.params as {\n assistantId: string;\n thread_id: string;\n };\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n\n if (!thread_id) {\n reply.status(400).send({\n success: false,\n error: \"线程ID是必需的\",\n });\n return;\n }\n\n if (!assistantId) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n const agent = agentInstanceManager.getAgent({ assistant_id: assistantId, tenant_id, thread_id: thread_id })\n\n const result = await agent.getCurrentMessages();\n\n if (!result) {\n reply.status(500).send(result);\n return;\n }\n\n reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `获取所有内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 获取助手状态\nexport const getAgentState = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, thread_id } = request.params as {\n assistantId: string;\n thread_id: string;\n };\n\n if (!thread_id) {\n reply.status(400).send({\n success: false,\n error: \"线程ID是必需的\",\n });\n return;\n }\n\n if (!assistantId) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n const agent = agentInstanceManager.getAgent({ assistant_id: assistantId, tenant_id, thread_id: thread_id })\n\n // 1. 获取 LangGraph 状态(现有逻辑)\n const result = await agent.getCurrentState();\n const pendingMessages = await agent.getPendingMessages();\n\n\n if (!result) {\n reply.status(500).send(result);\n return;\n }\n\n // 3. 合并返回\n // Normalize pendingMessages content to string for consistent frontend format\n const normalizedPendingMessages = pendingMessages.map(msg => ({\n ...msg,\n content: typeof msg.content === 'object' && msg.content !== null\n ? ('message' in msg.content ? msg.content.message : JSON.stringify(msg.content))\n : String(msg.content || '')\n }));\n\n const mergedResult = {\n ...result,\n pendingMessages: normalizedPendingMessages\n };\n\n reply.send(mergedResult);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `获取助手状态时发生错误: ${error.message}`,\n });\n }\n};\n\n// 删除内存项\nexport const deleteMemoryItem = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, key } = request.params as {\n assistantId: string;\n key: string;\n };\n\n if (!assistantId || !key) {\n reply.status(400).send({\n success: false,\n error: \"助手ID和键是必需的\",\n });\n return;\n }\n\n //const result = await memoryModel.deleteMemoryItem(assistantId, key);\n\n // if (!result.success) {\n reply.status(500).send();\n return;\n // }\n\n reply.status(204).send();\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `删除内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 清除内存\nexport const clearMemory = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId } = request.params as { assistantId: string };\n\n if (!assistantId) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n let result: any; //= await memoryModel.clearMemory(assistantId);\n\n if (!result.success) {\n reply.status(500).send(result);\n return;\n }\n\n reply.status(204).send();\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `清除内存时发生错误: ${error.message}`,\n });\n }\n};\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { AgentManager } from \"@axiom-lattice/core\";\n\n/**\n * Request body interface for triggering agent task\n */\ninterface TriggerAgentTaskRequest {\n assistant_id: string;\n thread_id: string;\n input: any;\n command?: any;\n}\n\n/**\n * Trigger an agent task\n * This endpoint triggers an agent task through the AgentManager,\n * which publishes the task to the event bus for processing\n */\nexport const triggerAgentTask = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistant_id, thread_id, input, command } =\n request.body as TriggerAgentTaskRequest;\n\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n const workspace_id = request.headers[\"x-workspace-id\"] as string | undefined;\n const project_id = request.headers[\"x-project-id\"] as string | undefined;\n\n // Validate required fields\n if (!assistant_id) {\n reply.status(400).send({\n success: false,\n error: \"assistant_id is required\",\n });\n return;\n }\n\n if (!thread_id) {\n reply.status(400).send({\n success: false,\n error: \"thread_id is required\",\n });\n return;\n }\n\n // Get AgentManager instance and trigger the task\n const agentManager = AgentManager.getInstance();\n const result = await agentManager.callAgentInQueue({\n assistant_id,\n thread_id,\n input,\n command,\n \"x-tenant-id\": tenant_id,\n runConfig: {\n workspaceId: workspace_id,\n projectId: project_id,\n user_id: (request as any).user?.id,\n },\n });\n\n reply.status(200).send({\n success: true,\n });\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `Failed to trigger agent task: ${error.message}`,\n });\n }\n};\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { getStoreLattice } from \"@axiom-lattice/core\";\nimport { Thread, CreateThreadRequest } from \"../types\";\nimport { randomUUID } from \"crypto\";\n\n/**\n * Thread Controller\n * Handles thread-related CRUD operations for a specific assistant\n * All operations are scoped to a tenant ID and assistant ID\n */\n\n/**\n * Get tenant ID from authenticated user context\n * Falls back to request headers for backward compatibility\n */\nfunction getTenantId(request: FastifyRequest): string {\n // First try to get from authenticated user context\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) {\n return userTenantId;\n }\n\n // Fallback to request headers for backward compatibility\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\n/**\n * Thread list response interface\n */\ninterface ThreadListResponse {\n success: boolean;\n message: string;\n data: {\n records: Thread[];\n total: number;\n };\n}\n\n/**\n * Thread response interface\n */\ninterface ThreadResponse {\n success: boolean;\n message: string;\n data?: Thread;\n}\n\n/**\n * Thread update request body interface\n */\ninterface ThreadUpdateBody {\n metadata?: Record<string, any>;\n}\n\n/**\n * Get list of all threads for a specific assistant\n */\nexport async function getThreadList(\n request: FastifyRequest<{\n Params: { assistantId: string };\n }>,\n reply: FastifyReply\n): Promise<ThreadListResponse> {\n const tenantId = getTenantId(request);\n const { assistantId } = request.params;\n\n // Build metadata filter from headers (workspace/project isolation)\n const metadataFilter: Record<string, string> = {};\n const workspaceId = request.headers[\"x-workspace-id\"] as string | undefined;\n const projectId = request.headers[\"x-project-id\"] as string | undefined;\n \n if (workspaceId) {\n metadataFilter.workspaceId = workspaceId;\n }\n if (projectId) {\n metadataFilter.projectId = projectId;\n }\n\n const storeLattice = getStoreLattice(\"default\", \"thread\");\n const threadStore = storeLattice.store;\n const threads = await threadStore.getThreadsByAssistantId(\n tenantId,\n assistantId,\n Object.keys(metadataFilter).length > 0 ? metadataFilter : undefined\n );\n\n return {\n success: true,\n message: \"Successfully retrieved thread list\",\n data: {\n records: threads,\n total: threads.length,\n },\n };\n}\n\n/**\n * Get a single thread by ID for a specific tenant\n */\nexport async function getThread(\n request: FastifyRequest<{\n Params: { assistantId: string; threadId: string };\n }>,\n reply: FastifyReply\n): Promise<ThreadResponse> {\n const tenantId = getTenantId(request);\n const { threadId } = request.params;\n\n const storeLattice = getStoreLattice(\"default\", \"thread\");\n const threadStore = storeLattice.store;\n const thread = await threadStore.getThreadById(tenantId, threadId);\n\n if (!thread) {\n return reply.status(404).send({\n success: false,\n message: \"Thread not found\",\n });\n }\n\n return {\n success: true,\n message: \"Successfully retrieved thread\",\n data: thread,\n };\n}\n\n/**\n * Create a new thread for an assistant\n */\nexport async function createThread(\n request: FastifyRequest<{\n Params: { assistantId: string };\n Body: CreateThreadRequest;\n }>,\n reply: FastifyReply\n): Promise<ThreadResponse> {\n const tenantId = getTenantId(request);\n const { assistantId } = request.params;\n const data = request.body;\n\n // Generate thread ID if not provided\n const threadId = randomUUID();\n\n // Extract workspace and project from headers\n const workspaceId = request.headers[\"x-workspace-id\"] as string | undefined;\n const projectId = request.headers[\"x-project-id\"] as string | undefined;\n\n // Enrich metadata with tenant/workspace/project\n const enrichedMetadata: Record<string, any> = {\n ...data.metadata,\n tenantId,\n };\n\n if (workspaceId) {\n enrichedMetadata.workspaceId = workspaceId;\n }\n if (projectId) {\n enrichedMetadata.projectId = projectId;\n }\n\n // Create thread with enriched metadata\n const storeLattice = getStoreLattice(\"default\", \"thread\");\n const threadStore = storeLattice.store;\n const newThread = await threadStore.createThread(tenantId, assistantId, threadId, {\n metadata: enrichedMetadata,\n });\n\n return reply.status(201).send({\n success: true,\n message: \"Successfully created thread\",\n data: newThread,\n });\n}\n\n/**\n * Update an existing thread by ID\n */\nexport async function updateThread(\n request: FastifyRequest<{\n Params: { assistantId: string; threadId: string };\n Body: ThreadUpdateBody;\n }>,\n reply: FastifyReply\n): Promise<ThreadResponse> {\n const tenantId = getTenantId(request);\n const { threadId } = request.params;\n const updates = request.body;\n\n const storeLattice = getStoreLattice(\"default\", \"thread\");\n const threadStore = storeLattice.store;\n\n // Check if thread exists\n const exists = await threadStore.hasThread(tenantId, threadId);\n if (!exists) {\n return reply.status(404).send({\n success: false,\n message: \"Thread not found\",\n });\n }\n\n // Update thread\n const updatedThread = await threadStore.updateThread(\n tenantId,\n threadId,\n updates\n );\n\n if (!updatedThread) {\n return reply.status(500).send({\n success: false,\n message: \"Failed to update thread\",\n });\n }\n\n return {\n success: true,\n message: \"Successfully updated thread\",\n data: updatedThread,\n };\n}\n\n/**\n * Delete a thread by ID\n */\nexport async function deleteThread(\n request: FastifyRequest<{\n Params: { assistantId: string; threadId: string };\n }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string }> {\n const tenantId = getTenantId(request);\n const { threadId } = request.params;\n\n const storeLattice = getStoreLattice(\"default\", \"thread\");\n const threadStore = storeLattice.store;\n\n // Check if thread exists\n const exists = await threadStore.hasThread(tenantId, threadId);\n if (!exists) {\n return reply.status(404).send({\n success: false,\n message: \"Thread not found\",\n });\n }\n\n // Delete the thread\n const deleted = await threadStore.deleteThread(tenantId, threadId);\n\n if (!deleted) {\n return reply.status(500).send({\n success: false,\n message: \"Failed to delete thread\",\n });\n }\n\n return {\n success: true,\n message: \"Successfully deleted thread\",\n };\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { scheduleLatticeManager } from \"@axiom-lattice/core\";\nimport {\n ScheduledTaskDefinition,\n ScheduledTaskStatus,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * Schedule Controller\n * Handles schedule-related operations for viewing and managing scheduled tasks\n * All operations are scoped to a tenant ID\n */\n\n/**\n * Get tenant ID from request headers or user context\n */\nfunction getTenantId(request: FastifyRequest): string {\n // First try to get from authenticated user context\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) {\n return userTenantId;\n }\n\n // Fallback to request headers for backward compatibility\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\n/**\n * Scheduled tasks list response interface\n */\ninterface ScheduledTasksListResponse {\n success: boolean;\n message: string;\n data: {\n records: ScheduledTaskDefinition[];\n total: number;\n };\n}\n\n/**\n * Scheduled task response interface\n */\ninterface ScheduledTaskResponse {\n success: boolean;\n message: string;\n data?: ScheduledTaskDefinition | null;\n}\n\n/**\n * Helper function to get the schedule lattice safely\n * Returns null if no schedule lattice is registered\n */\nfunction getScheduleLattice() {\n // Try to get the first available schedule lattice\n const keys = scheduleLatticeManager.getLatticeKeys();\n if (keys.length === 0) {\n return null;\n }\n // Use \"default\" if available, otherwise use the first one\n if (scheduleLatticeManager.hasLattice(\"default\")) {\n return scheduleLatticeManager.getScheduleLattice(\"default\");\n }\n return scheduleLatticeManager.getScheduleLattice(keys[0]);\n}\n\n/**\n * Get scheduled tasks for a specific thread\n */\nexport async function getThreadSchedules(\n request: FastifyRequest<{\n Params: { assistantId: string; threadId: string };\n Querystring: {\n status?: ScheduledTaskStatus;\n limit?: string;\n offset?: string;\n };\n }>,\n reply: FastifyReply\n): Promise<ScheduledTasksListResponse> {\n const { assistantId, threadId } = request.params;\n const { status, limit, offset } = request.query;\n\n try {\n const scheduleLattice = getScheduleLattice();\n\n // If no schedule lattice is registered, return empty result\n if (!scheduleLattice) {\n return {\n success: true,\n message: \"No schedule lattice configured\",\n data: {\n records: [],\n total: 0,\n },\n };\n }\n\n const storage = scheduleLattice.client.getStorage();\n\n if (!storage) {\n return {\n success: true,\n message: \"No schedule storage configured\",\n data: {\n records: [],\n total: 0,\n },\n };\n }\n\n const tenantId = getTenantId(request);\n\n const filters: {\n tenantId: string;\n threadId: string;\n assistantId?: string;\n status?: ScheduledTaskStatus;\n limit?: number;\n offset?: number;\n } = {\n tenantId,\n threadId,\n assistantId,\n };\n\n if (status) {\n filters.status = status;\n }\n if (limit) {\n filters.limit = parseInt(limit, 10);\n }\n if (offset) {\n filters.offset = parseInt(offset, 10);\n }\n\n const tasks = await storage.getAllTasks(filters);\n const total = await storage.countTasks({\n tenantId,\n threadId,\n assistantId,\n status,\n });\n\n return {\n success: true,\n message: \"Successfully retrieved scheduled tasks\",\n data: {\n records: tasks,\n total,\n },\n };\n } catch (error) {\n request.log.error(error, \"Failed to get thread schedules\");\n return reply.status(500).send({\n success: false,\n message: \"Failed to retrieve scheduled tasks\",\n data: {\n records: [],\n total: 0,\n },\n });\n }\n}\n\n/**\n * Get a single scheduled task by ID\n */\nexport async function getScheduledTask(\n request: FastifyRequest<{\n Params: { taskId: string };\n }>,\n reply: FastifyReply\n): Promise<ScheduledTaskResponse> {\n const { taskId } = request.params;\n\n try {\n const scheduleLattice = getScheduleLattice();\n\n if (!scheduleLattice) {\n return reply.status(404).send({\n success: false,\n message: \"No schedule lattice configured\",\n });\n }\n\n const task = await scheduleLattice.client.getTask(taskId);\n\n if (!task) {\n return reply.status(404).send({\n success: false,\n message: \"Scheduled task not found\",\n });\n }\n\n return {\n success: true,\n message: \"Successfully retrieved scheduled task\",\n data: task,\n };\n } catch (error) {\n request.log.error(error, \"Failed to get scheduled task\");\n return reply.status(500).send({\n success: false,\n message: \"Failed to retrieve scheduled task\",\n });\n }\n}\n\n/**\n * Cancel a scheduled task\n */\nexport async function cancelScheduledTask(\n request: FastifyRequest<{\n Params: { taskId: string };\n }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string }> {\n const { taskId } = request.params;\n\n try {\n const scheduleLattice = getScheduleLattice();\n\n if (!scheduleLattice) {\n return reply.status(404).send({\n success: false,\n message: \"No schedule lattice configured\",\n });\n }\n\n const result = await scheduleLattice.client.cancel(taskId);\n\n if (!result) {\n return reply.status(404).send({\n success: false,\n message: \"Scheduled task not found or already cancelled\",\n });\n }\n\n return {\n success: true,\n message: \"Successfully cancelled scheduled task\",\n };\n } catch (error) {\n request.log.error(error, \"Failed to cancel scheduled task\");\n return reply.status(500).send({\n success: false,\n message: \"Failed to cancel scheduled task\",\n });\n }\n}\n\n/**\n * Pause a scheduled cron task\n */\nexport async function pauseScheduledTask(\n request: FastifyRequest<{\n Params: { taskId: string };\n }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string }> {\n const { taskId } = request.params;\n\n try {\n const scheduleLattice = getScheduleLattice();\n\n if (!scheduleLattice) {\n return reply.status(404).send({\n success: false,\n message: \"No schedule lattice configured\",\n });\n }\n\n const result = await scheduleLattice.client.pause(taskId);\n\n if (!result) {\n return reply.status(404).send({\n success: false,\n message: \"Scheduled task not found or cannot be paused\",\n });\n }\n\n return {\n success: true,\n message: \"Successfully paused scheduled task\",\n };\n } catch (error) {\n request.log.error(error, \"Failed to pause scheduled task\");\n return reply.status(500).send({\n success: false,\n message: \"Failed to pause scheduled task\",\n });\n }\n}\n\n/**\n * Resume a paused cron task\n */\nexport async function resumeScheduledTask(\n request: FastifyRequest<{\n Params: { taskId: string };\n }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string }> {\n const { taskId } = request.params;\n\n try {\n const scheduleLattice = getScheduleLattice();\n\n if (!scheduleLattice) {\n return reply.status(404).send({\n success: false,\n message: \"No schedule lattice configured\",\n });\n }\n\n const result = await scheduleLattice.client.resume(taskId);\n\n if (!result) {\n return reply.status(404).send({\n success: false,\n message: \"Scheduled task not found or cannot be resumed\",\n });\n }\n\n return {\n success: true,\n message: \"Successfully resumed scheduled task\",\n };\n } catch (error) {\n request.log.error(error, \"Failed to resume scheduled task\");\n return reply.status(500).send({\n success: false,\n message: \"Failed to resume scheduled task\",\n });\n }\n}\n","/**\n * Configuration service\n * Manages environment variables and supports dynamic updates\n */\n\nexport interface GatewayConfig {\n port?: number;\n queueServiceType?: string;\n redisUrl?: string;\n redisPassword?: string;\n queueName?: string;\n [key: string]: any; // Allow additional config keys\n}\n\n/**\n * Get configuration from environment variables\n * Supports dynamic updates via updateConfig method\n */\nclass ConfigService {\n private config: GatewayConfig;\n\n constructor() {\n this.config = this.loadFromEnv();\n }\n\n /**\n * Load configuration from environment variables\n */\n private loadFromEnv(): GatewayConfig {\n return {\n port: process.env.PORT ? Number(process.env.PORT) : undefined,\n queueServiceType: process.env.QUEUE_SERVICE_TYPE,\n redisUrl: process.env.REDIS_URL,\n redisPassword: process.env.REDIS_PASSWORD,\n queueName: process.env.QUEUE_NAME,\n };\n }\n\n /**\n * Update configuration from JSON object\n * This will update both the internal config and process.env\n */\n updateConfig(jsonConfig: Record<string, any>): void {\n // Update process.env for all provided keys\n for (const [key, value] of Object.entries(jsonConfig)) {\n if (value !== null && value !== undefined) {\n // Convert nested objects to environment variable format\n if (typeof value === \"object\" && !Array.isArray(value)) {\n // Handle nested objects like supabase: { url: \"...\", key: \"...\" }\n for (const [nestedKey, nestedValue] of Object.entries(value)) {\n const envKey = `${key.toUpperCase()}_${nestedKey.toUpperCase()}`;\n process.env[envKey] = String(nestedValue);\n }\n } else {\n // Handle flat keys\n process.env[key.toUpperCase()] = String(value);\n }\n }\n }\n\n // Reload config from updated environment variables\n this.config = this.loadFromEnv();\n\n // Deep merge the JSON config into our config object\n this.config = this.deepMerge(this.config, jsonConfig);\n }\n\n /**\n * Deep merge two objects\n */\n private deepMerge(target: any, source: any): any {\n const output = { ...target };\n if (this.isObject(target) && this.isObject(source)) {\n Object.keys(source).forEach((key) => {\n if (this.isObject(source[key])) {\n if (!(key in target)) {\n Object.assign(output, { [key]: source[key] });\n } else {\n output[key] = this.deepMerge(target[key], source[key]);\n }\n } else {\n Object.assign(output, { [key]: source[key] });\n }\n });\n }\n return output;\n }\n\n /**\n * Check if value is a plain object\n */\n private isObject(item: any): boolean {\n return item && typeof item === \"object\" && !Array.isArray(item);\n }\n\n /**\n * Get current configuration\n */\n getConfig(): GatewayConfig {\n return { ...this.config };\n }\n}\n\n// Export singleton instance\nexport const configService = new ConfigService();\n\n// Export config getter for backward compatibility\nexport const config = {\n get port() {\n return configService.getConfig().port;\n },\n get queueServiceType() {\n return configService.getConfig().queueServiceType;\n },\n get redisUrl() {\n return configService.getConfig().redisUrl;\n },\n get redisPassword() {\n return configService.getConfig().redisPassword;\n },\n get queueName() {\n return configService.getConfig().queueName;\n },\n};\n","// Queue service adapter that uses QueueLatticeManager from core package\n// Provides backward-compatible API for gateway services\n\nimport {\n queueLatticeManager,\n registerQueueLattice,\n getQueueLattice,\n} from \"@axiom-lattice/core\";\nimport { QueueType } from \"@axiom-lattice/protocols\";\nimport type { QueueConfig, QueueClient } from \"@axiom-lattice/protocols\";\nimport { RedisQueueClient } from \"@axiom-lattice/queue-redis\";\n\nexport type QueueServiceType = \"memory\" | \"redis\";\n\n// Default queue key\nconst DEFAULT_QUEUE_KEY = \"default\";\n\n// Global configuration for queue service type\n// Can be set via environment variable QUEUE_SERVICE_TYPE or via LatticeGateway configuration\nlet queueServiceType: QueueServiceType =\n (process.env.QUEUE_SERVICE_TYPE as QueueServiceType) || \"memory\";\n\n/**\n * Configure the queue service type\n * This will register or update the default queue service\n * @param type - \"memory\" or \"redis\"\n */\nexport const setQueueServiceType = (type: QueueServiceType): void => {\n queueServiceType = type;\n console.log(`Queue service type set to: ${type}`);\n\n // Register or update the queue service\n const queueName = process.env.QUEUE_NAME || \"tasks\";\n const config: QueueConfig = {\n name: \"Default Queue Service\",\n description: `Default ${type} queue service`,\n type: type === \"redis\" ? QueueType.REDIS : QueueType.MEMORY,\n queueName,\n options:\n type === \"redis\"\n ? {\n redisUrl: process.env.REDIS_URL,\n redisPassword: process.env.REDIS_PASSWORD,\n }\n : undefined,\n };\n\n // Remove existing queue if it exists\n if (queueLatticeManager.hasLattice(DEFAULT_QUEUE_KEY)) {\n queueLatticeManager.removeLattice(DEFAULT_QUEUE_KEY);\n }\n\n // Create client for Redis type\n let client: QueueClient | undefined;\n if (type === \"redis\") {\n client = new RedisQueueClient(queueName, {\n redisUrl: process.env.REDIS_URL,\n redisPassword: process.env.REDIS_PASSWORD,\n });\n }\n\n // Register the new queue service\n registerQueueLattice(DEFAULT_QUEUE_KEY, config, client);\n};\n\n/**\n * Get the current queue service type\n */\nexport const getQueueServiceType = (): QueueServiceType => {\n return queueServiceType;\n};\n\n/**\n * Get the default queue service\n * If not registered, register it with the current configuration\n */\nconst getQueueService = () => {\n // Check if queue is already registered\n if (!queueLatticeManager.hasLattice(DEFAULT_QUEUE_KEY)) {\n // Auto-register with current configuration\n setQueueServiceType(queueServiceType);\n }\n\n return getQueueLattice(DEFAULT_QUEUE_KEY);\n};\n\n/**\n * Push agent task to queue\n * @param agentTask - Agent task to push\n */\nexport const pushAgentTaskToQueue = async (agentTask: any) => {\n const queue = getQueueService();\n const result = await queue.push(agentTask);\n return result;\n};\n\n/**\n * Pop agent task from queue\n */\nexport const popAgentTaskFromQueue = async () => {\n const queue = getQueueService();\n const result = await queue.pop();\n return result;\n};\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { configService } from \"../config\";\nimport {\n setQueueServiceType,\n QueueServiceType,\n} from \"../services/queue_service\";\n\n/**\n * Configuration Controller\n * Handles configuration updates from frontend\n */\n\ninterface UpdateConfigRequest {\n Body: {\n config: Record<string, any>;\n };\n}\n\n/**\n * Update gateway configuration\n * Accepts JSON config and loads it into environment variables\n */\nexport async function updateConfig(\n request: FastifyRequest<UpdateConfigRequest>,\n reply: FastifyReply\n) {\n try {\n const { config: jsonConfig } = request.body;\n\n if (!jsonConfig || typeof jsonConfig !== \"object\") {\n return reply.status(400).send({\n success: false,\n error: \"Invalid configuration: config must be an object\",\n });\n }\n\n // Update configuration service\n configService.updateConfig(jsonConfig);\n\n const warnings: string[] = [];\n const requiresRestart: string[] = [];\n\n // Check if port is being changed (requires restart)\n if (jsonConfig.port !== undefined) {\n requiresRestart.push(\"PORT\");\n warnings.push(\"Port change requires server restart to take effect\");\n }\n\n // If queue service type is being updated, reconfigure the queue service\n if (jsonConfig.queueServiceType) {\n setQueueServiceType(jsonConfig.queueServiceType as QueueServiceType);\n }\n\n // If Redis configuration is being updated and queue service is Redis, reconfigure\n if (\n (jsonConfig.redisUrl || jsonConfig.redisPassword) &&\n (process.env.QUEUE_SERVICE_TYPE === \"redis\" ||\n jsonConfig.queueServiceType === \"redis\")\n ) {\n // Reconfigure queue service to pick up new Redis settings\n const currentType =\n (jsonConfig.queueServiceType as QueueServiceType) ||\n (process.env.QUEUE_SERVICE_TYPE as QueueServiceType) ||\n \"memory\";\n if (currentType === \"redis\") {\n setQueueServiceType(\"redis\");\n }\n }\n\n // Get updated config (without sensitive data)\n const updatedConfig = configService.getConfig();\n const safeConfig = {\n ...updatedConfig,\n redisPassword: updatedConfig.redisPassword\n ? \"***\"\n : updatedConfig.redisPassword,\n };\n\n return reply.send({\n success: true,\n message: \"Configuration updated successfully\",\n data: safeConfig,\n warnings: warnings.length > 0 ? warnings : undefined,\n requiresRestart: requiresRestart.length > 0 ? requiresRestart : undefined,\n });\n } catch (error: any) {\n console.error(\"Failed to update configuration\", {\n error: error.message,\n stack: error.stack,\n });\n return reply.status(500).send({\n success: false,\n error: error.message || \"Failed to update configuration\",\n });\n }\n}\n\n/**\n * Get current gateway configuration\n * Returns current configuration (with sensitive data masked)\n */\nexport async function getConfig(request: FastifyRequest, reply: FastifyReply) {\n try {\n const currentConfig = configService.getConfig();\n const safeConfig = {\n ...currentConfig,\n redisPassword: currentConfig.redisPassword\n ? \"***\"\n : currentConfig.redisPassword,\n };\n\n return reply.send({\n success: true,\n data: safeConfig,\n });\n } catch (error: any) {\n console.error(\"Failed to get configuration\", {\n error: error.message,\n stack: error.stack,\n });\n return reply.status(500).send({\n success: false,\n error: error.message || \"Failed to get configuration\",\n });\n }\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { registerModelLattice, modelLatticeManager } from \"@axiom-lattice/core\";\nimport type { LLMConfig } from \"@axiom-lattice/protocols\";\n\n/**\n * Models Controller\n * Handles model lattice registration and management\n * Models are tenant-isolated using key prefix: {tenantId}:{modelKey}\n */\n\n/**\n * Get tenant ID from request headers or user context\n */\nfunction getTenantId(request: FastifyRequest): string {\n // First try to get from authenticated user context\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) {\n return userTenantId;\n }\n\n // Fallback to request headers for backward compatibility\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\n/**\n * Get tenant-scoped model key\n */\nfunction getTenantModelKey(tenantId: string, modelKey: string): string {\n return `${tenantId}:${modelKey}`;\n}\n\n/**\n * Extract model key from tenant-scoped key\n */\nfunction extractModelKey(tenantId: string, tenantModelKey: string): string {\n const prefix = `${tenantId}:`;\n if (tenantModelKey.startsWith(prefix)) {\n return tenantModelKey.substring(prefix.length);\n }\n return tenantModelKey;\n}\n\ninterface ModelConfig {\n key: string;\n model: string;\n displayName?: string;\n provider: \"azure\" | \"openai\" | \"deepseek\" | \"siliconcloud\" | \"volcengine\";\n streaming?: boolean;\n apiKey?: string;\n baseURL?: string;\n maxTokens?: number;\n temperature?: number;\n timeout?: number;\n maxRetries?: number;\n}\n\ninterface UpdateModelsRequest {\n Body: {\n models: ModelConfig[];\n };\n}\n\ninterface UpdateModelsRequest {\n Body: {\n models: ModelConfig[];\n };\n}\n\n/**\n * Get all registered models\n */\nexport async function getModels(request: FastifyRequest, reply: FastifyReply) {\n try {\n const allLattices = modelLatticeManager.getAllLattices();\n const models = allLattices.map((lattice) => {\n // Extract config from the lattice client\n // Note: This is a simplified approach - you may need to adjust based on actual implementation\n const config = (lattice.client as any).config || {};\n // Use provided displayName or auto-generate from key\n const displayName = config.displayName || lattice.key\n .split('-')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n return {\n key: lattice.key,\n model: config.model || \"\",\n provider: config.provider || \"openai\",\n displayName: displayName,\n streaming: config.streaming || false,\n apiKey: config.apiKey || \"\",\n baseURL: config.baseURL || \"\",\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n timeout: config.timeout,\n maxRetries: config.maxRetries,\n };\n });\n\n return reply.send({\n success: true,\n data: models,\n });\n } catch (error: any) {\n console.error(\"Failed to get models\", {\n error: error.message,\n stack: error.stack,\n });\n return reply.status(500).send({\n success: false,\n error: error.message || \"Failed to get models\",\n });\n }\n}\n\n/**\n * Update models configuration\n * Registers or updates model lattices\n */\nexport async function updateModels(\n request: FastifyRequest<UpdateModelsRequest>,\n reply: FastifyReply\n) {\n try {\n const { models } = request.body;\n\n if (!models || !Array.isArray(models)) {\n return reply.status(400).send({\n success: false,\n error: \"Invalid request: models must be an array\",\n });\n }\n\n const registeredModels: string[] = [];\n const errors: string[] = [];\n\n for (const modelConfig of models) {\n if (!modelConfig.key || !modelConfig.model || !modelConfig.provider) {\n errors.push(\n `Model configuration is incomplete: key, model, and provider are required`\n );\n continue;\n }\n\n try {\n // Remove existing model with the same key if it exists\n if (modelLatticeManager.hasLattice(modelConfig.key)) {\n modelLatticeManager.removeLattice(modelConfig.key);\n }\n\n // Convert to LLMConfig format\n const llmConfig: LLMConfig = {\n provider: modelConfig.provider,\n model: modelConfig.model,\n displayName: modelConfig.displayName,\n streaming: modelConfig.streaming ?? false,\n apiKey: modelConfig.apiKey,\n baseURL: modelConfig.baseURL,\n maxTokens: modelConfig.maxTokens,\n temperature: modelConfig.temperature,\n timeout: modelConfig.timeout,\n maxRetries: modelConfig.maxRetries,\n };\n\n // Register the new model lattice\n registerModelLattice(modelConfig.key, llmConfig);\n registeredModels.push(modelConfig.key);\n } catch (error: any) {\n errors.push(\n `Failed to register model ${modelConfig.key}: ${error.message}`\n );\n }\n }\n\n if (errors.length > 0 && registeredModels.length === 0) {\n return reply.status(400).send({\n success: false,\n error: errors.join(\"; \"),\n });\n }\n\n return reply.send({\n success: true,\n message: `Successfully registered ${registeredModels.length} model(s)`,\n data: {\n registered: registeredModels,\n errors: errors.length > 0 ? errors : undefined,\n },\n });\n } catch (error: any) {\n console.error(\"Failed to update models\", {\n error: error.message,\n stack: error.stack,\n });\n return reply.status(500).send({\n success: false,\n error: error.message || \"Failed to update models\",\n });\n }\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\n\n/**\n * Health Controller\n * Handles health check endpoints for monitoring and load balancer checks\n */\n\n/**\n * Health check endpoint\n * Returns service status and basic information\n */\nexport async function getHealth(\n request: FastifyRequest,\n reply: FastifyReply\n) {\n try {\n const healthStatus = {\n status: \"healthy\",\n timestamp: new Date().toISOString(),\n uptime: process.uptime(),\n service: \"lattice-gateway\",\n version: process.env.npm_package_version || \"1.0.0\",\n };\n\n return reply.send({\n success: true,\n data: healthStatus,\n });\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n status: \"unhealthy\",\n error: error.message || \"Health check failed\",\n });\n }\n}\n","/**\n * SkillService\n *\n * Business logic layer for skill management.\n * Wraps SandboxSkillStore from @axiom-lattice/core.\n * Controllers should consume this service, not directly manipulate storage.\n */\n\nimport { SandboxSkillStore } from \"@axiom-lattice/core\";\nimport type {\n Skill,\n SkillStoreContext,\n CreateSkillRequest,\n} from \"@axiom-lattice/protocols\";\nimport { FastifyRequest } from \"fastify\";\n\nfunction getTenantId(request: FastifyRequest): string {\n return (request as any).user?.tenantId || (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\nfunction getWorkspaceId(request: FastifyRequest): string | undefined {\n return request.headers[\"x-workspace-id\"] as string | undefined;\n}\n\nfunction getProjectId(request: FastifyRequest): string | undefined {\n return request.headers[\"x-project-id\"] as string | undefined;\n}\n\nfunction buildContext(request: FastifyRequest): SkillStoreContext {\n return {\n workspaceId: getWorkspaceId(request),\n projectId: getProjectId(request),\n };\n}\n\nexport class SkillService {\n private store: SandboxSkillStore;\n\n constructor() {\n this.store = new SandboxSkillStore();\n }\n\n async getAllSkills(request: FastifyRequest): Promise<Skill[]> {\n const tenantId = getTenantId(request);\n return this.store.getAllSkills(tenantId, buildContext(request));\n }\n\n async getSkillById(request: FastifyRequest, id: string): Promise<Skill | null> {\n const tenantId = getTenantId(request);\n return this.store.getSkillById(tenantId, id, buildContext(request));\n }\n\n async createSkill(\n request: FastifyRequest,\n id: string,\n data: CreateSkillRequest\n ): Promise<Skill> {\n const tenantId = getTenantId(request);\n return this.store.createSkill(tenantId, id, data, buildContext(request));\n }\n\n async updateSkill(\n request: FastifyRequest,\n id: string,\n updates: Partial<CreateSkillRequest>\n ): Promise<Skill | null> {\n const tenantId = getTenantId(request);\n return this.store.updateSkill(tenantId, id, updates, buildContext(request));\n }\n\n async deleteSkill(request: FastifyRequest, id: string): Promise<boolean> {\n const tenantId = getTenantId(request);\n return this.store.deleteSkill(tenantId, id, buildContext(request));\n }\n\n async searchByMetadata(\n request: FastifyRequest,\n key: string,\n value: string\n ): Promise<Skill[]> {\n const tenantId = getTenantId(request);\n return this.store.searchByMetadata(tenantId, key, value, buildContext(request));\n }\n\n async filterByCompatibility(\n request: FastifyRequest,\n compatibility: string\n ): Promise<Skill[]> {\n const tenantId = getTenantId(request);\n return this.store.filterByCompatibility(tenantId, compatibility, buildContext(request));\n }\n\n async filterByLicense(request: FastifyRequest, license: string): Promise<Skill[]> {\n const tenantId = getTenantId(request);\n return this.store.filterByLicense(tenantId, license, buildContext(request));\n }\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { SkillService } from \"../services/skill_service\";\nimport type { Skill, CreateSkillRequest } from \"@axiom-lattice/protocols\";\n\nconst skillService = new SkillService();\n\nfunction serializeSkill(skill: Skill): any {\n const serialized: any = {\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 content: skill.content,\n subSkills: skill.subSkills,\n createdAt: skill.createdAt instanceof Date ? skill.createdAt.toISOString() : new Date().toISOString(),\n updatedAt: skill.updatedAt instanceof Date ? skill.updatedAt.toISOString() : new Date().toISOString(),\n };\n Object.keys(serialized).forEach((key) => {\n if (serialized[key] === undefined) delete serialized[key];\n });\n return serialized;\n}\n\ninterface SkillListResponse {\n success: boolean;\n message: string;\n data: { records: any[]; total: number };\n}\n\ninterface SkillResponse {\n success: boolean;\n message: string;\n data?: any;\n}\n\ninterface SkillUpdateBody {\n name?: string;\n description?: string;\n license?: string;\n compatibility?: string;\n metadata?: Record<string, string>;\n content?: string;\n subSkills?: string[];\n}\n\nexport async function getSkillList(request: FastifyRequest, reply: FastifyReply): Promise<SkillListResponse> {\n try {\n const skills = await skillService.getAllSkills(request);\n return {\n success: true,\n message: \"Successfully retrieved skill list\",\n data: { records: skills.map(serializeSkill), total: skills.length },\n };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to retrieve skills: ${error.message}`,\n data: { records: [], total: 0 },\n });\n }\n}\n\nexport async function getSkill(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n): Promise<SkillResponse> {\n try {\n const { id } = request.params;\n const skill = await skillService.getSkillById(request, id);\n\n if (!skill) {\n return reply.status(404).send({ success: false, message: \"Skill not found\" });\n }\n\n return { success: true, message: \"Successfully retrieved skill\", data: serializeSkill(skill) };\n } catch (error: any) {\n return reply.status(500).send({ success: false, message: `Failed to retrieve skill: ${error.message}` });\n }\n}\n\nexport async function createSkill(\n request: FastifyRequest<{ Body: CreateSkillRequest }>,\n reply: FastifyReply\n): Promise<SkillResponse> {\n try {\n const data = request.body;\n if (!data.name) {\n return reply.status(400).send({ success: false, message: \"name is required\" });\n }\n if (!data.description) {\n return reply.status(400).send({ success: false, message: \"description is required\" });\n }\n\n const id = (request.body as any).id || data.name;\n if (id !== data.name) {\n return reply.status(400).send({\n success: false,\n message: `id \"${id}\" must equal name \"${data.name}\"`,\n });\n }\n\n const skill = await skillService.createSkill(request, id, data);\n return reply.status(201).send({\n success: true,\n message: \"Successfully created skill\",\n data: serializeSkill(skill),\n });\n } catch (error: any) {\n if (error.message?.includes(\"already exists\")) {\n return reply.status(409).send({ success: false, message: error.message });\n }\n if (error.message?.includes(\"built-in skill\")) {\n return reply.status(403).send({ success: false, message: error.message });\n }\n if (error.message?.includes(\"must equal name\") || error.message?.includes(\"Invalid skill name\")) {\n return reply.status(400).send({ success: false, message: error.message });\n }\n return reply.status(500).send({ success: false, message: `Failed to create skill: ${error.message}` });\n }\n}\n\nexport async function updateSkill(\n request: FastifyRequest<{ Params: { id: string }; Body: SkillUpdateBody }>,\n reply: FastifyReply\n): Promise<SkillResponse> {\n try {\n const { id } = request.params;\n const updates = request.body;\n\n const skill = await skillService.updateSkill(request, id, updates);\n\n if (!skill) {\n return reply.status(404).send({ success: false, message: \"Skill not found\" });\n }\n\n return { success: true, message: \"Successfully updated skill\", data: serializeSkill(skill) };\n } catch (error: any) {\n if (error.message?.includes(\"built-in skill\")) {\n return reply.status(403).send({ success: false, message: error.message });\n }\n if (error.message?.includes(\"Invalid skill name\")) {\n return reply.status(400).send({ success: false, message: error.message });\n }\n return reply.status(500).send({ success: false, message: `Failed to update skill: ${error.message}` });\n }\n}\n\nexport async function deleteSkill(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string }> {\n try {\n const { id } = request.params;\n const result = await skillService.deleteSkill(request, id);\n\n if (!result) {\n return reply.status(404).send({ success: false, message: \"Skill not found\" });\n }\n\n return { success: true, message: \"Successfully deleted skill\" };\n } catch (error: any) {\n if (error.message?.includes(\"built-in skill\")) {\n return reply.status(403).send({ success: false, message: error.message });\n }\n return reply.status(500).send({ success: false, message: `Failed to delete skill: ${error.message}` });\n }\n}\n\nexport async function searchSkillsByMetadata(\n request: FastifyRequest<{ Querystring: { key: string; value: string } }>,\n reply: FastifyReply\n): Promise<SkillListResponse> {\n try {\n const { key, value } = request.query;\n if (!key || !value) {\n return reply.status(400).send({\n success: false,\n message: \"key and value query parameters are required\",\n data: { records: [], total: 0 },\n });\n }\n\n const skills = await skillService.searchByMetadata(request, key, value);\n return {\n success: true,\n message: \"Successfully searched skills\",\n data: { records: skills.map(serializeSkill), total: skills.length },\n };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to search skills: ${error.message}`,\n data: { records: [], total: 0 },\n });\n }\n}\n\nexport async function filterSkillsByCompatibility(\n request: FastifyRequest<{ Querystring: { compatibility: string } }>,\n reply: FastifyReply\n): Promise<SkillListResponse> {\n try {\n const { compatibility } = request.query;\n if (!compatibility) {\n return reply.status(400).send({\n success: false,\n message: \"compatibility query parameter is required\",\n data: { records: [], total: 0 },\n });\n }\n\n const skills = await skillService.filterByCompatibility(request, compatibility);\n return {\n success: true,\n message: \"Successfully filtered skills\",\n data: { records: skills.map(serializeSkill), total: skills.length },\n };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to filter skills: ${error.message}`,\n data: { records: [], total: 0 },\n });\n }\n}\n\nexport async function filterSkillsByLicense(\n request: FastifyRequest<{ Querystring: { license: string } }>,\n reply: FastifyReply\n): Promise<SkillListResponse> {\n try {\n const { license } = request.query;\n if (!license) {\n return reply.status(400).send({\n success: false,\n message: \"license query parameter is required\",\n data: { records: [], total: 0 },\n });\n }\n\n const skills = await skillService.filterByLicense(request, license);\n return {\n success: true,\n message: \"Successfully filtered skills\",\n data: { records: skills.map(serializeSkill), total: skills.length },\n };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to filter skills: ${error.message}`,\n data: { records: [], total: 0 },\n });\n }\n}\n","/**\n * CollectionService\n *\n * Business logic layer for collection management and entry operations.\n * Uses CollectionLatticeManager for registration, VectorStoreLatticeManager for storage,\n * and EmbeddingsLatticeManager for vector embedding.\n * All vector store operations are tenant-isolated.\n */\n\nimport { v4 as uuidv4 } from \"uuid\";\nimport { Document } from \"@langchain/core/documents\";\nimport {\n collectionLatticeManager,\n embeddingsLatticeManager,\n getOrCreateCollectionVectorStore,\n getCollectionEntryCount,\n listCollectionEntries,\n removeCollectionVectorStore,\n} from \"@axiom-lattice/core\";\nimport type {\n Collection,\n CreateCollectionRequest,\n UpdateCollectionRequest,\n} from \"@axiom-lattice/protocols\";\nimport { FastifyRequest } from \"fastify\";\n\nfunction getTenantId(request: FastifyRequest): string {\n return (\n (request as any).user?.tenantId ||\n (request.headers[\"x-tenant-id\"] as string) ||\n \"default\"\n );\n}\n\nexport interface EntryResponse {\n id: string;\n content: string;\n metadata: Record<string, unknown>;\n score?: number;\n}\n\nexport class CollectionService {\n // ─── Collection CRUD ──────────────────────────────────────────\n\n async getAllCollections(request: FastifyRequest): Promise<Collection[]> {\n const tenantId = getTenantId(request);\n const collections = await collectionLatticeManager.getAllCollections(tenantId);\n\n for (const c of collections) {\n try {\n (c as any)._entryCount = await getCollectionEntryCount(c.name, c.embeddingKey, c.tenantId);\n } catch {\n (c as any)._entryCount = 0;\n }\n }\n\n return collections;\n }\n\n async getCollectionByName(\n request: FastifyRequest,\n name: string\n ): Promise<Collection | null> {\n const tenantId = getTenantId(request);\n return collectionLatticeManager.getCollection(tenantId, name);\n }\n\n async createCollection(\n request: FastifyRequest,\n data: CreateCollectionRequest\n ): Promise<Collection> {\n const tenantId = getTenantId(request);\n const collection = await collectionLatticeManager.registerCollection(tenantId, data);\n\n try {\n await getOrCreateCollectionVectorStore(data.name, data.embeddingKey, tenantId);\n } catch (err) {\n console.warn(`[CollectionService] Failed to init vector store for ${data.name}:`, err);\n }\n\n return collection;\n }\n\n async updateCollection(\n request: FastifyRequest,\n name: string,\n updates: UpdateCollectionRequest\n ): Promise<Collection | null> {\n const tenantId = getTenantId(request);\n return collectionLatticeManager.updateCollection(tenantId, name, updates);\n }\n\n async deleteCollection(\n request: FastifyRequest,\n name: string\n ): Promise<boolean> {\n const tenantId = getTenantId(request);\n await removeCollectionVectorStore(name, tenantId);\n return collectionLatticeManager.removeCollection(tenantId, name);\n }\n\n // ─── Entry CRUD ───────────────────────────────────────────────\n\n async getEntries(\n request: FastifyRequest,\n collectionName: string\n ): Promise<EntryResponse[]> {\n const collection = await this.getCollectionByName(request, collectionName);\n if (!collection) throw new Error(`Collection \"${collectionName}\" not found`);\n\n const docs = await listCollectionEntries(collectionName, collection.embeddingKey, collection.tenantId);\n\n return docs.map((doc: Document) => ({\n id: (doc.metadata._id as string) || \"\",\n content: doc.pageContent,\n metadata: Object.fromEntries(\n Object.entries(doc.metadata).filter(([k]) => !k.startsWith(\"_\"))\n ),\n }));\n }\n\n async createEntry(\n request: FastifyRequest,\n collectionName: string,\n data: { content: string; metadata?: Record<string, unknown> }\n ): Promise<EntryResponse> {\n const collection = await this.getCollectionByName(request, collectionName);\n if (!collection) throw new Error(`Collection \"${collectionName}\" not found`);\n\n const vectorStore = await getOrCreateCollectionVectorStore(\n collectionName, collection.embeddingKey, collection.tenantId\n );\n\n const entryId = uuidv4();\n const now = new Date().toISOString();\n const doc = new Document({\n pageContent: data.content,\n metadata: {\n _id: entryId,\n _created_at: now,\n _updated_at: now,\n ...(data.metadata || {}),\n },\n });\n\n await vectorStore.addDocuments([doc]);\n\n return { id: entryId, content: data.content, metadata: data.metadata || {} };\n }\n\n async getEntry(\n request: FastifyRequest,\n collectionName: string,\n entryId: string\n ): Promise<EntryResponse | null> {\n const collection = await this.getCollectionByName(request, collectionName);\n if (!collection) throw new Error(`Collection \"${collectionName}\" not found`);\n\n const docs = await listCollectionEntries(collectionName, collection.embeddingKey, collection.tenantId);\n const doc = docs.find((d: Document) => d.metadata._id === entryId);\n if (!doc) return null;\n return {\n id: entryId,\n content: doc.pageContent,\n metadata: Object.fromEntries(\n Object.entries(doc.metadata).filter(([k]) => !k.startsWith(\"_\"))\n ),\n };\n }\n\n async updateEntry(\n request: FastifyRequest,\n collectionName: string,\n entryId: string,\n data: { content?: string; metadata?: Record<string, unknown> }\n ): Promise<EntryResponse | null> {\n const existing = await this.getEntry(request, collectionName, entryId);\n if (!existing) return null;\n\n const collection = await this.getCollectionByName(request, collectionName);\n if (!collection) throw new Error(`Collection \"${collectionName}\" not found`);\n\n const vectorStore = await getOrCreateCollectionVectorStore(\n collectionName, collection.embeddingKey, collection.tenantId\n );\n\n try {\n await vectorStore.delete({ filter: { _id: entryId } } as any);\n } catch {\n // best effort\n }\n\n const now = new Date().toISOString();\n const mergedMetadata = { ...existing.metadata, ...(data.metadata || {}) };\n const doc = new Document({\n pageContent: data.content ?? existing.content,\n metadata: { _id: entryId, _created_at: now, _updated_at: now, ...mergedMetadata },\n });\n\n await vectorStore.addDocuments([doc]);\n\n return { id: entryId, content: data.content ?? existing.content, metadata: mergedMetadata };\n }\n\n async deleteEntry(\n request: FastifyRequest,\n collectionName: string,\n entryId: string\n ): Promise<boolean> {\n const collection = await this.getCollectionByName(request, collectionName);\n if (!collection) throw new Error(`Collection \"${collectionName}\" not found`);\n\n const vectorStore = await getOrCreateCollectionVectorStore(\n collectionName, collection.embeddingKey, collection.tenantId\n );\n\n try {\n await vectorStore.delete({ filter: { _id: entryId } } as any);\n return true;\n } catch {\n return false;\n }\n }\n\n async searchEntries(\n request: FastifyRequest,\n collectionName: string,\n params: { query: string; filter?: Record<string, unknown>; top_k?: number }\n ): Promise<EntryResponse[]> {\n const collection = await this.getCollectionByName(request, collectionName);\n if (!collection) throw new Error(`Collection \"${collectionName}\" not found`);\n\n const vectorStore = await getOrCreateCollectionVectorStore(\n collectionName, collection.embeddingKey, collection.tenantId\n );\n\n let embeddings;\n try {\n embeddings = embeddingsLatticeManager.getEmbeddingsClient(collection.embeddingKey);\n } catch {\n embeddings = embeddingsLatticeManager.getEmbeddingsClient(\"default\");\n }\n\n const queryVector = await embeddings.embedQuery(params.query);\n const results = await vectorStore.similaritySearchVectorWithScore(\n queryVector, params.top_k || 5, params.filter as any\n );\n\n return results.map(([doc, score]: [Document, number]) => ({\n id: (doc.metadata._id as string) || uuidv4(),\n content: doc.pageContent,\n metadata: Object.fromEntries(\n Object.entries(doc.metadata).filter(([k]) => !k.startsWith(\"_\"))\n ),\n score,\n }));\n }\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { CollectionService } from \"../services/collection_service\";\nimport type {\n Collection,\n CreateCollectionRequest,\n UpdateCollectionRequest,\n} from \"@axiom-lattice/protocols\";\n\nconst collectionService = new CollectionService();\n\nfunction serializeCollection(collection: Collection): any {\n return {\n id: collection.id,\n name: collection.name,\n label: collection.label,\n embeddingKey: collection.embeddingKey,\n schema: collection.schema,\n entryCount: (collection as any)._entryCount ?? 0,\n createdAt:\n collection.createdAt instanceof Date\n ? collection.createdAt.toISOString()\n : new Date().toISOString(),\n updatedAt:\n collection.updatedAt instanceof Date\n ? collection.updatedAt.toISOString()\n : new Date().toISOString(),\n };\n}\n\nexport async function getCollectionList(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<any> {\n try {\n const collections = await collectionService.getAllCollections(request);\n return {\n success: true,\n message: \"Successfully retrieved collection list\",\n data: {\n records: collections.map(serializeCollection),\n total: collections.length,\n },\n };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to retrieve collections: ${error.message}`,\n data: { records: [], total: 0 },\n });\n }\n}\n\nexport async function getCollection(\n request: FastifyRequest<{ Params: { name: string } }>,\n reply: FastifyReply\n): Promise<any> {\n try {\n const { name } = request.params;\n const collection = await collectionService.getCollectionByName(request, name);\n\n if (!collection) {\n return reply\n .status(404)\n .send({ success: false, message: \"Collection not found\" });\n }\n\n return {\n success: true,\n message: \"Successfully retrieved collection\",\n data: serializeCollection(collection),\n };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to retrieve collection: ${error.message}`,\n });\n }\n}\n\nexport async function createCollection(\n request: FastifyRequest<{ Body: CreateCollectionRequest }>,\n reply: FastifyReply\n): Promise<any> {\n try {\n const data = request.body;\n if (!data.name) {\n return reply\n .status(400)\n .send({ success: false, message: \"name is required\" });\n }\n if (!data.label) {\n return reply\n .status(400)\n .send({ success: false, message: \"label is required\" });\n }\n if (!data.embeddingKey) {\n return reply\n .status(400)\n .send({ success: false, message: \"embeddingKey is required\" });\n }\n\n const collection = await collectionService.createCollection(request, data);\n return reply.status(201).send({\n success: true,\n message: \"Successfully created collection\",\n data: serializeCollection(collection),\n });\n } catch (error: any) {\n if (error.message?.includes(\"already exists\")) {\n return reply.status(409).send({ success: false, message: error.message });\n }\n return reply.status(500).send({\n success: false,\n message: `Failed to create collection: ${error.message}`,\n });\n }\n}\n\nexport async function updateCollection(\n request: FastifyRequest<{\n Params: { name: string };\n Body: UpdateCollectionRequest;\n }>,\n reply: FastifyReply\n): Promise<any> {\n try {\n const { name } = request.params;\n const updates = request.body;\n\n const collection = await collectionService.updateCollection(\n request,\n name,\n updates\n );\n\n if (!collection) {\n return reply\n .status(404)\n .send({ success: false, message: \"Collection not found\" });\n }\n\n return {\n success: true,\n message: \"Successfully updated collection\",\n data: serializeCollection(collection),\n };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to update collection: ${error.message}`,\n });\n }\n}\n\nexport async function deleteCollection(\n request: FastifyRequest<{ Params: { name: string } }>,\n reply: FastifyReply\n): Promise<any> {\n try {\n const { name } = request.params;\n const result = await collectionService.deleteCollection(request, name);\n\n if (!result) {\n return reply\n .status(404)\n .send({ success: false, message: \"Collection not found\" });\n }\n\n return { success: true, message: \"Successfully deleted collection\" };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to delete collection: ${error.message}`,\n });\n }\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { embeddingsLatticeManager } from \"@axiom-lattice/core\";\n\nexport async function listEmbeddings(\n _request: FastifyRequest,\n _reply: FastifyReply\n): Promise<any> {\n try {\n const info = embeddingsLatticeManager.getAllEmbeddingsInfo();\n return {\n success: true,\n message: \"Successfully retrieved embedding models\",\n data: { records: info, total: info.length },\n };\n } catch (error: any) {\n return {\n success: false,\n message: `Failed to retrieve embeddings: ${error.message}`,\n data: { records: [], total: 0 },\n };\n }\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { CollectionService } from \"../services/collection_service\";\n\nconst collectionService = new CollectionService();\n\nexport async function listEntries(\n request: FastifyRequest<{ Params: { name: string } }>,\n reply: FastifyReply\n): Promise<any> {\n try {\n const { name } = request.params;\n const entries = await collectionService.getEntries(request, name);\n return {\n success: true,\n message: \"Successfully retrieved entries\",\n data: { records: entries, total: entries.length },\n };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to retrieve entries: ${error.message}`,\n data: { records: [], total: 0 },\n });\n }\n}\n\nexport async function createEntry(\n request: FastifyRequest<{ Params: { name: string }; Body: { content: string; metadata?: Record<string, unknown> } }>,\n reply: FastifyReply\n): Promise<any> {\n try {\n const { name } = request.params;\n const data = request.body;\n if (!data.content) {\n return reply.status(400).send({ success: false, message: \"content is required\" });\n }\n\n const entry = await collectionService.createEntry(request, name, data);\n return reply.status(201).send({\n success: true,\n message: \"Successfully created entry\",\n data: entry,\n });\n } catch (error: any) {\n if (error.message?.includes(\"not found\")) {\n return reply.status(404).send({ success: false, message: error.message });\n }\n return reply.status(500).send({\n success: false,\n message: `Failed to create entry: ${error.message}`,\n });\n }\n}\n\nexport async function getEntry(\n request: FastifyRequest<{ Params: { name: string; id: string } }>,\n reply: FastifyReply\n): Promise<any> {\n try {\n const { name, id } = request.params;\n const entry = await collectionService.getEntry(request, name, id);\n\n if (!entry) {\n return reply.status(404).send({ success: false, message: \"Entry not found\" });\n }\n\n return {\n success: true,\n message: \"Successfully retrieved entry\",\n data: entry,\n };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to retrieve entry: ${error.message}`,\n });\n }\n}\n\nexport async function updateEntry(\n request: FastifyRequest<{ Params: { name: string; id: string }; Body: { content?: string; metadata?: Record<string, unknown> } }>,\n reply: FastifyReply\n): Promise<any> {\n try {\n const { name, id } = request.params;\n const data = request.body;\n\n const entry = await collectionService.updateEntry(request, name, id, data);\n\n if (!entry) {\n return reply.status(404).send({ success: false, message: \"Entry not found\" });\n }\n\n return {\n success: true,\n message: \"Successfully updated entry\",\n data: entry,\n };\n } catch (error: any) {\n if (error.message?.includes(\"not found\")) {\n return reply.status(404).send({ success: false, message: error.message });\n }\n return reply.status(500).send({\n success: false,\n message: `Failed to update entry: ${error.message}`,\n });\n }\n}\n\nexport async function deleteEntry(\n request: FastifyRequest<{ Params: { name: string; id: string } }>,\n reply: FastifyReply\n): Promise<any> {\n try {\n const { name, id } = request.params;\n const result = await collectionService.deleteEntry(request, name, id);\n\n if (!result) {\n return reply.status(404).send({ success: false, message: \"Entry not found\" });\n }\n\n return { success: true, message: \"Successfully deleted entry\" };\n } catch (error: any) {\n return reply.status(500).send({\n success: false,\n message: `Failed to delete entry: ${error.message}`,\n });\n }\n}\n\nexport async function searchEntries(\n request: FastifyRequest<{\n Params: { name: string };\n Body: { query: string; filter?: Record<string, unknown>; top_k?: number };\n }>,\n reply: FastifyReply\n): Promise<any> {\n try {\n const { name } = request.params;\n const { query, filter, top_k } = request.body;\n\n if (!query) {\n return reply.status(400).send({ success: false, message: \"query is required\" });\n }\n\n const entries = await collectionService.searchEntries(request, name, {\n query,\n filter,\n top_k,\n });\n\n return {\n success: true,\n message: \"Search completed\",\n data: { records: entries, total: entries.length },\n };\n } catch (error: any) {\n if (error.message?.includes(\"not found\")) {\n return reply.status(404).send({ success: false, message: error.message });\n }\n return reply.status(500).send({\n success: false,\n message: `Search failed: ${error.message}`,\n data: { records: [], total: 0 },\n });\n }\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { toolLatticeManager } from \"@axiom-lattice/core\";\nimport type {\n ToolConfig,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * Tools Controller\n * Handles tool-related operations\n */\n\n/**\n * Tool config meta response interface\n */\ninterface ToolConfigMetaResponse {\n success: boolean;\n message: string;\n data: {\n records: Array<{\n id: string;\n name: string;\n description: string;\n schema?: any; // Serialized schema\n returnDirect?: boolean;\n needUserApprove?: boolean;\n }>;\n total: number;\n };\n}\n\n/**\n * Serialize ZodSchema to JSON-serializable format\n * Attempts to extract schema information for API response\n */\nfunction serializeSchema(schema: any): any {\n if (!schema) {\n return undefined;\n }\n\n try {\n // Try to get JSON schema if available (zod-to-json-schema or similar)\n if (schema._def) {\n // For Zod schemas, try to extract basic info\n const def = schema._def;\n if (def.typeName === \"ZodObject\") {\n // Extract shape information\n const shape = def.shape();\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n const fieldDef = (value as any)._def;\n if (fieldDef) {\n properties[key] = {\n type: fieldDef.typeName === \"ZodString\" ? \"string\" :\n fieldDef.typeName === \"ZodNumber\" ? \"number\" :\n fieldDef.typeName === \"ZodBoolean\" ? \"boolean\" :\n fieldDef.typeName === \"ZodArray\" ? \"array\" :\n fieldDef.typeName === \"ZodObject\" ? \"object\" : \"unknown\",\n description: fieldDef.description,\n };\n if (!(value as any).isOptional()) {\n required.push(key);\n }\n }\n }\n\n return {\n type: \"object\",\n properties,\n required: required.length > 0 ? required : undefined,\n };\n }\n }\n\n // Fallback: return schema description or type name\n return {\n type: \"object\",\n description: schema.description || \"Schema definition\",\n };\n } catch (error) {\n // If serialization fails, return a safe fallback\n return {\n type: \"object\",\n description: \"Schema definition\",\n };\n }\n}\n\n/**\n * Get tool config meta from ToolLatticeManager\n * Exposes tool configuration metadata via /api/tools endpoint\n */\nexport async function getToolConfigs(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<ToolConfigMetaResponse> {\n try {\n const allLattices = toolLatticeManager.getAllLattices();\n \n const toolConfigs = allLattices.map((lattice) => {\n const config = { ...lattice.config };\n \n // Serialize schema if present\n const serializedSchema = config.schema ? serializeSchema(config.schema) : undefined;\n\n return {\n id: lattice.key,\n name: config.name,\n description: config.description,\n schema: serializedSchema,\n returnDirect: config.returnDirect,\n needUserApprove: config.needUserApprove,\n };\n });\n\n return reply.send({\n success: true,\n message: \"Successfully retrieved tool configs\",\n data: {\n records: toolConfigs,\n total: toolConfigs.length,\n },\n });\n } catch (error: any) {\n console.error(\"Failed to get tool configs\", {\n error: error.message,\n stack: error.stack,\n });\n return reply.status(500).send({\n success: false,\n message: `Failed to retrieve tool configs: ${error.message}`,\n data: {\n records: [],\n total: 0,\n },\n });\n }\n}","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport {\n getStoreLattice,\n metricsServerManager,\n SemanticMetricsClient,\n} from \"@axiom-lattice/core\";\nimport type {\n MetricsServerConfigStore,\n SemanticMetricsServerConfig,\n SemanticMetricsFilter,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * Get tenant ID from request headers\n */\nfunction getTenantId(request: FastifyRequest): string {\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\n/**\n * Data query request body\n */\ninterface DataQueryRequest {\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 customSql?: string;\n params?: Record<string, string | number | boolean>;\n limit?: number;\n}\n\n/**\n * Data query response - 只返回原始数据\n */\ninterface DataQueryResponse {\n success: boolean;\n message: string;\n data?: {\n // 语义查询结果\n semanticModel?: string;\n columns: Array<{ name: string; type: string }>;\n rows?: Array<Array<unknown>>;\n rowsObject?: Array<Record<string, unknown>>;\n // SQL 查询结果\n tableName?: string;\n executedSql?: string;\n // 通用元数据\n metadata: {\n rowCount: number;\n executionTimeMs?: number;\n };\n };\n}\n\n/**\n * Execute data query (semantic or SQL)\n */\nexport async function executeDataQuery(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<DataQueryResponse> {\n const tenantId = getTenantId(request);\n const body = request.body as DataQueryRequest;\n\n try {\n // Validate request\n if (!body.serverKey && !body.datasourceId) {\n reply.code(400);\n return {\n success: false,\n message: \"Either serverKey or datasourceId must be provided\",\n };\n }\n\n // Determine query type\n const isSemanticQuery = body.metrics && body.metrics.length > 0;\n const isSqlQuery = body.customSql && body.customSql.trim().length > 0;\n\n if (!isSemanticQuery && !isSqlQuery) {\n reply.code(400);\n return {\n success: false,\n message: \"Either metrics (for semantic query) or customSql (for SQL query) must be provided\",\n };\n }\n\n if (isSemanticQuery && isSqlQuery) {\n reply.code(400);\n return {\n success: false,\n message: \"Cannot provide both metrics and customSql. Use one query type only.\",\n };\n }\n\n // Get server config\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n if (!body.serverKey) {\n reply.code(400);\n return {\n success: false,\n message: \"serverKey is required\",\n };\n }\n\n const config = await store.getConfigByKey(tenantId, body.serverKey);\n if (!config) {\n reply.code(404);\n return {\n success: false,\n message: `Metrics server configuration not found: ${body.serverKey}`,\n };\n }\n\n if (config.config.type !== \"semantic\") {\n reply.code(400);\n return {\n success: false,\n message: \"This endpoint only supports semantic metrics servers\",\n };\n }\n\n if (!body.datasourceId) {\n reply.code(400);\n return {\n success: false,\n message: \"datasourceId is required\",\n };\n }\n\n // Get client from manager (queries store for latest config)\n let client: SemanticMetricsClient;\n try {\n client = await metricsServerManager.getClient(tenantId, body.serverKey) as SemanticMetricsClient;\n } catch {\n reply.code(400);\n return {\n success: false,\n message: `Metrics server not registered: ${body.serverKey}. Please register the server first.`,\n };\n }\n\n // Execute query based on type\n if (isSemanticQuery) {\n return await executeSemanticQuery(client, body, reply);\n } else {\n return await executeSqlQuery(client, body, reply);\n }\n } catch (error) {\n console.error(\"Failed to execute data query:\", error);\n reply.code(500);\n return {\n success: false,\n message: `Failed to execute data query: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Execute semantic query\n */\nasync function executeSemanticQuery(\n client: SemanticMetricsClient,\n body: DataQueryRequest,\n reply: FastifyReply\n): Promise<DataQueryResponse> {\n const semanticFilters: SemanticMetricsFilter[] = (body.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: body.datasourceId!,\n metrics: body.metrics!,\n groupBy: body.groupBy,\n filters: semanticFilters,\n limit: body.limit || 1000,\n });\n\n // 直接返回原始数据,不做 ECharts 转换\n return {\n success: true,\n message: \"Semantic query executed successfully\",\n data: {\n semanticModel: result.semanticModel,\n columns: result.columns,\n rows: result.rows,\n rowsObject: result.rowsObject,\n metadata: {\n rowCount: result.rowCount,\n executionTimeMs: result.executionTimeMs,\n },\n },\n };\n}\n\n/**\n * Execute SQL query\n */\nasync function executeSqlQuery(\n client: SemanticMetricsClient,\n body: DataQueryRequest,\n reply: FastifyReply\n): Promise<DataQueryResponse> {\n const result = await client.executeSqlQuery({\n datasourceId: body.datasourceId!,\n customSql: body.customSql!,\n params: body.params,\n limit: body.limit || 100,\n });\n\n // 直接返回原始数据,不做 ECharts 转换\n return {\n success: true,\n message: \"SQL query executed successfully\",\n data: {\n tableName: result.tableName,\n columns: result.columns.map(name => ({ name, type: 'unknown' })),\n rows: result.rows,\n rowsObject: result.rowsObject,\n executedSql: result.executedSql,\n metadata: {\n rowCount: result.rowCount,\n executionTimeMs: result.executionTimeMs,\n },\n },\n };\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { getStoreLattice, agentInstanceManager, ThreadStatus, abortWorkflowRun as signalAbort } from \"@axiom-lattice/core\";\nimport type { WorkflowTrackingStore, WorkflowRun, RunStep } from \"@axiom-lattice/protocols\";\nimport { MessageChunkTypes } from \"@axiom-lattice/protocols\";\n\nfunction getTenantId(request: FastifyRequest): string {\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) return userTenantId;\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\nfunction getTrackingStore(): WorkflowTrackingStore | null {\n try {\n const storeLattice = getStoreLattice(\"default\", \"workflowTracking\");\n return storeLattice.store;\n } catch {\n return null;\n }\n}\n\ninterface ApiResponse<T = any> {\n success: boolean;\n message: string;\n data?: T;\n}\n\nasync function getDefinitionsFromAssistants(tenantId: string): Promise<Array<{\n assistantId: string;\n assistantName: string;\n description?: string;\n topologyEdges: { from: string; to: string; purpose: string }[];\n totalEdges: number;\n}>> {\n try {\n const storeLattice = getStoreLattice(\"default\", \"assistant\");\n const assistantStore = storeLattice.store;\n const assistants = await assistantStore.getAllAssistants(tenantId);\n\n const results: Array<{\n assistantId: string;\n assistantName: string;\n description?: string;\n topologyEdges: { from: string; to: string; purpose: string }[];\n totalEdges: number;\n }> = [];\n\n for (const a of assistants) {\n const def = a.graphDefinition;\n if (!def || def.type !== \"processing\") continue;\n if (!def.middleware) continue;\n for (const mw of def.middleware) {\n if (mw.type === \"topology\" && mw.enabled) {\n results.push({\n assistantId: a.id,\n assistantName: a.name,\n description: a.description,\n topologyEdges: mw.config.edges,\n totalEdges: mw.config.edges.length,\n });\n }\n }\n }\n return results;\n } catch {\n return [];\n }\n}\n\nexport async function getAllWorkflowDefinitions(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<ApiResponse<{ records: any[] }>> {\n const tenantId = getTenantId(request);\n\n try {\n // Get definitions from assistant configs (always available, even before first run)\n const configDefs = await getDefinitionsFromAssistants(tenantId);\n\n if (configDefs.length === 0) {\n return {\n success: true,\n message: \"No workflow definitions found\",\n data: { records: [] },\n };\n }\n\n // Merge in run-derived data (lastRunAt, runCount) if tracking store exists\n const runMap = new Map<string, { lastRunAt?: string; runCount: number }>();\n try {\n const store = getTrackingStore();\n if (store) {\n const runs = await store.getWorkflowRunsByTenantId(tenantId);\n for (const r of runs) {\n const entry = runMap.get(r.assistantId) || { runCount: 0 };\n entry.runCount++;\n if (!entry.lastRunAt || new Date(r.startedAt) > new Date(entry.lastRunAt)) {\n entry.lastRunAt = r.startedAt instanceof Date ? r.startedAt.toISOString() : String(r.startedAt);\n }\n runMap.set(r.assistantId, entry);\n }\n }\n } catch {\n // tracking store unavailable, definitions from config only\n }\n\n const definitions = configDefs.map((d) => {\n const runInfo = runMap.get(d.assistantId);\n return {\n ...d,\n lastRunAt: runInfo?.lastRunAt || null,\n runCount: runInfo?.runCount || 0,\n };\n });\n\n return {\n success: true,\n message: \"Successfully retrieved workflow definitions\",\n data: { records: definitions },\n };\n } catch (error) {\n request.log.error(error, \"Failed to get workflow definitions\");\n return reply.status(500).send({ success: false, message: \"Failed to retrieve workflow definitions\" });\n }\n}\n\nexport async function getAllWorkflowRuns(\n request: FastifyRequest<{ Querystring: { assistantId?: string; status?: string } }>,\n reply: FastifyReply\n): Promise<ApiResponse<{ records: any[]; total: number }>> {\n const tenantId = getTenantId(request);\n const { assistantId, status } = request.query;\n\n try {\n const store = getTrackingStore();\n if (!store) {\n return reply.status(404).send({ success: false, message: \"No workflow tracking store configured\" });\n }\n\n // Resolve assistant names\n const nameMap: Record<string, string> = {};\n try {\n const asStoreLattice = getStoreLattice(\"default\", \"assistant\");\n const assistantStore = asStoreLattice.store;\n const assistants = await assistantStore.getAllAssistants(tenantId);\n for (const a of assistants) {\n nameMap[a.id] = a.name;\n }\n } catch {\n // names unavailable, will fall back to ID\n }\n\n let runs: WorkflowRun[];\n if (assistantId) {\n runs = await store.getWorkflowRunsByAssistantId(tenantId, assistantId);\n } else {\n runs = await store.getWorkflowRunsByTenantId(tenantId);\n }\n\n if (status) {\n runs = runs.filter(r => r.status === status);\n }\n\n // Enrich runs with step counts (more accurate than edge-based counts for branching workflows)\n const enrichedRuns = await Promise.all(\n runs.map(async (run) => {\n try {\n const steps = await store.getRunSteps(run.id);\n const totalSteps = steps.length;\n const completedSteps = steps.filter(s => s.status === 'completed').length;\n return { ...run, totalSteps, completedSteps, assistantName: nameMap[run.assistantId] || run.assistantId };\n } catch {\n return { ...run, totalSteps: 0, completedSteps: 0, assistantName: nameMap[run.assistantId] || run.assistantId };\n }\n })\n );\n\n return {\n success: true,\n message: \"Successfully retrieved workflow runs\",\n data: { records: enrichedRuns, total: enrichedRuns.length },\n };\n } catch (error) {\n request.log.error({ tenantId, assistantId, status, error: (error as Error).stack || (error as Error).message }, \"Failed to get workflow runs\");\n return reply.status(500).send({\n success: false,\n message: `Failed to retrieve workflow runs: ${(error as Error).message}`,\n });\n }\n}\n\n// GET /api/workflows/inbox\n// Pagination semantics:\n// - No page/pageSize → legacy mode: all interrupted items, data = { records } (unchanged shape).\n// - page and/or pageSize → paged mode: store-level pagination over interrupted runs,\n// data = { records, total, page, pageSize }. total = number of interrupted RUNS\n// (each run expands to 0..N inbox items after the agent-state check).\nconst INBOX_DEFAULT_PAGE_SIZE = 20;\nconst INBOX_MAX_PAGE_SIZE = 100;\n\nexport async function getInboxItems(\n request: FastifyRequest<{ Querystring: { page?: string; pageSize?: string } }>,\n reply: FastifyReply\n): Promise<ApiResponse<{ records: any[]; total?: number; page?: number; pageSize?: number }>> {\n const tenantId = getTenantId(request);\n\n try {\n const store = getTrackingStore();\n if (!store) {\n return { success: true, message: \"No tracking store configured\", data: { records: [] } };\n }\n\n // Resolve assistant names\n const nameMap: Record<string, string> = {};\n try {\n const asStoreLattice = getStoreLattice(\"default\", \"assistant\");\n const assistantStore = asStoreLattice.store;\n const assistants = await assistantStore.getAllAssistants(tenantId);\n for (const a of assistants) {\n nameMap[a.id] = a.name;\n }\n } catch {\n // names unavailable, will fall back to ID\n }\n\n const { page: pageParam, pageSize: pageSizeParam } = request.query;\n const paged = pageParam !== undefined || pageSizeParam !== undefined;\n const page = Math.max(1, parseInt(pageParam ?? \"\", 10) || 1);\n const pageSize = Math.min(INBOX_MAX_PAGE_SIZE, Math.max(1, parseInt(pageSizeParam ?? \"\", 10) || INBOX_DEFAULT_PAGE_SIZE));\n\n let pendingRuns: WorkflowRun[];\n let total: number | undefined;\n if (paged) {\n const result = await store.queryWorkflowRuns(tenantId, {\n status: \"interrupted\",\n limit: pageSize,\n offset: (page - 1) * pageSize,\n });\n pendingRuns = result.records;\n total = result.total;\n } else {\n const result = await store.queryWorkflowRuns(tenantId, { status: \"interrupted\" });\n pendingRuns = result.records;\n }\n\n if (pendingRuns.length === 0) {\n return {\n success: true,\n message: \"No pending workflows\",\n data: paged ? { records: [], total, page, pageSize } : { records: [] },\n };\n }\n\n // Parallelize agent checks across interrupted workflows\n const checkPromises = pendingRuns.map(async (r) => {\n try {\n const [steps, agent] = await Promise.all([\n store.getRunSteps(r.id).catch(() => []),\n (async () => {\n try {\n return agentInstanceManager.getAgent({\n assistant_id: r.assistantId,\n thread_id: r.threadId,\n tenant_id: r.tenantId,\n });\n } catch {\n return null;\n }\n })(),\n ]);\n\n if (!agent) {\n // Agent not available — still return raw item so UI knows a human step exists\n return [{\n runId: r.id,\n assistantId: r.assistantId,\n assistantName: nameMap[r.assistantId] || r.assistantId,\n threadId: r.threadId,\n tenantId: r.tenantId,\n status: r.status,\n startedAt: r.startedAt,\n totalEdges: r.totalEdges,\n completedEdges: r.completedEdges,\n steps,\n }];\n }\n\n const runStatus = await agent.getRunStatus();\n if (runStatus !== \"interrupted\") return [];\n\n const state = await agent.getCurrentState();\n const interrupts = state.tasks\n ?.flatMap((t: any) => t.interrupts || []) || [];\n\n return interrupts.map((i: any) => ({\n runId: r.id,\n assistantId: r.assistantId,\n assistantName: nameMap[r.assistantId] || r.assistantId,\n threadId: r.threadId,\n tenantId: r.tenantId,\n interruptId: i.id,\n interruptValue: i.value,\n status: r.status,\n startedAt: r.startedAt,\n totalEdges: r.totalEdges,\n completedEdges: r.completedEdges,\n steps,\n }));\n } catch (err) {\n request.log.warn({ runId: r.id, error: (err as Error).message }, \"Agent check skipped\");\n return [];\n }\n });\n\n const results = await Promise.all(checkPromises);\n const inboxItems = results.flat();\n // Runs are already sorted by updatedAt DESC, id DESC from queryWorkflowRuns.\n // flatMap preserves run order within each run.\n\n return {\n success: true,\n message: \"Successfully retrieved inbox items\",\n data: paged ? { records: inboxItems, total, page, pageSize } : { records: inboxItems },\n };\n } catch (error) {\n request.log.error(error, \"Failed to get inbox items\");\n return reply.status(500).send({ success: false, message: \"Failed to retrieve inbox items\" });\n }\n}\n\nexport async function getWorkflowDefinitions(\n request: FastifyRequest<{ Params: { assistantId: string } }>,\n reply: FastifyReply\n): Promise<ApiResponse<{ records: any[] }>> {\n const { assistantId } = request.params;\n const tenantId = getTenantId(request);\n\n try {\n const store = getTrackingStore();\n if (!store) {\n return reply.status(404).send({ success: false, message: \"No workflow tracking store configured\" });\n }\n\n const runs = await store.getWorkflowRunsByAssistantId(tenantId, assistantId);\n const seen = new Set<string>();\n const definitions = runs\n .filter(r => {\n const key = JSON.stringify(r.topologyEdges);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n })\n .map(r => ({\n assistantId: r.assistantId,\n topologyEdges: r.topologyEdges,\n totalEdges: r.totalEdges,\n lastRunAt: r.startedAt,\n }));\n\n return {\n success: true,\n message: \"Successfully retrieved workflow definitions\",\n data: { records: definitions },\n };\n } catch (error) {\n request.log.error(error, \"Failed to get workflow definitions\");\n return reply.status(500).send({ success: false, message: \"Failed to retrieve workflow definitions\" });\n }\n}\n\nexport async function getWorkflowRuns(\n request: FastifyRequest<{ Params: { assistantId: string; threadId: string } }>,\n reply: FastifyReply\n): Promise<ApiResponse<{ records: WorkflowRun[]; total: number }>> {\n const { threadId } = request.params;\n const tenantId = getTenantId(request);\n\n try {\n const store = getTrackingStore();\n if (!store) {\n return reply.status(404).send({ success: false, message: \"No workflow tracking store configured\" });\n }\n\n const runs = await store.getWorkflowRunsByThreadId(tenantId, threadId);\n return {\n success: true,\n message: \"Successfully retrieved workflow runs\",\n data: { records: runs, total: runs.length },\n };\n } catch (error) {\n request.log.error(error, \"Failed to get workflow runs\");\n return reply.status(500).send({ success: false, message: \"Failed to retrieve workflow runs\" });\n }\n}\n\nexport async function getWorkflowRun(\n request: FastifyRequest<{ Params: { runId: string } }>,\n reply: FastifyReply\n): Promise<ApiResponse<WorkflowRun>> {\n const { runId } = request.params;\n\n try {\n const store = getTrackingStore();\n if (!store) {\n return reply.status(404).send({ success: false, message: \"No workflow tracking store configured\" });\n }\n\n const run = await store.getWorkflowRun(runId);\n if (!run) {\n return reply.status(404).send({ success: false, message: \"Workflow run not found\" });\n }\n\n return { success: true, message: \"Successfully retrieved workflow run\", data: run };\n } catch (error) {\n request.log.error(error, \"Failed to get workflow run\");\n return reply.status(500).send({ success: false, message: \"Failed to retrieve workflow run\" });\n }\n}\n\nexport async function deleteWorkflowRun(\n request: FastifyRequest<{ Params: { runId: string } }>,\n reply: FastifyReply\n): Promise<ApiResponse> {\n const { runId } = request.params;\n const tenantId = getTenantId(request);\n\n try {\n const store = getTrackingStore();\n if (!store) {\n return reply.status(404).send({ success: false, message: \"No workflow tracking store configured\" });\n }\n\n const run = await store.getWorkflowRun(runId);\n if (!run) {\n return reply.status(404).send({ success: false, message: \"Workflow run not found\" });\n }\n\n // If run is still running, abort the agent first\n if (run.status === \"running\") {\n try {\n const workspace_id = request.headers[\"x-workspace-id\"] as string;\n const project_id = request.headers[\"x-project-id\"] as string;\n const agent = agentInstanceManager.getAgent({\n assistant_id: run.assistantId,\n thread_id: run.threadId,\n tenant_id: tenantId,\n workspace_id,\n project_id,\n });\n await agent.abort();\n } catch (err) {\n request.log.warn({ runId, error: (err as Error).message }, \"Failed to abort agent, deleting tracking records anyway\");\n }\n }\n\n await store.deleteWorkflowRun(runId);\n\n return { success: true, message: \"Workflow run deleted\" };\n } catch (error) {\n request.log.error(error, \"Failed to delete workflow run\");\n return reply.status(500).send({ success: false, message: \"Failed to delete workflow run\" });\n }\n}\n\nexport async function getRunSteps(\n request: FastifyRequest<{ Params: { runId: string }; Querystring: { step_type?: string; status?: string } }>,\n reply: FastifyReply\n): Promise<ApiResponse<{ records: RunStep[]; total: number }>> {\n const { runId } = request.params;\n const { step_type, status: stepStatus } = request.query;\n\n try {\n const store = getTrackingStore();\n if (!store) {\n return reply.status(404).send({ success: false, message: \"No workflow tracking store configured\" });\n }\n\n let steps: RunStep[];\n if (step_type) {\n steps = await store.getRunStepsByType(runId, step_type as any);\n } else {\n steps = await store.getRunSteps(runId);\n }\n\n if (stepStatus) {\n steps = steps.filter(s => s.status === stepStatus);\n }\n\n return {\n success: true,\n message: \"Successfully retrieved run steps\",\n data: { records: steps, total: steps.length },\n };\n } catch (error) {\n request.log.error({ runId, error: (error as Error).stack || (error as Error).message }, \"Failed to get run steps\");\n return reply.status(500).send({\n success: false,\n message: `Failed to retrieve run steps: ${(error as Error).message}`,\n });\n }\n}\n\nexport async function getRunTasks(\n request: FastifyRequest<{ Params: { runId: string } }>,\n reply: FastifyReply\n): Promise<ApiResponse<{ records: RunStep[]; total: number }>> {\n const { runId } = request.params;\n\n try {\n const store = getTrackingStore();\n if (!store) {\n return reply.status(404).send({ success: false, message: \"No workflow tracking store configured\" });\n }\n\n const steps = await store.getInterruptedSteps(runId);\n return {\n success: true,\n message: \"Successfully retrieved user tasks\",\n data: { records: steps, total: steps.length },\n };\n } catch (error) {\n request.log.error(error, \"Failed to get run tasks\");\n return reply.status(500).send({ success: false, message: \"Failed to retrieve user tasks\" });\n }\n}\n\n// 简化的 Inbox 任务回复接口\ninterface ReplyInboxRequest {\n runId: string;\n answers: Array<{\n questionIndex: number;\n selectedOptions: string[];\n }>;\n}\n\nexport async function replyInboxTask(\n request: FastifyRequest<{ Body: ReplyInboxRequest }>,\n reply: FastifyReply\n): Promise<void> {\n const { runId, answers } = request.body;\n const tenantId = getTenantId(request);\n\n try {\n // 1. 获取 WorkflowRun 信息\n const store = getTrackingStore();\n if (!store) {\n return reply.status(404).send({ \n success: false, \n message: \"No workflow tracking store configured\" \n });\n }\n\n const run = await store.getWorkflowRun(runId);\n if (!run) {\n return reply.status(404).send({ \n success: false, \n message: \"Workflow run not found\" \n });\n }\n\n // 2. 获取 Agent 实例(补齐参数,与 createRun 一致)\n const workspace_id = request.headers[\"x-workspace-id\"] as string;\n const project_id = request.headers[\"x-project-id\"] as string;\n const agent = agentInstanceManager.getAgent({\n assistant_id: run.assistantId,\n thread_id: run.threadId,\n tenant_id: tenantId,\n workspace_id,\n project_id,\n });\n\n // 3. 检查 graph 是否处于中断状态\n const runStatus = await agent.getRunStatus();\n if (runStatus !== ThreadStatus.INTERRUPTED) {\n return reply.status(409).send({\n success: false,\n message: `Cannot resume: graph is not interrupted (current status: ${runStatus})`,\n data: { runId: run.id, assistantId: run.assistantId, threadId: run.threadId, status: runStatus },\n });\n }\n\n // 4. 直接在后台触发 resume 执行(不等待,不阻塞 HTTP 响应)\n agent.addMessage({\n input: { message: \"Clarification answers submitted\" },\n command: {\n resume: {\n action: \"submit\",\n data: { answers },\n message: \"Clarification answers submitted\",\n },\n },\n }).then((result) => {\n // addMessage 成功后,触发 chunkStream 消费(驱动执行)\n // 不 await stream,让它在后台运行\n const stream = agent.chunkStream(\n result.messageId, \n [MessageChunkTypes.MESSAGE_COMPLETED]\n );\n // 消费 stream 但不阻塞(后台驱动 agent 执行)\n (async () => {\n for await (const _ of stream) { /* 丢弃 chunks */ }\n })().catch((error) => {\n request.log.error(error, \"Background chunk stream error\");\n });\n }).catch((error) => {\n request.log.error(error, \"Background resume failed\");\n });\n\n // 5. 立即返回成功(不等待 agent 执行完成)\n return reply.status(200).send({\n success: true,\n message: \"Resume request submitted successfully\",\n data: {\n runId: run.id,\n assistantId: run.assistantId,\n threadId: run.threadId,\n status: \"resuming\",\n },\n });\n\n } catch (error) {\n request.log.error(error, \"Failed to reply inbox task\");\n return reply.status(500).send({ \n success: false, \n message: \"Failed to submit resume request\" \n });\n }\n}\n\n/**\n * Abort a running workflow.\n *\n * Stops the main graph execution AND signals all in-progress\n * sub-agent invokes to cancel.\n */\nexport async function abortWorkflowRun(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> {\n try {\n const { runId } = request.params as { runId: string };\n const tenantId = getTenantId(request);\n\n const store = getTrackingStore();\n if (!store) {\n return reply.status(404).send({\n success: false,\n message: \"No workflow tracking store configured\",\n });\n }\n\n const run = await store.getWorkflowRun(runId);\n if (!run) {\n return reply.status(404).send({\n success: false,\n message: \"Workflow run not found\",\n });\n }\n\n // Persist abort intent FIRST — prevents restart after server crash\n await store.updateWorkflowRun(runId, {\n status: \"cancelled\",\n errorMessage: \"Aborted by user\",\n completedAt: new Date(),\n }).catch(() => {});\n\n // Stop the main graph execution\n const workspace_id = request.headers[\"x-workspace-id\"] as string;\n const project_id = request.headers[\"x-project-id\"] as string;\n const agent = agentInstanceManager.getAgent({\n assistant_id: run.assistantId,\n thread_id: run.threadId,\n tenant_id: tenantId,\n workspace_id,\n project_id,\n });\n await agent.abort();\n\n // Signal sub-agents via AbortController registry\n signalAbort(runId);\n\n return reply.status(200).send({\n success: true,\n message: \"Workflow aborted\",\n data: { runId, assistantId: run.assistantId, threadId: run.threadId },\n });\n } catch (error) {\n request.log.error(error, \"Failed to abort workflow run\");\n return reply.status(500).send({\n success: false,\n message: `Abort failed: ${(error as Error).message}`,\n });\n }\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { eventBus, getStoreLattice, PersonalAssistantConfig } from \"@axiom-lattice/core\";\nimport type { Assistant, CreateAssistantRequest } from \"@axiom-lattice/protocols\";\nimport { randomUUID } from \"crypto\";\nfunction getWorkspaceId(request: FastifyRequest): string {\n return (request.headers[\"x-workspace-id\"] as string) || \"default\";\n}\n\nfunction getTenantId(request: FastifyRequest): string {\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) return userTenantId;\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\nfunction getUserId(request: FastifyRequest): string {\n const userId = (request as any).user?.id\n || (request.headers[\"x-user-id\"] as string);\n if (!userId) throw new Error(\"User ID is required\");\n return userId;\n}\n\ninterface CreatePersonalAssistantBody {\n name: string;\n personality: string;\n}\n\ninterface PersonalAssistantStatus {\n id: string;\n name: string;\n projectId: string;\n workspaceId?: string;\n createdAt: Date;\n}\n\ninterface PersonalAssistantResponse {\n success: boolean;\n message: string;\n data?: PersonalAssistantStatus;\n}\n\nfunction getLinkStore() {\n return getStoreLattice(\"default\", \"userTenantLink\").store;\n}\n\nfunction getAssistantStore() {\n return getStoreLattice(\"default\", \"assistant\").store;\n}\n\nfunction getProjectStore() {\n return getStoreLattice(\"default\", \"project\").store;\n}\n\nasync function getLinkMeta(userId: string, tenantId: string) {\n const link = await getLinkStore().getLink(userId, tenantId);\n return (link?.metadata || {}) as Record<string, unknown>;\n}\n\nasync function updateLinkMeta(userId: string, tenantId: string, meta: Record<string, unknown>) {\n await getLinkStore().updateLink(userId, tenantId, { metadata: meta } as any);\n}\n\n/**\n * Create a personal assistant for the authenticated user.\n * Random IDs for both assistant and project, stored in UserTenantLink.metadata.\n */\nexport async function createPersonalAssistant(\n request: FastifyRequest<{ Body: CreatePersonalAssistantBody }>,\n reply: FastifyReply\n): Promise<PersonalAssistantResponse> {\n const tenantId = getTenantId(request);\n const userId = getUserId(request);\n const { name, personality } = request.body;\n\n if (!name || !personality) {\n return reply.status(400).send({ success: false, message: \"name and personality are required\" });\n }\n\n const store = getAssistantStore();\n\n const existing = await store.getByOwner(tenantId, userId);\n if (existing) {\n return reply.status(409).send({ success: false, message: \"You already have a personal assistant\" });\n }\n\n const assistantId = randomUUID();\n\n // Create a personal project under the current workspace\n const projectStore = getProjectStore();\n const projectId = randomUUID();\n const wsId = getWorkspaceId(request);\n await projectStore.createProject(tenantId, wsId, projectId, {\n name: `${name}'s Space`,\n description: \"Personal workspace for your assistant\",\n kind: \"personal\",\n });\n\n const config = PersonalAssistantConfig.get();\n config.key = assistantId;\n PersonalAssistantConfig.render(config, name, personality);\n\n const data: CreateAssistantRequest = { name, graphDefinition: config, ownerUserId: userId };\n const assistant = await store.createAssistant(tenantId, assistantId, data);\n\n // Store in UserTenantLink.metadata\n const meta = await getLinkMeta(userId, tenantId);\n meta.personalAssistantId = assistantId;\n meta.personalProjectId = projectId;\n meta.personalWorkspaceId = wsId;\n await updateLinkMeta(userId, tenantId, meta);\n\n return reply.status(201).send({\n success: true,\n message: \"Personal assistant created\",\n data: { id: assistant.id, name: assistant.name, projectId, workspaceId: wsId, createdAt: assistant.createdAt },\n });\n}\n\n/**\n * Get the authenticated user's personal assistant.\n */\nexport async function getPersonalAssistant(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<PersonalAssistantResponse> {\n const tenantId = getTenantId(request);\n const userId = getUserId(request);\n\n const store = getAssistantStore();\n const assistant = await store.getByOwner(tenantId, userId);\n\n if (!assistant) {\n return reply.status(404).send({ success: false, message: \"No personal assistant found\" });\n }\n\n const meta = await getLinkMeta(userId, tenantId);\n const projectId = (meta.personalProjectId as string) || \"default\";\n const workspaceId = (meta.personalWorkspaceId as string) || \"default\";\n\n return {\n success: true,\n message: \"Personal assistant found\",\n data: { id: assistant.id, name: assistant.name, projectId, workspaceId, createdAt: assistant.createdAt },\n };\n}\n\n/**\n * Delete the authenticated user's personal assistant.\n */\nexport async function deletePersonalAssistant(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string }> {\n const tenantId = getTenantId(request);\n const userId = getUserId(request);\n\n const store = getAssistantStore();\n const assistant = await store.getByOwner(tenantId, userId);\n\n if (!assistant) {\n return reply.status(404).send({ success: false, message: \"No personal assistant found\" });\n }\n\n const deleted = await store.deleteAssistant(tenantId, assistant.id);\n if (!deleted) {\n return reply.status(500).send({ success: false, message: \"Failed to delete personal assistant\" });\n }\n eventBus.publish(\"assistant:deleted\", { id: assistant.id, tenantId });\n\n // Delete all threads\n const threadStore = getStoreLattice(\"default\", \"thread\").store;\n try {\n const threads = await threadStore.getThreadsByAssistantId(tenantId, assistant.id);\n for (const t of threads) {\n await threadStore.deleteThread(tenantId, t.id);\n }\n } catch { /* best effort */ }\n\n // Clean up the project\n const meta = await getLinkMeta(userId, tenantId);\n const projectId = meta.personalProjectId as string;\n const wsId = meta.personalWorkspaceId as string;\n if (projectId && wsId) {\n try { await getProjectStore().deleteProject(tenantId, projectId); } catch { /* best effort */ }\n }\n\n // Clean up UserTenantLink.metadata\n delete meta.personalAssistantId;\n delete meta.personalProjectId;\n delete meta.personalWorkspaceId;\n await updateLinkMeta(userId, tenantId, meta);\n\n return { success: true, message: \"Personal assistant deleted\" };\n}\n","/**\n * Core orchestration service for tenant configuration export and import.\n *\n * @module @axiom-lattice/gateway/services/ExportImportService\n */\n\nimport { ExportableEntityRegistry, DependencyResolver, IdRemapper, isBuiltInSkill } from '@axiom-lattice/core';\nimport type {\n ExportBundle,\n ExportableEntity,\n ExportableFile,\n ExportContext,\n ImportPreviewResult,\n ImportApplyResolution,\n Resolution,\n ImportApplyResult,\n ImportEntityResult,\n} from '@axiom-lattice/core';\nimport { randomUUID } from 'crypto';\nimport * as fs from 'fs/promises';\nimport * as os from 'os';\nimport * as path from 'path';\nimport * as tar from 'tar';\nimport * as zlib from 'zlib';\n\n/** Bundle + file content for one export job. */\nexport interface ExportJobData {\n bundle: ExportBundle;\n /** Archive path → file content (e.g. `files/skills/my-skill/SKILL.md`). */\n files: Map<string, Buffer>;\n}\n\ninterface JobEntry {\n data: ExportJobData;\n tenantId: string;\n createdAt: number;\n}\n\n/** Ephemeral in-memory job store (jobs expire after TTL). */\nconst exportJobs = new Map<string, JobEntry>();\n\n/** TTL: 1 hour */\nconst JOB_TTL_MS = 60 * 60 * 1000;\n\nconst MAX_ARCHIVE_ENTRIES = 10_000;\nconst MAX_ARCHIVE_FILE_BYTES = 100 * 1024 * 1024;\nconst MAX_ARCHIVE_TOTAL_BYTES = 512 * 1024 * 1024;\n\nfunction cleanExpiredJobs(): void {\n const now = Date.now();\n for (const [id, entry] of exportJobs) {\n if (now - entry.createdAt > JOB_TTL_MS) {\n exportJobs.delete(id);\n }\n }\n}\n\n/** Archive entry path for a file belonging to an entity type. */\nfunction archiveFileKey(entityType: string, entityId: string, relPath: string): string {\n return `files/${entityType}/${entityId}/${relPath}`;\n}\n\nexport class ExportImportService {\n private registry = ExportableEntityRegistry.getInstance();\n\n /**\n * Preview an export: check which types would be auto-included, which dependencies are missing.\n */\n async exportPreview(\n tenantId: string,\n selectedTypes: string[],\n entityIds?: Record<string, string[]>,\n context?: ExportContext,\n ): Promise<{ missingDependencies: string[]; cascadeAdditions: string[] }> {\n const allDefs = this.registry.getAll();\n\n const expanded = DependencyResolver.expandCascade(allDefs, selectedTypes);\n const cascadeAdditions = expanded.filter((t) => !selectedTypes.includes(t));\n\n const deps = DependencyResolver.computeDependencies(allDefs, expanded);\n const registeredTypes = new Set(allDefs.map((d) => d.entityType));\n const missingDependencies = deps.missing.filter((t) => registeredTypes.has(t));\n\n await this.resolveExportSelection(tenantId, selectedTypes, entityIds, context);\n\n return { missingDependencies, cascadeAdditions };\n }\n\n /**\n * Generate a full export (bundle + file content) for the given tenant and entity types.\n * Stores the data in-memory and returns a jobId for download.\n */\n async export(\n tenantId: string,\n entityTypes: string[],\n entityIds?: Record<string, string[]>,\n context?: ExportContext,\n ): Promise<{ jobId: string; data: ExportJobData }> {\n const { dependencyOrder, entities: rawEntities } = await this.resolveExportSelection(\n tenantId,\n entityTypes,\n entityIds,\n context,\n );\n const entities: Record<string, ExportableEntity[]> = {};\n const files = new Map<string, Buffer>();\n let exportCounter = 0;\n\n for (const type of dependencyOrder) {\n const def = this.registry.get(type);\n const raw = rawEntities[type];\n\n entities[type] = raw.map((e) => ({\n ...e,\n _exportId: `exp-${type}-${String(++exportCounter).padStart(3, '0')}`,\n data: this.sanitizeEntityData(e.data),\n }));\n\n // Collect file content for this entity type (skills etc.)\n if (def.listFilesForExport && entities[type].length > 0) {\n const entityFiles = await def.listFilesForExport(tenantId, entities[type], context);\n for (const f of entityFiles) {\n files.set(archiveFileKey(type, f.entityId, f.path), f.content);\n }\n }\n }\n\n // Build reverse map: raw entity ID → _exportId\n const rawIdToExportId = new Map<string, string>();\n for (const [, entityList] of Object.entries(entities)) {\n for (const entity of entityList) {\n const rawId = entity.data.id as string;\n if (rawId) {\n rawIdToExportId.set(rawId, entity._exportId);\n }\n }\n }\n\n // Rewrite reference fields to @type/exportId format\n for (const [type, entityList] of Object.entries(entities)) {\n const def = this.registry.get(type);\n const refFields = def.referenceFields || {};\n for (const entity of entityList) {\n for (const [fieldName, refEntityType] of Object.entries(refFields)) {\n const rawValue = entity.data[fieldName];\n if (typeof rawValue === 'string' && rawValue) {\n const exportId = rawIdToExportId.get(rawValue);\n if (exportId) {\n entity.data[fieldName] = `@${refEntityType}/${exportId}`;\n }\n }\n }\n }\n }\n\n const bundle: ExportBundle = {\n version: 1,\n exportedAt: new Date().toISOString(),\n sourceTenantId: tenantId,\n entities,\n dependencyOrder,\n _warning: 'This file contains plaintext secrets (passwords, API keys, tokens). Store it securely and delete after import.',\n };\n\n const jobId = randomUUID();\n exportJobs.set(jobId, { data: { bundle, files }, tenantId, createdAt: Date.now() });\n\n return { jobId, data: { bundle, files } };\n }\n\n /**\n * Retrieve a previously generated export job data by jobId with tenant validation.\n */\n getExportJob(jobId: string, tenantId: string): ExportJobData | undefined {\n cleanExpiredJobs();\n const entry = exportJobs.get(jobId);\n if (!entry || entry.tenantId !== tenantId) return undefined;\n return entry.data;\n }\n\n /**\n * Pack an ExportJobData into a tar.gz buffer.\n * Layout: bundle.json at root, files under files/{entityType}/{entityId}/{path}.\n */\n async packTarGz(data: ExportJobData): Promise<Buffer> {\n const { bundle, files } = data;\n\n // Stage files in a temp dir, then tar.c them\n const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'lattice-export-'));\n try {\n await fs.writeFile(path.join(tmpDir, 'bundle.json'), JSON.stringify(bundle, null, 2), 'utf-8');\n for (const [relPath, content] of files.entries()) {\n const fullPath = path.join(tmpDir, relPath);\n await fs.mkdir(path.dirname(fullPath), { recursive: true });\n await fs.writeFile(fullPath, content);\n }\n\n // tar.c produces a tar.gz stream (gzip: true)\n const stream = tar.c({ gzip: true, portable: true, cwd: tmpDir }, ['./bundle.json', ...Array.from(files.keys())]);\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(Buffer.from(chunk));\n }\n return Buffer.concat(chunks);\n } finally {\n await fs.rm(tmpDir, { recursive: true, force: true });\n }\n }\n\n /**\n * Unpack a tar.gz buffer into an ExportJobData (bundle + files).\n */\n async unpackTarGz(buffer: Buffer): Promise<ExportJobData> {\n const files = new Map<string, Buffer>();\n let bundle: ExportBundle | undefined;\n const gunzip = zlib.createGunzip();\n\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n let entryCount = 0;\n let declaredTotalBytes = 0;\n let decompressedBytes = 0;\n let activeEntry: tar.ReadEntry | undefined;\n const paths = new Set<string>();\n\n const fail = (reason: unknown): void => {\n if (settled) return;\n settled = true;\n const error = reason instanceof Error ? reason : new Error(String(reason));\n reject(error);\n try {\n activeEntry?.destroy(error);\n } catch {\n // The parser may already have destroyed the current entry.\n }\n try {\n parser.abort(error);\n } catch {\n // Abort can race with a parser-originated terminal error.\n }\n gunzip.destroy(error);\n };\n\n const countEntry = (): boolean => {\n entryCount += 1;\n if (entryCount <= MAX_ARCHIVE_ENTRIES) return true;\n fail(new Error(`Invalid export archive: exceeds ${MAX_ARCHIVE_ENTRIES.toLocaleString('en-US')} entries`));\n return false;\n };\n\n const parser = tar.t({\n gzip: false,\n onentry: (entry) => {\n activeEntry = entry;\n if (!countEntry()) return;\n\n entry.on('error', fail);\n entry.on('end', () => {\n if (activeEntry === entry) activeEntry = undefined;\n });\n\n const isDirectory = entry.type === 'Directory';\n if (!isDirectory && entry.type !== 'File' && entry.type !== 'OldFile') {\n fail(new Error(`Invalid export archive: unsupported entry type \"${entry.type}\"`));\n return;\n }\n\n const rawPath = entry.path;\n if (rawPath.startsWith('/') || rawPath.includes('\\\\') || rawPath.includes('\\0')) {\n fail(new Error(`Invalid export archive path: \"${rawPath}\"`));\n return;\n }\n const entryPath = rawPath.startsWith('./') ? rawPath.slice(2) : rawPath;\n const pathToValidate = isDirectory && entryPath.endsWith('/') ? entryPath.slice(0, -1) : entryPath;\n const segments = pathToValidate.split('/');\n if (segments.some((segment) => segment === '' || segment === '.' || segment === '..')\n || (isDirectory\n ? !(pathToValidate === 'files' || pathToValidate.startsWith('files/'))\n : (entryPath !== 'bundle.json' && !(entryPath.startsWith('files/') && segments.length > 1)))) {\n fail(new Error(`Invalid export archive path: \"${rawPath}\"`));\n return;\n }\n if (isDirectory) {\n entry.resume();\n return;\n }\n if (paths.has(entryPath)) {\n fail(new Error(`Invalid export archive: duplicate path \"${entryPath}\"`));\n return;\n }\n paths.add(entryPath);\n\n if (!Number.isSafeInteger(entry.size) || entry.size < 0 || entry.size > MAX_ARCHIVE_FILE_BYTES) {\n fail(new Error('Invalid export archive: regular file size exceeds 100 MB'));\n return;\n }\n declaredTotalBytes += entry.size;\n if (declaredTotalBytes > MAX_ARCHIVE_TOTAL_BYTES) {\n fail(new Error('Invalid export archive: total uncompressed size exceeds 512 MB'));\n return;\n }\n\n // These limits apply to decompressed tar contents; no compressed-ratio heuristic is used.\n const chunks: Buffer[] = [];\n let streamedEntryBytes = 0;\n entry.on('data', (chunk: Buffer) => {\n if (settled) return;\n streamedEntryBytes += chunk.length;\n if (streamedEntryBytes > MAX_ARCHIVE_FILE_BYTES) {\n fail(new Error('Invalid export archive: regular file size exceeds 100 MB'));\n return;\n }\n chunks.push(chunk);\n });\n entry.on('end', () => {\n if (settled) return;\n const content = Buffer.concat(chunks, streamedEntryBytes);\n if (entryPath === 'bundle.json') {\n try {\n bundle = JSON.parse(content.toString('utf-8')) as ExportBundle;\n } catch (error) {\n fail(new Error(\n `Invalid export archive: malformed bundle.json: ${error instanceof Error ? error.message : String(error)}`,\n ));\n }\n } else {\n files.set(entryPath, content);\n }\n });\n },\n });\n\n gunzip.on('data', (chunk: Buffer) => {\n if (settled) return;\n decompressedBytes += chunk.length;\n if (decompressedBytes > MAX_ARCHIVE_TOTAL_BYTES) {\n fail(new Error('Invalid export archive: total uncompressed size exceeds 512 MB'));\n }\n });\n gunzip.on('error', fail);\n parser.on('ignoredEntry', (entry: tar.ReadEntry) => {\n if (!countEntry()) return;\n fail(new Error(`Invalid export archive: unsupported entry type \"${entry.type}\"`));\n });\n parser.on('meta', () => {\n if (!countEntry()) return;\n fail(new Error('Invalid export archive: unsupported metadata entry'));\n });\n parser.on('error', fail);\n parser.on('end', () => {\n if (settled) return;\n settled = true;\n resolve();\n });\n gunzip.pipe(parser);\n gunzip.end(buffer);\n });\n\n if (!bundle) {\n throw new Error('Invalid export archive: missing bundle.json');\n }\n return { bundle, files };\n }\n\n /**\n * Preview import: validate bundle and detect conflicts.\n */\n async previewImport(\n tenantId: string,\n bundle: ExportBundle,\n context?: ExportContext,\n ): Promise<ImportPreviewResult> {\n const dependencyOrder = this.validateBundle(bundle);\n\n const allConflicts: ImportPreviewResult['conflicts'] = [];\n const allInsertions: ImportPreviewResult['insertions'] = [];\n const allErrors: ImportPreviewResult['errors'] = [];\n\n for (const entityType of dependencyOrder) {\n const entities = bundle.entities[entityType];\n if (entities.length === 0) continue;\n\n try {\n const def = this.registry.get(entityType);\n const result = await def.previewImport(tenantId, entities, context);\n\n allConflicts.push(...result.conflicts);\n allInsertions.push(...result.insertions);\n allErrors.push(...result.errors);\n } catch (err) {\n for (const entity of entities) {\n allErrors.push({\n _exportId: entity._exportId,\n entityType,\n error: `Preview failed: ${(err as Error).message}`,\n });\n }\n }\n }\n\n return { conflicts: allConflicts, insertions: allInsertions, errors: allErrors };\n }\n\n /**\n * Apply import: create entities in dependency order with ID remapping.\n * File content (if any) is passed to registrations via the `files` map.\n */\n async applyImport(\n tenantId: string,\n bundle: ExportBundle,\n resolutions: Record<string, Resolution>,\n files?: Map<string, Buffer>,\n context?: ExportContext,\n ): Promise<ImportApplyResult> {\n const dependencyOrder = this.validateBundle(bundle);\n\n const results: ImportEntityResult[] = [];\n const idMap: Record<string, string> = {};\n const unresolvedExportIds = new Set<string>();\n // Track skill old id → new id for agent graphDefinition implicit refs\n const skillIdRemap: Record<string, string> = {};\n const skillSourceToTarget = new Map<string, string>();\n const unresolvedSkillReferences = new Map<string, string>();\n\n const skillEntities = bundle.entities.skill ?? [];\n const skillConflicts = skillEntities.length > 0\n ? await this.registry.get('skill').previewImport(tenantId, skillEntities, context)\n : { conflicts: [] } as Pick<ImportPreviewResult, 'conflicts'>;\n const skillConflictByExportId = new Map(\n skillConflicts.conflicts.map((conflict) => [conflict._exportId, conflict]),\n );\n for (const entity of skillEntities) {\n const resolution = resolutions[entity._exportId];\n const sourceId = entity.data.id as string;\n const targetId = resolution?.action === 'skip'\n ? skillConflictByExportId.get(entity._exportId)?.existingId\n : resolution?.action === 'rename' && resolution.newId\n ? resolution.newId\n : sourceId;\n if (targetId) skillSourceToTarget.set(sourceId, targetId);\n }\n for (const entity of skillEntities) {\n const subSkills = entity.data.subSkills;\n if (!Array.isArray(subSkills)) continue;\n const unresolved = subSkills.find((id): id is string => (\n typeof id === 'string'\n && !skillSourceToTarget.has(id)\n && !isBuiltInSkill(id)\n ));\n if (unresolved) unresolvedSkillReferences.set(entity._exportId, unresolved);\n }\n\n for (const entityType of dependencyOrder) {\n const entities = bundle.entities[entityType];\n if (!entities || entities.length === 0) continue;\n\n const def = this.registry.get(entityType);\n const remapper = new IdRemapper(idMap);\n\n let insertions = new Set<string>();\n let conflicts = new Set<string>();\n let conflictByExportId = new Map<string, ImportPreviewResult['conflicts'][number]>();\n let previewError: string | undefined;\n try {\n const preview = await def.previewImport(tenantId, entities, context);\n insertions = new Set(preview.insertions.map((item) => item._exportId));\n conflicts = new Set(preview.conflicts.map((item) => item._exportId));\n conflictByExportId = new Map(preview.conflicts.map((item) => [item._exportId, item]));\n } catch (err) {\n previewError = (err as Error).message;\n }\n\n for (const entity of entities) {\n let resolution: ImportApplyResolution | undefined = resolutions[entity._exportId];\n\n if (resolution?.action === 'skip') {\n const conflict = conflictByExportId.get(entity._exportId);\n if (conflict && !conflict.existingId) {\n unresolvedExportIds.add(entity._exportId);\n results.push({\n _exportId: entity._exportId,\n entityType,\n status: 'failed',\n error: 'Cannot skip conflict without an existing ID',\n });\n continue;\n }\n if (conflict?.existingId) {\n idMap[entity._exportId] = conflict.existingId;\n }\n results.push({\n _exportId: entity._exportId,\n entityType,\n status: 'skipped',\n newId: conflict?.existingId,\n });\n continue;\n }\n\n const pendingValues: unknown[] = [entity.data];\n let unresolvedReference: string | undefined;\n while (pendingValues.length > 0 && !unresolvedReference) {\n const value = pendingValues.pop();\n if (typeof value === 'string') {\n const match = value.match(/^@\\w+\\/(.+)$/);\n if (match && unresolvedExportIds.has(match[1])) {\n unresolvedReference = match[1];\n }\n } else if (Array.isArray(value)) {\n pendingValues.push(...value);\n } else if (value && typeof value === 'object') {\n pendingValues.push(...Object.values(value));\n }\n }\n if (unresolvedReference) {\n unresolvedExportIds.add(entity._exportId);\n results.push({\n _exportId: entity._exportId,\n entityType,\n status: 'failed',\n error: `Unresolved reference to failed import entity \"${unresolvedReference}\"`,\n });\n continue;\n }\n\n if (!resolution) {\n if (previewError || conflicts.has(entity._exportId) || !insertions.has(entity._exportId)) {\n results.push({\n _exportId: entity._exportId,\n entityType,\n status: 'failed',\n error: previewError\n ? `Unable to verify missing conflict resolution: ${previewError}`\n : 'Missing conflict resolution',\n });\n continue;\n }\n\n resolution = {\n _exportId: entity._exportId,\n action: 'insert',\n };\n }\n\n try {\n const remappedData = remapper.remapReferences(entity.data) as Record<string, unknown>;\n\n if (entityType === 'skill') {\n const unresolvedSkill = unresolvedSkillReferences.get(entity._exportId);\n if (unresolvedSkill) {\n results.push({\n _exportId: entity._exportId,\n entityType,\n status: 'failed',\n error: `Unresolved subSkill reference \"${unresolvedSkill}\"`,\n });\n continue;\n }\n if (Array.isArray(remappedData.subSkills)) {\n remappedData.subSkills = remappedData.subSkills.map((id) => (\n typeof id === 'string' ? (skillSourceToTarget.get(id) ?? id) : id\n ));\n }\n }\n\n // Remap implicit skill references in agent graphDefinition.skillIds\n if (entityType === 'agent' && Object.keys(skillIdRemap).length > 0) {\n const skillRemapper = new IdRemapper({});\n remappedData.graphDefinition = skillRemapper.remapSkillIds(\n (remappedData.graphDefinition as Record<string, unknown>) || {},\n skillIdRemap,\n );\n }\n\n if (resolution.action === 'rename' && resolution.newId) {\n remappedData.id = resolution.newId;\n }\n\n // Extract file content for this entity (e.g. skill files from archive).\n // Archive files are keyed by the ORIGINAL entity id (entity.data.id),\n // so use that — NOT the remapped id (which may be a renamed newId).\n const entityFiles = this.extractEntityFiles(\n entityType,\n entity.data.id as string,\n files,\n );\n\n const entityWithRemappedData = { ...entity, data: remappedData };\n const { newId } = await def.applyImport(\n tenantId,\n entityWithRemappedData,\n resolution,\n entityFiles,\n context,\n );\n\n if (newId) {\n idMap[entity._exportId] = newId;\n // Track skill ID renames for agent graphDefinition remapping.\n // oldSkillId is the ORIGINAL id from the bundle; newId is the created id.\n if (entityType === 'skill' && newId) {\n const oldSkillId = entity.data.id as string;\n if (oldSkillId !== newId) {\n skillIdRemap[oldSkillId] = newId;\n }\n }\n results.push({\n _exportId: entity._exportId,\n entityType,\n status: resolution.action === 'overwrite' ? 'updated' : 'created',\n newId,\n });\n }\n } catch (err) {\n results.push({\n _exportId: entity._exportId,\n entityType,\n status: 'failed',\n error: (err as Error).message,\n });\n }\n }\n }\n\n return { results, idMap };\n }\n\n /**\n * List all registered exportable types (for frontend).\n */\n listExportableTypes() {\n return this.registry.listTypes();\n }\n\n /**\n * Extract file content for a single entity from the archive files map.\n * Keys are `files/{entityType}/{entityId}/{path}`; returns a Map of relative path → Buffer.\n */\n private extractEntityFiles(\n entityType: string,\n entityId: string,\n files?: Map<string, Buffer>,\n ): Map<string, Buffer> | undefined {\n if (!files || files.size === 0) return undefined;\n const prefix = `files/${entityType}/${entityId}/`;\n const result = new Map<string, Buffer>();\n for (const [path, content] of files.entries()) {\n if (path.startsWith(prefix)) {\n result.set(path.slice(prefix.length), content);\n }\n }\n return result.size > 0 ? result : undefined;\n }\n\n private async resolveExportSelection(\n tenantId: string,\n entityTypes: string[],\n entityIds?: Record<string, string[]>,\n context?: ExportContext,\n ): Promise<{ dependencyOrder: string[]; entities: Record<string, ExportableEntity[]> }> {\n const allDefs = this.registry.getAll();\n const registeredTypes = new Set(allDefs.map((def) => def.entityType));\n for (const type of entityTypes) {\n if (!registeredTypes.has(type)) {\n throw new Error(`Exportable entity type is not registered: \"${type}\"`);\n }\n }\n const expanded = DependencyResolver.expandCascade(allDefs, entityTypes);\n const dependencies = DependencyResolver.computeDependencies(allDefs, expanded).missing;\n const finalTypeSet = new Set([...expanded, ...dependencies]);\n const dependencyOrder = DependencyResolver.resolveOrder(\n allDefs.filter((def) => finalTypeSet.has(def.entityType)),\n );\n const availableByType = new Map<string, Map<string, ExportableEntity>>();\n const selectedIds = new Map<string, Set<string>>();\n const processedIds = new Map<string, Set<string>>();\n\n for (const type of dependencyOrder) {\n const raw = await this.registry.get(type).listForExport(tenantId, context);\n availableByType.set(type, new Map(raw.map((entity) => [entity.data.id as string, entity])));\n if (entityIds && Object.prototype.hasOwnProperty.call(entityIds, type)) {\n selectedIds.set(type, new Set(entityIds[type]));\n } else if (expanded.includes(type)) {\n selectedIds.set(type, new Set(raw.map((entity) => entity.data.id as string)));\n } else {\n selectedIds.set(type, new Set());\n }\n processedIds.set(type, new Set());\n }\n\n let referencesAdded = true;\n while (referencesAdded) {\n referencesAdded = false;\n for (const type of dependencyOrder) {\n const def = this.registry.get(type);\n if (!def.getReferencedEntityIds) continue;\n const processed = processedIds.get(type)!;\n const available = availableByType.get(type)!;\n const unprocessed = [...selectedIds.get(type)!]\n .filter((id) => !processed.has(id))\n .map((id) => available.get(id))\n .filter((entity): entity is ExportableEntity => entity !== undefined);\n if (unprocessed.length === 0) continue;\n for (const entity of unprocessed) processed.add(entity.data.id as string);\n\n const references = await def.getReferencedEntityIds(tenantId, unprocessed, context);\n for (const [referencedType, ids] of Object.entries(references)) {\n if (!finalTypeSet.has(referencedType)) {\n throw new Error(\n `Unresolved reference from ${type}: entity type \"${referencedType}\" is not in its registered dependency closure`,\n );\n }\n const targetSelection = selectedIds.get(referencedType)!;\n const targetEntities = availableByType.get(referencedType)!;\n const explicitSelection = entityIds && Object.prototype.hasOwnProperty.call(entityIds, referencedType)\n ? new Set(entityIds[referencedType])\n : undefined;\n for (const id of new Set(ids)) {\n if (referencedType === 'skill' && isBuiltInSkill(id)) continue;\n if (explicitSelection && !explicitSelection.has(id)) {\n throw new Error(\n `Required reference from ${type} to ${referencedType} \"${id}\" is omitted by entityIds.${referencedType}`,\n );\n }\n if (!targetEntities.has(id)) {\n throw new Error(`Unresolved reference from ${type} to ${referencedType} \"${id}\"`);\n }\n if (!targetSelection.has(id)) {\n targetSelection.add(id);\n referencesAdded = true;\n }\n }\n }\n }\n }\n\n const entities: Record<string, ExportableEntity[]> = {};\n for (const type of dependencyOrder) {\n const ids = selectedIds.get(type)!;\n entities[type] = [...availableByType.get(type)!.values()]\n .filter((entity) => ids.has(entity.data.id as string));\n }\n return { dependencyOrder, entities };\n }\n\n private validateBundle(bundle: ExportBundle): string[] {\n if (bundle.version !== 1) {\n throw new Error(`Unsupported bundle version: ${bundle.version}. Expected: 1`);\n }\n if (!bundle.entities || typeof bundle.entities !== 'object' || Array.isArray(bundle.entities)) {\n throw new Error('Invalid bundle: missing entities');\n }\n if (!Array.isArray(bundle.dependencyOrder)) {\n throw new Error('Invalid bundle: missing dependencyOrder');\n }\n\n const orderSet = new Set(bundle.dependencyOrder);\n if (orderSet.size !== bundle.dependencyOrder.length) {\n throw new Error('Invalid bundle: duplicate type in dependencyOrder');\n }\n\n const entityTypes = Object.keys(bundle.entities);\n for (const entityType of entityTypes) {\n if (!Array.isArray(bundle.entities[entityType])) {\n throw new Error(`Invalid bundle: entities.${entityType} must be an array`);\n }\n if (!orderSet.has(entityType)) {\n throw new Error(`Invalid bundle: dependencyOrder omits entities type \"${entityType}\"`);\n }\n }\n for (const entityType of bundle.dependencyOrder) {\n if (!Object.prototype.hasOwnProperty.call(bundle.entities, entityType)) {\n throw new Error(`Invalid bundle: missing entities key for dependencyOrder type \"${entityType}\"`);\n }\n const def = this.registry.getAll().find((candidate) => candidate.entityType === entityType);\n if (!def) {\n throw new Error(`Invalid bundle: unregistered entity type \"${entityType}\"`);\n }\n for (const dependency of def.dependsOn) {\n const dependencyRegistered = this.registry.getAll().some((candidate) => candidate.entityType === dependency);\n if (dependencyRegistered && !orderSet.has(dependency)) {\n throw new Error(\n `Invalid bundle: missing registered dependency \"${dependency}\" required by \"${entityType}\"`,\n );\n }\n }\n }\n\n const exportIds = new Set<string>();\n for (const entityType of entityTypes) {\n const ids = new Set<string>();\n for (const entity of bundle.entities[entityType]) {\n if (!entity || typeof entity !== 'object' || typeof entity._exportId !== 'string') {\n throw new Error(`Invalid bundle: malformed entity in \"${entityType}\"`);\n }\n if (exportIds.has(entity._exportId)) {\n throw new Error(`Invalid bundle: duplicate _exportId \"${entity._exportId}\"`);\n }\n exportIds.add(entity._exportId);\n\n const id = entity.data?.id;\n if (typeof id !== 'string') {\n throw new Error(`Invalid bundle: entity ID in \"${entityType}\" must be a string`);\n }\n if (ids.has(id)) {\n throw new Error(`Invalid bundle: duplicate entity ID in \"${entityType}\": \"${id}\"`);\n }\n ids.add(id);\n }\n }\n\n const typeSet = new Set(entityTypes);\n const canonicalOrder = DependencyResolver.resolveOrder(\n this.registry.getAll().filter((def) => typeSet.has(def.entityType)),\n );\n if (canonicalOrder.length !== bundle.dependencyOrder.length\n || canonicalOrder.some((type, index) => bundle.dependencyOrder[index] !== type)) {\n throw new Error(\n `Invalid bundle: dependencyOrder is not canonical; expected ${canonicalOrder.join(', ')}`,\n );\n }\n return canonicalOrder;\n }\n\n private sanitizeEntityData(data: Record<string, unknown>): Record<string, unknown> {\n const sanitized = { ...data };\n delete sanitized.tenantId;\n delete sanitized.createdAt;\n delete sanitized.updatedAt;\n return sanitized;\n }\n}\n","import type { FastifyRequest, FastifyReply } from 'fastify';\nimport { ExportImportService } from '../services/ExportImportService';\nimport { ExportableEntityRegistry } from '@axiom-lattice/core';\nimport type { ExportBundle, ExportContext, Resolution } from '@axiom-lattice/core';\n\nconst service = new ExportImportService();\n\ntype JsonImportBody = {\n bundle?: unknown;\n resolutions?: unknown;\n};\n\ntype ResolutionMap = Record<string, Resolution>;\n\nclass TenantScopeError extends Error {\n readonly statusCode = 403;\n}\n\nfunction resolveTenantId(request: FastifyRequest, routeTenantId?: string): string {\n const authenticatedTenantId = (request as FastifyRequest & {\n user?: { tenantId?: string };\n }).user?.tenantId;\n const header = request.headers['x-tenant-id'];\n const headerTenantId = Array.isArray(header) ? header[0] : header;\n\n if (authenticatedTenantId) {\n if (headerTenantId && headerTenantId !== authenticatedTenantId) {\n throw new TenantScopeError(\n `Tenant scope mismatch: header tenant \"${headerTenantId}\" does not match authenticated tenant \"${authenticatedTenantId}\"`,\n );\n }\n if (routeTenantId && routeTenantId !== authenticatedTenantId) {\n throw new TenantScopeError(\n `Tenant scope mismatch: route tenant \"${routeTenantId}\" does not match authenticated tenant \"${authenticatedTenantId}\"`,\n );\n }\n return authenticatedTenantId;\n }\n\n return headerTenantId || routeTenantId || 'default';\n}\n\nfunction getContext(request: FastifyRequest): ExportContext {\n return {\n workspaceId: (request.headers['x-workspace-id'] as string) || undefined,\n projectId: (request.headers['x-project-id'] as string) || undefined,\n };\n}\n\nfunction safeArchiveFilename(sourceTenantId: string): string {\n const safeTenantId = sourceTenantId.replace(/[^A-Za-z0-9._-]/g, '_');\n return `tenant-export-${safeTenantId}.tar.gz`;\n}\n\nfunction assertCompleteFile(file: { truncated: boolean }): void {\n if (file.truncated) {\n throw new Error('Uploaded file was truncated because it exceeds the configured file size limit');\n }\n}\n\nfunction parseResolutions(value: unknown): ResolutionMap {\n let parsed: unknown = value;\n if (typeof value === 'string') {\n try {\n parsed = JSON.parse(value) as unknown;\n } catch {\n throw new Error('resolutions must be valid JSON');\n }\n }\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('resolutions must be a JSON object');\n }\n return parsed as ResolutionMap;\n}\n\nfunction requireJsonBundle(request: FastifyRequest, body: JsonImportBody): ExportBundle {\n const contentType = request.headers['content-type']?.split(';', 1)[0]?.trim().toLowerCase();\n if (contentType !== 'application/json' || body.bundle === undefined) {\n throw new Error('Provide a multipart tar.gz file or an application/json body with \"bundle\"');\n }\n return body.bundle as ExportBundle;\n}\n\nasync function readPreviewArchive(request: FastifyRequest): Promise<Buffer> {\n const part = await request.file();\n if (!part || part.fieldname !== 'file') {\n throw new Error('Multipart import requires a tar.gz file field named \"file\"');\n }\n const archive = await part.toBuffer();\n assertCompleteFile(part.file);\n return archive;\n}\n\nasync function readApplyMultipart(\n request: FastifyRequest,\n): Promise<{ archive: Buffer; resolutions: ResolutionMap }> {\n let archive: Buffer | undefined;\n let resolutionsValue: unknown;\n\n for await (const part of request.parts()) {\n if (part.type === 'file') {\n if (part.fieldname !== 'file' || archive !== undefined) {\n part.file.resume();\n throw new Error('Multipart import requires exactly one tar.gz file field named \"file\"');\n }\n archive = await part.toBuffer();\n assertCompleteFile(part.file);\n } else if (part.fieldname === 'resolutions') {\n if (resolutionsValue !== undefined) {\n throw new Error('Multipart import requires exactly one \"resolutions\" field');\n }\n resolutionsValue = part.value;\n }\n }\n\n if (!archive) {\n throw new Error('Multipart import requires a tar.gz file field named \"file\"');\n }\n if (resolutionsValue === undefined) {\n throw new Error('Multipart import requires a \"resolutions\" JSON field');\n }\n return { archive, resolutions: parseResolutions(resolutionsValue) };\n}\n\n/** GET /api/tenants/exportable-types */\nexport async function getExportableTypes(\n _request: FastifyRequest,\n reply: FastifyReply,\n): Promise<void> {\n const types = service.listExportableTypes();\n return reply.send({ success: true, data: types });\n}\n\n/** POST /api/tenants/:tenantId/export */\nexport async function exportConfig(\n request: FastifyRequest<{ Params: { tenantId: string }; Body: { entityTypes: string[]; entityIds?: Record<string, string[]> } }>,\n reply: FastifyReply,\n): Promise<void> {\n const tenantId = resolveTenantId(request, request.params.tenantId);\n const { entityTypes, entityIds } = request.body;\n\n if (!Array.isArray(entityTypes) || entityTypes.length === 0) {\n return reply.status(400).send({ success: false, message: 'entityTypes must be a non-empty array' });\n }\n\n const preview = await service.exportPreview(\n tenantId,\n entityTypes,\n entityIds,\n getContext(request),\n );\n\n if (preview.missingDependencies.length > 0 || preview.cascadeAdditions.length > 0) {\n return reply.send({\n success: true,\n data: {\n needsConfirmation: true,\n missingDependencies: preview.missingDependencies,\n cascadeAdditions: preview.cascadeAdditions,\n },\n });\n }\n\n const { jobId, data } = await service.export(tenantId, entityTypes, entityIds, getContext(request));\n return reply.send({\n success: true,\n data: {\n jobId,\n summary: Object.fromEntries(\n Object.entries(data.bundle.entities).map(([type, entities]) => [type, entities.length]),\n ),\n },\n });\n}\n\n/** POST /api/tenants/:tenantId/export/confirm */\nexport async function exportConfigConfirm(\n request: FastifyRequest<{ Params: { tenantId: string }; Body: { entityTypes: string[]; entityIds?: Record<string, string[]> } }>,\n reply: FastifyReply,\n): Promise<void> {\n const tenantId = resolveTenantId(request, request.params.tenantId);\n const { entityTypes, entityIds } = request.body;\n\n const { jobId, data } = await service.export(tenantId, entityTypes, entityIds, getContext(request));\n return reply.send({\n success: true,\n data: {\n jobId,\n summary: Object.fromEntries(\n Object.entries(data.bundle.entities).map(([type, entities]) => [type, entities.length]),\n ),\n },\n });\n}\n\n/** POST /api/tenants/:tenantId/export/entities */\nexport async function previewEntities(\n request: FastifyRequest<{ Params: { tenantId: string }; Body: { entityTypes: string[] } }>,\n reply: FastifyReply,\n): Promise<void> {\n const tenantId = resolveTenantId(request, request.params.tenantId);\n const { entityTypes } = request.body;\n const context = getContext(request);\n\n try {\n const registry = ExportableEntityRegistry.getInstance();\n const result: Record<string, Array<{ id: string; name: string; description?: string }>> = {};\n\n for (const type of entityTypes) {\n const def = registry.get(type);\n const entities = await def.listForExport(tenantId, context);\n result[type] = entities.map((e) => ({\n id: e.data.id as string,\n name: (e.data.name as string) || (e.data.id as string),\n description: e.data.description as string | undefined,\n }));\n }\n\n return reply.send({ success: true, data: result });\n } catch (err) {\n return reply.status(400).send({ success: false, message: (err as Error).message });\n }\n}\n\n/** GET /api/tenants/:tenantId/export/:jobId/download */\nexport async function downloadExport(\n request: FastifyRequest<{ Params: { tenantId: string; jobId: string } }>,\n reply: FastifyReply,\n): Promise<void> {\n const tenantId = resolveTenantId(request, request.params.tenantId);\n const data = service.getExportJob(request.params.jobId, tenantId);\n\n if (!data) {\n return reply.status(404).send({ success: false, message: 'Export job not found or expired' });\n }\n\n const tarGz = await service.packTarGz(data);\n const filename = safeArchiveFilename(data.bundle.sourceTenantId);\n reply.type('application/gzip');\n reply.header('Content-Disposition', `attachment; filename=\"${filename}\"`);\n return reply.send(tarGz);\n}\n\n/** POST /api/tenants/:tenantId/import/preview */\nexport async function importPreview(\n request: FastifyRequest<{\n Params: { tenantId: string };\n Body: JsonImportBody;\n }>,\n reply: FastifyReply,\n): Promise<void> {\n const tenantId = resolveTenantId(request, request.params.tenantId);\n\n try {\n const data = request.isMultipart()\n ? await service.unpackTarGz(await readPreviewArchive(request))\n : { bundle: requireJsonBundle(request, request.body), files: undefined };\n\n const preview = await service.previewImport(tenantId, data.bundle, getContext(request));\n return reply.send({ success: true, data: preview });\n } catch (err) {\n return reply.status(400).send({\n success: false,\n message: `Invalid export file: ${(err as Error).message}`,\n });\n }\n}\n\n/** POST /api/tenants/:tenantId/import/apply */\nexport async function importApply(\n request: FastifyRequest<{\n Params: { tenantId: string };\n Body: JsonImportBody;\n }>,\n reply: FastifyReply,\n): Promise<void> {\n const tenantId = resolveTenantId(request, request.params.tenantId);\n\n try {\n const multipart = request.isMultipart() ? await readApplyMultipart(request) : undefined;\n const data = multipart\n ? await service.unpackTarGz(multipart.archive)\n : { bundle: requireJsonBundle(request, request.body), files: undefined };\n const resolutions = multipart?.resolutions ?? parseResolutions(request.body.resolutions);\n\n const result = await service.applyImport(tenantId, data.bundle, resolutions, data.files, getContext(request));\n return reply.send({ success: true, data: result });\n } catch (err) {\n return reply.status(400).send({\n success: false,\n message: `Import failed: ${(err as Error).message}`,\n });\n }\n}\n","import type { FastifyInstance } from \"fastify\";\nimport { PluginRegistry } from \"@axiom-lattice/core\";\n\n/**\n * GET /api/middleware-types\n *\n * Returns all registered plugin metas (builtin + custom).\n * hasTest / hasDiscover are auto-detected by serializePluginMeta.\n */\nexport function middlewareTypesRoutes(fastify: FastifyInstance): void {\n fastify.get(\"/api/middleware-types\", async (_request, reply) => {\n const metas = PluginRegistry.listMeta();\n return reply.send(metas);\n });\n}\n","import { FastifySchema } from \"fastify\";\n\nexport const dataQuerySchema: FastifySchema = {\n description: \"Execute data query (semantic or SQL)\",\n tags: [\"Data Query\"],\n summary: \"Query Data\",\n body: {\n type: \"object\",\n properties: {\n serverKey: { \n type: \"string\", \n description: \"Target semantic metrics server key (optional if configured in runConfig)\" \n },\n datasourceId: { \n type: \"string\", \n description: \"Data source ID (optional if configured in runConfig)\" \n },\n // Semantic query parameters\n metrics: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Array of metric names for semantic query\"\n },\n groupBy: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Optional array of dimensions to group by\"\n },\n filters: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n dimension: { type: \"string\" },\n operator: { type: \"string\" },\n values: {\n type: \"array\",\n items: { type: [\"string\", \"number\", \"boolean\"] }\n }\n },\n required: [\"dimension\", \"operator\", \"values\"]\n },\n description: \"Optional array of filters\"\n },\n // SQL query parameters\n customSql: {\n type: \"string\",\n description: \"Custom SQL query string with named parameters\"\n },\n params: {\n type: \"object\",\n additionalProperties: { type: [\"string\", \"number\", \"boolean\"] },\n description: \"Optional parameters for SQL query\"\n },\n // Common parameters\n limit: {\n type: \"number\",\n description: \"Maximum number of results (default: 1000)\"\n },\n format: {\n type: \"string\",\n enum: [\"echarts\", \"raw\"],\n description: \"Response format (default: echarts)\"\n }\n }\n },\n // Response schema temporarily removed - format not yet finalized\n // TODO: Add proper response schema once data format is confirmed\n};\n","import { FastifySchema } from \"fastify\";\n\n// Create Run Schemas\nexport const createRunSchema: FastifySchema = {\n description: \"Create a new agent run\",\n tags: [\"Runs\"],\n summary: \"Create Agent Run\",\n body: {\n type: \"object\",\n properties: {\n thread_id: { type: \"string\", description: \"Thread ID\" },\n assistant_id: { type: \"string\", description: \"Assistant ID\" },\n message: { type: \"string\", description: \"Message data for the run\" },\n command: {\n type: \"object\",\n description: \"Command data for the run\",\n nullable: true,\n },\n streaming: {\n type: \"boolean\",\n description: \"Whether to stream the response\",\n nullable: true,\n },\n background: {\n type: \"boolean\",\n description: \"Whether to run in background\",\n nullable: true,\n },\n },\n required: [\"thread_id\", \"assistant_id\", \"message\"],\n },\n response: {\n 200: {},\n 400: {},\n },\n};\n\n// Memory Schemas\nexport const getAllMemoryItemsSchema: FastifySchema = {\n description: \"Get all memory items for an assistant thread\",\n tags: [\"Memory\"],\n summary: \"Get All Memory Items\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n thread_id: { type: \"string\", description: \"Thread ID\" },\n },\n required: [\"assistantId\", \"thread_id\"],\n },\n response: {\n 200: {},\n 400: {},\n 500: {},\n },\n};\n\nexport const getAgentStateSchema: FastifySchema = {\n description: \"Get agent state for an assistant thread\",\n tags: [\"Memory\"],\n summary: \"Get Agent State\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n thread_id: { type: \"string\", description: \"Thread ID\" },\n },\n required: [\"assistantId\", \"thread_id\"],\n },\n response: {\n 200: {},\n },\n};\n\nexport const getMemoryItemSchema: FastifySchema = {\n description: \"Get a specific memory item by key\",\n tags: [\"Memory\"],\n summary: \"Get Memory Item\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n key: { type: \"string\", description: \"Memory key\" },\n },\n required: [\"assistantId\", \"key\"],\n },\n response: {\n 200: {},\n },\n};\n\nexport const setMemoryItemSchema: FastifySchema = {\n description: \"Set or update a memory item\",\n tags: [\"Memory\"],\n summary: \"Set Memory Item\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n key: { type: \"string\", description: \"Memory key\" },\n },\n required: [\"assistantId\", \"key\"],\n },\n body: {\n type: \"object\",\n description: \"Memory item data\",\n },\n response: {\n 200: {},\n },\n};\n\nexport const deleteMemoryItemSchema: FastifySchema = {\n description: \"Delete a specific memory item\",\n tags: [\"Memory\"],\n summary: \"Delete Memory Item\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n key: { type: \"string\", description: \"Memory key\" },\n },\n required: [\"assistantId\", \"key\"],\n },\n response: {\n 200: {},\n },\n};\n\nexport const clearMemorySchema: FastifySchema = {\n description: \"Clear all memory items for an assistant\",\n tags: [\"Memory\"],\n summary: \"Clear Memory\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n },\n required: [\"assistantId\"],\n },\n response: {\n 200: {},\n },\n};\n\n// Graph Schema\nexport const getAgentGraphSchema: FastifySchema = {\n description: \"Get agent graph visualization\",\n tags: [\"Graph\"],\n summary: \"Get Agent Graph\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n },\n required: [\"assistantId\"],\n },\n response: {\n 200: {},\n },\n};\n\n// Resume Stream Schema\nexport const resumeStreamSchema: FastifySchema = {\n description: \"Resume streaming from a known position\",\n tags: [\"Streaming\"],\n summary: \"Resume Stream\",\n body: {\n type: \"object\",\n properties: {\n thread_id: { type: \"string\", description: \"Thread ID\" },\n message_id: {\n type: \"string\",\n description: \"Message ID (usually run_id)\",\n },\n known_content: {\n type: \"string\",\n description: \"Content already received\",\n },\n poll_interval: {\n type: \"number\",\n description: \"Polling interval in milliseconds\",\n nullable: true,\n default: 100,\n },\n },\n required: [\"thread_id\", \"message_id\"],\n },\n response: {\n 200: {},\n 400: {},\n 500: {},\n },\n};\n\n// Trigger Agent Task Schema\nexport const triggerAgentTaskSchema: FastifySchema = {\n description: \"Trigger an agent task\",\n tags: [\"Agent Tasks\"],\n summary: \"Trigger Agent Task\",\n body: {\n type: \"object\",\n properties: {\n assistant_id: {\n type: \"string\",\n description: \"Assistant ID\",\n },\n thread_id: {\n type: \"string\",\n description: \"Thread ID\",\n },\n input: {\n type: \"object\",\n description: \"Task input data\",\n },\n command: {\n type: \"object\",\n description: \"Command data for the task\",\n nullable: true,\n },\n },\n required: [\"assistant_id\", \"thread_id\"],\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n result: { type: \"object\" },\n },\n },\n 400: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n error: { type: \"string\" },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n error: { type: \"string\" },\n },\n },\n },\n};\n\n// Configuration Schemas\nexport const updateConfigSchema: FastifySchema = {\n description: \"Update gateway configuration\",\n tags: [\"Configuration\"],\n summary: \"Update Configuration\",\n body: {\n type: \"object\",\n properties: {\n config: {\n type: \"object\",\n description: \"Configuration object to update\",\n properties: {\n port: { type: \"number\", description: \"Server port\" },\n queueServiceType: {\n type: \"string\",\n enum: [\"memory\", \"redis\"],\n description: \"Queue service type\",\n },\n redisUrl: { type: \"string\", description: \"Redis URL\" },\n redisPassword: { type: \"string\", description: \"Redis password\" },\n queueName: { type: \"string\", description: \"Queue name\" },\n },\n },\n },\n required: [\"config\"],\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: { type: \"object\" },\n },\n },\n 400: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n error: { type: \"string\" },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n error: { type: \"string\" },\n },\n },\n },\n};\n\nexport const getConfigSchema: FastifySchema = {\n description: \"Get current gateway configuration\",\n tags: [\"Configuration\"],\n summary: \"Get Configuration\",\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n data: { type: \"object\" },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n error: { type: \"string\" },\n },\n },\n },\n};\n\n// Health Check Schema\nexport const getHealthSchema: FastifySchema = {\n description: \"Health check endpoint for monitoring and load balancer checks\",\n tags: [\"Health\"],\n summary: \"Health Check\",\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n data: {\n type: \"object\",\n properties: {\n status: { type: \"string\", enum: [\"healthy\", \"unhealthy\"] },\n timestamp: { type: \"string\" },\n uptime: { type: \"number\" },\n service: { type: \"string\" },\n version: { type: \"string\" },\n },\n },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n status: { type: \"string\" },\n error: { type: \"string\" },\n },\n },\n },\n};\n\n// Skills Schemas\nexport const getSkillListSchema: FastifySchema = {\n description: \"Get list of all skills\",\n tags: [\"Skills\"],\n summary: \"Get Skill List\",\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n },\n};\n\nexport const getSkillSchema: FastifySchema = {\n description: \"Get a single skill by ID\",\n tags: [\"Skills\"],\n summary: \"Get Skill\",\n params: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Skill ID\" },\n },\n required: [\"id\"],\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: { type: \"object\" },\n },\n },\n 404: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n },\n};\n\nexport const createSkillSchema: FastifySchema = {\n description: \"Create a new skill\",\n tags: [\"Skills\"],\n summary: \"Create Skill\",\n body: {\n type: \"object\",\n properties: {\n id: { \n type: \"string\", \n description: \"Skill ID (optional, defaults to name if not provided; must equal name, name is used for path addressing)\" \n },\n name: { \n type: \"string\", \n description: \"Skill name (1-64 chars, lowercase alphanumeric with single hyphens, pattern: ^[a-z0-9]+(-[a-z0-9]+)*$)\",\n pattern: \"^[a-z0-9]+(-[a-z0-9]+)*$\",\n minLength: 1,\n maxLength: 64\n },\n description: { type: \"string\", description: \"Skill description\" },\n license: { type: \"string\", description: \"License information\" },\n compatibility: { type: \"string\", description: \"Compatibility information\" },\n metadata: {\n type: \"object\",\n additionalProperties: { type: \"string\" },\n description: \"Additional metadata\",\n },\n content: { type: \"string\", description: \"Skill detailed content (markdown)\" },\n subSkills: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Array of sub-skill names (hierarchical structure)\",\n },\n },\n required: [\"name\", \"description\"],\n },\n response: {\n 201: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: { type: \"object\" },\n },\n },\n 400: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n 409: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n },\n};\n\nexport const updateSkillSchema: FastifySchema = {\n description: \"Update an existing skill\",\n tags: [\"Skills\"],\n summary: \"Update Skill\",\n params: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Skill ID\" },\n },\n required: [\"id\"],\n },\n body: {\n type: \"object\",\n properties: {\n name: { \n type: \"string\", \n description: \"Skill name (1-64 chars, lowercase alphanumeric with single hyphens, pattern: ^[a-z0-9]+(-[a-z0-9]+)*$)\",\n pattern: \"^[a-z0-9]+(-[a-z0-9]+)*$\",\n minLength: 1,\n maxLength: 64\n },\n description: { type: \"string\", description: \"Skill description\" },\n license: { type: \"string\", description: \"License information\" },\n compatibility: { type: \"string\", description: \"Compatibility information\" },\n metadata: {\n type: \"object\",\n additionalProperties: { type: \"string\" },\n description: \"Additional metadata\",\n },\n content: { type: \"string\", description: \"Skill detailed content (markdown)\" },\n subSkills: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Array of sub-skill names (hierarchical structure)\",\n },\n },\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: { type: \"object\" },\n },\n },\n 400: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n 404: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n },\n};\n\nexport const deleteSkillSchema: FastifySchema = {\n description: \"Delete a skill by ID\",\n tags: [\"Skills\"],\n summary: \"Delete Skill\",\n params: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Skill ID\" },\n },\n required: [\"id\"],\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n 404: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n },\n};\n\nexport const searchSkillsByMetadataSchema: FastifySchema = {\n description: \"Search skills by metadata\",\n tags: [\"Skills\"],\n summary: \"Search Skills by Metadata\",\n querystring: {\n type: \"object\",\n properties: {\n key: { type: \"string\", description: \"Metadata key\" },\n value: { type: \"string\", description: \"Metadata value\" },\n },\n required: [\"key\", \"value\"],\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n 400: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n },\n};\n\nexport const filterSkillsByCompatibilitySchema: FastifySchema = {\n description: \"Filter skills by compatibility\",\n tags: [\"Skills\"],\n summary: \"Filter Skills by Compatibility\",\n querystring: {\n type: \"object\",\n properties: {\n compatibility: { type: \"string\", description: \"Compatibility string\" },\n },\n required: [\"compatibility\"],\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n 400: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n },\n};\n\nexport const filterSkillsByLicenseSchema: FastifySchema = {\n description: \"Filter skills by license\",\n tags: [\"Skills\"],\n summary: \"Filter Skills by License\",\n querystring: {\n type: \"object\",\n properties: {\n license: { type: \"string\", description: \"License string\" },\n },\n required: [\"license\"],\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n 400: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n 500: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n records: {\n type: \"array\",\n items: { type: \"object\" },\n },\n total: { type: \"number\" },\n },\n },\n },\n },\n },\n};\n\nexport const getSandboxUrlSchema: FastifySchema = {\n description: \"Get sandbox URL based on assistant and thread configuration\",\n tags: [\"Sandbox\"],\n summary: \"Get Sandbox URL\",\n params: {\n type: \"object\",\n properties: {\n assistantId: { type: \"string\", description: \"Assistant ID\" },\n threadId: { type: \"string\", description: \"Thread ID\" },\n },\n required: [\"assistantId\", \"threadId\"],\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n data: {\n type: \"object\",\n properties: {\n sandboxUrl: { type: \"string\", description: \"Sandbox URL\" },\n sandboxName: { type: \"string\", description: \"Sandbox name\" },\n vmIsolation: {\n type: \"string\",\n enum: [\"agent\", \"project\", \"global\"],\n description: \"Sandbox isolation level\",\n },\n },\n },\n },\n },\n 404: {\n type: \"object\",\n properties: {\n success: { type: \"boolean\" },\n message: { type: \"string\" },\n },\n },\n },\n};\n\n// Data Query Schema\nexport { dataQuerySchema } from \"./data-query\";\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { agentInstanceManager } from \"@axiom-lattice/core\";\n\n/**\n * DELETE /api/assistants/:assistant_id/threads/:thread_id/pending-messages/:message_id\n * Remove pending message from queue\n */\nexport async function removePendingMessageHandler(\n request: FastifyRequest,\n reply: FastifyReply\n) {\n try {\n const { assistant_id, thread_id, message_id } = request.params as {\n assistant_id: string;\n thread_id: string;\n message_id: string;\n };\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n const workspace_id = request.headers[\"x-workspace-id\"] as string;\n const project_id = request.headers[\"x-project-id\"] as string;\n\n if (!tenant_id) {\n return reply.code(400).send({ error: \"Missing x-tenant-id header\" });\n }\n\n if (!assistant_id) {\n return reply.code(400).send({ error: \"Missing assistant_id parameter\" });\n }\n\n // Get agent instance\n const agent = agentInstanceManager.getAgent({\n assistant_id,\n thread_id,\n tenant_id,\n workspace_id,\n project_id,\n });\n\n if (!agent) {\n return reply.code(404).send({\n error: \"Thread not found\",\n threadId: thread_id,\n });\n }\n\n const success = await agent.removePendingMessage(message_id);\n\n if (!success) {\n return reply.code(404).send({\n error: \"Message not found\",\n messageId: message_id,\n });\n }\n\n return reply.send({\n success: true,\n messageId: message_id,\n });\n } catch (error) {\n console.error(\"Error removing pending message:\", error);\n return reply.code(500).send({\n error: \"Internal server error\",\n message: error instanceof Error ? error.message : String(error),\n });\n }\n}\n","import { agentLatticeManager, getSandBoxManager, normalizeSandboxName, sandboxLatticeManager } from \"@axiom-lattice/core\";\nimport { SandboxMiddlewareConfig } from \"@axiom-lattice/protocols\";\n\n\nconst ERROR_HTML = `<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Sandbox 连接错误</title>\n <style>\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n }\n .container {\n background: white;\n border-radius: 16px;\n padding: 40px;\n max-width: 500px;\n width: 100%;\n box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n }\n .error-icon {\n width: 80px;\n height: 80px;\n background: #fee2e2;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 24px;\n }\n .error-icon svg {\n width: 40px;\n height: 40px;\n color: #dc2626;\n }\n h1 { color: #1f2937; margin-bottom: 16px; text-align: center; }\n p { color: #6b7280; margin-bottom: 12px; line-height: 1.6; }\n .info {\n background: #f3f4f6;\n border-radius: 8px;\n padding: 16px;\n margin: 20px 0;\n }\n .info-item {\n display: flex;\n justify-content: space-between;\n padding: 8px 0;\n border-bottom: 1px solid #e5e7eb;\n }\n .info-item:last-child { border-bottom: none; }\n .label { color: #6b7280; font-size: 14px; }\n .value { color: #1f2937; font-weight: 500; font-family: monospace; }\n .retry-btn {\n width: 100%;\n padding: 14px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n border: none;\n border-radius: 8px;\n font-size: 16px;\n cursor: pointer;\n transition: transform 0.2s;\n }\n .retry-btn:hover { transform: translateY(-2px); }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"error-icon\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"/>\n </svg>\n </div>\n <h1>无法连接到 Sandbox</h1>\n <p>无法连接到沙箱环境,请检查配置后重试。</p>\n <div class=\"info\">\n <div class=\"info-item\">\n <span class=\"label\">Assistant ID</span>\n <span class=\"value\" id=\"assistantId\">-</span>\n </div>\n <div class=\"info-item\">\n <span class=\"label\">Thread ID</span>\n <span class=\"value\" id=\"threadId\">-</span>\n </div>\n <div class=\"info-item\">\n <span class=\"label\">隔离级别</span>\n <span class=\"value\" id=\"vmIsolation\">-</span>\n </div>\n <div class=\"info-item\">\n <span class=\"label\">错误信息</span>\n <span class=\"value\" id=\"errorMsg\">-</span>\n </div>\n </div>\n <button class=\"retry-btn\" onclick=\"window.location.reload()\">重新连接</button>\n </div>\n <script>\n const params = new URLSearchParams(window.location.search);\n document.getElementById('assistantId').textContent = params.get('assistantId') || '-';\n document.getElementById('threadId').textContent = params.get('threadId') || '-';\n document.getElementById('vmIsolation').textContent = params.get('vmIsolation') || '-';\n document.getElementById('errorMsg').textContent = params.get('error') || '未知错误';\n </script>\n</body>\n</html>`;\n\nexport class SandboxService {\n\n getFilesystemVmIsolation(tenantId: string, assistantId: string): \"agent\" | \"project\" | \"global\" | null {\n const agentLattice = agentLatticeManager.getAgentLatticeWithTenant(tenantId, assistantId);\n if (!agentLattice) {\n return null;\n }\n\n const filesystemConfig = agentLattice?.config?.middleware?.find((m: any) => m.type === \"filesystem\");\n if (!filesystemConfig) {\n return null;\n }\n\n const config = filesystemConfig.config as SandboxMiddlewareConfig;\n return config?.vmIsolation || null;\n }\n\n computeSandboxName(\n assistantId: string,\n threadId: string,\n vmIsolation: string,\n tenantId?: string,\n workspaceId?: string,\n projectId?: string,\n ): string {\n switch (vmIsolation) {\n case \"agent\":\n return normalizeSandboxName(`${tenantId ?? \"default\"}-${assistantId}`);\n case \"project\":\n return normalizeSandboxName(\n `${tenantId ?? \"default\"}-${workspaceId ?? \"default\"}-${projectId ?? \"default\"}`\n );\n case \"global\":\n default:\n return \"global\";\n }\n }\n\n private getBrowserSandboxBaseURL(): string {\n return process.env.AGENT_INFRA_SANDBOX_BASE_URL || \"http://localhost:8080\";\n }\n\n getTargetUrl(sandboxName: string): string {\n return `${this.getBrowserSandboxBaseURL()}/sandbox/${sandboxName}`;\n }\n\n async getVncHtml(sandboxName: string): Promise<string> {\n const response = await fetch(`${this.getTargetUrl(sandboxName)}/vnc/index.html`);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch VNC HTML: ${response.statusText}`);\n }\n\n return response.text();\n }\n\n rewriteHtml(\n html: string,\n assistantId: string,\n threadId: string\n ): string {\n const prefix = `/api/assistants/${assistantId}/threads/${threadId}/sandbox/vnc`;\n\n let rewritten = html;\n\n rewritten = rewritten.replace(\n /(src|href)=[\"']([^\"']*)[\"']/g,\n (match, attr, url) => {\n if (url.startsWith(\"http://\") || url.startsWith(\"https://\") || url.startsWith(\"//\")) {\n return match;\n }\n const rewrittenUrl = url.startsWith(\"/\") ? `${prefix}${url}` : `${prefix}/${url}`;\n return `${attr}=\"${rewrittenUrl}\"`;\n }\n );\n\n rewritten = rewritten.replace(\n /path=sandbox\\/[^&\"']+/g,\n (match) => {\n return `path=${prefix}/websockify`;\n }\n );\n\n rewritten = rewritten.replace(\n /new WebSocket\\([^)]*\\?path=sandbox[^)]*\\)/g,\n (match) => {\n return match.replace(/path=sandbox[^)]+/, `path=${prefix}/websockify`);\n }\n );\n\n return rewritten;\n }\n\n generateErrorHtml(\n assistantId: string,\n threadId: string,\n vmIsolation: string,\n errorMessage: string\n ): string {\n const encodedError = encodeURIComponent(errorMessage);\n return ERROR_HTML\n .replace(\"{assistantId}\", assistantId)\n .replace(\"{threadId}\", threadId)\n .replace(\"{vmIsolation}\", vmIsolation)\n .replace(\"{errorMessage}\", errorMessage);\n }\n}\n\nexport const sandboxService = new SandboxService();\n","import { FastifyInstance } from \"fastify\";\nimport { sandboxService } from \"../services/sandbox_service\";\nimport { getSandBoxManager } from \"@axiom-lattice/core\";\nimport { getContentTypeFromFilename, getFilenameFromPath } from \"../utils/mime\";\n\ninterface SandboxParams {\n assistantId: string;\n threadId: string;\n}\n\nexport function registerSandboxProxyRoutes(app: FastifyInstance): void {\n // Register uploadfile route FIRST before wildcard routes to ensure it matches\n app.post<{ Params: SandboxParams }>(\n \"/api/assistants/:assistantId/threads/:threadId/sandbox/uploadfile\",\n async (request, reply) => {\n console.log(\"[Sandbox Upload] Route matched:\", request.url);\n const { assistantId, threadId } = request.params;\n const tenantId = (request.headers[\"x-tenant-id\"] as string) || \"default\";\n\n const vmIsolation = sandboxService.getFilesystemVmIsolation(tenantId, assistantId);\n if (!vmIsolation) {\n return reply.status(500).send({ error: \"Assistant sandbox config not found\" });\n }\n\n const workspaceId = request.headers[\"x-workspace-id\"] as string;\n const projectId = request.headers[\"x-project-id\"] as string;\n\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({\n assistant_id: assistantId,\n thread_id: threadId,\n tenantId,\n workspaceId,\n projectId,\n vmIsolation,\n });\n\n try {\n const data = await request.file();\n if (!data) {\n return reply.status(400).send({ error: \"No file in request\" });\n }\n\n const buffer = await data.toBuffer();\n const pathEntry = data.fields?.path;\n const pathValue =\n pathEntry && typeof pathEntry === \"object\" && \"value\" in pathEntry\n ? String((pathEntry as { value: unknown }).value)\n : typeof pathEntry === \"string\"\n ? pathEntry\n : undefined;\n\n const filePath = `/uploads/${pathValue ? pathValue : \"\"}${data.filename}`;\n try {\n await sandbox.file.uploadFile({ file: filePath, data: buffer });\n } catch (err) {\n reply.status(500).send({ error: String(err) });\n return;\n }\n\n const relativePath = filePath.replace(`~/`, \"\");\n const result = { id: relativePath, name: data.filename, size: buffer.length };\n\n return reply.status(200).send({ message: \"File uploaded successfully\", ...result });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return reply.status(502).send({ error: `Upload proxy error: ${message}` });\n }\n }\n );\n\n // Download file from sandbox: GET with query param path (file path in sandbox, e.g. /home/gem/uploads/foo.txt)\n app.get<{\n Params: SandboxParams;\n Querystring: { path: string };\n }>(\n \"/api/assistants/:assistantId/threads/:threadId/sandbox/downloadfile\",\n async (request, reply) => {\n const { assistantId, threadId } = request.params;\n const { path: filePath } = request.query;\n const tenantId = (request.headers[\"x-tenant-id\"] as string) || \"default\";\n\n if (!filePath || typeof filePath !== \"string\") {\n return reply.status(400).send({ error: \"Query parameter 'path' is required\" });\n }\n\n const vmIsolation = sandboxService.getFilesystemVmIsolation(tenantId, assistantId);\n if (!vmIsolation) {\n return reply.status(500).send({ error: \"Assistant filesystem vmIsolation not found\" });\n }\n\n const workspaceId = request.headers[\"x-workspace-id\"] as string;\n const projectId = request.headers[\"x-project-id\"] as string;\n\n const sandboxManager = getSandBoxManager();\n const sandbox = await sandboxManager.getSandboxFromConfig({\n assistant_id: assistantId,\n thread_id: threadId,\n tenantId,\n workspaceId,\n projectId,\n vmIsolation,\n });\n\n try {\n // Normalize path to /-prefixed absolute path\n const resolvedPath = filePath.startsWith(\"/\") ? filePath : `/${filePath}`;\n const filename = getFilenameFromPath(resolvedPath);\n const inferredContentType = getContentTypeFromFilename(filename);\n\n try {\n const buf = await sandbox.file.downloadFile({ file: resolvedPath });\n const contentDisposition = `inline; filename=\"${filename.replace(/\"/g, '\\\\\"')}\"; filename*=UTF-8''${encodeURIComponent(filename)}`;\n reply = reply.status(200).type(inferredContentType).header(\"Content-Disposition\", contentDisposition).send(buf);\n return reply;\n } catch (err) {\n reply.status(500).send({ error: String(err) });\n return;\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return reply.status(502).send({ error: `Download proxy error: ${message}` });\n }\n }\n );\n\n // app.get<{ Params: SandboxParams }>(\n // \"/api/assistants/:assistantId/threads/:threadId/sandbox/browser\",\n // async (request, reply) => {\n // const { assistantId, threadId } = request.params;\n\n // const sandboxConfig = sandboxService.getSandboxConfig(assistantId);\n // if (!sandboxConfig) {\n // const errorHtml = sandboxService.generateErrorHtml(\n // assistantId,\n // threadId,\n // \"unknown\",\n // `Assistant ${assistantId} not found`\n // );\n // return reply.status(404).type(\"text/html\").send(errorHtml);\n // }\n\n // const { vmIsolation } = sandboxConfig;\n // const sandboxName = sandboxService.computeSandboxName(\n // assistantId,\n // threadId,\n // vmIsolation\n // );\n\n // try {\n // const html = await sandboxService.getVncHtml(sandboxName);\n // const rewrittenHtml = sandboxService.rewriteHtml(html, assistantId, threadId);\n // return reply.type(\"text/html\").send(rewrittenHtml);\n // } catch (error: any) {\n // const errorHtml = sandboxService.generateErrorHtml(\n // assistantId,\n // threadId,\n // vmIsolation,\n // error.message || \"Failed to connect to sandbox\"\n // );\n // return reply.status(502).type(\"text/html\").send(errorHtml);\n // }\n // }\n // );\n\n\n // app.get<{ Params: SandboxParams }>(\n // \"/api/assistants/:assistantId/threads/:threadId/sandbox/websockify\",\n // { websocket: true },\n\n // (connection, request) => {\n\n // const url = (connection?.url) as string;\n // console.log(`[WebSocket] Received connection from URL: ${url}`);\n\n // const urlMatch = url.match(/\\/api\\/assistants\\/([^/]+)\\/threads\\/([^/]+)\\/sandbox\\/websockify/);\n // if (!urlMatch) {\n // console.error(`[WebSocket] Failed to parse params from URL: ${url}`);\n // connection.close(1008, \"Invalid URL format\");\n // return;\n // }\n\n // const assistantId = urlMatch[1];\n // const threadId = urlMatch[2];\n // console.log(`[WebSocket] Parsed params - assistantId: ${assistantId}, threadId: ${threadId}`);\n\n // const sandboxConfig = sandboxService.getSandboxConfig(assistantId);\n // if (!sandboxConfig) {\n // console.error(`[WebSocket] Assistant ${assistantId} not found`);\n // connection.close(1008, \"Assistant not found\");\n // return;\n // }\n\n // const { vmIsolation } = sandboxConfig;\n // const sandboxName = sandboxService.computeSandboxName(\n // assistantId,\n // threadId,\n // vmIsolation\n // );\n\n // const targetUrl = sandboxService.getTargetUrl(sandboxName);\n // const targetWsUrl = targetUrl.replace(/^http/, \"ws\").replace(/^https/, \"wss\") + \"/websockify\";\n\n // console.log(`[WebSocket] Connecting to target: ${targetWsUrl}`);\n\n // const targetSocket = new WebSocket(targetWsUrl);\n // const clientStream = createWebSocketStream(connection, { encoding: \"utf8\" });\n\n // const targetStream = createWebSocketStream(targetSocket, { encoding: \"utf8\" });\n\n // const forward = pipeline(clientStream, targetStream);\n // const backward = pipeline(targetStream, clientStream);\n\n // Promise.all([forward, backward]).catch((err) => {\n // console.error(`[WebSocket] Proxy pipeline failed:`, err.message);\n // targetSocket.terminate();\n // connection.terminate();\n // });\n // }\n // );\n\n // app.get<{ Params: ProxyParams }>(\n // \"/api/assistants/:assistantId/threads/:threadId/sandbox/browser/vnc/*\",\n // async (request, reply) => {\n // const { assistantId, threadId, \"*\": restPath } = request.params;\n\n // const sandboxConfig = sandboxService.getSandboxConfig(assistantId);\n // if (!sandboxConfig) {\n // return reply.status(404).send(\"Assistant not found\");\n // }\n\n // const { vmIsolation } = sandboxConfig;\n // const sandboxName = sandboxService.computeSandboxName(\n // assistantId,\n // threadId,\n // vmIsolation\n // );\n\n // const targetPath = restPath ? `/vnc/${restPath}` : \"/vnc/\";\n // const targetUrl = `${sandboxService.getTargetUrl(sandboxName)}${targetPath}`;\n\n // try {\n // const response = await fetch(targetUrl);\n // const contentType = response.headers.get(\"content-type\") || \"application/octet-stream\";\n\n // const body = await response.arrayBuffer();\n // reply.status(response.status).type(contentType).send(Buffer.from(body));\n // } catch (error: any) {\n // reply.status(502).send(`Proxy error: ${error.message}`);\n // }\n // }\n // );\n\n\n}\n","/**\n * WorkspaceController\n *\n * Controller for workspace and project management\n * Handles CRUD operations, file browsing, and file uploads\n */\n\nimport { FastifyInstance, FastifyRequest, FastifyReply } from \"fastify\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { constants as fsConstants } from \"fs\";\nimport * as os from \"os\";\nimport { getStoreLattice } from \"@axiom-lattice/core\";\nimport { SandboxFilesystem, FilesystemBackend } from \"@axiom-lattice/core\";\nimport { getSandBoxManager } from \"@axiom-lattice/core\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { getContentTypeFromFilename, getFilenameFromPath } from \"../utils/mime\";\nimport {\n saveProjectFile,\n isBinaryContentType,\n filesystemRootDirectory,\n ProjectFileValidationError,\n} from \"../services/workspace-file-service\";\nimport {\n isPathWithinRoot,\n PathOutsideRootError,\n resolvePathWithinRoot,\n} from \"../utils/path-containment\";\nimport type {\n CreateWorkspaceRequest,\n UpdateWorkspaceRequest,\n CreateProjectRequest,\n UpdateProjectRequest,\n Workspace,\n Project,\n ProjectKind,\n} from \"@axiom-lattice/protocols\";\n\ninterface WorkspaceParams {\n workspaceId: string;\n}\n\ninterface ProjectParams {\n workspaceId: string;\n projectId: string;\n}\n\ninterface ListPathQuery {\n path?: string;\n assistantId?: string;\n}\n\ninterface ReadFileQuery {\n path: string;\n offset?: number;\n limit?: number;\n assistantId?: string;\n}\n\nexport class WorkspaceController {\n private workspaceStore;\n private projectStore;\n\n constructor() {\n this.workspaceStore = getStoreLattice(\"default\", \"workspace\").store;\n this.projectStore = getStoreLattice(\"default\", \"project\").store;\n }\n\n private getTenantId(request: FastifyRequest): string {\n // First try to get from authenticated user context\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) {\n return userTenantId;\n }\n\n // Try to get from query parameters (for direct URL access like file downloads)\n const queryTenantId = (request.query as any)?.tenantId;\n if (queryTenantId) {\n return String(queryTenantId);\n }\n\n // Fallback to request headers for backward compatibility\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n }\n\n // ==================== Workspace CRUD ====================\n\n async listWorkspaces(request: FastifyRequest, reply: FastifyReply) {\n const tenantId = this.getTenantId(request);\n const workspaces = await this.workspaceStore.getAllWorkspaces(tenantId);\n return { success: true, data: workspaces };\n }\n\n async createWorkspace(\n request: FastifyRequest<{ Body: CreateWorkspaceRequest }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const data = request.body;\n const id = uuidv4();\n\n const workspace = await this.workspaceStore.createWorkspace(\n tenantId,\n id,\n data\n );\n\n return reply.status(201).send({ success: true, data: workspace });\n }\n\n async getWorkspace(\n request: FastifyRequest<{ Params: WorkspaceParams }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId } = request.params;\n\n const workspace = await this.workspaceStore.getWorkspaceById(\n tenantId,\n workspaceId\n );\n\n if (!workspace) {\n return reply.status(404).send({ success: false, error: \"Workspace not found\" });\n }\n\n return { success: true, data: workspace };\n }\n\n async updateWorkspace(\n request: FastifyRequest<{\n Params: WorkspaceParams;\n Body: UpdateWorkspaceRequest;\n }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId } = request.params;\n const updates = request.body;\n\n const workspace = await this.workspaceStore.updateWorkspace(\n tenantId,\n workspaceId,\n updates\n );\n\n if (!workspace) {\n return reply.status(404).send({ success: false, error: \"Workspace not found\" });\n }\n\n return { success: true, data: workspace };\n }\n\n async deleteWorkspace(\n request: FastifyRequest<{ Params: WorkspaceParams }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId } = request.params;\n\n const deleted = await this.workspaceStore.deleteWorkspace(\n tenantId,\n workspaceId\n );\n\n if (!deleted) {\n return reply.status(404).send({ success: false, error: \"Workspace not found\" });\n }\n\n return { success: true };\n }\n\n // ==================== Project CRUD ====================\n\n async listProjects(\n request: FastifyRequest<{\n Params: WorkspaceParams;\n Querystring: { kind?: string };\n }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId } = request.params;\n const kindFilter = request.query.kind as ProjectKind | undefined;\n\n await this.ensureTrainingProject(tenantId, workspaceId);\n\n const projects = kindFilter\n ? await this.projectStore.getProjectsByWorkspace(tenantId, workspaceId, {\n kind: kindFilter,\n })\n : await this.projectStore.getProjectsByWorkspace(tenantId, workspaceId);\n\n return { success: true, data: projects };\n }\n\n /**\n * Ensure at least one training project exists per tenant/workspace.\n *\n * Multiple training projects are allowed; this only creates the first one\n * when none exist so the frontend always has a default to select.\n */\n private async ensureTrainingProject(\n tenantId: string,\n workspaceId: string\n ): Promise<void> {\n const existing = await this.projectStore.getProjectsByWorkspace(\n tenantId,\n workspaceId,\n { kind: \"training\" }\n );\n if (existing.length > 0) {\n return;\n }\n\n await this.projectStore.createProject(tenantId, workspaceId, uuidv4(), {\n name: \"Training\",\n description: \"Shared workspace for agent training\",\n kind: \"training\",\n });\n }\n\n async createProject(\n request: FastifyRequest<{\n Params: WorkspaceParams;\n Body: CreateProjectRequest;\n }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId } = request.params;\n const data = request.body;\n const id = uuidv4();\n\n const project = await this.projectStore.createProject(\n tenantId,\n workspaceId,\n id,\n data\n );\n\n return reply.status(201).send({ success: true, data: project });\n }\n\n async getProject(\n request: FastifyRequest<{ Params: ProjectParams }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { projectId } = request.params;\n\n const project = await this.projectStore.getProjectById(tenantId, projectId);\n\n if (!project) {\n return reply.status(404).send({ success: false, error: \"Project not found\" });\n }\n\n return { success: true, data: project };\n }\n\n async updateProject(\n request: FastifyRequest<{\n Params: ProjectParams;\n Body: UpdateProjectRequest;\n }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { projectId } = request.params;\n const updates = request.body;\n\n const project = await this.projectStore.updateProject(\n tenantId,\n projectId,\n updates\n );\n\n if (!project) {\n return reply.status(404).send({ success: false, error: \"Project not found\" });\n }\n\n return { success: true, data: project };\n }\n\n async deleteProject(\n request: FastifyRequest<{ Params: ProjectParams }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId, projectId } = request.params;\n\n const project = await this.projectStore.getProjectById(tenantId, projectId);\n\n if (!project) {\n return reply.status(404).send({ success: false, error: \"Project not found\" });\n }\n\n // Always keep at least one training project per workspace: the frontend\n // auto-selects it as the default training context.\n if (project.kind === \"training\") {\n const training = await this.projectStore.getProjectsByWorkspace(\n tenantId,\n workspaceId,\n { kind: \"training\" }\n );\n if (training.length <= 1) {\n return reply.status(409).send({\n success: false,\n error: \"The last training project cannot be deleted\",\n });\n }\n }\n\n const deleted = await this.projectStore.deleteProject(tenantId, projectId);\n\n if (!deleted) {\n return reply.status(404).send({ success: false, error: \"Project not found\" });\n }\n\n return { success: true };\n }\n\n // ==================== File Operations ====================\n\n private async getBackend(tenantId: string, workspaceId: string, projectId: string, assistantId?: string, filePath?: string) {\n const workspace = await this.workspaceStore.getWorkspaceById(\n tenantId,\n workspaceId\n );\n\n if (!workspace) {\n throw new Error(\"Workspace not found\");\n }\n\n console.log(`[getBackend] storageType=${workspace.storageType} filePath=${filePath}`);\n\n if (workspace.storageType === \"sandbox\") {\n const sandboxManager = getSandBoxManager();\n\n const volumeConfig = {\n assistant_id: assistantId || \"\",\n thread_id: \"\",\n tenantId,\n workspaceId,\n projectId,\n };\n\n console.log(`[getBackend] trying volume backend for path=${filePath} assistant_id=${assistantId}`);\n const volumeBackend = await sandboxManager.getVolumeBackendForPath(volumeConfig, filePath || \"/project\");\n if (volumeBackend) {\n console.log(`[getBackend] using VolumeFilesystem`);\n return { backend: volumeBackend, workspace };\n }\n\n console.log(`[getBackend] volume not found, falling back to SandboxFilesystem`);\n const sandbox = await sandboxManager.getSandboxFromConfig(volumeConfig);\n console.log(`[getBackend] sandbox acquired, name=${(sandbox as any).name || \"unknown\"}`);\n return {\n backend: new SandboxFilesystem({\n sandboxInstance: sandbox,\n }), workspace\n };\n }\n\n // Filesystem storage: use default /lattice_store path\n const rootDir = filesystemRootDirectory(\n tenantId,\n workspaceId,\n projectId,\n );\n\n console.log(`[getBackend] using FilesystemBackend rootDir=${rootDir}`);\n return {\n backend: new FilesystemBackend({\n rootDir,\n virtualMode: true,\n }), workspace\n };\n }\n\n\n async downloadFile(\n request: FastifyRequest<{\n Params: ProjectParams;\n Querystring: { path: string; assistantId?: string };\n }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId, projectId } = request.params;\n const filePath = request.query.path;\n const assistantId = request.query.assistantId;\n\n if (!filePath) {\n return reply.status(400).send({ success: false, error: \"Path is required\" });\n }\n\n try {\n const { workspace } = await this.getBackend(tenantId, workspaceId, projectId, assistantId);\n const resolvedPath = filePath;\n\n if (workspace.storageType === \"sandbox\") {\n const sandboxManager = getSandBoxManager();\n const volumeConfig = {\n assistant_id: assistantId || \"\",\n thread_id: \"\",\n tenantId,\n workspaceId,\n projectId,\n };\n\n const filename = getFilenameFromPath(resolvedPath);\n // Use volume backend when available; fall back to sandbox\n const volumeBackend = await sandboxManager.getVolumeBackendForPath(volumeConfig, resolvedPath);\n\n let buf: Buffer;\n if (volumeBackend) {\n if (volumeBackend.readBinary) {\n buf = await volumeBackend.readBinary(resolvedPath);\n } else {\n const fileData = await volumeBackend.readRaw(resolvedPath);\n buf = Buffer.from(fileData.content.join(\"\\n\"), \"utf-8\");\n }\n } else {\n const sandbox = await sandboxManager.getSandboxFromConfig(volumeConfig);\n buf = await sandbox.file.downloadFile({ file: resolvedPath });\n }\n\n const inferredContentType = getContentTypeFromFilename(filename);\n\n const contentDisposition = `attachment; filename*=UTF-8''${encodeURIComponent(filename)}`;\n return reply.status(200).type(inferredContentType).header(\"Content-Disposition\", contentDisposition).send(buf);\n }\n\n const { backend } = await this.getBackend(tenantId, workspaceId, projectId, assistantId, resolvedPath);\n if (!backend.readBinary) {\n throw new Error(\"Filesystem backend does not support binary reads\");\n }\n const buffer = await backend.readBinary(resolvedPath);\n const filename = getFilenameFromPath(resolvedPath);\n const mimeType = getContentTypeFromFilename(filename);\n\n return reply\n .status(200)\n .type(mimeType)\n .header(\"Content-Disposition\", `attachment; filename*=UTF-8''${encodeURIComponent(filename)}`)\n .send(buffer);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return reply.status(502).send({ success: false, error: `Download proxy error: ${message}` });\n }\n }\n\n /**\n * View a file inline in the browser (not download).\n * Returns file content with inline Content-Disposition for preview.\n */\n async viewFile(\n request: FastifyRequest<{\n Params: ProjectParams;\n Querystring: { path: string; assistantId?: string };\n }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId, projectId } = request.params;\n const filePath = request.query.path;\n const assistantId = request.query.assistantId;\n\n if (!filePath) {\n return reply.status(400).send({ success: false, error: \"Path is required\" });\n }\n\n try {\n const { workspace } = await this.getBackend(tenantId, workspaceId, projectId, assistantId);\n const resolvedPath = filePath;\n\n if (workspace.storageType === \"sandbox\") {\n const sandboxManager = getSandBoxManager();\n const volumeConfig = {\n assistant_id: assistantId || \"\",\n thread_id: \"\",\n tenantId,\n workspaceId,\n projectId,\n };\n\n const filename = getFilenameFromPath(resolvedPath);\n const isBinary = isBinaryContentType(filename);\n\n // Use volume backend when available; fall back to sandbox\n const volumeBackend = await sandboxManager.getVolumeBackendForPath(volumeConfig, resolvedPath);\n\n let buf: Buffer;\n if (volumeBackend) {\n if (isBinary && volumeBackend.readBinary) {\n buf = await volumeBackend.readBinary(resolvedPath);\n } else {\n const fileData = await volumeBackend.readRaw(resolvedPath);\n buf = Buffer.from(fileData.content.join(\"\\n\"), \"utf-8\");\n }\n } else {\n const sandbox = await sandboxManager.getSandboxFromConfig(volumeConfig);\n buf = await sandbox.file.downloadFile({ file: resolvedPath });\n }\n\n const inferredContentType = getContentTypeFromFilename(filename);\n\n try {\n const contentType = inferredContentType;\n\n // Inject AI2APP context script for HTML files (sandbox storage)\n const isHtml = contentType?.toLowerCase().includes(\"text/html\") || \n filename.toLowerCase().endsWith(\".html\") || \n filename.toLowerCase().endsWith(\".htm\");\n let outputBuf = buf;\n if (isHtml) {\n console.log(`[viewFile] Injecting AI2APP context for sandbox HTML file: ${filename}, tenantId: ${tenantId}, contentType: ${contentType}`);\n let content = buf.toString(\"utf-8\");\n const contextScript = `<script>window.__AI2APP_CONTEXT__=${JSON.stringify({\n tenantId,\n workspaceId,\n projectId,\n timestamp: Date.now()\n })};</script>`;\n \n if (content.toLowerCase().includes(\"</head>\")) {\n content = content.replace(/<\\/head>/i, `${contextScript}</head>`);\n console.log(`[viewFile] Context script injected before </head>`);\n } else if (content.toLowerCase().includes(\"<html>\")) {\n content = content.replace(/<html>/i, `<html>${contextScript}`);\n console.log(`[viewFile] Context script injected after <html>`);\n } else {\n content = contextScript + content;\n console.log(`[viewFile] Context script prepended to content`);\n }\n outputBuf = Buffer.from(content, \"utf-8\");\n }\n\n return reply\n .status(200)\n .type(contentType)\n .header(\"Content-Disposition\", \"inline\")\n .send(outputBuf);\n } catch (err) {\n return reply.status(502).send({ success: false, error: String(err) });\n }\n }\n\n const { backend } = await this.getBackend(tenantId, workspaceId, projectId, assistantId, resolvedPath);\n const content = await backend.read(resolvedPath, 0, Infinity);\n const filename = getFilenameFromPath(resolvedPath);\n const mimeType = getContentTypeFromFilename(filename);\n\n // Inject AI2APP context script for HTML files\n let finalContent = content;\n const isHtmlFs = mimeType?.toLowerCase().includes(\"text/html\") || \n filename.toLowerCase().endsWith(\".html\") || \n filename.toLowerCase().endsWith(\".htm\");\n if (isHtmlFs) {\n console.log(`[viewFile] Injecting AI2APP context for filesystem HTML file: ${filename}, tenantId: ${tenantId}, mimeType: ${mimeType}`);\n const contextScript = `<script>window.__AI2APP_CONTEXT__=${JSON.stringify({\n tenantId,\n workspaceId,\n projectId,\n timestamp: Date.now()\n })};</script>`;\n // Insert before </head> or </html>\n if (content.toLowerCase().includes(\"</head>\")) {\n finalContent = content.replace(/<\\/head>/i, `${contextScript}</head>`);\n console.log(`[viewFile] Context script injected before </head>`);\n } else if (content.toLowerCase().includes(\"</html>\")) {\n finalContent = content.replace(/<\\/html>/i, `${contextScript}</html>`);\n console.log(`[viewFile] Context script injected before </html>`);\n } else {\n finalContent = content + contextScript;\n console.log(`[viewFile] Context script appended to content`);\n }\n }\n\n const buffer = Buffer.from(finalContent, \"utf-8\");\n\n return reply\n .status(200)\n .type(mimeType)\n .header(\"Content-Disposition\", \"inline\")\n .send(buffer);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return reply.status(502).send({ success: false, error: `View proxy error: ${message}` });\n }\n }\n\n async listPath(\n request: FastifyRequest<{\n Params: ProjectParams;\n Querystring: ListPathQuery;\n }>\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId, projectId } = request.params;\n const path = (request.query.path as string) || \"/\";\n const assistantId = request.query.assistantId;\n\n console.log(`[listPath] tenantId=${tenantId} workspaceId=${workspaceId} projectId=${projectId} path=${path} assistantId=${assistantId}`);\n\n const { backend } = await this.getBackend(tenantId, workspaceId, projectId, assistantId, path);\n console.log(`[listPath] backend type=${backend.constructor.name} calling lsInfo(${path})`);\n\n const files = await backend.lsInfo(path);\n console.log(`[listPath] result count=${files.length}`);\n\n return { success: true, data: files };\n }\n\n async readFile(\n request: FastifyRequest<{\n Params: ProjectParams;\n Querystring: ReadFileQuery;\n }>\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId, projectId } = request.params;\n const { path, offset = 0, limit = 1000, assistantId } = request.query;\n\n const { backend } = await this.getBackend(tenantId, workspaceId, projectId, assistantId, path);\n const content = await backend.read(path, Number(offset), Number(limit));\n\n return { success: true, data: { content, offset, limit } };\n }\n\n /**\n * Upload a file to the workspace project storage.\n *\n * Route: POST /api/workspaces/:workspaceId/projects/:projectId/uploadfile\n * Accepts multipart/form-data with:\n * - `file`: the file to upload (required)\n * - `path`: optional directory path relative to project root (e.g., \"docs\", \"src/utils\")\n * - `assistantId`: optional query parameter for sandbox identity matching\n * For sandbox storage, delegates to the sandbox upload API.\n * For filesystem storage, writes under the same project root used by the file backend.\n */\n async uploadFile(\n request: FastifyRequest<{\n Params: ProjectParams;\n Querystring: { assistantId?: string };\n }>,\n reply: FastifyReply\n ) {\n const tenantId = this.getTenantId(request);\n const { workspaceId, projectId } = request.params;\n const assistantId = (request.query as any).assistantId || (request.headers[\"x-assistant-id\"] as string);\n\n const workspace = await this.workspaceStore.getWorkspaceById(\n tenantId,\n workspaceId\n );\n\n if (!workspace) {\n return reply\n .status(404)\n .send({ success: false, error: \"Workspace not found\" });\n }\n\n try {\n const data = await (request as any).file();\n if (!data) {\n return reply\n .status(400)\n .send({ success: false, error: \"No file in request\" });\n }\n\n const buffer: Buffer = await data.toBuffer();\n const filename: string = data.filename || \"file\";\n\n const pathEntry = data.fields?.path;\n const pathValue =\n pathEntry && typeof pathEntry === \"object\" && \"value\" in pathEntry\n ? String((pathEntry as { value: unknown }).value)\n : typeof pathEntry === \"string\"\n ? pathEntry\n : undefined;\n\n if (pathValue && !/^[a-zA-Z0-9_./~-]+$/.test(pathValue)) {\n return reply\n .status(400)\n .send({ success: false, error: \"Invalid path parameter\" });\n }\n\n const saved = await saveProjectFile({\n tenantId,\n workspaceId,\n projectId,\n name: filename,\n bytes: buffer,\n ...(pathValue ? { path: pathValue } : {}),\n assistantId,\n });\n\n return reply.status(200).send({\n success: true,\n data: {\n path: saved.uri,\n name: saved.name,\n is_dir: false,\n size: saved.size,\n modified_at: new Date().toISOString(),\n },\n });\n } catch (error: unknown) {\n if (error instanceof ProjectFileValidationError) {\n return reply.status(400).send({ success: false, error: error.message });\n }\n const message = error instanceof Error ? error.message : String(error);\n return reply.status(500).send({\n success: false,\n error: `Upload handler error: ${message}`,\n });\n }\n }\n /**\n * Browse local filesystem directories for the folder picker.\n *\n * Security constraints:\n * - Restricted to os.homedir()\n * - Blacklists system directories\n * - Returns only directory names, no file contents or hidden files\n */\n async browseFilesystem(\n request: FastifyRequest<{\n Querystring: { path?: string };\n }>,\n reply: FastifyReply\n ) {\n const homeDir = os.homedir();\n const requestedPath = request.query.path || homeDir;\n\n const SYSTEM_BLACKLIST = [\"/etc\", \"/sys\", \"/proc\", \"/var\", \"/tmp\", \"/dev\"];\n\n try {\n const resolved = await resolvePathWithinRoot(homeDir, requestedPath);\n const normalized = resolved.targetPath;\n\n for (const blacklisted of SYSTEM_BLACKLIST) {\n if (isPathWithinRoot(blacklisted, normalized)) {\n return reply.status(403).send({\n success: false,\n error: `Cannot browse system directory: ${blacklisted}`,\n });\n }\n }\n\n const entries = await fs.readdir(normalized, { withFileTypes: true });\n const dirEntries = entries\n .filter((entry) => !entry.name.startsWith(\".\") && entry.isDirectory())\n .map((entry) => ({\n name: entry.name,\n path: path.join(normalized, entry.name),\n isDirectory: true,\n }));\n\n const parentPath = path.dirname(normalized);\n const hasParent =\n parentPath !== normalized &&\n isPathWithinRoot(resolved.rootPath, parentPath);\n\n return {\n success: true,\n data: {\n path: normalized,\n parentPath: hasParent ? parentPath : undefined,\n entries: dirEntries,\n },\n };\n } catch (error: unknown) {\n if (error instanceof PathOutsideRootError) {\n return reply.status(403).send({\n success: false,\n error: \"Browse restricted to home directory\",\n });\n }\n const message = error instanceof Error ? error.message : String(error);\n return reply.status(400).send({\n success: false,\n error: `Cannot read directory: ${message}`,\n });\n }\n }\n}\n\nexport function registerWorkspaceRoutes(app: FastifyInstance) {\n const controller = new WorkspaceController();\n\n // Workspace routes\n app.get(\"/api/workspaces\", controller.listWorkspaces.bind(controller));\n app.post(\"/api/workspaces\", controller.createWorkspace.bind(controller));\n app.get(\n \"/api/workspaces/:workspaceId\",\n controller.getWorkspace.bind(controller)\n );\n app.patch(\n \"/api/workspaces/:workspaceId\",\n controller.updateWorkspace.bind(controller)\n );\n app.delete(\n \"/api/workspaces/:workspaceId\",\n controller.deleteWorkspace.bind(controller)\n );\n\n // Project routes\n app.get(\n \"/api/workspaces/:workspaceId/projects\",\n controller.listProjects.bind(controller)\n );\n app.post(\n \"/api/workspaces/:workspaceId/projects\",\n controller.createProject.bind(controller)\n );\n app.get(\n \"/api/workspaces/:workspaceId/projects/:projectId\",\n controller.getProject.bind(controller)\n );\n app.patch(\n \"/api/workspaces/:workspaceId/projects/:projectId\",\n controller.updateProject.bind(controller)\n );\n app.delete(\n \"/api/workspaces/:workspaceId/projects/:projectId\",\n controller.deleteProject.bind(controller)\n );\n\n // File operations\n app.get(\n \"/api/workspaces/:workspaceId/projects/:projectId/listpath\",\n controller.listPath.bind(controller)\n );\n app.get(\n \"/api/workspaces/:workspaceId/projects/:projectId/readfile\",\n controller.readFile.bind(controller)\n );\n app.post(\n \"/api/workspaces/:workspaceId/projects/:projectId/uploadfile\",\n controller.uploadFile.bind(controller)\n );\n app.get(\n \"/api/workspaces/:workspaceId/projects/:projectId/downloadfile\",\n controller.downloadFile.bind(controller)\n );\n app.get(\n \"/api/workspaces/:workspaceId/projects/:projectId/viewfile\",\n controller.viewFile.bind(controller)\n );\n\n // Filesystem browsing for folder picker\n app.get(\n \"/api/filesystem/browse\",\n controller.browseFilesystem.bind(controller)\n );\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport {\n getStoreLattice,\n sqlDatabaseManager,\n} from \"@axiom-lattice/core\";\nimport type {\n DatabaseConfigStore,\n DatabaseConfigEntry,\n CreateDatabaseConfigRequest,\n UpdateDatabaseConfigRequest,\n DatabaseConfig,\n} from \"@axiom-lattice/protocols\";\nimport { randomUUID } from \"crypto\";\n\n/**\n * Database Config Controller\n * Handles database configuration CRUD operations\n */\n\n/**\n * Get tenant ID from authenticated user context\n * Falls back to request headers for backward compatibility\n */\nfunction getTenantId(request: FastifyRequest): string {\n // First try to get from authenticated user context\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) {\n return userTenantId;\n }\n\n // Fallback to request headers for backward compatibility\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\n/**\n * Database config list response\n */\ninterface DatabaseConfigListResponse {\n success: boolean;\n message: string;\n data: {\n records: DatabaseConfigEntry[];\n total: number;\n };\n}\n\n/**\n * Database config response\n */\ninterface DatabaseConfigResponse {\n success: boolean;\n message: string;\n data?: DatabaseConfigEntry;\n}\n\n/**\n * Test connection response\n */\ninterface TestConnectionResponse {\n success: boolean;\n message: string;\n data?: {\n connected: boolean;\n latency?: number;\n error?: string;\n };\n}\n\n/**\n * Get all database configs for a tenant\n */\nexport async function getDatabaseConfigList(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<DatabaseConfigListResponse> {\n const tenantId = getTenantId(request);\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"database\");\n const store: DatabaseConfigStore = storeLattice.store;\n\n const configs = await store.getAllConfigs(tenantId);\n \n console.log('Backend: getAllConfigs returned:', configs);\n if (configs.length > 0) {\n console.log('Backend: First config key:', configs[0].key);\n }\n\n return {\n success: true,\n message: \"Database configurations retrieved successfully\",\n data: {\n records: configs,\n total: configs.length,\n },\n };\n } catch (error) {\n console.error(\"Failed to get database configs:\", error);\n return {\n success: false,\n message: \"Failed to retrieve database configurations\",\n data: {\n records: [],\n total: 0,\n },\n };\n }\n}\n\n/**\n * Get database config by key\n */\nexport async function getDatabaseConfig(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<DatabaseConfigResponse> {\n const tenantId = getTenantId(request);\n const { key } = request.params as { key: string };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"database\");\n const store: DatabaseConfigStore = storeLattice.store;\n\n const config = await store.getConfigByKey(tenantId, key);\n\n if (!config) {\n return {\n success: false,\n message: \"Database configuration not found\",\n };\n }\n\n return {\n success: true,\n message: \"Database configuration retrieved successfully\",\n data: config,\n };\n } catch (error) {\n console.error(\"Failed to get database config:\", error);\n return {\n success: false,\n message: \"Failed to retrieve database configuration\",\n };\n }\n}\n\n/**\n * Create new database config\n */\nexport async function createDatabaseConfig(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<DatabaseConfigResponse> {\n const tenantId = getTenantId(request);\n const body = request.body as CreateDatabaseConfigRequest & { id?: string };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"database\");\n const store: DatabaseConfigStore = storeLattice.store;\n\n // Check if key already exists\n const existing = await store.getConfigByKey(tenantId, body.key);\n if (existing) {\n reply.code(409);\n return {\n success: false,\n message: \"Database configuration with this key already exists\",\n };\n }\n\n const id = body.id || randomUUID();\n const config = await store.createConfig(tenantId, id, body);\n\n // Auto-register to SqlDatabaseManager\n try {\n sqlDatabaseManager.registerDatabase(tenantId, config.key, config.config);\n } catch (error) {\n console.warn(\"Failed to auto-register database:\", error);\n }\n\n reply.code(201);\n return {\n success: true,\n message: \"Database configuration created successfully\",\n data: config,\n };\n } catch (error) {\n console.error(\"Failed to create database config:\", error);\n return {\n success: false,\n message: \"Failed to create database configuration\",\n };\n }\n}\n\n/**\n * Update database config\n */\nexport async function updateDatabaseConfig(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<DatabaseConfigResponse> {\n const tenantId = getTenantId(request);\n const { key } = request.params as { key: string };\n const updates = request.body as Partial<UpdateDatabaseConfigRequest>;\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"database\");\n const store: DatabaseConfigStore = storeLattice.store;\n\n const existing = await store.getConfigByKey(tenantId, key);\n if (!existing) {\n reply.code(404);\n return {\n success: false,\n message: \"Database configuration not found\",\n };\n }\n\n const updated = await store.updateConfig(tenantId, existing.id, updates);\n\n if (!updated) {\n return {\n success: false,\n message: \"Failed to update database configuration\",\n };\n }\n\n // Re-register to SqlDatabaseManager if config changed\n if (updates.config) {\n try {\n sqlDatabaseManager.registerDatabase(tenantId, updated.key, updated.config);\n } catch (error) {\n console.warn(\"Failed to re-register database:\", error);\n }\n }\n\n return {\n success: true,\n message: \"Database configuration updated successfully\",\n data: updated,\n };\n } catch (error) {\n console.error(\"Failed to update database config:\", error);\n return {\n success: false,\n message: \"Failed to update database configuration\",\n };\n }\n}\n\n/**\n * Delete database config by key or id\n */\nexport async function deleteDatabaseConfig(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<DatabaseConfigResponse> {\n const tenantId = getTenantId(request);\n const { keyOrId } = request.params as { keyOrId: string };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"database\");\n const store: DatabaseConfigStore = storeLattice.store;\n\n console.log('Delete request - keyOrId:', keyOrId);\n\n // Try to find by key first, then by id\n let config = await store.getConfigByKey(tenantId, keyOrId);\n let configKey = keyOrId;\n\n if (!config) {\n // Try to find by id\n config = await store.getConfigById(tenantId, keyOrId);\n if (config) {\n configKey = config.key;\n }\n }\n\n if (!config) {\n reply.code(404);\n return {\n success: false,\n message: \"Database configuration not found\",\n };\n }\n\n console.log('Found config to delete:', { id: config.id, key: config.key });\n\n const deleted = await store.deleteConfig(tenantId, config.id);\n\n if (!deleted) {\n return {\n success: false,\n message: \"Failed to delete database configuration\",\n };\n }\n\n // Remove from SqlDatabaseManager\n try {\n if (sqlDatabaseManager.hasDatabase(tenantId, configKey)) {\n await sqlDatabaseManager.removeDatabase(tenantId, configKey);\n }\n } catch (error) {\n console.warn(\"Failed to remove from SqlDatabaseManager:\", error);\n }\n\n return {\n success: true,\n message: \"Database configuration deleted successfully\",\n };\n } catch (error) {\n console.error(\"Failed to delete database config:\", error);\n return {\n success: false,\n message: \"Failed to delete database configuration\",\n };\n }\n}\n\n/**\n * Test database connection\n */\nexport async function testDatabaseConnection(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<TestConnectionResponse> {\n const tenantId = getTenantId(request);\n const { key } = request.params as { key: string };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"database\");\n const store: DatabaseConfigStore = storeLattice.store;\n\n const config = await store.getConfigByKey(tenantId, key);\n if (!config) {\n reply.code(404);\n return {\n success: false,\n message: \"Database configuration not found\",\n };\n }\n\n // Register temporarily for testing\n const testKey = `__test_${key}_${Date.now()}`;\n sqlDatabaseManager.registerDatabase(tenantId, testKey, config.config);\n\n const startTime = Date.now();\n const db = await sqlDatabaseManager.getDatabase(tenantId, testKey);\n\n try {\n // Try to connect and list tables\n await db.connect();\n await db.listTables();\n const latency = Date.now() - startTime;\n\n // Disconnect gracefully with delay to ensure all operations complete\n await new Promise(resolve => setTimeout(resolve, 100));\n await db.disconnect();\n \n // Cleanup\n await sqlDatabaseManager.removeDatabase(tenantId, testKey);\n\n return {\n success: true,\n message: \"Connection test successful\",\n data: {\n connected: true,\n latency,\n },\n };\n } catch (error) {\n // Cleanup on error\n try {\n await db.disconnect();\n await sqlDatabaseManager.removeDatabase(tenantId, testKey);\n } catch { /* cleanup error, ignore */ }\n\n return {\n success: true,\n message: \"Connection test failed\",\n data: {\n connected: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n };\n }\n } catch (error) {\n console.error(\"Failed to test database connection:\", error);\n return {\n success: false,\n message: \"Failed to test database connection\",\n data: {\n connected: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n };\n }\n}\n\n/**\n * Register database config routes\n */\nexport function registerDatabaseConfigRoutes(app: any): void {\n // Get all configs\n app.get(\n \"/api/database-configs\",\n getDatabaseConfigList\n );\n\n // Get config by key\n app.get(\n \"/api/database-configs/:key\",\n getDatabaseConfig\n );\n\n // Create config\n app.post(\n \"/api/database-configs\",\n createDatabaseConfig\n );\n\n // Update config\n app.put(\n \"/api/database-configs/:key\",\n updateDatabaseConfig\n );\n\n // Delete config by key or id\n app.delete(\n \"/api/database-configs/:keyOrId\",\n deleteDatabaseConfig\n );\n\n // Test connection\n app.post(\n \"/api/database-configs/:key/test\",\n testDatabaseConnection\n );\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport {\n getStoreLattice,\n metricsServerManager,\n SemanticMetricsClient,\n} from \"@axiom-lattice/core\";\nimport type {\n MetricsServerConfigStore,\n MetricsServerConfigEntry,\n CreateMetricsServerConfigRequest,\n UpdateMetricsServerConfigRequest,\n MetricsServerConfig,\n DataSource,\n SemanticMetricsQueryRequest,\n SemanticMetricsServerConfig,\n} from \"@axiom-lattice/protocols\";\nimport { randomUUID } from \"crypto\";\n\n/**\n * Metrics Server Config Controller\n * Handles metrics server configuration CRUD operations\n */\n\n/**\n * Get tenant ID from authenticated user context\n * Falls back to request headers for backward compatibility\n */\nfunction getTenantId(request: FastifyRequest): string {\n // First try to get from authenticated user context\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) {\n return userTenantId;\n }\n\n // Fallback to request headers for backward compatibility\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\n/**\n * Metrics server config list response\n */\ninterface MetricsServerConfigListResponse {\n success: boolean;\n message: string;\n data: {\n records: MetricsServerConfigEntry[];\n total: number;\n };\n}\n\n/**\n * Metrics server config response\n */\ninterface MetricsServerConfigResponse {\n success: boolean;\n message: string;\n data?: MetricsServerConfigEntry;\n}\n\n/**\n * Test connection response\n */\ninterface TestConnectionResponse {\n success: boolean;\n message: string;\n data?: {\n connected: boolean;\n latency?: number;\n error?: string;\n };\n}\n\n/**\n * List available metrics response\n */\ninterface ListMetricsResponse {\n success: boolean;\n message: string;\n data?: {\n metrics: Array<{\n name: string;\n type?: string;\n description?: string;\n }>;\n };\n}\n\n/**\n * Query metric data response\n */\ninterface QueryMetricDataResponse {\n success: boolean;\n message: string;\n data?: {\n metricName: string;\n dataPoints: Array<{\n timestamp: number;\n value: number;\n labels?: Record<string, string>;\n }>;\n };\n}\n\n/**\n * Data sources list response\n */\ninterface DataSourcesResponse {\n success: boolean;\n message: string;\n data?: {\n datasources: DataSource[];\n };\n}\n\n/**\n * Datasource metrics response\n */\ninterface DatasourceMetricsResponse {\n success: boolean;\n message: string;\n data?: {\n index: {\n datasourceId: number;\n datasourceName: string;\n catalogVersion: string;\n domainCategories: string[];\n metrics: Array<{\n metricName: string;\n displayName: string;\n domain: string;\n shortDesc: string;\n searchKeywords: string[];\n registered: boolean;\n }>;\n tables?: Array<{\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 metricsDetails: Array<{\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 tablesDetails?: Array<{\n tableName: string;\n docType: string;\n docTypeEn: string;\n objTypeCode?: number;\n mainTable?: string;\n lineTable?: string;\n selectSql: string;\n columns: Array<{\n name: string;\n label: string;\n description?: string;\n type?: string;\n example?: string;\n } | null>;\n }>;\n };\n}\n\n/**\n * Semantic query response\n */\ninterface SemanticQueryResponse {\n success: boolean;\n message: string;\n data?: {\n semanticModel: string;\n columns: string[];\n dataPoints: Array<{\n timestamp?: number;\n value: number;\n labels?: Record<string, string>;\n }>;\n metadata?: {\n rowCount?: number;\n columnCount?: number;\n };\n };\n}\n\n/**\n * Get all metrics server configs for a tenant\n */\nexport async function getMetricsServerConfigList(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<MetricsServerConfigListResponse> {\n const tenantId = getTenantId(request);\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n const configs = await store.getAllConfigs(tenantId);\n\n return {\n success: true,\n message: \"Metrics server configurations retrieved successfully\",\n data: {\n records: configs,\n total: configs.length,\n },\n };\n } catch (error) {\n console.error(\"Failed to get metrics server configs:\", error);\n return {\n success: false,\n message: \"Failed to retrieve metrics server configurations\",\n data: {\n records: [],\n total: 0,\n },\n };\n }\n}\n\n/**\n * Get metrics server config by key\n */\nexport async function getMetricsServerConfig(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<MetricsServerConfigResponse> {\n const tenantId = getTenantId(request);\n const { key } = request.params as { key: string };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n const config = await store.getConfigByKey(tenantId, key);\n\n if (!config) {\n return {\n success: false,\n message: \"Metrics server configuration not found\",\n };\n }\n\n return {\n success: true,\n message: \"Metrics server configuration retrieved successfully\",\n data: config,\n };\n } catch (error) {\n console.error(\"Failed to get metrics server config:\", error);\n return {\n success: false,\n message: \"Failed to retrieve metrics server configuration\",\n };\n }\n}\n\n/**\n * Create new metrics server config\n */\nexport async function createMetricsServerConfig(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<MetricsServerConfigResponse> {\n const tenantId = getTenantId(request);\n const body = request.body as CreateMetricsServerConfigRequest & { \n id?: string;\n selectedDataSources?: string[];\n };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n // Check if key already exists\n const existing = await store.getConfigByKey(tenantId, body.key);\n if (existing) {\n reply.code(409);\n return {\n success: false,\n message: \"Metrics server configuration with this key already exists\",\n };\n }\n\n if (body.config.type === \"semantic\" && !body.selectedDataSources) {\n reply.code(400);\n return {\n success: false,\n message: \"selectedDataSources is required for semantic metrics servers\",\n };\n }\n\n const id = body.id || randomUUID();\n const configData: CreateMetricsServerConfigRequest = {\n key: body.key,\n name: body.name,\n description: body.description,\n config: body.config.type === \"semantic\" \n ? {\n ...body.config,\n selectedDataSources: body.selectedDataSources || [],\n } as SemanticMetricsServerConfig\n : body.config,\n };\n\n const config = await store.createConfig(tenantId, id, configData);\n\n // Auto-register to MetricsServerManager\n try {\n metricsServerManager.registerServer(tenantId, config.key, config.config);\n } catch (error) {\n console.warn(\"Failed to auto-register metrics server:\", error);\n }\n\n reply.code(201);\n return {\n success: true,\n message: \"Metrics server configuration created successfully\",\n data: config,\n };\n } catch (error) {\n console.error(\"Failed to create metrics server config:\", error);\n return {\n success: false,\n message: \"Failed to create metrics server configuration\",\n };\n }\n}\n\n/**\n * Update metrics server config\n */\nexport async function updateMetricsServerConfig(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<MetricsServerConfigResponse> {\n const tenantId = getTenantId(request);\n const { key } = request.params as { key: string };\n const updates = request.body as Partial<UpdateMetricsServerConfigRequest> & {\n selectedDataSources?: string[];\n };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n const existing = await store.getConfigByKey(tenantId, key);\n if (!existing) {\n reply.code(404);\n return {\n success: false,\n message: \"Metrics server configuration not found\",\n };\n }\n\n const isSemantic = updates.config?.type === \"semantic\" ||\n (existing.config.type === \"semantic\" && !updates.config?.type);\n\n if (isSemantic && updates.selectedDataSources !== undefined) {\n updates.config = {\n ...existing.config,\n ...updates.config,\n type: \"semantic\",\n selectedDataSources: updates.selectedDataSources,\n } as SemanticMetricsServerConfig;\n }\n\n const updated = await store.updateConfig(tenantId, existing.id, updates);\n\n if (!updated) {\n return {\n success: false,\n message: \"Failed to update metrics server configuration\",\n };\n }\n\n if (updates.config) {\n try {\n metricsServerManager.registerServer(tenantId, updated.key, updated.config);\n } catch (error) {\n console.warn(\"Failed to re-register metrics server:\", error);\n }\n }\n\n return {\n success: true,\n message: \"Metrics server configuration updated successfully\",\n data: updated,\n };\n } catch (error) {\n console.error(\"Failed to update metrics server config:\", error);\n return {\n success: false,\n message: \"Failed to update metrics server configuration\",\n };\n }\n}\n\n/**\n * Delete metrics server config by key or id\n */\nexport async function deleteMetricsServerConfig(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<MetricsServerConfigResponse> {\n const tenantId = getTenantId(request);\n const { keyOrId } = request.params as { keyOrId: string };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n // Try to find by key first, then by id\n let config = await store.getConfigByKey(tenantId, keyOrId);\n let configKey = keyOrId;\n\n if (!config) {\n // Try to find by id\n config = await store.getConfigById(tenantId, keyOrId);\n if (config) {\n configKey = config.key;\n }\n }\n\n if (!config) {\n reply.code(404);\n return {\n success: false,\n message: \"Metrics server configuration not found\",\n };\n }\n\n const deleted = await store.deleteConfig(tenantId, config.id);\n\n if (!deleted) {\n return {\n success: false,\n message: \"Failed to delete metrics server configuration\",\n };\n }\n\n // Remove from MetricsServerManager\n try {\n if (metricsServerManager.hasServer(tenantId, configKey)) {\n metricsServerManager.removeServer(tenantId, configKey);\n }\n } catch (error) {\n console.warn(\"Failed to remove from MetricsServerManager:\", error);\n }\n\n return {\n success: true,\n message: \"Metrics server configuration deleted successfully\",\n };\n } catch (error) {\n console.error(\"Failed to delete metrics server config:\", error);\n return {\n success: false,\n message: \"Failed to delete metrics server configuration\",\n };\n }\n}\n\n/**\n * Test metrics server connection\n */\nexport async function testMetricsServerConnection(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<TestConnectionResponse> {\n const tenantId = getTenantId(request);\n const { key } = request.params as { key: string };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n const config = await store.getConfigByKey(tenantId, key);\n if (!config) {\n reply.code(404);\n return {\n success: false,\n message: \"Metrics server configuration not found\",\n };\n }\n\n // Register temporarily for testing\n const testKey = `__test_${key}_${Date.now()}`;\n metricsServerManager.registerServer(tenantId, testKey, config.config);\n\n try {\n const client = await metricsServerManager.getClient(tenantId, testKey);\n const result = await client.testConnection();\n\n // Cleanup\n metricsServerManager.removeServer(tenantId, testKey);\n\n return {\n success: true,\n message: result.connected ? \"Connection test successful\" : \"Connection test failed\",\n data: result,\n };\n } catch (error) {\n // Cleanup on error\n try {\n metricsServerManager.removeServer(tenantId, testKey);\n } catch { /* cleanup error, ignore */ }\n\n return {\n success: true,\n message: \"Connection test failed\",\n data: {\n connected: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n };\n }\n } catch (error) {\n console.error(\"Failed to test metrics server connection:\", error);\n return {\n success: false,\n message: \"Failed to test metrics server connection\",\n data: {\n connected: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n };\n }\n}\n\n/**\n * List available metrics from a server\n */\nexport async function listAvailableMetrics(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<ListMetricsResponse> {\n const tenantId = getTenantId(request);\n const { key } = request.params as { key: string };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n const config = await store.getConfigByKey(tenantId, key);\n if (!config) {\n reply.code(404);\n return {\n success: false,\n message: \"Metrics server configuration not found\",\n };\n }\n\n // Ensure server is registered\n if (!metricsServerManager.hasServer(tenantId, key)) {\n metricsServerManager.registerServer(tenantId, key, config.config);\n }\n\n const client = await metricsServerManager.getClient(tenantId, key);\n const metrics = await client.listMetrics();\n\n return {\n success: true,\n message: \"Metrics retrieved successfully\",\n data: {\n metrics: metrics.map(m => ({\n name: m.name,\n type: m.type,\n description: m.description,\n })),\n },\n };\n } catch (error) {\n console.error(\"Failed to list metrics:\", error);\n return {\n success: false,\n message: \"Failed to retrieve metrics\",\n };\n }\n}\n\n/**\n * Query metric data from a server\n */\nexport async function queryMetricsData(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<QueryMetricDataResponse> {\n const tenantId = getTenantId(request);\n const { key } = request.params as { key: string };\n const { metricName, startTime, endTime, step, labels } = request.body as {\n metricName: string;\n startTime?: number;\n endTime?: number;\n step?: number;\n labels?: Record<string, string>;\n };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n const config = await store.getConfigByKey(tenantId, key);\n if (!config) {\n reply.code(404);\n return {\n success: false,\n message: \"Metrics server configuration not found\",\n };\n }\n\n if (!metricName) {\n reply.code(400);\n return {\n success: false,\n message: \"metricName is required\",\n };\n }\n\n // Ensure server is registered\n if (!metricsServerManager.hasServer(tenantId, key)) {\n metricsServerManager.registerServer(tenantId, key, config.config);\n }\n\n const client = await metricsServerManager.getClient(tenantId, key);\n const result = await client.queryMetricData(metricName, {\n startTime,\n endTime,\n step,\n labels,\n });\n\n return {\n success: true,\n message: \"Metric data retrieved successfully\",\n data: {\n metricName: result.metricName,\n dataPoints: result.dataPoints,\n },\n };\n } catch (error) {\n console.error(\"Failed to query metric data:\", error);\n return {\n success: false,\n message: \"Failed to query metric data\",\n };\n }\n}\n\n/**\n * Get data sources for a semantic metrics server\n * GET /api/metrics-configs/:key/datasources\n */\nexport async function getDataSources(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<DataSourcesResponse> {\n const tenantId = getTenantId(request);\n const { key } = request.params as { key: string };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n const config = await store.getConfigByKey(tenantId, key);\n if (!config) {\n reply.code(404);\n return {\n success: false,\n message: \"Metrics server configuration not found\",\n };\n }\n\n if (config.config.type !== \"semantic\") {\n reply.code(400);\n return {\n success: false,\n message: \"This endpoint is only available for semantic metrics servers\",\n };\n }\n\n const semanticConfig = config.config as SemanticMetricsServerConfig;\n\n const client = new SemanticMetricsClient(semanticConfig);\n const allDatasources = await client.getDataSources();\n\n // Filter datasources by selectedDataSources if configured\n const selectedIds = semanticConfig.selectedDataSources || [];\n const filteredDatasources = selectedIds.length > 0\n ? allDatasources.filter(ds => selectedIds.includes(String(ds.id)))\n : allDatasources;\n\n return {\n success: true,\n message: \"Data sources retrieved successfully\",\n data: {\n datasources: filteredDatasources,\n },\n };\n } catch (error) {\n console.error(\"Failed to get data sources:\", error);\n return {\n success: false,\n message: \"Failed to retrieve data sources\",\n };\n }\n}\n\n/**\n * Get metrics for a specific data source\n * GET /api/metrics-configs/:key/datasources/:datasourceId/metrics\n */\nexport async function getDatasourceMetrics(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<DatasourceMetricsResponse> {\n const tenantId = getTenantId(request);\n const { key, datasourceId } = request.params as { key: string; datasourceId: string };\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n const config = await store.getConfigByKey(tenantId, key);\n if (!config) {\n reply.code(404);\n return {\n success: false,\n message: \"Metrics server configuration not found\",\n };\n }\n\n if (config.config.type !== \"semantic\") {\n reply.code(400);\n return {\n success: false,\n message: \"This endpoint is only available for semantic metrics servers\",\n };\n }\n\n const semanticConfig = config.config as SemanticMetricsServerConfig;\n\n const client = new SemanticMetricsClient(semanticConfig);\n const metrics = await client.getDatasourceMetrics(datasourceId);\n\n return {\n success: true,\n message: \"Datasource metrics retrieved successfully\",\n data: metrics,\n };\n } catch (error) {\n console.error(\"Failed to get datasource metrics:\", error);\n return {\n success: false,\n message: \"Failed to retrieve datasource metrics\",\n };\n }\n}\n\n/**\n * Query semantic metrics data\n * POST /api/metrics-configs/:key/semantic-query\n */\nexport async function querySemanticMetrics(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<SemanticQueryResponse> {\n const tenantId = getTenantId(request);\n const { key } = request.params as { key: string };\n const body = request.body as SemanticMetricsQueryRequest;\n\n try {\n const storeLattice = getStoreLattice(\"default\", \"metrics\");\n const store: MetricsServerConfigStore = storeLattice.store;\n\n const config = await store.getConfigByKey(tenantId, key);\n if (!config) {\n reply.code(404);\n return {\n success: false,\n message: \"Metrics server configuration not found\",\n };\n }\n\n if (config.config.type !== \"semantic\") {\n reply.code(400);\n return {\n success: false,\n message: \"This endpoint is only available for semantic metrics servers\",\n };\n }\n\n if (!body.datasourceId || !body.metrics || body.metrics.length === 0) {\n reply.code(400);\n return {\n success: false,\n message: \"datasourceId and metrics array are required\",\n };\n }\n\n const semanticConfig = config.config as SemanticMetricsServerConfig;\n\n const client = new SemanticMetricsClient(semanticConfig);\n const result = await client.semanticQuery(body);\n\n // Transform SemanticMetricsQueryResponse to response format\n // The response contains columns and rows arrays\n const columnNames = result.columns.map(col => col.name);\n const allDataPoints: Array<{\n timestamp?: number;\n value: number;\n labels?: Record<string, string>;\n }> = [];\n\n // Find timestamp column and value column indices\n const timestampColIdx = columnNames.findIndex(col => \n col.toLowerCase().includes('date') || col.toLowerCase().includes('time')\n );\n const valueColIdx = columnNames.findIndex(col => \n col.toLowerCase().includes('value') || col.toLowerCase().includes('rate') || col.toLowerCase().includes('amt')\n );\n\n for (const row of result.rows ?? []) {\n const timestamp = timestampColIdx >= 0 ? row[timestampColIdx] : undefined;\n const value = valueColIdx >= 0 ? row[valueColIdx] : row[row.length - 1];\n \n allDataPoints.push({\n timestamp: timestamp ? new Date(String(timestamp)).getTime() : undefined,\n value: typeof value === 'number' ? value : Number(value) || 0,\n labels: Object.fromEntries(\n columnNames.map((col, idx) => [col, String(row[idx] ?? '')])\n ),\n });\n }\n\n return {\n success: true,\n message: \"Semantic query executed successfully\",\n data: {\n semanticModel: result.semanticModel,\n columns: columnNames,\n dataPoints: allDataPoints,\n metadata: {\n rowCount: result.rows?.length ?? 0,\n columnCount: result.columns.length,\n },\n },\n };\n } catch (error) {\n console.error(\"Failed to query semantic metrics:\", error);\n return {\n success: false,\n message: \"Failed to query semantic metrics\",\n };\n }\n}\n\n/**\n * Test datasources endpoint without saving config\n * Used for multi-step configuration flow\n * POST /api/metrics-configs/test-datasources\n */\nexport async function testSemanticDataSources(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<DataSourcesResponse> {\n const body = request.body as {\n serverUrl: string;\n apiKey?: string;\n username?: string;\n password?: string;\n headers?: Record<string, string>;\n };\n\n try {\n if (!body.serverUrl) {\n reply.code(400);\n return {\n success: false,\n message: \"serverUrl is required\",\n };\n }\n\n const testConfig: SemanticMetricsServerConfig = {\n type: \"semantic\",\n serverUrl: body.serverUrl,\n apiKey: body.apiKey,\n username: body.username,\n password: body.password,\n headers: body.headers,\n };\n\n const client = new SemanticMetricsClient(testConfig);\n\n const datasources = await client.getDataSources();\n\n return {\n success: true,\n message: \"Data sources retrieved successfully\",\n data: {\n datasources,\n },\n };\n } catch (error) {\n console.error(\"Failed to test datasources:\", error);\n return {\n success: false,\n message: `Failed to retrieve data sources: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Test datasource metrics endpoint without saving config\n * Used for multi-step configuration flow\n * POST /api/metrics-configs/test-datasources/:datasourceId/metrics\n */\nexport async function testDatasourceMetrics(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<DatasourceMetricsResponse> {\n const { datasourceId } = request.params as { datasourceId: string };\n const body = request.body as {\n serverUrl: string;\n apiKey?: string;\n username?: string;\n password?: string;\n headers?: Record<string, string>;\n };\n\n try {\n if (!body.serverUrl) {\n reply.code(400);\n return {\n success: false,\n message: \"serverUrl is required\",\n };\n }\n\n const testConfig: SemanticMetricsServerConfig = {\n type: \"semantic\",\n serverUrl: body.serverUrl,\n apiKey: body.apiKey,\n username: body.username,\n password: body.password,\n headers: body.headers,\n };\n\n const client = new SemanticMetricsClient(testConfig);\n const metrics = await client.getDatasourceMetrics(datasourceId);\n\n return {\n success: true,\n message: \"Datasource metrics retrieved successfully\",\n data: metrics,\n };\n } catch (error) {\n console.error(\"Failed to test datasource metrics:\", error);\n return {\n success: false,\n message: `Failed to retrieve datasource metrics: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Register metrics server config routes\n */\nexport function registerMetricsServerConfigRoutes(app: any): void {\n // Get all configs\n app.get(\"/api/metrics-configs\", getMetricsServerConfigList);\n\n // Get config by key\n app.get(\"/api/metrics-configs/:key\", getMetricsServerConfig);\n\n // Create config\n app.post(\"/api/metrics-configs\", createMetricsServerConfig);\n\n // Update config\n app.put(\"/api/metrics-configs/:key\", updateMetricsServerConfig);\n\n // Delete config by key or id\n app.delete(\"/api/metrics-configs/:keyOrId\", deleteMetricsServerConfig);\n\n // Test connection\n app.post(\"/api/metrics-configs/:key/test\", testMetricsServerConnection);\n\n // List available metrics\n app.get(\"/api/metrics-configs/:key/metrics\", listAvailableMetrics);\n\n // Query metric data\n app.post(\"/api/metrics-configs/:key/query\", queryMetricsData);\n\n // Semantic-specific routes\n // Get data sources for a semantic server\n app.get(\"/api/metrics-configs/:key/datasources\", getDataSources);\n\n // Get metrics meta for a specific datasource\n app.get(\"/api/metrics-configs/:key/datasources/:datasourceId/meta\", getDatasourceMetrics);\n\n // Query semantic metrics data\n app.post(\"/api/metrics-configs/:key/semantic-query\", querySemanticMetrics);\n\n // Test datasources without saving config (for multi-step config flow)\n app.post(\"/api/metrics-configs/test-datasources\", testSemanticDataSources);\n\n // Test datasource metrics meta without saving config (for multi-step config flow)\n app.post(\"/api/metrics-configs/test-datasources/:datasourceId/meta\", testDatasourceMetrics);\n}\n","import type { FastifyInstance, FastifyRequest } from \"fastify\";\nimport { ConnectionRegistry, PluginRegistry } from \"@axiom-lattice/core\";\nimport { z } from \"zod\";\n\nconst createBody = z.object({\n type: z.string().min(1),\n key: z.string().min(1),\n name: z.string().min(1),\n description: z.string().optional(),\n config: z.record(z.unknown()),\n});\n\nconst testOrDiscoverBody = z.object({\n key: z.string().optional(),\n config: z.record(z.unknown()).optional(),\n});\n\nfunction getTenant(request: FastifyRequest): string {\n // First try to get from authenticated user context\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) {\n return userTenantId;\n }\n\n // Fallback to request headers for backward compatibility\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\nfunction maskSecrets(config: Record<string, unknown>): Record<string, unknown> {\n const sensitive = new Set([\n \"password\", \"secret\", \"token\", \"apikey\", \"api_key\", \"session\",\n \"privatekey\", \"private_key\", \"accesskey\", \"access_key\",\n ]);\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(config)) {\n out[k] = sensitive.has(k.toLowerCase()) ? \"********\" : v;\n }\n return out;\n}\n\n/** Resolve target config: stored connection (by key) takes priority over inline config */\nasync function resolveConfig(\n type: string, body: { key?: string; config?: Record<string, unknown> }, tenantId: string,\n): Promise<Record<string, unknown>> {\n if (body.key) {\n const entry = await ConnectionRegistry.get(type, body.key, tenantId);\n if (!entry) throw { status: 404, error: `Connection \"${body.key}\" not found` };\n return entry.config;\n }\n if (body.config) return body.config;\n throw { status: 400, error: \"Either 'key' or 'config' is required\" };\n}\n\nexport function connectionRoutes(fastify: FastifyInstance): void {\n // List connections by type\n fastify.get(\"/api/connections\", async (request, reply) => {\n const { type } = request.query as { type?: string };\n if (!type) return reply.status(400).send({ error: \"query 'type' required\" });\n const entries = await ConnectionRegistry.list(type, getTenant(request));\n return reply.send({\n success: true,\n data: { records: entries.map((e) => ({ ...e, config: maskSecrets(e.config) })), total: entries.length },\n });\n });\n\n // Create connection\n fastify.post(\"/api/connections\", async (request, reply) => {\n const parsed = createBody.parse(request.body);\n const entry = await ConnectionRegistry.create({\n tenantId: getTenant(request),\n type: parsed.type,\n key: parsed.key,\n name: parsed.name,\n description: parsed.description,\n config: parsed.config,\n });\n return reply.status(201).send({\n success: true,\n data: { ...entry, config: maskSecrets(entry.config) },\n });\n });\n\n // Update connection (type in query, key in path)\n fastify.put(\"/api/connections/:key\", async (request, reply) => {\n const { type } = request.query as { type?: string };\n if (!type) return reply.status(400).send({ error: \"query 'type' required\" });\n\n const { key } = request.params as { key: string };\n const body = request.body as Record<string, unknown>;\n const tenantId = getTenant(request);\n\n const existing = await ConnectionRegistry.get(type, key, tenantId);\n if (!existing) return reply.status(404).send({ error: \"not found\" });\n\n const updates: Record<string, unknown> = {};\n if (body.name !== undefined) updates.name = body.name;\n if (body.description !== undefined) updates.description = body.description;\n if (body.config) {\n updates.config = { ...existing.config, ...(body.config as Record<string, unknown>) };\n }\n\n const entry = await ConnectionRegistry.update(tenantId, type, key, updates);\n return reply.send({\n success: true,\n data: { ...entry, config: maskSecrets(entry?.config ?? {}) },\n });\n });\n\n // Delete connection\n fastify.delete(\"/api/connections/:key\", async (request, reply) => {\n const { type } = request.query as { type?: string };\n if (!type) return reply.status(400).send({ error: \"query 'type' required\" });\n\n const { key } = request.params as { key: string };\n const ok = await ConnectionRegistry.delete(getTenant(request), type, key);\n return reply.send({ success: ok });\n });\n\n // Test connection (supports key-based stored connection or inline config)\n fastify.post(\"/api/connections/test\", async (request, reply) => {\n const { type } = request.query as { type: string };\n if (!type) return reply.status(400).send({ error: \"query 'type' required\" });\n\n const plugin = PluginRegistry.get(type);\n if (!plugin?.connection?.test) {\n return reply.status(400).send({ error: \"plugin does not support connection testing\" });\n }\n\n try {\n const body = testOrDiscoverBody.parse(request.body);\n const targetConfig = await resolveConfig(type, body, getTenant(request));\n const result = await plugin.connection.test(targetConfig);\n return reply.send(result);\n } catch (err) {\n if ((err as Record<string, unknown>)?.status === 404) {\n return reply.status(404).send(err);\n }\n if ((err as Record<string, unknown>)?.status === 400) {\n return reply.status(400).send(err);\n }\n if (err instanceof z.ZodError) {\n return reply.status(400).send({ error: err.errors });\n }\n return reply.status(500).send({\n ok: false,\n message: err instanceof Error ? err.message : String(err),\n });\n }\n });\n\n // Resource discovery (supports key-based stored connection or inline config)\n fastify.post(\"/api/connections/discover\", async (request, reply) => {\n const { type } = request.query as { type: string };\n if (!type) return reply.status(400).send({ error: \"query 'type' required\" });\n\n const plugin = PluginRegistry.get(type);\n if (!plugin?.connection?.discover) {\n return reply.status(400).send({ error: \"plugin does not support resource discovery\" });\n }\n\n try {\n const body = testOrDiscoverBody.parse(request.body);\n const targetConfig = await resolveConfig(type, body, getTenant(request));\n const resources = await plugin.connection.discover(targetConfig);\n return reply.send({ resources });\n } catch (err) {\n if ((err as Record<string, unknown>)?.status === 404) {\n return reply.status(404).send(err);\n }\n if ((err as Record<string, unknown>)?.status === 400) {\n return reply.status(400).send(err);\n }\n if (err instanceof z.ZodError) {\n return reply.status(400).send({ error: err.errors });\n }\n return reply.status(500).send({\n error: err instanceof Error ? err.message : String(err),\n });\n }\n });\n}\n","import { FastifyInstance, FastifyRequest, FastifyReply } from \"fastify\";\nimport { getStoreLattice } from \"@axiom-lattice/core\";\nimport { EvalStore } from \"@axiom-lattice/protocols\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { evalRunner, EvalStreamEvent } from \"../services/eval-runner\";\n\nfunction getTenantId(request: FastifyRequest): string {\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) {\n return userTenantId;\n }\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\nfunction getEvalStore(): EvalStore {\n return getStoreLattice(\"default\", \"eval\").store as EvalStore;\n}\n\nexport async function createProject(\n request: FastifyRequest<{ Body: Record<string, unknown> }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string; data?: unknown }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const id = uuidv4();\n const data = request.body as any;\n\n // Project name must be unique per tenant. The agent-eval convention\n // (`eval-{agent-id}`) relies on this to associate a project with an agent.\n const existing = await store.getProjectsByTenant(tenantId);\n if (existing.some((p) => p.name === data.name)) {\n return reply.status(409).send({\n success: false,\n message: `Eval project with name \"${data.name}\" already exists`,\n });\n }\n\n const serverCfg = (data.targetServerConfig || {}) as Record<string, unknown>;\n const judgeCfg = (data.judgeModelConfig || {}) as Record<string, unknown>;\n const modelKey = (judgeCfg.modelKey as string) || \"\";\n if (modelKey) {\n const { modelLatticeManager } = await import(\"@axiom-lattice/core\");\n if (!modelLatticeManager.hasLattice(modelKey)) {\n return reply.status(400).send({ success: false, message: `Judge model \"${modelKey}\" is not registered` });\n }\n }\n const project = await store.createProject(tenantId, id, {\n name: data.name,\n description: data.description,\n version: data.version,\n judgeModelConfig: {\n modelKey,\n displayName: (judgeCfg.displayName as string) || \"\",\n },\n targetServerConfig: {\n base_url: (serverCfg.base_url as string) || \"\",\n api_key: (serverCfg.api_key as string) || \"\",\n // Project↔agent association pointer (see manage_eval create_project).\n ...(serverCfg.targetAgentId ? { targetAgentId: serverCfg.targetAgentId as string } : {}),\n },\n concurrency: data.concurrency ?? 1,\n reportConfig: data.reportConfig,\n });\n return reply.status(201).send({\n success: true,\n message: \"Successfully created project\",\n data: project,\n });\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to create project\";\n // TOCTOU guard: the pre-check above can race two concurrent creates;\n // the DB unique constraint (pg 23505 / sqlite UNIQUE constraint failed)\n // is the source of truth. Map it to 409, not a raw 500.\n const code = (err as { code?: string }).code;\n const isUniqueViolation =\n code === \"23505\" ||\n typeof message === \"string\" && message.includes(\"UNIQUE constraint failed\");\n if (isUniqueViolation) {\n return reply.status(409).send({\n success: false,\n message: `Eval project with name \"${(request.body as Record<string, unknown>).name}\" already exists`,\n });\n }\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function listProjects(\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string; data?: unknown }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n let projects = await store.getProjectsByTenant(tenantId);\n\n // Seed a default project for new tenants\n if (projects.length === 0) {\n try {\n const { modelLatticeManager } = await import(\"@axiom-lattice/core\");\n const models = modelLatticeManager.getAllLattices();\n const first = models[0];\n const judgeModel = first\n ? { modelKey: first.key }\n : {};\n\n const host = request.hostname || \"localhost\";\n const baseUrl = `http://${host}:${process.env.PORT || 4001}`;\n\n await store.createProject(tenantId, uuidv4(), {\n name: \"Default\",\n description: \"Built-in project for testing eval against this server\",\n judgeModelConfig: judgeModel,\n targetServerConfig: { base_url: baseUrl, api_key: \"\" },\n concurrency: 3,\n });\n projects = await store.getProjectsByTenant(tenantId);\n } catch { /* seed failure is non-fatal */ }\n }\n\n return {\n success: true,\n message: \"Ok\",\n data: { records: projects, total: projects.length },\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to list projects\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function getProject(\n request: FastifyRequest<{ Params: { pid: string } }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string; data?: unknown }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const { pid } = request.params;\n const project = await store.getProjectById(tenantId, pid);\n if (!project) {\n return reply.status(404).send({ success: false, message: \"Project not found\" });\n }\n const suites = await store.getSuitesByProject(tenantId, pid);\n return {\n success: true,\n message: \"Ok\",\n data: { project, suites },\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to get project\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function updateProject(\n request: FastifyRequest<{ Params: { pid: string }; Body: Record<string, unknown> }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string; data?: unknown }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const { pid } = request.params;\n const existing = await store.getProjectById(tenantId, pid);\n if (!existing) {\n return reply.status(404).send({ success: false, message: \"Project not found\" });\n }\n const body = request.body as Record<string, unknown>;\n const updateData: Record<string, unknown> = { ...body };\n // Strip in_process from user input — it is server-controlled\n const serverCfg = (body.targetServerConfig || {}) as Record<string, unknown>;\n if (body.targetServerConfig !== undefined) {\n updateData.targetServerConfig = {\n base_url: (serverCfg.base_url as string) || \"\",\n api_key: (serverCfg.api_key as string) || \"\",\n };\n }\n // Only allow modelKey/displayName — never raw provider/apiKey/baseURL\n if (body.judgeModelConfig !== undefined) {\n const judgeCfg = (body.judgeModelConfig || {}) as Record<string, unknown>;\n const modelKey = (judgeCfg.modelKey as string) || \"\";\n if (modelKey) {\n const { modelLatticeManager } = await import(\"@axiom-lattice/core\");\n if (!modelLatticeManager.hasLattice(modelKey)) {\n return reply.status(400).send({ success: false, message: `Judge model \"${modelKey}\" is not registered` });\n }\n }\n updateData.judgeModelConfig = {\n modelKey,\n displayName: (judgeCfg.displayName as string) || \"\",\n };\n }\n const updated = await store.updateProject(tenantId, pid, updateData);\n return {\n success: true,\n message: \"Successfully updated project\",\n data: updated,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to update project\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function deleteProject(\n request: FastifyRequest<{ Params: { pid: string } }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const { pid } = request.params;\n const existing = await store.getProjectById(tenantId, pid);\n if (!existing) {\n return reply.status(404).send({ success: false, message: \"Project not found\" });\n }\n const deleted = await store.deleteProject(tenantId, pid);\n if (!deleted) {\n return reply.status(500).send({ success: false, message: \"Failed to delete project\" });\n }\n return { success: true, message: \"Successfully deleted project\" };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to delete project\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function createSuite(\n request: FastifyRequest<{ Params: { pid: string }; Body: Record<string, unknown> }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string; data?: unknown }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const { pid } = request.params;\n const project = await store.getProjectById(tenantId, pid);\n if (!project) {\n return reply.status(404).send({ success: false, message: \"Project not found\" });\n }\n const id = uuidv4();\n const data = request.body as any;\n const suite = await store.createSuite(tenantId, pid, id, { name: data.name });\n return reply.status(201).send({\n success: true,\n message: \"Successfully created suite\",\n data: suite,\n });\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to create suite\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function updateSuite(\n request: FastifyRequest<{ Params: { pid: string; sid: string }; Body: Record<string, unknown> }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string; data?: unknown }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const { sid } = request.params;\n const existing = await store.getSuiteById(tenantId, sid);\n if (!existing) {\n return reply.status(404).send({ success: false, message: \"Suite not found\" });\n }\n const updated = await store.updateSuite(tenantId, sid, request.body as any);\n return {\n success: true,\n message: \"Successfully updated suite\",\n data: updated,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to update suite\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function deleteSuite(\n request: FastifyRequest<{ Params: { pid: string; sid: string } }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const { sid } = request.params;\n const existing = await store.getSuiteById(tenantId, sid);\n if (!existing) {\n return reply.status(404).send({ success: false, message: \"Suite not found\" });\n }\n const deleted = await store.deleteSuite(tenantId, sid);\n if (!deleted) {\n return reply.status(500).send({ success: false, message: \"Failed to delete suite\" });\n }\n return { success: true, message: \"Successfully deleted suite\" };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to delete suite\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function createCase(\n request: FastifyRequest<{ Params: { pid: string; sid: string }; Body: Record<string, unknown> }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string; data?: unknown }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const { sid } = request.params;\n const suite = await store.getSuiteById(tenantId, sid);\n if (!suite) {\n return reply.status(404).send({ success: false, message: \"Suite not found\" });\n }\n const id = uuidv4();\n const data = request.body as any;\n const created = await store.createCase(tenantId, sid, id, {\n inputMessage: data.inputMessage,\n inputFiles: data.inputFiles,\n steps: data.steps ?? [],\n outputType: data.outputType ?? \"message_content\",\n contentAssertion: data.contentAssertion ?? \"\",\n rubrics: data.rubrics,\n interruptPolicy: data.interruptPolicy,\n });\n return reply.status(201).send({\n success: true,\n message: \"Successfully created case\",\n data: created,\n });\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to create case\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function listCasesForSuite(\n request: FastifyRequest<{ Params: { pid: string; sid: string } }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string; data?: unknown }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const { sid } = request.params;\n const cases = await store.getCasesBySuite(tenantId, sid);\n return {\n success: true,\n message: \"Ok\",\n data: { records: cases, total: cases.length },\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to list cases\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function updateCase(\n request: FastifyRequest<{ Params: { pid: string; sid: string; cid: string }; Body: Record<string, unknown> }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string; data?: unknown }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const { cid } = request.params;\n const existing = await store.getCaseById(tenantId, cid);\n if (!existing) {\n return reply.status(404).send({ success: false, message: \"Case not found\" });\n }\n const updated = await store.updateCase(tenantId, cid, request.body as any);\n return {\n success: true,\n message: \"Successfully updated case\",\n data: updated,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to update case\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport async function deleteCase(\n request: FastifyRequest<{ Params: { pid: string; sid: string; cid: string } }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message: string }> {\n try {\n const tenantId = getTenantId(request);\n const store = getEvalStore();\n const { cid } = request.params;\n const existing = await store.getCaseById(tenantId, cid);\n if (!existing) {\n return reply.status(404).send({ success: false, message: \"Case not found\" });\n }\n const deleted = await store.deleteCase(tenantId, cid);\n if (!deleted) {\n return reply.status(500).send({ success: false, message: \"Failed to delete case\" });\n }\n return { success: true, message: \"Successfully deleted case\" };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Failed to delete case\";\n return reply.status(500).send({ success: false, message });\n }\n}\n\nexport function registerEvalRoutes(app: FastifyInstance): void {\n app.post(\"/api/eval/projects\", createProject);\n app.get(\"/api/eval/projects\", listProjects);\n app.get(\"/api/eval/projects/:pid\", getProject);\n app.put(\"/api/eval/projects/:pid\", updateProject);\n app.delete(\"/api/eval/projects/:pid\", deleteProject);\n\n app.post(\"/api/eval/projects/:pid/suites\", createSuite);\n app.put(\"/api/eval/projects/:pid/suites/:sid\", updateSuite);\n app.delete(\"/api/eval/projects/:pid/suites/:sid\", deleteSuite);\n\n app.post(\"/api/eval/projects/:pid/suites/:sid/cases\", createCase);\n app.get(\"/api/eval/projects/:pid/suites/:sid/cases\", listCasesForSuite);\n app.put(\"/api/eval/projects/:pid/suites/:sid/cases/:cid\", updateCase);\n app.delete(\"/api/eval/projects/:pid/suites/:sid/cases/:cid\", deleteCase);\n\n // POST /api/eval/projects/:pid/runs — trigger run\n app.post(\"/api/eval/projects/:pid/runs\", async (request, reply) => {\n try {\n const tenantId = getTenantId(request);\n const { pid } = request.params as { pid: string };\n const body = (request.body ?? {}) as {\n suiteIds?: string[]; caseIds?: string[];\n runConfig?: { workspaceId?: string; projectId?: string };\n taskId?: string;\n };\n // Runtime environment: prefer explicit body.runConfig (from the UI's\n // project selector). Fall back to request headers for backward compat.\n // NOT from the eval project's targetServerConfig.\n const bodyWs = (request.headers[\"x-workspace-id\"] as string) || \"\";\n const bodyPj = (request.headers[\"x-project-id\"] as string) || \"\";\n const runConfig = {\n workspaceId: body?.runConfig?.workspaceId ?? bodyWs,\n projectId: body?.runConfig?.projectId ?? bodyPj,\n };\n const runId = await evalRunner.startRun(tenantId, pid, body?.suiteIds, body?.caseIds, runConfig, body?.taskId);\n reply.status(202).send({ success: true, message: \"Run started\", data: { run_id: runId } });\n } catch (err) {\n const msg = (err as Error).message;\n const code = msg === \"Project not found\" ? 404\n : msg.includes(\"already in progress\") ? 409\n : msg.includes(\"No suites match\") || msg.includes(\"No cases match\") ? 400\n : 500;\n reply.status(code).send({ success: false, message: msg });\n }\n });\n\n // GET /api/eval/runs — list runs\n app.get(\"/api/eval/runs\", async (request, reply) => {\n try {\n const tenantId = getTenantId(request);\n const query = request.query as { project_id?: string; status?: string };\n const runs = await getEvalStore().getRunsByTenant(tenantId, { projectId: query.project_id, status: query.status });\n reply.send({ success: true, message: \"Ok\", data: { records: runs, total: runs.length } });\n } catch (err) {\n reply.status(500).send({ success: false, message: (err as Error).message });\n }\n });\n\n // GET /api/eval/runs/:rid — get run detail with results\n app.get(\"/api/eval/runs/:rid\", async (request, reply) => {\n try {\n const tenantId = getTenantId(request);\n const { rid } = request.params as { rid: string };\n const run = await getEvalStore().getRunById(tenantId, rid);\n if (!run) return reply.status(404).send({ success: false, message: \"Run not found\" });\n const results = await getEvalStore().getResultsByRun(tenantId, rid);\n reply.send({ success: true, message: \"Ok\", data: { ...run, results } });\n } catch (err) {\n reply.status(500).send({ success: false, message: (err as Error).message });\n }\n });\n\n // GET /api/eval/runs/:rid/stream — SSE progress stream\n app.get(\"/api/eval/runs/:rid/stream\", async (request, reply) => {\n reply.hijack();\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n\n const { rid } = request.params as { rid: string };\n const emitter = evalRunner.getEventEmitter();\n const eventKey = `run:${rid}`;\n\n if (!evalRunner.isRunning(rid)) {\n const tenantId = getTenantId(request);\n const run = await getEvalStore().getRunById(tenantId, rid);\n if (run) {\n const eventType = run.status === \"completed\" ? \"completed\" : \"error\";\n reply.raw.write(`event: ${eventType}\\ndata: ${JSON.stringify({ passed: run.passedCases, failed: run.failedCases, avgScore: run.avgScore })}\\n\\n`);\n }\n reply.raw.end();\n return;\n }\n\n const handler = (event: EvalStreamEvent): void => {\n reply.raw.write(`event: ${event.type}\\ndata: ${JSON.stringify(event.data)}\\n\\n`);\n if (event.type === \"completed\" || event.type === \"error\") {\n emitter.off(eventKey, handler);\n reply.raw.end();\n }\n };\n\n emitter.on(eventKey, handler);\n\n request.raw.on(\"close\", () => {\n emitter.off(eventKey, handler);\n });\n });\n\n // POST /api/eval/runs/:rid/abort — abort run\n app.post(\"/api/eval/runs/:rid/abort\", async (request, reply) => {\n try {\n const { rid } = request.params as { rid: string };\n const aborted = await evalRunner.abortRun(rid);\n if (!aborted) return reply.status(404).send({ success: false, message: \"Run not found or not running\" });\n reply.send({ success: true, message: \"Run aborted\" });\n } catch (err) {\n reply.status(500).send({ success: false, message: (err as Error).message });\n }\n });\n\n // DELETE /api/eval/runs/:rid — delete run and results\n app.delete(\"/api/eval/runs/:rid\", async (request, reply) => {\n try {\n const tenantId = getTenantId(request);\n const { rid } = request.params as { rid: string };\n const deleted = await getEvalStore().deleteRun(tenantId, rid);\n if (!deleted) return reply.status(404).send({ success: false, message: \"Run not found\" });\n reply.send({ success: true, message: \"Run deleted\" });\n } catch (err) {\n reply.status(500).send({ success: false, message: (err as Error).message });\n }\n });\n\n // GET /api/eval/reports/projects/:pid — aggregated report\n app.get(\"/api/eval/reports/projects/:pid\", async (request, reply) => {\n try {\n const tenantId = getTenantId(request);\n const { pid } = request.params as { pid: string };\n const report = await getEvalStore().getProjectReport(tenantId, pid);\n if (!report) return reply.status(404).send({ success: false, message: \"Project not found\" });\n reply.send({ success: true, message: \"Ok\", data: report });\n } catch (err) {\n reply.status(500).send({ success: false, message: (err as Error).message });\n }\n });\n}\n","import { EventEmitter } from \"events\";\nimport {\n getStoreLattice,\n modelLatticeManager,\n LatticeEvalProject,\n} from \"@axiom-lattice/core\";\nimport type { EvalStore } from \"@axiom-lattice/protocols\";\nimport type {\n CaseRunResult,\n LatticeEvalBatchReport,\n LatticeEvalProjectType,\n LatticeEvalSuiteType,\n LatticeEvalLogEvent,\n} from \"@axiom-lattice/core\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nexport interface EvalStreamEvent {\n type: \"progress\" | \"completed\" | \"error\";\n runId: string;\n data: Record<string, unknown>;\n}\n\ninterface RunContext {\n runId: string;\n projectId: string;\n tenantId: string;\n abortController: AbortController;\n promise: Promise<{ report: LatticeEvalBatchReport }>;\n taskId?: string;\n}\n\nfunction mapLogs(logs: LatticeEvalLogEvent[]): Array<{ timestamp: string; level: string; message: string; data?: unknown }> {\n return logs.map((l) => ({\n timestamp: l.ts,\n level: l.level,\n message: l.message,\n data: l.data,\n }));\n}\n\n/**\n * EvalRunner — in-process evaluation run scheduler.\n *\n * @remarks\n * Single-instance assumption: run state lives in an in-memory Map plus a\n * per-instance EventEmitter. Deploying multiple gateway instances requires\n * a distributed lease (runner instance id + heartbeat) before the orphan\n * cleanup below is safe — without it, instance B could mark instance A's\n * live run failed. The createdAt guard limits cleanup to runs created\n * BEFORE this process started, which are true orphans of a restart.\n */\nclass EvalRunner {\n private runs = new Map<string, RunContext>();\n private eventEmitter = new EventEmitter();\n private readonly processStartedAt = new Date();\n\n getEventEmitter(): EventEmitter {\n return this.eventEmitter;\n }\n\n async startRun(\n tenantId: string,\n projectId: string,\n suiteIds?: string[],\n caseIds?: string[],\n runConfig?: { workspaceId?: string; projectId?: string },\n taskId?: string\n ): Promise<string> {\n const store = this.getEvalStore();\n const project = await store.getProjectById(tenantId, projectId);\n if (!project) throw new Error(\"Project not found\");\n\n for (const ctx of this.runs.values()) {\n if (ctx.projectId === projectId) {\n throw new Error(\"A run is already in progress for this project\");\n }\n }\n\n const existingRuns = await store.getRunsByTenant(tenantId, { projectId, status: \"running\" });\n for (const run of existingRuns) {\n // Only clean runs created before this process started: they are true\n // orphans of a gateway restart. Runs created after startup but missing\n // from memory belong to another live instance — leave them alone.\n const orphaned = !this.runs.has(run.id) && run.createdAt < this.processStartedAt;\n if (orphaned) {\n await store.updateRunStatus(tenantId, run.id, {\n status: \"failed\",\n error: \"Gateway restarted — run orphaned\",\n completedAt: new Date(),\n });\n }\n }\n const stillRunning = await store.getRunsByTenant(tenantId, { projectId, status: \"running\" });\n if (stillRunning.length > 0) {\n throw new Error(\"A run is already in progress for this project\");\n }\n\n let suites = await store.getSuitesByProject(tenantId, projectId);\n if (suiteIds && suiteIds.length > 0) {\n suites = suites.filter((s) => suiteIds.includes(s.id));\n if (suites.length === 0) {\n throw new Error(\"No suites match the requested suiteIds filter\");\n }\n }\n const evalSuites: LatticeEvalSuiteType[] = [];\n let totalCases = 0;\n\n for (const suite of suites) {\n let cases = await store.getCasesBySuite(tenantId, suite.id);\n if (caseIds && caseIds.length > 0) {\n cases = cases.filter((c) => caseIds.includes(c.id));\n if (cases.length === 0) continue;\n }\n totalCases += cases.length;\n evalSuites.push({\n suiteName: suite.name,\n cases: cases.map((c) => ({\n caseId: c.id,\n input: { message: c.inputMessage, files: c.inputFiles },\n steps: c.steps,\n output: { type: \"message_content\" },\n interruptPolicy: c.interruptPolicy,\n eval: {\n content_assertion: c.contentAssertion,\n eval_rubrics: c.rubrics?.map((r) => ({\n dimension: r.name,\n weight: r.weight,\n description: r.description,\n })),\n },\n })),\n });\n }\n\n if (caseIds && caseIds.length > 0 && evalSuites.length === 0) {\n throw new Error(\"No cases match the requested caseIds filter\");\n }\n\n const judgeCfg = (project.judgeModelConfig ?? {}) as Record<string, unknown>;\n const judgeModelKey = (judgeCfg.modelKey as string) || \"\";\n let resolvedJudgeModelKey: string;\n\n if (judgeModelKey) {\n if (!modelLatticeManager.hasLattice(judgeModelKey)) {\n throw new Error(`Judge model \"${judgeModelKey}\" is not registered`);\n }\n resolvedJudgeModelKey = judgeModelKey;\n } else {\n // No explicit judge — prefer the model registered under the \"default\"\n // key (the app convention, see examples), else the first registered one.\n const models = modelLatticeManager.getAllLattices();\n const defaultModel = models.find((m) => m.key === \"default\");\n resolvedJudgeModelKey = defaultModel?.key ?? models[0]?.key ?? \"\";\n if (!resolvedJudgeModelKey) {\n throw new Error(\"No model registered — cannot run eval without a judge model\");\n }\n if (!defaultModel) {\n console.warn(`[eval-runner] Project \"${project.name}\" has no judge modelKey and no \"default\" model — falling back to first registered model \"${resolvedJudgeModelKey}\"`);\n }\n }\n\n const runId = uuidv4();\n const concurrency = Math.max(1, Math.floor((project as unknown as Record<string, unknown>).concurrency as number) || 3);\n // Hold-out isolation: a run covering ONLY validation suites is a\n // holdout run — its per-case results are withheld from agents.\n const isHoldout = suites.length > 0 && suites.every((s) => s.name.endsWith(\"-validation\"));\n // Runtime environment comes from the CALLER's runConfig (runConfig\n // param), NOT from the eval project's targetServerConfig. Test cases\n // are environment-agnostic — the run environment is decided at run time.\n const workspaceId = runConfig?.workspaceId || \"\";\n const projectIdFromConfig = runConfig?.projectId || \"\";\n await store.createRun(tenantId, projectId, runId, {\n totalCases, concurrency, holdout: isHoldout,\n envWorkspaceId: workspaceId || undefined,\n envProjectId: projectIdFromConfig || undefined,\n taskId,\n });\n\n const projectConfig: LatticeEvalProjectType = {\n projectName: project.name,\n version: project.version,\n description: project.description,\n suites: evalSuites,\n judge_agent_config: { modelKey: resolvedJudgeModelKey },\n lattice_server_config: {\n tenant_id: tenantId,\n workspace_id: workspaceId,\n project_id: projectIdFromConfig,\n },\n concurrency,\n };\n\n const abortController = new AbortController();\n const stats = { passed: 0, failed: 0, interrupted: 0, totalScore: 0 };\n\n const onCaseComplete = async (result: CaseRunResult, suiteName: string): Promise<void> => {\n // HITL-paused cases are judged like any other case (the pause is\n // business behavior) — the interrupted flag is informational metadata.\n const passed = result.result?.pass ?? false;\n const score = result.result?.final_score ?? 0;\n\n if (passed) stats.passed++; else stats.failed++;\n stats.totalScore += score;\n if (result.interrupted) stats.interrupted++;\n\n const completedCount = stats.passed + stats.failed;\n\n await store.createRunResult(tenantId, runId, uuidv4(), {\n suiteName,\n caseId: result.caseId,\n pass: passed,\n score,\n summary: result.result?.summary,\n dimensionResults: result.result?.dimension_results?.map((d) => ({\n name: d.name,\n score: d.score,\n reason: d.reason,\n })),\n durationMs: result.duration_ms,\n messages: result.messages,\n logs: mapLogs(result.logs),\n error: result.error,\n interrupted: result.interrupted,\n });\n\n const avgScore = completedCount > 0 ? stats.totalScore / completedCount : 0;\n await store.updateRunStatus(tenantId, runId, {\n passedCases: stats.passed,\n failedCases: stats.failed,\n interruptedCases: stats.interrupted,\n avgScore,\n });\n\n this.eventEmitter.emit(`run:${runId}`, {\n type: \"progress\",\n runId,\n data: { suiteName, caseId: result.caseId, pass: passed, score, interrupted: result.interrupted ?? false, completed: completedCount, total: totalCases },\n } satisfies EvalStreamEvent);\n };\n\n const runPromise = (async () => {\n try {\n const evalProject = new LatticeEvalProject(projectConfig, onCaseComplete);\n const calibration = await evalProject.calibrateJudge();\n if (!calibration.ok && !calibration.bypassed) {\n await store.updateRunStatus(tenantId, runId, {\n status: \"failed\",\n error: `Judge calibration failed: ${calibration.reason}`,\n completedAt: new Date(),\n });\n throw new Error(`Judge calibration failed: ${calibration.reason}`);\n }\n if (calibration.bypassed) {\n console.warn(`[eval-runner] Judge calibration bypassed — judge may be unreliable: ${calibration.reason}`);\n }\n const { report } = await evalProject.runAllSuitesBatch(concurrency, abortController.signal);\n\n if (!abortController.signal.aborted) {\n const completedCount = stats.passed + stats.failed;\n await store.updateRunStatus(tenantId, runId, {\n status: \"completed\",\n completedAt: new Date(),\n passedCases: stats.passed,\n failedCases: stats.failed,\n interruptedCases: stats.interrupted,\n avgScore: completedCount > 0 ? stats.totalScore / completedCount : 0,\n });\n\n this.eventEmitter.emit(`run:${runId}`, {\n type: \"completed\",\n runId,\n data: { passed: stats.passed, failed: stats.failed, avgScore: completedCount > 0 ? stats.totalScore / completedCount : 0 },\n } satisfies EvalStreamEvent);\n }\n\n return { report };\n } catch (err) {\n const errorMsg = (err as Error).message;\n if (!abortController.signal.aborted) {\n await store.updateRunStatus(tenantId, runId, {\n status: \"failed\",\n error: errorMsg,\n completedAt: new Date(),\n });\n\n this.eventEmitter.emit(`run:${runId}`, {\n type: \"error\",\n runId,\n data: { message: errorMsg },\n } satisfies EvalStreamEvent);\n }\n\n throw err;\n } finally {\n this.runs.delete(runId);\n }\n })();\n\n this.runs.set(runId, { runId, projectId, tenantId, abortController, promise: runPromise, taskId });\n runPromise.catch(() => {});\n\n return runId;\n }\n\n async abortRun(runId: string): Promise<boolean> {\n const ctx = this.runs.get(runId);\n if (!ctx) return false;\n ctx.abortController.abort();\n const store = this.getEvalStore();\n await store.updateRunStatus(ctx.tenantId, runId, { status: \"aborted\", completedAt: new Date() });\n return true;\n }\n\n async waitForRun(runId: string): Promise<LatticeEvalBatchReport> {\n const ctx = this.runs.get(runId);\n if (!ctx) throw new Error(\"Run not found or no longer in memory\");\n const { report } = await ctx.promise;\n return report;\n }\n\n isRunning(runId: string): boolean {\n return this.runs.has(runId);\n }\n\n private getEvalStore(): EvalStore {\n return getStoreLattice(\"default\", \"eval\").store as EvalStore;\n }\n}\n\nexport const evalRunner = new EvalRunner();\n","import { FastifyInstance, FastifyRequest, FastifyReply } from \"fastify\";\nimport { getStoreLattice } from \"@axiom-lattice/core\";\nimport type {\n CreateUserRequest,\n UpdateUserRequest,\n} from \"@axiom-lattice/protocols\";\nimport { v4 as uuidv4 } from \"uuid\";\n\ninterface UserParams {\n userId: string;\n}\n\ninterface ListUsersQuery {\n email?: string;\n}\n\nexport class UsersController {\n private userStore;\n\n constructor() {\n this.userStore = getStoreLattice(\"default\", \"user\").store;\n }\n\n async listUsers(\n request: FastifyRequest<{ Querystring: ListUsersQuery }>,\n reply: FastifyReply\n ) {\n const { email } = request.query;\n\n if (email) {\n const user = await this.userStore.getUserByEmail(email);\n return { success: true, data: user ? [user] : [] };\n }\n\n const users = await this.userStore.getAllUsers();\n return { success: true, data: users };\n }\n\n async createUser(\n request: FastifyRequest<{ Body: CreateUserRequest }>,\n reply: FastifyReply\n ) {\n const data = request.body;\n const id = uuidv4();\n\n const existingUser = await this.userStore.getUserByEmail(data.email);\n if (existingUser) {\n return reply.status(409).send({\n success: false,\n error: `User with email ${data.email} already exists`,\n });\n }\n\n const user = await this.userStore.createUser(id, data);\n return reply.status(201).send({ success: true, data: user });\n }\n\n async getUser(\n request: FastifyRequest<{ Params: UserParams }>,\n reply: FastifyReply\n ) {\n const { userId } = request.params;\n\n const user = await this.userStore.getUserById(userId);\n\n if (!user) {\n return reply.status(404).send({\n success: false,\n error: \"User not found\",\n });\n }\n\n return { success: true, data: user };\n }\n\n async updateUser(\n request: FastifyRequest<{\n Params: UserParams;\n Body: UpdateUserRequest;\n }>,\n reply: FastifyReply\n ) {\n const { userId } = request.params;\n const updates = request.body;\n\n if (updates.email) {\n const existingUser = await this.userStore.getUserByEmail(updates.email);\n if (existingUser && existingUser.id !== userId) {\n return reply.status(409).send({\n success: false,\n error: `User with email ${updates.email} already exists`,\n });\n }\n }\n\n const user = await this.userStore.updateUser(userId, updates);\n\n if (!user) {\n return reply.status(404).send({\n success: false,\n error: \"User not found\",\n });\n }\n\n return { success: true, data: user };\n }\n\n async deleteUser(\n request: FastifyRequest<{ Params: UserParams }>,\n reply: FastifyReply\n ) {\n const { userId } = request.params;\n\n const deleted = await this.userStore.deleteUser(userId);\n\n if (!deleted) {\n return reply.status(404).send({\n success: false,\n error: \"User not found\",\n });\n }\n\n return { success: true };\n }\n}\n\nexport function registerUserRoutes(app: FastifyInstance) {\n const controller = new UsersController();\n\n app.get(\"/api/users\", controller.listUsers.bind(controller));\n app.post(\"/api/users\", controller.createUser.bind(controller));\n app.get(\"/api/users/:userId\", controller.getUser.bind(controller));\n app.patch(\"/api/users/:userId\", controller.updateUser.bind(controller));\n app.delete(\"/api/users/:userId\", controller.deleteUser.bind(controller));\n}\n","/**\n * TenantsController\n *\n * Controller for tenant management\n * Handles CRUD operations for tenants (top-level entities)\n */\n\nimport { FastifyInstance, FastifyRequest, FastifyReply } from \"fastify\";\nimport { getStoreLattice } from \"@axiom-lattice/core\";\nimport type {\n CreateTenantRequest,\n UpdateTenantRequest,\n} from \"@axiom-lattice/protocols\";\nimport { v4 as uuidv4 } from \"uuid\";\n\ninterface TenantParams {\n tenantId: string;\n}\n\nexport class TenantsController {\n private tenantStore;\n\n constructor() {\n this.tenantStore = getStoreLattice(\"default\", \"tenant\").store;\n }\n\n // ==================== Tenant CRUD ====================\n\n async listTenants(request: FastifyRequest, reply: FastifyReply) {\n const tenants = await this.tenantStore.getAllTenants();\n return { success: true, data: tenants };\n }\n\n async createTenant(\n request: FastifyRequest<{ Body: CreateTenantRequest }>,\n reply: FastifyReply\n ) {\n const data = request.body;\n const id = uuidv4();\n\n const tenant = await this.tenantStore.createTenant(id, data);\n return reply.status(201).send({ success: true, data: tenant });\n }\n\n async getTenant(\n request: FastifyRequest<{ Params: TenantParams }>,\n reply: FastifyReply\n ) {\n const { tenantId } = request.params;\n\n const tenant = await this.tenantStore.getTenantById(tenantId);\n\n if (!tenant) {\n return reply.status(404).send({\n success: false,\n error: \"Tenant not found\",\n });\n }\n\n return { success: true, data: tenant };\n }\n\n async updateTenant(\n request: FastifyRequest<{\n Params: TenantParams;\n Body: UpdateTenantRequest;\n }>,\n reply: FastifyReply\n ) {\n const { tenantId } = request.params;\n const updates = request.body;\n\n const tenant = await this.tenantStore.updateTenant(tenantId, updates);\n\n if (!tenant) {\n return reply.status(404).send({\n success: false,\n error: \"Tenant not found\",\n });\n }\n\n return { success: true, data: tenant };\n }\n\n async deleteTenant(\n request: FastifyRequest<{ Params: TenantParams }>,\n reply: FastifyReply\n ) {\n const { tenantId } = request.params;\n\n // Prevent deletion of the default tenant\n if (tenantId === \"default\") {\n return reply.status(403).send({\n success: false,\n error: \"Cannot delete the default tenant\",\n });\n }\n\n const deleted = await this.tenantStore.deleteTenant(tenantId);\n\n if (!deleted) {\n return reply.status(404).send({\n success: false,\n error: \"Tenant not found\",\n });\n }\n\n return { success: true };\n }\n}\n\nexport function registerTenantRoutes(app: FastifyInstance) {\n const controller = new TenantsController();\n\n // Tenant routes\n app.get(\"/api/tenants\", controller.listTenants.bind(controller));\n app.post(\"/api/tenants\", controller.createTenant.bind(controller));\n app.get(\"/api/tenants/:tenantId\", controller.getTenant.bind(controller));\n app.patch(\"/api/tenants/:tenantId\", controller.updateTenant.bind(controller));\n app.delete(\"/api/tenants/:tenantId\", controller.deleteTenant.bind(controller));\n}\n","import { FastifyInstance, FastifyRequest, FastifyReply } from \"fastify\";\nimport { getStoreLattice } from \"@axiom-lattice/core\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { createHmac, randomBytes, timingSafeEqual } from \"node:crypto\";\nimport type { CreateUserRequest, CreateTenantRequest, UserTenantRole } from \"@axiom-lattice/protocols\";\n\ninterface RegisterRequest {\n email: string;\n password: string;\n name: string;\n}\n\ninterface LoginRequest {\n email: string;\n password: string;\n}\n\ninterface SelectTenantRequest {\n tenantId: string;\n}\n\ninterface ApproveUserRequest {\n userId: string;\n approved: boolean;\n}\n\ninterface AssignTenantRequest {\n userId: string;\n tenantId: string;\n role?: UserTenantRole;\n}\n\ninterface ChangePasswordRequest {\n currentPassword: string;\n newPassword: string;\n}\n\nexport interface AuthConfig {\n autoApproveUsers: boolean;\n allowTenantRegistration: boolean;\n jwtSecret?: string;\n tokenExpiration: number;\n}\n\n/** Identity embedded in a signed console session token. */\nexport interface ConsoleSessionPayload {\n userId: string;\n tenantId?: string;\n exp: number;\n}\n\n/** Configuration for the gateway-wide console authentication hook. */\nexport interface ConsoleAuthHookOptions {\n authRequired: boolean;\n tokenSecret?: string;\n}\n\nconst defaultAuthConfig: AuthConfig = {\n autoApproveUsers: true,\n allowTenantRegistration: true,\n tokenExpiration: 86400,\n};\n\nexport class AuthController {\n private userStore;\n private tenantStore;\n private userTenantLinkStore;\n private config: AuthConfig;\n\n constructor(config: Partial<AuthConfig> = {}) {\n this.userStore = getStoreLattice(\"default\", \"user\").store;\n this.tenantStore = getStoreLattice(\"default\", \"tenant\").store;\n this.userTenantLinkStore = getStoreLattice(\"default\", \"userTenantLink\").store;\n this.config = { ...defaultAuthConfig, ...config };\n }\n\n async register(\n request: FastifyRequest<{ Body: RegisterRequest }>,\n reply: FastifyReply\n ) {\n const { email, password, name } = request.body;\n\n try {\n const existingUser = await this.userStore.getUserByEmail(email);\n if (existingUser) {\n return reply.status(409).send({\n success: false,\n error: \"User with this email already exists\",\n });\n }\n\n const userId = uuidv4();\n const userStatus = this.config.autoApproveUsers ? \"active\" : \"pending\";\n \n const userData: CreateUserRequest = {\n email,\n name,\n status: userStatus,\n metadata: {\n passwordHash: await this.hashPassword(password),\n },\n };\n\n const user = await this.userStore.createUser(userId, userData);\n\n return reply.status(201).send({\n success: true,\n message: this.config.autoApproveUsers\n ? \"Registration successful\"\n : \"Registration successful. Please wait for admin approval.\",\n data: {\n user: {\n id: user.id,\n email: user.email,\n name: user.name,\n status: user.status,\n },\n },\n });\n } catch (error) {\n console.error(\"Registration error:\", error);\n return reply.status(500).send({\n success: false,\n error: \"Registration failed\",\n });\n }\n }\n\n async login(\n request: FastifyRequest<{ Body: LoginRequest }>,\n reply: FastifyReply\n ) {\n const { email, password } = request.body;\n\n try {\n const user = await this.userStore.getUserByEmail(email);\n if (!user) {\n return reply.status(401).send({\n success: false,\n error: \"Invalid credentials\",\n });\n }\n\n if (user.status !== \"active\") {\n return reply.status(403).send({\n success: false,\n error: `Account is ${user.status}. Please wait for admin approval.`,\n });\n }\n\n const isValidPassword = await this.verifyPassword(\n password,\n user.metadata?.passwordHash || \"\"\n );\n\n if (!isValidPassword) {\n return reply.status(401).send({\n success: false,\n error: \"Invalid credentials\",\n });\n }\n\n const tenantLinks = await this.userTenantLinkStore.getTenantsByUser(user.id);\n \n // Scope the token to the tenant when the user has exactly one, so\n // tenant-scoped endpoints (e.g. A2A key management) can authorize without\n // a separate select-tenant round trip. Multi-tenant users still receive a\n // user-only token and must select a tenant.\n const singleTenantId =\n tenantLinks.length === 1 ? tenantLinks[0].tenantId : undefined;\n const token = await this.generateToken(user.id, singleTenantId);\n\n return {\n success: true,\n data: {\n user: {\n id: user.id,\n email: user.email,\n name: user.name,\n status: user.status,\n },\n tenants: tenantLinks.map(link => ({\n id: link.tenantId,\n role: link.role,\n })),\n token,\n requiresTenantSelection: tenantLinks.length > 1,\n hasTenants: tenantLinks.length > 0,\n },\n };\n } catch (error) {\n console.error(\"Login error:\", error);\n return reply.status(500).send({\n success: false,\n error: \"Login failed\",\n });\n }\n }\n\n async getUserTenants(\n request: FastifyRequest,\n reply: FastifyReply\n ) {\n const userId = (request as any).user?.id;\n \n if (!userId) {\n return reply.status(401).send({\n success: false,\n error: \"Unauthorized\",\n });\n }\n\n try {\n const links = await this.userTenantLinkStore.getTenantsByUser(userId);\n \n const tenantsWithDetails = await Promise.all(\n links.map(async (link) => {\n const tenant = await this.tenantStore.getTenantById(link.tenantId);\n return {\n ...link,\n tenant: tenant || null,\n };\n })\n );\n\n return {\n success: true,\n data: tenantsWithDetails,\n };\n } catch (error) {\n console.error(\"Get user tenants error:\", error);\n return reply.status(500).send({\n success: false,\n error: \"Failed to get user tenants\",\n });\n }\n }\n\n async selectTenant(\n request: FastifyRequest<{ Body: SelectTenantRequest }>,\n reply: FastifyReply\n ) {\n const userId = (request as any).user?.id;\n const { tenantId } = request.body;\n\n if (!userId) {\n return reply.status(401).send({\n success: false,\n error: \"Unauthorized\",\n });\n }\n\n try {\n const hasLink = await this.userTenantLinkStore.hasLink(userId, tenantId);\n \n if (!hasLink) {\n return reply.status(403).send({\n success: false,\n error: \"You do not have access to this tenant\",\n });\n }\n\n const tenant = await this.tenantStore.getTenantById(tenantId);\n \n if (!tenant) {\n return reply.status(404).send({\n success: false,\n error: \"Tenant not found\",\n });\n }\n\n const token = await this.generateToken(userId, tenantId);\n\n // Check for personal assistant in this tenant\n const link = await this.userTenantLinkStore.getLink(userId, tenantId);\n const linkMeta = (link?.metadata || {}) as Record<string, unknown>;\n\n let personalAssistant = null;\n if (linkMeta.personalAssistantId) {\n const assistantStore = getStoreLattice(\"default\", \"assistant\").store;\n const exists = await assistantStore.hasAssistant(tenantId, linkMeta.personalAssistantId as string);\n if (exists) {\n personalAssistant = {\n assistantId: linkMeta.personalAssistantId as string,\n projectId: linkMeta.personalProjectId as string || \"default\",\n workspaceId: linkMeta.personalWorkspaceId as string || \"default\",\n };\n }\n }\n\n return {\n success: true,\n data: {\n tenant,\n token,\n personalAssistant,\n },\n };\n } catch (error) {\n console.error(\"Select tenant error:\", error);\n return reply.status(500).send({\n success: false,\n error: \"Failed to select tenant\",\n });\n }\n }\n\n async approveUser(\n request: FastifyRequest<{ Body: ApproveUserRequest }>,\n reply: FastifyReply\n ) {\n const { userId, approved } = request.body;\n\n try {\n const user = await this.userStore.getUserById(userId);\n if (!user) {\n return reply.status(404).send({\n success: false,\n error: \"User not found\",\n });\n }\n\n if (user.status !== \"pending\") {\n return reply.status(400).send({\n success: false,\n error: `User is already ${user.status}`,\n });\n }\n\n const updatedUser = await this.userStore.updateUser(userId, {\n status: approved ? \"active\" : \"suspended\",\n });\n\n return {\n success: true,\n data: updatedUser,\n };\n } catch (error) {\n console.error(\"Approval error:\", error);\n return reply.status(500).send({\n success: false,\n error: \"Approval failed\",\n });\n }\n }\n\n async listPendingUsers(\n request: FastifyRequest,\n reply: FastifyReply\n ) {\n try {\n const users = await this.userStore.getAllUsers();\n const pendingUsers = users.filter((u) => u.status === \"pending\");\n\n return {\n success: true,\n data: pendingUsers,\n };\n } catch (error) {\n console.error(\"List pending users error:\", error);\n return reply.status(500).send({\n success: false,\n error: \"Failed to list pending users\",\n });\n }\n }\n\n async assignTenant(\n request: FastifyRequest<{ Body: AssignTenantRequest }>,\n reply: FastifyReply\n ) {\n const { userId, tenantId, role = \"member\" } = request.body;\n\n try {\n const user = await this.userStore.getUserById(userId);\n if (!user) {\n return reply.status(404).send({\n success: false,\n error: \"User not found\",\n });\n }\n\n const tenant = await this.tenantStore.getTenantById(tenantId);\n if (!tenant) {\n return reply.status(404).send({\n success: false,\n error: \"Tenant not found\",\n });\n }\n\n const link = await this.userTenantLinkStore.createLink({\n userId,\n tenantId,\n role,\n });\n\n return {\n success: true,\n data: link,\n };\n } catch (error) {\n console.error(\"Assign tenant error:\", error);\n return reply.status(500).send({\n success: false,\n error: \"Failed to assign tenant\",\n });\n }\n }\n\n private async hashPassword(password: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(password + \"salt\");\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n }\n\n private async verifyPassword(password: string, hash: string): Promise<boolean> {\n const hashedPassword = await this.hashPassword(password);\n return hashedPassword === hash;\n }\n\n private async generateToken(userId: string, tenantId?: string): Promise<string> {\n if (!this.config.jwtSecret) {\n throw new Error(\"AUTH_TOKEN_SECRET is required to issue console sessions\");\n }\n const payload: ConsoleSessionPayload = {\n userId,\n exp: Date.now() + this.config.tokenExpiration * 1000,\n };\n if (tenantId) {\n payload.tenantId = tenantId;\n }\n return createConsoleSessionToken(payload, this.config.jwtSecret);\n }\n\n async changePassword(\n request: FastifyRequest<{ Body: ChangePasswordRequest }>,\n reply: FastifyReply\n ) {\n const userId = (request as any).user?.id;\n const { currentPassword, newPassword } = request.body;\n\n if (!userId) {\n return reply.status(401).send({\n success: false,\n error: \"Unauthorized\",\n });\n }\n\n try {\n const user = await this.userStore.getUserById(userId);\n if (!user) {\n return reply.status(404).send({\n success: false,\n error: \"User not found\",\n });\n }\n\n // Verify current password\n const isValidPassword = await this.verifyPassword(\n currentPassword,\n user.metadata?.passwordHash || \"\"\n );\n\n if (!isValidPassword) {\n return reply.status(401).send({\n success: false,\n error: \"Current password is incorrect\",\n });\n }\n\n // Validate new password length\n if (newPassword.length < 6) {\n return reply.status(400).send({\n success: false,\n error: \"New password must be at least 6 characters\",\n });\n }\n\n // Update password\n await this.userStore.updateUser(userId, {\n metadata: {\n ...user.metadata,\n passwordHash: await this.hashPassword(newPassword),\n },\n });\n\n return reply.send({\n success: true,\n message: \"Password changed successfully\",\n });\n } catch (error) {\n console.error(\"Change password error:\", error);\n return reply.status(500).send({\n success: false,\n error: \"Failed to change password\",\n });\n }\n }\n}\n\n/**\n * Resolve the console session signing secret.\n *\n * Preference order:\n * 1. `AUTH_TOKEN_SECRET`\n * 2. `JWT_SECRET` (legacy alias, kept so pre-existing configurations keep working)\n * 3. an in-process random fallback so console login always works out of the box\n * (tokens stay unforgeable since the fallback is never a known constant)\n *\n * @remarks\n * - The in-process fallback is regenerated on every restart, so sessions issued\n * before a restart are invalidated. This is acceptable for local/dev/example\n * deployments but NOT for production or multi-replica gateways: set a stable\n * `AUTH_TOKEN_SECRET` (or legacy `JWT_SECRET`) there, otherwise tokens signed\n * by one replica will not verify on another and restarts sign out every user.\n *\n * @param authRequired - retained for API stability; behavior is identical for\n * both modes because login must always be possible\n * @returns the secret to use (never undefined)\n */\nexport function resolveConsoleTokenSecret(_authRequired?: boolean): string {\n const configured = process.env.AUTH_TOKEN_SECRET || process.env.JWT_SECRET;\n if (configured) return configured;\n devSessionSecret ??= randomBytes(32).toString(\"hex\");\n console.warn(\n \"[auth] AUTH_TOKEN_SECRET/JWT_SECRET is not set; using an in-process generated signing secret \" +\n \"(sessions are invalidated on restart). Set AUTH_TOKEN_SECRET for production.\",\n );\n return devSessionSecret;\n}\n\nlet devSessionSecret: string | undefined;\n\n/** Create an HMAC-SHA256 signed console session token. */\nexport function createConsoleSessionToken(\n payload: ConsoleSessionPayload,\n secret: string,\n): string {\n const encodedPayload = Buffer.from(JSON.stringify(payload)).toString(\"base64url\");\n const signature = createHmac(\"sha256\", secret)\n .update(encodedPayload)\n .digest(\"base64url\");\n return `${encodedPayload}.${signature}`;\n}\n\nfunction isConsoleSessionPayload(value: unknown): value is ConsoleSessionPayload {\n if (typeof value !== \"object\" || value === null) return false;\n const payload = value as Record<string, unknown>;\n return (\n typeof payload.userId === \"string\" &&\n payload.userId.length > 0 &&\n typeof payload.exp === \"number\" &&\n (payload.tenantId === undefined || typeof payload.tenantId === \"string\")\n );\n}\n\n/** Verify a signed Bearer console session and return its request identity. */\nexport function extractUserFromAuthHeader(\n authHeader: string | undefined,\n secret?: string,\n): { id: string; tenantId?: string } | undefined {\n if (!secret || !authHeader?.startsWith(\"Bearer \")) return undefined;\n const token = authHeader.substring(7);\n const parts = token.split(\".\");\n if (parts.length !== 2) return undefined;\n const [encodedPayload, encodedSignature] = parts;\n if (!/^[A-Za-z0-9_-]{43}$/.test(encodedSignature)) return undefined;\n try {\n const actualSignature = Buffer.from(encodedSignature, \"base64url\");\n if (actualSignature.toString(\"base64url\") !== encodedSignature) return undefined;\n const expectedSignature = createHmac(\"sha256\", secret)\n .update(encodedPayload)\n .digest();\n if (\n actualSignature.length !== expectedSignature.length ||\n !timingSafeEqual(actualSignature, expectedSignature)\n ) {\n return undefined;\n }\n const payload: unknown = JSON.parse(\n Buffer.from(encodedPayload, \"base64url\").toString(\"utf8\"),\n );\n if (!isConsoleSessionPayload(payload) || payload.exp < Date.now()) {\n return undefined;\n }\n return {\n id: payload.userId,\n tenantId: payload.tenantId,\n };\n } catch {\n return undefined;\n }\n}\n\nconst PUBLIC_ROUTES = [\"/api/auth/login\", \"/api/auth/register\", \"/health\", \"/api/stt/models\"];\n\nfunction bypassesConsoleAuth(request: FastifyRequest): boolean {\n const path = request.url.split(\"?\")[0];\n const method = request.method;\n if (\n (method === \"GET\" && /^\\/api\\/web-apps\\/[^/]+\\/runtime\\/bootstrap$/.test(path))\n || ((method === \"GET\" || method === \"POST\")\n && /^\\/api\\/web-apps\\/[^/]+\\/runtime\\/threads$/.test(path))\n || ((method === \"PATCH\" || method === \"DELETE\")\n && /^\\/api\\/web-apps\\/[^/]+\\/runtime\\/threads\\/[^/]+$/.test(path))\n || (method === \"GET\"\n && /^\\/api\\/web-apps\\/[^/]+\\/runtime\\/threads\\/[^/]+\\/messages$/.test(path))\n || (method === \"POST\"\n && /^\\/api\\/web-apps\\/[^/]+\\/runtime\\/threads\\/[^/]+\\/(messages\\/stream|abort|attachments)$/.test(path))\n || (method === \"POST\"\n && /^\\/api\\/web-apps\\/[^/]+\\/runtime\\/threads\\/[^/]+\\/interrupts\\/[^/]+\\/resume$/.test(path))\n ) return true;\n if (\n request.method === \"GET\" &&\n /^\\/api\\/a2a\\/agents\\/[^/]+\\/\\.well-known\\/agent-card\\.json$/.test(path)\n ) {\n return true;\n }\n return (\n request.method === \"POST\" &&\n /^\\/api\\/a2a\\/agents\\/[^/]+\\/jsonrpc$/.test(path)\n );\n}\n\n/** Register console session extraction and required-auth enforcement. */\nexport function registerConsoleAuthHook(\n app: FastifyInstance,\n options: ConsoleAuthHookOptions,\n): void {\n app.addHook(\"preHandler\", async (request, reply) => {\n // Resolve the secret lazily per request. The gateway module may be imported\n // before application code loads its environment (e.g. dotenv/loadLocalEnv),\n // so resolving at registration time would freeze an in-process random secret\n // and break tokens issued later by login with the configured secret.\n const secret = options.tokenSecret ?? resolveConsoleTokenSecret(options.authRequired);\n const user = extractUserFromAuthHeader(request.headers.authorization, secret);\n if (user) {\n (request as unknown as { user?: typeof user }).user = user;\n }\n\n // Task 6 runtime remains active-only. Console identity is retained so a\n // later internal preview route can authorize drafts without changing extraction.\n if (bypassesConsoleAuth(request)) return;\n if (user) return;\n\n if (!options.authRequired || request.method === \"OPTIONS\") return;\n if (PUBLIC_ROUTES.some((route) => request.url === route)) return;\n if (request.url.startsWith(\"/s/\")) return;\n\n const path = request.url.split(\"?\")[0];\n if (\n path.includes(\"/viewfile\") ||\n path.includes(\"/downloadfile\") ||\n path.includes(\"/uploadfile\") ||\n path.startsWith(\"/f/\") ||\n path === \"/f\"\n ) {\n return;\n }\n\n await reply.status(401).send({\n success: false,\n error: \"Unauthorized - Missing or invalid token\",\n });\n });\n}\n\nexport function registerAuthRoutes(\n app: FastifyInstance,\n config?: Partial<AuthConfig>\n) {\n const controller = new AuthController(config);\n\n const authHook = async (request: FastifyRequest, reply: FastifyReply) => {\n const user = extractUserFromAuthHeader(\n request.headers.authorization,\n config?.jwtSecret,\n );\n if (!user) {\n return reply.status(401).send({\n success: false,\n error: \"Unauthorized\",\n });\n }\n (request as any).user = user;\n };\n\n app.post(\"/api/auth/register\", controller.register.bind(controller));\n app.post(\"/api/auth/login\", controller.login.bind(controller));\n app.get(\"/api/auth/tenants\", { preHandler: authHook }, (req, res) => controller.getUserTenants(req, res));\n app.post(\"/api/auth/select-tenant\", { preHandler: authHook }, (req, res) => controller.selectTenant(req as any, res));\n app.post(\"/api/auth/approve\", { preHandler: authHook }, (req, res) => controller.approveUser(req as any, res));\n app.get(\"/api/auth/pending\", { preHandler: authHook }, (req, res) => controller.listPendingUsers(req, res));\n app.post(\"/api/auth/assign-tenant\", { preHandler: authHook }, (req, res) => controller.assignTenant(req as any, res));\n app.post(\"/api/auth/change-password\", { preHandler: authHook }, \n (req, res) => controller.changePassword(req as any, res)\n );\n}\n","import { z } from \"zod\";\nimport type {\n ChannelAdapter,\n InboundMessage,\n OutboundMessage,\n ReplyTarget,\n ChannelInstallation,\n} from \"@axiom-lattice/protocols\";\nimport type { LarkChannelInstallationConfig } from \"@axiom-lattice/protocols\";\nimport { parseLarkMessageEvent } from \"./parser\";\nimport { Logger } from \"../../logger/Logger\";\nimport * as Lark from \"@larksuiteoapi/node-sdk\";\n\nconst logger = new Logger({ serviceName: \"lattice/gateway/lark\" });\n\n// ─── WS connection state ──────────────────────────────────────────────────\n\nconst activeConnections = new Map<string, Lark.WSClient>();\n\n// ─── WS message parsing (shared with lark-ws) ─────────────────────────────\n\ninterface LarkWSMessageEvent {\n sender?: { sender_id?: { open_id?: string } };\n message?: {\n message_id?: string;\n chat_id?: string;\n chat_type?: string;\n message_type?: string;\n content?: string;\n };\n}\n\nfunction parseTextContent(content: string | undefined): string | null {\n if (!content) return null;\n try {\n const parsed = JSON.parse(content) as { text?: string };\n return typeof parsed.text === \"string\" ? parsed.text : null;\n } catch { return null; }\n}\n\nfunction normalizeChatType(chatType: string | undefined): \"direct\" | \"group\" {\n return chatType === \"p2p\" ? \"direct\" : \"group\";\n}\n\nfunction wsEventToInbound(\n event: LarkWSMessageEvent,\n installationId: string,\n tenantId: string,\n): InboundMessage | null {\n const messageId = event.message?.message_id;\n const chatId = event.message?.chat_id;\n const openId = event.sender?.sender_id?.open_id;\n if (!messageId || !chatId || !openId) return null;\n if (event.message?.message_type !== \"text\") return null;\n\n const text = parseTextContent(event.message.content);\n if (!text) return null;\n\n const chatType = normalizeChatType(event.message.chat_type);\n return {\n channel: \"lark\",\n channelInstallationId: installationId,\n tenantId,\n sender: { id: openId, displayName: undefined },\n content: { text, metadata: { chatId, chatType, messageId } },\n conversation: { id: chatId, type: chatType },\n replyTarget: {\n adapterChannel: \"lark\",\n channelInstallationId: installationId,\n rawTarget: { chatId, messageId, chatType },\n },\n };\n}\n\n// ─── Adapter ──────────────────────────────────────────────────────────────\n\nexport const larkConfigSchema = z.object({\n appId: z.string(),\n appSecret: z.string(),\n verificationToken: z.string().optional(),\n encryptKey: z.string().optional(),\n});\n\nexport const larkChannelAdapter: ChannelAdapter<LarkChannelInstallationConfig> = {\n channel: \"lark\",\n\n configSchema: larkConfigSchema,\n\n async receive(\n rawPayload: unknown,\n installation: ChannelInstallation<LarkChannelInstallationConfig>,\n ): Promise<InboundMessage | null> {\n const event = parseLarkMessageEvent(rawPayload);\n if (!event) return null;\n\n return {\n channel: \"lark\",\n channelInstallationId: installation.id,\n tenantId: installation.tenantId,\n sender: { id: event.openId, displayName: undefined },\n content: {\n text: event.text,\n metadata: { chatId: event.chatId, chatType: event.chatType, messageId: event.messageId },\n },\n conversation: { id: event.chatId, type: event.chatType },\n replyTarget: {\n adapterChannel: \"lark\",\n channelInstallationId: installation.id,\n rawTarget: { chatId: event.chatId, messageId: event.messageId, chatType: event.chatType },\n },\n };\n },\n\n async sendReply(\n replyTarget: ReplyTarget,\n message: OutboundMessage,\n installation: ChannelInstallation<LarkChannelInstallationConfig>,\n ): Promise<void> {\n const { createLarkSender } = await import(\"./sender\");\n const sender = await createLarkSender(installation.config);\n await sender.sendTextReply({\n chatId: replyTarget.rawTarget.chatId as string,\n text: message.text,\n });\n },\n\n resolveThreadId(message: InboundMessage, binding: unknown): string {\n const date = new Date().toISOString().split(\"T\")[0];\n const chatType = message.conversation?.type === \"direct\" ? \"dm\" : \"group\";\n const agentId = (binding as { agentId: string }).agentId;\n if (chatType === \"dm\") {\n return `lark:dm:${message.sender.id}:${agentId}:${date}`;\n }\n return `lark:group:${message.conversation?.id ?? \"unknown\"}:${agentId}:${date}`;\n },\n\n async connect(\n installation: ChannelInstallation<LarkChannelInstallationConfig>,\n deps?: unknown,\n ): Promise<void> {\n const { id: installationId, tenantId, config } = installation;\n\n if (!config.appId || !config.appSecret) {\n logger.warn(\"Lark installation missing credentials, skipping\", { installationId });\n return;\n }\n\n if (activeConnections.has(installationId)) {\n logger.warn(\"Lark WS already connected for installation, skipping\", { installationId });\n return;\n }\n\n logger.info(\"Lark WS client starting\", { installationId, tenantId });\n\n const router = (deps as { router?: { dispatch(msg: InboundMessage): Promise<unknown> } })?.router;\n\n const eventDispatcher = new Lark.EventDispatcher({}).register({\n \"im.message.receive_v1\": async (data: LarkWSMessageEvent) => {\n try {\n const inbound = wsEventToInbound(data, installationId, tenantId);\n if (!inbound) return;\n\n logger.info(\"Lark WS message received\", {\n installationId,\n senderId: inbound.sender.id,\n chatId: data.message?.chat_id,\n });\n\n if (router) {\n const result = await router.dispatch(inbound);\n if (!(result as { success?: boolean }).success) {\n logger.warn(\"Lark WS dispatch failed\", {\n installationId,\n error: (result as { error?: { message?: string } }).error?.message,\n });\n }\n }\n } catch (err) {\n logger.error(\"Lark WS event handler error\", {\n installationId,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n },\n });\n\n const client = new Lark.WSClient({\n appId: config.appId,\n appSecret: config.appSecret,\n loggerLevel: Lark.LoggerLevel.info,\n });\n\n await client.start({ eventDispatcher });\n activeConnections.set(installationId, client);\n logger.info(\"Lark WS client connected\", { installationId });\n },\n\n async disconnect(installationId: string): Promise<void> {\n const client = activeConnections.get(installationId);\n if (!client) {\n logger.warn(\"Lark WS not connected, nothing to disconnect\", { installationId });\n return;\n }\n\n logger.info(\"Lark WS client disconnecting\", { installationId });\n try {\n client.close({ force: true });\n } catch (err) {\n logger.error(\"Lark WS client stop error\", {\n installationId,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n activeConnections.delete(installationId);\n logger.info(\"Lark WS client disconnected\", { installationId });\n },\n};\n","import type { ParsedLarkMessageEvent } from \"./types\";\n\ninterface RawLarkPayload {\n header?: {\n event_type?: string;\n };\n event?: {\n sender?: {\n sender_id?: {\n open_id?: string;\n };\n };\n message?: {\n message_id?: string;\n chat_id?: string;\n chat_type?: string;\n message_type?: string;\n content?: string;\n };\n };\n}\n\nexport function parseLarkMessageEvent(\n payload: unknown,\n): ParsedLarkMessageEvent | null {\n const raw = payload as RawLarkPayload;\n\n if (raw.header?.event_type !== \"im.message.receive_v1\") {\n return null;\n }\n\n const message = raw.event?.message;\n const openId = raw.event?.sender?.sender_id?.open_id;\n\n if (!message || !openId || message.message_type !== \"text\") {\n return null;\n }\n\n const parsedContent = parseLarkTextContent(message.content);\n if (!message.message_id || !message.chat_id || !parsedContent) {\n return null;\n }\n\n return {\n messageId: message.message_id,\n openId,\n chatId: message.chat_id,\n chatType: normalizeChatType(message.chat_type),\n text: parsedContent,\n };\n}\n\nfunction parseLarkTextContent(content: string | undefined): string | null {\n if (!content) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(content) as { text?: string };\n return typeof parsed.text === \"string\" ? parsed.text : null;\n } catch {\n return null;\n }\n}\n\nfunction normalizeChatType(chatType: string | undefined): \"direct\" | \"group\" {\n return chatType === \"p2p\" ? \"direct\" : \"group\";\n}\n","import crypto from \"crypto\";\nimport type { LarkUrlVerificationPayload } from \"./types\";\n\nexport function parseLarkRequestBody(\n body: unknown,\n encryptKey?: string,\n): LarkUrlVerificationPayload {\n const parsed = (body || {}) as LarkUrlVerificationPayload;\n\n if (encryptKey && typeof parsed.encrypt === \"string\") {\n return decryptLarkPayload(encryptKey, parsed.encrypt);\n }\n\n return parsed;\n}\n\nexport function decryptLarkPayload(\n encryptKey: string,\n encryptedPayload: string,\n): LarkUrlVerificationPayload {\n const key = crypto.createHash(\"sha256\").update(encryptKey).digest();\n const buffer = Buffer.from(encryptedPayload, \"base64\");\n const iv = buffer.subarray(0, 16);\n const ciphertext = buffer.subarray(16);\n const decipher = crypto.createDecipheriv(\"aes-256-cbc\", key, iv);\n const plaintext = Buffer.concat([\n decipher.update(ciphertext),\n decipher.final(),\n ]).toString(\"utf8\");\n\n return JSON.parse(plaintext) as LarkUrlVerificationPayload;\n}\n","import type { FastifyReply, FastifyRequest } from \"fastify\";\nimport type { ChannelInstallation, ChannelInstallationStore, LarkChannelInstallationConfig } from \"@axiom-lattice/protocols\";\nimport { larkChannelAdapter } from \"./LarkChannelAdapter\";\nimport type { MessageRouter } from \"../../router/MessageRouter\";\nimport { parseLarkRequestBody } from \"./verification\";\nimport { Logger } from \"../../logger/Logger\";\n\nconst logger = new Logger({ serviceName: \"lattice/gateway/lark\" });\n\nexport function createLarkEventHandler(deps: {\n installationStore: ChannelInstallationStore;\n router: MessageRouter;\n}) {\n return async function handleLarkEvent(\n request: FastifyRequest,\n reply: FastifyReply,\n ): Promise<void> {\n const { installationId } = request.params as { installationId: string };\n\n const installation = await deps.installationStore.getInstallationById(installationId);\n if (!installation || installation.channel !== \"lark\") {\n reply.status(404).send({ success: false, message: \"Installation not found\" });\n return;\n }\n\n const larkInstallation = installation as ChannelInstallation<LarkChannelInstallationConfig>;\n const body = parseLarkRequestBody(request.body, larkInstallation.config.encryptKey);\n\n if (body.type === \"url_verification\" && body.challenge) {\n reply.status(200).send({ challenge: body.challenge });\n return;\n }\n\n const inboundMessage = await larkChannelAdapter.receive(request.body, larkInstallation);\n if (!inboundMessage) {\n reply.status(200).send();\n return;\n }\n\n deps.router.dispatch(inboundMessage).catch((error) => {\n logger.error(\"Lark message dispatch error\", {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n\n reply.status(200).send();\n };\n}\n","import type { FastifyInstance } from \"fastify\";\nimport { createLarkEventHandler } from \"./controller\";\nimport type { MessageRouter } from \"../../router/MessageRouter\";\nimport type { ChannelInstallationStore } from \"@axiom-lattice/protocols\";\n\nexport function registerLarkChannelRoutes(\n app: FastifyInstance,\n deps: {\n installationStore: ChannelInstallationStore;\n router: MessageRouter;\n },\n): void {\n const handler = createLarkEventHandler({\n installationStore: deps.installationStore,\n router: deps.router,\n });\n\n app.post(\n \"/api/channels/lark/installations/:installationId/events\",\n handler,\n );\n}\n","import type { FastifyReply, FastifyRequest } from \"fastify\";\nimport { getQrCode, getQrCodeStatus } from \"./wechat-client\";\nimport type { QrSession } from \"./types\";\n\nconst qrSessions = new Map<string, QrSession>();\nconst SESSION_TTL_MS = 5 * 60 * 1000; // 5 minutes\n\nfunction cleanupExpiredSessions(): void {\n const now = Date.now();\n for (const [key, session] of qrSessions) {\n if (now - session.createdAt > SESSION_TTL_MS) {\n qrSessions.delete(key);\n }\n }\n}\n\nexport async function handleGetQrCode(\n _request: FastifyRequest,\n reply: FastifyReply,\n): Promise<void> {\n try {\n cleanupExpiredSessions();\n const { qrcode, qrcodeImgUrl } = await getQrCode();\n qrSessions.set(qrcode, { qrcode, createdAt: Date.now() });\n reply.send({ success: true, data: { qrcode, qrcodeImgUrl } });\n } catch (err) {\n reply.status(500).send({\n success: false,\n message: err instanceof Error ? err.message : \"Failed to get QR code\",\n });\n }\n}\n\nexport async function handleGetQrCodeStatus(\n request: FastifyRequest,\n reply: FastifyReply,\n): Promise<void> {\n const { qrcode } = request.query as { qrcode?: string };\n if (!qrcode) {\n reply.status(400).send({ success: false, message: \"qrcode is required\" });\n return;\n }\n\n const session = qrSessions.get(qrcode);\n if (!session) {\n reply.status(404).send({ success: false, message: \"Session not found or expired\" });\n return;\n }\n\n try {\n const result = await getQrCodeStatus(qrcode);\n reply.send({ success: true, data: result });\n } catch (err) {\n reply.status(500).send({\n success: false,\n message: err instanceof Error ? err.message : \"Failed to check QR status\",\n });\n }\n}\n","import type { FastifyInstance } from \"fastify\";\nimport { handleGetQrCode, handleGetQrCodeStatus } from \"./controller\";\n\nexport function registerWechatChannelRoutes(app: FastifyInstance): void {\n app.get(\"/api/channels/wechat/setup/qrcode\", handleGetQrCode);\n app.get(\"/api/channels/wechat/setup/status\", handleGetQrCodeStatus);\n}\n","import type { FastifyInstance } from \"fastify\";\nimport { registerLarkChannelRoutes } from \"./lark/routes\";\nimport { registerWechatChannelRoutes } from \"./wechat/routes\";\nimport type { MessageRouter } from \"../router/MessageRouter\";\nimport type { ChannelInstallationStore } from \"@axiom-lattice/protocols\";\n\ninterface ChannelRouteDependencies {\n router: MessageRouter;\n installationStore: ChannelInstallationStore;\n}\n\ntype ChannelRouteRegistrar = (\n app: FastifyInstance,\n dependencies: ChannelRouteDependencies,\n) => void;\n\nconst channelRouteRegistrars: ChannelRouteRegistrar[] = [\n (app, deps) => registerLarkChannelRoutes(app, deps),\n (app, _deps) => registerWechatChannelRoutes(app),\n];\n\nexport function registerChannelRoutes(\n app: FastifyInstance,\n dependencies?: ChannelRouteDependencies,\n): void {\n if (!dependencies) return;\n for (const registerRoutes of channelRouteRegistrars) {\n registerRoutes(app, dependencies);\n }\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { randomUUID } from \"crypto\";\nimport {\n ChannelInstallationStore,\n ChannelInstallation,\n CreateChannelInstallationRequest,\n UpdateChannelInstallationRequest,\n ChannelInstallationType,\n} from \"@axiom-lattice/protocols\";\nimport type { ChannelAdapterRegistry } from \"../channels/registry\";\n\n/**\n * Controller-scoped deps for channel lifecycle management.\n * Set by the gateway during route registration so that\n * enable/disable/deletion can start/stop live connections.\n */\nlet _adapterRegistry: ChannelAdapterRegistry | undefined;\nlet _router: { dispatch(msg: unknown): Promise<unknown> } | undefined;\n\nexport function setChannelControllerDeps(deps: {\n adapterRegistry: ChannelAdapterRegistry;\n router: { dispatch(msg: unknown): Promise<unknown> };\n}): void {\n _adapterRegistry = deps.adapterRegistry;\n _router = deps.router;\n}\n\n/**\n * Channel Installation Controller\n * Handles channel installation CRUD operations for Lark/Feishu and future channels\n * All operations are scoped to a tenant ID\n */\n\n/**\n * Get tenant ID from authenticated user context\n * Falls back to request headers for backward compatibility\n */\nfunction getTenantId(request: FastifyRequest): string {\n // First try to get from authenticated user context\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) {\n return userTenantId;\n }\n\n // Fallback to request headers for backward compatibility\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\n/**\n * Channel installation list response\n */\ninterface ChannelInstallationListResponse {\n success: boolean;\n message: string;\n data: {\n records: ChannelInstallation[];\n total: number;\n };\n}\n\n/**\n * Channel installation response\n */\ninterface ChannelInstallationResponse {\n success: boolean;\n message: string;\n data?: ChannelInstallation;\n}\n\nfunction snapshotPlainObject(value: unknown): Record<string, unknown> | null {\n try {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return null;\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) return null;\n\n const snapshot: Record<string, unknown> = {};\n for (const [key, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(value))) {\n if (!descriptor.enumerable) continue;\n if (!(\"value\" in descriptor)) return null;\n snapshot[key] = descriptor.value;\n }\n return snapshot;\n } catch {\n return null;\n }\n}\n\n/**\n * Get channel installation store\n */\nasync function getInstallationStore(): Promise<ChannelInstallationStore> {\n // Use registered store from StoreLatticeManager (supports both PG and in-memory)\n const { getStoreLattice } = await import(\"@axiom-lattice/core\");\n const store = getStoreLattice(\"default\", \"channelInstallation\").store as ChannelInstallationStore | undefined;\n if (store) return store;\n\n // Fallback: create PG store directly (legacy path)\n const { PostgreSQLChannelInstallationStore } = await import(\"@axiom-lattice/pg-stores\");\n const databaseUrl = process.env.DATABASE_URL;\n if (!databaseUrl) {\n throw new Error(\"DATABASE_URL is required for channel installation store\");\n }\n return new PostgreSQLChannelInstallationStore({\n poolConfig: databaseUrl,\n });\n}\n\n/**\n * Get all channel installations for a tenant\n */\nexport async function getChannelInstallationList(\n request: FastifyRequest<{\n Querystring: { channel?: ChannelInstallationType };\n }>,\n reply: FastifyReply,\n): Promise<ChannelInstallationListResponse> {\n const tenantId = getTenantId(request);\n const { channel } = request.query;\n\n try {\n const store = await getInstallationStore();\n const installations = await store.getInstallationsByTenant(tenantId, channel);\n\n return {\n success: true,\n message: \"Channel installations retrieved successfully\",\n data: {\n records: installations,\n total: installations.length,\n },\n };\n } catch (error) {\n console.error(\"Failed to get channel installations:\", error);\n return {\n success: false,\n message: \"Failed to retrieve channel installations\",\n data: {\n records: [],\n total: 0,\n },\n };\n }\n}\n\n/**\n * Get a single channel installation by ID\n */\nexport async function getChannelInstallation(\n request: FastifyRequest<{\n Params: { installationId: string };\n }>,\n reply: FastifyReply,\n): Promise<ChannelInstallationResponse> {\n const tenantId = getTenantId(request);\n const { installationId } = request.params;\n\n try {\n const store = await getInstallationStore();\n const installation = await store.getInstallationById(installationId);\n\n if (!installation) {\n reply.code(404);\n return {\n success: false,\n message: \"Channel installation not found\",\n };\n }\n\n // Verify tenant access\n if (installation.tenantId !== tenantId) {\n reply.code(403);\n return {\n success: false,\n message: \"Access denied\",\n };\n }\n\n return {\n success: true,\n message: \"Channel installation retrieved successfully\",\n data: installation,\n };\n } catch (error) {\n console.error(\"Failed to get channel installation:\", error);\n return {\n success: false,\n message: \"Failed to retrieve channel installation\",\n };\n }\n}\n\n/**\n * Create new channel installation\n */\nexport async function createChannelInstallation(\n request: FastifyRequest<{\n Body: CreateChannelInstallationRequest;\n }>,\n reply: FastifyReply,\n): Promise<ChannelInstallationResponse> {\n const tenantId = getTenantId(request);\n const bodySnapshot = snapshotPlainObject(request.body);\n\n try {\n const allowedKeys = new Set([\n \"channel\",\n \"name\",\n \"config\",\n \"enabled\",\n \"fallbackAgentId\",\n \"rejectWhenNoBinding\",\n ]);\n if (!bodySnapshot || Object.keys(bodySnapshot).some((key) => !allowedKeys.has(key))) {\n reply.code(400);\n return {\n success: false,\n message: \"Invalid request body\",\n };\n }\n\n const body = bodySnapshot as unknown as CreateChannelInstallationRequest;\n\n // Validate required fields\n if (!body.channel) {\n reply.code(400);\n return {\n success: false,\n message: \"Channel type is required\",\n };\n }\n\n if (!body.config) {\n reply.code(400);\n return {\n success: false,\n message: \"Configuration is required\",\n };\n }\n\n // Validate Lark-specific config\n if (body.channel === \"lark\") {\n const larkConfig = body.config;\n if (!larkConfig.appId || !larkConfig.appSecret) {\n reply.code(400);\n return {\n success: false,\n message: \"appId and appSecret are required for Lark installations\",\n };\n }\n if (!larkConfig.assistantId) {\n reply.code(400);\n return {\n success: false,\n message: \"assistantId is required for Lark installations\",\n };\n }\n }\n\n const store = await getInstallationStore();\n const installationId = randomUUID();\n \n const installation = await store.createInstallation(\n tenantId,\n installationId,\n body,\n );\n\n // Start live connection for channels that need it (e.g. WeChat polling, Lark WS)\n if (body.enabled !== false && _adapterRegistry) {\n const adapter = _adapterRegistry.get(body.channel);\n if (adapter?.connect) {\n try {\n await adapter.connect(installation, { router: _router });\n } catch (err) {\n console.error(\"Failed to start channel connection after creation:\", err);\n }\n }\n }\n\n reply.code(201);\n return {\n success: true,\n message: \"Channel installation created successfully\",\n data: installation,\n };\n } catch (error: any) {\n console.error(\"Failed to create channel installation:\", error);\n \n // Check for duplicate key error\n const errorMessage = error.message?.toLowerCase();\n if (errorMessage?.includes(\"duplicate\") || errorMessage?.includes(\"unique constraint\") || error.code === \"23505\") {\n reply.code(409);\n return {\n success: false,\n message: \"Channel installation with this ID already exists\",\n };\n }\n\n return {\n success: false,\n message: \"Failed to create channel installation\",\n };\n }\n}\n\n/**\n * Update channel installation\n */\nexport async function updateChannelInstallation(\n request: FastifyRequest<{\n Params: { installationId: string };\n Body: UpdateChannelInstallationRequest;\n }>,\n reply: FastifyReply,\n): Promise<ChannelInstallationResponse> {\n const tenantId = getTenantId(request);\n const { installationId } = request.params;\n const body = request.body;\n\n try {\n const store = await getInstallationStore();\n\n // Verify installation exists and belongs to tenant\n const existing = await store.getInstallationById(installationId);\n if (!existing) {\n reply.code(404);\n return {\n success: false,\n message: \"Channel installation not found\",\n };\n }\n\n if (existing.tenantId !== tenantId) {\n reply.code(403);\n return {\n success: false,\n message: \"Access denied\",\n };\n }\n\n const installation = await store.updateInstallation(\n tenantId,\n installationId,\n body,\n );\n\n if (!installation) {\n reply.code(404);\n return {\n success: false,\n message: \"Channel installation not found\",\n };\n }\n\n // Handle enable/disable — start/stop live connections\n if (body.enabled !== undefined && body.enabled !== existing.enabled) {\n const adapter = _adapterRegistry?.get(existing.channel);\n if (body.enabled && adapter?.connect) {\n // Re-connect: pass router deps so the adapter can dispatch messages\n await adapter.connect(installation, { router: _router });\n } else if (!body.enabled && adapter?.disconnect) {\n await adapter.disconnect(installationId);\n }\n }\n\n return {\n success: true,\n message: \"Channel installation updated successfully\",\n data: installation,\n };\n } catch (error) {\n console.error(\"Failed to update channel installation:\", error);\n return {\n success: false,\n message: \"Failed to update channel installation\",\n };\n }\n}\n\n/**\n * Delete channel installation\n */\nexport async function deleteChannelInstallation(\n request: FastifyRequest<{\n Params: { installationId: string };\n }>,\n reply: FastifyReply,\n): Promise<{ success: boolean; message: string }> {\n const tenantId = getTenantId(request);\n const { installationId } = request.params;\n\n try {\n const store = await getInstallationStore();\n\n // Verify installation exists and belongs to tenant\n const existing = await store.getInstallationById(installationId);\n if (!existing) {\n reply.code(404);\n return {\n success: false,\n message: \"Channel installation not found\",\n };\n }\n\n if (existing.tenantId !== tenantId) {\n reply.code(403);\n return {\n success: false,\n message: \"Access denied\",\n };\n }\n\n // Disconnect live connection before removing from DB\n if (_adapterRegistry) {\n const adapter = _adapterRegistry.get(existing.channel);\n if (adapter?.disconnect) {\n try {\n await adapter.disconnect(installationId);\n } catch (err) {\n console.error(\"Failed to disconnect channel adapter:\", err);\n }\n }\n }\n\n const deleted = await store.deleteInstallation(tenantId, installationId);\n\n if (!deleted) {\n reply.code(404);\n return {\n success: false,\n message: \"Channel installation not found\",\n };\n }\n\n return {\n success: true,\n message: \"Channel installation deleted successfully\",\n };\n } catch (error) {\n console.error(\"Failed to delete channel installation:\", error);\n return {\n success: false,\n message: \"Failed to delete channel installation\",\n };\n }\n}\n","import { FastifyInstance } from \"fastify\";\nimport type { CreateChannelInstallationRequest } from \"@axiom-lattice/protocols\";\nimport * as channelInstallationController from \"../controllers/channel-installations\";\n\n/**\n * Register channel installation management routes\n */\nexport function registerChannelInstallationRoutes(app: FastifyInstance): void {\n // List all installations for current tenant\n app.get<{\n Querystring: { channel?: \"lark\" };\n }>(\"/api/channel-installations\", channelInstallationController.getChannelInstallationList);\n\n // Get single installation by ID\n app.get<{\n Params: { installationId: string };\n }>(\"/api/channel-installations/:installationId\", channelInstallationController.getChannelInstallation);\n\n // Create new installation\n app.post<{\n Body: CreateChannelInstallationRequest;\n }>(\"/api/channel-installations\", channelInstallationController.createChannelInstallation);\n\n // Update installation\n app.put<{\n Params: { installationId: string };\n Body: any;\n }>(\"/api/channel-installations/:installationId\", channelInstallationController.updateChannelInstallation);\n\n // Delete installation\n app.delete<{\n Params: { installationId: string };\n }>(\"/api/channel-installations/:installationId\", channelInstallationController.deleteChannelInstallation);\n}\n","import type { FastifyRequest, FastifyReply } from \"fastify\";\nimport type { CreateBindingInput } from \"@axiom-lattice/protocols\";\nimport { getBindingRegistry } from \"@axiom-lattice/core\";\n\nfunction getTenantId(request: FastifyRequest): string {\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) return userTenantId;\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\nexport async function getBindingList(\n request: FastifyRequest<{\n Querystring: {\n channel?: string;\n agentId?: string;\n channelInstallationId?: string;\n limit?: number;\n offset?: number;\n };\n }>,\n _reply: FastifyReply,\n) {\n const tenantId = getTenantId(request);\n const { channel, agentId, channelInstallationId, limit, offset } = request.query;\n try {\n const registry = getBindingRegistry();\n const bindings = await registry.list({ channel, agentId, tenantId, channelInstallationId, limit, offset });\n return { success: true, message: \"Bindings retrieved\", data: { records: bindings, total: bindings.length } };\n } catch (error) {\n console.error(\"Failed to get bindings:\", error);\n return { success: false, message: \"Failed to retrieve bindings\", data: { records: [], total: 0 } };\n }\n}\n\nexport async function getBinding(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply,\n) {\n const tenantId = getTenantId(request);\n try {\n const registry = getBindingRegistry();\n const bindings = await registry.list({ tenantId });\n const binding = bindings.find((b) => b.id === request.params.id);\n if (!binding || binding.tenantId !== tenantId) {\n reply.status(404);\n return { success: false, message: \"Binding not found\" };\n }\n return { success: true, message: \"Binding retrieved\", data: binding };\n } catch (error) {\n console.error(\"Failed to get binding:\", error);\n return { success: false, message: \"Failed to retrieve binding\" };\n }\n}\n\nexport async function createBinding(\n request: FastifyRequest<{ Body: CreateBindingInput }>,\n reply: FastifyReply,\n) {\n const tenantId = getTenantId(request);\n try {\n const registry = getBindingRegistry();\n const binding = await registry.create({ ...request.body, tenantId });\n reply.status(201);\n return { success: true, message: \"Binding created\", data: binding };\n } catch (error) {\n console.error(\"Failed to create binding:\", error);\n reply.status(500);\n return { success: false, message: \"Failed to create binding\" };\n }\n}\n\nexport async function updateBinding(\n request: FastifyRequest<{ Params: { id: string }; Body: Partial<CreateBindingInput & { enabled: boolean }> }>,\n reply: FastifyReply,\n) {\n try {\n const tenantId = getTenantId(request);\n const registry = getBindingRegistry();\n const bindings = await registry.list({ tenantId });\n const existing = bindings.find((b) => b.id === request.params.id);\n if (!existing || existing.tenantId !== tenantId) {\n reply.status(404);\n return { success: false, message: \"Binding not found\" };\n }\n const binding = await registry.update(request.params.id, request.body);\n return { success: true, message: \"Binding updated\", data: binding };\n } catch (error) {\n console.error(\"Failed to update binding:\", error);\n reply.status(500);\n return { success: false, message: \"Failed to update binding\" };\n }\n}\n\nexport async function deleteBinding(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply,\n) {\n try {\n const tenantId = getTenantId(request);\n const registry = getBindingRegistry();\n const bindings = await registry.list({ tenantId });\n const existing = bindings.find((b) => b.id === request.params.id);\n if (!existing || existing.tenantId !== tenantId) {\n reply.status(404);\n return { success: false, message: \"Binding not found\" };\n }\n await registry.delete(request.params.id);\n return { success: true, message: \"Binding deleted\" };\n } catch (error) {\n console.error(\"Failed to delete binding:\", error);\n reply.status(500);\n return { success: false, message: \"Failed to delete binding\" };\n }\n}\n\nexport async function resolveBinding(\n request: FastifyRequest<{\n Querystring: { channel: string; senderId: string; channelInstallationId: string };\n }>,\n _reply: FastifyReply,\n) {\n const tenantId = getTenantId(request);\n const { channel, senderId, channelInstallationId } = request.query;\n try {\n const registry = getBindingRegistry();\n const binding = await registry.resolve({ channel, senderId, channelInstallationId, tenantId });\n if (!binding) {\n return { success: false, message: \"No binding found\", data: null };\n }\n return { success: true, message: \"Binding found\", data: binding };\n } catch (error) {\n console.error(\"Failed to resolve binding:\", error);\n return { success: false, message: \"Failed to resolve binding\", data: null };\n }\n}\n","import type { FastifyInstance } from \"fastify\";\nimport * as bindingsController from \"../controllers/channel-bindings\";\n\nexport function registerChannelBindingRoutes(app: FastifyInstance): void {\n app.get(\"/api/channel-bindings\", bindingsController.getBindingList);\n app.get(\"/api/channel-bindings/resolve\", bindingsController.resolveBinding);\n app.post(\"/api/channel-bindings\", bindingsController.createBinding);\n app.get(\"/api/channel-bindings/:id\", bindingsController.getBinding);\n app.put(\"/api/channel-bindings/:id\", bindingsController.updateBinding);\n app.delete(\"/api/channel-bindings/:id\", bindingsController.deleteBinding);\n}\n","import type { FastifyRequest, FastifyReply } from \"fastify\";\nimport type { CreateMenuItemInput } from \"@axiom-lattice/protocols\";\nimport { getMenuRegistry } from \"@axiom-lattice/core\";\n\nfunction getTenantId(request: FastifyRequest): string {\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) return userTenantId;\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\nfunction errorMessage(err: unknown): string {\n return err instanceof Error ? err.message : \"Unexpected error\";\n}\n\nexport async function getMenuItemList(\n request: FastifyRequest<{\n Querystring: { menuTarget?: string };\n }>,\n _reply: FastifyReply,\n) {\n const tenantId = getTenantId(request);\n try {\n const registry = getMenuRegistry();\n const items = await registry.list({ tenantId, menuTarget: request.query.menuTarget as \"sidebar\" | \"workspace\" | undefined });\n return { success: true, message: \"Menu items retrieved\", data: { records: items, total: items.length } };\n } catch (error) {\n const msg = errorMessage(error);\n console.error(\"Failed to get menu items:\", msg);\n return { success: false, message: msg, data: { records: [], total: 0 } };\n }\n}\n\nexport async function getMenuItem(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply,\n) {\n const tenantId = getTenantId(request);\n try {\n const registry = getMenuRegistry();\n const item = await registry.getById(request.params.id);\n if (!item || item.tenantId !== tenantId) {\n reply.status(404);\n return { success: false, message: \"Menu item not found\" };\n }\n return { success: true, message: \"Menu item retrieved\", data: item };\n } catch (error) {\n const msg = errorMessage(error);\n console.error(\"Failed to get menu item:\", msg);\n reply.status(500);\n return { success: false, message: msg };\n }\n}\n\nexport async function createMenuItem(\n request: FastifyRequest<{ Body: CreateMenuItemInput }>,\n reply: FastifyReply,\n) {\n const tenantId = getTenantId(request);\n try {\n const registry = getMenuRegistry();\n const item = await registry.create({ ...request.body, tenantId });\n reply.status(201);\n return { success: true, message: \"Menu item created\", data: item };\n } catch (error) {\n const msg = errorMessage(error);\n console.error(\"Failed to create menu item:\", msg);\n reply.status(500);\n return { success: false, message: msg };\n }\n}\n\nexport async function updateMenuItem(\n request: FastifyRequest<{ Params: { id: string }; Body: Partial<CreateMenuItemInput & { enabled: boolean }> }>,\n reply: FastifyReply,\n) {\n try {\n const tenantId = getTenantId(request);\n const registry = getMenuRegistry();\n const existing = await registry.getById(request.params.id);\n if (!existing || existing.tenantId !== tenantId) {\n reply.status(404);\n return { success: false, message: \"Menu item not found\" };\n }\n const item = await registry.update(request.params.id, request.body);\n return { success: true, message: \"Menu item updated\", data: item };\n } catch (error) {\n const msg = errorMessage(error);\n console.error(\"Failed to update menu item:\", msg);\n reply.status(500);\n return { success: false, message: msg };\n }\n}\n\nexport async function deleteMenuItem(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply,\n) {\n try {\n const tenantId = getTenantId(request);\n const registry = getMenuRegistry();\n const existing = await registry.getById(request.params.id);\n if (!existing || existing.tenantId !== tenantId) {\n reply.status(404);\n return { success: false, message: \"Menu item not found\" };\n }\n await registry.delete(request.params.id);\n return { success: true, message: \"Menu item deleted\" };\n } catch (error) {\n const msg = errorMessage(error);\n console.error(\"Failed to delete menu item:\", msg);\n reply.status(500);\n return { success: false, message: msg };\n }\n}\n","import type { FastifyInstance } from \"fastify\";\nimport * as menuController from \"../controllers/menu-items\";\n\nexport function registerMenuItemRoutes(app: FastifyInstance): void {\n app.get(\"/api/menu-items\", menuController.getMenuItemList);\n app.post(\"/api/menu-items\", menuController.createMenuItem);\n app.get(\"/api/menu-items/:id\", menuController.getMenuItem);\n app.put(\"/api/menu-items/:id\", menuController.updateMenuItem);\n app.delete(\"/api/menu-items/:id\", menuController.deleteMenuItem);\n}\n","/**\n * A2A Bridge — WebSocket-based reverse proxy for agents behind NAT.\n *\n * Agents open an outbound WebSocket to the gateway. The gateway stores\n * the connection and exposes an HTTP proxy endpoint per agent. When the\n * orchestrator calls the agent, the gateway proxies the HTTP request\n * over the persistent WebSocket instead of trying to reach a private IP.\n *\n * Agent flow:\n * 1. Connect ws://gateway/api/a2a/bridge\n * 2. Send { type: \"agent:register\", agentId: \"...\", agentCard: {...} }\n * 3. Wait for { type: \"http:request\", requestId, method, path, headers, body }\n * 4. Process locally, respond with { type: \"http:response\", requestId, status, headers, body }\n *\n * Gateway flow:\n * 1. Accept WebSocket, store connection by agentId\n * 2. Expose GET/POST /api/a2a/bridge/proxy/{agentId}/*\n * 3. When HTTP request arrives, push over WebSocket, await response, relay\n */\n\nimport type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify';\nimport type { WebSocket } from 'ws';\nimport { v4 } from 'uuid';\n\n// ─── Logging ────────────────────────────────────────────────────────────────\n\nconst log = {\n info(msg: string, ctx?: Record<string, unknown>) {\n console.log(JSON.stringify({ level: 'info', msg, ...ctx }));\n },\n warn(msg: string, ctx?: Record<string, unknown>) {\n console.warn(JSON.stringify({ level: 'warn', msg, ...ctx }));\n },\n error(msg: string, ctx?: Record<string, unknown>) {\n console.error(JSON.stringify({ level: 'error', msg, ...ctx }));\n },\n};\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\ninterface PendingRequest {\n resolve: (response: BridgeHttpResponse) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n /** The agent owning this pending request — used for cleanup on disconnect */\n agentId: string;\n}\n\ninterface BridgeHttpResponse {\n status: number;\n headers: Record<string, string>;\n body: string;\n}\n\ninterface AgentConnection {\n ws: WebSocket;\n agentId: string;\n agentCard: Record<string, unknown>;\n connectedAt: number;\n}\n\n// ─── Connection Registry ────────────────────────────────────────────────────\n\nconst connections = new Map<string, AgentConnection>();\nconst pending = new Map<string, PendingRequest>();\n\nfunction getAgentIdFromPath(path: string): string | null {\n // Path: /api/a2a/bridge/proxy/{agentId}/...\n const match = path.match(/^\\/api\\/a2a\\/bridge\\/proxy\\/([^/]+)/);\n return match ? match[1] : null;\n}\n\n// ─── WebSocket Handler ──────────────────────────────────────────────────────\n\nfunction handleBridgeConnection(socket: WebSocket, _request: FastifyRequest): void {\n let agentId: string | null = null;\n\n log.info('Bridge WebSocket connected');\n\n socket.on('message', (raw) => {\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(raw.toString());\n } catch {\n log.warn('Bridge invalid message');\n return;\n }\n\n switch (msg.type) {\n case 'agent:register': {\n agentId = msg.agentId as string;\n if (!agentId) {\n socket.send(JSON.stringify({ type: 'error', message: 'agentId required' }));\n socket.close();\n return;\n }\n connections.set(agentId, {\n ws: socket,\n agentId,\n agentCard: msg.agentCard as Record<string, unknown> ?? {},\n connectedAt: Date.now(),\n });\n log.info('Agent registered via bridge', { agentId });\n socket.send(JSON.stringify({ type: 'agent:registered', agentId }));\n break;\n }\n\n case 'http:response': {\n const requestId = msg.requestId as string;\n const p = pending.get(requestId);\n if (p) {\n clearTimeout(p.timer);\n pending.delete(requestId);\n p.resolve({\n status: (msg.status as number) ?? 200,\n headers: (msg.headers as Record<string, string>) ?? {},\n body: (msg.body as string) ?? '',\n });\n }\n break;\n }\n\n case 'http:error': {\n const requestId = msg.requestId as string;\n const p = pending.get(requestId);\n if (p) {\n clearTimeout(p.timer);\n pending.delete(requestId);\n p.reject(new Error((msg.message as string) ?? 'Agent error'));\n }\n break;\n }\n }\n });\n\n socket.on('close', () => {\n if (agentId) {\n connections.delete(agentId);\n log.info('Bridge WebSocket disconnected', { agentId });\n // Reject only this agent's pending requests\n for (const [reqId, p] of pending) {\n if (p.agentId === agentId) {\n clearTimeout(p.timer);\n p.reject(new Error('Agent disconnected'));\n pending.delete(reqId);\n }\n }\n }\n });\n\n socket.on('error', (err) => {\n log.error('Bridge WebSocket error', { agentId, error: err.message });\n });\n}\n\n// ─── HTTP Proxy Handler ─────────────────────────────────────────────────────\n\nasync function handleBridgeProxy(\n request: FastifyRequest,\n reply: FastifyReply,\n): Promise<void> {\n const agentId = getAgentIdFromPath(request.url);\n if (!agentId) {\n reply.status(400).send({ error: 'Agent ID not found in path' });\n return;\n }\n\n const conn = connections.get(agentId);\n if (!conn) {\n reply.status(503).send({\n error: 'Agent not connected',\n message: `Agent \"${agentId}\" is not connected via WebSocket bridge`,\n });\n return;\n }\n\n const requestId = v4();\n\n // Build sub-path (strip the proxy prefix)\n const subPath = request.url.replace(`/api/a2a/bridge/proxy/${agentId}`, '') || '/';\n\n // Read body\n let body: string | undefined;\n if (request.method === 'POST' || request.method === 'PUT') {\n body = typeof request.body === 'string'\n ? request.body\n : JSON.stringify(request.body ?? {});\n }\n\n const bridgeRequest = {\n type: 'http:request',\n requestId,\n method: request.method,\n path: subPath,\n headers: {\n 'content-type': request.headers['content-type'] ?? 'application/json',\n 'accept': request.headers['accept'] ?? '*/*',\n },\n body: body ?? '',\n };\n\n const timeout = 300_000; // 5 min\n\n try {\n const response = await new Promise<BridgeHttpResponse>((resolve, reject) => {\n const timer = setTimeout(() => {\n pending.delete(requestId);\n reject(new Error(`Bridge request timeout after ${timeout}ms`));\n }, timeout);\n\n pending.set(requestId, { resolve, reject, timer, agentId });\n\n try {\n if (conn.ws.readyState !== conn.ws.OPEN) {\n pending.delete(requestId);\n reject(new Error('WebSocket not open'));\n return;\n }\n conn.ws.send(JSON.stringify(bridgeRequest));\n } catch (err) {\n clearTimeout(timer);\n pending.delete(requestId);\n reject(err as Error);\n }\n });\n\n // Relay response headers\n for (const [key, value] of Object.entries(response.headers)) {\n if (!['content-length', 'transfer-encoding', 'connection'].includes(key.toLowerCase())) {\n reply.header(key, value);\n }\n }\n\n reply.status(response.status);\n\n // Try to send as JSON if possible\n try {\n const parsed = JSON.parse(response.body);\n reply.send(parsed);\n } catch {\n reply.send(response.body);\n }\n } catch (err) {\n log.error('Bridge proxy error', { agentId, error: (err as Error).message });\n reply.status(502).send({\n error: 'Bridge proxy error',\n message: (err as Error).message,\n });\n }\n}\n\n// ─── Route Registration ─────────────────────────────────────────────────────\n\nexport function registerA2ABridgeRoutes(app: FastifyInstance): void {\n // WebSocket endpoint for agents to connect\n app.get('/api/a2a/bridge', { websocket: true }, (socket, req) => {\n handleBridgeConnection(socket, req);\n });\n\n // HTTP proxy endpoint — all paths under /api/a2a/bridge/proxy/{agentId}/\n app.route({\n method: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'],\n url: '/api/a2a/bridge/proxy/*',\n handler: handleBridgeProxy,\n });\n}\n","import { FastifyInstance } from \"fastify\";\nimport { getSTTClient, sttModelLatticeManager } from \"@axiom-lattice/core\";\n\nconst ALLOWED_AUDIO_FORMATS = new Set([\n \"webm\",\n \"wav\",\n \"mp3\",\n \"m4a\",\n \"ogg\",\n \"flac\",\n \"aac\",\n]);\n\nconst MAX_AUDIO_FILE_SIZE = 25 * 1024 * 1024;\n\n/**\n * Register STT (speech-to-text) transcription route.\n *\n * POST /api/stt/transcribe\n * Content-Type: multipart/form-data\n * Body: { file: File }\n * Query: ?model=default\n * Response: { text: string, confidence?: number }\n */\nexport const registerSTTRoutes = (app: FastifyInstance): void => {\n // List registered STT models\n app.get(\"/api/stt/models\", async (_request, reply) => {\n const models = sttModelLatticeManager.getAllSTTModelInfo();\n return reply.send({ models });\n });\n\n app.post<{ Querystring: { model?: string } }>(\n \"/api/stt/transcribe\",\n {\n schema: {\n querystring: {\n type: \"object\",\n properties: {\n model: { type: \"string\" },\n },\n },\n response: {\n 200: {\n type: \"object\",\n properties: {\n text: { type: \"string\" },\n confidence: { type: \"number\" },\n },\n },\n },\n },\n },\n async (request, reply) => {\n const modelKey = request.query.model || \"default\";\n const data = await request.file({\n limits: { fileSize: MAX_AUDIO_FILE_SIZE },\n });\n\n if (!data) {\n return reply.status(400).send({ error: \"No audio file provided\" });\n }\n\n const buffer = await data.toBuffer();\n if (buffer.length === 0) {\n return reply.status(400).send({ error: \"Empty audio file\" });\n }\n\n const format = (data.filename.split(\".\").pop() || \"webm\").toLowerCase();\n\n if (!ALLOWED_AUDIO_FORMATS.has(format)) {\n return reply\n .status(400)\n .send({ error: `Unsupported audio format: ${format}` });\n }\n\n try {\n let client;\n try {\n client = getSTTClient(modelKey);\n } catch {\n return reply.status(404).send({ error: `STT model \"${modelKey}\" not found` });\n }\n const result = await client.transcribe(buffer, format);\n\n return reply.send({\n text: result.text,\n confidence: result.confidence,\n });\n } catch (error: unknown) {\n const sanitizedMessage =\n error instanceof Error ? error.message : \"Transcription failed\";\n request.log.error(\n { error: sanitizedMessage },\n \"STT transcription failed\",\n );\n return reply\n .status(500)\n .send({ error: \"Transcription service error. Please try again.\" });\n }\n },\n );\n};\n","import { FastifyReply, FastifyRequest } from \"fastify\";\nimport { getStoreLattice } from \"@axiom-lattice/core\";\nimport { localA2AService } from \"../services/local-a2a\";\nimport {\n AgentType,\n type Assistant,\n type A2ARemoteAgentConfig,\n} from \"@axiom-lattice/protocols\";\n\nfunction getTenantId(request: FastifyRequest): string {\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) return userTenantId;\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\nfunction getLocalRuntime(assistant: Assistant): A2ARemoteAgentConfig[\"localRuntime\"] | undefined {\n const graphDefinition = assistant.graphDefinition;\n if (!graphDefinition || typeof graphDefinition !== \"object\") return undefined;\n if ((graphDefinition as { type?: unknown }).type !== AgentType.A2A_REMOTE) return undefined;\n return (graphDefinition as A2ARemoteAgentConfig).localRuntime;\n}\n\nasync function getLocalA2AAssistants(\n tenantId: string,\n): Promise<Array<{ assistant: Assistant; localRuntime: NonNullable<A2ARemoteAgentConfig[\"localRuntime\"]> }>> {\n const storeLattice = getStoreLattice(\"default\", \"assistant\");\n const assistants = await storeLattice.store.getAllAssistants(tenantId);\n const results: Array<{\n assistant: Assistant;\n localRuntime: NonNullable<A2ARemoteAgentConfig[\"localRuntime\"]>;\n }> = [];\n\n for (const assistant of assistants) {\n const runtime = getLocalRuntime(assistant);\n if (runtime) {\n results.push({ assistant, localRuntime: runtime });\n }\n }\n\n return results;\n}\n\nasync function getLocalA2AAssistant(\n tenantId: string,\n assistantId: string,\n): Promise<{\n assistant: Assistant;\n localRuntime: NonNullable<A2ARemoteAgentConfig[\"localRuntime\"]>;\n} | null> {\n const storeLattice = getStoreLattice(\"default\", \"assistant\");\n const assistant = await storeLattice.store.getAssistantById(tenantId, assistantId);\n if (!assistant) return null;\n\n const runtime = getLocalRuntime(assistant);\n if (!runtime) return null;\n\n return { assistant, localRuntime: runtime };\n}\n\nasync function requireManagedAssistant(\n request: FastifyRequest<{ Params: { assistantId: string } }>,\n reply: FastifyReply,\n): Promise<{\n assistantId: string;\n localRuntime: NonNullable<A2ARemoteAgentConfig[\"localRuntime\"]>;\n} | null> {\n const assistantId = request.params.assistantId;\n if (!assistantId) {\n reply.status(400).send({ success: false, error: \"assistantId is required\" });\n return null;\n }\n\n const registered = await getLocalA2AAssistant(getTenantId(request), assistantId);\n if (!registered) {\n reply.status(404).send({\n success: false,\n error: `Assistant ${assistantId} is not a local managed A2A assistant`,\n });\n return null;\n }\n\n return { assistantId, localRuntime: registered.localRuntime };\n}\n\nexport async function getLocalA2AStatus(\n request: FastifyRequest,\n reply: FastifyReply,\n): Promise<void> {\n const tenantId = getTenantId(request);\n const managed = await getLocalA2AAssistants(tenantId);\n const states = await Promise.all(\n managed.map(({ assistant, localRuntime }) =>\n localA2AService.getRegisteredState(assistant.id, localRuntime),\n ),\n );\n reply.send({ success: true, data: { records: states, total: states.length } });\n}\n\nexport async function getLocalA2AProvider(\n request: FastifyRequest<{ Params: { assistantId: string } }>,\n reply: FastifyReply,\n): Promise<void> {\n const registered = await requireManagedAssistant(request, reply);\n if (!registered) return;\n const state = await localA2AService.getRegisteredState(\n registered.assistantId,\n registered.localRuntime,\n );\n reply.send({ success: true, data: state });\n}\n\nexport async function startLocalA2AProvider(\n request: FastifyRequest<{ Params: { assistantId: string } }>,\n reply: FastifyReply,\n): Promise<void> {\n const registered = await requireManagedAssistant(request, reply);\n if (!registered) return;\n\n const state = await localA2AService.startProvider(\n registered.assistantId,\n registered.localRuntime,\n );\n reply.send({ success: true, data: state });\n}\n\nexport async function stopLocalA2AProvider(\n request: FastifyRequest<{ Params: { assistantId: string } }>,\n reply: FastifyReply,\n): Promise<void> {\n const registered = await requireManagedAssistant(request, reply);\n if (!registered) return;\n\n const state = await localA2AService.stopProvider(registered.assistantId);\n reply.send({ success: true, data: state });\n}\n\nexport async function restartLocalA2AProvider(\n request: FastifyRequest<{ Params: { assistantId: string } }>,\n reply: FastifyReply,\n): Promise<void> {\n const registered = await requireManagedAssistant(request, reply);\n if (!registered) return;\n\n const state = await localA2AService.restartProvider(\n registered.assistantId,\n registered.localRuntime,\n );\n reply.send({ success: true, data: state });\n}\n","import { cliA2AEntryPath } from \"@axiom-lattice/cli-a2a/cli-path\";\nimport type { LocalA2ATemplateDefinition } from \"@axiom-lattice/protocols\";\n\ntype LocalProviderKey = \"claude\" | \"codex\" | \"opencode\";\n\nfunction buildCliA2ACommand(\n provider: LocalProviderKey,\n agentName: string,\n agentDescription: string,\n): LocalA2ATemplateDefinition[\"command\"] {\n return {\n executable: process.execPath,\n args: [\n cliA2AEntryPath,\n \"--provider\",\n provider,\n \"--hostname\",\n \"localhost\",\n \"--advertise-host\",\n \"localhost\",\n \"--agent-name\",\n agentName,\n \"--agent-description\",\n agentDescription,\n \"--log-level\",\n \"info\",\n ],\n };\n}\n\nexport const LOCAL_A2A_TEMPLATES: LocalA2ATemplateDefinition[] = [\n {\n key: \"claude\",\n name: \"Claude Code\",\n command: buildCliA2ACommand(\n \"claude\",\n \"Claude Code\",\n \"Local Claude Code wrapper exposed through A2A.\",\n ),\n },\n {\n key: \"codex\",\n name: \"Codex\",\n command: buildCliA2ACommand(\n \"codex\",\n \"Codex\",\n \"Local Codex wrapper exposed through A2A.\",\n ),\n },\n {\n key: \"opencode\",\n name: \"OpenCode\",\n command: buildCliA2ACommand(\n \"opencode\",\n \"OpenCode\",\n \"Local OpenCode wrapper exposed through A2A.\",\n ),\n },\n];\n","import { FastifyReply, FastifyRequest } from \"fastify\";\nimport { LOCAL_A2A_TEMPLATES } from \"../config/local-a2a-templates\";\n\n/**\n * List all configured Local A2A templates (read-only static config).\n */\nexport async function getLocalA2ATemplates(\n _request: FastifyRequest,\n reply: FastifyReply,\n): Promise<void> {\n reply.send({\n success: true,\n data: {\n records: LOCAL_A2A_TEMPLATES,\n total: LOCAL_A2A_TEMPLATES.length,\n },\n });\n}\n","import { FastifyInstance } from \"fastify\";\nimport { randomUUID } from \"node:crypto\";\nimport type { AgentCard, LocalRuntimeConfig } from \"@axiom-lattice/protocols\";\nimport { localA2AService } from \"../services/local-a2a\";\nimport { normalizeA2AAgentCardUrl } from \"../utils/a2a-url\";\nimport {\n validateLocalRuntimeCommand,\n validateLocalRuntimePort,\n} from \"../utils/local-a2a-runtime\";\n\ntype TestConnectionError = Error & {\n code?: string;\n cause?: unknown;\n};\n\nfunction describeTestConnectionError(error: unknown, agentCardUrl: string): string {\n if (!(error instanceof Error)) {\n return `Failed to fetch agent card from ${agentCardUrl}: ${String(error)}`;\n }\n\n const cause = (error as TestConnectionError).cause;\n const causeParts: string[] = [];\n if (cause instanceof Error) {\n causeParts.push(cause.message);\n const causeCode = (cause as TestConnectionError).code;\n if (causeCode && !causeParts.some((part) => part.includes(causeCode))) {\n causeParts.push(causeCode);\n }\n } else if (typeof cause === \"object\" && cause !== null) {\n const code = \"code\" in cause ? String(cause.code) : \"\";\n const message = \"message\" in cause ? String(cause.message) : \"\";\n if (message) causeParts.push(message);\n if (code && !message.includes(code)) causeParts.push(code);\n }\n\n const detail = causeParts.length > 0 ? ` (${causeParts.join(\", \")})` : \"\";\n return `Failed to fetch agent card from ${agentCardUrl}: ${error.message}${detail}`;\n}\n\nasync function ensureLocalRuntimeForConnectionTest(\n localRuntime: LocalRuntimeConfig,\n agentCardUrl: string,\n): Promise<{ runtimeId: string } | { error: string }> {\n const commandValidation = validateLocalRuntimeCommand(localRuntime);\n if (!commandValidation.ok) {\n return { error: commandValidation.error };\n }\n const testRuntime = {\n ...localRuntime,\n agentCardUrl,\n command: {\n ...localRuntime.command,\n executable: localRuntime.command.executable.trim(),\n },\n };\n const portValidation = validateLocalRuntimePort(testRuntime, agentCardUrl);\n if (!portValidation.ok) {\n return { error: portValidation.error };\n }\n\n const state = await localA2AService.startProvider(\n `test-${randomUUID()}`,\n testRuntime,\n );\n if (state.status === \"running\") return { runtimeId: state.runtimeId };\n const detail = state.message ? ` ${state.message}` : \"\";\n localA2AService.removeState(state.runtimeId);\n return { error: `Local managed A2A server could not start for connection test.${detail}` };\n}\n\nasync function readShortResponseBody(resp: Response): Promise<string> {\n const body = await resp.text().catch(() => \"\");\n return body.length > 500 ? `${body.slice(0, 500)}...` : body;\n}\n\nexport function registerA2ATestConnectionRoute(app: FastifyInstance): void {\n app.post(\"/api/a2a/test-connection\", async (request, reply) => {\n const { agentCardUrl, apiKey, localRuntime } = (request.body ?? {}) as {\n agentCardUrl?: string;\n apiKey?: string;\n localRuntime?: LocalRuntimeConfig;\n };\n const normalizedAgentCardUrl = normalizeA2AAgentCardUrl(\n agentCardUrl,\n localRuntime ? \"http://\" : \"https://\",\n );\n if (!normalizedAgentCardUrl) {\n return reply.status(400).send({ success: false, error: \"agentCardUrl is required\" });\n }\n\n let testRuntimeId: string | null = null;\n try {\n const headers: Record<string, string> = {};\n if (apiKey) headers[\"Authorization\"] = `Bearer ${apiKey}`;\n\n if (localRuntime) {\n const localStartResult = await ensureLocalRuntimeForConnectionTest(localRuntime, normalizedAgentCardUrl);\n if (\"error\" in localStartResult) {\n return reply.send({ success: true, data: { reachable: false, error: localStartResult.error } });\n }\n testRuntimeId = localStartResult.runtimeId;\n }\n\n const resp = await fetch(normalizedAgentCardUrl, { headers, signal: AbortSignal.timeout(8000) });\n if (!resp.ok) {\n const body = await readShortResponseBody(resp);\n const suffix = body ? `: ${body}` : \"\";\n return reply.send({ success: true, data: { reachable: false, error: `HTTP ${resp.status} ${resp.statusText}${suffix}` } });\n }\n const card = await resp.json() as AgentCard;\n return reply.send({ success: true, data: { reachable: true, agentName: card.name, agentCard: card } });\n } catch (error: unknown) {\n return reply.send({\n success: true,\n data: {\n reachable: false,\n error: describeTestConnectionError(error, normalizedAgentCardUrl),\n },\n });\n } finally {\n if (testRuntimeId) {\n localA2AService.removeState(testRuntimeId);\n }\n }\n });\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport {\n agentLatticeManager,\n ensureBuiltinAgentsForTenant,\n getStoreLattice,\n} from \"@axiom-lattice/core\";\nimport type {\n AssistantStore,\n TaskStore,\n TaskItem,\n CreateTaskRequest,\n UpdateTaskRequest,\n TaskWorkItemStore,\n} from \"@axiom-lattice/protocols\";\n\ninterface CompleteTaskBody {\n result?: string;\n beliefImpact?: Array<{ key: string; after: number; basis: string }>;\n}\n\ninterface TaskControllerResponse {\n success: boolean;\n data?: TaskItem;\n code?: string;\n error?: string;\n hint?: string;\n}\n\nconst AGENT_CREATE_STATUSES = new Set<TaskItem[\"status\"]>([\"pending\"]);\nconst FORBIDDEN_AGENT_CREATE_KEYS = new Set([\n \"beliefImpact\",\n \"beliefState\",\n \"cancelledAt\",\n \"completedAt\",\n \"completionEvidence\",\n \"evidenceId\",\n \"failureReason\",\n \"failedAt\",\n \"interruption\",\n \"lifecycle_completion_audit\",\n \"lifecycle_resume_audit\",\n \"requireReview\",\n \"result\",\n \"reviewedAt\",\n \"status\",\n \"interruptedAt\",\n]);\n\nfunction containsLifecycleField(value: unknown): boolean {\n if (!value || typeof value !== \"object\") return false;\n if (Array.isArray(value)) return value.some(containsLifecycleField);\n return Object.entries(value).some(([key, nested]) =>\n FORBIDDEN_AGENT_CREATE_KEYS.has(key) || key.startsWith(\"lifecycle_\") || containsLifecycleField(nested));\n}\n\nfunction governedAgentCreateError(body: CreateTaskRequest): {\n code: string;\n error: string;\n} | undefined {\n if (body.ownerType !== \"agent\") return undefined;\n if (body.status && !AGENT_CREATE_STATUSES.has(body.status)) {\n return {\n code: \"TASK_LIFECYCLE_TRANSITION_REQUIRED\",\n error: \"Public agent tasks can only be created pending.\",\n };\n }\n const raw = body as CreateTaskRequest & Record<string, unknown>;\n if (\n Object.prototype.hasOwnProperty.call(raw, \"result\") ||\n Object.prototype.hasOwnProperty.call(raw, \"failureReason\") ||\n Object.prototype.hasOwnProperty.call(raw, \"requireReview\") ||\n Object.prototype.hasOwnProperty.call(raw, \"createdAt\") ||\n Object.prototype.hasOwnProperty.call(raw, \"updatedAt\") ||\n containsLifecycleField(body.context) ||\n containsLifecycleField(body.metadata)\n ) {\n return {\n code: \"TASK_LIFECYCLE_CONTEXT_FORBIDDEN\",\n error: \"Agent lifecycle results, review policy, interruption state, and audit fields require a trusted lifecycle adapter.\",\n };\n }\n return undefined;\n}\n\nfunction getTenantId(request: FastifyRequest): string {\n const userTenantId = (request as any).user?.tenantId;\n if (userTenantId) return userTenantId;\n return (request.headers[\"x-tenant-id\"] as string) || \"default\";\n}\n\nfunction getUserId(request: FastifyRequest): string {\n const userId = (request as any).user?.id\n || (request.headers[\"x-user-id\"] as string);\n if (!userId) throw new Error(\"User ID is required\");\n return userId;\n}\n\nfunction getStore(): TaskStore {\n return getStoreLattice(\"default\", \"task\").store as TaskStore;\n}\n\nfunction getAssistantStore(): AssistantStore {\n return getStoreLattice(\"default\", \"assistant\").store as AssistantStore;\n}\n\nfunction governedAgentUpdateError(task: TaskItem, updates: UpdateTaskRequest): string | undefined {\n const has = (key: keyof UpdateTaskRequest): boolean => Object.prototype.hasOwnProperty.call(updates, key);\n if (\n (has(\"ownerType\") && updates.ownerType !== task.ownerType) ||\n (has(\"ownerId\") && updates.ownerId !== task.ownerId)\n ) {\n return \"TASK_OWNERSHIP_IMMUTABLE\";\n }\n if (task.ownerType !== \"agent\") return undefined;\n\n if (\n (has(\"parentId\") && updates.parentId !== task.parentId) ||\n (has(\"requireReview\") && updates.requireReview !== task.requireReview) ||\n has(\"result\") ||\n has(\"failureReason\") ||\n has(\"status\")\n ) {\n return \"TASK_LIFECYCLE_TRANSITION_REQUIRED\";\n }\n\n // TaskStore context updates replace the whole value, so no agent context write\n // can preserve a concurrently-written lifecycle interruption atomically.\n if (has(\"context\") || has(\"description\")) {\n return \"COMPLETION_CONTEXT_MUTATION\";\n }\n\n return undefined;\n}\n\n/** Maps lifecycle service failure codes to their public HTTP status. */\nexport function taskLifecycleFailureStatus(code: string): number {\n if (code === \"TASK_NOT_FOUND\") return 404;\n if (\n code === \"TASK_STATUS_CONFLICT\" ||\n code === \"TASK_PARENT_NOT_FOUND_OR_INACCESSIBLE\" ||\n code === \"REVIEW_REQUIRED\" ||\n code === \"LEGACY_REVIEW_UNSUPPORTED\"\n ) return 409;\n if (code.endsWith(\"_FAILED\")) return 500;\n return 400;\n}\n\nexport async function listTasks(\n request: FastifyRequest\n): Promise<{ success: boolean; data?: TaskItem[]; count?: number; error?: string }> {\n try {\n const tenantId = getTenantId(request);\n const userId = getUserId(request);\n const query = request.query as Record<string, string>;\n const ownerType = query.ownerType as 'user' | 'agent' | undefined;\n const mixedOwnership = ownerType === undefined;\n const limit = query.limit ? parseInt(query.limit) : undefined;\n const offset = query.offset ? parseInt(query.offset) : undefined;\n\n const store = getStore();\n const tasks = await store.list({\n tenantId,\n status: query.status,\n priority: query.priority,\n ...(ownerType === 'user' ? { ownerType, ownerId: userId } : {}),\n ...(ownerType === 'agent' ? { ownerType, ...(query.ownerId && { ownerId: query.ownerId }) } : {}),\n ...(mixedOwnership && query.ownerId ? { ownerId: query.ownerId } : {}),\n ...(query.parentId && { parentId: query.parentId }),\n metadata: query.metadata ? JSON.parse(query.metadata) : undefined,\n projectId: query.projectId,\n ...(!mixedOwnership && limit !== undefined ? { limit } : {}),\n ...(!mixedOwnership && offset !== undefined ? { offset } : {}),\n });\n const visibleTasks = mixedOwnership\n ? tasks.filter((task) => task.ownerType === 'agent' || (task.ownerType === 'user' && task.ownerId === userId))\n : tasks;\n const pageOffset = mixedOwnership ? offset ?? 0 : 0;\n const page = mixedOwnership\n ? visibleTasks.slice(pageOffset, limit === undefined ? undefined : pageOffset + limit)\n : visibleTasks;\n\n return { success: true, data: page, count: page.length };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n}\n\nexport async function getTask(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n): Promise<{ success: boolean; data?: TaskItem; error?: string }> {\n try {\n const tenantId = getTenantId(request);\n const userId = getUserId(request);\n const { id } = request.params;\n\n const store = getStore();\n const task = await store.getById(tenantId, id);\n if (!task) {\n return reply.status(404).send({ success: false, error: \"Task not found\" });\n }\n\n if (task.ownerType === 'user' && task.ownerId !== userId) {\n return reply.status(403).send({ success: false, error: \"Access denied\" });\n }\n\n return { success: true, data: task };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n}\n\nexport async function createTask(\n request: FastifyRequest<{ Body: CreateTaskRequest }>,\n reply: FastifyReply\n): Promise<{ success: boolean; data?: TaskItem; error?: string }> {\n try {\n const tenantId = getTenantId(request);\n const userId = getUserId(request);\n const body = request.body;\n\n if (!body.title) {\n return reply.status(400).send({ success: false, error: \"title is required\" });\n }\n\n const lifecycleError = governedAgentCreateError(body);\n if (lifecycleError) {\n return reply.status(409).send({ success: false, ...lifecycleError });\n }\n\n const ownerType = (body.ownerType || \"user\") as 'user' | 'agent';\n const ownerId = body.ownerId || userId;\n if (ownerType === \"agent\") {\n ensureBuiltinAgentsForTenant(tenantId);\n const assistant = await getAssistantStore().getAssistantById(tenantId, ownerId);\n const configuredAgent = agentLatticeManager.getAgentConfigWithTenant(tenantId, ownerId);\n if ((!assistant || assistant.tenantId !== tenantId) && !configuredAgent) {\n return reply.status(404).send({\n success: false,\n code: \"AGENT_OWNER_NOT_FOUND\",\n error: \"Agent owner was not found in the current tenant.\",\n });\n }\n }\n\n const store = getStore();\n const task = await store.create({\n ...body,\n tenantId,\n ownerType,\n ownerId,\n });\n\n return reply.status(201).send({ success: true, data: task });\n } catch (error: any) {\n return reply.status(500).send({ success: false, error: error.message });\n }\n}\n\nexport async function updateTask(\n request: FastifyRequest<{ Params: { id: string }; Body: UpdateTaskRequest }>,\n reply: FastifyReply\n): Promise<{ success: boolean; data?: TaskItem; error?: string }> {\n try {\n const tenantId = getTenantId(request);\n const userId = getUserId(request);\n const { id } = request.params;\n\n const store = getStore();\n const existing = await store.getById(tenantId, id);\n if (!existing) {\n return reply.status(404).send({ success: false, error: \"Task not found\" });\n }\n\n if (existing.ownerType === 'user' && existing.ownerId !== userId) {\n return reply.status(403).send({ success: false, error: \"Access denied\" });\n }\n\n const lifecycleError = governedAgentUpdateError(existing, request.body);\n if (lifecycleError) {\n return reply.status(409).send({\n success: false,\n code: lifecycleError,\n error: lifecycleError === \"COMPLETION_CONTEXT_MUTATION\"\n ? \"Agent completion context is owned by the task lifecycle service.\"\n : lifecycleError === \"TASK_OWNERSHIP_IMMUTABLE\"\n ? \"Task ownership is immutable after creation.\"\n : \"Agent ownership, hierarchy, and lifecycle transitions require a trusted lifecycle adapter.\",\n });\n }\n\n const task = await store.update(tenantId, id, request.body);\n if (!task) {\n return reply.status(404).send({ success: false, error: \"Task not found\" });\n }\n return { success: true, data: task };\n } catch (error: any) {\n return reply.status(500).send({ success: false, error: error.message });\n }\n}\n\nexport async function deleteTask(\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply\n): Promise<{ success: boolean; message?: string; error?: string }> {\n try {\n const tenantId = getTenantId(request);\n const userId = getUserId(request);\n const { id } = request.params;\n\n const store = getStore();\n const existing = await store.getById(tenantId, id);\n if (!existing) {\n return reply.status(404).send({ success: false, error: \"Task not found\" });\n }\n\n if (existing.ownerType === 'user' && existing.ownerId !== userId) {\n return reply.status(403).send({ success: false, error: \"Access denied\" });\n }\n\n if (existing.ownerType === \"agent\") {\n return reply.status(403).send({\n success: false,\n code: \"AGENT_RUNTIME_REQUIRED\",\n error: \"Agent-owned tasks can only be deleted by a trusted agent runtime.\",\n });\n }\n\n const deleted = await store.delete(tenantId, id);\n if (!deleted) {\n return reply.status(404).send({ success: false, error: \"Task not found\" });\n }\n\n return { success: true, message: \"Task deleted\" };\n } catch (error: any) {\n return reply.status(500).send({ success: false, error: error.message });\n }\n}\n\nexport async function completeTask(\n request: FastifyRequest<{ Params: { id: string }; Body: CompleteTaskBody }>,\n reply: FastifyReply\n): Promise<TaskControllerResponse> {\n try {\n const tenantId = getTenantId(request);\n const userId = getUserId(request);\n const { id } = request.params;\n\n const store = getStore();\n const existing = await store.getById(tenantId, id);\n if (!existing) {\n return reply.status(404).send({ success: false, error: \"Task not found\" });\n }\n\n if (existing.ownerType === 'user' && existing.ownerId !== userId) {\n return reply.status(403).send({ success: false, error: \"Access denied\" });\n }\n\n const body = request.body ?? {};\n if (existing.ownerType === \"user\") {\n const task = await store.update(tenantId, id, {\n status: \"completed\",\n ...(body.result === undefined ? {} : { result: body.result }),\n });\n if (!task) return reply.status(404).send({ success: false, error: \"Task not found\" });\n return { success: true, data: task };\n }\n\n return reply.status(403).send({\n success: false,\n code: \"AGENT_RUNTIME_REQUIRED\",\n error: \"Agent-owned tasks can only be completed by a trusted agent runtime.\",\n });\n } catch (error: any) {\n return reply.status(500).send({ success: false, error: error.message });\n }\n}\n\nfunction getTaskWorkItemStore(): TaskWorkItemStore {\n return getStoreLattice(\"default\", \"taskWorkItem\").store as TaskWorkItemStore;\n}\n\nexport async function listTaskWorkItems(\n request: FastifyRequest<{ \n Params: { id: string }; \n Querystring: { action?: string; limit?: number; offset?: number } \n }>,\n reply: FastifyReply\n) {\n const tenantId = getTenantId(request);\n const userId = getUserId(request);\n const { id } = request.params;\n const { action, limit, offset } = request.query;\n\n const task = await getStore().getById(tenantId, id);\n if (!task) {\n return reply.status(404).send({ success: false, error: \"Task not found\" });\n }\n if (task.ownerType === 'user' && task.ownerId !== userId) {\n return reply.status(403).send({ success: false, error: \"Access denied\" });\n }\n\n const store = getTaskWorkItemStore();\n const items = await store.list({ \n tenantId, \n taskId: id, \n action, \n limit: limit ? Number(limit) : undefined, \n offset: offset ? Number(offset) : undefined \n });\n return reply.send({ success: true, data: items });\n}\n","import type { FastifyInstance } from \"fastify\";\nimport * as tasksController from \"../controllers/tasks\";\n\n/** Registers task CRUD and the lifecycle-governed completion boundary. */\nexport function registerTaskRoutes(app: FastifyInstance): void {\n app.get(\"/api/tasks\", tasksController.listTasks);\n app.get(\"/api/tasks/:id\", tasksController.getTask);\n app.post(\"/api/tasks\", tasksController.createTask);\n app.put(\"/api/tasks/:id\", tasksController.updateTask);\n app.patch(\"/api/tasks/:id\", tasksController.updateTask);\n app.delete(\"/api/tasks/:id\", tasksController.deleteTask);\n app.patch(\"/api/tasks/:id/complete\", tasksController.completeTask);\n app.get(\"/api/tasks/:id/work-items\", tasksController.listTaskWorkItems);\n}\n","import { FastifyInstance } from \"fastify\";\nimport { ScheduledTaskStatus } from \"@axiom-lattice/protocols\";\nimport * as assistantController from \"../controllers/assistant\";\nimport * as runController from \"../controllers/run\";\nimport * as memoryController from \"../controllers/memory\";\nimport * as graphController from \"../controllers/assistant\";\nimport * as agentTaskController from \"../controllers/agent_task\";\nimport * as threadsController from \"../controllers/threads\";\nimport * as schedulesController from \"../controllers/schedules\";\nimport * as configController from \"../controllers/config\";\nimport * as modelsController from \"../controllers/models\";\nimport * as healthController from \"../controllers/health\";\nimport * as skillsController from \"../controllers/skills\";\nimport * as collectionController from \"../controllers/collections\";\nimport * as embeddingsController from \"../controllers/embeddings\";\nimport * as entriesController from \"../controllers/entries\";\nimport * as toolsController from \"../controllers/tools\";\nimport * as dataQueryController from \"../controllers/data-query\";\nimport * as workflowTrackingController from \"../controllers/workflow-tracking\";\nimport * as paController from \"../controllers/personal-assistant\";\nimport * as exportImportController from \"../controllers/export-import\";\nimport { middlewareTypesRoutes } from \"../controllers/middleware-types\";\nimport {\n createRunSchema,\n getAllMemoryItemsSchema,\n getAgentStateSchema,\n getMemoryItemSchema,\n setMemoryItemSchema,\n deleteMemoryItemSchema,\n clearMemorySchema,\n getAgentGraphSchema,\n resumeStreamSchema,\n triggerAgentTaskSchema,\n updateConfigSchema,\n getConfigSchema,\n getHealthSchema,\n getSandboxUrlSchema,\n dataQuerySchema,\n} from \"../schemas\";\nimport { removePendingMessageHandler } from \"../controllers/thread_status\";\nimport { registerSandboxProxyRoutes } from \"../controllers/sandbox\";\nimport { registerWorkspaceRoutes } from \"../controllers/workspace\";\nimport { registerDatabaseConfigRoutes } from \"../controllers/database-configs\";\nimport { registerMetricsServerConfigRoutes } from \"../controllers/metrics-configs\";\nimport { connectionRoutes } from \"../controllers/connections\";\nimport { registerMcpServerConfigRoutes } from \"../controllers/mcp-configs\";\nimport { registerEvalRoutes } from \"../controllers/eval\";\nimport { registerUserRoutes } from \"../controllers/users\";\nimport { registerTenantRoutes } from \"../controllers/tenants\";\nimport { registerAuthRoutes, resolveConsoleTokenSecret } from \"../controllers/auth\";\nimport { registerChannelRoutes } from \"../channels/routes\";\nimport { registerChannelInstallationRoutes } from \"./channel-installations\";\nimport { registerChannelBindingRoutes } from \"./channel-bindings\";\nimport { registerMenuItemRoutes } from \"./menu-items\";\nimport type { MessageRouter } from \"../router/MessageRouter\";\nimport type { ChannelInstallationStore } from \"@axiom-lattice/protocols\";\n// import {\n// getThreadStatusHandler,\n// getAgentThreadsHandler,\n// getActiveThreadsHandler,\n// addMessageHandler,\n// removeMessageHandler,\n// updateQueueConfigHandler,\n// } from \"../controllers/thread_status\";\n\nimport { registerA2ABridgeRoutes } from './a2a-bridge';\nimport { registerSTTRoutes } from './stt';\nimport {\n getLocalA2AProvider,\n getLocalA2AStatus,\n restartLocalA2AProvider,\n startLocalA2AProvider,\n stopLocalA2AProvider,\n} from \"../controllers/local-a2a\";\nimport {\n getLocalA2ATemplates,\n} from \"../controllers/local-a2a-templates\";\nimport { registerA2ATestConnectionRoute } from \"./a2a-test-connection\";\nimport { registerTaskRoutes } from \"./task-routes\";\nimport { agentInstanceManager, agentLatticeManager, getStoreLattice, modelLatticeManager } from \"@axiom-lattice/core\";\nimport {\n AgentWebAppService,\n createConfiguredAgentResolver,\n} from \"../services/agent-web-app/AgentWebAppService\";\nimport { registerAgentWebAppRoutes } from \"./agent-web-apps\";\nimport { registerAgentWebAppRuntimeRoutes } from \"./agent-web-app-runtime\";\nimport { AgentWebAppRuntimeService } from \"../services/agent-web-app/AgentWebAppRuntimeService\";\nimport {\n AgentWebAppAttachmentRefService,\n resolveAgentWebAppAttachmentSecret,\n} from \"../services/agent-web-app/AgentWebAppAttachmentRef\";\nimport { saveProjectFile } from \"../services/workspace-file-service\";\n\nexport const registerLatticeRoutes = (app: FastifyInstance, channelDeps?: { router: MessageRouter; installationStore: ChannelInstallationStore }): void => {\n const webAppStore = getStoreLattice(\"default\", \"agentWebApp\").store;\n const assistantStore = getStoreLattice(\"default\", \"assistant\").store;\n const projectStore = getStoreLattice(\"default\", \"project\").store;\n registerAgentWebAppRoutes(app, {\n service: new AgentWebAppService({\n webAppStore,\n assistantStore,\n projectStore,\n modelRegistry: { has: (key) => modelLatticeManager.hasLattice(key) },\n configuredAgentResolver: createConfiguredAgentResolver({\n hydrate: (tenantId) => agentLatticeManager.initializeStoredAssistantsForTenant(tenantId),\n has: (tenantId, assistantId) =>\n agentLatticeManager.hasAgentLatticeWithTenant(tenantId, assistantId),\n }),\n }),\n });\n registerAgentWebAppRuntimeRoutes(app, {\n service: new AgentWebAppRuntimeService({\n webAppStore,\n threadStore: getStoreLattice(\"default\", \"thread\").store,\n projectStore,\n assistantResolver: {\n resolve: async (tenantId, assistantId) => {\n const stored = await assistantStore.getAssistantById(tenantId, assistantId);\n if (stored) return stored;\n await agentLatticeManager.initializeStoredAssistantsForTenant(tenantId);\n const config = agentLatticeManager.getAgentConfigWithTenant(tenantId, assistantId);\n return config ? { id: assistantId, name: config.name, description: config.description } : null;\n },\n },\n modelRegistry: {\n has: (key) => modelLatticeManager.hasLattice(key),\n label: (key) => key,\n },\n messageReader: {\n getCurrentMessages: ({ tenantId, assistantId, threadId, workspaceId, projectId }) =>\n agentInstanceManager.getAgent({\n tenant_id: tenantId,\n assistant_id: assistantId,\n thread_id: threadId,\n workspace_id: workspaceId,\n project_id: projectId,\n }).getCurrentMessages(),\n },\n agentResolver: {\n getAgent: ({ tenantId, assistantId, threadId, workspaceId, projectId }) =>\n agentInstanceManager.getAgent({\n tenant_id: tenantId,\n assistant_id: assistantId,\n thread_id: threadId,\n workspace_id: workspaceId,\n project_id: projectId,\n }),\n },\n attachmentRefs: new AgentWebAppAttachmentRefService(\n resolveAgentWebAppAttachmentSecret(\n resolveConsoleTokenSecret(process.env.AUTH_REQUIRED === \"true\"),\n ),\n ),\n saveProjectFile,\n authorizePreview: async (webApp, preview) => {\n if (webApp.tenantId !== preview.tenantId) return false;\n const assistant = await assistantStore.getAssistantById(preview.tenantId, webApp.assistantId);\n if (assistant) return !assistant.ownerUserId || assistant.ownerUserId === preview.userId;\n await agentLatticeManager.initializeStoredAssistantsForTenant(preview.tenantId);\n return agentLatticeManager.hasAgentLatticeWithTenant(preview.tenantId, webApp.assistantId);\n },\n }),\n });\n\n // A2A Bridge — WebSocket-based reverse proxy for agents behind NAT\n registerA2ABridgeRoutes(app);\n\n // STT (speech-to-text) transcription\n registerSTTRoutes(app);\n\n // Local A2A runtime management\n app.get(\"/api/local-a2a\", getLocalA2AStatus);\n\n app.get(\"/api/local-a2a/templates\", getLocalA2ATemplates);\n\n app.get(\"/api/local-a2a/:assistantId\", getLocalA2AProvider);\n app.post(\"/api/local-a2a/:assistantId/start\", startLocalA2AProvider);\n app.post(\"/api/local-a2a/:assistantId/stop\", stopLocalA2AProvider);\n app.post(\"/api/local-a2a/:assistantId/restart\", restartLocalA2AProvider);\n\n registerA2ATestConnectionRoute(app);\n\n // 运行路由\n app.post<{\n Body: any;\n }>(\"/api/runs\", runController.createRun);\n\n // Resume stream route\n app.post<{\n Body: any;\n }>(\"/api/resume_stream\", runController.resumeStream);\n\n // Abort agent execution for a thread\n app.post<{\n Params: { assistantId: string; threadId: string };\n }>(\"/api/assistants/:assistantId/threads/:threadId/abort\", runController.abortRun);\n\n // Recover agent execution after a crash or manual abort\n app.post<{\n Params: { assistantId: string; threadId: string };\n }>(\"/api/assistants/:assistantId/threads/:threadId/recover\", runController.recoverRun);\n\n // app.get<{\n // Params: { id: string };\n // }>(\"/api/runs/:id\", runController.getRun);\n\n // app.get<{\n // Params: { assistantId: string };\n // }>(\"/api/assistants/:assistantId/runs\", runController.getRunsByAssistant);\n\n // app.post<{\n // Params: { id: string };\n // }>(\"/api/runs/:id/cancel\", runController.cancelRun);\n\n // 内存路由\n app.get<{\n Params: { assistantId: string; thread_id: string };\n }>(\n \"/api/assistants/:assistantId/:thread_id/memory\",\n { schema: getAllMemoryItemsSchema },\n memoryController.getAllMemoryItems\n );\n\n app.get<{\n Params: { assistantId: string; thread_id: string };\n }>(\n \"/api/assistants/:assistantId/:thread_id/state\",\n { schema: getAgentStateSchema },\n memoryController.getAgentState\n );\n\n app.get<{\n Params: { assistantId: string; key: string };\n }>(\n \"/api/assistants/:assistantId/memory/:key\",\n { schema: getMemoryItemSchema },\n memoryController.getMemoryItem\n );\n\n app.put<{\n Params: { assistantId: string; key: string };\n Body: any;\n }>(\n \"/api/assistants/:assistantId/memory/:key\",\n { schema: setMemoryItemSchema },\n memoryController.setMemoryItem\n );\n\n app.delete<{\n Params: { assistantId: string; key: string };\n }>(\n \"/api/assistants/:assistantId/memory/:key\",\n { schema: deleteMemoryItemSchema },\n memoryController.deleteMemoryItem\n );\n\n app.delete<{\n Params: { assistantId: string };\n }>(\n \"/api/assistants/:assistantId/memory\",\n { schema: clearMemorySchema },\n memoryController.clearMemory\n );\n\n // Assistant CRUD routes\n app.get(\"/api/assistants\", assistantController.getAssistantList);\n\n // Aggregate stats (must be registered before /:id so \"stats\" isn't captured)\n app.get(\"/api/assistants/stats\", assistantController.getAssistantStats);\n\n app.get<{\n Params: { id: string };\n }>(\"/api/assistants/:id\", assistantController.getAssistant);\n\n app.post<{\n Body: any;\n }>(\"/api/assistants\", assistantController.createAssistant);\n\n app.put<{\n Params: { id: string };\n Body: any;\n }>(\"/api/assistants/:id\", assistantController.updateAssistant);\n\n app.delete<{\n Params: { id: string };\n }>(\"/api/assistants/:id\", assistantController.deleteAssistant);\n\n // Personal Assistant routes\n app.post<{ Body: any }>(\"/api/personal-assistant\", paController.createPersonalAssistant);\n app.get(\"/api/personal-assistant\", paController.getPersonalAssistant);\n app.delete(\"/api/personal-assistant\", paController.deletePersonalAssistant);\n\n registerTaskRoutes(app);\n\n // 图表路由\n app.get<{\n Params: { assistantId: string };\n }>(\n \"/api/assistants/:assistantId/graph\",\n { schema: getAgentGraphSchema },\n graphController.getAgentGraph\n );\n\n // Agent Task路由\n app.post<{\n Body: any;\n }>(\n \"/api/agent-tasks/trigger\",\n { schema: triggerAgentTaskSchema },\n agentTaskController.triggerAgentTask\n );\n\n // Thread CRUD routes for a specific assistant\n app.get<{\n Params: { assistantId: string };\n }>(\"/api/assistants/:assistantId/threads\", threadsController.getThreadList);\n\n app.get<{\n Params: { assistantId: string; threadId: string };\n }>(\n \"/api/assistants/:assistantId/threads/:threadId\",\n threadsController.getThread\n );\n\n app.post<{\n Params: { assistantId: string };\n Body: any;\n }>(\"/api/assistants/:assistantId/threads\", threadsController.createThread);\n\n app.put<{\n Params: { assistantId: string; threadId: string };\n Body: any;\n }>(\n \"/api/assistants/:assistantId/threads/:threadId\",\n threadsController.updateThread\n );\n\n app.delete<{\n Params: { assistantId: string; threadId: string };\n }>(\n \"/api/assistants/:assistantId/threads/:threadId\",\n threadsController.deleteThread\n );\n\n // Configuration routes\n app.get(\n \"/api/config\",\n { schema: getConfigSchema },\n configController.getConfig\n );\n\n app.put<{\n Body: { config: Record<string, any> };\n }>(\n \"/api/config\",\n { schema: updateConfigSchema },\n configController.updateConfig\n );\n\n // Models routes\n app.get(\"/api/models\", modelsController.getModels);\n\n app.put<{\n Body: { models: any[] };\n }>(\"/api/models\", modelsController.updateModels);\n\n // Tools config meta route\n app.get(\"/api/tools\", toolsController.getToolConfigs);\n\n // Health check route\n app.get(\n \"/health\",\n { schema: getHealthSchema },\n healthController.getHealth\n );\n\n // Schedule routes for viewing scheduled tasks by thread\n app.get<{\n Params: { assistantId: string; threadId: string };\n Querystring: {\n status?: ScheduledTaskStatus;\n limit?: string;\n offset?: string;\n };\n }>(\n \"/api/assistants/:assistantId/threads/:threadId/schedules\",\n schedulesController.getThreadSchedules\n );\n\n // Get a specific scheduled task\n app.get<{\n Params: { taskId: string };\n }>(\"/api/schedules/:taskId\", schedulesController.getScheduledTask);\n\n // Cancel a scheduled task\n app.post<{\n Params: { taskId: string };\n }>(\"/api/schedules/:taskId/cancel\", schedulesController.cancelScheduledTask);\n\n // Pause a scheduled cron task\n app.post<{\n Params: { taskId: string };\n }>(\"/api/schedules/:taskId/pause\", schedulesController.pauseScheduledTask);\n\n // Resume a paused cron task\n app.post<{\n Params: { taskId: string };\n }>(\"/api/schedules/:taskId/resume\", schedulesController.resumeScheduledTask);\n\n // Skills CRUD routes\n app.get(\"/api/skills\", skillsController.getSkillList);\n\n app.get<{\n Params: { id: string };\n }>(\n \"/api/skills/:id\",\n skillsController.getSkill\n );\n\n app.post<{\n Body: any;\n }>(\n \"/api/skills\",\n skillsController.createSkill\n );\n\n app.put<{\n Params: { id: string };\n Body: any;\n }>(\n \"/api/skills/:id\",\n skillsController.updateSkill\n );\n\n app.delete<{\n Params: { id: string };\n }>(\n \"/api/skills/:id\",\n skillsController.deleteSkill\n );\n\n // Skills search and filter routes\n app.get<{\n Querystring: { key: string; value: string };\n }>(\n \"/api/skills/search/metadata\",\n skillsController.searchSkillsByMetadata\n );\n\n app.get<{\n Querystring: { compatibility: string };\n }>(\n \"/api/skills/filter/compatibility\",\n skillsController.filterSkillsByCompatibility\n );\n\n app.get<{\n Querystring: { license: string };\n }>(\n \"/api/skills/filter/license\",\n skillsController.filterSkillsByLicense\n );\n\n // Collections CRUD routes\n app.get(\"/api/collections\", collectionController.getCollectionList);\n\n app.get<{\n Params: { name: string };\n }>(\"/api/collections/:name\", collectionController.getCollection);\n\n app.post<{\n Body: any;\n }>(\"/api/collections\", collectionController.createCollection);\n\n app.put<{\n Params: { name: string };\n Body: any;\n }>(\"/api/collections/:name\", collectionController.updateCollection);\n\n app.delete<{\n Params: { name: string };\n }>(\"/api/collections/:name\", collectionController.deleteCollection);\n\n // Embeddings route\n app.get(\"/api/embeddings\", embeddingsController.listEmbeddings);\n\n // Collection entries routes\n app.get<{\n Params: { name: string };\n }>(\"/api/collections/:name/entries\", entriesController.listEntries);\n\n app.post<{\n Params: { name: string };\n Body: any;\n }>(\"/api/collections/:name/entries\", entriesController.createEntry);\n\n app.get<{\n Params: { name: string; id: string };\n }>(\"/api/collections/:name/entries/:id\", entriesController.getEntry);\n\n app.put<{\n Params: { name: string; id: string };\n Body: any;\n }>(\"/api/collections/:name/entries/:id\", entriesController.updateEntry);\n\n app.delete<{\n Params: { name: string; id: string };\n }>(\"/api/collections/:name/entries/:id\", entriesController.deleteEntry);\n\n app.post<{\n Params: { name: string };\n Body: any;\n }>(\"/api/collections/:name/search\", entriesController.searchEntries);\n\n registerSandboxProxyRoutes(app);\n\n registerEvalRoutes(app);\n\n registerWorkspaceRoutes(app);\n\n registerDatabaseConfigRoutes(app);\n\n registerMetricsServerConfigRoutes(app);\n\n connectionRoutes(app);\n\n // Plugin middleware types discovery\n middlewareTypesRoutes(app);\n\n // Data query route\n app.post<{\n Body: any;\n }>(\n \"/api/data/query\",\n { schema: dataQuerySchema },\n dataQueryController.executeDataQuery\n );\n\n registerMcpServerConfigRoutes(app);\n\n registerUserRoutes(app);\n\n registerTenantRoutes(app);\n\n registerAuthRoutes(app, {\n autoApproveUsers: process.env.AUTO_APPROVE_USERS !== \"false\",\n allowTenantRegistration: process.env.ALLOW_TENANT_REGISTRATION !== \"false\",\n jwtSecret: resolveConsoleTokenSecret(process.env.AUTH_REQUIRED === \"true\"),\n });\n\n registerChannelRoutes(app, channelDeps);\n\n registerChannelInstallationRoutes(app);\n\n registerMenuItemRoutes(app);\n\n if (channelDeps) {\n registerChannelBindingRoutes(app);\n }\n\n // Direct inbound message dispatch\n if (channelDeps?.router) {\n app.post(\"/api/channels/inbound\", async (request, reply) => {\n try {\n const router = channelDeps.router;\n const msg = request.body as Record<string, unknown>;\n\n if (!msg.channel || !msg.sender || !msg.content) {\n reply.status(400).send({\n success: false,\n message: \"Missing required fields: channel, sender, content\",\n });\n return;\n }\n\n const inboundMessage = {\n channel: msg.channel as string,\n channelInstallationId: (msg.channelInstallationId || \"\") as string,\n tenantId: msg.tenantId as string | undefined,\n sender: {\n id: (msg.sender as Record<string, unknown>).id as string,\n displayName: (msg.sender as Record<string, unknown>).displayName as string | undefined,\n },\n content: {\n text: (msg.content as Record<string, unknown>).text as string,\n metadata: (msg.content as Record<string, unknown>).metadata as Record<string, unknown> | undefined,\n },\n conversation: msg.conversation as { id: string; type: string } | undefined,\n replyTarget: msg.replyTarget as Record<string, unknown> | undefined,\n } as Parameters<typeof router.dispatch>[0];\n\n await router.dispatch(inboundMessage).catch((error) => {\n console.error(JSON.stringify({\n event: \"inbound:dispatch_error\",\n error: error instanceof Error ? error.message : String(error),\n channel: inboundMessage.channel,\n senderId: inboundMessage.sender.id,\n }));\n });\n\n reply.status(200).send({ accepted: true });\n } catch (error) {\n console.error(\"Inbound route error:\", error);\n reply.status(500).send({ success: false, message: \"Internal error\" });\n }\n });\n }\n\n // Workflow tracking routes\n app.get(\n \"/api/workflows/definitions\",\n workflowTrackingController.getAllWorkflowDefinitions\n );\n\n app.get<{\n Querystring: { assistantId?: string; status?: string };\n }>(\n \"/api/workflows/runs\",\n workflowTrackingController.getAllWorkflowRuns\n );\n\n app.get<{\n Querystring: { page?: string; pageSize?: string };\n }>(\n \"/api/workflows/inbox\",\n workflowTrackingController.getInboxItems\n );\n\n app.get<{\n Params: { assistantId: string };\n }>(\n \"/api/assistants/:assistantId/workflows/definitions\",\n workflowTrackingController.getWorkflowDefinitions\n );\n\n app.get<{\n Params: { assistantId: string; threadId: string };\n }>(\n \"/api/assistants/:assistantId/threads/:threadId/workflows/runs\",\n workflowTrackingController.getWorkflowRuns\n );\n\n app.get<{\n Params: { runId: string };\n }>(\"/api/workflows/runs/:runId\", workflowTrackingController.getWorkflowRun);\n\n app.delete<{\n Params: { runId: string };\n }>(\"/api/workflows/runs/:runId\", workflowTrackingController.deleteWorkflowRun);\n\n app.get<{\n Params: { runId: string };\n Querystring: { step_type?: string; status?: string };\n }>(\"/api/workflows/runs/:runId/steps\", workflowTrackingController.getRunSteps);\n\n app.get<{\n Params: { runId: string };\n }>(\"/api/workflows/runs/:runId/tasks\", workflowTrackingController.getRunTasks);\n\n // Abort a running workflow — stops graph + all sub-agents\n app.post<{\n Params: { runId: string };\n }>(\"/api/workflows/runs/:runId/abort\", workflowTrackingController.abortWorkflowRun);\n\n // 简化的 Inbox 任务回复接口(后台 streaming 执行,立即返回)\n app.post<{\n Body: { runId: string; answers: Array<{ questionIndex: number; selectedOptions: string[] }> };\n }>(\"/api/workflows/inbox/reply\", workflowTrackingController.replyInboxTask);\n\n // // Thread 状态查询路由\n // app.get(\"/api/threads/:thread_id/status\", getThreadStatusHandler);\n // app.get(\"/api/assistants/:assistant_id/threads/status\", getAgentThreadsHandler);\n // app.get(\"/api/threads/active\", getActiveThreadsHandler);\n\n // // Thread 消息队列路由\n // app.post(\"/api/threads/:thread_id/messages\", addMessageHandler);\n // app.delete(\"/api/threads/:thread_id/messages/:message_id\", removeMessageHandler);\n // app.put(\"/api/threads/:thread_id/queue-config\", updateQueueConfigHandler);\n\n // Delete pending message route\n app.delete<{\n Params: { assistant_id: string; thread_id: string; message_id: string };\n }>(\n \"/api/assistants/:assistant_id/threads/:thread_id/pending-messages/:message_id\",\n removePendingMessageHandler\n );\n\n // Export/Import endpoints\n app.get(\"/api/tenants/exportable-types\", exportImportController.getExportableTypes);\n\n app.post<{ Params: { tenantId: string }; Body: { entityTypes: string[]; entityIds?: Record<string, string[]> } }>(\n \"/api/tenants/:tenantId/export\",\n exportImportController.exportConfig,\n );\n\n app.post<{ Params: { tenantId: string }; Body: { entityTypes: string[]; entityIds?: Record<string, string[]> } }>(\n \"/api/tenants/:tenantId/export/confirm\",\n exportImportController.exportConfigConfirm,\n );\n\n app.post<{ Params: { tenantId: string }; Body: { entityTypes: string[] } }>(\n \"/api/tenants/:tenantId/export/entities\",\n exportImportController.previewEntities,\n );\n\n app.get<{ Params: { tenantId: string; jobId: string } }>(\n \"/api/tenants/:tenantId/export/:jobId/download\",\n exportImportController.downloadExport,\n );\n\n app.post<{ Params: { tenantId: string }; Body: { bundle?: unknown; resolutions?: unknown } }>(\n \"/api/tenants/:tenantId/import/preview\",\n exportImportController.importPreview,\n );\n\n app.post<{ Params: { tenantId: string }; Body: { bundle?: unknown; resolutions?: unknown } }>(\n \"/api/tenants/:tenantId/import/apply\",\n exportImportController.importApply,\n );\n};\n","import type {\n AgentWebApp,\n AgentWebAppScope,\n AgentWebAppStore,\n AgentWebAppStorePatch,\n AssistantStore,\n CreateAgentWebAppInput,\n ProjectStore,\n} from \"@axiom-lattice/protocols\";\nimport type { UpdateAgentWebAppManagementInput } from \"../../schemas/agent-web-app\";\n\nexport interface AgentWebAppManagementContext {\n tenantId: string;\n userId: string;\n}\n\nexport interface AgentWebAppServiceDependencies {\n webAppStore: AgentWebAppStore;\n assistantStore: AssistantStore;\n projectStore: ProjectStore;\n modelRegistry: { has(key: string): boolean };\n configuredAgentResolver: ConfiguredAgentResolver;\n}\n\nexport interface ConfiguredAgentResolver {\n exists(tenantId: string, assistantId: string): Promise<boolean>;\n}\n\nexport interface ConfiguredAgentRegistryAdapter {\n hydrate(tenantId: string): Promise<void>;\n has(tenantId: string, assistantId: string): boolean;\n}\n\nexport function createConfiguredAgentResolver(\n registry: ConfiguredAgentRegistryAdapter,\n): ConfiguredAgentResolver {\n return {\n async exists(tenantId, assistantId) {\n await registry.hydrate(tenantId);\n return registry.has(tenantId, assistantId);\n },\n };\n}\n\nexport class AgentWebAppError extends Error {\n constructor(\n public readonly code: string,\n public readonly statusCode: number,\n message: string,\n ) {\n super(message);\n this.name = \"AgentWebAppError\";\n }\n}\n\nexport class AgentWebAppService {\n constructor(private readonly deps: AgentWebAppServiceDependencies) {}\n\n async create(context: AgentWebAppManagementContext, input: CreateAgentWebAppInput): Promise<AgentWebApp> {\n await this.validateAssistant(context, input.assistantId);\n const normalized = await this.validateConfig(context.tenantId, input);\n return this.deps.webAppStore.create(context.tenantId, normalized);\n }\n\n async list(context: AgentWebAppManagementContext, assistantId?: string): Promise<AgentWebApp[]> {\n const records = await this.deps.webAppStore.list(context.tenantId, assistantId);\n const visible: AgentWebApp[] = [];\n for (const record of records) {\n if (await this.canAccessAssistant(context, record.assistantId)) visible.push(record);\n }\n return visible;\n }\n\n async get(context: AgentWebAppManagementContext, webAppId: string): Promise<AgentWebApp> {\n return this.requireAuthorizedWebApp(context, webAppId);\n }\n\n async update(\n context: AgentWebAppManagementContext,\n webAppId: string,\n patch: UpdateAgentWebAppManagementInput,\n ): Promise<AgentWebApp> {\n const current = await this.requireAuthorizedWebApp(context, webAppId);\n const effective: CreateAgentWebAppInput = {\n assistantId: current.assistantId,\n name: patch.name ?? current.name,\n description: Object.prototype.hasOwnProperty.call(patch, \"description\")\n ? patch.description\n : current.description,\n integration: current.integration,\n scope: { ...current.scope, ...patch.scope },\n features: { ...current.features, ...patch.features },\n appearance: { ...current.appearance, ...patch.appearance },\n };\n await this.validateAssistant(context, current.assistantId);\n const validated = await this.validateConfig(context.tenantId, effective);\n const update: AgentWebAppStorePatch = {\n ...(patch.name !== undefined ? { name: validated.name } : {}),\n ...(Object.prototype.hasOwnProperty.call(patch, \"description\")\n ? { description: validated.description }\n : {}),\n ...(patch.scope ? { scope: validated.scope } : {}),\n ...(patch.features ? { features: validated.features } : {}),\n ...(patch.appearance ? { appearance: validated.appearance } : {}),\n };\n return this.writeSnapshot(context, current, update);\n }\n\n async enable(context: AgentWebAppManagementContext, webAppId: string): Promise<AgentWebApp> {\n const current = await this.requireAuthorizedWebApp(context, webAppId);\n await this.validateConfig(context.tenantId, current);\n return this.writeSnapshot(context, current, { status: \"active\" });\n }\n\n async disable(context: AgentWebAppManagementContext, webAppId: string): Promise<AgentWebApp> {\n const current = await this.requireAuthorizedWebApp(context, webAppId);\n return this.writeSnapshot(context, current, { status: \"disabled\" });\n }\n\n async delete(context: AgentWebAppManagementContext, webAppId: string): Promise<void> {\n await this.requireAuthorizedWebApp(context, webAppId);\n if (!await this.deps.webAppStore.delete(context.tenantId, webAppId)) this.notFound();\n }\n\n private async validateAssistant(context: AgentWebAppManagementContext, assistantId: string): Promise<void> {\n const assistant = await this.deps.assistantStore.getAssistantById(context.tenantId, assistantId);\n if (assistant) {\n if (assistant.ownerUserId && assistant.ownerUserId !== context.userId) {\n throw new AgentWebAppError(\"ASSISTANT_FORBIDDEN\", 403, \"Assistant is not available to this user\");\n }\n return;\n }\n if (await this.deps.configuredAgentResolver.exists(context.tenantId, assistantId)) return;\n throw new AgentWebAppError(\"ASSISTANT_NOT_FOUND\", 404, \"Assistant not found\");\n }\n\n private async validateConfig(\n tenantId: string,\n input: CreateAgentWebAppInput,\n ): Promise<CreateAgentWebAppInput> {\n const allowedProjectIds = [...new Set(input.scope.allowedProjectIds)];\n if (!allowedProjectIds.length || !allowedProjectIds.includes(input.scope.defaultProjectId)) {\n throw new AgentWebAppError(\"PROJECT_SCOPE_INVALID\", 400, \"Default project must be in the project allowlist\");\n }\n if (!input.features.projectSelector && allowedProjectIds.length !== 1) {\n throw new AgentWebAppError(\"PROJECT_SCOPE_INVALID\", 400, \"Disabled project selection requires exactly one project\");\n }\n for (const projectId of allowedProjectIds) {\n if (!await this.deps.projectStore.getProjectById(tenantId, projectId)) {\n throw new AgentWebAppError(\"PROJECT_NOT_FOUND\", 404, \"Project not found\");\n }\n }\n\n const scope = this.validateModels(input.scope, input.features.modelSelector);\n return { ...input, scope: { ...scope, allowedProjectIds } };\n }\n\n private validateModels(scope: AgentWebAppScope, modelSelector: boolean): AgentWebAppScope {\n const allowedModelKeys = scope.allowedModelKeys\n ? [...new Set(scope.allowedModelKeys)]\n : undefined;\n if (!allowedModelKeys?.length) {\n if (scope.defaultModelKey || modelSelector) {\n throw new AgentWebAppError(\"MODEL_SCOPE_INVALID\", 400, \"Agent-default models cannot enable model selection or set a default\");\n }\n return { ...scope, defaultModelKey: undefined, allowedModelKeys: undefined };\n }\n if (!modelSelector && allowedModelKeys.length > 1) {\n throw new AgentWebAppError(\"MODEL_SCOPE_INVALID\", 400, \"Disabled model selection allows at most one model\");\n }\n if (scope.defaultModelKey && !allowedModelKeys.includes(scope.defaultModelKey)) {\n throw new AgentWebAppError(\"MODEL_SCOPE_INVALID\", 400, \"Default model must be in the model allowlist\");\n }\n for (const key of allowedModelKeys) {\n if (!this.deps.modelRegistry.has(key)) {\n throw new AgentWebAppError(\"MODEL_NOT_FOUND\", 400, \"Configured model is not registered\");\n }\n }\n return { ...scope, allowedModelKeys };\n }\n\n private async requireWebApp(tenantId: string, webAppId: string): Promise<AgentWebApp> {\n return (await this.deps.webAppStore.getById(tenantId, webAppId)) ?? this.notFound();\n }\n\n private async requireAuthorizedWebApp(\n context: AgentWebAppManagementContext,\n webAppId: string,\n ): Promise<AgentWebApp> {\n const webApp = await this.requireWebApp(context.tenantId, webAppId);\n if (!await this.canAccessAssistant(context, webApp.assistantId)) this.notFound();\n return webApp;\n }\n\n private async canAccessAssistant(\n context: AgentWebAppManagementContext,\n assistantId: string,\n ): Promise<boolean> {\n const assistant = await this.deps.assistantStore.getAssistantById(context.tenantId, assistantId);\n if (assistant) return !assistant.ownerUserId || assistant.ownerUserId === context.userId;\n return this.deps.configuredAgentResolver.exists(context.tenantId, assistantId);\n }\n\n private async writeSnapshot(\n context: AgentWebAppManagementContext,\n current: AgentWebApp,\n patch: AgentWebAppStorePatch,\n ): Promise<AgentWebApp> {\n const updated = await this.deps.webAppStore.update(\n context.tenantId,\n current.id,\n patch,\n { expectedUpdatedAt: current.updatedAt },\n );\n if (updated) return updated;\n await this.requireAuthorizedWebApp(context, current.id);\n throw new AgentWebAppError(\"WEB_APP_CONFLICT\", 409, \"Agent Web App was modified concurrently\");\n }\n\n private notFound(): never {\n throw new AgentWebAppError(\"WEB_APP_NOT_FOUND\", 404, \"Agent Web App not found\");\n }\n}\n","import type { AgentWebApp, CreateAgentWebAppInput } from \"@axiom-lattice/protocols\";\nimport type { FastifyInstance, FastifyReply, FastifyRequest } from \"fastify\";\nimport { ZodError } from \"zod\";\nimport {\n createAgentWebAppSchema,\n listAgentWebAppsQuerySchema,\n updateAgentWebAppSchema,\n} from \"../schemas/agent-web-app\";\nimport {\n AgentWebAppError,\n type AgentWebAppManagementContext,\n} from \"../services/agent-web-app/AgentWebAppService\";\nimport type { UpdateAgentWebAppManagementInput } from \"../schemas/agent-web-app\";\n\nexport interface AgentWebAppManagementService {\n create(context: AgentWebAppManagementContext, input: CreateAgentWebAppInput): Promise<AgentWebApp>;\n list(context: AgentWebAppManagementContext, assistantId?: string): Promise<AgentWebApp[]>;\n get(context: AgentWebAppManagementContext, webAppId: string): Promise<AgentWebApp>;\n update(\n context: AgentWebAppManagementContext,\n webAppId: string,\n patch: UpdateAgentWebAppManagementInput,\n ): Promise<AgentWebApp>;\n enable(context: AgentWebAppManagementContext, webAppId: string): Promise<AgentWebApp>;\n disable(context: AgentWebAppManagementContext, webAppId: string): Promise<AgentWebApp>;\n delete(context: AgentWebAppManagementContext, webAppId: string): Promise<void>;\n}\n\nexport interface AgentWebAppRouteDependencies {\n service: AgentWebAppManagementService;\n}\n\nexport function registerAgentWebAppRoutes(\n app: FastifyInstance,\n deps: AgentWebAppRouteDependencies,\n): void {\n app.register(async (routes) => {\n routes.setErrorHandler((error, _request, reply) => normalizeError(reply, error));\n registerScopedRoutes(routes, deps.service);\n });\n}\n\nfunction registerScopedRoutes(app: FastifyInstance, service: AgentWebAppManagementService): void {\n app.post(\"/api/web-apps\", async (request, reply) => handle(reply, async () => ({\n statusCode: 201,\n data: await service.create(requireContext(request), createAgentWebAppSchema.parse(request.body)),\n })));\n\n app.get(\"/api/web-apps\", async (request, reply) => handle(reply, async () => {\n const context = requireContext(request);\n const query = listAgentWebAppsQuerySchema.parse(request.query);\n const records = await service.list(context, query.assistantId);\n return { data: { records, total: records.length } };\n }));\n\n app.get<{ Params: { webAppId: string } }>(\"/api/web-apps/:webAppId\", async (request, reply) =>\n handle(reply, async () => ({ data: await service.get(requireContext(request), request.params.webAppId) })));\n\n app.patch<{ Params: { webAppId: string } }>(\"/api/web-apps/:webAppId\", async (request, reply) =>\n handle(reply, async () => ({\n data: await service.update(\n requireContext(request),\n request.params.webAppId,\n updateAgentWebAppSchema.parse(request.body),\n ),\n })));\n\n app.post<{ Params: { webAppId: string } }>(\"/api/web-apps/:webAppId/enable\", async (request, reply) =>\n handle(reply, async () => ({ data: await service.enable(requireContext(request), request.params.webAppId) })));\n\n app.post<{ Params: { webAppId: string } }>(\"/api/web-apps/:webAppId/disable\", async (request, reply) =>\n handle(reply, async () => ({ data: await service.disable(requireContext(request), request.params.webAppId) })));\n\n app.delete<{ Params: { webAppId: string } }>(\"/api/web-apps/:webAppId\", async (request, reply) =>\n handle(reply, async () => {\n await service.delete(requireContext(request), request.params.webAppId);\n return { data: { id: request.params.webAppId } };\n }));\n}\n\nfunction requireContext(request: FastifyRequest): AgentWebAppManagementContext {\n const user = (request as unknown as { user?: { id?: string; userId?: string; tenantId?: string } }).user;\n const userId = user?.id ?? user?.userId;\n if (!userId || !user?.tenantId) {\n throw new AgentWebAppError(\"UNAUTHORIZED\", 401, \"Console session required\");\n }\n return { tenantId: user.tenantId, userId };\n}\n\nasync function handle(\n reply: FastifyReply,\n operation: () => Promise<{ data: unknown; statusCode?: number }>,\n): Promise<unknown> {\n try {\n const result = await operation();\n return reply.code(result.statusCode ?? 200).send({ success: true, data: result.data });\n } catch (error) {\n if (error instanceof ZodError) {\n return invalidRequest(reply, 400);\n }\n if (error instanceof AgentWebAppError) {\n return reply.code(error.statusCode).send({\n success: false,\n error: { code: error.code, message: error.message, retryable: false },\n });\n }\n throw error;\n }\n}\n\nfunction normalizeError(reply: FastifyReply, error: Error & { statusCode?: number }): unknown {\n if (error instanceof AgentWebAppError) {\n return reply.code(error.statusCode).send({\n success: false,\n error: { code: error.code, message: error.message, retryable: false },\n });\n }\n if (error.statusCode && error.statusCode >= 400 && error.statusCode < 500) {\n return invalidRequest(reply, error.statusCode);\n }\n return reply.code(500).send({\n success: false,\n error: { code: \"INTERNAL_ERROR\", message: \"Internal server error\", retryable: false },\n });\n}\n\nfunction invalidRequest(reply: FastifyReply, statusCode: number): unknown {\n return reply.code(statusCode).send({\n success: false,\n error: { code: \"INVALID_REQUEST\", message: \"Invalid request\", retryable: false },\n });\n}\n","import { z } from \"zod\";\n\nconst externalId = z.string().min(1).max(128).regex(/^[A-Za-z0-9._:@-]+$/);\nconst modelKey = z.string().min(1).max(128);\n\nexport const agentWebAppScopeSchema = z.object({\n defaultProjectId: externalId,\n allowedProjectIds: z.array(externalId).min(1).max(100),\n defaultModelKey: modelKey.optional(),\n allowedModelKeys: z.array(modelKey).max(100).optional(),\n}).strict();\n\nexport const agentWebAppFeaturesSchema = z.object({\n projectSelector: z.boolean(),\n modelSelector: z.boolean(),\n threadManagement: z.boolean(),\n attachments: z.boolean(),\n hitl: z.boolean(),\n genUI: z.boolean(),\n}).strict();\n\nexport const agentWebAppAppearanceSchema = z.object({\n title: z.string().max(120).optional(),\n welcomeMessage: z.string().max(1000).optional(),\n primaryColor: z.string().regex(/^#[0-9A-Fa-f]{6}$/).optional(),\n}).strict();\n\nexport const createAgentWebAppSchema = z.object({\n assistantId: externalId,\n name: z.string().min(1).max(120),\n description: z.string().max(1000).optional(),\n integration: z.object({ type: z.literal(\"react_sdk\") }).strict(),\n scope: agentWebAppScopeSchema,\n features: agentWebAppFeaturesSchema,\n appearance: agentWebAppAppearanceSchema,\n}).strict();\n\nexport const updateAgentWebAppSchema = z.object({\n name: z.string().min(1).max(120).optional(),\n description: z.string().max(1000).optional(),\n scope: agentWebAppScopeSchema.partial().strict().optional(),\n features: agentWebAppFeaturesSchema.partial().strict().optional(),\n appearance: agentWebAppAppearanceSchema.partial().strict().optional(),\n}).strict().refine((value) => Object.keys(value).length > 0, \"Patch must not be empty\");\n\nexport const listAgentWebAppsQuerySchema = z.object({\n assistantId: externalId.optional(),\n}).strict();\n\nexport type CreateAgentWebAppManagementInput = z.infer<typeof createAgentWebAppSchema>;\nexport type UpdateAgentWebAppManagementInput = z.infer<typeof updateAgentWebAppSchema>;\n","import type { AgentWebAppBootstrap, AgentWebAppRuntimeMessage, AgentWebAppRuntimeThread, MessageChunk } from \"@axiom-lattice/protocols\";\nimport type { FastifyInstance, FastifyReply, FastifyRequest } from \"fastify\";\nimport { z, ZodError } from \"zod\";\nimport { AgentWebAppRuntimeError, type AgentWebAppRuntimeSelection } from \"../services/agent-web-app/AgentWebAppRuntimeService\";\nimport {\n createAgentWebAppStreamProjectionContext,\n projectAgentWebAppChunk,\n} from \"../services/agent-web-app/AgentWebAppStreamProjector\";\nimport { pipeAsyncIterableToSse, type SseWritable } from \"../services/streaming/pipeAsyncIterableToSse\";\n\nconst idSchema = z.string().min(1).max(128);\nconst paramsSchema = z.object({ webAppId: idSchema }).strict();\nconst threadParamsSchema = z.object({ webAppId: idSchema, threadId: idSchema }).strict();\nconst interruptParamsSchema = z.object({ webAppId: idSchema, threadId: idSchema, interruptId: idSchema }).strict();\nconst bootstrapQuerySchema = z.object({ projectId: idSchema.optional(), modelKey: idSchema.optional() }).strict();\nconst projectQuerySchema = z.object({ projectId: idSchema.optional() }).strict();\nconst threadBodySchema = z.object({ projectId: idSchema.optional(), label: z.string().max(128).optional() }).strict();\nconst streamBodySchema = z.object({\n content: z.string().trim().min(1).max(32_768),\n projectId: idSchema.optional(),\n modelKey: idSchema.optional(),\n attachmentRefs: z.array(z.string().min(1).max(8_192)).max(10).optional(),\n}).strict();\nconst resumeBodySchema = z.object({\n projectId: idSchema.optional(),\n modelKey: idSchema.optional(),\n message: z.string().trim().min(1).max(4_096),\n response: z.union([\n z.boolean(),\n z.string().max(4_096),\n z.object({ approved: z.boolean(), feedback: z.string().max(4_096).optional() }).strict(),\n ]),\n}).strict();\nconst MAX_ATTACHMENT_BYTES = 10 * 1024 * 1024;\n\nexport interface AgentWebAppExternalIdentity { userId: string; assurance: \"unverified\"; }\ninterface ConsoleUser { id: string; tenantId: string }\n\n/** Adapter boundary for external identity mechanisms such as a future verified token. */\nexport interface AgentWebAppExternalIdentityResolver {\n resolve(request: FastifyRequest): AgentWebAppExternalIdentity;\n}\n\n/** Resolve the V1 unverified identity from exactly one trimmed external-user header. */\nexport function createExternalHeaderIdentityResolver(): AgentWebAppExternalIdentityResolver {\n return { resolve(request) {\n const raw = request.headers[\"x-axiom-external-user-id\"];\n if (raw === undefined) throw new AgentWebAppRuntimeError(\"USER_ID_REQUIRED\", 401, \"External user id is required\");\n if (Array.isArray(raw) || typeof raw !== \"string\") throw new AgentWebAppRuntimeError(\"INVALID_USER_ID\", 400, \"External user id is invalid\");\n // V1 explicitly trims surrounding HTTP whitespace before validation.\n const userId = raw.trim();\n if (!/^[A-Za-z0-9._:@-]+$/.test(userId) || userId.length > 128) throw new AgentWebAppRuntimeError(\"INVALID_USER_ID\", 400, \"External user id is invalid\");\n return { userId, assurance: \"unverified\" };\n } };\n}\n\nexport interface AgentWebAppRuntimeRouteService {\n bootstrap(webAppId: string, userId: string, selection: AgentWebAppRuntimeSelection): Promise<AgentWebAppBootstrap>;\n listThreads(webAppId: string, userId: string, selection: AgentWebAppRuntimeSelection): Promise<AgentWebAppRuntimeThread[]>;\n createThread(webAppId: string, userId: string, input: AgentWebAppRuntimeSelection & { label?: string }): Promise<AgentWebAppRuntimeThread>;\n /** Update a label; omitted or blank labels are non-clearing and preserve the current label. */\n updateThread(webAppId: string, userId: string, threadId: string, input: AgentWebAppRuntimeSelection & { label?: string }): Promise<AgentWebAppRuntimeThread>;\n deleteThread(webAppId: string, userId: string, threadId: string, selection: AgentWebAppRuntimeSelection): Promise<void>;\n getMessages(webAppId: string, userId: string, threadId: string, selection: AgentWebAppRuntimeSelection): Promise<AgentWebAppRuntimeMessage[]>;\n streamMessage(webAppId: string, userId: string, threadId: string, input: AgentWebAppRuntimeSelection & { content: string; attachmentRefs?: string[] }): Promise<AgentWebAppExecution>;\n abort(webAppId: string, userId: string, threadId: string, selection: AgentWebAppRuntimeSelection): Promise<void>;\n uploadAttachment(webAppId: string, userId: string, threadId: string, selection: AgentWebAppRuntimeSelection, file: { name: string; mimeType: string; bytes: Uint8Array }): Promise<{ ref: string; name: string; mimeType: string; size: number }>;\n resumeInterrupt(webAppId: string, userId: string, threadId: string, interruptId: string, selection: AgentWebAppRuntimeSelection, input: { response: unknown; message: string }): Promise<AgentWebAppExecution>;\n}\n\ninterface AgentWebAppExecution { messageId: string; stream: AsyncIterable<MessageChunk>; allowInterrupts: boolean; allowGenUI: boolean }\n\nexport interface AgentWebAppRuntimeRouteDependencies {\n service: AgentWebAppRuntimeRouteService;\n identityResolver?: AgentWebAppExternalIdentityResolver;\n}\n\nexport function registerAgentWebAppRuntimeRoutes(app: FastifyInstance, deps: AgentWebAppRuntimeRouteDependencies): void {\n const identities = deps.identityResolver ?? createExternalHeaderIdentityResolver();\n app.register(async (routes) => {\n routes.setErrorHandler((error, _request, reply) => normalizeError(reply, error));\n routes.get(\"/api/web-apps/:webAppId/runtime/bootstrap\", async (request, reply) => handle(reply, async () => {\n const { webAppId } = paramsSchema.parse(request.params); const identity = resolveRuntimeIdentity(request, webAppId, identities);\n return { data: await deps.service.bootstrap(webAppId, identity.userId, withPreview(bootstrapQuerySchema.parse(request.query), identity.preview)) };\n }));\n routes.get(\"/api/web-apps/:webAppId/runtime/threads\", async (request, reply) => handle(reply, async () => {\n const { webAppId } = paramsSchema.parse(request.params); const identity = resolveRuntimeIdentity(request, webAppId, identities);\n const records = await deps.service.listThreads(webAppId, identity.userId, withPreview(projectQuerySchema.parse(request.query), identity.preview));\n return { data: { records, total: records.length } };\n }));\n routes.post(\"/api/web-apps/:webAppId/runtime/threads\", async (request, reply) => handle(reply, async () => {\n const { webAppId } = paramsSchema.parse(request.params); const identity = resolveRuntimeIdentity(request, webAppId, identities);\n return { statusCode: 201, data: await deps.service.createThread(webAppId, identity.userId, withPreview(threadBodySchema.parse(request.body), identity.preview)) };\n }));\n routes.patch(\"/api/web-apps/:webAppId/runtime/threads/:threadId\", async (request, reply) => handle(reply, async () => {\n const { webAppId, threadId } = threadParamsSchema.parse(request.params); const identity = resolveRuntimeIdentity(request, webAppId, identities);\n return { data: await deps.service.updateThread(webAppId, identity.userId, threadId, withPreview(threadBodySchema.parse(request.body), identity.preview)) };\n }));\n routes.delete(\"/api/web-apps/:webAppId/runtime/threads/:threadId\", async (request, reply) => handle(reply, async () => {\n const { webAppId, threadId } = threadParamsSchema.parse(request.params); const identity = resolveRuntimeIdentity(request, webAppId, identities);\n await deps.service.deleteThread(webAppId, identity.userId, threadId, withPreview(projectQuerySchema.parse(request.query), identity.preview));\n return { data: { id: threadId } };\n }));\n routes.get(\"/api/web-apps/:webAppId/runtime/threads/:threadId/messages\", async (request, reply) => handle(reply, async () => {\n const { webAppId, threadId } = threadParamsSchema.parse(request.params); const identity = resolveRuntimeIdentity(request, webAppId, identities);\n const messages = await deps.service.getMessages(webAppId, identity.userId, threadId, withPreview(projectQuerySchema.parse(request.query), identity.preview));\n return { data: { messages } };\n }));\n routes.post(\"/api/web-apps/:webAppId/runtime/threads/:threadId/messages/stream\", async (request, reply) => {\n try {\n const { webAppId, threadId } = threadParamsSchema.parse(request.params);\n const identity = resolveRuntimeIdentity(request, webAppId, identities);\n const input = streamBodySchema.parse(request.body);\n const result = await deps.service.streamMessage(webAppId, identity.userId, threadId, withPreview(input, identity.preview));\n beginSse(reply);\n await pipeAgentWebAppStream(reply.raw, result.stream, result);\n } catch (error) {\n return normalizeError(reply, error);\n }\n });\n routes.post(\"/api/web-apps/:webAppId/runtime/threads/:threadId/abort\", async (request, reply) => handle(reply, async () => {\n const { webAppId, threadId } = threadParamsSchema.parse(request.params); const identity = resolveRuntimeIdentity(request, webAppId, identities);\n await deps.service.abort(webAppId, identity.userId, threadId, withPreview(projectQuerySchema.parse(request.query), identity.preview));\n return { data: { aborted: true } };\n }));\n routes.post(\"/api/web-apps/:webAppId/runtime/threads/:threadId/attachments\", async (request, reply) => handle(reply, async () => {\n const { webAppId, threadId } = threadParamsSchema.parse(request.params); const identity = resolveRuntimeIdentity(request, webAppId, identities);\n if (!request.isMultipart()) throw new ZodError([]);\n const part = await request.file({ limits: { files: 1, fileSize: MAX_ATTACHMENT_BYTES } });\n if (!part || !part.filename || part.filename.length > 255) throw new ZodError([]);\n const bytes = await part.toBuffer();\n if (bytes.length === 0 || part.file.truncated) throw new ZodError([]);\n const data = await deps.service.uploadAttachment(webAppId, identity.userId, threadId, withPreview(projectQuerySchema.parse(request.query), identity.preview), {\n name: part.filename, mimeType: part.mimetype || \"application/octet-stream\", bytes,\n });\n return { statusCode: 201, data };\n }));\n routes.post(\"/api/web-apps/:webAppId/runtime/threads/:threadId/interrupts/:interruptId/resume\", async (request, reply) => {\n try {\n const { webAppId, threadId, interruptId } = interruptParamsSchema.parse(request.params); const identity = resolveRuntimeIdentity(request, webAppId, identities);\n const { projectId, modelKey, message, response } = resumeBodySchema.parse(request.body);\n const result = await deps.service.resumeInterrupt(webAppId, identity.userId, threadId, interruptId, withPreview({ projectId, modelKey }, identity.preview), { message, response });\n beginSse(reply);\n await pipeAgentWebAppStream(reply.raw, result.stream, result);\n } catch (error) { return normalizeError(reply, error); }\n });\n });\n}\n\nfunction resolveRuntimeIdentity(request: FastifyRequest, webAppId: string, identities: AgentWebAppExternalIdentityResolver): { userId: string; preview?: { tenantId: string; userId: string } } {\n if (request.headers[\"x-axiom-web-app-preview\"] !== \"true\") return identities.resolve(request);\n const user = (request as unknown as { user?: ConsoleUser }).user;\n if (!user?.id || !user.tenantId) throw new AgentWebAppRuntimeError(\"USER_ID_REQUIRED\", 401, \"Authenticated Console preview is required\");\n return { userId: `console-preview:${user.id}:${webAppId}`, preview: { tenantId: user.tenantId, userId: user.id } };\n}\n\nfunction withPreview<T extends object>(selection: T, preview: { tenantId: string; userId: string } | undefined): T & AgentWebAppRuntimeSelection {\n return { ...selection, ...(preview ? { preview } : {}) };\n}\n\n/** Apply WebApp projection over the shared close-aware SSE transport primitive. */\nexport async function pipeAgentWebAppStream(\n raw: SseWritable,\n stream: AsyncIterable<MessageChunk>,\n options: { allowInterrupts?: boolean; allowGenUI?: boolean } = {},\n): Promise<void> {\n const projection = createAgentWebAppStreamProjectionContext(options);\n await pipeAsyncIterableToSse<MessageChunk, unknown>(raw, stream, {\n project: (chunk) => projectAgentWebAppChunk(chunk, projection),\n onError: () => [\n { type: \"error\", error: { code: \"STREAM_FAILED\", message: \"Stream failed\", retryable: true } },\n { type: \"stream.completed\" },\n ],\n });\n}\n\nfunction beginSse(reply: FastifyReply): void {\n reply.hijack();\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream; charset=utf-8\", \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\", \"X-Accel-Buffering\": \"no\",\n });\n}\n\nasync function handle(reply: FastifyReply, operation: () => Promise<{ data: unknown; statusCode?: number }>): Promise<unknown> {\n try { const result = await operation(); return reply.code(result.statusCode ?? 200).send({ success: true, data: result.data }); }\n catch (error) { return normalizeError(reply, error); }\n}\n\nfunction normalizeError(reply: FastifyReply, error: unknown): unknown {\n if (error instanceof AgentWebAppRuntimeError) return reply.code(error.statusCode).send({ success: false, error: { code: error.code, message: error.message, retryable: false } });\n if (error instanceof ZodError) return reply.code(400).send({ success: false, error: { code: \"INVALID_REQUEST\", message: \"Invalid request\", retryable: false } });\n if (isMultipartRequestError(error)) return reply.code(400).send({ success: false, error: { code: \"INVALID_REQUEST\", message: \"Invalid request\", retryable: false } });\n return reply.code(500).send({ success: false, error: { code: \"INTERNAL_ERROR\", message: \"Internal server error\", retryable: false } });\n}\n\nfunction isMultipartRequestError(error: unknown): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error\n && typeof error.code === \"string\" && error.code.startsWith(\"FST_\");\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport type {\n AgentWebApp,\n AgentWebAppBootstrap,\n AgentWebAppErrorCode,\n AgentWebAppRuntimeMessage,\n AgentWebAppRuntimeThread,\n AgentWebAppStore,\n Assistant,\n Project,\n Thread,\n ThreadStore,\n MessageChunk,\n MessageChunkType,\n TaskFileRef,\n} from \"@axiom-lattice/protocols\";\nimport { MessageChunkTypes, parseAgentWebAppGenUIBlock } from \"@axiom-lattice/protocols\";\nimport { executeScopedAgentMessage } from \"../agents/ScopedAgentExecution\";\nimport { formatFileRefsSection } from \"../files/task-file-refs\";\nimport type { AgentWebAppAttachmentRefService } from \"./AgentWebAppAttachmentRef\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport interface AgentWebAppRuntimeSelection {\n projectId?: string;\n modelKey?: string;\n /** Server-created Console preview authorization; never accepted from public input. */\n preview?: { tenantId: string; userId: string };\n}\n\nexport interface AgentWebAppRuntimeAssistantResolver {\n resolve(tenantId: string, assistantId: string): Promise<Pick<Assistant, \"id\" | \"name\" | \"description\"> | null>;\n}\n\nexport interface AgentWebAppRuntimeMessageReader {\n getCurrentMessages(scope: {\n tenantId: string;\n assistantId: string;\n threadId: string;\n workspaceId: string;\n projectId: string;\n }): Promise<unknown[]>;\n}\n\nexport interface AgentWebAppRuntimeServiceDependencies {\n webAppStore: Pick<AgentWebAppStore, \"findById\">;\n threadStore: ThreadStore;\n assistantResolver: AgentWebAppRuntimeAssistantResolver;\n projectStore: { getProjectById(tenantId: string, projectId: string): Promise<Project | null> };\n modelRegistry: { has(key: string): boolean; label(key: string): string };\n messageReader: AgentWebAppRuntimeMessageReader;\n agentResolver?: AgentWebAppRuntimeAgentResolver;\n attachmentRefs?: AgentWebAppAttachmentRefService;\n saveProjectFile?: (input: {\n tenantId: string; workspaceId: string; projectId: string; assistantId: string;\n name: string; mimeType: string; bytes: Uint8Array; path: string;\n }) => Promise<{ uri: string; name: string; size: number }>;\n authorizePreview?: (webApp: AgentWebApp, preview: { tenantId: string; userId: string }) => Promise<boolean>;\n}\n\nexport interface AgentWebAppRuntimeAgent {\n addMessage(input: { input: { message: string }; command?: { resume: unknown }; custom_run_config?: { modelConfig: { modelKey: string } } }): Promise<{ messageId: string }>;\n chunkStream(messageId: string, stopTypes: MessageChunkType[]): AsyncIterable<MessageChunk>;\n abort(): Promise<void>;\n getCurrentState(): Promise<unknown>;\n}\n\nexport interface AgentWebAppRuntimeAgentResolver {\n getAgent(scope: {\n tenantId: string; assistantId: string; threadId: string; workspaceId: string; projectId: string; modelKey?: string;\n }): AgentWebAppRuntimeAgent;\n}\n\nexport interface AgentWebAppRuntimeStreamInput extends AgentWebAppRuntimeSelection {\n content: string;\n attachmentRefs?: string[];\n}\n\nexport class AgentWebAppRuntimeError extends Error {\n constructor(\n public readonly code: AgentWebAppErrorCode,\n public readonly statusCode: number,\n message: string,\n ) {\n super(message);\n this.name = \"AgentWebAppRuntimeError\";\n }\n}\n\ninterface ResolvedRuntime {\n webApp: AgentWebApp;\n project: Project;\n modelKey?: string;\n}\n\nexport class AgentWebAppRuntimeService {\n constructor(private readonly deps: AgentWebAppRuntimeServiceDependencies) {}\n\n async bootstrap(\n webAppId: string,\n userId: string,\n selection: AgentWebAppRuntimeSelection,\n ): Promise<AgentWebAppBootstrap> {\n const runtime = await this.resolveRuntime(webAppId, selection);\n const assistant = await this.deps.assistantResolver.resolve(\n runtime.webApp.tenantId,\n runtime.webApp.assistantId,\n );\n if (!assistant) this.fail(\"WEB_APP_DISABLED\", 403, \"Agent Web App is unavailable\");\n\n const publicProjectIds = runtime.webApp.features.projectSelector\n ? runtime.webApp.scope.allowedProjectIds\n : [runtime.webApp.scope.defaultProjectId];\n const projects = await Promise.all(publicProjectIds.map(async (id) => {\n const project = await this.deps.projectStore.getProjectById(runtime.webApp.tenantId, id);\n if (!project) this.fail(\"PROJECT_NOT_ALLOWED\", 400, \"Project is not available\");\n return { id: project.id, name: project.name };\n }));\n const defaultModelKey = runtime.webApp.scope.defaultModelKey;\n if (defaultModelKey && !this.deps.modelRegistry.has(defaultModelKey)) {\n this.fail(\"MODEL_NOT_ALLOWED\", 400, \"Default model is not available\");\n }\n const configuredPublicModelKeys = runtime.webApp.features.modelSelector\n ? runtime.webApp.scope.allowedModelKeys ?? []\n : defaultModelKey\n ? [defaultModelKey]\n : [];\n const publicModelKeys = [...new Set(configuredPublicModelKeys)]\n .filter((key) => this.deps.modelRegistry.has(key));\n const models = publicModelKeys.map((key) => ({\n key,\n label: this.deps.modelRegistry.label(key),\n }));\n const result: AgentWebAppBootstrap = {\n webApp: {\n id: runtime.webApp.id,\n name: runtime.webApp.name,\n description: runtime.webApp.description,\n assistant,\n defaultProjectId: runtime.webApp.scope.defaultProjectId,\n defaultModelKey: runtime.webApp.scope.defaultModelKey,\n features: runtime.webApp.features,\n appearance: runtime.webApp.appearance,\n identityAssurance: \"unverified\",\n },\n projects,\n models,\n };\n if (!runtime.webApp.features.threadManagement) {\n result.thread = await this.resolveImplicitThread(runtime, userId);\n }\n return result;\n }\n\n async listThreads(\n webAppId: string,\n userId: string,\n selection: AgentWebAppRuntimeSelection,\n ): Promise<AgentWebAppRuntimeThread[]> {\n const runtime = await this.resolveRuntime(webAppId, selection);\n this.requireFeature(runtime.webApp.features.threadManagement);\n const threads = await this.ownedThreads(runtime, userId);\n return threads.sort(compareThreads).map(toRuntimeThread);\n }\n\n async createThread(\n webAppId: string,\n userId: string,\n input: AgentWebAppRuntimeSelection & { label?: string },\n ): Promise<AgentWebAppRuntimeThread> {\n const runtime = await this.resolveRuntime(webAppId, input);\n this.requireFeature(runtime.webApp.features.threadManagement);\n return this.createOwnedThread(runtime, userId, input.label);\n }\n\n /** Update a thread label; omitted or blank labels preserve the existing label. */\n async updateThread(\n webAppId: string,\n userId: string,\n threadId: string,\n input: AgentWebAppRuntimeSelection & { label?: string },\n ): Promise<AgentWebAppRuntimeThread> {\n const runtime = await this.resolveRuntime(webAppId, input);\n this.requireFeature(runtime.webApp.features.threadManagement);\n const thread = await this.requireOwnedThread(runtime, userId, threadId);\n const label = normalizeLabel(input.label);\n const updated = await this.deps.threadStore.updateThread(runtime.webApp.tenantId, thread.id, {\n metadata: this.metadata(runtime, userId, label),\n });\n if (!updated) this.threadNotFound();\n return toRuntimeThread(updated);\n }\n\n async deleteThread(\n webAppId: string,\n userId: string,\n threadId: string,\n selection: AgentWebAppRuntimeSelection,\n ): Promise<void> {\n const runtime = await this.resolveRuntime(webAppId, selection);\n this.requireFeature(runtime.webApp.features.threadManagement);\n await this.requireOwnedThread(runtime, userId, threadId);\n if (!await this.deps.threadStore.deleteThread(runtime.webApp.tenantId, threadId)) this.threadNotFound();\n }\n\n async getMessages(\n webAppId: string,\n userId: string,\n threadId: string,\n selection: AgentWebAppRuntimeSelection,\n ): Promise<AgentWebAppRuntimeMessage[]> {\n const runtime = await this.resolveRuntime(webAppId, selection);\n await this.requireOwnedThread(runtime, userId, threadId);\n const messages = await this.deps.messageReader.getCurrentMessages({\n tenantId: runtime.webApp.tenantId,\n assistantId: runtime.webApp.assistantId,\n threadId,\n workspaceId: runtime.project.workspaceId,\n projectId: runtime.project.id,\n });\n return messages.flatMap((message) => {\n if (!isRecord(message) || typeof message.id !== \"string\" || (message.role !== \"human\" && message.role !== \"ai\")) return [];\n const content = typeof message.content === \"string\"\n ? message.content\n : runtime.webApp.features.genUI && Array.isArray(message.content)\n ? message.content.map(parseAgentWebAppGenUIBlock).filter((block) => block !== undefined)\n : undefined;\n return [{ id: message.id, role: message.role, ...(content && (typeof content === \"string\" || content.length > 0) ? { content } : {}) }];\n });\n }\n\n async streamMessage(\n webAppId: string,\n userId: string,\n threadId: string,\n input: AgentWebAppRuntimeStreamInput,\n ): Promise<{ messageId: string; stream: AsyncIterable<MessageChunk>; allowInterrupts: boolean; allowGenUI: boolean }> {\n const runtime = await this.resolveOwnedRuntime(webAppId, userId, threadId, input);\n const refs = this.resolveAttachmentRefs(runtime, userId, threadId, input.attachmentRefs ?? []);\n const agent = this.resolveAgent(runtime, threadId);\n const content = refs.length\n ? `${input.content}\\n\\n${formatFileRefsSection(refs)}`\n : input.content;\n const execution = await this.execute(agent, runtime, { input: { message: content } });\n return { ...execution, allowInterrupts: runtime.webApp.features.hitl, allowGenUI: runtime.webApp.features.genUI };\n }\n\n async abort(webAppId: string, userId: string, threadId: string, selection: AgentWebAppRuntimeSelection): Promise<void> {\n const { agent } = await this.resolveOwnedAgent(webAppId, userId, threadId, selection);\n await agent.abort();\n }\n\n async uploadAttachment(\n webAppId: string,\n userId: string,\n threadId: string,\n selection: AgentWebAppRuntimeSelection,\n file: { name: string; mimeType: string; bytes: Uint8Array },\n ): Promise<{ ref: string; name: string; mimeType: string; size: number }> {\n const runtime = await this.resolveOwnedRuntime(webAppId, userId, threadId, selection);\n this.requireNamedFeature(runtime.webApp.features.attachments, \"Attachments are disabled\");\n if (!this.deps.saveProjectFile || !this.deps.attachmentRefs) this.fail(\"INTERNAL_ERROR\", 500, \"Attachment service is unavailable\");\n const userDigest = createHash(\"sha256\").update(userId, \"utf8\").digest(\"hex\");\n const contentDigest = createHash(\"sha256\").update(file.bytes).digest(\"hex\");\n const displayName = file.name;\n const physicalName = `${randomUUID()}-${sanitizePhysicalFilename(file.name)}`;\n const saved = await this.deps.saveProjectFile({\n tenantId: runtime.webApp.tenantId,\n workspaceId: runtime.project.workspaceId,\n projectId: runtime.project.id,\n assistantId: runtime.webApp.assistantId,\n name: physicalName,\n mimeType: file.mimeType,\n bytes: file.bytes,\n path: `/project/web-apps/${runtime.webApp.id}/${userDigest}/${threadId}`,\n });\n const ref = this.deps.attachmentRefs.sign({\n webAppId: runtime.webApp.id, userId, threadId, projectId: runtime.project.id,\n uri: saved.uri, name: displayName, mimeType: file.mimeType, size: saved.size, contentDigest,\n });\n return { ref, name: displayName, mimeType: file.mimeType, size: saved.size };\n }\n\n async resumeInterrupt(\n webAppId: string,\n userId: string,\n threadId: string,\n interruptId: string,\n selection: AgentWebAppRuntimeSelection,\n input: { response: unknown; message: string },\n ): Promise<{ messageId: string; stream: AsyncIterable<MessageChunk>; allowInterrupts: boolean; allowGenUI: boolean }> {\n const { runtime, agent } = await this.resolveOwnedAgent(webAppId, userId, threadId, selection);\n this.requireNamedFeature(runtime.webApp.features.hitl, \"Human review is disabled\");\n const state = await agent.getCurrentState();\n if (!hasInterrupt(state, interruptId)) this.fail(\"INVALID_REQUEST\", 400, \"Interrupt not found\");\n const execution = await this.execute(agent, runtime, {\n input: { message: input.message },\n command: { resume: input.response },\n });\n return { ...execution, allowInterrupts: true, allowGenUI: runtime.webApp.features.genUI };\n }\n\n private execute(\n agent: AgentWebAppRuntimeAgent,\n runtime: ResolvedRuntime,\n request: { input: { message: string }; command?: { resume: unknown } },\n ): Promise<{ messageId: string; stream: AsyncIterable<MessageChunk> }> {\n return executeScopedAgentMessage(agent, {\n ...request,\n ...(runtime.modelKey ? { custom_run_config: { modelConfig: { modelKey: runtime.modelKey } } } : {}),\n }, [MessageChunkTypes.MESSAGE_COMPLETED, MessageChunkTypes.INTERRUPT, MessageChunkTypes.MESSAGE_FAILED]);\n }\n\n private async resolveRuntime(webAppId: string, selection: AgentWebAppRuntimeSelection): Promise<ResolvedRuntime> {\n const webApp = await this.deps.webAppStore.findById(webAppId);\n if (!webApp) this.fail(\"WEB_APP_NOT_FOUND\", 404, \"Agent Web App not found\");\n const previewAllowed = webApp.status === \"draft\" && selection.preview?.tenantId === webApp.tenantId\n && await this.deps.authorizePreview?.(webApp, selection.preview) === true;\n if (webApp.status !== \"active\" && !previewAllowed) this.fail(\"WEB_APP_DISABLED\", 403, \"Agent Web App is disabled\");\n\n if (!webApp.features.projectSelector && selection.projectId !== undefined) {\n this.fail(\"PROJECT_SELECTOR_DISABLED\", 400, \"Project selection is disabled\");\n }\n const projectId = selection.projectId ?? webApp.scope.defaultProjectId;\n if (!webApp.scope.allowedProjectIds.includes(projectId)) {\n this.fail(\"PROJECT_NOT_ALLOWED\", 400, \"Project is not allowed\");\n }\n const project = await this.deps.projectStore.getProjectById(webApp.tenantId, projectId);\n if (!project) this.fail(\"PROJECT_NOT_ALLOWED\", 400, \"Project is not available\");\n\n if (!webApp.features.modelSelector && selection.modelKey !== undefined) {\n this.fail(\"MODEL_NOT_ALLOWED\", 400, \"Model selection is disabled\");\n }\n const modelKey = selection.modelKey ?? webApp.scope.defaultModelKey;\n const allowedModels = webApp.scope.allowedModelKeys;\n if (modelKey && (!allowedModels?.includes(modelKey) || !this.deps.modelRegistry.has(modelKey))) {\n this.fail(\"MODEL_NOT_ALLOWED\", 400, \"Model is not allowed\");\n }\n return { webApp, project, modelKey };\n }\n\n private async resolveOwnedAgent(\n webAppId: string,\n userId: string,\n threadId: string,\n selection: AgentWebAppRuntimeSelection,\n ): Promise<{ runtime: ResolvedRuntime; agent: AgentWebAppRuntimeAgent }> {\n const runtime = await this.resolveOwnedRuntime(webAppId, userId, threadId, selection);\n return { runtime, agent: this.resolveAgent(runtime, threadId) };\n }\n\n private async resolveOwnedRuntime(\n webAppId: string,\n userId: string,\n threadId: string,\n selection: AgentWebAppRuntimeSelection,\n ): Promise<ResolvedRuntime> {\n const runtime = await this.resolveRuntime(webAppId, selection);\n await this.requireOwnedThread(runtime, userId, threadId);\n return runtime;\n }\n\n private resolveAgent(runtime: ResolvedRuntime, threadId: string): AgentWebAppRuntimeAgent {\n if (!this.deps.agentResolver) this.fail(\"INTERNAL_ERROR\", 500, \"Agent runtime is unavailable\");\n return this.deps.agentResolver.getAgent({\n tenantId: runtime.webApp.tenantId,\n assistantId: runtime.webApp.assistantId,\n threadId,\n workspaceId: runtime.project.workspaceId,\n projectId: runtime.project.id,\n ...(runtime.modelKey ? { modelKey: runtime.modelKey } : {}),\n });\n }\n\n private resolveAttachmentRefs(runtime: ResolvedRuntime, userId: string, threadId: string, refs: string[]): TaskFileRef[] {\n if (refs.length === 0) return [];\n this.requireNamedFeature(runtime.webApp.features.attachments, \"Attachments are disabled\");\n if (!this.deps.attachmentRefs) this.fail(\"INTERNAL_ERROR\", 500, \"Attachment service is unavailable\");\n try {\n return refs.map((ref) => ({\n ...this.deps.attachmentRefs!.verify(ref, {\n webAppId: runtime.webApp.id, userId, threadId, projectId: runtime.project.id,\n }),\n addedBy: \"user\" as const,\n }));\n } catch {\n return this.fail(\"INVALID_REQUEST\", 400, \"Invalid attachment reference\");\n }\n }\n\n private async ownedThreads(runtime: ResolvedRuntime, userId: string): Promise<Thread[]> {\n return this.deps.threadStore.getThreadsByAssistantId(\n runtime.webApp.tenantId,\n runtime.webApp.assistantId,\n {\n source: \"web_app\",\n webAppId: runtime.webApp.id,\n userId,\n projectId: runtime.project.id,\n },\n );\n }\n\n private async requireOwnedThread(runtime: ResolvedRuntime, userId: string, threadId: string): Promise<Thread> {\n const thread = await this.deps.threadStore.getThreadById(runtime.webApp.tenantId, threadId);\n const metadata = thread?.metadata;\n if (\n !thread\n || thread.assistantId !== runtime.webApp.assistantId\n || metadata?.source !== \"web_app\"\n || metadata.webAppId !== runtime.webApp.id\n || metadata.userId !== userId\n || metadata.projectId !== runtime.project.id\n ) this.threadNotFound();\n return thread;\n }\n\n private async resolveImplicitThread(runtime: ResolvedRuntime, userId: string): Promise<AgentWebAppRuntimeThread> {\n const latest = (await this.ownedThreads(runtime, userId)).sort(compareThreads)[0];\n if (latest) return toRuntimeThread(latest);\n\n // A deterministic canonical ID converges callers if the empty-list snapshot\n // races with another implicit create. Explicit creates are disabled here.\n const threadId = implicitThreadId(runtime, userId);\n const existing = await this.deps.threadStore.getThreadById(\n runtime.webApp.tenantId,\n threadId,\n );\n if (existing) return toRuntimeThread(this.requireImplicitOwnership(runtime, userId, existing));\n\n await this.deps.threadStore.createThread(\n runtime.webApp.tenantId,\n runtime.webApp.assistantId,\n threadId,\n { metadata: this.metadata(runtime, userId) },\n );\n const persisted = await this.deps.threadStore.getThreadById(\n runtime.webApp.tenantId,\n threadId,\n );\n if (!persisted) this.fail(\"INTERNAL_ERROR\", 500, \"Implicit thread could not be resolved\");\n return toRuntimeThread(this.requireImplicitOwnership(runtime, userId, persisted));\n }\n\n private requireImplicitOwnership(runtime: ResolvedRuntime, userId: string, thread: Thread): Thread {\n const metadata = thread.metadata;\n if (\n thread.assistantId !== runtime.webApp.assistantId\n || metadata?.source !== \"web_app\"\n || metadata.webAppId !== runtime.webApp.id\n || metadata.userId !== userId\n || metadata.projectId !== runtime.project.id\n ) this.fail(\"INTERNAL_ERROR\", 500, \"Implicit thread identity conflict\");\n return thread;\n }\n\n private async createOwnedThread(runtime: ResolvedRuntime, userId: string, rawLabel?: string): Promise<AgentWebAppRuntimeThread> {\n const thread = await this.deps.threadStore.createThread(\n runtime.webApp.tenantId,\n runtime.webApp.assistantId,\n randomUUID(),\n { metadata: this.metadata(runtime, userId, normalizeLabel(rawLabel)) },\n );\n return toRuntimeThread(thread);\n }\n\n private metadata(runtime: ResolvedRuntime, userId: string, label?: string): Record<string, string> {\n return {\n source: \"web_app\",\n webAppId: runtime.webApp.id,\n userId,\n projectId: runtime.project.id,\n ...(label ? { label } : {}),\n };\n }\n\n private requireFeature(enabled: boolean): void {\n if (!enabled) this.fail(\"FEATURE_DISABLED\", 403, \"Thread management is disabled\");\n }\n\n private requireNamedFeature(enabled: boolean, message: string): void {\n if (!enabled) this.fail(\"FEATURE_DISABLED\", 403, message);\n }\n\n private threadNotFound(): never {\n return this.fail(\"THREAD_NOT_FOUND\", 404, \"Thread not found\");\n }\n\n private fail(code: AgentWebAppErrorCode, statusCode: number, message: string): never {\n throw new AgentWebAppRuntimeError(code, statusCode, message);\n }\n}\n\nfunction hasInterrupt(state: unknown, interruptId: string): boolean {\n if (typeof state !== \"object\" || state === null || !(\"tasks\" in state) || !Array.isArray(state.tasks)) return false;\n return state.tasks.some((task) => {\n if (typeof task !== \"object\" || task === null || !(\"interrupts\" in task) || !Array.isArray(task.interrupts)) return false;\n return task.interrupts.some((interrupt: unknown) => typeof interrupt === \"object\" && interrupt !== null && \"id\" in interrupt && interrupt.id === interruptId);\n });\n}\n\nfunction sanitizePhysicalFilename(name: string): string {\n const sanitized = name.replace(/[^A-Za-z0-9._-]/g, \"_\").replace(/^\\.+/, \"\");\n return sanitized || \"file\";\n}\n\nfunction normalizeLabel(label: string | undefined): string | undefined {\n const normalized = label?.trim();\n return normalized || undefined;\n}\n\nfunction implicitThreadId(runtime: ResolvedRuntime, userId: string): string {\n const canonicalTuple = JSON.stringify([\n \"axiom.agent-web-app.implicit-thread\",\n 1,\n runtime.webApp.tenantId,\n runtime.webApp.assistantId,\n runtime.webApp.id,\n userId,\n runtime.project.id,\n ]);\n const bytes = createHash(\"sha256\").update(canonicalTuple, \"utf8\").digest().subarray(0, 16);\n bytes[6] = (bytes[6] & 0x0f) | 0x80;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = bytes.toString(\"hex\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\nfunction compareThreads(left: Thread, right: Thread): number {\n return right.updatedAt.getTime() - left.updatedAt.getTime() || right.id.localeCompare(left.id);\n}\n\nfunction toRuntimeThread(thread: Thread): AgentWebAppRuntimeThread {\n return {\n id: thread.id,\n projectId: String(thread.metadata?.projectId),\n ...(typeof thread.metadata?.label === \"string\" ? { label: thread.metadata.label } : {}),\n createdAt: thread.createdAt,\n updatedAt: thread.updatedAt,\n };\n}\n","import {\n MessageChunkTypes,\n parseAgentWebAppGenUIBlock,\n type AgentWebAppInterrupt,\n type AgentWebAppStreamEvent,\n type MessageChunk,\n} from \"@axiom-lattice/protocols\";\n\n/** Per-consumer projection metadata; it does not control Agent execution. */\nexport interface AgentWebAppStreamProjectionContext {\n readonly startedToolIds: Set<string>;\n readonly allowInterrupts: boolean;\n readonly allowGenUI: boolean;\n}\n\n/** Create projection metadata shared by all chunks in one public stream. */\nexport function createAgentWebAppStreamProjectionContext(options: { allowInterrupts?: boolean; allowGenUI?: boolean } = {}): AgentWebAppStreamProjectionContext {\n return { startedToolIds: new Set<string>(), allowInterrupts: options.allowInterrupts ?? true, allowGenUI: options.allowGenUI ?? false };\n}\n\n/** Purely project one internal Agent chunk onto zero or more stable public events. */\nexport function projectAgentWebAppChunk(\n chunk: MessageChunk,\n context?: AgentWebAppStreamProjectionContext,\n): AgentWebAppStreamEvent[] {\n if (chunk.type === MessageChunkTypes.AI) {\n const events: AgentWebAppStreamEvent[] = [];\n const startedToolIds = context?.startedToolIds ?? new Set<string>();\n if (typeof chunk.data.content === \"string\" && chunk.data.content) events.push({ type: \"message.delta\", text: chunk.data.content });\n if (context?.allowGenUI && Array.isArray(chunk.data.content)) {\n for (const value of chunk.data.content) {\n const block = parseAgentWebAppGenUIBlock(value);\n if (block) events.push({ type: \"genui.render\", block });\n }\n }\n for (const call of chunk.data.tool_call_chunks ?? []) {\n if (call.id && call.name && !startedToolIds.has(call.id)) {\n startedToolIds.add(call.id);\n events.push({ type: \"tool.started\", id: call.id, name: call.name });\n }\n }\n for (const call of chunk.data.tool_calls ?? []) {\n if (!startedToolIds.has(call.id)) {\n startedToolIds.add(call.id);\n events.push({ type: \"tool.started\", id: call.id, name: call.name });\n }\n }\n return events;\n }\n if (chunk.type === MessageChunkTypes.TOOL && chunk.data.tool_call_id) {\n return [{ type: \"tool.completed\", id: chunk.data.tool_call_id }];\n }\n if (chunk.type === MessageChunkTypes.INTERRUPT) {\n if (context && !context.allowInterrupts) return [{ type: \"stream.completed\" }];\n const interrupt = publicInterrupt(chunk);\n return interrupt\n ? [{ type: \"interrupt.created\", interrupt }, { type: \"stream.completed\" }]\n : [{ type: \"stream.completed\" }];\n }\n if (chunk.type === MessageChunkTypes.MESSAGE_COMPLETED) {\n return [\n { type: \"message.completed\", messageId: chunk.data.id },\n { type: \"stream.completed\" },\n ];\n }\n if (chunk.type === MessageChunkTypes.MESSAGE_FAILED) {\n return [\n { type: \"error\", error: { code: \"STREAM_FAILED\", message: \"Stream failed\", retryable: true } },\n { type: \"stream.completed\" },\n ];\n }\n return [];\n}\n\nfunction publicInterrupt(chunk: MessageChunk): AgentWebAppInterrupt | undefined {\n const value = parseInterruptContent(chunk.data.content);\n if (!value) return undefined;\n const topLevelId = (chunk as unknown as { id?: unknown }).id;\n const id = typeof topLevelId === \"string\" ? topLevelId : chunk.data.id;\n if (!id) return undefined;\n return {\n id,\n type: typeof value.type === \"string\" ? value.type : \"input\",\n prompt: typeof value.prompt === \"string\"\n ? value.prompt\n : typeof value.message === \"string\" ? value.message : \"Input required\",\n ...(isRecord(value.data) ? { data: value.data } : {}),\n };\n}\n\nfunction parseInterruptContent(content: unknown): Record<string, unknown> | undefined {\n if (!content) return {};\n if (isRecord(content)) return content;\n if (typeof content !== \"string\") return undefined;\n try {\n const parsed: unknown = JSON.parse(content);\n return isRecord(parsed) ? parsed : { prompt: content };\n } catch {\n return { prompt: content };\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { createCipheriv, createDecipheriv, createHash, randomBytes } from \"node:crypto\";\n\nconst TTL_MS = 15 * 60_000;\n\n/**\n * Resolve the stable attachment capability secret.\n *\n * Production and multi-replica deployments must configure\n * `WEB_APP_ATTACHMENT_SECRET`, `AUTH_TOKEN_SECRET`, or `JWT_SECRET`. The\n * injected console secret fallback is process-stable for local development,\n * but capabilities are invalidated on restart when no environment secret exists.\n */\nexport function resolveAgentWebAppAttachmentSecret(consoleSecret: string): string {\n return process.env.WEB_APP_ATTACHMENT_SECRET\n || process.env.AUTH_TOKEN_SECRET\n || process.env.JWT_SECRET\n || consoleSecret;\n}\n\ninterface AttachmentScope {\n webAppId: string;\n userId: string;\n threadId: string;\n projectId: string;\n}\n\ninterface AttachmentInput extends AttachmentScope {\n uri: string;\n name: string;\n mimeType: string;\n size: number;\n contentDigest: string;\n}\n\ninterface AttachmentPayload {\n webAppId: string;\n userDigest: string;\n threadId: string;\n projectId: string;\n uri: string;\n name: string;\n mimeType: string;\n size: number;\n contentDigest: string;\n exp: number;\n}\n\n/** Signs and verifies short-lived attachment capabilities without persisting browser-visible URIs. */\nexport class AgentWebAppAttachmentRefService {\n private readonly key: Buffer;\n\n constructor(\n secret: string,\n private readonly now: () => number = Date.now,\n ) {\n if (!secret) throw new Error(\"Attachment signing secret is required\");\n this.key = createHash(\"sha256\").update(secret, \"utf8\").digest();\n }\n\n sign(input: AttachmentInput): string {\n const payload: AttachmentPayload = {\n webAppId: input.webAppId,\n userDigest: digestUser(input.userId),\n threadId: input.threadId,\n projectId: input.projectId,\n uri: input.uri,\n name: input.name,\n mimeType: input.mimeType,\n size: input.size,\n contentDigest: input.contentDigest,\n exp: this.now() + TTL_MS,\n };\n const iv = randomBytes(12);\n const cipher = createCipheriv(\"aes-256-gcm\", this.key, iv);\n const ciphertext = Buffer.concat([\n cipher.update(JSON.stringify(payload), \"utf8\"),\n cipher.final(),\n ]);\n const tag = cipher.getAuthTag();\n return `v1.${iv.toString(\"base64url\")}.${ciphertext.toString(\"base64url\")}.${tag.toString(\"base64url\")}`;\n }\n\n verify(ref: string, scope: AttachmentScope): Pick<AttachmentPayload, \"uri\" | \"name\" | \"mimeType\" | \"size\" | \"contentDigest\"> {\n const [version, encodedIv, encodedCiphertext, encodedTag, extra] = ref.split(\".\");\n if (\n version !== \"v1\"\n || !encodedIv || !encodedCiphertext || !encodedTag || extra !== undefined\n || !/^[A-Za-z0-9_-]{16}$/.test(encodedIv)\n || !/^[A-Za-z0-9_-]+$/.test(encodedCiphertext)\n || !/^[A-Za-z0-9_-]{22}$/.test(encodedTag)\n ) this.invalid();\n try {\n const iv = decodeCanonical(encodedIv, 12);\n const ciphertext = decodeCanonical(encodedCiphertext);\n const tag = decodeCanonical(encodedTag, 16);\n const decipher = createDecipheriv(\"aes-256-gcm\", this.key, iv);\n decipher.setAuthTag(tag);\n const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n const value: unknown = JSON.parse(plaintext.toString(\"utf8\"));\n if (!isAttachmentPayload(value)) this.invalid();\n if (value.exp <= this.now()) throw new Error(\"Attachment reference expired\");\n if (\n value.webAppId !== scope.webAppId\n || value.userDigest !== digestUser(scope.userId)\n || value.threadId !== scope.threadId\n || value.projectId !== scope.projectId\n ) this.invalid();\n return {\n uri: value.uri,\n name: value.name,\n mimeType: value.mimeType,\n size: value.size,\n contentDigest: value.contentDigest,\n };\n } catch (error) {\n if (error instanceof Error && error.message === \"Attachment reference expired\") throw error;\n this.invalid();\n }\n }\n\n private invalid(): never {\n throw new Error(\"Invalid attachment reference\");\n }\n}\n\nfunction decodeCanonical(value: string, expectedBytes?: number): Buffer {\n const decoded = Buffer.from(value, \"base64url\");\n if (decoded.toString(\"base64url\") !== value || (expectedBytes !== undefined && decoded.length !== expectedBytes)) {\n throw new Error(\"Invalid attachment reference\");\n }\n return decoded;\n}\n\nfunction digestUser(userId: string): string {\n return createHash(\"sha256\").update(userId, \"utf8\").digest(\"hex\");\n}\n\nfunction isAttachmentPayload(value: unknown): value is AttachmentPayload {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n if (Object.keys(record).sort().join(\",\") !== \"contentDigest,exp,mimeType,name,projectId,size,threadId,uri,userDigest,webAppId\") return false;\n return typeof record.webAppId === \"string\"\n && typeof record.userDigest === \"string\" && /^[a-f0-9]{64}$/.test(record.userDigest)\n && typeof record.threadId === \"string\" && typeof record.projectId === \"string\"\n && typeof record.uri === \"string\" && record.uri.startsWith(\"/\")\n && typeof record.name === \"string\" && record.name.length > 0\n && typeof record.mimeType === \"string\" && record.mimeType.length > 0\n && typeof record.size === \"number\" && Number.isSafeInteger(record.size) && record.size >= 0\n && typeof record.contentDigest === \"string\" && /^[a-f0-9]{64}$/.test(record.contentDigest)\n && typeof record.exp === \"number\" && Number.isSafeInteger(record.exp);\n}\n","import { FastifyInstance } from \"fastify\";\nimport { ResourceController } from \"../controllers/resources\";\n\nexport function registerResourceRoutes(\n app: FastifyInstance,\n controller: ResourceController\n) {\n // Public share access — MUST be before /api/** wildcard routes\n app.get(\"/s/:token\", controller.resolveResource.bind(controller));\n app.get(\"/s/:token/*\", controller.resolveResource.bind(controller));\n app.post(\"/s/:token/*\", controller.resolveResource.bind(controller));\n app.put(\"/s/:token/*\", controller.resolveResource.bind(controller));\n app.delete(\"/s/:token/*\", controller.resolveResource.bind(controller));\n app.post(\"/s/:token/unlock\", controller.unlockShare.bind(controller));\n app.options(\"/s/:token\", async (_req, reply) => {\n reply.header(\"Access-Control-Allow-Origin\", \"*\");\n reply.header(\"Access-Control-Allow-Methods\", \"GET, OPTIONS, POST\");\n reply.header(\"Access-Control-Allow-Headers\", \"Content-Type\");\n return reply.status(204).send();\n });\n\n // Internal file access: /f/{tenant}/{workspace}/{project}/*\n const dirFile = controller.resolveDirectFile.bind(controller);\n app.get(\"/f/:tid/:wid/:pid\", dirFile);\n app.get(\"/f/:tid/:wid/:pid/*\", dirFile);\n app.post(\"/f/:tid/:wid/:pid/*\", dirFile);\n app.put(\"/f/:tid/:wid/:pid/*\", dirFile);\n app.delete(\"/f/:tid/:wid/:pid/*\", dirFile);\n\n // Management API\n app.post(\"/api/resources/share\", controller.createShare.bind(controller));\n app.get(\"/api/resources/shares\", controller.listShares.bind(controller));\n app.patch(\"/api/resources/share/:token\", controller.updateShare.bind(controller));\n app.delete(\"/api/resources/share/:token\", controller.revokeShare.bind(controller));\n}\n","import { ExportableEntityRegistry } from '@axiom-lattice/core';\nimport { skillRegistration } from './skill.registration';\nimport { agentRegistration } from './agent.registration';\nimport { databaseConfigRegistration } from './database-config.registration';\nimport { metricsConfigRegistration } from './metrics-config.registration';\nimport { mcpConfigRegistration } from './mcp-config.registration';\nimport { connectionRegistration } from './connection.registration';\nimport { collectionRegistration } from './collection.registration';\nimport { channelInstallationRegistration } from './channel-installation.registration';\nimport { menuRegistration } from './menu.registration';\nimport { evalRegistration } from './eval.registration';\n\nexport function registerAllBuiltinEntities(): void {\n const registry = ExportableEntityRegistry.getInstance();\n registry.register(skillRegistration);\n registry.register(agentRegistration);\n registry.register(databaseConfigRegistration);\n registry.register(metricsConfigRegistration);\n registry.register(mcpConfigRegistration);\n registry.register(connectionRegistration);\n registry.register(collectionRegistration);\n registry.register(channelInstallationRegistration);\n registry.register(menuRegistration);\n registry.register(evalRegistration);\n}\n","import type { ExportableEntityDefinition, ExportableEntity, ExportableFile, ImportPreviewResult, ExportContext } from '@axiom-lattice/core';\nimport { SandboxSkillStore, isBuiltInSkill } from '@axiom-lattice/core';\nimport type { SkillStoreContext } from '@axiom-lattice/protocols';\n\n/**\n * Skill export/import uses the SandboxSkillStore — the same store the runtime\n * uses (per-project sandbox volume at /root/.agents/skills/). This matches how\n * agents, tools, and the skill middleware load skills, NOT the local filesystem\n * default (FileSystemSkillStore → lattice_store/skills/).\n */\nfunction getStore(context?: ExportContext): SandboxSkillStore {\n return new SandboxSkillStore({\n workspaceId: context?.workspaceId,\n projectId: context?.projectId,\n });\n}\n\nfunction toStoreContext(context?: ExportContext): SkillStoreContext | undefined {\n if (!context) return undefined;\n return { workspaceId: context.workspaceId, projectId: context.projectId };\n}\n\nexport const skillRegistration: ExportableEntityDefinition = {\n entityType: 'skill',\n label: 'Skill(技能)',\n category: 'core',\n dependsOn: [],\n cascadeParents: [],\n\n async listForExport(tenantId: string, context?: ExportContext): Promise<ExportableEntity[]> {\n const store = getStore(context);\n const skills = await store.getAllSkills(tenantId, toStoreContext(context));\n return skills.filter((s) => !isBuiltInSkill(s.id)).map((s) => ({\n _exportId: '',\n data: {\n id: s.id,\n name: s.name,\n description: s.description,\n license: s.license,\n compatibility: s.compatibility,\n metadata: s.metadata,\n content: s.content,\n subSkills: s.subSkills,\n },\n }));\n },\n\n async getReferencedEntityIds(_tenantId, entities) {\n const subSkillIds = new Set<string>();\n for (const entity of entities) {\n const subSkills = entity.data.subSkills;\n if (!Array.isArray(subSkills)) continue;\n for (const id of subSkills) {\n if (typeof id === 'string' && id) subSkillIds.add(id);\n }\n }\n return { skill: [...subSkillIds] };\n },\n\n async listFilesForExport(\n tenantId: string,\n entities: ExportableEntity[],\n context?: ExportContext,\n ): Promise<ExportableFile[]> {\n const store = getStore(context);\n const ctx = toStoreContext(context);\n const files: ExportableFile[] = [];\n\n for (const entity of entities) {\n const skillId = entity.data.id as string;\n if (!skillId) continue;\n\n // Metadata remains authoritative in bundle.json; this entry carries the parsed body.\n const content = entity.data.content as string | undefined;\n files.push({\n entityId: skillId,\n path: 'SKILL.md',\n content: Buffer.from(content ?? '', 'utf-8'),\n });\n\n // Bundle resources/ (scripts, references, assets)\n try {\n const resources = await store.listSkillResources?.(tenantId, skillId, ctx);\n if (resources) {\n for (const resourcePath of resources) {\n const resourceContent = typeof store.loadSkillResourceRaw === 'function'\n ? await store.loadSkillResourceRaw(tenantId, skillId, resourcePath, ctx)\n : await store.loadSkillResource?.(tenantId, skillId, resourcePath, ctx);\n if (resourceContent !== null && resourceContent !== undefined) {\n files.push({\n entityId: skillId,\n path: `resources/${resourcePath}`,\n content: Buffer.isBuffer(resourceContent) ? resourceContent : Buffer.from(resourceContent, 'utf-8'),\n });\n }\n }\n }\n } catch {\n // Store does not support resources — skip\n }\n }\n\n return files;\n },\n\n async previewImport(\n tenantId: string,\n entities: ExportableEntity[],\n context?: ExportContext,\n ): Promise<ImportPreviewResult> {\n const store = getStore(context);\n const existing = await store.getAllSkills(tenantId, toStoreContext(context));\n const existingIds = new Set(existing.map((s) => s.id));\n\n const conflicts: ImportPreviewResult['conflicts'] = [];\n const insertions: ImportPreviewResult['insertions'] = [];\n\n for (const entity of entities) {\n const id = entity.data.id as string;\n if (isBuiltInSkill(id)) continue;\n if (existingIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'skill',\n conflictType: 'id_exists',\n existingId: id,\n existingName: (entity.data.name as string) || id,\n });\n } else {\n insertions.push({\n _exportId: entity._exportId,\n entityType: 'skill',\n name: (entity.data.name as string) || id,\n });\n }\n }\n\n return { conflicts, insertions, errors: [] };\n },\n\n async applyImport(tenantId, entity, resolution, files, context) {\n const store = getStore(context);\n const ctx = toStoreContext(context);\n const data = entity.data as Record<string, unknown>;\n const originalName = data.name as string;\n const targetName = resolution.action === 'rename' ? resolution.newId : originalName;\n if (typeof targetName !== 'string' || targetName.trim().length === 0) {\n throw new Error('Skill import target name must not be empty');\n }\n\n await store.createSkill(tenantId, targetName, {\n name: targetName,\n description: data.description as string,\n license: data.license as string | undefined,\n compatibility: data.compatibility as string | undefined,\n metadata: data.metadata as Record<string, string> | undefined,\n content: data.content as string | undefined,\n subSkills: data.subSkills as string[] | undefined,\n }, ctx);\n\n // Write bundled files (SKILL.md, resources) back to the skill directory\n if (files && files.size > 0) {\n for (const [relPath, content] of files.entries()) {\n if (relPath === 'SKILL.md') {\n // SKILL.md body is already written via createSkill above.\n // If bundled content differs, update via the store's update method.\n const fileContent = content.toString('utf-8');\n if (fileContent !== data.content && typeof store.updateSkill === 'function') {\n await store.updateSkill(tenantId, targetName, { content: fileContent }, ctx);\n }\n } else if (relPath.startsWith('resources/')) {\n const resourcePath = relPath.slice('resources/'.length);\n if (typeof store.writeSkillResourceRaw === 'function') {\n await store.writeSkillResourceRaw(tenantId, targetName, resourcePath, content, ctx);\n } else if (typeof store.writeSkillResource === 'function') {\n await store.writeSkillResource(tenantId, targetName, resourcePath, content.toString('utf-8'), ctx);\n }\n }\n }\n }\n\n return { newId: targetName };\n },\n};\n","import type { ExportableEntityDefinition, ExportableEntity, ImportPreviewResult } from '@axiom-lattice/core';\nimport { getStoreLattice } from '@axiom-lattice/core';\nimport type { AssistantStore } from '@axiom-lattice/protocols';\n\nfunction getStore(): AssistantStore {\n return getStoreLattice('default', 'assistant').store as unknown as AssistantStore;\n}\n\nexport const agentRegistration: ExportableEntityDefinition = {\n entityType: 'agent',\n label: 'Agent(智能体)',\n category: 'core',\n dependsOn: ['skill'],\n cascadeParents: [],\n\n async listForExport(tenantId: string): Promise<ExportableEntity[]> {\n const store = getStore();\n const agents = await store.getAllAssistants(tenantId);\n return agents.map((a) => ({\n _exportId: '',\n data: {\n id: a.id,\n name: a.name,\n description: a.description,\n graphDefinition: a.graphDefinition,\n },\n }));\n },\n\n async getReferencedEntityIds(_tenantId, entities) {\n const skillIds = new Set<string>();\n for (const entity of entities) {\n const graphDefinition = entity.data.graphDefinition;\n if (!graphDefinition || typeof graphDefinition !== 'object') continue;\n const ids = (graphDefinition as Record<string, unknown>).skillIds;\n if (!Array.isArray(ids)) continue;\n for (const id of ids) {\n if (typeof id === 'string' && id) skillIds.add(id);\n }\n }\n return { skill: [...skillIds] };\n },\n\n async previewImport(\n tenantId: string,\n entities: ExportableEntity[],\n ): Promise<ImportPreviewResult> {\n const store = getStore();\n const existing = await store.getAllAssistants(tenantId);\n const existingIds = new Set(existing.map((a) => a.id));\n\n const conflicts: ImportPreviewResult['conflicts'] = [];\n const insertions: ImportPreviewResult['insertions'] = [];\n\n for (const entity of entities) {\n const id = entity.data.id as string;\n if (existingIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'agent',\n conflictType: 'id_exists',\n existingId: id,\n existingName: (entity.data.name as string) || id,\n });\n } else {\n insertions.push({\n _exportId: entity._exportId,\n entityType: 'agent',\n name: (entity.data.name as string) || id,\n });\n }\n }\n\n return { conflicts, insertions, errors: [] };\n },\n\n async applyImport(tenantId, entity, resolution) {\n const store = getStore();\n const data = entity.data as Record<string, unknown>;\n const id = resolution.action === 'rename' && resolution.newId ? resolution.newId : data.id as string;\n\n if (resolution.action === 'overwrite') {\n try { await store.deleteAssistant(tenantId, id); } catch { /* may not exist */ }\n }\n\n await store.createAssistant(tenantId, id, {\n name: data.name as string,\n description: (data.description as string) || '',\n graphDefinition: data.graphDefinition as Record<string, unknown>,\n });\n\n return { newId: id };\n },\n};\n","import type { ExportableEntityDefinition, ExportableEntity, ImportPreviewResult } from '@axiom-lattice/core';\nimport { getStoreLattice } from '@axiom-lattice/core';\nimport type { DatabaseConfigStore } from '@axiom-lattice/protocols';\n\nfunction getStore(): DatabaseConfigStore {\n return getStoreLattice('default', 'database').store as unknown as DatabaseConfigStore;\n}\n\nexport const databaseConfigRegistration: ExportableEntityDefinition = {\n entityType: 'database_config',\n label: 'Database Config(数据库配置)',\n category: 'core',\n dependsOn: [],\n cascadeParents: [],\n\n async listForExport(tenantId: string): Promise<ExportableEntity[]> {\n const store = getStore();\n const configs = await store.getAllConfigs(tenantId);\n return configs.map((c) => ({\n _exportId: '',\n data: {\n id: c.id,\n key: c.key,\n name: c.name,\n description: c.description,\n config: c.config,\n },\n }));\n },\n\n async previewImport(\n tenantId: string,\n entities: ExportableEntity[],\n ): Promise<ImportPreviewResult> {\n const store = getStore();\n const existing = await store.getAllConfigs(tenantId);\n const existingIds = new Set(existing.map((c) => c.id));\n const existingKeys = new Set(existing.map((c) => c.key));\n\n const conflicts: ImportPreviewResult['conflicts'] = [];\n const insertions: ImportPreviewResult['insertions'] = [];\n\n for (const entity of entities) {\n const d = entity.data as Record<string, unknown>;\n const id = d.id as string;\n const key = d.key as string;\n\n if (existingIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'database_config',\n conflictType: 'id_exists',\n existingId: id,\n existingName: (d.name as string) || key,\n });\n } else if (key && existingKeys.has(key)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'database_config',\n conflictType: 'unique_constraint',\n existingName: (d.name as string) || key,\n field: 'key',\n });\n } else {\n insertions.push({\n _exportId: entity._exportId,\n entityType: 'database_config',\n name: (d.name as string) || key,\n });\n }\n }\n\n return { conflicts, insertions, errors: [] };\n },\n\n async applyImport(tenantId, entity, resolution) {\n const store = getStore();\n const data = entity.data as Record<string, unknown>;\n const id = resolution.action === 'rename' && resolution.newId ? resolution.newId : data.id as string;\n\n if (resolution.action === 'overwrite') {\n try { await store.deleteConfig(tenantId, id); } catch { /* may not exist */ }\n }\n\n await store.createConfig(tenantId, id, {\n key: data.key as string,\n name: data.name as string | undefined,\n description: data.description as string | undefined,\n config: data.config as any,\n });\n\n return { newId: id };\n },\n};\n","import type { ExportableEntityDefinition, ExportableEntity, ImportPreviewResult } from '@axiom-lattice/core';\nimport { getStoreLattice } from '@axiom-lattice/core';\nimport type { MetricsServerConfigStore } from '@axiom-lattice/protocols';\n\nfunction getStore(): MetricsServerConfigStore {\n return getStoreLattice('default', 'metrics').store as unknown as MetricsServerConfigStore;\n}\n\nexport const metricsConfigRegistration: ExportableEntityDefinition = {\n entityType: 'metrics_config',\n label: 'Metrics Config(指标配置)',\n category: 'core',\n dependsOn: [],\n cascadeParents: [],\n\n async listForExport(tenantId: string): Promise<ExportableEntity[]> {\n const store = getStore();\n const configs = await store.getAllConfigs(tenantId);\n return configs.map((c) => ({\n _exportId: '',\n data: {\n id: c.id,\n key: c.key,\n name: c.name,\n description: c.description,\n config: c.config,\n },\n }));\n },\n\n async previewImport(\n tenantId: string,\n entities: ExportableEntity[],\n ): Promise<ImportPreviewResult> {\n const store = getStore();\n const existing = await store.getAllConfigs(tenantId);\n const existingIds = new Set(existing.map((c) => c.id));\n const existingKeys = new Set(existing.map((c) => c.key));\n\n const conflicts: ImportPreviewResult['conflicts'] = [];\n const insertions: ImportPreviewResult['insertions'] = [];\n\n for (const entity of entities) {\n const d = entity.data as Record<string, unknown>;\n const id = d.id as string;\n const key = d.key as string;\n\n if (existingIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'metrics_config',\n conflictType: 'id_exists',\n existingId: id,\n existingName: (d.name as string) || key,\n });\n } else if (key && existingKeys.has(key)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'metrics_config',\n conflictType: 'unique_constraint',\n existingName: (d.name as string) || key,\n field: 'key',\n });\n } else {\n insertions.push({\n _exportId: entity._exportId,\n entityType: 'metrics_config',\n name: (d.name as string) || key,\n });\n }\n }\n\n return { conflicts, insertions, errors: [] };\n },\n\n async applyImport(tenantId, entity, resolution) {\n const store = getStore();\n const data = entity.data as Record<string, unknown>;\n const id = resolution.action === 'rename' && resolution.newId ? resolution.newId : data.id as string;\n\n if (resolution.action === 'overwrite') {\n try { await store.deleteConfig(tenantId, id); } catch { /* may not exist */ }\n }\n\n await store.createConfig(tenantId, id, {\n key: data.key as string,\n name: data.name as string | undefined,\n description: data.description as string | undefined,\n config: data.config as any,\n });\n\n return { newId: id };\n },\n};\n","import type { ExportableEntityDefinition, ExportableEntity, ImportPreviewResult } from '@axiom-lattice/core';\nimport { getStoreLattice } from '@axiom-lattice/core';\nimport type { McpServerConfigStore } from '@axiom-lattice/protocols';\n\nfunction getStore(): McpServerConfigStore {\n return getStoreLattice('default', 'mcp').store as unknown as McpServerConfigStore;\n}\n\nexport const mcpConfigRegistration: ExportableEntityDefinition = {\n entityType: 'mcp_config',\n label: 'MCP Config(MCP配置)',\n category: 'core',\n dependsOn: [],\n cascadeParents: [],\n\n async listForExport(tenantId: string): Promise<ExportableEntity[]> {\n const store = getStore();\n const configs = await store.getAllConfigs(tenantId);\n return configs.map((c) => ({\n _exportId: '',\n data: {\n id: c.id,\n key: c.key,\n name: c.name,\n description: c.description,\n config: c.config,\n selectedTools: c.selectedTools,\n status: c.status,\n },\n }));\n },\n\n async previewImport(\n tenantId: string,\n entities: ExportableEntity[],\n ): Promise<ImportPreviewResult> {\n const store = getStore();\n const existing = await store.getAllConfigs(tenantId);\n const existingIds = new Set(existing.map((c) => c.id));\n const existingKeys = new Set(existing.map((c) => c.key));\n\n const conflicts: ImportPreviewResult['conflicts'] = [];\n const insertions: ImportPreviewResult['insertions'] = [];\n\n for (const entity of entities) {\n const d = entity.data as Record<string, unknown>;\n const id = d.id as string;\n const key = d.key as string;\n\n if (existingIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'mcp_config',\n conflictType: 'id_exists',\n existingId: id,\n existingName: (d.name as string) || key,\n });\n } else if (key && existingKeys.has(key)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'mcp_config',\n conflictType: 'unique_constraint',\n existingName: (d.name as string) || key,\n field: 'key',\n });\n } else {\n insertions.push({\n _exportId: entity._exportId,\n entityType: 'mcp_config',\n name: (d.name as string) || key,\n });\n }\n }\n\n return { conflicts, insertions, errors: [] };\n },\n\n async applyImport(tenantId, entity, resolution) {\n const store = getStore();\n const data = entity.data as Record<string, unknown>;\n const id = resolution.action === 'rename' && resolution.newId ? resolution.newId : data.id as string;\n\n if (resolution.action === 'overwrite') {\n try { await store.deleteConfig(tenantId, id); } catch { /* may not exist */ }\n }\n\n await store.createConfig(tenantId, id, {\n key: data.key as string,\n name: data.name as string | undefined,\n description: data.description as string | undefined,\n config: data.config as any,\n selectedTools: data.selectedTools as string[] | undefined,\n });\n\n return { newId: id };\n },\n};\n","import type { ExportableEntityDefinition, ExportableEntity, ImportPreviewResult } from '@axiom-lattice/core';\nimport { getStoreLattice } from '@axiom-lattice/core';\nimport type { ConnectionEntry, ConnectionStore } from '@axiom-lattice/protocols';\n\nfunction getStore(): ConnectionStore {\n return getStoreLattice('default', 'connection').store as unknown as ConnectionStore;\n}\n\nasync function listAllConnections(tenantId: string): Promise<ConnectionEntry[]> {\n const store = getStore();\n if (typeof store.listByTenant !== 'function') {\n throw new Error('ConnectionStore.listByTenant is not implemented. SQL bypass removed — upgrade your store adapter.');\n }\n return store.listByTenant(tenantId);\n}\n\nexport const connectionRegistration: ExportableEntityDefinition = {\n entityType: 'connection',\n label: 'Connection(连接)',\n category: 'core',\n dependsOn: [],\n cascadeParents: [],\n\n async listForExport(tenantId: string): Promise<ExportableEntity[]> {\n const connections = await listAllConnections(tenantId);\n return connections.map((c) => ({\n _exportId: '',\n data: {\n id: c.id,\n type: c.type,\n key: c.key,\n name: c.name,\n description: c.description,\n config: c.config,\n },\n }));\n },\n\n async previewImport(\n tenantId: string,\n entities: ExportableEntity[],\n ): Promise<ImportPreviewResult> {\n const existing = await listAllConnections(tenantId);\n const existingCompositeKeys = new Set(\n existing.map((c) => `${c.type}:${c.key}`),\n );\n\n const conflicts: ImportPreviewResult['conflicts'] = [];\n const insertions: ImportPreviewResult['insertions'] = [];\n\n for (const entity of entities) {\n const d = entity.data as Record<string, unknown>;\n const compositeKey = `${d.type}:${d.key}`;\n if (existingCompositeKeys.has(compositeKey)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'connection',\n conflictType: 'unique_constraint',\n existingName: `${d.type}:${d.key}`,\n field: 'type+key',\n });\n } else {\n insertions.push({\n _exportId: entity._exportId,\n entityType: 'connection',\n name: `${d.type}:${d.key}`,\n });\n }\n }\n\n return { conflicts, insertions, errors: [] };\n },\n\n async applyImport(tenantId, entity, resolution) {\n if (resolution.action === 'skip') return {};\n\n const store = getStore();\n const d = entity.data as Record<string, unknown>;\n const type = d.type as string;\n const key = d.key as string;\n\n if (resolution.action === 'overwrite') {\n try { await store.delete(tenantId, type, key); } catch { /* may not exist */ }\n }\n\n await store.create({\n tenantId,\n type,\n key,\n name: d.name as string,\n description: d.description as string | undefined,\n config: d.config as Record<string, unknown>,\n });\n\n return { newId: undefined };\n },\n};\n","import type { ExportableEntityDefinition, ExportableEntity, ImportPreviewResult } from '@axiom-lattice/core';\nimport { getStoreLattice } from '@axiom-lattice/core';\nimport type { CollectionStore } from '@axiom-lattice/protocols';\n\nfunction getStore(): CollectionStore {\n return getStoreLattice('default', 'collection').store as unknown as CollectionStore;\n}\n\nexport const collectionRegistration: ExportableEntityDefinition = {\n entityType: 'collection',\n label: 'Collection(知识库)',\n category: 'core',\n dependsOn: [],\n cascadeParents: [],\n\n async listForExport(tenantId: string): Promise<ExportableEntity[]> {\n const store = getStore();\n const collections = await store.getAllCollections(tenantId);\n return collections.map((c) => ({\n _exportId: '',\n data: {\n id: c.id,\n name: c.name,\n label: c.label,\n embeddingKey: c.embeddingKey,\n schema: c.schema,\n },\n }));\n },\n\n async previewImport(\n tenantId: string,\n entities: ExportableEntity[],\n ): Promise<ImportPreviewResult> {\n const store = getStore();\n const existing = await store.getAllCollections(tenantId);\n const existingNames = new Set(existing.map((c) => c.name));\n\n const conflicts: ImportPreviewResult['conflicts'] = [];\n const insertions: ImportPreviewResult['insertions'] = [];\n\n for (const entity of entities) {\n const d = entity.data as Record<string, unknown>;\n const name = d.name as string;\n if (existingNames.has(name)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'collection',\n conflictType: 'unique_constraint',\n existingName: name,\n field: 'name',\n });\n } else {\n insertions.push({\n _exportId: entity._exportId,\n entityType: 'collection',\n name: name,\n });\n }\n }\n\n return { conflicts, insertions, errors: [] };\n },\n\n async applyImport(tenantId, entity, resolution) {\n if (resolution.action === 'skip') return {};\n\n const store = getStore();\n const d = entity.data as Record<string, unknown>;\n const name = d.name as string;\n\n if (resolution.action === 'overwrite') {\n try { await store.deleteCollection(tenantId, name); } catch { /* may not exist */ }\n }\n\n await store.createCollection(tenantId, {\n name,\n label: d.label as string,\n embeddingKey: d.embeddingKey as string,\n schema: d.schema as any,\n });\n\n return { newId: undefined };\n },\n};\n","import type { ExportableEntityDefinition, ExportableEntity, ImportPreviewResult } from '@axiom-lattice/core';\nimport { getStoreLattice } from '@axiom-lattice/core';\nimport type { ChannelInstallationStore, LarkChannelInstallationConfig } from '@axiom-lattice/protocols';\nimport { randomUUID } from 'crypto';\n\nconst UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nfunction getStore(): ChannelInstallationStore {\n return getStoreLattice('default', 'channelInstallation').store as unknown as ChannelInstallationStore;\n}\n\nexport const channelInstallationRegistration: ExportableEntityDefinition = {\n entityType: 'channel_installation',\n label: 'Channel Installation(渠道安装)',\n category: 'core',\n dependsOn: ['agent'],\n cascadeParents: [],\n referenceFields: { fallbackAgentId: 'agent' },\n\n async listForExport(tenantId: string): Promise<ExportableEntity[]> {\n const store = getStore();\n const installations = await store.getInstallationsByTenant(tenantId);\n return installations.map((i) => ({\n _exportId: '',\n data: {\n id: i.id,\n channel: i.channel,\n name: i.name,\n config: i.config,\n enabled: i.enabled,\n fallbackAgentId: i.fallbackAgentId,\n rejectWhenNoBinding: i.rejectWhenNoBinding,\n },\n }));\n },\n\n async previewImport(\n tenantId: string,\n entities: ExportableEntity[],\n ): Promise<ImportPreviewResult> {\n const store = getStore();\n const conflicts: ImportPreviewResult['conflicts'] = [];\n const insertions: ImportPreviewResult['insertions'] = [];\n\n for (const entity of entities) {\n const d = entity.data as Record<string, unknown>;\n const id = d.id as string;\n const existing = UUID_PATTERN.test(id) ? await store.getInstallationById(id) : null;\n if (existing) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'channel_installation',\n conflictType: 'id_exists',\n existingId: id,\n existingName: existing.name || id,\n });\n } else {\n insertions.push({\n _exportId: entity._exportId,\n entityType: 'channel_installation',\n name: (d.name as string) || id,\n });\n }\n }\n\n return { conflicts, insertions, errors: [] };\n },\n\n async applyImport(tenantId, entity, resolution) {\n const store = getStore();\n const data = entity.data as Record<string, unknown>;\n const sourceId = data.id as string;\n const commonData = {\n name: data.name as string | undefined,\n enabled: data.enabled as boolean | undefined,\n fallbackAgentId: data.fallbackAgentId as string | undefined,\n rejectWhenNoBinding: data.rejectWhenNoBinding as boolean | undefined,\n };\n\n if (resolution.action === 'overwrite') {\n const existing = await store.getInstallationById(sourceId);\n if (!existing || !UUID_PATTERN.test(existing.id)) {\n throw new Error('Channel installation overwrite target must be an existing UUID');\n }\n const updated = await store.updateInstallation(tenantId, existing.id, {\n ...commonData,\n config: data.config as Record<string, unknown>,\n });\n if (!updated) {\n throw new Error('Channel installation overwrite target is not available in the target tenant');\n }\n return { newId: existing.id };\n }\n\n let id: string;\n if (resolution.action === 'rename') {\n if (!resolution.newId || !UUID_PATTERN.test(resolution.newId)) {\n throw new Error('Channel installation rename ID must be a valid UUID');\n }\n id = resolution.newId;\n } else if (UUID_PATTERN.test(sourceId)) {\n if (await store.getInstallationById(sourceId)) {\n throw new Error(`Channel installation UUID already exists: ${sourceId}`);\n }\n id = sourceId;\n } else {\n id = randomUUID();\n }\n\n await store.createInstallation(tenantId, id, {\n channel: data.channel as 'lark' | 'email' | 'slack' | 'wechat',\n ...commonData,\n config: data.config as LarkChannelInstallationConfig,\n });\n\n return { newId: id };\n },\n};\n","import type { ExportableEntityDefinition, ExportableEntity, ImportPreviewResult } from '@axiom-lattice/core';\nimport { getStoreLattice } from '@axiom-lattice/core';\nimport type { MenuRegistry } from '@axiom-lattice/protocols';\n\nfunction getStore(): MenuRegistry {\n return getStoreLattice('default', 'menu').store as unknown as MenuRegistry;\n}\n\nexport const menuRegistration: ExportableEntityDefinition = {\n entityType: 'menu',\n label: 'Menu(菜单)',\n category: 'core',\n dependsOn: ['agent'],\n cascadeParents: [],\n\n async listForExport(tenantId: string): Promise<ExportableEntity[]> {\n const store = getStore();\n const menus = await store.list({ tenantId });\n return menus.map((m) => ({\n _exportId: '',\n data: {\n id: m.id,\n menuTarget: m.menuTarget,\n group: m.group,\n name: m.name,\n icon: m.icon,\n sortOrder: m.sortOrder,\n contentType: m.contentType,\n contentConfig: m.contentConfig,\n enabled: m.enabled,\n },\n }));\n },\n\n async previewImport(\n tenantId: string,\n entities: ExportableEntity[],\n ): Promise<ImportPreviewResult> {\n const store = getStore();\n const existing = await store.list({ tenantId });\n const existingIds = new Set(existing.map((m) => m.id));\n\n const conflicts: ImportPreviewResult['conflicts'] = [];\n const insertions: ImportPreviewResult['insertions'] = [];\n\n for (const entity of entities) {\n const d = entity.data as Record<string, unknown>;\n const id = d.id as string;\n if (existingIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'menu',\n conflictType: 'id_exists',\n existingId: id,\n existingName: (d.name as string) || id,\n });\n } else {\n insertions.push({\n _exportId: entity._exportId,\n entityType: 'menu',\n name: (d.name as string) || id,\n });\n }\n }\n\n return { conflicts, insertions, errors: [] };\n },\n\n async applyImport(tenantId, entity, resolution) {\n const store = getStore();\n const d = entity.data as Record<string, unknown>;\n const id = resolution.action === 'rename' && resolution.newId ? resolution.newId : d.id as string;\n\n if (resolution.action === 'overwrite') {\n try { await store.delete(id); } catch { /* may not exist */ }\n }\n\n await store.create({\n tenantId,\n menuTarget: d.menuTarget as 'sidebar' | 'workspace',\n group: d.group as string | undefined,\n name: d.name as string,\n icon: d.icon as string | undefined,\n sortOrder: d.sortOrder as number | undefined,\n contentType: d.contentType as 'agent' | 'html' | 'custom',\n contentConfig: d.contentConfig as any,\n });\n\n return { newId: undefined };\n },\n};\n","import type { ExportableEntityDefinition, ExportableEntity, ImportPreviewResult } from '@axiom-lattice/core';\nimport { getStoreLattice } from '@axiom-lattice/core';\nimport type { EvalStore } from '@axiom-lattice/protocols';\n\nfunction getStore(): EvalStore {\n return getStoreLattice('default', 'eval').store as unknown as EvalStore;\n}\n\nexport const evalRegistration: ExportableEntityDefinition = {\n entityType: 'eval',\n label: 'Eval(评估)',\n category: 'core',\n dependsOn: [],\n cascadeParents: [],\n referenceFields: { suiteId: 'eval_suite', projectId: 'eval_project', runId: 'eval_run', caseId: 'eval_case' },\n\n async listForExport(tenantId: string): Promise<ExportableEntity[]> {\n const store = getStore();\n const projects = await store.getProjectsByTenant(tenantId);\n const entities: ExportableEntity[] = [];\n\n for (const project of projects) {\n entities.push({\n _exportId: '',\n data: {\n _subType: 'eval_project',\n id: project.id,\n name: project.name,\n description: project.description,\n version: project.version,\n judgeModelConfig: project.judgeModelConfig,\n targetServerConfig: project.targetServerConfig,\n concurrency: project.concurrency,\n reportConfig: project.reportConfig,\n },\n });\n\n const suites = await store.getSuitesByProject(tenantId, project.id);\n for (const suite of suites) {\n entities.push({\n _exportId: '',\n data: {\n _subType: 'eval_suite',\n id: suite.id,\n projectId: suite.projectId,\n name: suite.name,\n },\n });\n\n const cases = await store.getCasesBySuite(tenantId, suite.id);\n for (const c of cases) {\n entities.push({\n _exportId: '',\n data: {\n _subType: 'eval_case',\n id: c.id,\n suiteId: c.suiteId,\n inputMessage: c.inputMessage,\n inputFiles: c.inputFiles,\n steps: c.steps,\n outputType: c.outputType,\n contentAssertion: c.contentAssertion,\n rubrics: c.rubrics,\n },\n });\n }\n }\n\n const runs = await store.getRunsByTenant(tenantId, { projectId: project.id });\n for (const run of runs) {\n entities.push({\n _exportId: '',\n data: {\n _subType: 'eval_run',\n id: run.id,\n projectId: run.projectId,\n status: run.status,\n concurrency: run.concurrency,\n totalCases: run.totalCases,\n passedCases: run.passedCases,\n failedCases: run.failedCases,\n avgScore: run.avgScore,\n error: run.error,\n },\n });\n\n const results = await store.getResultsByRun(tenantId, run.id);\n for (const result of results) {\n entities.push({\n _exportId: '',\n data: {\n _subType: 'eval_run_result',\n id: result.id,\n runId: result.runId,\n suiteName: result.suiteName,\n caseId: result.caseId,\n pass: result.pass,\n score: result.score,\n summary: result.summary,\n dimensionResults: result.dimensionResults,\n durationMs: result.durationMs,\n messages: result.messages,\n logs: result.logs,\n error: result.error,\n },\n });\n }\n }\n }\n\n return entities;\n },\n\n async previewImport(\n tenantId: string,\n entities: ExportableEntity[],\n ): Promise<ImportPreviewResult> {\n const store = getStore();\n\n const existingProjects = await store.getProjectsByTenant(tenantId);\n const existingProjectIds = new Set(existingProjects.map((p) => p.id));\n const existingProjectNames = new Set(existingProjects.map((p) => p.name));\n\n const existingSuites: Map<string, Set<string>> = new Map();\n const existingSuiteIds = new Set<string>();\n const existingCaseIds = new Set<string>();\n const existingRunIds = new Set<string>();\n const existingResultIds = new Set<string>();\n\n for (const project of existingProjects) {\n const suites = await store.getSuitesByProject(tenantId, project.id);\n existingSuites.set(project.id, new Set(suites.map((s) => `${s.projectId}:${s.name}`)));\n for (const s of suites) {\n existingSuiteIds.add(s.id);\n try {\n const cases = await store.getCasesBySuite(tenantId, s.id);\n for (const c of cases) existingCaseIds.add(c.id);\n } catch { /* suite may not exist */ }\n }\n }\n\n for (const project of existingProjects) {\n const runs = await store.getRunsByTenant(tenantId, { projectId: project.id });\n for (const run of runs) {\n existingRunIds.add(run.id);\n try {\n const results = await store.getResultsByRun(tenantId, run.id);\n for (const r of results) existingResultIds.add(r.id);\n } catch { /* run may not exist */ }\n }\n }\n\n const conflicts: ImportPreviewResult['conflicts'] = [];\n const insertions: ImportPreviewResult['insertions'] = [];\n\n for (const entity of entities) {\n const d = entity.data as Record<string, unknown>;\n const subType = d._subType as string;\n const id = d.id as string;\n\n switch (subType) {\n case 'eval_project': {\n const name = d.name as string;\n if (existingProjectIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'eval_project',\n conflictType: 'id_exists',\n existingId: id,\n existingName: name,\n });\n } else if (name && existingProjectNames.has(name)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'eval_project',\n conflictType: 'unique_constraint',\n existingName: name,\n field: 'name',\n });\n } else {\n insertions.push({ _exportId: entity._exportId, entityType: 'eval_project', name });\n }\n break;\n }\n case 'eval_suite': {\n const projectId = d.projectId as string;\n const name = d.name as string;\n const suiteKey = `${projectId}:${name}`;\n const projectSuites = existingSuites.get(projectId);\n if (existingSuiteIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'eval_suite',\n conflictType: 'id_exists',\n existingId: id,\n existingName: name,\n });\n } else if (projectSuites?.has(suiteKey)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'eval_suite',\n conflictType: 'unique_constraint',\n existingName: name,\n field: 'projectId+name',\n });\n } else {\n insertions.push({ _exportId: entity._exportId, entityType: 'eval_suite', name });\n }\n break;\n }\n case 'eval_case': {\n if (existingCaseIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'eval_case',\n conflictType: 'id_exists',\n existingId: id,\n });\n } else {\n insertions.push({ _exportId: entity._exportId, entityType: 'eval_case', name: id });\n }\n break;\n }\n case 'eval_run': {\n if (existingRunIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'eval_run',\n conflictType: 'id_exists',\n existingId: id,\n });\n } else {\n insertions.push({ _exportId: entity._exportId, entityType: 'eval_run', name: id });\n }\n break;\n }\n case 'eval_run_result': {\n if (existingResultIds.has(id)) {\n conflicts.push({\n _exportId: entity._exportId,\n entityType: 'eval_run_result',\n conflictType: 'id_exists',\n existingId: id,\n });\n } else {\n insertions.push({ _exportId: entity._exportId, entityType: 'eval_run_result', name: id });\n }\n break;\n }\n }\n }\n\n return { conflicts, insertions, errors: [] };\n },\n\n async applyImport(tenantId, entity, resolution) {\n if (resolution.action === 'skip') return {};\n const store = getStore();\n const d = entity.data as Record<string, unknown>;\n const subType = d._subType as string;\n const id = resolution.action === 'rename' && resolution.newId ? resolution.newId : d.id as string;\n\n switch (subType) {\n case 'eval_project': {\n if (resolution.action === 'overwrite') {\n try { await store.deleteProject(tenantId, id); } catch { /* may not exist */ }\n }\n await store.createProject(tenantId, id, {\n name: d.name as string,\n description: d.description as string | undefined,\n version: d.version as string | undefined,\n judgeModelConfig: d.judgeModelConfig as Record<string, unknown>,\n targetServerConfig: d.targetServerConfig as Record<string, unknown>,\n concurrency: d.concurrency as number | undefined,\n reportConfig: d.reportConfig as Record<string, unknown> | undefined,\n });\n break;\n }\n case 'eval_suite': {\n if (resolution.action === 'overwrite') {\n try { await store.deleteSuite(tenantId, id); } catch { /* may not exist */ }\n }\n await store.createSuite(tenantId, d.projectId as string, id, {\n name: d.name as string,\n });\n break;\n }\n case 'eval_case': {\n if (resolution.action === 'overwrite') {\n try { await store.deleteCase(tenantId, id); } catch { /* may not exist */ }\n }\n await store.createCase(tenantId, d.suiteId as string, id, {\n inputMessage: d.inputMessage as string,\n inputFiles: d.inputFiles as Record<string, string> | undefined,\n steps: d.steps as Array<{ agent_id: string; override_message?: string }>,\n outputType: d.outputType as 'file_content' | 'message_content',\n contentAssertion: d.contentAssertion as string,\n rubrics: d.rubrics as Array<{ name: string; weight: number; description: string }> | undefined,\n });\n break;\n }\n case 'eval_run': {\n if (resolution.action === 'overwrite') {\n try { await store.deleteRun(tenantId, id); } catch { /* may not exist */ }\n }\n await store.createRun(tenantId, d.projectId as string, id, {\n totalCases: d.totalCases as number,\n concurrency: d.concurrency as number,\n });\n break;\n }\n case 'eval_run_result': {\n if (resolution.action === 'overwrite') {\n try { await store.deleteRunResult(tenantId, entity.data.id as string); } catch { /* may not exist */ }\n }\n await store.createRunResult(tenantId, d.runId as string, id, {\n suiteName: d.suiteName as string,\n caseId: d.caseId as string | undefined,\n pass: d.pass as boolean,\n score: d.score as number,\n summary: d.summary as string | undefined,\n dimensionResults: d.dimensionResults as Array<{ name: string; score: number; reason: string }> | undefined,\n durationMs: d.durationMs as number | undefined,\n messages: d.messages as Array<{ role: string; content: string; id?: string }> | undefined,\n logs: d.logs as Array<{ timestamp: string; level: string; message: string; data?: unknown }> | undefined,\n error: d.error as string | undefined,\n });\n break;\n }\n }\n\n return { newId: id };\n },\n};\n","import {\n getStoreLattice,\n agentInstanceManager,\n} from \"@axiom-lattice/core\";\nimport type {\n InboundMessage,\n DispatchResult,\n BindingRegistry,\n Binding,\n ChannelInstallationStore,\n} from \"@axiom-lattice/protocols\";\nimport { ChannelAdapterRegistry } from \"../channels/registry\";\nimport type { MessageContext, MessageMiddleware } from \"./MessageContext\";\nimport { randomUUID } from \"crypto\";\n\nexport class BindingNotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"BindingNotFoundError\";\n }\n}\n\nexport class ChannelInstallationNotFoundError extends Error {\n constructor() {\n super(\"Channel installation is unavailable\");\n this.name = \"ChannelInstallationNotFoundError\";\n }\n}\n\nexport class InvalidChannelInstallationError extends Error {\n constructor(message = \"Channel installation is not valid for this message\") {\n super(message);\n this.name = \"InvalidChannelInstallationError\";\n }\n}\n\n/**\n * Configuration for {@link MessageRouter}.\n *\n * @param middlewares - Ordered middleware chain executed before dispatch\n * @param bindingRegistry - Resolves sender-to-agent bindings\n * @param adapterRegistry - Registry of {@link ChannelAdapter} implementations\n * @param installationStore - Persisted channel installation configs\n */\nexport interface MessageRouterConfig {\n middlewares: MessageMiddleware[];\n bindingRegistry: BindingRegistry;\n adapterRegistry: ChannelAdapterRegistry;\n installationStore: ChannelInstallationStore;\n}\n\n/**\n * Core message router for external channel integration.\n *\n * Receives normalized {@link InboundMessage} objects from channel adapters,\n * resolves the target agent via {@link BindingRegistry}, manages thread\n * lifecycle, and sends AI responses back to the channel via\n * `ChannelAdapter.sendReply`.\n *\n * ## Reply flow\n *\n * The router uses a counter-based deduplication scheme on the internal\n * {@link Agent.reply:ready} event:\n *\n * 1. Before `agent.addMessage()`, it subscribes to `reply:ready` on the agent.\n * 2. Multiple concurrent dispatches on the same thread increment a counter;\n * only the first registers the `EventEmitter.once` listener.\n * 3. When `reply:ready` fires, the callback extracts the last AI message from\n * the LangGraph state and sends it via `ChannelAdapter.sendReply`.\n * 4. The counter is decremented; the subscription is only removed when the\n * counter reaches 0.\n * 5. Stale subscriptions are cleaned up after a 1-hour timeout.\n *\n * The `replyTarget` is carried through by injecting `_replyTarget` into\n * `custom_run_config` on {@link Agent.addMessage}, and retrieved from the\n * `reply:ready` event payload.\n *\n * @see {@link ChannelAdapter.sendReply}\n * @see {@link InboundMessage.replyTarget}\n */\nexport class MessageRouter {\n private middlewares: MessageMiddleware[];\n private bindingRegistry: BindingRegistry;\n private adapterRegistry: ChannelAdapterRegistry;\n private installationStore: ChannelInstallationStore;\n\n /**\n * Tracks reply subscriptions per thread+channel to avoid duplicate\n * `subscribeOnce` registrations and ensure proper cleanup.\n *\n * Key format: `{threadId}:{adapterChannel}:reply`\n */\n private _replySubs: Map<string, { count: number; timer: NodeJS.Timeout }> = new Map();\n\n constructor(config: MessageRouterConfig) {\n this.middlewares = [...config.middlewares];\n this.bindingRegistry = config.bindingRegistry;\n this.adapterRegistry = config.adapterRegistry;\n this.installationStore = config.installationStore;\n }\n\n /**\n * Register an additional middleware at the end of the chain.\n *\n * @param middleware - A {@link MessageMiddleware} function\n */\n use(middleware: MessageMiddleware): void {\n this.middlewares.push(middleware);\n }\n\n /**\n * Dispatch an inbound channel message to the bound agent.\n *\n * Full pipeline: middleware chain → binding resolution → thread lifecycle\n * → agent.addMessage() → (async) reply via {@link ChannelAdapter.sendReply}.\n *\n * If the message has a {@link InboundMessage.replyTarget}, the router subscribes\n * to the agent's `reply:ready` event before enqueuing the message, and sends\n * the AI response back to the channel when it arrives.\n *\n * @param message - Normalized inbound message from a channel adapter\n * @returns {@link DispatchResult} with success status, bindingId, and threadId\n */\n async dispatch(message: InboundMessage): Promise<DispatchResult> {\n const ctx: MessageContext = {\n inboundMessage: message,\n metadata: {},\n };\n\n let binding: Binding | null = null;\n let threadId: string | undefined;\n let agentId: string | undefined;\n\n try {\n const installation = await this.installationStore.getInstallationById(\n message.channelInstallationId,\n );\n if (!installation) {\n throw new ChannelInstallationNotFoundError();\n }\n if (installation.enabled !== true) {\n throw new InvalidChannelInstallationError(\"Channel installation is disabled\");\n }\n if (\n installation.channel !== message.channel\n || (message.tenantId !== undefined && message.tenantId !== installation.tenantId)\n ) {\n throw new InvalidChannelInstallationError();\n }\n const tenantId = installation.tenantId;\n\n await this.runMiddlewares(ctx, async () => {\n console.log({ event: \"dispatch:start\", channel: message.channel, senderId: message.sender.id, tenantId }, \"Message dispatch started\");\n\n // 检查 adapter 是否支持自定义 thread 策略\n const adapter = this.adapterRegistry.get(message.channel);\n const hasAdapterThreadStrategy = !!adapter?.resolveThreadId;\n\n binding = await this.bindingRegistry.resolve({\n channel: message.channel,\n senderId: message.sender.id,\n channelInstallationId: message.channelInstallationId,\n tenantId,\n });\n\n if (!binding) {\n if (installation.rejectWhenNoBinding) {\n console.warn({\n event: \"dispatch:no_binding\",\n channel: message.channel,\n senderId: message.sender.id,\n tenantId,\n channelInstallationId: message.channelInstallationId,\n }, \"No binding found and rejectWhenNoBinding is enabled\");\n throw new BindingNotFoundError(\n `No binding for sender \"${message.sender.id}\" on channel \"${message.channel}\"`,\n );\n }\n\n if (installation.fallbackAgentId) {\n console.warn({\n event: \"dispatch:fallback\",\n channel: message.channel,\n senderId: message.sender.id,\n fallbackAgentId: installation.fallbackAgentId,\n }, \"No binding found, falling back to fallbackAgentId\");\n binding = {\n id: \"fallback\",\n channel: message.channel,\n channelInstallationId: message.channelInstallationId,\n tenantId,\n senderId: message.sender.id,\n agentId: installation.fallbackAgentId,\n threadId: undefined,\n threadMode: \"fixed\" as const,\n enabled: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n } else if (!hasAdapterThreadStrategy) {\n // 只有当 adapter 没有自定义 thread 策略且没有 fallback 时才报错\n console.error({\n event: \"dispatch:no_fallback\",\n channel: message.channel,\n senderId: message.sender.id,\n tenantId,\n }, \"No binding found and no fallbackAgentId configured\");\n throw new BindingNotFoundError(\n `No binding for sender \"${message.sender.id}\" and no fallback configured`,\n );\n }\n }\n\n ctx.binding = binding ?? undefined;\n\n if (binding) {\n console.log({\n event: \"dispatch:binding\",\n bindingId: binding.id,\n agentId: binding.agentId,\n threadId: binding.threadId,\n threadMode: binding.threadMode,\n workspaceId: binding.workspaceId,\n projectId: binding.projectId,\n }, \"Binding resolved\");\n\n if (!binding.enabled) {\n console.warn({\n event: \"dispatch:binding_disabled\",\n bindingId: binding.id,\n agentId: binding.agentId,\n senderId: message.sender.id,\n }, \"Binding is disabled, rejecting message\");\n throw new BindingNotFoundError(\n `Binding for sender \"${message.sender.id}\" is disabled`,\n );\n }\n }\n\n // 确定 agentId\n agentId = binding?.agentId ?? installation.fallbackAgentId;\n if (!agentId) {\n throw new BindingNotFoundError(\n `No agent configured for sender \"${message.sender.id}\"`,\n );\n }\n\n // 优先使用 adapter 的自定义 thread 策略\n if (hasAdapterThreadStrategy) {\n const resolvedThreadId = await adapter!.resolveThreadId!(message, binding);\n threadId = resolvedThreadId;\n console.log({\n event: \"dispatch:thread:adapter\",\n threadId,\n channel: message.channel,\n adapterChannel: adapter!.channel,\n }, \"Thread resolved by adapter strategy\");\n\n // 确保 thread 存在(adapter 的策略可能有重复,例如同一天)\n const threadStore = getStoreLattice(\"default\", \"thread\").store;\n try {\n await threadStore.createThread(\n tenantId!,\n agentId,\n threadId,\n {\n metadata: {\n channel: message.channel,\n channelInstallationId: message.channelInstallationId,\n senderId: message.sender.id,\n bindingId: binding?.id,\n ...(message.conversation ? {\n conversationId: message.conversation.id,\n conversationType: message.conversation.type,\n } : {}),\n },\n },\n );\n console.log({\n event: \"dispatch:thread:adapter:created\",\n threadId,\n }, \"Thread created by adapter strategy\");\n } catch {\n // Thread already exists from a previous message — 复用\n console.log({\n event: \"dispatch:thread:adapter:reuse\",\n threadId,\n }, \"Thread already exists, reusing\");\n }\n } else if (binding) {\n // 默认策略:per_conversation 总是创建新线程,fixed 复用已有线程\n if (binding.threadMode === \"per_conversation\") {\n threadId = undefined; // 创建新线程\n } else {\n threadId = binding.threadId; // 复用 fixed 线程\n }\n }\n\n if (!threadId) {\n const threadStore = getStoreLattice(\"default\", \"thread\").store;\n const newThreadId = randomUUID();\n console.log({\n event: \"dispatch:thread:create\",\n agentId,\n newThreadId,\n tenantId: tenantId!,\n }, \"Creating new thread for binding\");\n const newThread = await threadStore.createThread(\n tenantId!,\n agentId,\n newThreadId,\n {\n metadata: {\n channel: message.channel,\n channelInstallationId: message.channelInstallationId,\n senderId: message.sender.id,\n bindingId: binding?.id,\n ...(message.conversation ? {\n conversationId: message.conversation.id,\n conversationType: message.conversation.type,\n } : {}),\n },\n },\n );\n threadId = newThread.id;\n if (binding && binding.id !== \"fallback\") {\n await this.bindingRegistry.update(binding.id, { threadId });\n binding.threadId = threadId;\n } else if (binding) {\n binding.threadId = threadId;\n }\n }\n\n console.log({\n event: \"dispatch:agent\",\n agentId,\n threadId,\n senderId: message.sender.id,\n contentLength: message.content.text.length,\n }, \"Dispatching to agent\");\n\n const agent = agentInstanceManager.getAgent({\n tenant_id: tenantId!,\n assistant_id: agentId,\n thread_id: threadId,\n workspace_id: binding?.workspaceId || \"\",\n project_id: binding?.projectId || \"\",\n });\n\n /**\n * Subscribe to reply:ready before addMessage to avoid a race with\n * an already-running queue processor.\n *\n * The `_replySubs` map uses a counter (not a boolean) so that multiple\n * concurrent dispatches on the same thread each get a callback invocation.\n * The `subscribeOnce` listener is only registered when the counter goes\n * from 0 → 1, and removed when it goes back to 0. A 1-hour timeout\n * protects against leaked subscriptions due to agent errors/aborts.\n */\n if (message.replyTarget) {\n const replySubKey = `${threadId}:${message.replyTarget.adapterChannel}:reply`;\n const adapter = this.adapterRegistry.get(message.replyTarget.adapterChannel);\n if (adapter) {\n const existing = this._replySubs.get(replySubKey);\n if (!existing || existing.count === 0) {\n // First subscriber for this thread+channel — register the event listener\n const timer = setTimeout(() => {\n // Cleanup if reply never fires (agent aborted, errored, etc.)\n const entry = this._replySubs.get(replySubKey);\n if (entry) {\n this._replySubs.delete(replySubKey);\n console.warn({\n event: \"dispatch:reply:timeout\",\n threadId,\n channel: message.replyTarget!.adapterChannel,\n }, \"Reply subscription timed out — no reply:ready fired within 1h\");\n }\n }, 3_600_000);\n\n this._replySubs.set(replySubKey, { count: 1, timer });\n\n console.log({\n event: \"dispatch:reply:subscribed\",\n threadId,\n channel: message.replyTarget.adapterChannel,\n senderId: message.sender.id,\n }, \"Subscribed to reply:ready for thread\");\n\n agent.subscribeOnce('reply:ready', (data: any) => {\n const messages = data.state?.values?.messages;\n const lastAI = messages\n ?.filter((m: any) => m.type === 'ai' || m.getType?.() === 'ai')\n .pop();\n const replyText = lastAI?.content ?? '';\n\n // Decrement counter; unsubscribe only when count reaches 0\n const entry = this._replySubs.get(replySubKey);\n if (entry) {\n entry.count--;\n if (entry.count <= 0) {\n clearTimeout(entry.timer);\n this._replySubs.delete(replySubKey);\n }\n }\n\n if (replyText) {\n console.log({\n event: \"dispatch:reply:sending\",\n threadId,\n channel: message.replyTarget!.adapterChannel,\n replyLength: replyText.length,\n }, \"Sending channel reply\");\n adapter.sendReply(message.replyTarget!, { text: replyText }, installation)\n .then(() => {\n console.log({\n event: \"dispatch:reply:sent\",\n threadId,\n channel: message.replyTarget!.adapterChannel,\n }, \"Channel reply sent successfully\");\n })\n .catch((err) => console.error({\n event: \"dispatch:reply:failed\",\n threadId,\n channel: message.replyTarget!.adapterChannel,\n error: err instanceof Error ? err.message : String(err),\n }, \"Failed to send channel reply\"));\n } else {\n console.warn({\n event: \"dispatch:reply:empty\",\n threadId,\n channel: message.replyTarget!.adapterChannel,\n }, \"Agent produced no text output — skipping reply\");\n }\n });\n } else {\n // Another dispatch already subscribed — increment counter\n existing.count++;\n console.log({\n event: \"dispatch:reply:incremented\",\n threadId,\n channel: message.replyTarget.adapterChannel,\n count: existing.count,\n }, \"Incremented reply counter for thread (already subscribed)\");\n }\n }\n }\n\n const addResult = await agent.addMessage({\n input: { message: message.content.text },\n custom_run_config: message.replyTarget\n ? { ...(message.content.metadata || {}), _replyTarget: message.replyTarget }\n : (message.content.metadata || {}),\n });\n\n console.log({\n event: \"dispatch:complete\",\n agentId,\n threadId,\n messageId: (addResult as Record<string, unknown>)?.messageId,\n result: JSON.stringify(addResult),\n }, \"Agent dispatch complete — messageId = \" + ((addResult as Record<string, unknown>)?.messageId || \"N/A\"));\n });\n\n return {\n success: true,\n bindingId: ctx.binding?.id,\n threadId,\n result: ctx.result,\n };\n } catch (error) {\n ctx.error = error instanceof Error ? error : new Error(String(error));\n console.error({ event: \"dispatch:error\", error: ctx.error.message, channel: message.channel, senderId: message.sender.id }, \"Message dispatch failed\");\n return {\n success: false,\n bindingId: ctx.binding?.id,\n threadId: ctx.binding?.threadId,\n error: ctx.error,\n };\n }\n }\n\n private async runMiddlewares(\n ctx: MessageContext,\n finalHandler: () => Promise<void>,\n ): Promise<void> {\n const dispatch = (index: number): Promise<void> => {\n if (index >= this.middlewares.length) {\n return finalHandler();\n }\n const middleware = this.middlewares[index];\n return middleware(ctx, () => dispatch(index + 1));\n };\n return dispatch(0);\n }\n}\n","import type { ChannelAdapter } from \"@axiom-lattice/protocols\";\n\nexport class ChannelAdapterRegistry {\n private adapters = new Map<string, ChannelAdapter>();\n\n register(adapter: ChannelAdapter): void {\n if (this.adapters.has(adapter.channel)) {\n throw new Error(`Channel adapter \"${adapter.channel}\" already registered`);\n }\n this.adapters.set(adapter.channel, adapter);\n }\n\n get(channel: string): ChannelAdapter | undefined {\n return this.adapters.get(channel);\n }\n\n list(): string[] {\n return Array.from(this.adapters.keys());\n }\n}\n","import type { MessageMiddleware } from \"../MessageContext\";\n\nconst processedMessages = new Map<string, number>();\n\nexport function createDeduplicationMiddleware(\n ttlMs: number = 5 * 60 * 1000,\n): MessageMiddleware {\n return async (ctx, next) => {\n const msg = ctx.inboundMessage;\n const msgId = msg.content.metadata?.messageId as string | undefined;\n const key = msgId\n ? `${msg.channel}:${msg.channelInstallationId}:${msgId}`\n : null;\n\n if (key) {\n const now = Date.now();\n const lastProcessed = processedMessages.get(key);\n if (lastProcessed && (now - lastProcessed) < ttlMs) {\n console.warn({\n event: \"dedup:blocked\",\n channel: msg.channel,\n senderId: msg.sender.id,\n messageId: msgId,\n }, \"Duplicate message blocked by deduplication\");\n return;\n }\n processedMessages.set(key, now);\n }\n\n if (processedMessages.size > 10000) {\n const oldest = Array.from(processedMessages.entries())\n .sort((a, b) => a[1] - b[1])[0];\n if (oldest) processedMessages.delete(oldest[0]);\n }\n\n await next();\n };\n}\n","import type { MessageMiddleware } from \"../MessageContext\";\n\nexport class RateLimitError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"RateLimitError\";\n }\n}\n\ninterface Counter { count: number; resetAt: number; }\nconst rateCounters = new Map<string, Counter>();\n\nexport function createRateLimitMiddleware(\n maxRequests: number = 10,\n windowMs: number = 60 * 1000,\n maxEntries: number = 10000,\n): MessageMiddleware {\n return async (ctx, next) => {\n const senderKey = `${ctx.inboundMessage.channel}:${ctx.inboundMessage.sender.id}`;\n const now = Date.now();\n let counter = rateCounters.get(senderKey);\n if (!counter || now > counter.resetAt) {\n counter = { count: 0, resetAt: now + windowMs };\n }\n counter.count++;\n rateCounters.set(senderKey, counter);\n\n if (rateCounters.size > maxEntries) {\n const oldest = Array.from(rateCounters.entries())\n .sort((a, b) => a[1].resetAt - b[1].resetAt)[0];\n if (oldest) rateCounters.delete(oldest[0]);\n }\n\n if (counter.count > maxRequests) {\n console.warn({\n event: \"ratelimit:blocked\",\n channel: ctx.inboundMessage.channel,\n senderId: ctx.inboundMessage.sender.id,\n count: counter.count,\n maxRequests,\n }, \"Rate limit exceeded\");\n throw new RateLimitError(`Rate limit exceeded`);\n }\n await next();\n };\n}\n","import type { MessageMiddleware } from \"../MessageContext\";\nimport { Logger } from \"../../logger/Logger\";\n\nconst logger = new Logger({ serviceName: \"lattice/gateway/audit\" });\n\nexport function createAuditLoggerMiddleware(): MessageMiddleware {\n return async (ctx, next) => {\n const start = Date.now();\n try {\n await next();\n logger.info(\"message routed\", {\n event: \"message:routed\",\n channel: ctx.inboundMessage.channel,\n senderId: ctx.inboundMessage.sender.id,\n agentId: ctx.binding?.agentId,\n threadId: ctx.binding?.threadId,\n duration: Date.now() - start,\n status: \"success\",\n });\n } catch (error) {\n logger.error(\n error instanceof Error ? error.message : String(error),\n {\n event: \"message:error\",\n channel: ctx.inboundMessage.channel,\n senderId: ctx.inboundMessage.sender.id,\n duration: Date.now() - start,\n status: \"error\",\n },\n );\n throw error;\n }\n };\n}\n","import { FastifyInstance } from \"fastify\";\nimport swagger from \"@fastify/swagger\";\nimport swaggerUi from \"@fastify/swagger-ui\";\n// Example usage:\n// configureSwagger(app)\n// configureSwagger(app, { openapi: { info: { version: \"2.0.0\" } } })\n// configureSwagger(app, undefined, { routePrefix: \"/docs\" })\n\n// Default swagger configuration\nexport const defaultSwaggerConfig = {\n openapi: {\n openapi: \"3.0.0\",\n info: {\n title: \"Axiom Lattice Gateway API\",\n description: \"API Gateway for LangGraph agent-based applications\",\n version: \"1.0.0\",\n contact: {\n name: \"Axiom Lattice Team\",\n email: \"support@axiom-lattice.com\",\n },\n },\n servers: [\n {\n url: \"http://localhost:4001\",\n description: \"Development environment\",\n },\n ],\n components: {\n securitySchemes: {\n bearerAuth: {\n type: \"http\" as const,\n scheme: \"bearer\" as const,\n bearerFormat: \"JWT\",\n },\n },\n },\n security: [\n {\n bearerAuth: [],\n },\n ],\n tags: [\n { name: \"Runs\", description: \"Agent run management\" },\n { name: \"Memory\", description: \"Agent memory management\" },\n { name: \"Graph\", description: \"Agent graph visualization\" },\n { name: \"Health\", description: \"System health checks\" },\n ],\n },\n};\n\n// Default swagger UI configuration\nexport const defaultSwaggerUiConfig = {\n routePrefix: \"/api-docs\",\n uiConfig: {\n docExpansion: \"full\" as const,\n deepLinking: false,\n },\n staticCSP: true,\n transformStaticCSP: (header: string) => header,\n};\n\n// Configure Swagger with optional custom configuration\nexport const configureSwagger = async (\n app: FastifyInstance,\n customSwaggerConfig?: Partial<typeof defaultSwaggerConfig>,\n customSwaggerUiConfig?: Partial<typeof defaultSwaggerUiConfig>\n) => {\n // Merge default config with custom config\n const swaggerConfig = { ...defaultSwaggerConfig, ...customSwaggerConfig };\n const swaggerUiConfig = {\n ...defaultSwaggerUiConfig,\n ...customSwaggerUiConfig,\n };\n\n await app.register(swagger, swaggerConfig);\n await app.register(swaggerUi, swaggerUiConfig);\n};\n","import { eventBus, AGENT_TASK_EVENT, agentInstanceManager, QueueMode } from \"@axiom-lattice/core\";\nimport { popAgentTaskFromQueue } from \"./queue_service\";\n\n// 任务请求结构\nexport interface AgentTaskRequest {\n assistant_id: string;\n input: any;\n thread_id: string;\n \"x-tenant-id\": string;\n command?: any;\n callback_event?: string;\n runConfig?: Record<string, any>;\n main_thread_id?: string;\n main_tenant_id?: string;\n main_assistant_id?: string;\n}\n\n/**\n * 处理Agent任务事件\n * @param taskRequest 任务请求\n * @param retryCount 重试次数\n */\nconst handleAgentTask = async (\n taskRequest: AgentTaskRequest,\n retryCount: number = 0\n): Promise<boolean> => {\n const {\n assistant_id,\n input = {},\n thread_id,\n \"x-tenant-id\": tenant_id,\n command,\n callback_event,\n runConfig,\n main_thread_id,\n main_tenant_id,\n main_assistant_id,\n } = taskRequest;\n\n\n try {\n console.log(\n `开始处理任务 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n\n // 检查API服务器是否可用\n // const apiUrl = AgentTaskConsumer.agent_run_endpoint;\n\n // console.log(`apiUrl: ${apiUrl}`);\n const agent = agentInstanceManager.getAgent({ assistant_id, thread_id, tenant_id, workspace_id: runConfig?.workspaceId, project_id: runConfig?.projectId, custom_run_config: runConfig })\n await agent.addMessage({ input, command, custom_run_config: runConfig }, QueueMode.STEER);\n if (callback_event) {\n agent.subscribeOnce(\"message:completed\", (evt) => {\n eventBus.publish(callback_event, {\n success: true,\n state: evt.state,\n });\n\n if (main_thread_id && main_tenant_id) {\n try {\n const mainAgent = agentInstanceManager.getAgent({\n assistant_id: main_assistant_id ?? assistant_id,\n thread_id: main_thread_id,\n tenant_id: main_tenant_id,\n workspace_id: runConfig?.workspaceId,\n project_id: runConfig?.projectId,\n });\n if (mainAgent) {\n const messages = evt.state?.values?.messages;\n const lastAIMessage = messages\n ?.filter((m: any) => m.type === 'ai' || m.getType?.() === 'ai')\n .pop();\n const summary = lastAIMessage?.content\n ?.substring(0, 500) ?? '(no output)';\n\n mainAgent.addMessage(\n {\n input: {\n message: `[Async task completed]\\ntask_id: ${thread_id}\\n${summary}`,\n },\n },\n ).catch((err: Error) => {\n console.error('Failed to notify main thread:', err);\n });\n\n mainAgent.updateAsyncTaskStatus(thread_id, 'completed');\n }\n } catch (err) {\n console.error('Failed to notify main thread:', err);\n }\n }\n })\n agent.subscribeOnce(\"message:interrupted\", (evt) => {\n eventBus.publish(callback_event, {\n success: true,\n state: evt.state,\n });\n })\n }\n\n return true;\n\n\n\n } catch (error) {\n console.error(\n `Agent任务执行失败: ${assistant_id}, 线程: ${thread_id}`,\n error\n );\n\n // 重试逻辑,暂不用重试\n const maxRetries = 0;\n if (retryCount < maxRetries) {\n const nextRetryCount = retryCount + 1;\n const delayMs = Math.pow(2, nextRetryCount) * 1000; // 指数退避策略\n\n console.log(\n `将在 ${delayMs}ms 后重试任务 (${nextRetryCount}/${maxRetries})`\n );\n\n // 延迟后重试\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n return handleAgentTask(taskRequest, nextRetryCount);\n }\n\n if (callback_event) {\n eventBus.publish(callback_event, {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n console.error(\n `任务处理失败,已达到最大重试次数 [assistant_id: ${assistant_id}, thread_id: ${thread_id}]`\n );\n return false;\n }\n};\n\n/**\n * Agent任务消费者\n * 负责监听和执行Agent任务事件,同时从队列中消费任务\n */\nexport class AgentTaskConsumer {\n private isPolling: boolean = false;\n private pollingInterval: NodeJS.Timeout | null = null;\n private pollingIntervalMs: number = 5000; // 默认5秒轮询一次\n private maxConcurrentTasks: number = 15; // 最大并发任务数\n private activeTasks: number = 0; // 当前活跃的任务数\n private processing: boolean = false; // 是否正在处理任务批次\n private immediateProcessingEnabled: boolean = true; // 是否启用即时处理模式\n public gatewayPort: number = 4001;\n public static agent_run_endpoint: string = \"http://localhost:4001/api/runs\";\n\n constructor(gatewayPort: number, pollingIntervalMs?: number) {\n this.gatewayPort = gatewayPort;\n AgentTaskConsumer.agent_run_endpoint = `http://localhost:${this.gatewayPort}/api/runs`;\n if (pollingIntervalMs) {\n this.pollingIntervalMs = pollingIntervalMs;\n }\n this.initialize();\n }\n\n /**\n * 初始化事件监听和队列轮询\n */\n private initialize(): void {\n // 监听事件总线上的任务\n eventBus.subscribe(AGENT_TASK_EVENT, this.trigger_agent_task.bind(this));\n\n // 启动队列轮询\n this.startPollingQueue();\n\n console.log(\"Agent任务消费者已启动并监听任务事件和队列\");\n }\n\n /**\n * 启动队列轮询\n */\n startPollingQueue(): void {\n if (this.isPolling) {\n return;\n }\n\n this.isPolling = true;\n\n this.pollingInterval = setInterval(async () => {\n try {\n // 如果上一批次任务还在处理中,跳过本次轮询\n if (this.processing) {\n console.log(\"队列处理中,跳过本次轮询\");\n return;\n }\n\n await this.consumeFromQueue();\n } catch (error) {\n console.error(\"队列轮询出错:\", error);\n }\n }, this.pollingIntervalMs);\n\n console.log(\n `开始轮询队列,间隔: ${this.pollingIntervalMs}ms,最大并发任务数: ${this.maxConcurrentTasks}`\n );\n }\n\n /**\n * 停止队列轮询\n */\n stopPollingQueue(): void {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n this.pollingInterval = null;\n this.isPolling = false;\n console.log(\"已停止队列轮询\");\n }\n }\n\n /**\n * 处理单个任务并在完成后立即尝试处理下一个\n */\n async processNextTask(): Promise<boolean> {\n try {\n // 从队列中获取任务\n const queueResult = await popAgentTaskFromQueue();\n\n // 检查队列结果\n if (queueResult && queueResult.data) {\n const taskItem = queueResult.data;\n\n if (taskItem && typeof taskItem === \"object\") {\n const taskRequest = taskItem as AgentTaskRequest;\n\n console.log(\n `从队列中获取到任务 [assistant: ${taskRequest.assistant_id}, thread: ${taskRequest.thread_id}]`\n );\n\n // 增加活跃任务计数\n this.activeTasks++;\n\n // 处理任务(不使用await,允许并发执行)\n handleAgentTask(taskRequest)\n .then((success) => {\n if (!success) {\n console.error(`任务 处理失败`);\n // 可以在这里记录失败任务或执行补偿逻辑\n } else {\n console.log(`任务 处理成功`);\n }\n })\n .catch((error) => {\n console.error(`任务 处理时出错:`, error);\n })\n .finally(() => {\n // 减少活跃任务计数\n this.activeTasks--;\n\n // 如果启用了即时处理模式,尝试处理更多任务\n if (this.immediateProcessingEnabled && !this.processing) {\n this.checkQueueForTasks();\n }\n });\n\n // 任务已派发,返回true表示有任务被处理\n return true;\n } else {\n console.log(\"队列任务格式无效:\", taskItem);\n return false;\n }\n } else {\n // 队列为空\n return false;\n }\n } catch (error) {\n console.error(\"处理任务失败:\", error);\n return false;\n }\n }\n\n /**\n * 检查队列中是否有任务并处理\n */\n async checkQueueForTasks(): Promise<void> {\n // 如果已经在处理中或者并发任务已达上限,则不处理\n if (this.processing || this.activeTasks >= this.maxConcurrentTasks) {\n return;\n }\n\n this.processing = true;\n\n try {\n // 尝试获取并处理任务,直到达到并发上限\n while (this.activeTasks < this.maxConcurrentTasks) {\n const taskProcessed = await this.processNextTask();\n if (!taskProcessed) {\n // 没有更多任务,退出循环\n break;\n }\n }\n } catch (error) {\n console.error(\"检查队列任务失败:\", error);\n } finally {\n this.processing = false;\n }\n }\n\n /**\n * 从队列中消费任务\n */\n async consumeFromQueue(): Promise<void> {\n // 如果已经在处理中,跳过\n if (this.processing) {\n return;\n }\n\n // 调用任务检查方法\n await this.checkQueueForTasks();\n }\n\n /**\n * 处理通过事件触发的任务\n */\n trigger_agent_task(taskRequest: AgentTaskRequest): void {\n console.log(\n `通过事件触发任务: [assistant: ${taskRequest.assistant_id}, thread: ${taskRequest.thread_id}]`\n );\n\n // 处理任务,不阻塞事件处理流程\n handleAgentTask(taskRequest).catch((error) => {\n console.error(\"处理Agent任务时发生未捕获的错误:\", error);\n\n // 如果有回调事件,确保即使发生错误也能通知\n if (taskRequest.callback_event) {\n eventBus.publish(taskRequest.callback_event, {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n // 如果启用了即时处理且当前活跃任务数低于阈值,检查队列\n if (\n this.immediateProcessingEnabled &&\n this.activeTasks < this.maxConcurrentTasks\n ) {\n setImmediate(() => this.checkQueueForTasks());\n }\n }\n}\n"],"mappings":"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","names":["path","start","deleted","t","agentInstanceManager","resolve","getUserId","agentInstanceManager","agentInstanceManager","getStoreLattice","randomUUID","getTenantId","getTenantId","getTenantId","getTenantId","c","embeddingsLatticeManager","collectionService","getStoreLattice","getTenantId","getStoreLattice","agentInstanceManager","ThreadStatus","MessageChunkTypes","getTenantId","t","eventBus","getStoreLattice","randomUUID","getWorkspaceId","getTenantId","getUserId","t","randomUUID","t","resolve","path","ExportableEntityRegistry","multipart","fastify","agentInstanceManager","agentLatticeManager","errorMessage","getSandBoxManager","app","getSandBoxManager","fs","path","os","getStoreLattice","getSandBoxManager","uuidv4","getStoreLattice","uuidv4","getSandBoxManager","filename","content","path","app","getStoreLattice","randomUUID","getTenantId","resolve","app","getStoreLattice","metricsServerManager","SemanticMetricsClient","randomUUID","getTenantId","app","PluginRegistry","fastify","getStoreLattice","uuidv4","getStoreLattice","modelLatticeManager","uuidv4","c","getTenantId","getStoreLattice","uuidv4","modelKey","modelLatticeManager","app","getStoreLattice","uuidv4","app","getStoreLattice","uuidv4","app","getStoreLattice","uuidv4","path","app","z","normalizeChatType","z","crypto","logger","app","app","app","randomUUID","getTenantId","getStoreLattice","errorMessage","app","getTenantId","app","getTenantId","app","v4","path","resolve","app","app","modelKey","getStoreLattice","AgentType","getTenantId","getStoreLattice","randomUUID","randomUUID","app","agentLatticeManager","getStoreLattice","getTenantId","getUserId","getAssistantStore","getTenantId","getUserId","getAssistantStore","agentLatticeManager","getStoreLattice","app","agentInstanceManager","agentLatticeManager","getStoreLattice","modelLatticeManager","z","app","service","z","ZodError","randomUUID","MessageChunkTypes","randomUUID","MessageChunkTypes","modelKey","MessageChunkTypes","parseAgentWebAppGenUIBlock","isRecord","z","app","normalizeError","handle","ZodError","modelKey","createHash","randomBytes","app","getStoreLattice","modelLatticeManager","agentLatticeManager","agentInstanceManager","app","ExportableEntityRegistry","SandboxSkillStore","isBuiltInSkill","getStore","getStoreLattice","getStore","getStoreLattice","getStore","c","getStoreLattice","getStore","c","getStoreLattice","getStore","c","getStoreLattice","getStore","connections","c","getStoreLattice","getStore","c","getStoreLattice","randomUUID","getStore","getStoreLattice","getStore","getStoreLattice","getStore","c","ExportableEntityRegistry","getStoreLattice","agentInstanceManager","randomUUID","adapter","logger","start","app","eventBus","agentInstanceManager","QueueMode","agentInstanceManager","QueueMode","eventBus","resolve","sandboxLatticeManager","getStoreLattice","agentInstanceManager","logger","path","c","getStore"]}
|