@kraken-ai/platform 0.0.4 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-PPT6GGYL.js → chunk-FTLOWV2N.js} +244 -67
- package/dist/chunk-FTLOWV2N.js.map +1 -0
- package/dist/cli.js +1103 -374
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +416 -240
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1107 -368
- package/dist/index.d.ts +1107 -368
- package/dist/index.js +183 -172
- package/dist/index.js.map +1 -1
- package/dist/server.cjs +220 -45
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +265 -28
- package/dist/server.d.ts +265 -28
- package/dist/server.js +15 -20
- package/dist/server.js.map +1 -1
- package/package.json +20 -16
- package/dist/chunk-PPT6GGYL.js.map +0 -1
- package/dist/types-_lfbhFJH.d.cts +0 -451
- package/dist/types-_lfbhFJH.d.ts +0 -451
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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-connector.ts","../src/agents/define-skill.ts","../src/cli/discover.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\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 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\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","path","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/agents/define.ts","../src/agents/define-connector.ts","../src/agents/define-skill.ts","../src/cli/discover.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\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. Validates at definition time and returns a\n * frozen {@link PlatformAgent} ready for registration.\n *\n * ## Config shape\n *\n * ```\n * {\n * agent: { // REQUIRED — the agent itself\n * name: string // REQUIRED — unique agent name\n * model: ModelString // REQUIRED — \"provider/model-id\"\n * instructions: string // REQUIRED — system prompt\n * description?: string // shown to orchestrator agents\n * skills?: SkillRef[] // skill objects or IDs\n * temperature?: number // 0–2 (default: model default)\n * allowTemperatureOverride?: boolean // let callers override temperature\n * maxOutputTokens?: number // cap output length\n * thinkingLevel?: \"low\"|\"medium\"|\"high\" // reasoning depth\n * logLevel?: \"silent\"|\"debug\"|\"info\"|\"warn\"|\"error\"\n * outputSchema?: ZodType // typed structured output\n * }\n * triggers: TriggerConfig[] // REQUIRED — how runs start\n * | { type: \"manual\" }\n * | { type: \"api\" }\n * | { type: \"cron\", expression: string, timezone?: string }\n * | { type: \"webhook\", path: string, method?: \"POST\"|\"GET\" }\n * | { type: \"event\", source: string, event: string }\n * connectors?: ConnectorRef[] // connector objects or IDs\n * actions?: ActionRef[] // action objects or IDs\n * team?: { // multi-agent delegation\n * members: TeamMember[] // REQUIRED — agent objects or IDs\n * maxConcurrentWorkers?: number // parallel worker cap\n * maxTokenBudgetPerWorker?: number // token limit per worker\n * maxDurationPerWorker?: number // seconds per worker\n * }\n * identity?: { // JIT permission escalation\n * basePermissions: string[] // REQUIRED — default permissions\n * requestablePermissions?: string[] // permissions the agent can request\n * jitPolicy?: \"auto-approve\"|\"policy-based\"|\"require-approval\"\n * maxJitDurationMinutes?: number\n * }\n * resources?: { // cost & runtime guardrails\n * maxTokens?: number\n * maxCostUsd?: number\n * timeoutSeconds?: number\n * }\n * retries?: { // automatic retry on failure\n * maxAttempts?: number\n * backoffSeconds?: number\n * }\n * concurrency?: { // run-level concurrency\n * maxParallelRuns?: number\n * }\n * notifications?: { // Slack alerts\n * slack?: string // channel or webhook URL\n * onSuccess?: boolean\n * onFailure?: boolean\n * onTimeout?: boolean\n * }\n * fast?: boolean // pre-provision connectors for low latency\n * environment?: \"dev\"|\"staging\"|\"prod\"\n * }\n * ```\n *\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 * export default definePlatformAgent({\n * agent: {\n * name: \"market-intel\",\n * model: \"openai/gpt-4o\",\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 */\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 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\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":["os","path","fs","path","fs","z"]}
|