@kraken-ai/platform 0.0.4 → 0.0.7
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/{chunk-PPT6GGYL.js → chunk-FTLOWV2N.js} +244 -67
- package/dist/chunk-FTLOWV2N.js.map +1 -0
- package/dist/cli.js +1103 -374
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +416 -240
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1107 -368
- package/dist/index.d.ts +1107 -368
- package/dist/index.js +183 -172
- package/dist/index.js.map +1 -1
- package/dist/server.cjs +220 -45
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +265 -28
- package/dist/server.d.ts +265 -28
- package/dist/server.js +15 -20
- package/dist/server.js.map +1 -1
- package/package.json +20 -16
- package/dist/chunk-PPT6GGYL.js.map +0 -1
- package/dist/types-_lfbhFJH.d.cts +0 -451
- package/dist/types-_lfbhFJH.d.ts +0 -451
package/dist/server.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server.ts","../src/agents/connector-server.ts","../src/agents/errors.ts","../src/agents/connector-wrap.ts","../src/dev.ts","../src/agents/define-actions.ts","../src/agents/types/action.ts","../src/cli/log.ts","../src/dev-actions.ts","../src/dev-connectors.ts","../src/cli/validate.ts","../src/mock-tool-set.ts"],"sourcesContent":["// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nexport {\n type ConnectorServerHandle,\n type ConnectorServerOptions,\n startConnectorServer,\n} from \"./agents/connector-server\";\nexport { runDev } from \"./dev\";\nexport { MockToolSet } from \"./mock-tool-set\";\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport { randomUUID } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\n\nimport * as z from \"zod\";\nimport { wrapToolError, wrapToolResult } from \"./connector-wrap\";\nimport type { ConnectorPromptDef, PlatformConnector } from \"./types/connector\";\n\nconst DEFAULT_HANDLER_TIMEOUT_MS = 30_000;\nconst MAX_BODY_SIZE = 10 * 1024 * 1024; // 10MB\n\nexport interface ConnectorServerOptions {\n readonly port?: number;\n readonly host?: string;\n readonly handlerTimeoutMs?: number;\n}\n\nexport interface ConnectorServerHandle {\n readonly port: number;\n readonly close: () => Promise<void>;\n}\n\nconst withTimeout = <T>(promise: Promise<T>, ms: number): Promise<T> =>\n Promise.race([\n promise,\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(`Handler timed out after ${ms}ms`)), ms),\n ),\n ]);\n\nconst readBody = (req: IncomingMessage, maxSize: number): Promise<string> =>\n new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n let size = 0;\n req.on(\"data\", (chunk: Buffer) => {\n size += chunk.length;\n if (size > maxSize) {\n req.destroy();\n reject(new Error(\"Request body too large\"));\n return;\n }\n chunks.push(chunk);\n });\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString()));\n req.on(\"error\", reject);\n });\n\n/** Convert ConnectorPromptDef.arguments array to a raw shape for MCP SDK */\nconst buildPromptArgsSchema = (\n def: ConnectorPromptDef,\n): Record<string, z.ZodString | z.ZodOptional<z.ZodString>> | undefined => {\n if (!def.arguments?.length) return undefined;\n const shape: Record<string, z.ZodString | z.ZodOptional<z.ZodString>> = {};\n for (const arg of def.arguments) {\n shape[arg.name] = arg.required ? z.string() : z.string().optional();\n }\n return shape;\n};\n\nexport const startConnectorServer = async (\n connector: PlatformConnector,\n options?: ConnectorServerOptions,\n): Promise<ConnectorServerHandle> => {\n const mcpServerModule = await import(\"@modelcontextprotocol/sdk/server/mcp.js\").catch(() => {\n throw new Error(\n \"@modelcontextprotocol/sdk is required for startConnectorServer. \" +\n \"Install it: pnpm add @modelcontextprotocol/sdk\",\n );\n });\n const transportModule = await import(\"@modelcontextprotocol/sdk/server/streamableHttp.js\").catch(\n () => {\n throw new Error(\n \"@modelcontextprotocol/sdk is required for startConnectorServer. \" +\n \"Install it: pnpm add @modelcontextprotocol/sdk\",\n );\n },\n );\n\n const { McpServer } = mcpServerModule;\n const { StreamableHTTPServerTransport } = transportModule;\n\n const timeoutMs = options?.handlerTimeoutMs ?? DEFAULT_HANDLER_TIMEOUT_MS;\n\n const mcpServer = new McpServer(\n { name: connector.name, version: \"0.0.0\" },\n { capabilities: { tools: {}, resources: {}, prompts: {} } },\n );\n\n const tools = connector.tools ?? {};\n const toolEntries = Object.entries(tools);\n\n if (toolEntries.length === 0) {\n console.warn(\n `[connector:${connector.name}] No tools defined — server will start with zero tools`,\n );\n }\n\n for (const [name, def] of toolEntries) {\n mcpServer.registerTool(\n name,\n {\n description: def.description,\n inputSchema: def.input,\n ...(def.annotations ? { annotations: def.annotations } : {}),\n },\n async (args: unknown) => {\n try {\n // args is already validated by the MCP SDK against the Zod schema\n const result = await withTimeout(Promise.resolve(def.handler(args)), timeoutMs);\n const wrapped = wrapToolResult(result);\n return {\n content: wrapped.content.map((c) => ({\n type: \"text\" as const,\n text: String(\"text\" in c ? c.text : \"\"),\n })),\n ...(wrapped.isError === true ? { isError: true as const } : {}),\n };\n } catch (error: unknown) {\n const wrapped = wrapToolError(error);\n return {\n content: wrapped.content.map((c) => ({\n type: \"text\" as const,\n text: String(\"text\" in c ? c.text : \"\"),\n })),\n isError: true as const,\n };\n }\n },\n );\n }\n\n const resources = connector.resources ?? {};\n for (const [name, def] of Object.entries(resources)) {\n mcpServer.registerResource(\n name,\n def.uri,\n {\n description: def.description,\n ...(def.mimeType ? { mimeType: def.mimeType } : {}),\n },\n async (_uri: URL, extra: { signal: AbortSignal }) => {\n try {\n const result = await withTimeout(\n Promise.resolve(def.read({ signal: extra.signal })),\n timeoutMs,\n );\n return { contents: [...result.contents] };\n } catch (error: unknown) {\n if (error instanceof Error) {\n console.error(`[connector:${connector.name}] Resource read error:`, error.message);\n }\n throw error;\n }\n },\n );\n }\n\n const prompts = connector.prompts ?? {};\n for (const [name, def] of Object.entries(prompts)) {\n const argsSchema = buildPromptArgsSchema(def);\n mcpServer.registerPrompt(\n name,\n {\n description: def.description,\n ...(argsSchema ? { argsSchema } : {}),\n },\n async (args: Record<string, string | undefined>, extra: { signal: AbortSignal }) => {\n try {\n const cleanArgs: Record<string, string> = {};\n for (const [k, v] of Object.entries(args)) {\n if (v !== undefined) cleanArgs[k] = v;\n }\n const result = await withTimeout(\n Promise.resolve(def.get(cleanArgs, { signal: extra.signal })),\n timeoutMs,\n );\n return { messages: [...result.messages] };\n } catch (error: unknown) {\n if (error instanceof Error) {\n console.error(`[connector:${connector.name}] Prompt get error:`, error.message);\n }\n throw error;\n }\n },\n );\n }\n\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n });\n\n const host = options?.host ?? \"127.0.0.1\";\n const port = options?.port ?? 0;\n\n const httpServer = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n if (req.url === \"/health\" && req.method === \"GET\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ status: \"ok\" }));\n return;\n }\n\n if (\n req.url === \"/mcp\" &&\n (req.method === \"POST\" || req.method === \"GET\" || req.method === \"DELETE\")\n ) {\n if (req.method === \"POST\") {\n // Check Content-Length before reading body (fast reject for oversized payloads)\n const contentLength = parseInt(req.headers[\"content-length\"] ?? \"0\", 10);\n if (contentLength > MAX_BODY_SIZE) {\n req.resume(); // drain the request body to prevent EPIPE\n res.writeHead(413, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Request body too large\" }));\n return;\n }\n\n try {\n const body = await readBody(req, MAX_BODY_SIZE);\n const parsed: unknown = JSON.parse(body);\n await transport.handleRequest(req, res, parsed);\n } catch (err: unknown) {\n if (!res.headersSent) {\n const isTooLarge = err instanceof Error && err.message === \"Request body too large\";\n res.writeHead(isTooLarge ? 413 : 400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: isTooLarge ? \"Request body too large\" : \"Invalid request body\",\n }),\n );\n }\n }\n return;\n }\n\n // GET (SSE) and DELETE (session end)\n try {\n await transport.handleRequest(req, res);\n } catch {\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Internal server error\" }));\n }\n }\n return;\n }\n\n res.writeHead(404);\n res.end(\"Not found\");\n });\n\n // Connect MCP server to transport AFTER tool registration\n await mcpServer.connect(transport);\n\n await new Promise<void>((resolve) => {\n httpServer.listen(port, host, () => resolve());\n });\n\n const addr = httpServer.address();\n if (!addr || typeof addr === \"string\") {\n throw new Error(\"Failed to get server address\");\n }\n\n return {\n port: (addr as AddressInfo).port,\n close: async () => {\n await mcpServer.close();\n await new Promise<void>((resolve, reject) => {\n httpServer.close((err) => (err ? reject(err) : resolve()));\n });\n },\n };\n};\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nexport class SecurityError extends Error {\n readonly code = \"SECURITY_VIOLATION\";\n\n constructor(message: string) {\n super(message);\n this.name = \"SecurityError\";\n }\n}\n\nexport class ConnectorError extends Error {\n readonly code = \"CONNECTOR_ERROR\";\n\n constructor(message: string) {\n super(message);\n this.name = \"ConnectorError\";\n }\n}\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport { ConnectorError } from \"./errors\";\nimport type { McpContent } from \"./types/connector\";\n\nconst MAX_TOOL_RESULT_SIZE = 10 * 1024 * 1024; // 10MB\n\ninterface ToolResultContent {\n readonly type: string;\n [key: string]: unknown;\n}\n\ninterface ToolResult {\n readonly content: ReadonlyArray<ToolResultContent>;\n readonly isError?: boolean;\n}\n\nconst isMcpContent = (val: unknown): val is McpContent =>\n typeof val === \"object\" &&\n val !== null &&\n \"__mcpPassThrough\" in val &&\n (val as McpContent).__mcpPassThrough === true;\n\n/** Wrap a handler return value into MCP CallToolResult format */\nexport const wrapToolResult = (value: unknown): ToolResult => {\n if (value === null || value === undefined) {\n return { content: [] };\n }\n\n if (typeof value === \"string\") {\n return { content: [{ type: \"text\", text: value }] };\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return { content: [{ type: \"text\", text: String(value) }] };\n }\n\n if (isMcpContent(value)) {\n const result: ToolResult = { content: value.content };\n if (value.isError) {\n return { ...result, isError: true };\n }\n return result;\n }\n\n const json = JSON.stringify(value, null, 2);\n if (json.length > MAX_TOOL_RESULT_SIZE) {\n return {\n content: [{ type: \"text\", text: `[Result truncated: ${json.length} bytes]` }],\n isError: true,\n };\n }\n return { content: [{ type: \"text\", text: json }] };\n};\n\n/** Wrap a thrown error into MCP CallToolResult format with isError: true */\nexport const wrapToolError = (error: unknown): ToolResult => {\n if (error instanceof ConnectorError) {\n return {\n content: [{ type: \"text\", text: error.message }],\n isError: true,\n };\n }\n\n if (error instanceof Error) {\n console.error(\"[connector] Internal handler error:\", error.message, error.stack);\n } else {\n console.error(\"[connector] Internal handler error:\", String(error));\n }\n\n return {\n content: [{ type: \"text\", text: \"Internal handler error\" }],\n isError: true,\n };\n};\n\n/** Create an explicit MCP content pass-through result */\nexport const mcpResult = (content: McpContent[\"content\"], isError?: boolean): McpContent => ({\n __mcpPassThrough: true as const,\n content,\n isError,\n});\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport { readFileSync } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\nimport { Agent, type AgentLike } from \"kraken-ai\";\nimport { buildActionOutputSchema } from \"./agents/define-actions\";\nimport type { PlatformAgent } from \"./agents/types/platform-agent\";\nimport { cyan, dim, green, yellow } from \"./cli/log\";\nimport { buildActionInstructions, dispatchDevAction } from \"./dev-actions\";\nimport { loadConnectorTools } from \"./dev-connectors\";\n\nconst loadDotenv = (): void => {\n try {\n const content = readFileSync(\".env\", \"utf-8\");\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIdx = trimmed.indexOf(\"=\");\n if (eqIdx === -1) continue;\n const key = trimmed.slice(0, eqIdx).trim();\n const value = trimmed.slice(eqIdx + 1).trim();\n if (!process.env[key]) {\n process.env[key] = value;\n }\n }\n } catch {\n // .env not found, that's fine\n }\n};\n\nconst FRONTMATTER_RE = /^---\\n[\\s\\S]*?\\n---\\n([\\s\\S]*)$/;\n\nconst resolveSkillContent = (refs: string[]): string[] =>\n refs.map((ref) => {\n try {\n return readFileSync(`skills/${ref}`, \"utf-8\");\n } catch {\n return ref;\n }\n });\n\nconst buildInstructions = (base: string, skillContent: string[]): string => {\n if (skillContent.length === 0) return base;\n const bodies = skillContent.map((s) => {\n const m = FRONTMATTER_RE.exec(s);\n return m?.[1]?.trim() ?? s;\n });\n return `${base}\\n\\n${bodies.join(\"\\n\\n\")}`;\n};\n\n/** Recursively build a kraken-ai Agent from a PlatformAgent, wiring connectors, skills, and team. */\nconst buildDevAgent = async (pa: PlatformAgent): Promise<Agent> => {\n const {\n name,\n model,\n instructions,\n skills,\n temperature,\n thinkingLevel,\n maxOutputTokens,\n logLevel,\n } = pa.config.agent;\n\n const connectorNames = pa.config.connectors ?? [];\n const { tools: connectorTools, instructions: connectorInstructions } =\n await loadConnectorTools(connectorNames);\n\n const skillContent = resolveSkillContent(skills ?? []);\n let fullInstructions = buildInstructions(instructions, skillContent);\n if (connectorInstructions.length > 0) {\n fullInstructions = `${fullInstructions}\\n\\n${connectorInstructions.join(\"\\n\\n\")}`;\n }\n\n // Wire action output schema and instructions\n let outputSchema: ReturnType<typeof buildActionOutputSchema> | undefined;\n if (pa.actionZodSchemas && Object.keys(pa.actionZodSchemas).length > 0) {\n const actionInstructions = buildActionInstructions(pa.actionZodSchemas);\n if (actionInstructions) {\n fullInstructions = `${fullInstructions}\\n\\n${actionInstructions}`;\n }\n outputSchema = buildActionOutputSchema({\n __type: \"PlatformActions\",\n config: pa.config.actions ?? { variants: {} },\n zodSchemas: pa.actionZodSchemas,\n handlers: pa.actionHandlers ?? {},\n });\n }\n\n // Recursively build team member agents\n let team: AgentLike[] | undefined;\n if (pa.teamAgents && pa.teamAgents.length > 0) {\n team = await Promise.all(pa.teamAgents.map(buildDevAgent));\n }\n\n return new Agent({\n name,\n model,\n instructions: fullInstructions,\n tools: connectorTools.length > 0 ? connectorTools : undefined,\n outputSchema,\n team,\n temperature,\n thinkingLevel,\n maxOutputTokens,\n logLevel,\n });\n};\n\nexport const runDev = async (agent: PlatformAgent): Promise<never> => {\n loadDotenv();\n\n const hasActions = agent.actionZodSchemas && Object.keys(agent.actionZodSchemas).length > 0;\n const sdkAgent = await buildDevAgent(agent);\n\n const { name, model } = agent.config.agent;\n const connectorNames = agent.config.connectors ?? [];\n\n try {\n await sdkAgent.preflight();\n } catch (err) {\n console.error(`\\n ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n\n console.log(`\\n Agent: ${name}`);\n console.log(` Model: ${model}`);\n if (connectorNames.length > 0) {\n console.log(` Connectors: ${connectorNames.join(\", \")}`);\n }\n if (agent.teamAgents && agent.teamAgents.length > 0) {\n console.log(` Team: ${agent.teamAgents.map((a) => a.config.agent.name).join(\", \")}`);\n }\n if (hasActions && agent.actionZodSchemas) {\n console.log(` Actions: ${Object.keys(agent.actionZodSchemas).join(\", \")}`);\n }\n console.log(`\\n Type a message to start. Ctrl+C to exit.\\n`);\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const messages: Array<{ role: \"user\" | \"assistant\"; content: string }> = [];\n\n const cleanup = (): void => {\n rl.close();\n process.exit(0);\n };\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n const ask = (): void => {\n rl.question(\"You: \", (input) => {\n if (!input.trim()) {\n ask();\n return;\n }\n\n messages.push({ role: \"user\", content: input });\n\n void (async () => {\n try {\n const result = await sdkAgent.run(messages, {\n onEvent: (event) => {\n if (event.type === \"thought\") {\n console.log(\n ` [thinking] ${event.text.slice(0, 120)}${event.text.length > 120 ? \"…\" : \"\"}`,\n );\n }\n if (event.type === \"tool_call\" && event.status === \"success\") {\n console.log(` [tool] ${event.toolName}`);\n }\n },\n });\n\n if (result.status === \"complete\") {\n const output =\n typeof result.output === \"string\"\n ? result.output\n : JSON.stringify(result.output, null, 2);\n\n // Dispatch action if structured output has an action field\n if (\n hasActions &&\n agent.actionZodSchemas &&\n result.output != null &&\n typeof result.output === \"object\" &&\n \"action\" in (result.output as Record<string, unknown>)\n ) {\n const webhooks: Record<string, string | undefined> = {};\n if (agent.config.actions?.variants) {\n for (const [k, v] of Object.entries(agent.config.actions.variants)) {\n webhooks[k] = v.webhook;\n }\n }\n try {\n const dispatched = await dispatchDevAction(\n result.output,\n agent.actionZodSchemas,\n agent.actionHandlers,\n webhooks,\n );\n console.log(`\\n ${cyan(\"Action:\")} ${green(dispatched.actionName)}`);\n console.log(` ${dim(\"Payload:\")} ${JSON.stringify(dispatched.payload, null, 2)}`);\n if (dispatched.handlerCalled) {\n console.log(` ${dim(\"Handler:\")} ${green(\"called\")}`);\n }\n if (dispatched.webhookUrl) {\n console.log(\n ` ${dim(\"Webhook:\")} ${yellow(dispatched.webhookUrl)} ${dim(\"(skipped in dev)\")}`,\n );\n }\n console.log();\n } catch (err) {\n console.error(\n `\\n Action dispatch error: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n }\n } else {\n console.log(`\\nAgent: ${output}\\n`);\n }\n\n messages.push({ role: \"assistant\", content: output });\n } else if (result.status === \"interrupted\") {\n console.log(`\\n[Interrupted: ${result.interrupt.toolName} requires approval]\\n`);\n }\n } catch (err) {\n console.error(`\\nError: ${err instanceof Error ? err.message : String(err)}\\n`);\n }\n\n ask();\n })();\n });\n };\n\n ask();\n\n return new Promise(() => {});\n};\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport * as z from \"zod\";\nimport {\n type ActionVariantConfig,\n type ActionVariantInput,\n isValidActionName,\n type PlatformActions,\n} from \"./types/action\";\n\n/**\n * Define an action variant.\n *\n * Infers handler payload types from the schema.\n *\n * @example\n * ```ts\n * defineAction({\n * schema: z.object({ reason: z.string() }),\n * handler: async (payload) => {\n * payload.reason; // string — fully typed\n * },\n * });\n * ```\n */\nexport const defineAction = <S extends z.ZodObject<z.ZodRawShape>>(\n input: ActionVariantInput<S>,\n): ActionVariantInput<S> => input;\n\n/**\n * Define action variants for a platform agent. Actions are typed terminal\n * outputs — the agent's final decision as structured output.\n *\n * Each variant has a name and an object schema. Schemas are serialized\n * to JSON Schema for discovery/storage, and the originals are preserved\n * in-memory for runtime validation.\n *\n * Handler payload types are inferred from the schema automatically:\n *\n * @example\n * ```ts\n * const actions = defineActions({\n * approve: {\n * schema: z.object({ reason: z.string() }),\n * handler: async (payload) => {\n * payload.reason; // string — fully typed\n * },\n * },\n * reject: { schema: z.object({ reason: z.string(), severity: z.number() }) },\n * });\n * ```\n */\nexport const defineActions = <V extends Record<string, ActionVariantInput>>(\n variants: V,\n): PlatformActions => {\n const entries = Object.entries(variants);\n\n if (entries.length === 0) {\n throw new Error(\"defineActions() requires at least one action variant\");\n }\n\n if (entries.length > 20) {\n throw new Error(\"defineActions() supports a maximum of 20 action variants\");\n }\n\n const serialized: Record<string, ActionVariantConfig> = {};\n const zodSchemas: Record<string, z.ZodObject<z.ZodRawShape>> = {};\n const handlers: Record<string, (payload: unknown) => Promise<void>> = {};\n\n for (const [name, variant] of entries) {\n if (!isValidActionName(name)) {\n throw new Error(\n `Invalid action name \"${name}\": must be lowercase alphanumeric with hyphens, 1-64 chars`,\n );\n }\n const v = variant as ActionVariantInput;\n serialized[name] = {\n schema: z.toJSONSchema(v.schema, { target: \"draft-2020-12\" }) as Record<string, unknown>,\n webhook: v.webhook,\n hasHandler: !!v.handler,\n };\n zodSchemas[name] = v.schema;\n if (v.handler) {\n // Safe: runtime validates payload against Zod schema before calling handler\n handlers[name] = v.handler as (payload: unknown) => Promise<void>;\n }\n }\n\n return Object.freeze({\n __type: \"PlatformActions\" as const,\n config: Object.freeze({ variants: Object.freeze(serialized) }),\n zodSchemas: Object.freeze(zodSchemas),\n handlers: Object.freeze(handlers),\n });\n};\n\n/**\n * Build a discriminated-union schema from action definitions.\n * Each variant becomes `z.object({ action: z.literal(name), ...variantSchema })`.\n * Used as the agent's outputSchema to constrain LLM structured output.\n */\nexport const buildActionOutputSchema = (actions: PlatformActions) => {\n const entries = Object.entries(actions.zodSchemas);\n\n if (entries.length === 0) {\n throw new Error(\"Cannot build output schema from empty action definitions\");\n }\n\n const variants = entries.map(([name, schema]) =>\n z.object({ action: z.literal(name) }).extend(schema.shape),\n );\n\n const [first, ...rest] = variants;\n if (!first) {\n throw new Error(\"Cannot build output schema from empty action definitions\");\n }\n return z.discriminatedUnion(\"action\", [first, ...rest]);\n};\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport * as z from \"zod\";\n\n/** Action names follow entity naming convention: lowercase alphanumeric with hyphens, 1-64 chars. */\nexport const ACTION_NAME_REGEX = /^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$/;\n\n/** Validates an action name (allows single-char names like \"a\"). */\nexport const isValidActionName = (name: string): boolean =>\n name.length === 1 ? /^[a-z0-9]$/.test(name) : ACTION_NAME_REGEX.test(name);\n\n/** Input for a single action variant in defineActions(). */\nexport interface ActionVariantInput<\n S extends z.ZodObject<z.ZodRawShape> = z.ZodObject<z.ZodRawShape>,\n> {\n schema: S;\n webhook?: string;\n // Method syntax → bivariant parameter checking, so specific handler args\n // (e.g. { reason: string }) are assignable to the default (z.infer<ZodObject>).\n handler?(payload: z.infer<S>): Promise<void>;\n}\n\n/** Serializable config for a single action variant (stored in manifest/DB). */\nexport interface ActionVariantConfig {\n schema: Record<string, unknown>;\n webhook?: string;\n hasHandler: boolean;\n}\n\n/** Serializable portion of action definitions (stored in agent config). */\nexport interface PlatformActionsConfig {\n variants: Record<string, ActionVariantConfig>;\n}\n\n/** Full action definitions including in-memory schemas and handlers for runtime use. */\nexport interface PlatformActions {\n readonly __type: \"PlatformActions\";\n readonly config: PlatformActionsConfig;\n readonly zodSchemas: Record<string, z.ZodObject<z.ZodRawShape>>;\n readonly handlers: Readonly<Record<string, (payload: unknown) => Promise<void>>>;\n}\n\nexport const actionVariantConfigSchema = z.object({\n schema: z.record(z.string(), z.unknown()),\n webhook: z.string().url().optional(),\n hasHandler: z.boolean(),\n});\n\nexport const actionsConfigSchema = z\n .object({\n variants: z.record(z.string(), actionVariantConfigSchema),\n })\n .strict();\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nconst supportsColor =\n !(\"NO_COLOR\" in process.env) &&\n process.env.FORCE_COLOR !== \"0\" &&\n (process.stderr.isTTY ?? false);\n\nconst code = (open: number, close: number) => {\n const openStr = `\\x1b[${open}m`;\n const closeStr = `\\x1b[${close}m`;\n return (s: string): string => (supportsColor ? `${openStr}${s}${closeStr}` : s);\n};\n\nexport const bold = code(1, 22);\nexport const dim = code(2, 22);\nexport const red = code(31, 39);\nexport const yellow = code(33, 39);\nexport const green = code(32, 39);\nexport const cyan = code(36, 39);\n\nexport const info = (msg: string): void => {\n process.stderr.write(` ${dim(\"[kraken-ai:\")} ${cyan(\"info\")}${dim(\"]\")} ${msg}\\n`);\n};\n\nexport const warn = (msg: string): void => {\n process.stderr.write(` ${dim(\"[kraken-ai:\")} ${yellow(\"warn\")}${dim(\"]\")} ${msg}\\n`);\n};\n\nexport const error = (msg: string): void => {\n process.stderr.write(` ${dim(\"[kraken-ai:\")} ${red(\"error\")}${dim(\"]\")} ${msg}\\n`);\n};\n\nexport const success = (msg: string): void => {\n process.stderr.write(` ${dim(\"[kraken-ai:\")} ${green(\"ok\")}${dim(\"]\")} ${msg}\\n`);\n};\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport type * as z from \"zod\";\n\n/**\n * Build instructions that describe available action variants to the LLM.\n * Appended to the agent's system prompt when actions are configured.\n */\nexport const buildActionInstructions = (\n zodSchemas: Record<string, z.ZodObject<z.ZodRawShape>>,\n): string => {\n const entries = Object.entries(zodSchemas);\n if (entries.length === 0) return \"\";\n\n const variants = entries.map(([name, schema]) => {\n const fields = Object.keys(schema.shape).join(\", \");\n return ` - \"${name}\": { ${fields} }`;\n });\n\n return [\n 'You MUST respond with a JSON object containing an \"action\" field set to one of the following action names, plus the fields for that action:',\n \"\",\n ...variants,\n \"\",\n 'Example: { \"action\": \"<name>\", ...fields }',\n ].join(\"\\n\");\n};\n\nexport interface ActionDispatchResult {\n actionName: string;\n payload: Record<string, unknown>;\n handlerCalled: boolean;\n webhookUrl?: string;\n}\n\n/**\n * Validate and dispatch a structured action output from the LLM.\n * In dev mode, handlers are called directly; webhooks are logged but not called.\n */\nexport const dispatchDevAction = async (\n output: unknown,\n zodSchemas: Record<string, z.ZodObject<z.ZodRawShape>>,\n handlers: Readonly<Record<string, (payload: unknown) => Promise<void>>> | undefined,\n webhooks: Record<string, string | undefined>,\n): Promise<ActionDispatchResult> => {\n if (output == null || typeof output !== \"object\" || !(\"action\" in output)) {\n throw new Error('Action output must contain an \"action\" field');\n }\n\n const { action: actionName, ...rest } = output as Record<string, unknown>;\n if (typeof actionName !== \"string\") {\n throw new Error('Action output \"action\" field must be a string');\n }\n\n const schema = zodSchemas[actionName];\n if (!schema) {\n throw new Error(\n `Unknown action \"${actionName}\". Expected one of: ${Object.keys(zodSchemas).join(\", \")}`,\n );\n }\n\n const parsed = schema.parse(rest);\n const payload = parsed as Record<string, unknown>;\n\n let handlerCalled = false;\n const handler = handlers?.[actionName];\n if (handler) {\n await handler(payload);\n handlerCalled = true;\n }\n\n return {\n actionName,\n payload,\n handlerCalled,\n webhookUrl: webhooks[actionName],\n };\n};\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport { resolve } from \"node:path\";\nimport { type Tool, tool } from \"kraken-ai\";\nimport { wrapToolError, wrapToolResult } from \"./agents/connector-wrap\";\nimport type {\n ConnectorHandlerContext,\n GetPromptResult,\n PlatformConnector,\n ReadResourceResult,\n} from \"./agents/types/connector\";\nimport { ENTITY_NAME_REGEX, isValidEntityName } from \"./cli/validate\";\n\nconst isPlatformConnector = (v: unknown): v is PlatformConnector =>\n v != null &&\n typeof v === \"object\" &&\n (v as Record<string, unknown>).__type === \"PlatformConnector\";\n\nexport interface LoadedResource {\n readonly name: string;\n readonly uri: string;\n readonly description: string;\n readonly mimeType?: string;\n read(ctx: ConnectorHandlerContext): Promise<ReadResourceResult> | ReadResourceResult;\n}\n\nexport interface LoadedPrompt {\n readonly name: string;\n readonly description: string;\n readonly arguments?: ReadonlyArray<{\n readonly name: string;\n readonly description?: string;\n readonly required?: boolean;\n }>;\n get(\n args: Record<string, string>,\n ctx: ConnectorHandlerContext,\n ): Promise<GetPromptResult> | GetPromptResult;\n}\n\nexport interface LoadedConnectors {\n readonly tools: Tool[];\n readonly resources: LoadedResource[];\n readonly prompts: LoadedPrompt[];\n readonly instructions: string[];\n}\n\n/**\n * Import a single connector module by name.\n * Tries `connectors/<name>/index.ts` first (tsx), then `connectors/<name>/index.js`.\n */\nconst importConnector = async (\n name: string,\n projectRoot: string,\n): Promise<PlatformConnector | null> => {\n const basePath = resolve(projectRoot, \"connectors\", name, \"index\");\n\n for (const ext of [\".ts\", \".js\"]) {\n try {\n const mod: Record<string, unknown> = await import(`${basePath}${ext}`);\n const connector = mod.default;\n\n if (!isPlatformConnector(connector)) {\n console.warn(`[connector:${name}] Default export is not a PlatformConnector — skipping`);\n return null;\n }\n\n return connector;\n } catch (err: unknown) {\n // If .ts fails, try .js next\n if (ext === \".ts\") continue;\n\n // Both extensions failed\n const message = err instanceof Error ? err.message : String(err);\n console.warn(`[connector:${name}] Failed to import — skipping. Error: ${message}`);\n return null;\n }\n }\n\n return null;\n};\n\n/**\n * Create SDK Tool wrappers from a PlatformConnector's tool definitions.\n * Each tool validates input, calls the handler, and wraps the result.\n */\nconst createToolsFromConnector = (connector: PlatformConnector): Tool[] => {\n const tools = connector.tools ?? {};\n return Object.entries(tools).map(([name, def]) =>\n tool({\n name,\n description: def.description,\n parameters: def.input,\n execute: async (args) => {\n try {\n const result = await Promise.resolve(def.handler(args));\n return wrapToolResult(result);\n } catch (error: unknown) {\n return wrapToolError(error);\n }\n },\n }),\n );\n};\n\n/**\n * Build SDK tools from already-loaded PlatformConnector objects.\n *\n * - Detects tool name collisions across connectors\n * - Creates SDK Tool wrappers for direct function calls (no HTTP)\n * - Collects connector instructions\n * - Logs connector name and tool count\n */\nexport const buildConnectorTools = (\n connectors: ReadonlyArray<{ readonly name: string; readonly connector: PlatformConnector }>,\n): LoadedConnectors => {\n // Check for tool name collisions across all connectors\n const toolOwners = new Map<string, string>();\n for (const { name, connector } of connectors) {\n for (const toolName of Object.keys(connector.tools ?? {})) {\n const existing = toolOwners.get(toolName);\n if (existing) {\n throw new Error(\n `Tool name collision: \"${toolName}\" is defined by both connectors \"${existing}\" and \"${name}\". ` +\n `Rename one of the tools or use a unique prefix.`,\n );\n }\n toolOwners.set(toolName, name);\n }\n }\n\n // Check for resource name collisions\n const resourceOwners = new Map<string, string>();\n for (const { name, connector } of connectors) {\n for (const resourceName of Object.keys(connector.resources ?? {})) {\n const existing = resourceOwners.get(resourceName);\n if (existing) {\n throw new Error(\n `Resource name collision: \"${resourceName}\" is defined by both connectors \"${existing}\" and \"${name}\". ` +\n `Rename one of the resources or use a unique prefix.`,\n );\n }\n resourceOwners.set(resourceName, name);\n }\n }\n\n // Check for prompt name collisions\n const promptOwners = new Map<string, string>();\n for (const { name, connector } of connectors) {\n for (const promptName of Object.keys(connector.prompts ?? {})) {\n const existing = promptOwners.get(promptName);\n if (existing) {\n throw new Error(\n `Prompt name collision: \"${promptName}\" is defined by both connectors \"${existing}\" and \"${name}\". ` +\n `Rename one of the prompts or use a unique prefix.`,\n );\n }\n promptOwners.set(promptName, name);\n }\n }\n\n const allTools: Tool[] = [];\n const allResources: LoadedResource[] = [];\n const allPrompts: LoadedPrompt[] = [];\n const allInstructions: string[] = [];\n\n for (const { name, connector } of connectors) {\n const tools = createToolsFromConnector(connector);\n allTools.push(...tools);\n\n for (const [resName, resDef] of Object.entries(connector.resources ?? {})) {\n allResources.push({\n name: resName,\n uri: resDef.uri,\n description: resDef.description,\n mimeType: resDef.mimeType,\n read: (ctx) => resDef.read(ctx),\n });\n }\n\n for (const [promptName, promptDef] of Object.entries(connector.prompts ?? {})) {\n allPrompts.push({\n name: promptName,\n description: promptDef.description,\n arguments: promptDef.arguments,\n get: (args, ctx) => promptDef.get(args, ctx),\n });\n }\n\n const toolCount = Object.keys(connector.tools ?? {}).length;\n const resourceCount = Object.keys(connector.resources ?? {}).length;\n const promptCount = Object.keys(connector.prompts ?? {}).length;\n\n const parts = [\n `${toolCount} tool${toolCount !== 1 ? \"s\" : \"\"}`,\n `${resourceCount} resource${resourceCount !== 1 ? \"s\" : \"\"}`,\n `${promptCount} prompt${promptCount !== 1 ? \"s\" : \"\"}`,\n ];\n console.log(` Connector: ${name} (${parts.join(\", \")})`);\n\n if (connector.instructions) {\n allInstructions.push(connector.instructions);\n }\n }\n\n return {\n tools: allTools,\n resources: allResources,\n prompts: allPrompts,\n instructions: allInstructions,\n };\n};\n\n/**\n * Load connector tools from an agent's connector name list.\n *\n * - Validates connector names against ENTITY_NAME_REGEX\n * - Dynamically imports each connector module\n * - Delegates to buildConnectorTools for collision detection, wrapping, and instructions\n */\nexport const loadConnectorTools = async (\n connectorNames: string[],\n projectRoot?: string,\n): Promise<LoadedConnectors> => {\n if (connectorNames.length === 0) {\n return { tools: [], resources: [], prompts: [], instructions: [] };\n }\n\n const root = projectRoot ?? process.cwd();\n const connectors: Array<{ name: string; connector: PlatformConnector }> = [];\n\n for (const name of connectorNames) {\n if (!isValidEntityName(name)) {\n console.warn(\n `[connector] Invalid connector name \"${name}\" — must match ${ENTITY_NAME_REGEX}. Skipping.`,\n );\n continue;\n }\n\n const connector = await importConnector(name, root);\n if (connector) {\n connectors.push({ name, connector });\n }\n }\n\n return buildConnectorTools(connectors);\n};\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport type { SchemaBundle } from \"./codegen\";\n\n// ─── Entity Name Validation ───\n\nexport const ENTITY_NAME_REGEX = /^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$/;\n\n/** Single-char names (e.g. \"a\") are valid — the regex requires min 2 chars, so we also allow /^[a-z0-9]$/ */\nexport const isValidEntityName = (name: string): boolean =>\n name.length === 1 ? /^[a-z0-9]$/.test(name) : ENTITY_NAME_REGEX.test(name);\n\n// ─── Skill Name Validation ───\n\n/** Skill filenames allow uppercase: e.g. someFile-name.md, Research.md */\nexport const SKILL_NAME_REGEX = /^[a-zA-Z0-9][a-zA-Z0-9-]{0,62}[a-zA-Z0-9]$/;\n\nexport const isValidSkillName = (basename: string): boolean =>\n basename.length === 1 ? /^[a-zA-Z0-9]$/.test(basename) : SKILL_NAME_REGEX.test(basename);\n\n/** Skill IDs from remote may include .md extension */\nexport const isValidSkillId = (id: string): boolean => {\n const base = id.endsWith(\".md\") ? id.slice(0, -3) : id;\n return isValidSkillName(base);\n};\n\n// ─── Tool Name Validation ───\n\n/** Tool names allow underscores (e.g., fs_read, fs_write) */\nexport const TOOL_NAME_REGEX = /^[a-z][a-z0-9_-]{0,62}[a-z0-9]$/;\n\nexport const isValidToolName = (name: string): boolean =>\n name.length === 1 ? /^[a-z]$/.test(name) : TOOL_NAME_REGEX.test(name);\n\n// ─── Property Name Validation ───\n\n/** JS/TS property names with 255-char length cap to prevent DoS */\nexport const PROPERTY_NAME_REGEX = /^[a-zA-Z_$][a-zA-Z0-9_$]{0,254}$/;\n\nconst FORBIDDEN_PROPS = new Set([\n \"__proto__\",\n \"constructor\",\n \"prototype\",\n \"__defineGetter__\",\n \"__defineSetter__\",\n \"__lookupGetter__\",\n \"__lookupSetter__\",\n]);\n\nexport const isValidPropertyName = (name: string): boolean =>\n PROPERTY_NAME_REGEX.test(name) && !FORBIDDEN_PROPS.has(name);\n\n// ─── Schema Bundle Validation ───\n\nconst MAX_SCHEMA_DEPTH = 20;\nconst MAX_OBJECT_BREADTH = 200;\n\n/**\n * Validates all identifiers in a SchemaBundle before codegen.\n * Throws on the first invalid identifier — fail-fast.\n *\n * Checks:\n * - Entity names (agent IDs, connector IDs, pipeline names, query names)\n * - Skill IDs (allows .md extension)\n * - Tool names (allows underscores)\n * - Property names in JSON Schema (recursive, with depth/breadth limits)\n * - Column names in query schemas\n * - Rejects `$ref` keys in pipeline schemas\n * - Strips `pattern` keys from pipeline schemas (ReDoS prevention)\n */\nexport const validateSchemaBundle = (bundle: SchemaBundle): void => {\n for (const agent of bundle.agents) {\n assertValidEntity(\"agent id\", agent.id);\n validateJsonSchemaProperties(\"agent input schema\", agent.input, 0);\n validateJsonSchemaProperties(\"agent output schema\", agent.output, 0);\n if (agent.actions) {\n for (const [actionName, actionSchema] of Object.entries(agent.actions)) {\n assertValidEntity(\"agent action name\", actionName);\n validateJsonSchemaProperties(\"agent action schema\", actionSchema, 0);\n }\n }\n }\n\n for (const query of bundle.queries) {\n assertValidEntity(\"query name\", query.name);\n validateJsonSchemaProperties(\"query params schema\", query.params, 0);\n for (const col of query.columns) {\n assertValidProperty(\"query column name\", col.name);\n }\n }\n\n for (const connector of bundle.connectors) {\n assertValidEntity(\"connector id\", connector.id);\n for (const tool of connector.tools) {\n assertValidTool(\"connector tool name\", tool.name);\n validateJsonSchemaProperties(\"connector tool parameters\", tool.parameters, 0);\n }\n }\n\n for (const pipeline of bundle.pipelines) {\n assertValidEntity(\"pipeline name\", pipeline.pipeline);\n for (const query of pipeline.queries) {\n assertValidEntity(\"pipeline query name\", query.name);\n validatePipelineSchema(\"pipeline query params\", query.params, 0);\n validatePipelineSchema(\"pipeline query returns\", query.returns, 0);\n }\n }\n\n for (const skill of bundle.skills) {\n assertValidSkill(\"skill id\", skill.id);\n }\n};\n\n// ─── Internal Assertion Helpers ───\n\nconst assertValidEntity = (entityType: string, value: string): void => {\n if (!isValidEntityName(value)) {\n throw new Error(\n `Invalid remote schema: ${entityType} \"${value}\". Must match ${ENTITY_NAME_REGEX}`,\n );\n }\n};\n\nconst assertValidTool = (entityType: string, value: string): void => {\n if (!isValidToolName(value)) {\n throw new Error(\n `Invalid remote schema: ${entityType} \"${value}\". Must match ${TOOL_NAME_REGEX}`,\n );\n }\n};\n\nconst assertValidProperty = (entityType: string, value: string): void => {\n if (!isValidPropertyName(value)) {\n throw new Error(\n `Invalid remote schema: ${entityType} \"${value}\". Must match ${PROPERTY_NAME_REGEX} and not be a forbidden property`,\n );\n }\n};\n\nconst assertValidSkill = (entityType: string, value: string): void => {\n if (!isValidSkillId(value)) {\n throw new Error(\n `Invalid remote schema: ${entityType} \"${value}\". Must match ${SKILL_NAME_REGEX} (with optional .md extension)`,\n );\n }\n};\n\n/**\n * Validates property names in a JSON Schema node recursively.\n * Used for agent/query/connector schemas where we only need property name validation.\n */\nconst validateJsonSchemaProperties = (\n context: string,\n schema: Record<string, unknown>,\n depth: number,\n): void => {\n if (!schema || typeof schema !== \"object\") return;\n if (depth > MAX_SCHEMA_DEPTH) {\n throw new Error(\n `Invalid remote schema: ${context} exceeds maximum nesting depth of ${MAX_SCHEMA_DEPTH}`,\n );\n }\n\n const props = schema.properties as Record<string, Record<string, unknown>> | undefined;\n if (props) {\n const keys = Object.keys(props);\n if (keys.length > MAX_OBJECT_BREADTH) {\n throw new Error(\n `Invalid remote schema: ${context} has ${keys.length} properties, exceeding limit of ${MAX_OBJECT_BREADTH}`,\n );\n }\n for (const key of keys) {\n assertValidProperty(`${context} property name`, key);\n validateJsonSchemaProperties(context, props[key] ?? {}, depth + 1);\n }\n }\n\n const items = schema.items as Record<string, unknown> | undefined;\n if (items) {\n validateJsonSchemaProperties(context, items, depth + 1);\n }\n\n for (const keyword of [\"anyOf\", \"oneOf\", \"allOf\"] as const) {\n const variants = schema[keyword] as Record<string, unknown>[] | undefined;\n if (variants) {\n for (const variant of variants) {\n validateJsonSchemaProperties(context, variant, depth + 1);\n }\n }\n }\n};\n\n/**\n * Validates pipeline JSON Schema nodes with stricter checks:\n * - All property name validation from validateJsonSchemaProperties\n * - Rejects `$ref` keys (prevents circular reference bypass in z.fromJSONSchema())\n * - Strips `pattern` keys (prevents ReDoS in z.fromJSONSchema() line 328)\n */\nconst validatePipelineSchema = (\n context: string,\n schema: Record<string, unknown>,\n depth: number,\n): void => {\n if (!schema || typeof schema !== \"object\") return;\n if (depth > MAX_SCHEMA_DEPTH) {\n throw new Error(\n `Invalid remote schema: ${context} exceeds maximum nesting depth of ${MAX_SCHEMA_DEPTH}`,\n );\n }\n\n if (\"$ref\" in schema) {\n throw new Error(\n `Invalid remote schema: ${context} contains \"$ref\" which is not supported in pipeline schemas`,\n );\n }\n\n // Strip `pattern` keys to prevent ReDoS in z.fromJSONSchema()\n if (\"pattern\" in schema) {\n delete schema.pattern;\n }\n\n const props = schema.properties as Record<string, Record<string, unknown>> | undefined;\n if (props) {\n const keys = Object.keys(props);\n if (keys.length > MAX_OBJECT_BREADTH) {\n throw new Error(\n `Invalid remote schema: ${context} has ${keys.length} properties, exceeding limit of ${MAX_OBJECT_BREADTH}`,\n );\n }\n for (const key of keys) {\n assertValidProperty(`${context} property name`, key);\n validatePipelineSchema(context, props[key] ?? {}, depth + 1);\n }\n }\n\n const items = schema.items as Record<string, unknown> | undefined;\n if (items) {\n validatePipelineSchema(context, items, depth + 1);\n }\n\n for (const keyword of [\"anyOf\", \"oneOf\", \"allOf\"] as const) {\n const variants = schema[keyword] as Record<string, unknown>[] | undefined;\n if (variants) {\n for (const variant of variants) {\n validatePipelineSchema(context, variant, depth + 1);\n }\n }\n }\n};\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport type { ToolDefinition } from \"kraken-ai\";\nimport type { ConnectorSchema } from \"./platform/types\";\n\ntype ToolOverride = (args: Record<string, unknown>) => Promise<unknown> | unknown;\n\nexport class MockToolSet {\n private readonly defs: ToolDefinition[];\n private readonly overrides: Record<string, ToolOverride>;\n private readonly toolNames: Set<string>;\n\n constructor(tools: ToolDefinition[], overrides: Record<string, ToolOverride> = {}) {\n this.defs = tools;\n this.overrides = overrides;\n this.toolNames = new Set(tools.map((t) => t.name));\n }\n\n static fromConnectors(\n connectors: ConnectorSchema[],\n opts?: { include?: string[]; overrides?: Record<string, ToolOverride> },\n ): MockToolSet {\n const include = opts?.include;\n const filtered = include ? connectors.filter((c) => include.includes(c.id)) : connectors;\n\n const tools: ToolDefinition[] = filtered.flatMap((c) =>\n c.tools.map((t) => ({\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n })),\n );\n\n return new MockToolSet(tools, opts?.overrides);\n }\n\n definitions(): ToolDefinition[] {\n return this.defs;\n }\n\n async call(name: string, params: Record<string, unknown>): Promise<unknown> {\n if (!this.toolNames.has(name)) {\n throw new Error(`Unknown tool: ${name}`);\n }\n\n const override = this.overrides[name];\n if (override) {\n return override(params);\n }\n\n return {};\n }\n}\n"],"mappings":"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","names":["resolve","import_kraken_ai","z","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/server.ts","../src/agents/connector-server.ts","../../../../private-packages/platform-core/src/errors.ts","../../../../private-packages/platform-core/src/qualified-name.ts","../../../../private-packages/platform-core/src/types/environment.ts","../../../../private-packages/platform-core/src/types/identity.ts","../../../../private-packages/platform-core/src/types/notifications.ts","../../../../private-packages/platform-core/src/types/platform-agent.ts","../../../../private-packages/platform-core/src/validate.ts","../../../../private-packages/platform-core/src/types/resources.ts","../../../../private-packages/platform-core/src/types/team.ts","../../../../private-packages/platform-core/src/types/trigger.ts","../../../../private-packages/platform-core/src/types/skill.ts","../src/agents/connector-wrap.ts","../src/dev.ts","../src/agents/define-actions.ts","../src/cli/log.ts","../src/dev-actions.ts","../src/dev-connectors.ts","../src/mock-tool-set.ts"],"sourcesContent":["// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nexport {\n type ConnectorServerHandle,\n type ConnectorServerOptions,\n startConnectorServer,\n} from \"./agents/connector-server\";\nexport { runDev } from \"./dev\";\nexport { MockToolSet } from \"./mock-tool-set\";\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport { randomUUID } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\nimport type { ConnectorPromptDef, PlatformConnector } from \"@kraken-ai/platform-core\";\nimport * as z from \"zod\";\nimport { wrapToolError, wrapToolResult } from \"./connector-wrap\";\n\nconst DEFAULT_HANDLER_TIMEOUT_MS = 30_000;\nconst MAX_BODY_SIZE = 10 * 1024 * 1024; // 10MB\n\nexport interface ConnectorServerOptions {\n readonly port?: number;\n readonly host?: string;\n readonly handlerTimeoutMs?: number;\n}\n\nexport interface ConnectorServerHandle {\n readonly port: number;\n readonly close: () => Promise<void>;\n}\n\nconst withTimeout = <T>(promise: Promise<T>, ms: number): Promise<T> =>\n Promise.race([\n promise,\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(`Handler timed out after ${ms}ms`)), ms),\n ),\n ]);\n\nconst readBody = (req: IncomingMessage, maxSize: number): Promise<string> =>\n new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n let size = 0;\n req.on(\"data\", (chunk: Buffer) => {\n size += chunk.length;\n if (size > maxSize) {\n req.destroy();\n reject(new Error(\"Request body too large\"));\n return;\n }\n chunks.push(chunk);\n });\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString()));\n req.on(\"error\", reject);\n });\n\n/** Convert ConnectorPromptDef.arguments array to a raw shape for MCP SDK */\nconst buildPromptArgsSchema = (\n def: ConnectorPromptDef,\n): Record<string, z.ZodString | z.ZodOptional<z.ZodString>> | undefined => {\n if (!def.arguments?.length) return undefined;\n const shape: Record<string, z.ZodString | z.ZodOptional<z.ZodString>> = {};\n for (const arg of def.arguments) {\n shape[arg.name] = arg.required ? z.string() : z.string().optional();\n }\n return shape;\n};\n\nexport const startConnectorServer = async (\n connector: PlatformConnector,\n options?: ConnectorServerOptions,\n): Promise<ConnectorServerHandle> => {\n const mcpServerModule = await import(\"@modelcontextprotocol/sdk/server/mcp.js\").catch(() => {\n throw new Error(\n \"@modelcontextprotocol/sdk is required for startConnectorServer. \" +\n \"Install it: pnpm add @modelcontextprotocol/sdk\",\n );\n });\n const transportModule = await import(\"@modelcontextprotocol/sdk/server/streamableHttp.js\").catch(\n () => {\n throw new Error(\n \"@modelcontextprotocol/sdk is required for startConnectorServer. \" +\n \"Install it: pnpm add @modelcontextprotocol/sdk\",\n );\n },\n );\n\n const { McpServer } = mcpServerModule;\n const { StreamableHTTPServerTransport } = transportModule;\n\n const timeoutMs = options?.handlerTimeoutMs ?? DEFAULT_HANDLER_TIMEOUT_MS;\n\n const mcpServer = new McpServer(\n { name: connector.name, version: \"0.0.0\" },\n { capabilities: { tools: {}, resources: {}, prompts: {} } },\n );\n\n const tools = connector.tools ?? {};\n const toolEntries = Object.entries(tools);\n\n if (toolEntries.length === 0) {\n console.warn(\n `[connector:${connector.name}] No tools defined — server will start with zero tools`,\n );\n }\n\n for (const [name, def] of toolEntries) {\n mcpServer.registerTool(\n name,\n {\n description: def.description,\n inputSchema: def.input,\n ...(def.annotations ? { annotations: def.annotations } : {}),\n },\n async (args: unknown) => {\n try {\n // args is already validated by the MCP SDK against the Zod schema\n const result = await withTimeout(Promise.resolve(def.handler(args)), timeoutMs);\n const wrapped = wrapToolResult(result);\n return {\n content: wrapped.content.map((c) => ({\n type: \"text\" as const,\n text: String(\"text\" in c ? c.text : \"\"),\n })),\n ...(wrapped.isError === true ? { isError: true as const } : {}),\n };\n } catch (error: unknown) {\n const wrapped = wrapToolError(error);\n return {\n content: wrapped.content.map((c) => ({\n type: \"text\" as const,\n text: String(\"text\" in c ? c.text : \"\"),\n })),\n isError: true as const,\n };\n }\n },\n );\n }\n\n const resources = connector.resources ?? {};\n for (const [name, def] of Object.entries(resources)) {\n mcpServer.registerResource(\n name,\n def.uri,\n {\n description: def.description,\n ...(def.mimeType ? { mimeType: def.mimeType } : {}),\n },\n async (_uri: URL, extra: { signal: AbortSignal }) => {\n try {\n const result = await withTimeout(\n Promise.resolve(def.read({ signal: extra.signal })),\n timeoutMs,\n );\n return { contents: [...result.contents] };\n } catch (error: unknown) {\n if (error instanceof Error) {\n console.error(`[connector:${connector.name}] Resource read error:`, error.message);\n }\n throw error;\n }\n },\n );\n }\n\n const prompts = connector.prompts ?? {};\n for (const [name, def] of Object.entries(prompts)) {\n const argsSchema = buildPromptArgsSchema(def);\n mcpServer.registerPrompt(\n name,\n {\n description: def.description,\n ...(argsSchema ? { argsSchema } : {}),\n },\n async (args: Record<string, string | undefined>, extra: { signal: AbortSignal }) => {\n try {\n const cleanArgs: Record<string, string> = {};\n for (const [k, v] of Object.entries(args)) {\n if (v !== undefined) cleanArgs[k] = v;\n }\n const result = await withTimeout(\n Promise.resolve(def.get(cleanArgs, { signal: extra.signal })),\n timeoutMs,\n );\n return { messages: [...result.messages] };\n } catch (error: unknown) {\n if (error instanceof Error) {\n console.error(`[connector:${connector.name}] Prompt get error:`, error.message);\n }\n throw error;\n }\n },\n );\n }\n\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n });\n\n const host = options?.host ?? \"127.0.0.1\";\n const port = options?.port ?? 0;\n\n const httpServer = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n if (req.url === \"/health\" && req.method === \"GET\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ status: \"ok\" }));\n return;\n }\n\n if (\n req.url === \"/mcp\" &&\n (req.method === \"POST\" || req.method === \"GET\" || req.method === \"DELETE\")\n ) {\n if (req.method === \"POST\") {\n // Check Content-Length before reading body (fast reject for oversized payloads)\n const contentLength = parseInt(req.headers[\"content-length\"] ?? \"0\", 10);\n if (contentLength > MAX_BODY_SIZE) {\n req.resume(); // drain the request body to prevent EPIPE\n res.writeHead(413, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Request body too large\" }));\n return;\n }\n\n try {\n const body = await readBody(req, MAX_BODY_SIZE);\n const parsed: unknown = JSON.parse(body);\n await transport.handleRequest(req, res, parsed);\n } catch (err: unknown) {\n if (!res.headersSent) {\n const isTooLarge = err instanceof Error && err.message === \"Request body too large\";\n res.writeHead(isTooLarge ? 413 : 400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: isTooLarge ? \"Request body too large\" : \"Invalid request body\",\n }),\n );\n }\n }\n return;\n }\n\n // GET (SSE) and DELETE (session end)\n try {\n await transport.handleRequest(req, res);\n } catch {\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Internal server error\" }));\n }\n }\n return;\n }\n\n res.writeHead(404);\n res.end(\"Not found\");\n });\n\n // Connect MCP server to transport AFTER tool registration\n await mcpServer.connect(transport);\n\n await new Promise<void>((resolve) => {\n httpServer.listen(port, host, () => resolve());\n });\n\n const addr = httpServer.address();\n if (!addr || typeof addr === \"string\") {\n throw new Error(\"Failed to get server address\");\n }\n\n return {\n port: (addr as AddressInfo).port,\n close: async () => {\n await mcpServer.close();\n await new Promise<void>((resolve, reject) => {\n httpServer.close((err: Error | undefined) => (err ? reject(err) : resolve()));\n });\n },\n };\n};\n","export class SecurityError extends Error {\n readonly code = \"SECURITY_VIOLATION\";\n\n constructor(message: string) {\n super(message);\n this.name = \"SecurityError\";\n }\n}\n\nexport class ConnectorError extends Error {\n readonly code = \"CONNECTOR_ERROR\";\n\n constructor(message: string) {\n super(message);\n this.name = \"ConnectorError\";\n }\n}\n","/**\n * Joins a repo name and primitive name into the qualified `repo/primitive` form.\n * Throws if either segment is empty.\n */\nexport const qualify = (repoName: string, primitiveName: string): string => {\n if (!repoName) throw new Error(\"repoName must not be empty\");\n if (!primitiveName) throw new Error(\"primitiveName must not be empty\");\n return `${repoName}/${primitiveName}`;\n};\n\n/**\n * Splits a qualified name into its repo and primitive components.\n * Requires exactly one `/` with non-empty segments on both sides.\n */\nexport const parse = (qualified: string): { repoName: string; primitiveName: string } => {\n const slashIndex = qualified.indexOf(\"/\");\n if (slashIndex === -1) {\n throw new Error(`Expected qualified name with \"/\" separator, got: \"${qualified}\"`);\n }\n if (qualified.indexOf(\"/\", slashIndex + 1) !== -1) {\n throw new Error(`Expected exactly one \"/\" in qualified name, got: \"${qualified}\"`);\n }\n const repoName = qualified.slice(0, slashIndex);\n const primitiveName = qualified.slice(slashIndex + 1);\n if (!repoName || !primitiveName) {\n throw new Error(`Both repo and primitive segments must be non-empty, got: \"${qualified}\"`);\n }\n return { repoName, primitiveName };\n};\n\n/**\n * Returns true if the name is in qualified `repo/entity` form —\n * exactly one `/` with non-empty segments on both sides.\n * Purely structural; no format validation.\n */\nexport const isQualified = (name: string): boolean => {\n const slashIndex = name.indexOf(\"/\");\n if (slashIndex === -1 || slashIndex === 0 || slashIndex === name.length - 1) return false;\n return name.indexOf(\"/\", slashIndex + 1) === -1;\n};\n","import * as z from \"zod\";\n\nexport const environmentSchema = z.enum([\"dev\", \"staging\", \"prod\"]);\n\nexport type Environment = z.infer<typeof environmentSchema>;\n","import * as z from \"zod\";\n\nexport const jitPolicySchema = z.enum([\"auto-approve\", \"policy-based\", \"require-approval\"]);\n\nexport type JitPolicy = z.infer<typeof jitPolicySchema>;\n\nexport const identityConfigSchema = z.object({\n basePermissions: z.array(z.string()),\n requestablePermissions: z.array(z.string()).optional(),\n jitPolicy: jitPolicySchema.optional(),\n maxJitDurationMinutes: z.number().int().positive().optional(),\n});\n\nexport type IdentityConfig = z.infer<typeof identityConfigSchema>;\n","import * as z from \"zod\";\n\nexport const notificationConfigSchema = z.object({\n slack: z.string().optional(),\n onSuccess: z.boolean().optional(),\n onFailure: z.boolean().optional(),\n onTimeout: z.boolean().optional(),\n});\n\nexport type NotificationConfig = z.infer<typeof notificationConfigSchema>;\n","import type { ModelString } from \"kraken-ai\";\nimport * as z from \"zod\";\nimport { isQualified } from \"../qualified-name\";\nimport {\n isValidPrimitiveName,\n isValidQualifiedName,\n isValidQualifiedSkillId,\n isValidSkillId,\n} from \"../validate\";\nimport { environmentSchema } from \"./environment\";\nimport { identityConfigSchema } from \"./identity\";\nimport { notificationConfigSchema } from \"./notifications\";\nimport { concurrencyPolicySchema, resourceLimitsSchema, retryPolicySchema } from \"./resources\";\nimport { teamConfigSchema } from \"./team\";\nimport { triggerConfigSchema } from \"./trigger\";\n\nconst thinkingLevelSchema = z.enum([\"low\", \"medium\", \"high\"]);\n\nconst logLevelSchema = z.enum([\"silent\", \"debug\", \"info\", \"warn\", \"error\"]);\n\nexport const agentDefinitionSchema = z\n .object({\n name: z.string().min(1),\n model: z.string().min(1),\n instructions: z.string().min(1),\n description: z.string().optional(),\n skills: z.array(z.string()).optional(),\n temperature: z.number().min(0).max(2).optional(),\n allowTemperatureOverride: z.boolean().optional(),\n maxOutputTokens: z.number().int().positive().optional(),\n thinkingLevel: thinkingLevelSchema.optional(),\n logLevel: logLevelSchema.optional(),\n })\n .strict();\n\nexport type AgentDefinition = Omit<z.infer<typeof agentDefinitionSchema>, \"model\"> & {\n model: ModelString;\n};\n\nexport const platformAgentConfigSchema = z\n .object({\n agent: agentDefinitionSchema,\n connectors: z.array(z.string()).optional(),\n triggers: z.array(triggerConfigSchema),\n identity: identityConfigSchema.optional(),\n resources: resourceLimitsSchema.optional(),\n retries: retryPolicySchema.optional(),\n concurrency: concurrencyPolicySchema.optional(),\n fast: z.boolean().optional(),\n team: teamConfigSchema.optional(),\n notifications: notificationConfigSchema.optional(),\n environment: environmentSchema.optional(),\n actions: z.array(z.string()).optional(),\n })\n .strict()\n .superRefine((data, ctx) => {\n // Validate team member references\n for (const member of data.team?.members ?? []) {\n const valid = isQualified(member)\n ? isValidQualifiedName(member)\n : isValidPrimitiveName(member);\n if (!valid) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"team\", \"members\"],\n message: `Invalid team member name: \"${member}\"`,\n });\n }\n }\n\n // Validate connector references\n for (const connector of data.connectors ?? []) {\n const valid = isQualified(connector)\n ? isValidQualifiedName(connector)\n : isValidPrimitiveName(connector);\n if (!valid) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"connectors\"],\n message: `Invalid connector name: \"${connector}\"`,\n });\n }\n }\n\n // Validate skill references\n for (const skill of data.agent.skills ?? []) {\n const valid = isQualified(skill) ? isValidQualifiedSkillId(skill) : isValidSkillId(skill);\n if (!valid) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"agent\", \"skills\"],\n message: `Invalid skill ID: \"${skill}\"`,\n });\n }\n }\n\n // Validate action references\n for (const action of data.actions ?? []) {\n const valid = isQualified(action)\n ? isValidQualifiedName(action)\n : isValidPrimitiveName(action);\n if (!valid) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"actions\"],\n message: `Invalid action name: \"${action}\"`,\n });\n }\n }\n });\n\nexport type PlatformAgentConfig = Omit<z.infer<typeof platformAgentConfigSchema>, \"agent\"> & {\n agent: AgentDefinition;\n};\n\nexport interface PlatformAgent {\n readonly __type: \"PlatformAgent\";\n readonly config: PlatformAgentConfig;\n readonly runtime?: unknown;\n /** In-memory schemas for action variants. Not serialized — runtime use only. */\n readonly actionZodSchemas?: Record<string, import(\"zod\").ZodObject<import(\"zod\").ZodRawShape>>;\n /** Action handler functions. Not serialized — runtime use only. */\n readonly actionHandlers?: Readonly<Record<string, (payload: unknown) => Promise<void>>>;\n /** Action webhook URLs. Not serialized — runtime use only. */\n readonly actionWebhooks?: Readonly<Record<string, string | undefined>>;\n /** Team member PlatformAgent objects. Not serialized — runtime use only (dev mode delegation). */\n readonly teamAgents?: readonly PlatformAgent[];\n}\n\n/** Team member reference: local PlatformAgent or remote agent ID string. */\nexport type TeamMember = PlatformAgent | string;\n","import { isQualified, parse } from \"./qualified-name\";\n\n// ─── Primitive Name Validation ───\n\nexport const PRIMITIVE_NAME_REGEX = /^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$/;\n\n/** Single-char names (e.g. \"a\") are valid — the regex requires min 2 chars, so we also allow /^[a-z0-9]$/ */\nexport const isValidPrimitiveName = (name: string): boolean =>\n name.length === 1 ? /^[a-z0-9]$/.test(name) : PRIMITIVE_NAME_REGEX.test(name);\n\n// ─── Skill Name Validation ───\n\n/** Skill filenames allow uppercase: e.g. someFile-name.md, Research.md */\nexport const SKILL_NAME_REGEX = /^[a-zA-Z0-9][a-zA-Z0-9-]{0,62}[a-zA-Z0-9]$/;\n\nexport const isValidSkillName = (basename: string): boolean =>\n basename.length === 1 ? /^[a-zA-Z0-9]$/.test(basename) : SKILL_NAME_REGEX.test(basename);\n\n/** Skill IDs from remote may include .md extension */\nexport const isValidSkillId = (id: string): boolean => {\n const base = id.endsWith(\".md\") ? id.slice(0, -3) : id;\n return isValidSkillName(base);\n};\n\n// ─── Qualified Name Validation ───\n\n/** Validates a qualified `repo/primitive` name — both segments must pass `isValidPrimitiveName`. */\nexport const isValidQualifiedName = (name: string): boolean => {\n if (!isQualified(name)) return false;\n const { repoName, primitiveName } = parse(name);\n return isValidPrimitiveName(repoName) && isValidPrimitiveName(primitiveName);\n};\n\n/** Validates a qualified skill ID — repo segment passes `isValidPrimitiveName`, primitive segment passes `isValidSkillId`. */\nexport const isValidQualifiedSkillId = (id: string): boolean => {\n if (!isQualified(id)) return false;\n const { repoName, primitiveName } = parse(id);\n return isValidPrimitiveName(repoName) && isValidSkillId(primitiveName);\n};\n\n// ─── Tool Name Validation ───\n\n/** Tool names allow underscores (e.g., fs_read, fs_write) */\nexport const TOOL_NAME_REGEX = /^[a-z][a-z0-9_-]{0,62}[a-z0-9]$/;\n\nexport const isValidToolName = (name: string): boolean =>\n name.length === 1 ? /^[a-z]$/.test(name) : TOOL_NAME_REGEX.test(name);\n\n// ─── Property Name Validation ───\n\n/** JS/TS property names with 255-char length cap to prevent DoS */\nexport const PROPERTY_NAME_REGEX = /^[a-zA-Z_$][a-zA-Z0-9_$]{0,254}$/;\n\nconst FORBIDDEN_PROPS = new Set([\n \"__proto__\",\n \"constructor\",\n \"prototype\",\n \"__defineGetter__\",\n \"__defineSetter__\",\n \"__lookupGetter__\",\n \"__lookupSetter__\",\n]);\n\nexport const isValidPropertyName = (name: string): boolean =>\n PROPERTY_NAME_REGEX.test(name) && !FORBIDDEN_PROPS.has(name);\n","import * as z from \"zod\";\n\nexport const resourceLimitsSchema = z.object({\n maxTokens: z.number().int().positive().optional(),\n maxCostUsd: z.number().positive().optional(),\n timeoutSeconds: z.number().int().positive().optional(),\n});\n\nexport type ResourceLimits = z.infer<typeof resourceLimitsSchema>;\n\nexport const retryPolicySchema = z.object({\n maxAttempts: z.number().int().min(1).optional(),\n backoffSeconds: z.number().positive().optional(),\n});\n\nexport type RetryPolicy = z.infer<typeof retryPolicySchema>;\n\nexport const concurrencyPolicySchema = z.object({\n maxParallelRuns: z.number().int().min(1).optional(),\n});\n\nexport type ConcurrencyPolicy = z.infer<typeof concurrencyPolicySchema>;\n","import * as z from \"zod\";\n\nexport const teamConfigSchema = z.object({\n members: z.array(z.string()).min(1),\n maxConcurrentWorkers: z.number().int().min(1).optional(),\n maxTokenBudgetPerWorker: z.number().int().positive().optional(),\n maxDurationPerWorker: z.number().positive().optional(),\n});\n\nexport type TeamConfig = z.infer<typeof teamConfigSchema>;\n","import * as z from \"zod\";\n\nconst cronTriggerSchema = z.object({\n type: z.literal(\"cron\"),\n expression: z.string(),\n timezone: z.string().optional(),\n});\n\nconst webhookTriggerSchema = z.object({\n type: z.literal(\"webhook\"),\n path: z.string().startsWith(\"/\"),\n method: z.enum([\"POST\", \"GET\"]).optional(),\n});\n\nconst eventTriggerSchema = z.object({\n type: z.literal(\"event\"),\n source: z.string(),\n event: z.string(),\n});\n\nconst apiTriggerSchema = z.object({ type: z.literal(\"api\") });\n\nconst manualTriggerSchema = z.object({ type: z.literal(\"manual\") });\n\nexport const triggerConfigSchema = z.discriminatedUnion(\"type\", [\n cronTriggerSchema,\n webhookTriggerSchema,\n eventTriggerSchema,\n apiTriggerSchema,\n manualTriggerSchema,\n]);\n\nexport type TriggerConfig = z.infer<typeof triggerConfigSchema>;\n","import * as z from \"zod\";\n\nexport const platformSkillInputSchema = z\n .object({\n name: z.string().min(1),\n description: z.string().optional(),\n })\n .strict();\n\nexport interface PlatformSkill {\n readonly __type: \"PlatformSkill\";\n readonly name: string;\n readonly description?: string;\n}\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport { ConnectorError, type McpContent } from \"@kraken-ai/platform-core\";\n\nconst MAX_TOOL_RESULT_SIZE = 10 * 1024 * 1024; // 10MB\n\ninterface ToolResultContent {\n readonly type: string;\n [key: string]: unknown;\n}\n\ninterface ToolResult {\n readonly content: ReadonlyArray<ToolResultContent>;\n readonly isError?: boolean;\n}\n\nconst isMcpContent = (val: unknown): val is McpContent =>\n typeof val === \"object\" &&\n val !== null &&\n \"__mcpPassThrough\" in val &&\n (val as McpContent).__mcpPassThrough === true;\n\n/**\n * Wrap a tool handler's return value into MCP `CallToolResult` format.\n *\n * Automatically converts primitives to `{ type: \"text\" }` content and\n * serializes objects to JSON. Pass-through {@link McpContent} values\n * (created with {@link mcpResult}) are forwarded as-is.\n *\n * @param value - The handler's return value (string, number, boolean,\n * object, {@link McpContent}, or `null`/`undefined`).\n * @returns An MCP-compatible tool result.\n *\n * @example\n * ```ts\n * wrapToolResult(\"done\"); // { content: [{ type: \"text\", text: \"done\" }] }\n * wrapToolResult({ id: 1 }); // { content: [{ type: \"text\", text: '{\\n \"id\": 1\\n}' }] }\n * wrapToolResult(null); // { content: [] }\n * ```\n */\nexport const wrapToolResult = (value: unknown): ToolResult => {\n if (value === null || value === undefined) {\n return { content: [] };\n }\n\n if (typeof value === \"string\") {\n return { content: [{ type: \"text\", text: value }] };\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return { content: [{ type: \"text\", text: String(value) }] };\n }\n\n if (isMcpContent(value)) {\n const result: ToolResult = { content: value.content };\n if (value.isError) {\n return { ...result, isError: true };\n }\n return result;\n }\n\n const json = JSON.stringify(value, null, 2);\n if (json.length > MAX_TOOL_RESULT_SIZE) {\n return {\n content: [{ type: \"text\", text: `[Result truncated: ${json.length} bytes]` }],\n isError: true,\n };\n }\n return { content: [{ type: \"text\", text: json }] };\n};\n\n/**\n * Wrap a thrown error into MCP `CallToolResult` format with `isError: true`.\n *\n * {@link ConnectorError} messages are forwarded to the agent as-is (they\n * are user-facing). All other errors are replaced with a generic\n * \"Internal handler error\" message and logged to stderr.\n *\n * @param error - The caught error.\n * @returns An MCP-compatible error result.\n *\n * @example\n * ```ts\n * try {\n * return wrapToolResult(await handler(args));\n * } catch (err) {\n * return wrapToolError(err);\n * }\n * ```\n */\nexport const wrapToolError = (error: unknown): ToolResult => {\n if (error instanceof ConnectorError) {\n return {\n content: [{ type: \"text\", text: error.message }],\n isError: true,\n };\n }\n\n if (error instanceof Error) {\n console.error(\"[connector] Internal handler error:\", error.message, error.stack);\n } else {\n console.error(\"[connector] Internal handler error:\", String(error));\n }\n\n return {\n content: [{ type: \"text\", text: \"Internal handler error\" }],\n isError: true,\n };\n};\n\n/**\n * Create an explicit MCP content pass-through result.\n *\n * Use this when you need full control over the MCP response — for\n * example, returning an image alongside text or marking a multi-part\n * response as an error.\n *\n * @param content - Array of MCP content blocks (`{ type: \"text\", text }`,\n * `{ type: \"image\", data, mimeType }`, etc.).\n * @param isError - If `true`, the result is marked as an error.\n * @returns An {@link McpContent} object that {@link wrapToolResult}\n * forwards without modification.\n *\n * @example\n * ```ts\n * import { mcpResult } from \"@kraken-ai/platform\";\n *\n * const screenshot = defineTool({\n * description: \"Take a screenshot\",\n * input: z.object({ url: z.string().url() }),\n * handler: async ({ url }) =>\n * mcpResult([\n * { type: \"text\", text: `Screenshot of ${url}` },\n * { type: \"image\", data: base64png, mimeType: \"image/png\" },\n * ]),\n * });\n * ```\n */\nexport const mcpResult = (content: McpContent[\"content\"], isError?: boolean): McpContent => ({\n __mcpPassThrough: true as const,\n content,\n isError,\n});\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport { readFileSync } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\nimport type { PlatformAgent } from \"@kraken-ai/platform-core\";\nimport { Agent, type AgentLike } from \"kraken-ai\";\nimport { buildActionOutputSchema } from \"./agents/define-actions\";\nimport { cyan, dim, green, yellow } from \"./cli/log\";\nimport { buildActionInstructions, dispatchDevAction } from \"./dev-actions\";\nimport { loadConnectorTools } from \"./dev-connectors\";\n\nconst loadDotenv = (): void => {\n try {\n const content = readFileSync(\".env\", \"utf-8\");\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIdx = trimmed.indexOf(\"=\");\n if (eqIdx === -1) continue;\n const key = trimmed.slice(0, eqIdx).trim();\n const value = trimmed.slice(eqIdx + 1).trim();\n if (!process.env[key]) {\n process.env[key] = value;\n }\n }\n } catch {\n // .env not found, that's fine\n }\n};\n\nconst FRONTMATTER_RE = /^---\\n[\\s\\S]*?\\n---\\n([\\s\\S]*)$/;\n\nconst resolveSkillContent = (refs: string[]): string[] =>\n refs.map((ref) => {\n try {\n return readFileSync(`src/skills/${ref}`, \"utf-8\");\n } catch {\n return ref;\n }\n });\n\nconst buildInstructions = (base: string, skillContent: string[]): string => {\n if (skillContent.length === 0) return base;\n const bodies = skillContent.map((s) => {\n const m = FRONTMATTER_RE.exec(s);\n return m?.[1]?.trim() ?? s;\n });\n return `${base}\\n\\n${bodies.join(\"\\n\\n\")}`;\n};\n\n/** Recursively build a kraken-ai Agent from a PlatformAgent, wiring connectors, skills, and team. */\nconst buildDevAgent = async (pa: PlatformAgent): Promise<Agent> => {\n const {\n name,\n model,\n instructions,\n skills,\n temperature,\n thinkingLevel,\n maxOutputTokens,\n logLevel,\n } = pa.config.agent;\n\n const connectorNames = pa.config.connectors ?? [];\n const { tools: connectorTools, instructions: connectorInstructions } =\n await loadConnectorTools(connectorNames);\n\n const skillContent = resolveSkillContent(skills ?? []);\n let fullInstructions = buildInstructions(instructions, skillContent);\n if (connectorInstructions.length > 0) {\n fullInstructions = `${fullInstructions}\\n\\n${connectorInstructions.join(\"\\n\\n\")}`;\n }\n\n // Wire action output schema and instructions\n let outputSchema: ReturnType<typeof buildActionOutputSchema> | undefined;\n if (pa.actionZodSchemas && Object.keys(pa.actionZodSchemas).length > 0) {\n const actionInstructions = buildActionInstructions(pa.actionZodSchemas);\n if (actionInstructions) {\n fullInstructions = `${fullInstructions}\\n\\n${actionInstructions}`;\n }\n const actions = Object.entries(pa.actionZodSchemas).map(([name, zodSchema]) => ({\n __type: \"PlatformAction\" as const,\n name,\n config: { schema: {} as Record<string, unknown>, hasHandler: false },\n zodSchema,\n }));\n outputSchema = buildActionOutputSchema(actions);\n }\n\n // Recursively build team member agents\n let team: AgentLike[] | undefined;\n if (pa.teamAgents && pa.teamAgents.length > 0) {\n team = await Promise.all(pa.teamAgents.map(buildDevAgent));\n }\n\n return new Agent({\n name,\n model,\n instructions: fullInstructions,\n tools: connectorTools.length > 0 ? connectorTools : undefined,\n outputSchema,\n team,\n temperature,\n thinkingLevel,\n maxOutputTokens,\n logLevel,\n });\n};\n\nexport const runDev = async (agent: PlatformAgent): Promise<never> => {\n loadDotenv();\n\n const hasActions = agent.actionZodSchemas && Object.keys(agent.actionZodSchemas).length > 0;\n const sdkAgent = await buildDevAgent(agent);\n\n const { name, model } = agent.config.agent;\n const connectorNames = agent.config.connectors ?? [];\n\n try {\n await sdkAgent.preflight();\n } catch (err) {\n console.error(`\\n ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n\n console.log(`\\n Agent: ${name}`);\n console.log(` Model: ${model}`);\n if (connectorNames.length > 0) {\n console.log(` Connectors: ${connectorNames.join(\", \")}`);\n }\n if (agent.teamAgents && agent.teamAgents.length > 0) {\n console.log(` Team: ${agent.teamAgents.map((a) => a.config.agent.name).join(\", \")}`);\n }\n if (hasActions && agent.actionZodSchemas) {\n console.log(` Actions: ${Object.keys(agent.actionZodSchemas).join(\", \")}`);\n }\n console.log(`\\n Type a message to start. Ctrl+C to exit.\\n`);\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const messages: Array<{ role: \"user\" | \"assistant\"; content: string }> = [];\n\n const cleanup = (): void => {\n rl.close();\n process.exit(0);\n };\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n const ask = (): void => {\n rl.question(\"You: \", (input: string) => {\n if (!input.trim()) {\n ask();\n return;\n }\n\n messages.push({ role: \"user\", content: input });\n\n void (async () => {\n try {\n const result = await sdkAgent.run(messages, {\n onEvent: (event) => {\n if (event.type === \"thought\") {\n console.log(\n ` [thinking] ${event.text.slice(0, 120)}${event.text.length > 120 ? \"…\" : \"\"}`,\n );\n }\n if (event.type === \"tool_call\" && event.status === \"success\") {\n console.log(` [tool] ${event.toolName}`);\n }\n },\n });\n\n if (result.status === \"complete\") {\n const output =\n typeof result.output === \"string\"\n ? result.output\n : JSON.stringify(result.output, null, 2);\n\n // Dispatch action if structured output has an action field\n if (\n hasActions &&\n agent.actionZodSchemas &&\n result.output != null &&\n typeof result.output === \"object\" &&\n \"action\" in (result.output as Record<string, unknown>)\n ) {\n try {\n const dispatched = await dispatchDevAction(\n result.output,\n agent.actionZodSchemas,\n agent.actionHandlers,\n agent.actionWebhooks ?? {},\n );\n console.log(`\\n ${cyan(\"Action:\")} ${green(dispatched.actionName)}`);\n console.log(` ${dim(\"Payload:\")} ${JSON.stringify(dispatched.payload, null, 2)}`);\n if (dispatched.handlerCalled) {\n console.log(` ${dim(\"Handler:\")} ${green(\"called\")}`);\n }\n if (dispatched.webhookUrl) {\n console.log(\n ` ${dim(\"Webhook:\")} ${yellow(dispatched.webhookUrl)} ${dim(\"(skipped in dev)\")}`,\n );\n }\n console.log();\n } catch (err) {\n console.error(\n `\\n Action dispatch error: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n }\n } else {\n console.log(`\\nAgent: ${output}\\n`);\n }\n\n messages.push({ role: \"assistant\", content: output });\n } else if (result.status === \"interrupted\") {\n console.log(`\\n[Interrupted: ${result.interrupt.toolName} requires approval]\\n`);\n }\n } catch (err) {\n console.error(`\\nError: ${err instanceof Error ? err.message : String(err)}\\n`);\n }\n\n ask();\n })();\n });\n };\n\n ask();\n\n return new Promise(() => {});\n};\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport {\n type ActionVariantInput,\n isValidActionName,\n type PlatformAction,\n} from \"@kraken-ai/platform-core\";\nimport * as z from \"zod\";\n\n/**\n * Define a standalone action with a name, Zod schema, optional webhook, and\n * optional handler.\n *\n * Actions are the agent's typed terminal outputs — each action is a possible\n * decision the agent can make. The handler's payload type is inferred from\n * the schema, giving you end-to-end type safety.\n *\n * @param input - Action name, schema, optional webhook URL, and optional handler.\n * @returns A frozen {@link PlatformAction} object.\n * @throws If `name` is empty, invalid, or longer than 64 chars.\n *\n * @example\n * ```ts\n * import { defineAction } from \"@kraken-ai/platform\";\n * import { z } from \"zod\";\n *\n * export default defineAction({\n * name: \"approve\",\n * schema: z.object({ reason: z.string(), confidence: z.number() }),\n * handler: async (payload) => {\n * payload.reason; // string\n * payload.confidence; // number\n * },\n * });\n * ```\n */\nexport const defineAction = <S extends z.ZodObject<z.ZodRawShape>>(\n input: ActionVariantInput<S>,\n): PlatformAction => {\n if (!input.name || !isValidActionName(input.name)) {\n throw new Error(\n `Invalid action name \"${input.name}\": must be lowercase alphanumeric with hyphens, 1-64 chars`,\n );\n }\n\n return Object.freeze({\n __type: \"PlatformAction\" as const,\n name: input.name,\n config: Object.freeze({\n schema: z.toJSONSchema(input.schema, { target: \"draft-2020-12\" }) as Record<string, unknown>,\n webhook: input.webhook,\n hasHandler: !!input.handler,\n }),\n zodSchema: input.schema,\n handler: input.handler as ((payload: unknown) => Promise<void>) | undefined,\n });\n};\n\n/**\n * Build a discriminated-union Zod schema from action definitions.\n *\n * Each action becomes `z.object({ action: z.literal(name), ...fields })`,\n * and the union discriminates on the `action` key. Pass the result as\n * `outputSchema` in {@link definePlatformAgent} to constrain the agent's\n * structured output to exactly one of the defined actions.\n *\n * @param actions - Array of {@link PlatformAction} objects returned by {@link defineAction}.\n * @returns A `z.ZodDiscriminatedUnion` schema.\n * @throws If `actions` is empty.\n *\n * @example\n * ```ts\n * import { defineAction, buildActionOutputSchema } from \"@kraken-ai/platform\";\n * import { z } from \"zod\";\n *\n * const approve = defineAction({\n * name: \"approve\",\n * schema: z.object({ reason: z.string() }),\n * });\n * const reject = defineAction({\n * name: \"reject\",\n * schema: z.object({ reason: z.string() }),\n * });\n *\n * const outputSchema = buildActionOutputSchema([approve, reject]);\n * // Accepts: { action: \"approve\", reason: \"...\" }\n * // or: { action: \"reject\", reason: \"...\" }\n * ```\n */\nexport const buildActionOutputSchema = (actions: PlatformAction[]) => {\n if (actions.length === 0) {\n throw new Error(\"Cannot build output schema from empty action definitions\");\n }\n\n const variants = actions.map((action) =>\n z.object({ action: z.literal(action.name) }).extend(action.zodSchema.shape),\n );\n\n const [first, ...rest] = variants;\n if (!first) {\n throw new Error(\"Cannot build output schema from empty action definitions\");\n }\n return z.discriminatedUnion(\"action\", [first, ...rest]);\n};\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nconst supportsColor =\n !(\"NO_COLOR\" in process.env) &&\n process.env.FORCE_COLOR !== \"0\" &&\n (process.stderr.isTTY ?? false);\n\nconst code = (open: number, close: number) => {\n const openStr = `\\x1b[${open}m`;\n const closeStr = `\\x1b[${close}m`;\n return (s: string): string => (supportsColor ? `${openStr}${s}${closeStr}` : s);\n};\n\nexport const bold = code(1, 22);\nexport const dim = code(2, 22);\nexport const red = code(31, 39);\nexport const yellow = code(33, 39);\nexport const green = code(32, 39);\nexport const cyan = code(36, 39);\n\nexport const info = (msg: string): void => {\n process.stderr.write(` ${dim(\"[kraken-ai:\")} ${cyan(\"info\")}${dim(\"]\")} ${msg}\\n`);\n};\n\nexport const warn = (msg: string): void => {\n process.stderr.write(` ${dim(\"[kraken-ai:\")} ${yellow(\"warn\")}${dim(\"]\")} ${msg}\\n`);\n};\n\nexport const error = (msg: string): void => {\n process.stderr.write(` ${dim(\"[kraken-ai:\")} ${red(\"error\")}${dim(\"]\")} ${msg}\\n`);\n};\n\nexport const success = (msg: string): void => {\n process.stderr.write(` ${dim(\"[kraken-ai:\")} ${green(\"ok\")}${dim(\"]\")} ${msg}\\n`);\n};\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport type * as z from \"zod\";\n\n/**\n * Build instructions that describe available action variants to the LLM.\n * Appended to the agent's system prompt when actions are configured.\n */\nexport const buildActionInstructions = (\n zodSchemas: Record<string, z.ZodObject<z.ZodRawShape>>,\n): string => {\n const entries = Object.entries(zodSchemas);\n if (entries.length === 0) return \"\";\n\n const variants = entries.map(([name, schema]) => {\n const fields = Object.keys(schema.shape).join(\", \");\n return ` - \"${name}\": { ${fields} }`;\n });\n\n return [\n 'You MUST respond with a JSON object containing an \"action\" field set to one of the following action names, plus the fields for that action:',\n \"\",\n ...variants,\n \"\",\n 'Example: { \"action\": \"<name>\", ...fields }',\n ].join(\"\\n\");\n};\n\nexport interface ActionDispatchResult {\n actionName: string;\n payload: Record<string, unknown>;\n handlerCalled: boolean;\n webhookUrl?: string;\n}\n\n/**\n * Validate and dispatch a structured action output from the LLM.\n * In dev mode, handlers are called directly; webhooks are logged but not called.\n */\nexport const dispatchDevAction = async (\n output: unknown,\n zodSchemas: Record<string, z.ZodObject<z.ZodRawShape>>,\n handlers: Readonly<Record<string, (payload: unknown) => Promise<void>>> | undefined,\n webhooks: Record<string, string | undefined>,\n): Promise<ActionDispatchResult> => {\n if (output == null || typeof output !== \"object\" || !(\"action\" in output)) {\n throw new Error('Action output must contain an \"action\" field');\n }\n\n const { action: actionName, ...rest } = output as Record<string, unknown>;\n if (typeof actionName !== \"string\") {\n throw new Error('Action output \"action\" field must be a string');\n }\n\n const schema = zodSchemas[actionName];\n if (!schema) {\n throw new Error(\n `Unknown action \"${actionName}\". Expected one of: ${Object.keys(zodSchemas).join(\", \")}`,\n );\n }\n\n const parsed = schema.parse(rest);\n const payload = parsed as Record<string, unknown>;\n\n let handlerCalled = false;\n const handler = handlers?.[actionName];\n if (handler) {\n await handler(payload);\n handlerCalled = true;\n }\n\n return {\n actionName,\n payload,\n handlerCalled,\n webhookUrl: webhooks[actionName],\n };\n};\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport { resolve } from \"node:path\";\nimport {\n type ConnectorHandlerContext,\n type GetPromptResult,\n isValidPrimitiveName,\n type PlatformConnector,\n PRIMITIVE_NAME_REGEX,\n type ReadResourceResult,\n} from \"@kraken-ai/platform-core\";\nimport { type Tool, tool } from \"kraken-ai\";\nimport { wrapToolError, wrapToolResult } from \"./agents/connector-wrap\";\n\nconst isPlatformConnector = (v: unknown): v is PlatformConnector =>\n v != null &&\n typeof v === \"object\" &&\n (v as Record<string, unknown>).__type === \"PlatformConnector\";\n\nexport interface LoadedResource {\n readonly name: string;\n readonly uri: string;\n readonly description: string;\n readonly mimeType?: string;\n read(ctx: ConnectorHandlerContext): Promise<ReadResourceResult> | ReadResourceResult;\n}\n\nexport interface LoadedPrompt {\n readonly name: string;\n readonly description: string;\n readonly arguments?: ReadonlyArray<{\n readonly name: string;\n readonly description?: string;\n readonly required?: boolean;\n }>;\n get(\n args: Record<string, string>,\n ctx: ConnectorHandlerContext,\n ): Promise<GetPromptResult> | GetPromptResult;\n}\n\nexport interface LoadedConnectors {\n readonly tools: Tool[];\n readonly resources: LoadedResource[];\n readonly prompts: LoadedPrompt[];\n readonly instructions: string[];\n}\n\n/**\n * Import a single connector module by name.\n * Tries `src/connectors/<name>/index.ts` first (tsx), then `src/connectors/<name>/index.js`.\n */\nconst importConnector = async (\n name: string,\n projectRoot: string,\n): Promise<PlatformConnector | null> => {\n const basePath = resolve(projectRoot, \"src\", \"connectors\", name, \"index\");\n\n for (const ext of [\".ts\", \".js\"]) {\n try {\n const mod: Record<string, unknown> = await import(`${basePath}${ext}`);\n const connector = mod.default;\n\n if (!isPlatformConnector(connector)) {\n console.warn(`[connector:${name}] Default export is not a PlatformConnector — skipping`);\n return null;\n }\n\n return connector;\n } catch (err: unknown) {\n // If .ts fails, try .js next\n if (ext === \".ts\") continue;\n\n // Both extensions failed\n const message = err instanceof Error ? err.message : String(err);\n console.warn(`[connector:${name}] Failed to import — skipping. Error: ${message}`);\n return null;\n }\n }\n\n return null;\n};\n\n/**\n * Create SDK Tool wrappers from a PlatformConnector's tool definitions.\n * Each tool validates input, calls the handler, and wraps the result.\n */\nconst createToolsFromConnector = (connector: PlatformConnector): Tool[] => {\n const tools = connector.tools ?? {};\n return Object.entries(tools).map(([name, def]) =>\n tool({\n name,\n description: def.description,\n parameters: def.input,\n execute: async (args) => {\n try {\n const result = await Promise.resolve(def.handler(args));\n return wrapToolResult(result);\n } catch (error: unknown) {\n return wrapToolError(error);\n }\n },\n }),\n );\n};\n\n/**\n * Build SDK tools from already-loaded PlatformConnector objects.\n *\n * - Detects tool name collisions across connectors\n * - Creates SDK Tool wrappers for direct function calls (no HTTP)\n * - Collects connector instructions\n * - Logs connector name and tool count\n */\nexport const buildConnectorTools = (\n connectors: ReadonlyArray<{ readonly name: string; readonly connector: PlatformConnector }>,\n): LoadedConnectors => {\n // Check for tool name collisions across all connectors\n const toolOwners = new Map<string, string>();\n for (const { name, connector } of connectors) {\n for (const toolName of Object.keys(connector.tools ?? {})) {\n const existing = toolOwners.get(toolName);\n if (existing) {\n throw new Error(\n `Tool name collision: \"${toolName}\" is defined by both connectors \"${existing}\" and \"${name}\". ` +\n `Rename one of the tools or use a unique prefix.`,\n );\n }\n toolOwners.set(toolName, name);\n }\n }\n\n // Check for resource name collisions\n const resourceOwners = new Map<string, string>();\n for (const { name, connector } of connectors) {\n for (const resourceName of Object.keys(connector.resources ?? {})) {\n const existing = resourceOwners.get(resourceName);\n if (existing) {\n throw new Error(\n `Resource name collision: \"${resourceName}\" is defined by both connectors \"${existing}\" and \"${name}\". ` +\n `Rename one of the resources or use a unique prefix.`,\n );\n }\n resourceOwners.set(resourceName, name);\n }\n }\n\n // Check for prompt name collisions\n const promptOwners = new Map<string, string>();\n for (const { name, connector } of connectors) {\n for (const promptName of Object.keys(connector.prompts ?? {})) {\n const existing = promptOwners.get(promptName);\n if (existing) {\n throw new Error(\n `Prompt name collision: \"${promptName}\" is defined by both connectors \"${existing}\" and \"${name}\". ` +\n `Rename one of the prompts or use a unique prefix.`,\n );\n }\n promptOwners.set(promptName, name);\n }\n }\n\n const allTools: Tool[] = [];\n const allResources: LoadedResource[] = [];\n const allPrompts: LoadedPrompt[] = [];\n const allInstructions: string[] = [];\n\n for (const { name, connector } of connectors) {\n const tools = createToolsFromConnector(connector);\n allTools.push(...tools);\n\n for (const [resName, resDef] of Object.entries(connector.resources ?? {})) {\n allResources.push({\n name: resName,\n uri: resDef.uri,\n description: resDef.description,\n mimeType: resDef.mimeType,\n read: (ctx) => resDef.read(ctx),\n });\n }\n\n for (const [promptName, promptDef] of Object.entries(connector.prompts ?? {})) {\n allPrompts.push({\n name: promptName,\n description: promptDef.description,\n arguments: promptDef.arguments,\n get: (args, ctx) => promptDef.get(args, ctx),\n });\n }\n\n const toolCount = Object.keys(connector.tools ?? {}).length;\n const resourceCount = Object.keys(connector.resources ?? {}).length;\n const promptCount = Object.keys(connector.prompts ?? {}).length;\n\n const parts = [\n `${toolCount} tool${toolCount !== 1 ? \"s\" : \"\"}`,\n `${resourceCount} resource${resourceCount !== 1 ? \"s\" : \"\"}`,\n `${promptCount} prompt${promptCount !== 1 ? \"s\" : \"\"}`,\n ];\n console.log(` Connector: ${name} (${parts.join(\", \")})`);\n\n if (connector.instructions) {\n allInstructions.push(connector.instructions);\n }\n }\n\n return {\n tools: allTools,\n resources: allResources,\n prompts: allPrompts,\n instructions: allInstructions,\n };\n};\n\n/**\n * Load connector tools from an agent's connector name list.\n *\n * - Validates connector names against PRIMITIVE_NAME_REGEX\n * - Dynamically imports each connector module\n * - Delegates to buildConnectorTools for collision detection, wrapping, and instructions\n */\nexport const loadConnectorTools = async (\n connectorNames: string[],\n projectRoot?: string,\n): Promise<LoadedConnectors> => {\n if (connectorNames.length === 0) {\n return { tools: [], resources: [], prompts: [], instructions: [] };\n }\n\n const root = projectRoot ?? process.cwd();\n const connectors: Array<{ name: string; connector: PlatformConnector }> = [];\n\n for (const name of connectorNames) {\n if (!isValidPrimitiveName(name)) {\n console.warn(\n `[connector] Invalid connector name \"${name}\" — must match ${PRIMITIVE_NAME_REGEX}. Skipping.`,\n );\n continue;\n }\n\n const connector = await importConnector(name, root);\n if (connector) {\n connectors.push({ name, connector });\n }\n }\n\n return buildConnectorTools(connectors);\n};\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport type { ToolDefinition } from \"kraken-ai\";\nimport type { ConnectorSchema } from \"./platform/types\";\n\ntype ToolOverride = (args: Record<string, unknown>) => Promise<unknown> | unknown;\n\nexport class MockToolSet {\n private readonly defs: ToolDefinition[];\n private readonly overrides: Record<string, ToolOverride>;\n private readonly toolNames: Set<string>;\n\n constructor(tools: ToolDefinition[], overrides: Record<string, ToolOverride> = {}) {\n this.defs = tools;\n this.overrides = overrides;\n this.toolNames = new Set(tools.map((t) => t.name));\n }\n\n static fromConnectors(\n connectors: ConnectorSchema[],\n opts?: { include?: string[]; overrides?: Record<string, ToolOverride> },\n ): MockToolSet {\n const include = opts?.include;\n const filtered = include ? connectors.filter((c) => include.includes(c.id)) : connectors;\n\n const tools: ToolDefinition[] = filtered.flatMap((c) =>\n c.tools.map((t) => ({\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n })),\n );\n\n return new MockToolSet(tools, opts?.overrides);\n }\n\n definitions(): ToolDefinition[] {\n return this.defs;\n }\n\n async call(name: string, params: Record<string, unknown>): Promise<unknown> {\n if (!this.toolNames.has(name)) {\n throw new Error(`Unknown tool: ${name}`);\n }\n\n const override = this.overrides[name];\n if (override) {\n return override(params);\n }\n\n return {};\n }\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z","resolve","import_kraken_ai","z","name"]}
|