{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../../src/api/preflight.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { buildAgentMemoryInjection } from \"../agents/agent-memory.ts\";\nimport { resolveExecutionAgentScope } from \"../agents/agent-scope.ts\";\nimport {\n\ttype AgentConfig,\n\ttype AgentScope,\n\ttype AgentSource,\n\tdiscoverAgents,\n\tdiscoverAgentsAll,\n\tresolveAgentName,\n} from \"../agents/agents.ts\";\nimport { buildSkillInjection, normalizeSkillInput, resolveSkillsWithFallback } from \"../agents/skills.ts\";\nimport { processTerminalCandidatePath, processTerminalPath } from \"../runs/background/process-terminal.ts\";\nimport {\n\tcapabilityCeilingAgentRestrictionMessage,\n\tintersectSubagentCapabilityCeilings,\n\ttype ResolvedSubagentCapabilityCeiling,\n\ttype SubagentCapabilityAudit,\n} from \"../runs/shared/capability-ceiling.ts\";\nimport type { ResolvedMcpDirectToolSelection } from \"../runs/shared/mcp-direct-tool-allowlist.ts\";\nimport {\n\ttype AvailableModelInfo,\n\tbuildModelCandidates,\n\ttype ParentModel,\n\tresolveEffectiveSubagentModel,\n} from \"../runs/shared/model-fallback.ts\";\nimport { nestedResultsPath } from \"../runs/shared/nested-events.ts\";\nimport { applyThinkingSuffix, type PiLaunchToolPlan, resolvePiLaunchToolPlan } from \"../runs/shared/pi-args.ts\";\nimport {\n\tinjectOutputPathSystemPrompt,\n\tnormalizeSingleOutputOverride,\n\tresolveSingleOutputPath,\n} from \"../runs/shared/single-output.ts\";\nimport { appendTurnBudgetSystemPrompt } from \"../runs/shared/turn-budget.ts\";\nimport { getArtifactPaths, getArtifactsDir } from \"../shared/artifacts.ts\";\nimport {\n\tAGENT_DEFINITION_PROJECTION_VERSION,\n\tagentDefinitionDigest,\n\tlaunchBindingDigest,\n} from \"../shared/launch-contract.ts\";\nimport { resolveEffectiveThinking } from \"../shared/model-info.ts\";\nimport { resolveStepBehavior } from \"../shared/settings.ts\";\nimport type { ResolvedTurnBudget } from \"../shared/types.ts\";\nimport {\n\ttype ArtifactDirPreference,\n\ttype ArtifactPaths,\n\tDIRS,\n\ttype JsonSchemaObject,\n\ttype OutputMode,\n\tSUBAGENT_LIFECYCLE_ARTIFACT_VERSION,\n\tTEMP_ROOT_DIR,\n} from \"../shared/types.ts\";\n\nexport const SUBAGENT_LAUNCH_CONTRACT_VERSION = 2 as const;\n\nexport type SubagentLaunchContractReasonCode =\n\t| \"missing_agent\"\n\t| \"ambiguous_agent\"\n\t| \"missing_skill\"\n\t| \"denied_required_tool\"\n\t| \"invalid_artifact_dir\"\n\t| \"invalid_cwd\"\n\t| \"unsupported_mode\"\n\t| \"restricted_agent\";\n\nexport interface SubagentLaunchContractDiagnostic {\n\tcode: SubagentLaunchContractReasonCode | \"host_required\" | \"snapshot_warning\";\n\tseverity: \"error\" | \"warning\" | \"host-required\";\n\tmessage: string;\n}\n\nexport interface SubagentLaunchContractInput {\n\tagent: string;\n\tcwd: string;\n\ttask?: string;\n\tagentScope?: AgentScope;\n\tcontext?: \"fresh\" | \"fork\";\n\tmodel?: string;\n\tthinking?: string | false;\n\tparentModel?: ParentModel;\n\tavailableModels?: ReadonlyArray<\n\t\tAvailableModelInfo | { provider: string; id: string; fullId?: string; reasoning?: boolean }\n\t>;\n\tpreferredProvider?: string;\n\tskill?: string | string[] | boolean;\n\toutput?: string | boolean;\n\toutputMode?: OutputMode;\n\toutputSchema?: JsonSchemaObject;\n\tturnBudget?: ResolvedTurnBudget;\n\tartifacts?: boolean;\n\tartifactDir?: ArtifactDirPreference;\n\tparentSessionFile?: string | null;\n\tsessionRoot?: string;\n\tsessionDir?: string;\n\trunId?: string;\n\t/** Root run id supplied by a host when projecting nested async lifecycle paths. */\n\tnestedRootRunId?: string;\n\tcapabilityCeiling?: ResolvedSubagentCapabilityCeiling;\n\tinheritedCapabilityCeiling?: ResolvedSubagentCapabilityCeiling;\n}\n\nexport interface SubagentLaunchContractAgentCandidate {\n\tname: string;\n\tlocalName?: string;\n\tpackageName?: string;\n\tsource: AgentSource;\n\tfilePath: string;\n\tdisabled?: boolean;\n\tselected: boolean;\n}\n\nexport interface SubagentLaunchContractAgent {\n\tname: string;\n\tlocalName?: string;\n\tpackageName?: string;\n\tsource: AgentSource;\n\tfilePath: string;\n\tdefinitionProjectionVersion: typeof AGENT_DEFINITION_PROJECTION_VERSION;\n\tdefinitionDigest: string;\n\tshadowedCandidates: SubagentLaunchContractAgentCandidate[];\n}\n\nexport interface SubagentLaunchContractSkills {\n\trequested: string[];\n\tresolved: Array<{ name: string; path: string; source: string }>;\n\tmissing: string[];\n}\n\nexport interface SubagentLaunchContractTools {\n\trequestedBuiltin: string[];\n\tdeclaredBuiltin: string[];\n\teffectiveAllowlist: string[];\n\texplicitAllowlist: boolean;\n\trequiredChildTools: string[];\n\tinternalTools: string[];\n\tmcp: ResolvedMcpDirectToolSelection[];\n\teffectiveMcpTools: string[];\n\ttoolExtensionPaths: string[];\n\truntimeExtensions: string[];\n\tconfiguredExtensions: string[];\n\textensionArgs: string[];\n\tdisableAmbientExtensions: boolean;\n\tfanoutAuthorized: boolean;\n\tcapabilityCeiling?: ResolvedSubagentCapabilityCeiling;\n\tcapabilityAudit?: SubagentCapabilityAudit;\n}\n\nexport interface SubagentLaunchContractRoots {\n\tcwd: string;\n\tsessionRoot?: string;\n\tsessionDir?: string;\n\tsessionFile?: string;\n\tartifactsDir?: string;\n\tartifactPaths?: ArtifactPaths;\n\toutputPath?: string;\n\tlifecycle?: {\n\t\tasyncDir: string;\n\t\tresultPath: string;\n\t\tstatusPath: string;\n\t\teventsPath: string;\n\t\tprocessTerminalPath: string;\n\t\tprocessTerminalCandidatePath: string;\n\t};\n}\n\nexport interface SubagentLaunchContract {\n\tversion: typeof SUBAGENT_LAUNCH_CONTRACT_VERSION;\n\trunId: string;\n\tagent: SubagentLaunchContractAgent;\n\tcontext: \"fresh\" | \"fork\";\n\tmodel?: string;\n\tmodelCandidates: string[];\n\tthinking?: string;\n\tsystemPromptMode: AgentConfig[\"systemPromptMode\"];\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\tskills: SubagentLaunchContractSkills;\n\ttools: SubagentLaunchContractTools;\n\troots: SubagentLaunchContractRoots;\n\tprotocol: {\n\t\tlifecycleArtifactVersion: number;\n\t\tpackageVersion: string;\n\t};\n\tdiagnostics: SubagentLaunchContractDiagnostic[];\n\t/** Digest of the resolved child inputs, recomputed by execution paths. */\n\tlaunchContractDigest: string;\n\tdigest: string;\n}\n\nexport type SubagentLaunchContractResult =\n\t| { ok: true; contract: SubagentLaunchContract }\n\t| {\n\t\t\tok: false;\n\t\t\tcode: SubagentLaunchContractReasonCode;\n\t\t\tmessage: string;\n\t\t\tdiagnostics: SubagentLaunchContractDiagnostic[];\n\t  };\n\nfunction packageVersion(): string {\n\tconst packagePath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"..\", \"..\", \"package.json\");\n\tconst parsed = JSON.parse(fs.readFileSync(packagePath, \"utf-8\")) as { version?: unknown };\n\tif (typeof parsed.version !== \"string\" || !parsed.version.trim()) {\n\t\tthrow new Error(`Invalid package version in '${packagePath}'.`);\n\t}\n\treturn parsed.version;\n}\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 digestContract(contract: Omit<SubagentLaunchContract, \"digest\">): string {\n\treturn createHash(\"sha256\").update(stableJson(contract)).digest(\"hex\");\n}\n\nfunction normalizeAvailableModels(models: SubagentLaunchContractInput[\"availableModels\"]): AvailableModelInfo[] {\n\treturn (models ?? []).map((model) => ({ ...model, fullId: model.fullId ?? `${model.provider}/${model.id}` }));\n}\n\nfunction candidateList(\n\tinputAgent: string,\n\tselected: AgentConfig | undefined,\n\tcwd: string,\n): SubagentLaunchContractAgentCandidate[] {\n\tconst all = discoverAgentsAll(cwd);\n\treturn [...all.builtin, ...all.package, ...all.user, ...all.project]\n\t\t.filter((agent) => Boolean(resolveAgentName(inputAgent, [agent]).agent))\n\t\t.map((agent) => ({\n\t\t\tname: agent.name,\n\t\t\t...(agent.localName ? { localName: agent.localName } : {}),\n\t\t\t...(agent.packageName ? { packageName: agent.packageName } : {}),\n\t\t\tsource: agent.source,\n\t\t\tfilePath: agent.filePath,\n\t\t\t...(agent.disabled === true ? { disabled: true } : {}),\n\t\t\tselected: Boolean(selected && agent.filePath === selected.filePath && agent.name === selected.name),\n\t\t}));\n}\n\nexport async function resolveSubagentLaunchContract(\n\tinput: SubagentLaunchContractInput,\n): Promise<SubagentLaunchContractResult> {\n\tconst diagnostics: SubagentLaunchContractDiagnostic[] = [];\n\tconst effectiveCwd = path.resolve(input.cwd);\n\ttry {\n\t\tif (!fs.statSync(effectiveCwd).isDirectory()) {\n\t\t\treturn { ok: false, code: \"invalid_cwd\", message: `cwd '${effectiveCwd}' is not a directory.`, diagnostics };\n\t\t}\n\t} catch (error) {\n\t\tconst detail = error instanceof Error ? ` ${error.message}` : \"\";\n\t\treturn {\n\t\t\tok: false,\n\t\t\tcode: \"invalid_cwd\",\n\t\t\tmessage: `cwd '${effectiveCwd}' is not a directory.${detail}`,\n\t\t\tdiagnostics,\n\t\t};\n\t}\n\tif (input.context !== undefined && input.context !== \"fresh\" && input.context !== \"fork\") {\n\t\treturn {\n\t\t\tok: false,\n\t\t\tcode: \"unsupported_mode\",\n\t\t\tmessage: `Unsupported context '${String(input.context)}'; expected 'fresh' or 'fork'.`,\n\t\t\tdiagnostics,\n\t\t};\n\t}\n\tif (\n\t\tinput.artifactDir !== undefined &&\n\t\tinput.artifactDir !== \"project\" &&\n\t\tinput.artifactDir !== \"session\" &&\n\t\tinput.artifactDir !== \"temp\"\n\t) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\tcode: \"invalid_artifact_dir\",\n\t\t\tmessage: `Unsupported artifactDir '${String(input.artifactDir)}'; expected 'project', 'session', or 'temp'.`,\n\t\t\tdiagnostics,\n\t\t};\n\t}\n\tif (input.context === \"fork\") {\n\t\tdiagnostics.push({\n\t\t\tcode: \"host_required\",\n\t\t\tseverity: \"host-required\",\n\t\t\tmessage:\n\t\t\t\t\"Exact fork session branching and fork-thinking downgrade checks require Pi host session and model-registry snapshots.\",\n\t\t});\n\t}\n\tconst scope = resolveExecutionAgentScope(input.agentScope);\n\tconst discovered = discoverAgents(effectiveCwd, scope);\n\tconst resolvedAgent = resolveAgentName(input.agent, discovered.agents);\n\tif (resolvedAgent.error) {\n\t\treturn { ok: false, code: \"ambiguous_agent\", message: resolvedAgent.error, diagnostics };\n\t}\n\tif (!resolvedAgent.agent) {\n\t\treturn { ok: false, code: \"missing_agent\", message: `Unknown agent: ${input.agent}`, diagnostics };\n\t}\n\tconst agent = resolvedAgent.agent;\n\tconst effectiveCapabilityCeiling = intersectSubagentCapabilityCeilings(\n\t\tinput.capabilityCeiling,\n\t\tinput.inheritedCapabilityCeiling,\n\t);\n\tconst restrictionMessage = capabilityCeilingAgentRestrictionMessage(agent.name, effectiveCapabilityCeiling);\n\tif (restrictionMessage) return { ok: false, code: \"restricted_agent\", message: restrictionMessage, diagnostics };\n\tconst runId = input.runId ?? \"preflight\";\n\tconst skillInput = normalizeSkillInput(input.skill);\n\tconst outputOverride = normalizeSingleOutputOverride(input.output, agent.output);\n\tconst behavior = resolveStepBehavior(agent, {\n\t\t...(outputOverride !== undefined ? { output: outputOverride } : {}),\n\t\t...(input.outputMode !== undefined ? { outputMode: input.outputMode } : {}),\n\t\t...(skillInput !== undefined ? { skills: skillInput } : {}),\n\t\t...(input.model !== undefined ? { model: input.model } : {}),\n\t});\n\tconst requestedSkills = behavior.skills === false ? [] : behavior.skills;\n\tconst resolvedSkills = resolveSkillsWithFallback(\n\t\trequestedSkills,\n\t\teffectiveCwd,\n\t\teffectiveCwd,\n\t\tagent.skillPath,\n\t\tagent.filePath ? path.dirname(agent.filePath) : effectiveCwd,\n\t);\n\tif (resolvedSkills.missing.includes(\"pi-subagents\")) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\tcode: \"missing_skill\",\n\t\t\tmessage: \"The pi-subagents orchestration skill is not child-injectable.\",\n\t\t\tdiagnostics,\n\t\t};\n\t}\n\tif (resolvedSkills.missing.length > 0)\n\t\tdiagnostics.push({\n\t\t\tcode: \"missing_skill\",\n\t\t\tseverity: \"error\",\n\t\t\tmessage: `Missing skills: ${resolvedSkills.missing.join(\", \")}`,\n\t\t});\n\n\tconst availableModels = normalizeAvailableModels(input.availableModels);\n\tconst preferredProvider = input.preferredProvider ?? input.parentModel?.provider;\n\tconst primaryModel = resolveEffectiveSubagentModel(\n\t\tinput.model,\n\t\tagent.model,\n\t\tinput.parentModel,\n\t\tavailableModels,\n\t\tpreferredProvider,\n\t\t{ scope: discovered.modelScope },\n\t);\n\tconst effectiveThinkingConfig = input.thinking !== undefined ? input.thinking : agent.thinking;\n\tconst model = applyThinkingSuffix(primaryModel, effectiveThinkingConfig, input.thinking !== undefined);\n\tconst modelCandidates = buildModelCandidates(\n\t\tprimaryModel,\n\t\tagent.fallbackModels,\n\t\tavailableModels,\n\t\tpreferredProvider,\n\t\t{ scope: discovered.modelScope },\n\t).map(\n\t\t(candidate) => applyThinkingSuffix(candidate, effectiveThinkingConfig, input.thinking !== undefined) ?? candidate,\n\t);\n\tlet toolPlan: PiLaunchToolPlan;\n\ttry {\n\t\ttoolPlan = resolvePiLaunchToolPlan({\n\t\t\ttools: agent.tools,\n\t\t\textensions: agent.extensions,\n\t\t\tsubagentOnlyExtensions: agent.subagentOnlyExtensions,\n\t\t\tmcpDirectTools: agent.mcpDirectTools,\n\t\t\tcwd: effectiveCwd,\n\t\t\trequireReadTool: resolvedSkills.resolved.length > 0,\n\t\t\tstructuredOutput: Boolean(input.outputSchema),\n\t\t\tcapabilityCeiling: effectiveCapabilityCeiling,\n\t\t\tagentName: agent.name,\n\t\t});\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tdiagnostics.push({ code: \"denied_required_tool\", severity: \"error\", message });\n\t\treturn { ok: false, code: \"denied_required_tool\", message, diagnostics };\n\t}\n\tconst artifactsEnabled = input.artifacts !== false;\n\tconst artifactsDir = artifactsEnabled\n\t\t? getArtifactsDir(input.parentSessionFile ?? null, effectiveCwd, input.artifactDir ?? \"project\")\n\t\t: undefined;\n\tconst artifactPaths = artifactsDir ? getArtifactPaths(artifactsDir, runId, agent.name, 0) : undefined;\n\tconst outputPath = resolveSingleOutputPath(\n\t\tbehavior.output,\n\t\teffectiveCwd,\n\t\teffectiveCwd,\n\t\tartifactsDir ? path.join(artifactsDir, \"outputs\", runId) : undefined,\n\t);\n\tconst sessionRoot = input.sessionDir\n\t\t? path.resolve(input.sessionDir)\n\t\t: input.sessionRoot\n\t\t\t? path.join(path.resolve(input.sessionRoot), runId)\n\t\t\t: undefined;\n\tconst sessionDir = sessionRoot ? path.join(sessionRoot, \"run-0\") : undefined;\n\tconst lifecycleAsyncDir = input.nestedRootRunId\n\t\t? path.join(TEMP_ROOT_DIR, \"nested-subagent-runs\", input.nestedRootRunId, runId)\n\t\t: path.join(DIRS.async, runId);\n\tconst lifecycleResultPath = input.nestedRootRunId\n\t\t? nestedResultsPath(input.nestedRootRunId, runId)\n\t\t: path.join(DIRS.results, `${runId}.json`);\n\tif (!sessionDir)\n\t\tdiagnostics.push({\n\t\t\tcode: \"host_required\",\n\t\t\tseverity: \"host-required\",\n\t\t\tmessage:\n\t\t\t\t\"No sessionRoot/sessionDir was supplied; exact child session paths require the Pi host session-root policy.\",\n\t\t});\n\tif (input.availableModels === undefined && (input.model || agent.model || input.parentModel)) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"host_required\",\n\t\t\tseverity: \"host-required\",\n\t\t\tmessage:\n\t\t\t\t\"No availableModels snapshot was supplied; model resolution may differ from the active Pi host registry.\",\n\t\t});\n\t}\n\tif (resolvedSkills.missing.length > 0) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\tcode: \"missing_skill\",\n\t\t\tmessage: `Missing skills: ${resolvedSkills.missing.join(\", \")}`,\n\t\t\tdiagnostics,\n\t\t};\n\t}\n\tlet effectiveSystemPrompt = agent.systemPrompt?.trim() ?? \"\";\n\tif (resolvedSkills.resolved.length > 0) {\n\t\tconst skillInjection = buildSkillInjection(resolvedSkills.resolved);\n\t\teffectiveSystemPrompt = effectiveSystemPrompt ? `${effectiveSystemPrompt}\\n\\n${skillInjection}` : skillInjection;\n\t}\n\tconst memoryInjection = buildAgentMemoryInjection(agent, effectiveCwd);\n\tif (memoryInjection)\n\t\teffectiveSystemPrompt = effectiveSystemPrompt\n\t\t\t? `${effectiveSystemPrompt}\\n\\n${memoryInjection}`\n\t\t\t: memoryInjection;\n\teffectiveSystemPrompt = injectOutputPathSystemPrompt(effectiveSystemPrompt, outputPath, agent);\n\tconst turnBudget = input.turnBudget ?? agent.defaultTurnBudget;\n\teffectiveSystemPrompt = appendTurnBudgetSystemPrompt(effectiveSystemPrompt, turnBudget);\n\tconst candidates = candidateList(input.agent, agent, effectiveCwd);\n\tconst shadowedCandidates = candidates.filter((candidate) => !candidate.selected);\n\tconst definitionDigest = agentDefinitionDigest(agent);\n\tconst contractBase: Omit<SubagentLaunchContract, \"digest\"> = {\n\t\tversion: SUBAGENT_LAUNCH_CONTRACT_VERSION,\n\t\trunId,\n\t\tagent: {\n\t\t\tname: agent.name,\n\t\t\t...(agent.localName ? { localName: agent.localName } : {}),\n\t\t\t...(agent.packageName ? { packageName: agent.packageName } : {}),\n\t\t\tsource: agent.source,\n\t\t\tfilePath: agent.filePath,\n\t\t\tdefinitionProjectionVersion: AGENT_DEFINITION_PROJECTION_VERSION,\n\t\t\tdefinitionDigest,\n\t\t\tshadowedCandidates,\n\t\t},\n\t\tcontext: input.context ?? agent.defaultContext ?? \"fresh\",\n\t\t...(model ? { model } : {}),\n\t\tmodelCandidates,\n\t\t...(resolveEffectiveThinking(model, effectiveThinkingConfig)\n\t\t\t? { thinking: resolveEffectiveThinking(model, effectiveThinkingConfig) }\n\t\t\t: {}),\n\t\tsystemPromptMode: agent.systemPromptMode,\n\t\tinheritProjectContext: agent.inheritProjectContext,\n\t\tinheritSkills: agent.inheritSkills,\n\t\tskills: {\n\t\t\trequested: requestedSkills,\n\t\t\tresolved: resolvedSkills.resolved.map((skill) => ({\n\t\t\t\tname: skill.name,\n\t\t\t\tpath: skill.path,\n\t\t\t\tsource: skill.source,\n\t\t\t})),\n\t\t\tmissing: resolvedSkills.missing,\n\t\t},\n\t\ttools: {\n\t\t\trequestedBuiltin: toolPlan.requestedBuiltinTools,\n\t\t\tdeclaredBuiltin: toolPlan.declaredBuiltinTools,\n\t\t\teffectiveAllowlist: toolPlan.effectiveToolAllowlist,\n\t\t\texplicitAllowlist: toolPlan.explicitToolAllowlist,\n\t\t\trequiredChildTools: toolPlan.requiredChildTools,\n\t\t\tinternalTools: toolPlan.internalTools,\n\t\t\tmcp: toolPlan.effectiveMcpSelections,\n\t\t\teffectiveMcpTools: toolPlan.effectiveMcpTools,\n\t\t\ttoolExtensionPaths: toolPlan.toolExtensionPaths,\n\t\t\truntimeExtensions: toolPlan.runtimeExtensions,\n\t\t\tconfiguredExtensions: toolPlan.configuredExtensions,\n\t\t\textensionArgs: toolPlan.extensionArgs,\n\t\t\tdisableAmbientExtensions: toolPlan.disableAmbientExtensions,\n\t\t\tfanoutAuthorized: toolPlan.fanoutAuthorized,\n\t\t\t...(toolPlan.capabilityCeiling ? { capabilityCeiling: toolPlan.capabilityCeiling } : {}),\n\t\t\t...(toolPlan.capabilityAudit ? { capabilityAudit: toolPlan.capabilityAudit } : {}),\n\t\t},\n\t\troots: {\n\t\t\tcwd: effectiveCwd,\n\t\t\t...(sessionRoot ? { sessionRoot } : {}),\n\t\t\t...(sessionDir ? { sessionDir, sessionFile: path.join(sessionDir, \"session.jsonl\") } : {}),\n\t\t\t...(artifactsDir ? { artifactsDir } : {}),\n\t\t\t...(artifactPaths ? { artifactPaths } : {}),\n\t\t\t...(outputPath ? { outputPath } : {}),\n\t\t\tlifecycle: {\n\t\t\t\tasyncDir: lifecycleAsyncDir,\n\t\t\t\tresultPath: lifecycleResultPath,\n\t\t\t\tstatusPath: path.join(lifecycleAsyncDir, \"status.json\"),\n\t\t\t\teventsPath: path.join(lifecycleAsyncDir, \"events.jsonl\"),\n\t\t\t\tprocessTerminalPath: processTerminalPath(lifecycleAsyncDir),\n\t\t\t\tprocessTerminalCandidatePath: processTerminalCandidatePath(lifecycleAsyncDir),\n\t\t\t},\n\t\t},\n\t\tprotocol: {\n\t\t\tlifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,\n\t\t\tpackageVersion: packageVersion(),\n\t\t},\n\t\tdiagnostics,\n\t\tlaunchContractDigest: launchBindingDigest({\n\t\t\ttask: input.task ?? \"\",\n\t\t\tdefinitionDigest,\n\t\t\t...(model ? { model } : {}),\n\t\t\tmodelCandidates,\n\t\t\t...(resolveEffectiveThinking(model, effectiveThinkingConfig)\n\t\t\t\t? { thinking: resolveEffectiveThinking(model, effectiveThinkingConfig) }\n\t\t\t\t: {}),\n\t\t\tsystemPrompt: effectiveSystemPrompt,\n\t\t\tsystemPromptMode: agent.systemPromptMode,\n\t\t\tinheritProjectContext: agent.inheritProjectContext,\n\t\t\tinheritSkills: agent.inheritSkills,\n\t\t\tskills: requestedSkills,\n\t\t\ttools: toolPlan.effectiveToolAllowlist,\n\t\t\textensions: toolPlan.extensionArgs,\n\t\t\tmcpDirectTools: toolPlan.effectiveMcpTools,\n\t\t\t...(outputPath ? { outputPath } : {}),\n\t\t\toutputMode: input.outputMode ?? \"inline\",\n\t\t\t...(input.outputSchema ? { structuredOutputSchema: input.outputSchema } : {}),\n\t\t}),\n\t};\n\treturn { ok: true, contract: { ...contractBase, digest: digestContract(contractBase) } };\n}\n"]}