{"version":3,"file":"launch-contract.d.ts","sourceRoot":"","sources":["../../../src/shared/launch-contract.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,eAAO,MAAM,mCAAmC,GAAa,CAAC;AAC9D,eAAO,MAAM,iCAAiC,GAAa,CAAC;AA0B5D,4FAA4F;AAC5F,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqClF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAEhE;AAED,MAAM,WAAW,kBAAkB;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,iHAAiH;IACjH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,CAAC,EAAE,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACnD,qBAAqB,EAAE,OAAO,CAAC;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,uEAAuE;AACvE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuBvF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAErE","sourcesContent":["import { createHash } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport type { AgentConfig } from \"../agents/agents.ts\";\n\nexport const AGENT_DEFINITION_PROJECTION_VERSION = 1 as const;\nexport const LAUNCH_BINDING_PROJECTION_VERSION = 1 as const;\n\nfunction stableJson(value: unknown): string {\n\tif (Array.isArray(value)) return `[${value.map(stableJson).join(\",\")}]`;\n\tif (value && typeof value === \"object\") {\n\t\treturn `{${Object.entries(value as Record<string, unknown>)\n\t\t\t.filter(([, entry]) => entry !== undefined)\n\t\t\t.sort(([a], [b]) => a.localeCompare(b))\n\t\t\t.map(([key, entry]) => `${JSON.stringify(key)}:${stableJson(entry)}`)\n\t\t\t.join(\",\")}}`;\n\t}\n\treturn JSON.stringify(value);\n}\n\nfunction sha256(value: unknown): string {\n\treturn createHash(\"sha256\").update(stableJson(value)).digest(\"hex\");\n}\n\nfunction fileDigest(filePath: string): string | undefined {\n\ttry {\n\t\treturn createHash(\"sha256\").update(fs.readFileSync(filePath)).digest(\"hex\");\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** Public-safe, deterministic evidence for the parsed launch-affecting agent definition. */\nexport function projectAgentDefinition(agent: AgentConfig): Record<string, unknown> {\n\treturn {\n\t\tversion: AGENT_DEFINITION_PROJECTION_VERSION,\n\t\tname: agent.name,\n\t\tlocalName: agent.localName,\n\t\tpackageName: agent.packageName,\n\t\tfilePath: agent.filePath,\n\t\tfileContentDigest: fileDigest(agent.filePath),\n\t\trunner: agent.runner,\n\t\tsystemPrompt: agent.systemPrompt,\n\t\tsystemPromptMode: agent.systemPromptMode,\n\t\tinheritProjectContext: agent.inheritProjectContext,\n\t\tinheritSkills: agent.inheritSkills,\n\t\tmodel: agent.model,\n\t\tfallbackModels: agent.fallbackModels,\n\t\tthinking: agent.thinking,\n\t\ttools: agent.tools,\n\t\tmcpDirectTools: agent.mcpDirectTools,\n\t\textensions: agent.extensions,\n\t\tsubagentOnlyExtensions: agent.subagentOnlyExtensions,\n\t\tskills: agent.skills,\n\t\tskillPath: agent.skillPath,\n\t\toutput: agent.output,\n\t\tdefaultReads: agent.defaultReads,\n\t\tdefaultProgress: agent.defaultProgress,\n\t\tdefaultContext: agent.defaultContext,\n\t\tdefaultAsync: agent.defaultAsync,\n\t\tdefaultTimeoutMs: agent.defaultTimeoutMs,\n\t\tdefaultTurnBudget: agent.defaultTurnBudget,\n\t\tdefaultAcceptance: agent.defaultAcceptance,\n\t\tacceptanceRole: agent.acceptanceRole,\n\t\tinteractive: agent.interactive,\n\t\tmaxSubagentDepth: agent.maxSubagentDepth,\n\t\tcompletionGuard: agent.completionGuard,\n\t\ttoolBudget: agent.toolBudget,\n\t\tmemory: agent.memory,\n\t};\n}\n\nexport function agentDefinitionDigest(agent: AgentConfig): string {\n\treturn sha256(projectAgentDefinition(agent));\n}\n\nexport interface LaunchBindingInput {\n\tdefinitionDigest: string;\n\t/** Caller task; runtime acceptance/output task annotations are explicitly outside the preflight-known subset. */\n\ttask?: string;\n\tmodel?: string;\n\tmodelCandidates?: string[];\n\tthinking?: string;\n\tsystemPrompt?: string | null;\n\tsystemPromptMode?: AgentConfig[\"systemPromptMode\"];\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\tskills?: string[];\n\ttools?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tmcpDirectTools?: string[];\n\toutputPath?: string;\n\toutputMode?: string;\n\tstructuredOutputSchema?: unknown;\n}\n\n/** Canonical projection of the resolved inputs handed to the child. */\nexport function projectLaunchBinding(input: LaunchBindingInput): Record<string, unknown> {\n\treturn {\n\t\tversion: LAUNCH_BINDING_PROJECTION_VERSION,\n\t\tdefinitionDigest: input.definitionDigest,\n\t\ttaskDigest: input.task === undefined ? undefined : sha256(input.task),\n\t\t// The ordered candidate set already contains each attempted model; keeping only\n\t\t// this set makes retries correlate to the same preflight binding.\n\t\tmodelCandidates: input.modelCandidates,\n\t\tthinking: input.thinking,\n\t\tsystemPromptDigest:\n\t\t\tinput.systemPrompt === undefined || input.systemPrompt === null ? undefined : sha256(input.systemPrompt),\n\t\tsystemPromptMode: input.systemPromptMode,\n\t\tinheritProjectContext: input.inheritProjectContext,\n\t\tinheritSkills: input.inheritSkills,\n\t\tskills: input.skills,\n\t\ttools: input.tools,\n\t\textensions: input.extensions,\n\t\tsubagentOnlyExtensions: input.subagentOnlyExtensions,\n\t\tmcpDirectTools: input.mcpDirectTools,\n\t\toutputPath: input.outputPath,\n\t\toutputMode: input.outputMode,\n\t\tstructuredOutputSchema: input.structuredOutputSchema,\n\t};\n}\n\nexport function launchBindingDigest(input: LaunchBindingInput): string {\n\treturn sha256(projectLaunchBinding(input));\n}\n"]}