@kraken-ai/platform 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/agents/connector-server.ts","../src/agents/errors.ts","../src/agents/connector-wrap.ts","../src/agents/types/action.ts","../src/agents/types/environment.ts","../src/agents/types/identity.ts","../src/agents/types/notifications.ts","../src/agents/types/platform-agent.ts","../src/agents/types/resources.ts","../src/agents/types/team.ts","../src/agents/types/trigger.ts","../src/agents/types/skill.ts","../src/agents/define.ts","../src/agents/define-actions.ts","../src/agents/define-connector.ts","../src/agents/define-skill.ts","../src/cli/discover.ts","../src/cli/log.ts","../src/platform/http.ts","../src/platform/sse.ts","../src/platform/agent-handle.ts","../src/platform/agents.ts","../src/platform/data.ts","../src/platform/pipelines.ts","../src/platform/runs.ts","../src/platform/client.ts"],"sourcesContent":["// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nexport {\n ACTION_NAME_REGEX,\n type ActionVariantConfig,\n type ActionVariantInput,\n type AgentDefinition,\n type AgentId,\n actionsConfigSchema,\n actionVariantConfigSchema,\n agentDefinitionSchema,\n buildActionOutputSchema,\n type ConcurrencyPolicy,\n type ConnectorDefinition,\n ConnectorError,\n type ConnectorHandlerContext,\n type ConnectorHandlerResult,\n type ConnectorId,\n type ConnectorPromptDef,\n type ConnectorRef,\n type ConnectorResourceDef,\n type ConnectorToolDef,\n concurrencyPolicySchema,\n defineAction,\n defineActions,\n defineConnector,\n definePlatformAgent,\n defineSkill,\n defineTool,\n type Environment,\n environmentSchema,\n type GetPromptResult,\n type IdentityConfig,\n identityConfigSchema,\n isValidActionName,\n type JitPolicy,\n jitPolicySchema,\n type KrakenTypeRegistry,\n type McpContent,\n mcpResult,\n type NotificationConfig,\n notificationConfigSchema,\n type PlatformActions,\n type PlatformActionsConfig,\n type PlatformAgent,\n type PlatformAgentConfig,\n type PlatformConnector,\n type PlatformSkill,\n type PromptMessageContent,\n platformAgentConfigSchema,\n type ReadResourceResult,\n type ResourceContent,\n type ResourceLimits,\n type RetryPolicy,\n resourceLimitsSchema,\n retryPolicySchema,\n SecurityError,\n type SkillId,\n type SkillRef,\n type TeamConfig,\n type TeamMember,\n type ToolAnnotations,\n type TriggerConfig,\n teamConfigSchema,\n triggerConfigSchema,\n wrapToolError,\n wrapToolResult,\n} from \"./agents/index\";\nexport {\n MANIFEST_END,\n MANIFEST_START,\n type ProjectManifest,\n parseManifestFromOutput,\n projectManifestSchema,\n} from \"./cli/discover\";\nexport type {\n AgentRegistry,\n AgentRegistryEntry,\n GenerateOpts,\n GenerateResult,\n} from \"./platform/agent-handle\";\nexport { AgentHandle } from \"./platform/agent-handle\";\nexport { AgentThread } from \"./platform/agents\";\nexport { PlatformClient } from \"./platform/client\";\nexport { PlatformError } from \"./platform/http\";\nexport type {\n AgentEvent,\n AgentInfo,\n AgentSchema,\n ConnectorSchema,\n PaginatedResponse,\n PaginationParams,\n PlatformClientConfig,\n QueryColumn,\n QueryInfo,\n QueryResult,\n QuerySchema,\n RunEvent,\n RunRecord,\n RunState,\n SkillSchema,\n StartRunParams,\n ThreadInfo,\n ThreadMessage,\n} from \"./platform/types\";\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 * 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\nimport * as z from \"zod\";\n\nexport const environmentSchema = z.enum([\"dev\", \"staging\", \"prod\"]);\n\nexport type Environment = z.infer<typeof environmentSchema>;\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport * 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","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport * 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","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport type { ModelString } from \"kraken-ai\";\nimport * as z from \"zod\";\nimport { actionsConfigSchema, type PlatformActionsConfig } from \"./action\";\nimport { environmentSchema } from \"./environment\";\nimport { identityConfigSchema } from \"./identity\";\nimport { notificationConfigSchema } from \"./notifications\";\nimport type { AgentId } from \"./registry\";\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 team: teamConfigSchema.optional(),\n notifications: notificationConfigSchema.optional(),\n environment: environmentSchema.optional(),\n actions: actionsConfigSchema.optional(),\n })\n .strict();\n\nexport type PlatformAgentConfig = Omit<\n z.infer<typeof platformAgentConfigSchema>,\n \"agent\" | \"actions\"\n> & {\n agent: AgentDefinition;\n actions?: PlatformActionsConfig;\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 /** 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 AgentId string. */\nexport type TeamMember = PlatformAgent | AgentId;\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport * 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","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport * 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","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport * 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","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport * 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 type { ZodType } from \"zod\";\nimport { SecurityError } from \"./errors\";\nimport type { PlatformActions } from \"./types/action\";\nimport type { PlatformConnector } from \"./types/connector\";\nimport {\n type PlatformAgent,\n type PlatformAgentConfig,\n platformAgentConfigSchema,\n type TeamMember,\n} from \"./types/index\";\nimport type { ConnectorRef, SkillRef } from \"./types/refs\";\nimport type { PlatformSkill } from \"./types/skill\";\n\nconst FORBIDDEN_AGENT_KEYS = [\"tools\", \"team\", \"kernel\"] as const;\n\n/** Duck-type check for Agent instance (has `definition`, `name`, `run`). */\nconst isAgentInstance = (\n value: unknown,\n): value is {\n definition: Record<string, unknown>;\n name: string;\n run: (...args: unknown[]) => unknown;\n} =>\n value != null &&\n typeof value === \"object\" &&\n \"definition\" in value &&\n \"name\" in value &&\n \"run\" in value &&\n typeof (value as Record<string, unknown>).run === \"function\";\n\nconst assertNoInjection = (agent: unknown): void => {\n if (agent == null || typeof agent !== \"object\") return;\n if (isAgentInstance(agent)) return;\n\n for (const key of FORBIDDEN_AGENT_KEYS) {\n if (key in agent) {\n throw new SecurityError(\n `\"agent.${key}\" is not allowed in PlatformAgentConfig. ` +\n `Tools come from \"connectors\", team members from \"team.members\". ` +\n `All are platform-managed and injected via the governance gateway.`,\n );\n }\n }\n};\n\nconst isPlatformSkill = (v: unknown): v is PlatformSkill =>\n v != null && typeof v === \"object\" && (v as Record<string, unknown>).__type === \"PlatformSkill\";\n\nconst isPlatformConnector = (v: unknown): v is PlatformConnector =>\n v != null &&\n typeof v === \"object\" &&\n (v as Record<string, unknown>).__type === \"PlatformConnector\";\n\nconst isPlatformAgent = (v: unknown): v is PlatformAgent =>\n v != null && typeof v === \"object\" && (v as Record<string, unknown>).__type === \"PlatformAgent\";\n\n// PlatformSkill → extract name; SkillId (string literal after `kraken generate`) → passthrough.\nconst normalizeSkillRef = (ref: SkillRef): string => (isPlatformSkill(ref) ? ref.name : ref);\n\n// When ConnectorId is the error-message type (before `kraken generate`),\n// only the PlatformConnector branch is reachable in practice.\nconst normalizeConnectorRef = (ref: ConnectorRef): string =>\n isPlatformConnector(ref) ? ref.name : ref;\n\nconst normalizeTeamMember = (ref: TeamMember): string =>\n isPlatformAgent(ref) ? ref.config.agent.name : ref;\n\ntype AgentInputField =\n | (Omit<PlatformAgentConfig[\"agent\"], \"skills\"> & { outputSchema?: ZodType; skills?: SkillRef[] })\n | { definition: Record<string, unknown>; name: string; run: (...args: unknown[]) => unknown };\n\nconst isPlatformActions = (v: unknown): v is PlatformActions =>\n v != null && typeof v === \"object\" && (v as Record<string, unknown>).__type === \"PlatformActions\";\n\ninterface PlatformAgentInputConfig\n extends Omit<PlatformAgentConfig, \"agent\" | \"connectors\" | \"team\" | \"actions\"> {\n agent: AgentInputField;\n connectors?: ConnectorRef[];\n team?: Omit<PlatformAgentConfig[\"team\"] & object, \"members\"> & { members: TeamMember[] };\n actions?: PlatformActions;\n}\n\nexport const definePlatformAgent = <TOutput extends ZodType = ZodType>(\n config: PlatformAgentInputConfig & { agent: AgentInputField & { outputSchema?: TOutput } },\n): PlatformAgent & { outputSchema?: TOutput } => {\n assertNoInjection(config.agent);\n\n let agentDef: Record<string, unknown>;\n let runtime: unknown;\n let outputSchema: TOutput | undefined;\n\n if (isAgentInstance(config.agent)) {\n agentDef = config.agent.definition;\n runtime = config.agent;\n } else {\n const {\n outputSchema: os,\n skills: rawSkills,\n ...rest\n } = config.agent as PlatformAgentConfig[\"agent\"] & {\n outputSchema?: TOutput;\n skills?: SkillRef[];\n };\n agentDef = {\n ...rest,\n skills: rawSkills?.map(normalizeSkillRef),\n };\n outputSchema = os;\n }\n\n const normalizedConnectors = config.connectors?.map(normalizeConnectorRef);\n const normalizedTeam = config.team\n ? { ...config.team, members: config.team.members.map(normalizeTeamMember) }\n : undefined;\n\n // Preserve PlatformAgent team members for dev mode delegation\n const teamAgents = config.team?.members.filter((m): m is PlatformAgent => isPlatformAgent(m));\n\n // Extract serializable actions config and preserve Zod schemas + handlers separately\n let actionsConfig: PlatformAgentConfig[\"actions\"];\n let actionZodSchemas: PlatformAgent[\"actionZodSchemas\"];\n let actionHandlers: PlatformAgent[\"actionHandlers\"];\n if (config.actions && isPlatformActions(config.actions)) {\n actionsConfig = config.actions.config;\n actionZodSchemas = config.actions.zodSchemas;\n const h = config.actions.handlers;\n actionHandlers = Object.keys(h).length > 0 ? h : undefined;\n }\n\n const parsed = platformAgentConfigSchema.parse({\n ...config,\n agent: agentDef,\n connectors: normalizedConnectors,\n team: normalizedTeam,\n actions: actionsConfig,\n });\n\n return {\n __type: \"PlatformAgent\" as const,\n config: parsed as PlatformAgentConfig,\n runtime,\n outputSchema,\n actionZodSchemas,\n actionHandlers,\n teamAgents: teamAgents && teamAgents.length > 0 ? teamAgents : undefined,\n };\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 type * as z from \"zod\";\nimport type { ConnectorDefinition, ConnectorToolDef, PlatformConnector } from \"./types/connector\";\n\n/**\n * Define a connector tool.\n *\n * Infers handler arg types from the `input` schema.\n */\nexport const defineTool = <T extends z.ZodType>(def: ConnectorToolDef<T>): ConnectorToolDef<T> =>\n def;\n\nexport const defineConnector = <const T extends ConnectorDefinition>(\n input: T,\n): PlatformConnector => {\n if (!input.name || input.name.length === 0) {\n throw new Error(\"Connector name must not be empty\");\n }\n\n const tools = input.tools ? Object.freeze({ ...input.tools }) : undefined;\n const resources = input.resources ? Object.freeze({ ...input.resources }) : undefined;\n const prompts = input.prompts ? Object.freeze({ ...input.prompts }) : undefined;\n\n return Object.freeze({\n __type: \"PlatformConnector\" as const,\n name: input.name,\n description: input.description,\n instructions: input.instructions,\n tools,\n resources,\n prompts,\n });\n};\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport { type PlatformSkill, platformSkillInputSchema } from \"./types/skill\";\n\nexport const defineSkill = (input: { name: string; description?: string }): PlatformSkill => {\n const parsed = platformSkillInputSchema.parse(input);\n return Object.freeze({\n __type: \"PlatformSkill\" as const,\n name: parsed.name,\n description: parsed.description,\n });\n};\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport * as z from \"zod\";\nimport type { PlatformAgentConfig } from \"../agents/types/index\";\nimport { platformAgentConfigSchema } from \"../agents/types/index\";\nimport { warn } from \"./log\";\nimport { ENTITY_NAME_REGEX, isValidEntityName, isValidSkillName } from \"./validate\";\n\n// ─── Sentinel Markers ───\n\nexport const MANIFEST_START = \"---KRAKEN-MANIFEST-START---\";\nexport const MANIFEST_END = \"---KRAKEN-MANIFEST-END---\";\n\n// ─── Project Manifest Schema ───\n\nconst skillEntrySchema = z.object({\n name: z.string().min(1),\n path: z.string().min(1),\n content: z.string(),\n});\n\nconst connectorEntrySchema = z.object({\n name: z.string().min(1),\n path: z.string().min(1),\n});\n\nconst agentEntrySchema = z.object({\n name: z.string().min(1),\n entryPoint: z.string().min(1),\n config: platformAgentConfigSchema,\n});\n\nexport const projectManifestSchema = z.object({\n agents: z.array(agentEntrySchema),\n skills: z.array(skillEntrySchema),\n connectors: z.array(connectorEntrySchema),\n});\n\nexport type ProjectManifest = z.infer<typeof projectManifestSchema>;\n\n// ─── tsx Availability ───\n\n/** Check whether tsx is registered as an ESM loader. The platform image and\n * intake container set `NODE_OPTIONS=--import tsx/esm` so this env-var check\n * is the canonical detection signal. */\nexport const isTsxAvailable = (): boolean => process.env.NODE_OPTIONS?.includes(\"tsx\") === true;\n\n// ─── Agent Discovery ───\n\nconst isPlatformAgentExport = (\n value: unknown,\n): value is { __type: \"PlatformAgent\"; config: PlatformAgentConfig } =>\n value != null &&\n typeof value === \"object\" &&\n (value as Record<string, unknown>).__type === \"PlatformAgent\" &&\n \"config\" in value;\n\ninterface DiscoveredAgent {\n config: PlatformAgentConfig;\n entryPoint: string;\n}\n\nexport const discoverAgents = async (projectRoot: string): Promise<DiscoveredAgent[]> => {\n const distAgentsDir = path.join(projectRoot, \"dist\", \"agents\");\n const useDistAgents = fs.existsSync(distAgentsDir) && fs.statSync(distAgentsDir).isDirectory();\n const agentsDir = useDistAgents ? distAgentsDir : path.join(projectRoot, \"agents\");\n const agentsDirPrefix = useDistAgents ? \"dist/agents\" : \"agents\";\n\n if (!fs.existsSync(agentsDir) || !fs.statSync(agentsDir).isDirectory()) {\n return [];\n }\n\n const tsxEnabled = isTsxAvailable();\n const files = fs\n .readdirSync(agentsDir)\n .filter((f) => f.endsWith(\".js\") || f.endsWith(\".mjs\") || (tsxEnabled && f.endsWith(\".ts\")))\n .sort();\n\n const seen = new Map<string, DiscoveredAgent>();\n\n for (const file of files) {\n const filePath = path.join(agentsDir, file);\n try {\n const mod = (await import(pathToFileURL(filePath).href)) as Record<string, unknown>;\n const exported = mod.default;\n if (isPlatformAgentExport(exported) && !seen.has(exported.config.agent.name)) {\n seen.set(exported.config.agent.name, {\n config: exported.config,\n entryPoint: `${agentsDirPrefix}/${file}`,\n });\n }\n } catch (err) {\n warn(\n `Skipping ${agentsDirPrefix}/${file}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n return [...seen.values()];\n};\n\n// ─── Skill Discovery ───\n\nconst MAX_SKILL_SIZE = 100 * 1024; // 100KB\n\nconst discoverSkills = (projectRoot: string): ProjectManifest[\"skills\"] => {\n const skillsDir = path.join(projectRoot, \"skills\");\n\n if (!fs.existsSync(skillsDir) || !fs.statSync(skillsDir).isDirectory()) {\n return [];\n }\n\n const files = fs.readdirSync(skillsDir).sort();\n\n const skills: ProjectManifest[\"skills\"] = [];\n\n for (const file of files) {\n if (!file.endsWith(\".md\")) {\n warn(`Skipping skills/${file}: skill files must have a .md extension.`);\n continue;\n }\n\n const basename = file.replace(/\\.md$/, \"\");\n if (!isValidSkillName(basename)) {\n warn(\n `Skipping skills/${file}: name must match [a-zA-Z0-9-] (letters, digits, hyphens only).`,\n );\n continue;\n }\n\n const filePath = path.join(skillsDir, file);\n const stat = fs.statSync(filePath);\n if (stat.size > MAX_SKILL_SIZE) {\n warn(`Skipping skills/${file}: exceeds ${MAX_SKILL_SIZE} byte limit.`);\n continue;\n }\n\n const content = fs.readFileSync(filePath, \"utf-8\");\n skills.push({ name: file, path: `skills/${file}`, content });\n }\n\n return skills;\n};\n\n// ─── Connector Discovery ───\n\nconst discoverConnectors = (projectRoot: string): ProjectManifest[\"connectors\"] => {\n const distConnectorsDir = path.join(projectRoot, \"dist\", \"connectors\");\n const useDistConnectors =\n fs.existsSync(distConnectorsDir) && fs.statSync(distConnectorsDir).isDirectory();\n const connectorsDir = useDistConnectors\n ? distConnectorsDir\n : path.join(projectRoot, \"connectors\");\n const connectorsDirPrefix = useDistConnectors ? \"dist/connectors\" : \"connectors\";\n\n if (!fs.existsSync(connectorsDir) || !fs.statSync(connectorsDir).isDirectory()) {\n return [];\n }\n\n const entries = fs.readdirSync(connectorsDir, { withFileTypes: true });\n const connectors: ProjectManifest[\"connectors\"] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const name = entry.name;\n if (!isValidEntityName(name)) {\n warn(\n `Skipping ${connectorsDirPrefix}/${name}: name must match [a-z0-9-] (lowercase, digits, hyphens only).`,\n );\n continue;\n }\n\n const connDir = path.join(connectorsDir, name);\n const hasPackageJson = fs.existsSync(path.join(connDir, \"package.json\"));\n const hasDockerfile = fs.existsSync(path.join(connDir, \"Dockerfile\"));\n const hasIndexJs = fs.existsSync(path.join(connDir, \"index.js\"));\n const hasIndexMjs = fs.existsSync(path.join(connDir, \"index.mjs\"));\n const hasIndexTs = fs.existsSync(path.join(connDir, \"index.ts\"));\n\n if (!hasPackageJson && !hasDockerfile && !hasIndexJs && !hasIndexMjs && !hasIndexTs) {\n continue;\n }\n\n connectors.push({ name, path: `${connectorsDirPrefix}/${name}/` });\n }\n\n return connectors.sort((a, b) => a.name.localeCompare(b.name));\n};\n\n// ─── Full Project Discovery ───\n\nexport const discoverProject = async (projectRoot: string): Promise<ProjectManifest> => {\n const discovered = await discoverAgents(projectRoot);\n\n const agents: ProjectManifest[\"agents\"] = [];\n for (const { config, entryPoint } of discovered) {\n const name = config.agent.name;\n if (!isValidEntityName(name)) {\n throw new Error(`Invalid agent name: \"${name}\". Names must match ${ENTITY_NAME_REGEX}`);\n }\n agents.push({ name, entryPoint, config });\n }\n\n const skills = discoverSkills(projectRoot);\n const connectors = discoverConnectors(projectRoot);\n\n return { agents, skills, connectors };\n};\n\n// ─── Manifest Output ───\n\n/** Output manifest between sentinel markers for orchestrator parsing. */\nexport const emitManifest = (manifest: ProjectManifest): void => {\n process.stdout.write(`${MANIFEST_START}\\n`);\n process.stdout.write(JSON.stringify(manifest));\n process.stdout.write(`\\n${MANIFEST_END}\\n`);\n};\n\n/** Parse manifest from stdout that may contain noise before/after sentinel markers. */\nexport const parseManifestFromOutput = (stdout: string): ProjectManifest => {\n const startIdx = stdout.indexOf(MANIFEST_START);\n const endIdx = stdout.indexOf(MANIFEST_END);\n\n if (startIdx === -1 || endIdx === -1 || endIdx <= startIdx) {\n throw new Error(\"Discovery produced no output: sentinel markers not found\");\n }\n\n const jsonStr = stdout.slice(startIdx + MANIFEST_START.length, endIdx).trim();\n\n let raw: unknown;\n try {\n raw = JSON.parse(jsonStr);\n } catch {\n throw new Error(`Discovery produced invalid JSON: ${jsonStr.slice(0, 200)}`);\n }\n\n const result = projectManifestSchema.safeParse(raw);\n if (!result.success) {\n throw new Error(`Discovery produced invalid manifest: ${result.error.message}`);\n }\n\n return result.data;\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 { PlatformClientConfig } from \"./types\";\n\nexport class PlatformError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n ) {\n super(message);\n this.name = \"PlatformError\";\n }\n}\n\nexport class HttpClient {\n readonly baseUrlForStream: string;\n private readonly baseUrl: string;\n private readonly apiKey: string;\n\n constructor(config: PlatformClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/+$/, \"\");\n this.baseUrlForStream = this.baseUrl;\n this.apiKey = config.apiKey;\n\n const isLocalhost = this.baseUrl.includes(\"localhost\") || this.baseUrl.includes(\"127.0.0.1\");\n if (this.baseUrl.startsWith(\"http://\") && !isLocalhost) {\n console.warn(\n \"[kraken-ai] WARNING: baseUrl does not use HTTPS. API keys will be sent in plaintext.\",\n );\n }\n }\n\n async get<T>(path: string, params?: Record<string, string>): Promise<T> {\n const url = this.buildUrl(path, params);\n const response = await fetch(url, {\n method: \"GET\",\n headers: this.authHeaders(),\n });\n return this.handleResponse<T>(response);\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n const response = await fetch(this.buildUrl(path), {\n method: \"POST\",\n headers: { ...this.authHeaders(), \"Content-Type\": \"application/json\" },\n body: body ? JSON.stringify(body) : undefined,\n });\n return this.handleResponse<T>(response);\n }\n\n async postStream(path: string, body: unknown, signal?: AbortSignal): Promise<Response> {\n const response = await fetch(this.buildUrl(path), {\n method: \"POST\",\n headers: {\n ...this.authHeaders(),\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n },\n body: JSON.stringify(body),\n signal,\n });\n if (!response.ok) {\n const err = (await response.json().catch(() => ({ error: \"Unknown error\" }))) as {\n error: string;\n };\n throw new PlatformError(err.error ?? \"Unknown error\", response.status);\n }\n return response;\n }\n\n private buildUrl(path: string, params?: Record<string, string>): string {\n const url = `${this.baseUrl}${path}`;\n if (!params || Object.keys(params).length === 0) return url;\n const qs = new URLSearchParams(params).toString();\n return `${url}?${qs}`;\n }\n\n authHeaders(): Record<string, string> {\n return { Authorization: `Bearer ${this.apiKey}` };\n }\n\n private async handleResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n const body = (await response.json().catch(() => ({ error: \"Unknown error\" }))) as {\n error: string;\n };\n throw new PlatformError(body.error ?? \"Unknown error\", response.status);\n }\n return response.json() as Promise<T>;\n }\n}\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport type { AgentEvent } from \"./types\";\n\nconst VALID_EVENT_TYPES = new Set([\n \"text\",\n \"tool_call\",\n \"tool_result\",\n \"thinking\",\n \"action\",\n \"done\",\n \"error\",\n]);\n\nexport async function* parseSSEStream(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<AgentEvent> {\n const decoder = new TextDecoder();\n const reader = stream.getReader();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n const parts = buffer.split(\"\\n\\n\");\n // Last part is incomplete — keep it in buffer\n buffer = parts.pop() ?? \"\";\n\n for (const part of parts) {\n const event = parseBlock(part);\n if (event) yield event;\n }\n }\n\n // Process any remaining buffer\n if (buffer.trim()) {\n const event = parseBlock(buffer);\n if (event) yield event;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nconst parseBlock = (block: string): AgentEvent | null => {\n let eventType: string | null = null;\n let data: string | null = null;\n\n for (const line of block.split(\"\\n\")) {\n if (line.startsWith(\":\")) continue; // comment\n if (line.startsWith(\"event: \")) {\n eventType = line.slice(7).trim();\n } else if (line.startsWith(\"data: \")) {\n data = line.slice(6);\n }\n }\n\n if (!eventType || !data || !VALID_EVENT_TYPES.has(eventType)) return null;\n\n try {\n const parsed = JSON.parse(data) as Record<string, unknown>;\n return { type: eventType, ...parsed } as AgentEvent;\n } catch {\n return null;\n }\n};\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport type { HttpClient } from \"./http\";\nimport { PlatformError } from \"./http\";\nimport { parseSSEStream } from \"./sse\";\nimport type { AgentEvent } from \"./types\";\n\n// --- Public types ---\n\nexport interface AgentRegistryEntry {\n input: unknown;\n output: unknown;\n actions: Record<string, unknown>;\n}\n\n/**\n * Augmentable agent registry — `kraken generate` populates this via\n * `declare module \"@kraken-ai/platform\" { interface AgentRegistry { ... } }`.\n * When populated, `client.agent(\"id\")` infers input/output/actions automatically.\n */\n// biome-ignore lint/complexity/noBannedTypes: must be an empty interface for module augmentation\nexport type AgentRegistry = {};\n\nexport interface GenerateOpts {\n signal?: AbortSignal;\n}\n\nexport interface GenerateResult<T extends AgentRegistryEntry> {\n readonly threadId: string;\n stream(): AsyncIterable<AgentEvent>;\n readonly result: Promise<T[\"output\"]>;\n}\n\n// --- Deferred promise helper ---\n\ninterface Deferred<T> {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n}\n\nconst deferred = <T>(): Deferred<T> => {\n let resolve: (value: T) => void;\n let reject: (error: Error) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n // biome-ignore lint/style/noNonNullAssertion: assigned synchronously in Promise constructor\n return { promise, resolve: resolve!, reject: reject! };\n};\n\n// --- AgentHandle ---\n\nexport class AgentHandle<T extends AgentRegistryEntry> {\n private readonly actionHandlers = new Map<string, (payload: unknown) => void | Promise<void>>();\n private threadId: string | undefined;\n\n constructor(\n private readonly http: HttpClient,\n private readonly agentId: string,\n opts?: { threadId?: string },\n ) {\n this.threadId = opts?.threadId;\n }\n\n onAction<K extends keyof T[\"actions\"] & string>(\n name: K,\n handler: (payload: T[\"actions\"][K]) => void | Promise<void>,\n ): void {\n this.actionHandlers.set(name, handler as (payload: unknown) => void | Promise<void>);\n }\n\n async generate(input: T[\"input\"], opts?: GenerateOpts): Promise<GenerateResult<T>> {\n if (!this.threadId) {\n const info = await this.http.post<{ id: string }>(`/api/v1/agents/${this.agentId}/threads`);\n this.threadId = info.id;\n }\n\n const response = await this.http.postStream(\n `/api/v1/agents/${this.agentId}/threads/${this.threadId}/messages`,\n { content: typeof input === \"string\" ? input : JSON.stringify(input) },\n opts?.signal,\n );\n\n if (!response.body) {\n throw new PlatformError(\"Response body is empty\", 0);\n }\n\n const rawStream = parseSSEStream(response.body);\n const {\n promise: resultPromise,\n resolve: resolveResult,\n reject: rejectResult,\n } = deferred<T[\"output\"]>();\n\n const actionHandlers = this.actionHandlers;\n const http = this.http;\n const agentId = this.agentId;\n const threadId = this.threadId;\n\n async function* streamWithDispatch(): AsyncGenerator<AgentEvent> {\n try {\n for await (const event of rawStream) {\n if (event.type === \"action\") {\n const handler = actionHandlers.get(event.name);\n if (handler) {\n await handler(event.payload);\n }\n void http\n .post(\n `/api/v1/agents/${agentId}/threads/${threadId}/actions/${event.actionExecutionId}/ack`,\n )\n .catch(() => {\n // Ack failure is non-fatal\n });\n }\n if (event.type === \"done\") {\n resolveResult((event as { output: unknown }).output as T[\"output\"]);\n }\n if (event.type === \"error\") {\n rejectResult(new PlatformError((event as { message: string }).message, 0));\n }\n yield event;\n }\n } catch (err) {\n rejectResult(err instanceof Error ? err : new Error(String(err)));\n throw err;\n }\n }\n\n let streamGenerator: AsyncGenerator<AgentEvent> | null = null;\n let streamStarted = false;\n\n const ensureStream = () => {\n if (!streamGenerator) {\n streamGenerator = streamWithDispatch();\n }\n return streamGenerator;\n };\n\n const backgroundConsume = async () => {\n if (streamStarted) return;\n streamStarted = true;\n const gen = ensureStream();\n for await (const _ of gen) {\n void _;\n }\n };\n\n const result: GenerateResult<T> = {\n threadId,\n stream() {\n streamStarted = true;\n return ensureStream();\n },\n get result() {\n void backgroundConsume();\n return resultPromise;\n },\n };\n\n return result;\n }\n}\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport type { HttpClient } from \"./http\";\nimport { PlatformError } from \"./http\";\nimport { parseSSEStream } from \"./sse\";\nimport type {\n AgentEvent,\n AgentInfo,\n PaginatedResponse,\n PaginationParams,\n ThreadInfo,\n ThreadMessage,\n} from \"./types\";\n\nexport class AgentThread {\n constructor(\n private readonly http: HttpClient,\n private readonly agentId: string,\n public readonly threadId: string,\n ) {}\n\n async sendMessage(\n content: string,\n opts?: { signal?: AbortSignal },\n ): Promise<AsyncIterable<AgentEvent>> {\n const response = await this.http.postStream(\n `/api/v1/agents/${this.agentId}/threads/${this.threadId}/messages`,\n { content },\n opts?.signal,\n );\n if (!response.body) {\n throw new PlatformError(\"Response body is empty\", 0);\n }\n return parseSSEStream(response.body);\n }\n\n async getMessages(params?: PaginationParams): Promise<PaginatedResponse<ThreadMessage>> {\n const qs = buildPaginationQuery(params);\n return this.http.get(`/api/v1/agents/${this.agentId}/threads/${this.threadId}/messages`, qs);\n }\n}\n\nexport class AgentsNamespace {\n constructor(private readonly http: HttpClient) {}\n\n async list(): Promise<AgentInfo[]> {\n const result = await this.http.get<{ data: AgentInfo[] }>(\"/api/v1/agents\");\n return result.data;\n }\n\n async createThread(agentId: string): Promise<AgentThread> {\n const info = await this.http.post<ThreadInfo>(`/api/v1/agents/${agentId}/threads`);\n return new AgentThread(this.http, agentId, info.id);\n }\n\n async getThread(agentId: string, threadId: string): Promise<AgentThread> {\n await this.http.get<ThreadInfo>(`/api/v1/agents/${agentId}/threads/${threadId}`);\n return new AgentThread(this.http, agentId, threadId);\n }\n\n async listThreads(\n agentId: string,\n params?: PaginationParams,\n ): Promise<PaginatedResponse<ThreadInfo>> {\n const qs = buildPaginationQuery(params);\n return this.http.get(`/api/v1/agents/${agentId}/threads`, qs);\n }\n}\n\nconst buildPaginationQuery = (params?: PaginationParams): Record<string, string> | undefined => {\n if (!params) return undefined;\n const qs: Record<string, string> = {};\n if (params.cursor) qs.cursor = params.cursor;\n if (params.limit != null) qs.limit = String(params.limit);\n return Object.keys(qs).length > 0 ? qs : undefined;\n};\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport type { HttpClient } from \"./http\";\nimport type { PaginationParams, QueryInfo, QueryResult } from \"./types\";\n\nexport class DataNamespace {\n constructor(private readonly http: HttpClient) {}\n\n async list(): Promise<QueryInfo[]> {\n const result = await this.http.get<{ data: QueryInfo[] }>(\"/api/v1/data/queries\");\n return result.data;\n }\n\n async describe(queryName: string): Promise<QueryInfo> {\n return this.http.get(`/api/v1/data/queries/${queryName}`);\n }\n\n async query<TRow = Record<string, unknown>>(\n queryName: string,\n params?: Record<string, unknown>,\n pagination?: PaginationParams,\n ): Promise<QueryResult<TRow>> {\n return this.http.post(`/api/v1/data/queries/${queryName}/execute`, {\n params,\n ...pagination,\n });\n }\n}\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport * as z from \"zod\";\nimport type { HttpClient } from \"./http\";\n\ninterface QuerySchema<P extends z.ZodType, R extends z.ZodType> {\n params: P;\n returns: R;\n}\n\nexport class PipelinesNamespace {\n constructor(private readonly http: HttpClient) {}\n\n async query<P extends z.ZodType, R extends z.ZodType>(\n pipeline: string,\n queryName: string,\n schema: QuerySchema<P, R>,\n params: z.infer<P>,\n ): Promise<z.infer<R>[]> {\n const result = await this.http.post<{ rows: unknown[] }>(\n `/api/v1/pipelines/${encodeURIComponent(pipeline)}/queries/${encodeURIComponent(queryName)}`,\n params,\n );\n\n try {\n return z.array(schema.returns).parse(result.rows);\n } catch (e) {\n throw new Error(\n `Pipeline schema may have changed — run 'kraken generate' to update types.\\n\\nOriginal error: ${(e as Error).message}`,\n );\n }\n }\n}\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport type { HttpClient } from \"./http\";\nimport { PlatformError } from \"./http\";\nimport type { RunEvent, RunRecord, StartRunParams } from \"./types\";\n\nexport class RunsNamespace {\n constructor(private readonly http: HttpClient) {}\n\n async start(params: StartRunParams): Promise<{ runId: string }> {\n return this.http.post(\"/api/v1/runs\", params);\n }\n\n async get(runId: string): Promise<RunRecord> {\n return this.http.get(`/api/v1/runs/${runId}`);\n }\n\n async cancel(runId: string): Promise<{ success: boolean }> {\n return this.http.post(`/api/v1/runs/${runId}/cancel`);\n }\n\n async getEvents(\n runId: string,\n opts?: { afterEventId?: string },\n ): Promise<{ events: RunEvent[] }> {\n const params = opts?.afterEventId ? { afterEventId: opts.afterEventId } : undefined;\n return this.http.get(`/api/v1/runs/${runId}/events`, params);\n }\n\n async *streamEvents(runId: string, opts?: { signal?: AbortSignal }): AsyncGenerator<RunEvent> {\n const response = await fetch(\n `${this.http.baseUrlForStream}/api/v1/runs/${runId}/events/stream`,\n {\n headers: {\n Accept: \"text/event-stream\",\n ...this.http.authHeaders(),\n },\n signal: opts?.signal,\n },\n );\n\n if (!response.ok || !response.body) {\n throw new PlatformError(\"Failed to connect to event stream\", response.status);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n const raw = line.slice(6).trim();\n if (!raw || raw === \"[DONE]\") continue;\n try {\n yield JSON.parse(raw) as RunEvent;\n } catch {\n // skip malformed\n }\n }\n }\n } finally {\n reader.cancel();\n }\n }\n}\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport { AgentHandle, type AgentRegistry, type AgentRegistryEntry } from \"./agent-handle\";\nimport { AgentsNamespace } from \"./agents\";\nimport { DataNamespace } from \"./data\";\nimport { HttpClient, PlatformError } from \"./http\";\nimport { PipelinesNamespace } from \"./pipelines\";\nimport { RunsNamespace } from \"./runs\";\nimport type { PlatformClientConfig } from \"./types\";\n\n/** Resolve agent type: if K is a known key in AgentRegistry use it, otherwise fall back to AgentRegistryEntry. */\ntype ResolveAgent<K extends string> = K extends keyof AgentRegistry\n ? AgentRegistry[K]\n : AgentRegistryEntry;\n\nexport class PlatformClient {\n public readonly agents: AgentsNamespace;\n public readonly data: DataNamespace;\n public readonly pipelines: PipelinesNamespace;\n public readonly runs: RunsNamespace;\n private readonly http: HttpClient;\n\n constructor(config: PlatformClientConfig) {\n if (!config.baseUrl) throw new Error(\"baseUrl is required\");\n if (!config.apiKey) throw new Error(\"apiKey is required\");\n\n this.http = new HttpClient(config);\n this.agents = new AgentsNamespace(this.http);\n this.data = new DataNamespace(this.http);\n this.pipelines = new PipelinesNamespace(this.http);\n this.runs = new RunsNamespace(this.http);\n }\n\n agent<K extends string>(\n id: K,\n opts?: { mode?: \"local\" | \"remote\"; threadId?: string },\n ): AgentHandle<ResolveAgent<K>> {\n if (opts?.mode === \"local\") {\n throw new PlatformError(\"Local mode not yet implemented\", 0);\n }\n return new AgentHandle<ResolveAgent<K>>(this.http, id, {\n threadId: opts?.threadId,\n });\n }\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z","z","z","z","path","z"]}
1
+ {"version":3,"sources":["../src/index.ts","../../../../private-packages/platform-core/src/errors.ts","../../../../private-packages/platform-core/src/qualified-name.ts","../../../../private-packages/platform-core/src/types/action.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-server.ts","../src/agents/connector-wrap.ts","../src/agents/define.ts","../src/agents/define-actions.ts","../src/agents/define-connector.ts","../src/agents/define-skill.ts","../src/cli/discover.ts","../src/cli/log.ts","../src/internal/secret-string.ts","../src/platform/http.ts","../src/platform/sse.ts","../src/platform/agent-handle.ts","../src/platform/agents.ts","../src/cli/credentials.ts","../src/platform/data.ts","../src/platform/pipelines.ts","../src/platform/runs.ts","../src/platform/client.ts"],"sourcesContent":["// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nexport { isQualified, parse, qualify } from \"@kraken-ai/platform-core\";\nexport {\n ACTION_NAME_REGEX,\n type ActionConfig,\n type ActionId,\n type ActionRef,\n type ActionVariantInput,\n type AgentDefinition,\n type AgentId,\n buildActionOutputSchema,\n type ConcurrencyPolicy,\n type ConnectorDefinition,\n ConnectorError,\n type ConnectorHandlerContext,\n type ConnectorHandlerResult,\n type ConnectorId,\n type ConnectorPromptDef,\n type ConnectorRef,\n type ConnectorResourceDef,\n type ConnectorToolDef,\n defineAction,\n defineConnector,\n definePlatformAgent,\n defineSkill,\n defineTool,\n type Environment,\n type GetPromptResult,\n type IdentityConfig,\n isValidActionName,\n type JitPolicy,\n type KrakenTypeRegistry,\n type McpContent,\n mcpResult,\n type NotificationConfig,\n type PlatformAction,\n type PlatformAgent,\n type PlatformAgentConfig,\n type PlatformConnector,\n type PlatformSkill,\n type PromptMessageContent,\n type ReadResourceResult,\n type ResourceContent,\n type ResourceLimits,\n type RetryPolicy,\n SecurityError,\n type SkillId,\n type SkillRef,\n type TeamConfig,\n type TeamMember,\n type ToolAnnotations,\n type TriggerConfig,\n wrapToolError,\n wrapToolResult,\n type z,\n} from \"./agents/index\";\nexport {\n MANIFEST_END,\n MANIFEST_START,\n type ProjectManifest,\n parseManifestFromOutput,\n} from \"./cli/discover\";\nexport type {\n AgentRegistry,\n AgentRegistryEntry,\n GenerateOpts,\n GenerateResult,\n} from \"./platform/agent-handle\";\nexport { AgentHandle } from \"./platform/agent-handle\";\nexport { AgentThread } from \"./platform/agents\";\nexport { PlatformClient } from \"./platform/client\";\nexport { PlatformError } from \"./platform/http\";\nexport type {\n ActionSchema,\n AgentEvent,\n AgentInfo,\n AgentSchema,\n ConnectorSchema,\n PaginatedResponse,\n PaginationParams,\n PlatformClientConfig,\n QueryColumn,\n QueryInfo,\n QueryResult,\n QuerySchema,\n RunEvent,\n RunRecord,\n RunState,\n SkillSchema,\n StartRunParams,\n ThreadInfo,\n ThreadMessage,\n} from \"./platform/types\";\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 type * 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 in defineAction(). */\nexport interface ActionVariantInput<\n S extends z.ZodObject<z.ZodRawShape> = z.ZodObject<z.ZodRawShape>,\n> {\n name: string;\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 (stored in manifest/DB). */\nexport interface ActionConfig {\n schema: Record<string, unknown>;\n webhook?: string;\n hasHandler: boolean;\n}\n\n/** Branded action type returned by defineAction(). */\nexport interface PlatformAction {\n readonly __type: \"PlatformAction\";\n readonly name: string;\n readonly config: ActionConfig;\n readonly zodSchema: z.ZodObject<z.ZodRawShape>;\n readonly handler?: (payload: unknown) => Promise<void>;\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 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 { 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","// 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 {\n type PlatformAction,\n type PlatformAgent,\n type PlatformAgentConfig,\n type PlatformConnector,\n type PlatformSkill,\n platformAgentConfigSchema,\n SecurityError,\n} from \"@kraken-ai/platform-core\";\nimport type { ZodType } from \"zod\";\nimport type { TeamMember } from \"./types/index\";\nimport type { ActionRef, ConnectorRef, SkillRef } from \"./types/refs\";\n\nconst FORBIDDEN_AGENT_KEYS = [\"tools\", \"team\", \"kernel\"] as const;\n\n/** Duck-type check for Agent instance (has `definition`, `name`, `run`). */\nconst isAgentInstance = (\n value: unknown,\n): value is {\n definition: Record<string, unknown>;\n name: string;\n run: (...args: unknown[]) => unknown;\n} =>\n value != null &&\n typeof value === \"object\" &&\n \"definition\" in value &&\n \"name\" in value &&\n \"run\" in value &&\n typeof (value as Record<string, unknown>).run === \"function\";\n\nconst assertNoInjection = (agent: unknown): void => {\n if (agent == null || typeof agent !== \"object\") return;\n if (isAgentInstance(agent)) return;\n\n for (const key of FORBIDDEN_AGENT_KEYS) {\n if (key in agent) {\n throw new SecurityError(\n `\"agent.${key}\" is not allowed in PlatformAgentConfig. ` +\n `Tools come from \"connectors\", team members from \"team.members\". ` +\n `All are platform-managed and injected via the governance gateway.`,\n );\n }\n }\n};\n\nconst isPlatformSkill = (v: unknown): v is PlatformSkill =>\n v != null && typeof v === \"object\" && (v as Record<string, unknown>).__type === \"PlatformSkill\";\n\nconst isPlatformConnector = (v: unknown): v is PlatformConnector =>\n v != null &&\n typeof v === \"object\" &&\n (v as Record<string, unknown>).__type === \"PlatformConnector\";\n\nconst isPlatformAgent = (v: unknown): v is PlatformAgent =>\n v != null && typeof v === \"object\" && (v as Record<string, unknown>).__type === \"PlatformAgent\";\n\n// PlatformSkill → extract name; SkillId (string literal after `kraken generate`) → passthrough.\nconst normalizeSkillRef = (ref: SkillRef): string => (isPlatformSkill(ref) ? ref.name : ref);\n\n// When ConnectorId is the error-message type (before `kraken generate`),\n// only the PlatformConnector branch is reachable in practice.\nconst normalizeConnectorRef = (ref: ConnectorRef): string =>\n isPlatformConnector(ref) ? ref.name : ref;\n\nconst normalizeTeamMember = (ref: TeamMember): string =>\n isPlatformAgent(ref) ? ref.config.agent.name : ref;\n\ntype AgentInputField =\n | (Omit<PlatformAgentConfig[\"agent\"], \"skills\"> & { outputSchema?: ZodType; skills?: SkillRef[] })\n | { definition: Record<string, unknown>; name: string; run: (...args: unknown[]) => unknown };\n\nconst isPlatformAction = (v: unknown): v is PlatformAction =>\n v != null && typeof v === \"object\" && (v as Record<string, unknown>).__type === \"PlatformAction\";\n\nconst normalizeActionRef = (ref: ActionRef): string => (isPlatformAction(ref) ? ref.name : ref);\n\ninterface PlatformAgentInputConfig\n extends Omit<PlatformAgentConfig, \"agent\" | \"connectors\" | \"team\" | \"actions\"> {\n agent: AgentInputField;\n connectors?: ConnectorRef[];\n team?: Omit<PlatformAgentConfig[\"team\"] & object, \"members\"> & { members: TeamMember[] };\n actions?: ActionRef[];\n}\n\n/**\n * Define a platform agent with its model, triggers, connectors, and\n * governance configuration.\n *\n * This is the main entry point for declaring an agent. The config is\n * validated at definition time (via Zod) and the returned object is\n * ready to be registered with the platform server.\n *\n * @param config - Agent definition and platform configuration.\n * @returns A frozen {@link PlatformAgent} object.\n * @throws {SecurityError} If `agent` contains forbidden keys (`tools`,\n * `team`, `kernel`) — those are platform-managed.\n *\n * @example\n * ```ts\n * import { definePlatformAgent } from \"@kraken-ai/platform\";\n *\n * export default definePlatformAgent({\n * agent: {\n * name: \"market-intel\",\n * model: \"anthropic/claude-sonnet-4-20250514\",\n * instructions: \"You are a market research analyst.\",\n * temperature: 0.3,\n * },\n * triggers: [{ type: \"manual\" }],\n * connectors: [jiraConnector, slackConnector],\n * resources: { maxTokens: 100_000, maxCostUsd: 5 },\n * });\n * ```\n *\n * @example\n * With skills, team, and actions:\n * ```ts\n * export default definePlatformAgent({\n * agent: {\n * name: \"research-lead\",\n * model: \"anthropic/claude-sonnet-4-20250514\",\n * instructions: \"Coordinate research across the team.\",\n * skills: [deepDiveSkill],\n * },\n * triggers: [\n * { type: \"cron\", expression: \"0 9 * * MON\" },\n * { type: \"webhook\", path: \"/research\", method: \"POST\" },\n * ],\n * team: { members: [analystAgent, writerAgent], maxConcurrentWorkers: 2 },\n * actions,\n * environment: \"prod\",\n * });\n * ```\n */\nexport const definePlatformAgent = <TOutput extends ZodType = ZodType>(\n config: PlatformAgentInputConfig & { agent: AgentInputField & { outputSchema?: TOutput } },\n): PlatformAgent & { outputSchema?: TOutput } => {\n assertNoInjection(config.agent);\n\n let agentDef: Record<string, unknown>;\n let runtime: unknown;\n let outputSchema: TOutput | undefined;\n\n if (isAgentInstance(config.agent)) {\n agentDef = config.agent.definition;\n runtime = config.agent;\n } else {\n const {\n outputSchema: os,\n skills: rawSkills,\n ...rest\n } = config.agent as PlatformAgentConfig[\"agent\"] & {\n outputSchema?: TOutput;\n skills?: SkillRef[];\n };\n agentDef = {\n ...rest,\n skills: rawSkills?.map(normalizeSkillRef),\n };\n outputSchema = os;\n }\n\n const normalizedConnectors = config.connectors?.map(normalizeConnectorRef);\n const normalizedTeam = config.team\n ? { ...config.team, members: config.team.members.map(normalizeTeamMember) }\n : undefined;\n\n // Preserve PlatformAgent team members for dev mode delegation\n const teamAgents = config.team?.members.filter((m): m is PlatformAgent => isPlatformAgent(m));\n\n // Extract action names for serializable config, preserve runtime fields\n const actionObjects = config.actions?.filter((a): a is PlatformAction => isPlatformAction(a));\n const normalizedActions = config.actions?.map(normalizeActionRef);\n\n let actionZodSchemas: PlatformAgent[\"actionZodSchemas\"];\n let actionHandlers: PlatformAgent[\"actionHandlers\"];\n let actionWebhooks: PlatformAgent[\"actionWebhooks\"];\n if (actionObjects && actionObjects.length > 0) {\n const schemas: Record<string, import(\"zod\").ZodObject<import(\"zod\").ZodRawShape>> = {};\n const handlers: Record<string, (payload: unknown) => Promise<void>> = {};\n const webhooks: Record<string, string | undefined> = {};\n for (const action of actionObjects) {\n schemas[action.name] = action.zodSchema;\n if (action.handler) {\n handlers[action.name] = action.handler;\n }\n if (action.config.webhook) {\n webhooks[action.name] = action.config.webhook;\n }\n }\n actionZodSchemas = Object.freeze(schemas);\n actionHandlers = Object.keys(handlers).length > 0 ? Object.freeze(handlers) : undefined;\n actionWebhooks = Object.keys(webhooks).length > 0 ? Object.freeze(webhooks) : undefined;\n }\n\n const parsed = platformAgentConfigSchema.parse({\n ...config,\n agent: agentDef,\n connectors: normalizedConnectors,\n team: normalizedTeam,\n actions: normalizedActions,\n });\n\n return {\n __type: \"PlatformAgent\" as const,\n config: parsed as PlatformAgentConfig,\n runtime,\n outputSchema,\n actionZodSchemas,\n actionHandlers,\n actionWebhooks,\n teamAgents: teamAgents && teamAgents.length > 0 ? teamAgents : undefined,\n };\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\nimport type {\n ConnectorDefinition,\n ConnectorToolDef,\n PlatformConnector,\n} from \"@kraken-ai/platform-core\";\nimport type * as z from \"zod\";\n\n/**\n * Define a single tool for use inside a connector.\n *\n * Accepts a Zod schema as `input` and infers the handler's argument types\n * from it, giving you end-to-end type safety from schema to handler.\n *\n * @example\n * ```ts\n * const add = defineTool({\n * description: \"Add two numbers\",\n * input: z.object({ a: z.number(), b: z.number() }),\n * handler: ({ a, b }) => a + b,\n * });\n * ```\n */\nexport const defineTool = <T extends z.ZodType>(def: ConnectorToolDef<T>): ConnectorToolDef<T> =>\n def;\n\n/**\n * Define a connector that exposes tools, resources, and prompts to AI agents\n * through the Kraken platform.\n *\n * A connector is the primary building block for extending agent capabilities.\n * Each connector is served as an MCP server and can provide:\n *\n * - **Tools** — functions the agent can call (defined with {@link defineTool})\n * - **Resources** — data the agent can read (files, database rows, API responses)\n * - **Prompts** — reusable prompt templates the agent can invoke\n *\n * The returned object is deeply frozen and ready to be passed to the platform\n * server builder.\n *\n * @param input - The connector definition including a unique name and optional\n * tools, resources, and prompts.\n * @returns A frozen {@link PlatformConnector} object.\n * @throws If `name` is empty.\n *\n * @example\n * ```ts\n * import { defineConnector, defineTool } from \"@kraken-ai/platform\";\n * import { z } from \"zod\";\n *\n * export default defineConnector({\n * name: \"math\",\n * description: \"Basic math operations\",\n * tools: {\n * add: defineTool({\n * description: \"Add two numbers\",\n * input: z.object({ a: z.number(), b: z.number() }),\n * handler: ({ a, b }) => a + b,\n * }),\n * },\n * });\n * ```\n */\nexport const defineConnector = <const T extends ConnectorDefinition>(\n input: T,\n): PlatformConnector => {\n if (!input.name || input.name.length === 0) {\n throw new Error(\"Connector name must not be empty\");\n }\n\n const tools = input.tools ? Object.freeze({ ...input.tools }) : undefined;\n const resources = input.resources ? Object.freeze({ ...input.resources }) : undefined;\n const prompts = input.prompts ? Object.freeze({ ...input.prompts }) : undefined;\n\n return Object.freeze({\n __type: \"PlatformConnector\" as const,\n name: input.name,\n description: input.description,\n instructions: input.instructions,\n tools,\n resources,\n prompts,\n });\n};\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport { type PlatformSkill, platformSkillInputSchema } from \"@kraken-ai/platform-core\";\n\n/**\n * Define a reusable skill that can be attached to one or more agents.\n *\n * A skill is a named capability (e.g. \"competitor-deep-dive\") that the\n * platform resolves into the appropriate prompt and tool set at runtime.\n * Skills are referenced by agents via the `skills` array in\n * {@link definePlatformAgent}.\n *\n * @param input - Skill name and optional description.\n * @returns A frozen {@link PlatformSkill} object.\n * @throws If `name` is empty.\n *\n * @example\n * ```ts\n * import { defineSkill, definePlatformAgent } from \"@kraken-ai/platform\";\n *\n * const deepDive = defineSkill({\n * name: \"competitor-deep-dive\",\n * description: \"In-depth competitor analysis with market sizing\",\n * });\n *\n * export default definePlatformAgent({\n * agent: {\n * name: \"analyst\",\n * model: \"anthropic/claude-sonnet-4-20250514\",\n * instructions: \"You are a competitive analyst.\",\n * skills: [deepDive],\n * },\n * triggers: [{ type: \"manual\" }],\n * });\n * ```\n */\nexport const defineSkill = (input: { name: string; description?: string }): PlatformSkill => {\n const parsed = platformSkillInputSchema.parse(input);\n return Object.freeze({\n __type: \"PlatformSkill\" as const,\n name: parsed.name,\n description: parsed.description,\n });\n};\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport {\n type ActionConfig,\n isValidPrimitiveName,\n isValidSkillName,\n type PlatformAgentConfig,\n PRIMITIVE_NAME_REGEX,\n platformAgentConfigSchema,\n} from \"@kraken-ai/platform-core\";\nimport * as z from \"zod\";\nimport { warn } from \"./log\";\n\n// ─── Sentinel Markers ───\n\nexport const MANIFEST_START = \"---KRAKEN-MANIFEST-START---\";\nexport const MANIFEST_END = \"---KRAKEN-MANIFEST-END---\";\n\n// ─── Project Manifest Schema ───\n\nconst skillEntrySchema = z.object({\n name: z.string().min(1),\n path: z.string().min(1),\n content: z.string(),\n});\n\nconst toolSpecSchema = z.object({\n name: z.string(),\n description: z.string(),\n parameters: z.record(z.string(), z.unknown()).default({}),\n annotations: z\n .object({\n readOnlyHint: z.boolean().optional(),\n destructiveHint: z.boolean().optional(),\n idempotentHint: z.boolean().optional(),\n })\n .optional(),\n});\n\nconst resourceSpecSchema = z.object({\n name: z.string(),\n uri: z.string(),\n description: z.string(),\n mimeType: z.string().optional(),\n});\n\nconst promptSpecSchema = z.object({\n name: z.string(),\n description: z.string(),\n arguments: z\n .array(\n z.object({\n name: z.string(),\n description: z.string().optional(),\n required: z.boolean().optional(),\n }),\n )\n .optional(),\n});\n\nconst connectorEntrySchema = z.object({\n name: z.string().min(1),\n path: z.string().min(1),\n toolSpecs: z.array(toolSpecSchema).default([]),\n resourceSpecs: z.array(resourceSpecSchema).default([]),\n promptSpecs: z.array(promptSpecSchema).default([]),\n});\n\nconst agentEntrySchema = z.object({\n name: z.string().min(1),\n entryPoint: z.string().min(1),\n config: platformAgentConfigSchema,\n});\n\nconst actionConfigSchema = z.object({\n schema: z.record(z.string(), z.unknown()),\n webhook: z.string().url().optional(),\n hasHandler: z.boolean(),\n});\n\nconst actionEntrySchema = z.object({\n name: z.string().min(1),\n entryPoint: z.string().min(1),\n config: actionConfigSchema,\n});\n\nexport const projectManifestSchema = z.object({\n agents: z.array(agentEntrySchema),\n skills: z.array(skillEntrySchema),\n connectors: z.array(connectorEntrySchema),\n actions: z.array(actionEntrySchema).default([]),\n});\n\nexport type ProjectManifest = z.infer<typeof projectManifestSchema>;\n\n// ─── tsx Availability ───\n\n/** Check whether tsx is registered as an ESM loader via NODE_OPTIONS. */\nexport const isTsxAvailable = (): boolean => process.env.NODE_OPTIONS?.includes(\"tsx\") === true;\n\n/** Resolve and load tsx/esm from the project's node_modules so .ts files can\n * be dynamically imported. Returns true if tsx is now available. */\nlet tsxLoaded = false;\nconst ensureTsxLoader = async (projectRoot: string): Promise<boolean> => {\n if (isTsxAvailable() || tsxLoaded) return true;\n // Only load tsx if it's an actual dependency of the project (present in its\n // own node_modules), not a transitive dep from a parent directory.\n if (!fs.existsSync(path.join(projectRoot, \"node_modules\", \"tsx\"))) return false;\n try {\n const require = createRequire(path.join(projectRoot, \"package.json\"));\n const tsxEsmPath = require.resolve(\"tsx/esm\");\n await import(pathToFileURL(tsxEsmPath).href);\n tsxLoaded = true;\n return true;\n } catch {\n return false;\n }\n};\n\n// ─── Agent Discovery ───\n\nconst isPlatformAgentExport = (\n value: unknown,\n): value is { __type: \"PlatformAgent\"; config: PlatformAgentConfig } =>\n value != null &&\n typeof value === \"object\" &&\n (value as Record<string, unknown>).__type === \"PlatformAgent\" &&\n \"config\" in value;\n\ninterface DiscoveredAgent {\n config: PlatformAgentConfig;\n entryPoint: string;\n}\n\nexport const discoverAgents = async (projectRoot: string): Promise<DiscoveredAgent[]> => {\n const distAgentsDir = path.join(projectRoot, \"dist\", \"agents\");\n const useDistAgents = fs.existsSync(distAgentsDir) && fs.statSync(distAgentsDir).isDirectory();\n const agentsDir = useDistAgents ? distAgentsDir : path.join(projectRoot, \"src\", \"agents\");\n const agentsDirPrefix = useDistAgents ? \"dist/agents\" : \"src/agents\";\n\n if (!fs.existsSync(agentsDir) || !fs.statSync(agentsDir).isDirectory()) {\n return [];\n }\n\n const tsxEnabled = await ensureTsxLoader(projectRoot);\n const allFiles = fs.readdirSync(agentsDir);\n const files = allFiles\n .filter((f) => f.endsWith(\".js\") || f.endsWith(\".mjs\") || (tsxEnabled && f.endsWith(\".ts\")))\n .sort();\n\n if (!tsxEnabled) {\n const skippedTs = allFiles.filter((f) => f.endsWith(\".ts\"));\n if (skippedTs.length > 0) {\n warn(\n `Found ${String(skippedTs.length)} .ts agent file(s) but tsx is not available. ` +\n \"Install tsx as a devDependency or build your project first.\",\n );\n }\n }\n\n const seen = new Map<string, DiscoveredAgent>();\n\n for (const file of files) {\n const filePath = path.join(agentsDir, file);\n try {\n const mod = (await import(pathToFileURL(filePath).href)) as Record<string, unknown>;\n const exported = mod.default;\n if (isPlatformAgentExport(exported) && !seen.has(exported.config.agent.name)) {\n seen.set(exported.config.agent.name, {\n config: exported.config,\n entryPoint: `${agentsDirPrefix}/${file}`,\n });\n }\n } catch (err) {\n warn(\n `Skipping ${agentsDirPrefix}/${file}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n return [...seen.values()];\n};\n\n// ─── Skill Discovery ───\n\nconst MAX_SKILL_SIZE = 100 * 1024; // 100KB\n\nconst discoverSkills = (projectRoot: string): ProjectManifest[\"skills\"] => {\n const skillsDir = path.join(projectRoot, \"src\", \"skills\");\n\n if (!fs.existsSync(skillsDir) || !fs.statSync(skillsDir).isDirectory()) {\n return [];\n }\n\n const files = fs.readdirSync(skillsDir).sort();\n\n const skills: ProjectManifest[\"skills\"] = [];\n\n for (const file of files) {\n if (!file.endsWith(\".md\")) {\n warn(`Skipping src/skills/${file}: skill files must have a .md extension.`);\n continue;\n }\n\n const basename = file.replace(/\\.md$/, \"\");\n if (!isValidSkillName(basename)) {\n warn(\n `Skipping src/skills/${file}: name must match [a-zA-Z0-9-] (letters, digits, hyphens only).`,\n );\n continue;\n }\n\n const filePath = path.join(skillsDir, file);\n const stat = fs.statSync(filePath);\n if (stat.size > MAX_SKILL_SIZE) {\n warn(`Skipping src/skills/${file}: exceeds ${MAX_SKILL_SIZE} byte limit.`);\n continue;\n }\n\n const content = fs.readFileSync(filePath, \"utf-8\");\n skills.push({ name: file, path: `src/skills/${file}`, content });\n }\n\n return skills;\n};\n\n// ─── Connector Discovery ───\n\ninterface ConnectorToolSpec {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n annotations?: {\n readOnlyHint?: boolean;\n destructiveHint?: boolean;\n idempotentHint?: boolean;\n };\n}\n\ninterface ConnectorResourceSpec {\n name: string;\n uri: string;\n description: string;\n mimeType?: string;\n}\n\ninterface ConnectorPromptSpec {\n name: string;\n description: string;\n arguments?: Array<{\n name: string;\n description?: string;\n required?: boolean;\n }>;\n}\n\ninterface ConnectorExport {\n __type: \"PlatformConnector\";\n name: string;\n tools?: Record<\n string,\n { description: string; input: z.ZodType; annotations?: Record<string, unknown> }\n >;\n resources?: Record<string, { description: string; uri: string; mimeType?: string }>;\n prompts?: Record<\n string,\n {\n description: string;\n arguments?: ReadonlyArray<{ name: string; description?: string; required?: boolean }>;\n }\n >;\n}\n\nconst isPlatformConnectorExport = (value: unknown): value is ConnectorExport =>\n value != null &&\n typeof value === \"object\" &&\n (value as Record<string, unknown>).__type === \"PlatformConnector\";\n\nconst serializeToolParameters = (input: z.ZodType): Record<string, unknown> => {\n try {\n return z.toJSONSchema(input, { target: \"draft-2020-12\" }) as Record<string, unknown>;\n } catch {\n warn(\"Failed to serialize tool parameters via z.toJSONSchema(); falling back to {}\");\n return {};\n }\n};\n\nconst extractConnectorSpecs = (\n conn: ConnectorExport,\n): {\n toolSpecs: ConnectorToolSpec[];\n resourceSpecs: ConnectorResourceSpec[];\n promptSpecs: ConnectorPromptSpec[];\n} => {\n const toolSpecs: ConnectorToolSpec[] = [];\n if (conn.tools) {\n for (const [name, tool] of Object.entries(conn.tools)) {\n const spec: ConnectorToolSpec = {\n name,\n description: tool.description,\n parameters: serializeToolParameters(tool.input),\n };\n if (tool.annotations) {\n const { readOnlyHint, destructiveHint, idempotentHint } = tool.annotations as {\n readOnlyHint?: boolean;\n destructiveHint?: boolean;\n idempotentHint?: boolean;\n };\n if (\n readOnlyHint !== undefined ||\n destructiveHint !== undefined ||\n idempotentHint !== undefined\n ) {\n spec.annotations = {\n ...(readOnlyHint !== undefined ? { readOnlyHint } : {}),\n ...(destructiveHint !== undefined ? { destructiveHint } : {}),\n ...(idempotentHint !== undefined ? { idempotentHint } : {}),\n };\n }\n }\n toolSpecs.push(spec);\n }\n }\n\n const resourceSpecs: ConnectorResourceSpec[] = [];\n if (conn.resources) {\n for (const [name, resource] of Object.entries(conn.resources)) {\n const spec: ConnectorResourceSpec = {\n name,\n uri: resource.uri,\n description: resource.description,\n };\n if (resource.mimeType) {\n spec.mimeType = resource.mimeType;\n }\n resourceSpecs.push(spec);\n }\n }\n\n const promptSpecs: ConnectorPromptSpec[] = [];\n if (conn.prompts) {\n for (const [name, prompt] of Object.entries(conn.prompts)) {\n const spec: ConnectorPromptSpec = {\n name,\n description: prompt.description,\n };\n if (prompt.arguments) {\n spec.arguments = [...prompt.arguments];\n }\n promptSpecs.push(spec);\n }\n }\n\n return { toolSpecs, resourceSpecs, promptSpecs };\n};\n\n/** Find the importable entry point for a connector directory, or undefined. */\nconst findConnectorEntryPoint = (connDir: string, tsxEnabled: boolean): string | undefined => {\n const candidates = [\"index.js\", \"index.mjs\"];\n if (tsxEnabled) candidates.push(\"index.ts\");\n\n for (const candidate of candidates) {\n const filePath = path.join(connDir, candidate);\n if (fs.existsSync(filePath)) return filePath;\n }\n return undefined;\n};\n\nconst discoverConnectors = async (projectRoot: string): Promise<ProjectManifest[\"connectors\"]> => {\n const distConnectorsDir = path.join(projectRoot, \"dist\", \"connectors\");\n const useDistConnectors =\n fs.existsSync(distConnectorsDir) && fs.statSync(distConnectorsDir).isDirectory();\n const connectorsDir = useDistConnectors\n ? distConnectorsDir\n : path.join(projectRoot, \"src\", \"connectors\");\n const connectorsDirPrefix = useDistConnectors ? \"dist/connectors\" : \"src/connectors\";\n\n if (!fs.existsSync(connectorsDir) || !fs.statSync(connectorsDir).isDirectory()) {\n return [];\n }\n\n const tsxEnabled = await ensureTsxLoader(projectRoot);\n const entries = fs.readdirSync(connectorsDir, { withFileTypes: true });\n const connectors: ProjectManifest[\"connectors\"] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const name = entry.name;\n if (!isValidPrimitiveName(name)) {\n warn(\n `Skipping ${connectorsDirPrefix}/${name}: name must match [a-z0-9-] (lowercase, digits, hyphens only).`,\n );\n continue;\n }\n\n const connDir = path.join(connectorsDir, name);\n const hasPackageJson = fs.existsSync(path.join(connDir, \"package.json\"));\n const hasDockerfile = fs.existsSync(path.join(connDir, \"Dockerfile\"));\n const hasIndexJs = fs.existsSync(path.join(connDir, \"index.js\"));\n const hasIndexMjs = fs.existsSync(path.join(connDir, \"index.mjs\"));\n const hasIndexTs = fs.existsSync(path.join(connDir, \"index.ts\"));\n\n if (!hasPackageJson && !hasDockerfile && !hasIndexJs && !hasIndexMjs && !hasIndexTs) {\n continue;\n }\n\n const connectorPath = `${connectorsDirPrefix}/${name}/`;\n const entryPoint = findConnectorEntryPoint(connDir, tsxEnabled);\n\n if (!entryPoint) {\n connectors.push({\n name,\n path: connectorPath,\n toolSpecs: [],\n resourceSpecs: [],\n promptSpecs: [],\n });\n continue;\n }\n\n try {\n const mod = (await import(pathToFileURL(entryPoint).href)) as Record<string, unknown>;\n const exported = mod.default;\n\n if (isPlatformConnectorExport(exported)) {\n const specs = extractConnectorSpecs(exported);\n connectors.push({ name, path: connectorPath, ...specs });\n } else {\n connectors.push({\n name,\n path: connectorPath,\n toolSpecs: [],\n resourceSpecs: [],\n promptSpecs: [],\n });\n }\n } catch (err) {\n warn(\n `Skipping introspection for ${connectorsDirPrefix}/${name}: ${err instanceof Error ? err.message : String(err)}`,\n );\n connectors.push({\n name,\n path: connectorPath,\n toolSpecs: [],\n resourceSpecs: [],\n promptSpecs: [],\n });\n }\n }\n\n return connectors.sort((a, b) => a.name.localeCompare(b.name));\n};\n\n// ─── Action Discovery ───\n\nconst isPlatformActionExport = (\n value: unknown,\n): value is { __type: \"PlatformAction\"; name: string; config: ActionConfig } =>\n value != null &&\n typeof value === \"object\" &&\n (value as Record<string, unknown>).__type === \"PlatformAction\" &&\n \"name\" in value &&\n \"config\" in value;\n\ninterface DiscoveredAction {\n name: string;\n entryPoint: string;\n config: ActionConfig;\n}\n\nexport const discoverActions = async (projectRoot: string): Promise<DiscoveredAction[]> => {\n const distActionsDir = path.join(projectRoot, \"dist\", \"actions\");\n const useDistActions = fs.existsSync(distActionsDir) && fs.statSync(distActionsDir).isDirectory();\n const actionsDir = useDistActions ? distActionsDir : path.join(projectRoot, \"src\", \"actions\");\n const actionsDirPrefix = useDistActions ? \"dist/actions\" : \"src/actions\";\n\n if (!fs.existsSync(actionsDir) || !fs.statSync(actionsDir).isDirectory()) {\n return [];\n }\n\n const tsxEnabled = await ensureTsxLoader(projectRoot);\n const allFiles = fs.readdirSync(actionsDir);\n const files = allFiles\n .filter((f) => f.endsWith(\".js\") || f.endsWith(\".mjs\") || (tsxEnabled && f.endsWith(\".ts\")))\n .sort();\n\n if (!tsxEnabled) {\n const skippedTs = allFiles.filter((f) => f.endsWith(\".ts\"));\n if (skippedTs.length > 0) {\n warn(\n `Found ${String(skippedTs.length)} .ts action file(s) but tsx is not available. ` +\n \"Install tsx as a devDependency or build your project first.\",\n );\n }\n }\n\n const seen = new Map<string, DiscoveredAction>();\n\n for (const file of files) {\n const filePath = path.join(actionsDir, file);\n try {\n const mod = (await import(pathToFileURL(filePath).href)) as Record<string, unknown>;\n const exported = mod.default;\n if (isPlatformActionExport(exported) && !seen.has(exported.name)) {\n if (!isValidPrimitiveName(exported.name)) {\n warn(\n `Skipping ${actionsDirPrefix}/${file}: action name \"${exported.name}\" must match [a-z0-9-] (lowercase, digits, hyphens only).`,\n );\n continue;\n }\n seen.set(exported.name, {\n name: exported.name,\n entryPoint: `${actionsDirPrefix}/${file}`,\n config: exported.config,\n });\n }\n } catch (err) {\n warn(\n `Skipping ${actionsDirPrefix}/${file}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n return [...seen.values()];\n};\n\n// ─── Full Project Discovery ───\n\nexport const discoverProject = async (projectRoot: string): Promise<ProjectManifest> => {\n const discovered = await discoverAgents(projectRoot);\n\n const agents: ProjectManifest[\"agents\"] = [];\n for (const { config, entryPoint } of discovered) {\n const name = config.agent.name;\n if (!isValidPrimitiveName(name)) {\n throw new Error(`Invalid agent name: \"${name}\". Names must match ${PRIMITIVE_NAME_REGEX}`);\n }\n agents.push({ name, entryPoint, config });\n }\n\n const skills = discoverSkills(projectRoot);\n const connectors = await discoverConnectors(projectRoot);\n const actions = await discoverActions(projectRoot);\n\n return { agents, skills, connectors, actions };\n};\n\n// ─── Manifest Output ───\n\n/** Output manifest between sentinel markers for orchestrator parsing. */\nexport const emitManifest = (manifest: ProjectManifest): void => {\n process.stdout.write(`${MANIFEST_START}\\n`);\n process.stdout.write(JSON.stringify(manifest));\n process.stdout.write(`\\n${MANIFEST_END}\\n`);\n};\n\n/** Parse manifest from stdout that may contain noise before/after sentinel markers. */\nexport const parseManifestFromOutput = (stdout: string): ProjectManifest => {\n const startIdx = stdout.indexOf(MANIFEST_START);\n const endIdx = stdout.indexOf(MANIFEST_END);\n\n if (startIdx === -1 || endIdx === -1 || endIdx <= startIdx) {\n throw new Error(\"Discovery produced no output: sentinel markers not found\");\n }\n\n const jsonStr = stdout.slice(startIdx + MANIFEST_START.length, endIdx).trim();\n\n let raw: unknown;\n try {\n raw = JSON.parse(jsonStr);\n } catch {\n throw new Error(`Discovery produced invalid JSON: ${jsonStr.slice(0, 200)}`);\n }\n\n const result = projectManifestSchema.safeParse(raw);\n if (!result.success) {\n throw new Error(`Discovery produced invalid manifest: ${result.error.message}`);\n }\n\n return result.data;\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 { inspect } from \"node:util\";\n\nexport class SecretString {\n readonly #value: string;\n\n constructor(value: string) {\n this.#value = value;\n }\n\n unmasked(): string {\n return this.#value;\n }\n\n toJSON(): string {\n return \"[REDACTED]\";\n }\n\n toString(): string {\n return \"[REDACTED]\";\n }\n\n [Symbol.toPrimitive](): string {\n return \"[REDACTED]\";\n }\n\n [inspect.custom](): string {\n return \"SecretString([REDACTED])\";\n }\n}\n\nexport const unwrapSecret = (value: SecretString | string): string =>\n value instanceof SecretString ? value.unmasked() : value;\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport { SecretString, unwrapSecret } from \"../internal/secret-string\";\n\nexport class PlatformError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n ) {\n super(message);\n this.name = \"PlatformError\";\n }\n}\n\nexport class HttpClient {\n readonly baseUrlForStream: string;\n private readonly baseUrl: string;\n private readonly apiKey: SecretString;\n\n constructor(config: { baseUrl: string; apiKey: string }) {\n this.baseUrl = config.baseUrl.replace(/\\/+$/, \"\");\n this.baseUrlForStream = this.baseUrl;\n this.apiKey = new SecretString(config.apiKey);\n\n const isLocalhost = this.baseUrl.includes(\"localhost\") || this.baseUrl.includes(\"127.0.0.1\");\n if (this.baseUrl.startsWith(\"http://\") && !isLocalhost) {\n console.warn(\n \"[kraken-ai] WARNING: baseUrl does not use HTTPS. API keys will be sent in plaintext.\",\n );\n }\n }\n\n async get<T>(path: string, params?: Record<string, string>): Promise<T> {\n const url = this.buildUrl(path, params);\n const response = await fetch(url, {\n method: \"GET\",\n headers: this.authHeaders(),\n });\n return this.handleResponse<T>(response);\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n const response = await fetch(this.buildUrl(path), {\n method: \"POST\",\n headers: { ...this.authHeaders(), \"Content-Type\": \"application/json\" },\n body: body ? JSON.stringify(body) : undefined,\n });\n return this.handleResponse<T>(response);\n }\n\n async postStream(path: string, body: unknown, signal?: AbortSignal): Promise<Response> {\n const response = await fetch(this.buildUrl(path), {\n method: \"POST\",\n headers: {\n ...this.authHeaders(),\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n },\n body: JSON.stringify(body),\n signal,\n });\n if (!response.ok) {\n const err = (await response.json().catch(() => ({ error: \"Unknown error\" }))) as {\n error: string;\n };\n throw new PlatformError(err.error ?? \"Unknown error\", response.status);\n }\n return response;\n }\n\n private buildUrl(path: string, params?: Record<string, string>): string {\n const url = `${this.baseUrl}${path}`;\n if (!params || Object.keys(params).length === 0) return url;\n const qs = new URLSearchParams(params).toString();\n return `${url}?${qs}`;\n }\n\n authHeaders(): Record<string, string> {\n return { Authorization: `Bearer ${unwrapSecret(this.apiKey)}` };\n }\n\n private async handleResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n const body = (await response.json().catch(() => ({ error: \"Unknown error\" }))) as {\n error: string;\n };\n throw new PlatformError(body.error ?? \"Unknown error\", response.status);\n }\n return response.json() as Promise<T>;\n }\n}\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport type { AgentEvent } from \"./types\";\n\nconst VALID_EVENT_TYPES = new Set([\n \"text\",\n \"tool_call\",\n \"tool_result\",\n \"thinking\",\n \"action\",\n \"done\",\n \"error\",\n]);\n\nexport async function* parseSSEStream(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<AgentEvent> {\n const decoder = new TextDecoder();\n const reader = stream.getReader();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n const parts = buffer.split(\"\\n\\n\");\n // Last part is incomplete — keep it in buffer\n buffer = parts.pop() ?? \"\";\n\n for (const part of parts) {\n const event = parseBlock(part);\n if (event) yield event;\n }\n }\n\n // Process any remaining buffer\n if (buffer.trim()) {\n const event = parseBlock(buffer);\n if (event) yield event;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nconst parseBlock = (block: string): AgentEvent | null => {\n let eventType: string | null = null;\n let data: string | null = null;\n\n for (const line of block.split(\"\\n\")) {\n if (line.startsWith(\":\")) continue; // comment\n if (line.startsWith(\"event: \")) {\n eventType = line.slice(7).trim();\n } else if (line.startsWith(\"data: \")) {\n data = line.slice(6);\n }\n }\n\n if (!eventType || !data || !VALID_EVENT_TYPES.has(eventType)) return null;\n\n try {\n const parsed = JSON.parse(data) as Record<string, unknown>;\n return { type: eventType, ...parsed } as AgentEvent;\n } catch {\n return null;\n }\n};\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport type { HttpClient } from \"./http\";\nimport { PlatformError } from \"./http\";\nimport { parseSSEStream } from \"./sse\";\nimport type { AgentEvent } from \"./types\";\n\n// --- Public types ---\n\nexport interface AgentRegistryEntry {\n input: unknown;\n output: unknown;\n actions: Record<string, unknown>;\n}\n\n/**\n * Augmentable agent registry — `kraken generate` populates this via\n * `declare module \"@kraken-ai/platform\" { interface AgentRegistry { ... } }`.\n * When populated, `client.agent(\"id\")` infers input/output/actions automatically.\n */\n// biome-ignore lint/suspicious/noEmptyInterface: augmented by kraken generate codegen\nexport interface AgentRegistry {}\n\nexport interface GenerateOpts {\n signal?: AbortSignal;\n}\n\nexport interface GenerateResult<T extends AgentRegistryEntry> {\n readonly threadId: string;\n stream(): AsyncIterable<AgentEvent>;\n readonly result: Promise<T[\"output\"]>;\n}\n\n// --- Deferred promise helper ---\n\ninterface Deferred<T> {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n}\n\nconst deferred = <T>(): Deferred<T> => {\n let resolve: (value: T) => void;\n let reject: (error: Error) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n // biome-ignore lint/style/noNonNullAssertion: assigned synchronously in Promise constructor\n return { promise, resolve: resolve!, reject: reject! };\n};\n\n// --- AgentHandle ---\n\nexport class AgentHandle<T extends AgentRegistryEntry> {\n private readonly actionHandlers = new Map<string, (payload: unknown) => void | Promise<void>>();\n private threadId: string | undefined;\n\n constructor(\n private readonly http: HttpClient,\n private readonly agentId: string,\n opts?: { threadId?: string },\n ) {\n this.threadId = opts?.threadId;\n }\n\n onAction<K extends keyof T[\"actions\"] & string>(\n name: K,\n handler: (payload: T[\"actions\"][K]) => void | Promise<void>,\n ): void {\n this.actionHandlers.set(name, handler as (payload: unknown) => void | Promise<void>);\n }\n\n async generate(input: T[\"input\"], opts?: GenerateOpts): Promise<GenerateResult<T>> {\n if (!this.threadId) {\n const info = await this.http.post<{ id: string }>(`/api/v1/agents/${this.agentId}/threads`);\n this.threadId = info.id;\n }\n\n const response = await this.http.postStream(\n `/api/v1/agents/${this.agentId}/threads/${this.threadId}/messages`,\n { content: typeof input === \"string\" ? input : JSON.stringify(input) },\n opts?.signal,\n );\n\n if (!response.body) {\n throw new PlatformError(\"Response body is empty\", 0);\n }\n\n const rawStream = parseSSEStream(response.body);\n const {\n promise: resultPromise,\n resolve: resolveResult,\n reject: rejectResult,\n } = deferred<T[\"output\"]>();\n\n const actionHandlers = this.actionHandlers;\n const http = this.http;\n const agentId = this.agentId;\n const threadId = this.threadId;\n\n async function* streamWithDispatch(): AsyncGenerator<AgentEvent> {\n try {\n for await (const event of rawStream) {\n if (event.type === \"action\") {\n const handler = actionHandlers.get(event.name);\n if (handler) {\n await handler(event.payload);\n }\n void http\n .post(\n `/api/v1/agents/${agentId}/threads/${threadId}/actions/${event.actionExecutionId}/ack`,\n )\n .catch(() => {\n // Ack failure is non-fatal\n });\n }\n if (event.type === \"done\") {\n resolveResult((event as { output: unknown }).output as T[\"output\"]);\n }\n if (event.type === \"error\") {\n rejectResult(new PlatformError((event as { message: string }).message, 0));\n }\n yield event;\n }\n } catch (err) {\n rejectResult(err instanceof Error ? err : new Error(String(err)));\n throw err;\n }\n }\n\n let streamGenerator: AsyncGenerator<AgentEvent> | null = null;\n let streamStarted = false;\n\n const ensureStream = () => {\n if (!streamGenerator) {\n streamGenerator = streamWithDispatch();\n }\n return streamGenerator;\n };\n\n const backgroundConsume = async () => {\n if (streamStarted) return;\n streamStarted = true;\n const gen = ensureStream();\n for await (const _ of gen) {\n void _;\n }\n };\n\n const result: GenerateResult<T> = {\n threadId,\n stream() {\n streamStarted = true;\n return ensureStream();\n },\n get result() {\n void backgroundConsume();\n return resultPromise;\n },\n };\n\n return result;\n }\n}\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport type { HttpClient } from \"./http\";\nimport { PlatformError } from \"./http\";\nimport { parseSSEStream } from \"./sse\";\nimport type {\n AgentEvent,\n AgentInfo,\n PaginatedResponse,\n PaginationParams,\n ThreadInfo,\n ThreadMessage,\n} from \"./types\";\n\nexport class AgentThread {\n constructor(\n private readonly http: HttpClient,\n private readonly agentId: string,\n public readonly threadId: string,\n ) {}\n\n async sendMessage(\n content: string,\n opts?: { signal?: AbortSignal },\n ): Promise<AsyncIterable<AgentEvent>> {\n const response = await this.http.postStream(\n `/api/v1/agents/${this.agentId}/threads/${this.threadId}/messages`,\n { content },\n opts?.signal,\n );\n if (!response.body) {\n throw new PlatformError(\"Response body is empty\", 0);\n }\n return parseSSEStream(response.body);\n }\n\n async getMessages(params?: PaginationParams): Promise<PaginatedResponse<ThreadMessage>> {\n const qs = buildPaginationQuery(params);\n return this.http.get(`/api/v1/agents/${this.agentId}/threads/${this.threadId}/messages`, qs);\n }\n}\n\nexport class AgentsNamespace {\n constructor(private readonly http: HttpClient) {}\n\n async list(): Promise<AgentInfo[]> {\n const result = await this.http.get<{ data: AgentInfo[] }>(\"/api/v1/agents\");\n return result.data;\n }\n\n async createThread(agentId: string): Promise<AgentThread> {\n const info = await this.http.post<ThreadInfo>(`/api/v1/agents/${agentId}/threads`);\n return new AgentThread(this.http, agentId, info.id);\n }\n\n async getThread(agentId: string, threadId: string): Promise<AgentThread> {\n await this.http.get<ThreadInfo>(`/api/v1/agents/${agentId}/threads/${threadId}`);\n return new AgentThread(this.http, agentId, threadId);\n }\n\n async listThreads(\n agentId: string,\n params?: PaginationParams,\n ): Promise<PaginatedResponse<ThreadInfo>> {\n const qs = buildPaginationQuery(params);\n return this.http.get(`/api/v1/agents/${agentId}/threads`, qs);\n }\n}\n\nconst buildPaginationQuery = (params?: PaginationParams): Record<string, string> | undefined => {\n if (!params) return undefined;\n const qs: Record<string, string> = {};\n if (params.cursor) qs.cursor = params.cursor;\n if (params.limit != null) qs.limit = String(params.limit);\n return Object.keys(qs).length > 0 ? qs : undefined;\n};\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport interface Credentials {\n apiKey: string;\n baseUrl: string;\n}\n\nconst credentialsDir = () => path.join(os.homedir(), \".kraken-ai\");\nconst credentialsPath = () => path.join(credentialsDir(), \"credentials.json\");\n\nexport const saveCredentials = (creds: Credentials): void => {\n const dir = credentialsDir();\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n const filePath = credentialsPath();\n fs.writeFileSync(filePath, JSON.stringify(creds, null, 2), { mode: 0o600 });\n};\n\nexport const loadCredentials = (): Credentials | null => {\n const filePath = credentialsPath();\n let creds: Credentials | null = null;\n\n if (fs.existsSync(filePath)) {\n try {\n creds = JSON.parse(fs.readFileSync(filePath, \"utf-8\")) as Credentials;\n } catch {\n return null;\n }\n }\n\n const envKey = process.env.KRAKEN_API_KEY;\n const envUrl = process.env.KRAKEN_BASE_URL;\n\n if (envKey || envUrl) {\n return {\n apiKey: envKey ?? creds?.apiKey ?? \"\",\n baseUrl: envUrl ?? creds?.baseUrl ?? \"\",\n };\n }\n\n return creds;\n};\n\nexport const clearCredentials = (): void => {\n const filePath = credentialsPath();\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n};\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport type { HttpClient } from \"./http\";\nimport type { PaginationParams, QueryInfo, QueryResult } from \"./types\";\n\nexport class DataNamespace {\n constructor(private readonly http: HttpClient) {}\n\n async list(): Promise<QueryInfo[]> {\n const result = await this.http.get<{ data: QueryInfo[] }>(\"/api/v1/data/queries\");\n return result.data;\n }\n\n async describe(queryName: string): Promise<QueryInfo> {\n return this.http.get(`/api/v1/data/queries/${queryName}`);\n }\n\n async query<TRow = Record<string, unknown>>(\n queryName: string,\n params?: Record<string, unknown>,\n pagination?: PaginationParams,\n ): Promise<QueryResult<TRow>> {\n return this.http.post(`/api/v1/data/queries/${queryName}/execute`, {\n params,\n ...pagination,\n });\n }\n}\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport * as z from \"zod\";\nimport type { HttpClient } from \"./http\";\n\ninterface PipelineQueryDef<P extends z.ZodType, R extends z.ZodType> {\n params: P;\n returns: R;\n}\n\nexport class PipelinesNamespace {\n constructor(private readonly http: HttpClient) {}\n\n async query<P extends z.ZodType, R extends z.ZodType>(\n pipeline: string,\n queryName: string,\n schema: PipelineQueryDef<P, R>,\n params: z.infer<P>,\n ): Promise<z.infer<R>[]> {\n const result = await this.http.post<{ rows: unknown[] }>(\n `/api/v1/pipelines/${encodeURIComponent(pipeline)}/queries/${encodeURIComponent(queryName)}`,\n params,\n );\n\n try {\n return z.array(schema.returns).parse(result.rows);\n } catch (e) {\n throw new Error(\n `Pipeline schema may have changed — run 'kraken generate' to update types.\\n\\nOriginal error: ${(e as Error).message}`,\n );\n }\n }\n}\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport type { HttpClient } from \"./http\";\nimport { PlatformError } from \"./http\";\nimport type { RunEvent, RunRecord, StartRunParams } from \"./types\";\n\nexport class RunsNamespace {\n constructor(private readonly http: HttpClient) {}\n\n async start(params: StartRunParams): Promise<{ runId: string }> {\n return this.http.post(\"/api/v1/runs\", params);\n }\n\n async get(runId: string): Promise<RunRecord> {\n return this.http.get(`/api/v1/runs/${runId}`);\n }\n\n async cancel(runId: string): Promise<{ success: boolean }> {\n return this.http.post(`/api/v1/runs/${runId}/cancel`);\n }\n\n async getEvents(\n runId: string,\n opts?: { afterEventId?: string },\n ): Promise<{ events: RunEvent[] }> {\n const params = opts?.afterEventId ? { afterEventId: opts.afterEventId } : undefined;\n return this.http.get(`/api/v1/runs/${runId}/events`, params);\n }\n\n async *streamEvents(runId: string, opts?: { signal?: AbortSignal }): AsyncGenerator<RunEvent> {\n const response = await fetch(\n `${this.http.baseUrlForStream}/api/v1/runs/${runId}/events/stream`,\n {\n headers: {\n Accept: \"text/event-stream\",\n ...this.http.authHeaders(),\n },\n signal: opts?.signal,\n },\n );\n\n if (!response.ok || !response.body) {\n throw new PlatformError(\"Failed to connect to event stream\", response.status);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n const raw = line.slice(6).trim();\n if (!raw || raw === \"[DONE]\") continue;\n try {\n yield JSON.parse(raw) as RunEvent;\n } catch {\n // skip malformed\n }\n }\n }\n } finally {\n reader.cancel();\n }\n }\n}\n","// Copyright (c) Optima Engineering LLC\n// SPDX-License-Identifier: BUSL-1.1\n\nimport { loadCredentials } from \"../cli/credentials\";\nimport { AgentHandle, type AgentRegistry, type AgentRegistryEntry } from \"./agent-handle\";\nimport { AgentsNamespace } from \"./agents\";\nimport { DataNamespace } from \"./data\";\nimport { HttpClient, PlatformError } from \"./http\";\nimport { PipelinesNamespace } from \"./pipelines\";\nimport { RunsNamespace } from \"./runs\";\nimport type { PlatformClientConfig } from \"./types\";\n\n/** When AgentRegistry is populated (after `kraken generate`), constrain to known keys for autocomplete. Otherwise accept any string. */\ntype AgentIdConstraint = keyof AgentRegistry extends never ? string : keyof AgentRegistry;\n\n/** Resolve agent type: if K is a known key in AgentRegistry use it, otherwise fall back to AgentRegistryEntry. */\ntype ResolveAgent<K extends string> = K extends keyof AgentRegistry\n ? AgentRegistry[K]\n : AgentRegistryEntry;\n\nconst resolveConfig = (config?: PlatformClientConfig): { baseUrl: string; apiKey: string } => {\n const creds = loadCredentials();\n\n const baseUrl = config?.baseUrl ?? creds?.baseUrl;\n const apiKey = config?.apiKey ?? creds?.apiKey;\n\n if (!baseUrl) {\n throw new Error(\n \"No Kraken platform endpoint configured.\\n\\n\" +\n \"Either:\\n\" +\n \" 1. Log in via the CLI: npx kraken login\\n\" +\n \" 2. Set the environment variable: export KRAKEN_BASE_URL=https://your-platform-url\\n\" +\n \" 3. Pass baseUrl to PlatformClient: new PlatformClient({ baseUrl: '...' })\\n\",\n );\n }\n\n if (!apiKey) {\n throw new Error(\n \"No Kraken API key configured.\\n\\n\" +\n \"Either:\\n\" +\n \" 1. Log in via the CLI: npx kraken login\\n\" +\n \" 2. Set the environment variable: export KRAKEN_API_KEY=your-api-key\\n\" +\n \" 3. Pass apiKey to PlatformClient: new PlatformClient({ apiKey: '...' })\\n\",\n );\n }\n\n return { baseUrl, apiKey };\n};\n\nexport class PlatformClient {\n public readonly agents: AgentsNamespace;\n public readonly data: DataNamespace;\n public readonly pipelines: PipelinesNamespace;\n public readonly runs: RunsNamespace;\n private readonly http: HttpClient;\n\n constructor(config?: PlatformClientConfig) {\n const resolved = resolveConfig(config);\n\n this.http = new HttpClient(resolved);\n this.agents = new AgentsNamespace(this.http);\n this.data = new DataNamespace(this.http);\n this.pipelines = new PipelinesNamespace(this.http);\n this.runs = new RunsNamespace(this.http);\n }\n\n agent<K extends AgentIdConstraint>(\n id: K,\n opts?: { mode?: \"local\" | \"remote\"; threadId?: string },\n ): AgentHandle<ResolveAgent<K>> {\n if (opts?.mode === \"local\") {\n throw new PlatformError(\"Local mode not yet implemented\", 0);\n }\n return new AgentHandle<ResolveAgent<K>>(this.http, id, {\n threadId: opts?.threadId,\n });\n }\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z","os","z","z","path","import_node_fs","import_node_path","path","os","fs","z"]}