{"version":3,"file":"agent-serializer.d.ts","sourceRoot":"","sources":["../../../src/agents/agent-serializer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,eAAO,MAAM,YAAY,aAmCvB,CAAC;AAOH,UAAU,qBAAqB;IAC9B,yBAAyB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAChD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,qBAA0B,GAAG,MAAM,CA8H/F","sourcesContent":["import { stringify as stringifyYaml } from \"yaml\";\nimport type { AgentConfig } from \"./agents.ts\";\nimport { frontmatterNameForConfig } from \"./identity.ts\";\n\nexport const KNOWN_FIELDS = new Set([\n\t\"name\",\n\t\"package\",\n\t\"description\",\n\t\"alias\",\n\t\"aliases\",\n\t\"tools\",\n\t\"model\",\n\t\"fallbackModels\",\n\t\"thinking\",\n\t\"systemPromptMode\",\n\t\"inheritProjectContext\",\n\t\"inheritSkills\",\n\t\"defaultContext\",\n\t\"async\",\n\t\"timeoutMs\",\n\t\"turnBudget\",\n\t\"acceptance\",\n\t\"acceptanceRole\",\n\t\"skill\",\n\t\"skills\",\n\t\"skillPath\",\n\t\"extensions\",\n\t\"subagentOnlyExtensions\",\n\t\"output\",\n\t\"defaultReads\",\n\t\"defaultProgress\",\n\t\"interactive\",\n\t\"maxSubagentDepth\",\n\t\"completionGuard\",\n\t\"toolBudget\",\n\t\"permission\",\n\t\"permissions\",\n\t\"memory\",\n\t\"runner\",\n]);\n\nfunction joinComma(values: string[] | undefined): string | undefined {\n\tif (!values || values.length === 0) return undefined;\n\treturn values.join(\", \");\n}\n\ninterface SerializeAgentOptions {\n\tpreserveFrontmatterFields?: ReadonlySet<string>;\n}\n\nexport function serializeAgent(config: AgentConfig, options: SerializeAgentOptions = {}): string {\n\tconst lines: string[] = [];\n\tconst preserve = (...fields: string[]) => fields.some((field) => options.preserveFrontmatterFields?.has(field));\n\tconst preservingExistingFrontmatter = options.preserveFrontmatterFields !== undefined;\n\tlines.push(\"---\");\n\tlines.push(`name: ${frontmatterNameForConfig(config)}`);\n\tif (config.packageName) lines.push(`package: ${config.packageName}`);\n\tlines.push(`description: ${config.description}`);\n\tconst aliasesValue = joinComma(config.aliases);\n\tif (aliasesValue || preserve(\"alias\", \"aliases\")) lines.push(`aliases: ${aliasesValue ?? \"\"}`);\n\n\tconst tools = [...(config.tools ?? []), ...(config.mcpDirectTools ?? []).map((tool) => `mcp:${tool}`)];\n\tconst toolsValue = joinComma(tools);\n\tif (toolsValue || preserve(\"tools\")) lines.push(`tools: ${toolsValue ?? \"\"}`);\n\n\tif (config.model || preserve(\"model\")) lines.push(`model: ${config.model ?? \"\"}`);\n\tconst fallbackModelsValue = joinComma(config.fallbackModels);\n\tif (fallbackModelsValue || preserve(\"fallbackModels\")) lines.push(`fallbackModels: ${fallbackModelsValue ?? \"\"}`);\n\tif (\n\t\t(config.thinking && (config.thinking !== \"off\" || preserve(\"thinking\"))) ||\n\t\t(!config.thinking && preserve(\"thinking\"))\n\t) {\n\t\tlines.push(`thinking: ${config.thinking ?? \"\"}`);\n\t}\n\tif (!preservingExistingFrontmatter || preserve(\"systemPromptMode\"))\n\t\tlines.push(`systemPromptMode: ${config.systemPromptMode}`);\n\tif (!preservingExistingFrontmatter || preserve(\"inheritProjectContext\"))\n\t\tlines.push(`inheritProjectContext: ${config.inheritProjectContext ? \"true\" : \"false\"}`);\n\tif (!preservingExistingFrontmatter || preserve(\"inheritSkills\"))\n\t\tlines.push(`inheritSkills: ${config.inheritSkills ? \"true\" : \"false\"}`);\n\tif (config.defaultContext || preserve(\"defaultContext\"))\n\t\tlines.push(`defaultContext: ${config.defaultContext ?? \"\"}`);\n\tif (config.runner || preserve(\"runner\")) {\n\t\tif (config.runner) {\n\t\t\tlines.push(\"runner:\");\n\t\t\tfor (const line of stringifyYaml(config.runner).trimEnd().split(\"\\n\")) lines.push(`  ${line}`);\n\t\t} else {\n\t\t\tlines.push(\"runner:\");\n\t\t}\n\t}\n\tif (config.defaultAsync !== undefined || preserve(\"async\"))\n\t\tlines.push(`async: ${config.defaultAsync === undefined ? \"\" : config.defaultAsync ? \"true\" : \"false\"}`);\n\tif (config.defaultTimeoutMs !== undefined || preserve(\"timeoutMs\"))\n\t\tlines.push(`timeoutMs: ${config.defaultTimeoutMs ?? \"\"}`);\n\tif (config.defaultTurnBudget || preserve(\"turnBudget\"))\n\t\tlines.push(`turnBudget: ${config.defaultTurnBudget ? JSON.stringify(config.defaultTurnBudget) : \"\"}`);\n\tif (config.defaultAcceptance !== undefined || preserve(\"acceptance\")) {\n\t\tlines.push(\n\t\t\t`acceptance: ${\n\t\t\t\tconfig.defaultAcceptance === undefined\n\t\t\t\t\t? \"\"\n\t\t\t\t\t: typeof config.defaultAcceptance === \"object\"\n\t\t\t\t\t\t? JSON.stringify(config.defaultAcceptance)\n\t\t\t\t\t\t: String(config.defaultAcceptance)\n\t\t\t}`,\n\t\t);\n\t}\n\tif (config.acceptanceRole || preserve(\"acceptanceRole\"))\n\t\tlines.push(`acceptanceRole: ${config.acceptanceRole ?? \"\"}`);\n\n\tconst skillsValue = joinComma(config.skills);\n\tif (skillsValue || preserve(\"skill\", \"skills\")) lines.push(`skills: ${skillsValue ?? \"\"}`);\n\tconst skillPathValue = joinComma(config.skillPath);\n\tif (skillPathValue || preserve(\"skillPath\")) lines.push(`skillPath: ${skillPathValue ?? \"\"}`);\n\n\tif (config.extensions !== undefined) {\n\t\tconst extensionsValue = joinComma(config.extensions);\n\t\tlines.push(`extensions: ${extensionsValue ?? \"\"}`);\n\t}\n\tif (config.subagentOnlyExtensions !== undefined || preserve(\"subagentOnlyExtensions\")) {\n\t\tconst subagentOnlyExtensionsValue = joinComma(config.subagentOnlyExtensions);\n\t\tlines.push(`subagentOnlyExtensions: ${subagentOnlyExtensionsValue ?? \"\"}`);\n\t}\n\n\tif (config.output) lines.push(`output: ${config.output}`);\n\n\tconst readsValue = joinComma(config.defaultReads);\n\tif (readsValue) lines.push(`defaultReads: ${readsValue}`);\n\n\tif (config.defaultProgress) lines.push(\"defaultProgress: true\");\n\tif (config.interactive) lines.push(\"interactive: true\");\n\tconst maxSubagentDepth = config.maxSubagentDepth;\n\tif (typeof maxSubagentDepth === \"number\" && Number.isInteger(maxSubagentDepth) && maxSubagentDepth >= 0) {\n\t\tlines.push(`maxSubagentDepth: ${maxSubagentDepth}`);\n\t}\n\tif (config.completionGuard === false || preserve(\"completionGuard\")) {\n\t\tlines.push(\n\t\t\t`completionGuard: ${config.completionGuard === undefined ? \"\" : config.completionGuard ? \"true\" : \"false\"}`,\n\t\t);\n\t}\n\tif (config.toolBudget || preserve(\"toolBudget\")) {\n\t\tlines.push(`toolBudget: ${config.toolBudget ? JSON.stringify(config.toolBudget) : \"\"}`);\n\t}\n\tif (config.permissions || preserve(\"permission\", \"permissions\")) {\n\t\tconst key = preserve(\"permission\") && !preserve(\"permissions\") ? \"permission\" : \"permissions\";\n\t\tlines.push(`${key}:`);\n\t\tif (config.permissions) {\n\t\t\tfor (const line of stringifyYaml(config.permissions).trimEnd().split(\"\\n\")) lines.push(`  ${line}`);\n\t\t}\n\t}\n\n\tif (config.memory) {\n\t\tlines.push(\"memory:\");\n\t\tlines.push(`  scope: ${config.memory.scope}`);\n\t\tlines.push(`  path: ${config.memory.path}`);\n\t}\n\n\tif (config.extraFields) {\n\t\tfor (const [key, value] of Object.entries(config.extraFields)) {\n\t\t\tif (KNOWN_FIELDS.has(key)) continue;\n\t\t\tif (typeof value === \"string\" && value.includes(\"\\n\")) {\n\t\t\t\t// Multi-line block value (e.g. permission: nested YAML)\n\t\t\t\tlines.push(`${key}:`);\n\t\t\t\tfor (const blockLine of value.split(\"\\n\")) {\n\t\t\t\t\tlines.push(`  ${blockLine}`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlines.push(`${key}: ${value}`);\n\t\t\t}\n\t\t}\n\t}\n\n\tlines.push(\"---\");\n\n\tconst body = config.systemPrompt ?? \"\";\n\treturn `${lines.join(\"\\n\")}\\n\\n${body}\\n`;\n}\n"]}