@actant/core 0.2.0 → 0.2.2

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/builder/cursor-builder.ts","../src/permissions/permission-presets.ts","../src/builder/claude-code-builder.ts","../src/builder/custom-builder.ts","../src/builder/workspace-builder.ts","../src/builder/handlers/skills-handler.ts","../src/builder/handlers/prompts-handler.ts","../src/builder/handlers/mcp-servers-handler.ts","../src/builder/handlers/workflow-handler.ts","../src/builder/handlers/plugins-handler.ts","../src/scheduler/task-queue.ts","../src/scheduler/execution-log.ts","../src/scheduler/task-dispatcher.ts","../src/scheduler/employee-scheduler.ts","../src/scheduler/inputs/input-router.ts","../src/scheduler/inputs/heartbeat-input.ts","../src/scheduler/inputs/cron-input.ts","../src/scheduler/inputs/hook-input.ts","../src/scheduler/schedule-config.ts","../src/template/schema/template-schema.ts","../src/template/loader/template-loader.ts","../src/template/schema/config-validators.ts","../src/template/registry/template-registry.ts","../src/domain/base-component-manager.ts","../src/template/watcher/template-file-watcher.ts","../src/initializer/agent-initializer.ts","../src/state/instance-meta-schema.ts","../src/state/instance-meta-io.ts","../src/state/instance-registry.ts","../src/initializer/pipeline/initialization-pipeline.ts","../src/initializer/context/context-materializer.ts","../src/initializer/pipeline/step-executor.ts","../src/initializer/pipeline/step-registry.ts","../src/initializer/steps/mkdir-step.ts","../src/initializer/steps/exec-step.ts","../src/initializer/steps/file-copy-step.ts","../src/initializer/steps/git-clone-step.ts","../src/initializer/steps/npm-install-step.ts","../src/initializer/steps/index.ts","../src/manager/agent-manager.ts","../src/manager/launcher/backend-registry.ts","../src/manager/launcher/builtin-backends.ts","../src/manager/launcher/backend-resolver.ts","../src/manager/launcher/process-watcher.ts","../src/manager/launcher/process-utils.ts","../src/manager/launch-mode-handler.ts","../src/manager/restart-tracker.ts","../src/communicator/claude-code-communicator.ts","../src/communicator/cursor-communicator.ts","../src/communicator/create-communicator.ts","../src/manager/launcher/mock-launcher.ts","../src/manager/launcher/process-launcher.ts","../src/manager/launcher/process-log-writer.ts","../src/manager/launcher/create-launcher.ts","../src/domain/skill/skill-manager.ts","../src/domain/prompt/prompt-manager.ts","../src/domain/mcp/mcp-config-manager.ts","../src/domain/workflow/workflow-manager.ts","../src/domain/plugin/plugin-manager.ts","../src/permissions/permission-policy-enforcer.ts","../src/permissions/permission-audit.ts","../src/session/session-registry.ts","../src/source/github-source.ts","../src/source/local-source.ts","../src/source/source-manager.ts","../src/version/sync-report.ts"],"sourcesContent":["import { writeFile, mkdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n AgentBackendType,\n SkillDefinition,\n PromptDefinition,\n McpServerDefinition,\n WorkflowDefinition,\n PluginDefinition,\n PermissionsInput,\n} from \"@actant/shared\";\nimport { createLogger } from \"@actant/shared\";\nimport type { BackendBuilder, VerifyResult } from \"./backend-builder\";\nimport { resolvePermissionsWithMcp } from \"../permissions/permission-presets\";\n\nconst logger = createLogger(\"cursor-builder\");\n\nexport class CursorBuilder implements BackendBuilder {\n readonly backendType: AgentBackendType = \"cursor\";\n\n async scaffold(workspaceDir: string): Promise<void> {\n await mkdir(join(workspaceDir, \".cursor\", \"rules\"), { recursive: true });\n await mkdir(join(workspaceDir, \"prompts\"), { recursive: true });\n await writeFile(join(workspaceDir, \"AGENTS.md\"), \"# Agent Skills\\n\", \"utf-8\");\n }\n\n async materializeSkills(workspaceDir: string, skills: SkillDefinition[]): Promise<void> {\n const rulesDir = join(workspaceDir, \".cursor\", \"rules\");\n for (const skill of skills) {\n const fileName = `${skill.name.replace(/[/\\\\]/g, \"-\")}.mdc`;\n const content = [\n \"---\",\n `description: \"${(skill.description ?? skill.name).replace(/\"/g, '\\\\\"')}\"`,\n \"alwaysApply: true\",\n \"---\",\n \"\",\n skill.content,\n \"\",\n ].join(\"\\n\");\n await writeFile(join(rulesDir, fileName), content, \"utf-8\");\n }\n const sections = skills.map((s) => {\n const header = `## ${s.name}`;\n const desc = s.description ? `\\n> ${s.description}\\n` : \"\";\n return `${header}${desc}\\n${s.content}`;\n });\n const agentsContent = `# Agent Skills\\n\\n${sections.join(\"\\n\\n---\\n\\n\")}\\n`;\n await writeFile(join(workspaceDir, \"AGENTS.md\"), agentsContent, \"utf-8\");\n logger.debug({ workspaceDir, count: skills.length }, \"Skills materialized\");\n }\n\n async materializePrompts(workspaceDir: string, prompts: PromptDefinition[]): Promise<void> {\n const content = prompts\n .map((p) => {\n const lines = [`## ${p.name}`];\n if (p.description) lines.push(`\\n> ${p.description}\\n`);\n lines.push(\"\", p.content);\n return lines.join(\"\\n\");\n })\n .join(\"\\n\\n---\\n\\n\");\n await writeFile(join(workspaceDir, \"prompts\", \"system.md\"), content + \"\\n\", \"utf-8\");\n }\n\n async materializeMcpConfig(workspaceDir: string, servers: McpServerDefinition[]): Promise<void> {\n const configDir = join(workspaceDir, \".cursor\");\n await mkdir(configDir, { recursive: true });\n\n const mcpConfig: Record<\n string,\n { command: string; args: string[]; env?: Record<string, string> }\n > = {};\n for (const server of servers) {\n mcpConfig[server.name] = {\n command: server.command,\n args: server.args ?? [],\n ...(server.env && Object.keys(server.env).length > 0 ? { env: server.env } : {}),\n };\n }\n await writeFile(\n join(configDir, \"mcp.json\"),\n JSON.stringify({ mcpServers: mcpConfig }, null, 2) + \"\\n\",\n \"utf-8\",\n );\n }\n\n async materializePlugins(workspaceDir: string, plugins: PluginDefinition[]): Promise<void> {\n const npmPlugins = plugins.filter((p) => p.enabled !== false && p.type === \"npm\");\n if (npmPlugins.length === 0) return;\n\n const configDir = join(workspaceDir, \".cursor\");\n await mkdir(configDir, { recursive: true });\n const recommendations = npmPlugins.map((p) => p.source ?? p.name);\n await writeFile(\n join(configDir, \"extensions.json\"),\n JSON.stringify({ recommendations }, null, 2) + \"\\n\",\n \"utf-8\",\n );\n }\n\n async materializeWorkflow(workspaceDir: string, workflow: WorkflowDefinition): Promise<void> {\n const trellisDir = join(workspaceDir, \".trellis\");\n await mkdir(trellisDir, { recursive: true });\n await writeFile(join(trellisDir, \"workflow.md\"), workflow.content + \"\\n\", \"utf-8\");\n }\n\n async injectPermissions(\n workspaceDir: string,\n servers: McpServerDefinition[],\n permissions?: PermissionsInput,\n ): Promise<void> {\n // Cursor doesn't have the same permission model as Claude Code.\n // Best-effort: write .cursor/settings.json with allowed tools if we have permissions.\n if (!permissions) return;\n\n const resolved = resolvePermissionsWithMcp(\n permissions,\n servers.map((s) => s.name),\n );\n if (!resolved.allow?.length) return;\n\n try {\n const configDir = join(workspaceDir, \".cursor\");\n await mkdir(configDir, { recursive: true });\n const settings = {\n // Cursor may support agent tool allowlist; structure is best-effort\n agentTools: { allow: resolved.allow },\n };\n await writeFile(\n join(configDir, \"settings.json\"),\n JSON.stringify(settings, null, 2) + \"\\n\",\n \"utf-8\",\n );\n } catch {\n logger.warn(\n \"Cursor permission model differs from Claude Code; .cursor/settings.json injection skipped\",\n );\n }\n }\n\n async verify(workspaceDir: string): Promise<VerifyResult> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n const checks = [\n { path: \".cursor\", type: \"dir\" as const },\n { path: \"AGENTS.md\", type: \"file\" as const },\n ];\n\n for (const check of checks) {\n try {\n const s = await stat(join(workspaceDir, check.path));\n if (check.type === \"dir\" && !s.isDirectory()) {\n errors.push(`Expected directory: ${check.path}`);\n } else if (check.type === \"file\" && !s.isFile()) {\n errors.push(`Expected file: ${check.path}`);\n }\n } catch {\n warnings.push(`Missing: ${check.path}`);\n }\n }\n\n return { valid: errors.length === 0, errors, warnings };\n }\n}\n","import type { PermissionsConfig, PermissionsInput } from \"@actant/shared\";\n\nconst PRESETS: Record<string, PermissionsConfig> = {\n permissive: {\n allow: [\"*\"],\n deny: [],\n ask: [],\n defaultMode: \"bypassPermissions\",\n },\n standard: {\n allow: [\n \"Read\",\n \"Edit\",\n \"Write\",\n \"Bash(npm run *)\",\n \"Bash(git *)\",\n \"WebFetch\",\n \"WebSearch\",\n ],\n deny: [],\n ask: [\"Bash\"],\n defaultMode: \"default\",\n },\n restricted: {\n allow: [\"Read\", \"WebSearch\"],\n deny: [\"Bash\", \"WebFetch\"],\n ask: [\"Edit\", \"Write\"],\n defaultMode: \"dontAsk\",\n },\n readonly: {\n allow: [\"Read\", \"WebFetch\", \"WebSearch\"],\n deny: [\"Bash\", \"Edit\", \"Write\", \"MultiEdit\"],\n ask: [],\n defaultMode: \"plan\",\n },\n};\n\nexport function resolvePermissions(input: PermissionsInput | undefined): PermissionsConfig {\n if (!input) return { ...PRESETS.permissive };\n if (typeof input === \"string\") {\n const preset = PRESETS[input];\n if (!preset) throw new Error(`Unknown permission preset: ${input}`);\n return { ...preset };\n }\n return { ...input };\n}\n\nexport function resolvePermissionsWithMcp(\n input: PermissionsInput | undefined,\n mcpServerNames: string[],\n): PermissionsConfig {\n const resolved = resolvePermissions(input);\n const allow = [...(resolved.allow ?? [])];\n // Auto-append MCP tools to allow list (unless wildcard already covers everything)\n if (!allow.includes(\"*\") && mcpServerNames.length > 0) {\n for (const name of mcpServerNames) {\n allow.push(`mcp__${name}`);\n }\n }\n return { ...resolved, allow };\n}\n","import { writeFile, mkdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n SkillDefinition,\n PromptDefinition,\n McpServerDefinition,\n WorkflowDefinition,\n PluginDefinition,\n PermissionsInput,\n} from \"@actant/shared\";\nimport { createLogger } from \"@actant/shared\";\nimport type { BackendBuilder, VerifyResult } from \"./backend-builder\";\nimport { resolvePermissionsWithMcp } from \"../permissions/permission-presets\";\n\nconst logger = createLogger(\"claude-code-builder\");\n\nexport class ClaudeCodeBuilder implements BackendBuilder {\n readonly backendType = \"claude-code\" as const;\n\n async scaffold(workspaceDir: string): Promise<void> {\n await mkdir(join(workspaceDir, \".claude\"), { recursive: true });\n await mkdir(join(workspaceDir, \"prompts\"), { recursive: true });\n }\n\n async materializeSkills(workspaceDir: string, skills: SkillDefinition[]): Promise<void> {\n const sections = skills.map((s) => {\n const header = `## ${s.name}`;\n const desc = s.description ? `\\n> ${s.description}\\n` : \"\";\n return `${header}${desc}\\n${s.content}`;\n });\n const agentsContent = `# Agent Skills\\n\\n${sections.join(\"\\n\\n---\\n\\n\")}\\n`;\n await writeFile(join(workspaceDir, \"AGENTS.md\"), agentsContent, \"utf-8\");\n\n const claudeContent = `# Claude Code Skills\\n\\n${sections.join(\"\\n\\n---\\n\\n\")}\\n`;\n await writeFile(join(workspaceDir, \"CLAUDE.md\"), claudeContent, \"utf-8\");\n logger.debug({ workspaceDir, count: skills.length }, \"Skills materialized\");\n }\n\n async materializePrompts(workspaceDir: string, prompts: PromptDefinition[]): Promise<void> {\n const content = prompts\n .map((p) => {\n const lines = [`## ${p.name}`];\n if (p.description) lines.push(`\\n> ${p.description}\\n`);\n lines.push(\"\", p.content);\n return lines.join(\"\\n\");\n })\n .join(\"\\n\\n---\\n\\n\");\n await writeFile(join(workspaceDir, \"prompts\", \"system.md\"), content + \"\\n\", \"utf-8\");\n }\n\n async materializeMcpConfig(workspaceDir: string, servers: McpServerDefinition[]): Promise<void> {\n const configDir = join(workspaceDir, \".claude\");\n await mkdir(configDir, { recursive: true });\n\n const mcpConfig: Record<\n string,\n { command: string; args: string[]; env?: Record<string, string> }\n > = {};\n for (const server of servers) {\n mcpConfig[server.name] = {\n command: server.command,\n args: server.args ?? [],\n ...(server.env && Object.keys(server.env).length > 0 ? { env: server.env } : {}),\n };\n }\n await writeFile(\n join(configDir, \"mcp.json\"),\n JSON.stringify({ mcpServers: mcpConfig }, null, 2) + \"\\n\",\n \"utf-8\",\n );\n }\n\n async materializePlugins(workspaceDir: string, plugins: PluginDefinition[]): Promise<void> {\n const enabledPlugins = plugins.filter((p) => p.enabled !== false);\n if (enabledPlugins.length === 0) return;\n\n const configDir = join(workspaceDir, \".claude\");\n await mkdir(configDir, { recursive: true });\n const entries = enabledPlugins.map((p) => {\n if (p.type === \"npm\") {\n return { name: p.name, package: p.source ?? p.name, ...p.config };\n }\n return { name: p.name, type: p.type, source: p.source, ...p.config };\n });\n await writeFile(\n join(configDir, \"plugins.json\"),\n JSON.stringify(entries, null, 2) + \"\\n\",\n \"utf-8\",\n );\n }\n\n async materializeWorkflow(workspaceDir: string, workflow: WorkflowDefinition): Promise<void> {\n const trellisDir = join(workspaceDir, \".trellis\");\n await mkdir(trellisDir, { recursive: true });\n await writeFile(join(trellisDir, \"workflow.md\"), workflow.content + \"\\n\", \"utf-8\");\n }\n\n async injectPermissions(\n workspaceDir: string,\n servers: McpServerDefinition[],\n permissions?: PermissionsInput,\n ): Promise<void> {\n const configDir = join(workspaceDir, \".claude\");\n await mkdir(configDir, { recursive: true });\n\n const resolved = resolvePermissionsWithMcp(\n permissions,\n servers.map((s) => s.name),\n );\n\n const settings: Record<string, unknown> = {\n permissions: {\n allow: resolved.allow ?? [],\n deny: resolved.deny ?? [],\n ask: resolved.ask ?? [],\n },\n };\n if (resolved.sandbox) {\n settings.sandbox = resolved.sandbox;\n }\n await writeFile(\n join(configDir, \"settings.local.json\"),\n JSON.stringify(settings, null, 2) + \"\\n\",\n \"utf-8\",\n );\n }\n\n async verify(workspaceDir: string): Promise<VerifyResult> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n const checks = [\n { path: \".claude\", type: \"dir\" as const },\n { path: \"AGENTS.md\", type: \"file\" as const },\n { path: \"CLAUDE.md\", type: \"file\" as const },\n ];\n\n for (const check of checks) {\n try {\n const s = await stat(join(workspaceDir, check.path));\n if (check.type === \"dir\" && !s.isDirectory()) {\n errors.push(`Expected directory: ${check.path}`);\n } else if (check.type === \"file\" && !s.isFile()) {\n errors.push(`Expected file: ${check.path}`);\n }\n } catch {\n warnings.push(`Missing: ${check.path}`);\n }\n }\n\n return { valid: errors.length === 0, errors, warnings };\n }\n}\n","import type { AgentBackendType } from \"@actant/shared\";\nimport { CursorBuilder } from \"./cursor-builder\";\n\nexport interface CustomBuilderConfig {\n configDir?: string; // default \".cursor\"\n skillsDir?: string; // default \".cursor/rules\"\n // Additional overrides...\n}\n\nexport class CustomBuilder extends CursorBuilder {\n override readonly backendType: AgentBackendType = \"custom\";\n\n // CustomBuilder inherits CursorBuilder behavior but with \"custom\" type\n // Future: use config to customize paths\n}\n","import { createLogger } from \"@actant/shared\";\nimport type {\n AgentBackendType,\n DomainContextConfig,\n McpServerDefinition,\n PermissionsInput,\n} from \"@actant/shared\";\nimport type { SkillManager } from \"../domain/skill/skill-manager\";\nimport type { PromptManager } from \"../domain/prompt/prompt-manager\";\nimport type { McpConfigManager } from \"../domain/mcp/mcp-config-manager\";\nimport type { WorkflowManager } from \"../domain/workflow/workflow-manager\";\nimport type { PluginManager } from \"../domain/plugin/plugin-manager\";\nimport type { BaseComponentManager, NamedComponent } from \"../domain/base-component-manager\";\nimport type { BackendBuilder, VerifyResult } from \"./backend-builder\";\nimport type { ComponentTypeHandler } from \"./component-type-handler\";\nimport { CursorBuilder } from \"./cursor-builder\";\nimport { ClaudeCodeBuilder } from \"./claude-code-builder\";\nimport {\n skillsHandler,\n promptsHandler,\n mcpServersHandler,\n workflowHandler,\n pluginsHandler,\n} from \"./handlers\";\n\nconst logger = createLogger(\"workspace-builder\");\n\nexport interface DomainManagers {\n skills?: SkillManager;\n prompts?: PromptManager;\n mcp?: McpConfigManager;\n workflows?: WorkflowManager;\n plugins?: PluginManager;\n}\n\nexport interface WorkspaceBuildResult {\n verify: VerifyResult;\n backendType: AgentBackendType;\n}\n\nexport class WorkspaceBuilder {\n private readonly builders: Map<AgentBackendType, BackendBuilder>;\n private readonly handlers: ComponentTypeHandler[] = [];\n\n constructor(private readonly managers?: DomainManagers) {\n this.builders = new Map<AgentBackendType, BackendBuilder>([\n [\"cursor\", new CursorBuilder()],\n [\"claude-code\", new ClaudeCodeBuilder()],\n ]);\n this.handlers.push(skillsHandler, promptsHandler, mcpServersHandler, workflowHandler, pluginsHandler);\n }\n\n /** Register a custom BackendBuilder (e.g. for \"custom\" backend type) */\n registerBuilder(builder: BackendBuilder): void {\n this.builders.set(builder.backendType, builder);\n }\n\n /** Register a component type handler for custom component types or extensions */\n registerHandler(handler: ComponentTypeHandler): void {\n this.handlers.push(handler);\n }\n\n private getManager(contextKey: string): BaseComponentManager<NamedComponent> | undefined {\n const managerMap: Record<string, BaseComponentManager<NamedComponent> | undefined> = {\n skills: this.managers?.skills,\n prompts: this.managers?.prompts,\n mcpServers: this.managers?.mcp,\n workflow: this.managers?.workflows,\n plugins: this.managers?.plugins,\n };\n return managerMap[contextKey];\n }\n\n /**\n * Build workspace using the 6-step pipeline:\n * 1. Resolve — select builder + resolve domain context names to definitions\n * 2. Validate — check that required components exist\n * 3. Scaffold — create directory structure\n * 4. Materialize — write component files\n * 5. Inject — set up permissions\n * 6. Verify — check workspace integrity\n */\n async build(\n workspaceDir: string,\n domainContext: DomainContextConfig,\n backendType: AgentBackendType = \"cursor\",\n permissions?: PermissionsInput,\n ): Promise<WorkspaceBuildResult> {\n // Step 1: Resolve\n let builder = this.builders.get(backendType);\n if (!builder) {\n logger.warn({ backendType }, \"No builder registered, falling back to cursor\");\n builder = this.builders.get(\"cursor\");\n }\n if (!builder) {\n throw new Error(`No builder available for backend type: ${backendType}`);\n }\n const activeBuilder = builder;\n\n // Step 2: Validate (log warnings for missing references, don't fail)\n // Already handled by resolve — missing managers use placeholders or empty arrays\n\n // Step 3: Scaffold\n await activeBuilder.scaffold(workspaceDir);\n logger.debug({ workspaceDir }, \"Scaffold complete\");\n\n // Step 4: Materialize via registered handlers\n let resolvedMcpServers: McpServerDefinition[] = [];\n\n for (const handler of this.handlers) {\n const refs = domainContext[handler.contextKey as keyof DomainContextConfig];\n if (refs === undefined || refs === null) continue;\n if (Array.isArray(refs) && refs.length === 0) continue;\n\n const manager = this.getManager(handler.contextKey);\n const definitions = handler.resolve(refs, manager);\n if (definitions.length > 0) {\n await handler.materialize(workspaceDir, definitions, backendType, activeBuilder);\n if (handler.contextKey === \"mcpServers\") {\n resolvedMcpServers = definitions as McpServerDefinition[];\n }\n }\n }\n\n if (domainContext.extensions) {\n for (const [key, refs] of Object.entries(domainContext.extensions)) {\n const handler = this.handlers.find((h) => h.contextKey === key);\n if (handler && Array.isArray(refs) && refs.length > 0) {\n const defs = handler.resolve(refs, this.getManager(key));\n if (defs.length > 0) {\n await handler.materialize(workspaceDir, defs, backendType, activeBuilder);\n if (handler.contextKey === \"mcpServers\") {\n resolvedMcpServers = [...resolvedMcpServers, ...(defs as McpServerDefinition[])];\n }\n }\n }\n }\n }\n\n logger.debug({ workspaceDir }, \"Materialize complete\");\n\n // Step 5: Inject permissions\n await activeBuilder.injectPermissions(workspaceDir, resolvedMcpServers, permissions);\n logger.debug({ workspaceDir }, \"Permissions injected\");\n\n // Step 6: Verify\n const verify = await activeBuilder.verify(workspaceDir);\n logger.info({ workspaceDir, backendType: activeBuilder.backendType, valid: verify.valid }, \"Workspace build complete\");\n\n return { verify, backendType: activeBuilder.backendType };\n }\n}\n","import type { SkillDefinition } from \"@actant/shared\";\nimport type { ComponentTypeHandler } from \"../component-type-handler\";\nimport type { BackendBuilder } from \"../backend-builder\";\n\nexport const skillsHandler: ComponentTypeHandler<SkillDefinition> = {\n contextKey: \"skills\",\n resolve(refs, manager) {\n if (!refs || !Array.isArray(refs) || refs.length === 0) return [];\n return (manager?.resolve(refs as string[]) ?? refs.map((name) => ({ name, content: `- ${name}` }))) as SkillDefinition[];\n },\n async materialize(workspaceDir, definitions, _backendType, builder) {\n await (builder as BackendBuilder).materializeSkills(workspaceDir, definitions);\n },\n};\n","import type { PromptDefinition } from \"@actant/shared\";\nimport type { ComponentTypeHandler } from \"../component-type-handler\";\nimport type { BackendBuilder } from \"../backend-builder\";\n\nexport const promptsHandler: ComponentTypeHandler<PromptDefinition> = {\n contextKey: \"prompts\",\n resolve(refs, manager) {\n if (!refs || !Array.isArray(refs) || refs.length === 0) return [];\n return (manager?.resolve(refs as string[]) ?? refs.map((name) => ({ name, content: `- ${name}` }))) as PromptDefinition[];\n },\n async materialize(workspaceDir, definitions, _backendType, builder) {\n await (builder as BackendBuilder).materializePrompts(workspaceDir, definitions);\n },\n};\n","import type { McpServerDefinition, McpServerRef } from \"@actant/shared\";\nimport type { ComponentTypeHandler } from \"../component-type-handler\";\nimport type { BackendBuilder } from \"../backend-builder\";\n\nfunction isMcpServerRef(obj: unknown): obj is McpServerRef {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"name\" in obj &&\n \"command\" in obj &&\n typeof (obj as McpServerRef).name === \"string\" &&\n typeof (obj as McpServerRef).command === \"string\"\n );\n}\n\nexport const mcpServersHandler: ComponentTypeHandler<McpServerDefinition> = {\n contextKey: \"mcpServers\",\n resolve(refs, manager) {\n if (!refs || !Array.isArray(refs) || refs.length === 0) return [];\n const arr = refs as unknown[];\n if (arr.every(isMcpServerRef)) {\n return arr.map((ref) => ({\n name: ref.name,\n command: ref.command,\n args: ref.args,\n env: ref.env,\n })) as McpServerDefinition[];\n }\n return (manager?.resolve(arr as string[]) ?? []) as McpServerDefinition[];\n },\n async materialize(workspaceDir, definitions, _backendType, builder) {\n await (builder as BackendBuilder).materializeMcpConfig(workspaceDir, definitions);\n },\n};\n","import type { WorkflowDefinition } from \"@actant/shared\";\nimport type { ComponentTypeHandler } from \"../component-type-handler\";\nimport type { BackendBuilder } from \"../backend-builder\";\n\nexport const workflowHandler: ComponentTypeHandler<WorkflowDefinition> = {\n contextKey: \"workflow\",\n resolve(refs, manager) {\n if (refs === undefined || refs === null) return [];\n const name =\n typeof refs === \"string\" ? refs : Array.isArray(refs) && typeof refs[0] === \"string\" ? refs[0] : undefined;\n if (!name) return [];\n const resolved = manager?.resolve([name]);\n if (resolved && resolved.length > 0) return resolved as WorkflowDefinition[];\n return [\n {\n name,\n content: `# Workflow: ${name}\\n\\n> Workflow \"${name}\" referenced by name.\\n`,\n } as WorkflowDefinition,\n ];\n },\n async materialize(workspaceDir, definitions, _backendType, builder) {\n const wf = definitions[0];\n if (wf) {\n await (builder as BackendBuilder).materializeWorkflow(workspaceDir, wf);\n }\n },\n};\n","import type { PluginDefinition } from \"@actant/shared\";\nimport type { ComponentTypeHandler } from \"../component-type-handler\";\nimport type { BackendBuilder } from \"../backend-builder\";\n\nexport const pluginsHandler: ComponentTypeHandler<PluginDefinition> = {\n contextKey: \"plugins\",\n resolve(refs, manager) {\n if (!refs || !Array.isArray(refs) || refs.length === 0) return [];\n return (manager?.resolve(refs as string[]) ?? []) as PluginDefinition[];\n },\n async materialize(workspaceDir, definitions, _backendType, builder) {\n await (builder as BackendBuilder).materializePlugins(workspaceDir, definitions);\n },\n};\n","import type { AgentTask, TaskPriority } from \"./types\";\n\nconst PRIORITY_ORDER: Record<TaskPriority, number> = {\n critical: 0,\n high: 1,\n normal: 2,\n low: 3,\n};\n\nexport class TaskQueue {\n private queues = new Map<string, AgentTask[]>();\n private processing = new Set<string>();\n\n /** Enqueue a task. Sorts by priority. */\n enqueue(task: AgentTask): void {\n if (!this.queues.has(task.agentName)) {\n this.queues.set(task.agentName, []);\n }\n const queue = this.queues.get(task.agentName) ?? [];\n queue.push(task);\n queue.sort((a, b) => PRIORITY_ORDER[a.priority] - PRIORITY_ORDER[b.priority]);\n }\n\n /** Dequeue the highest-priority task for an agent. Returns undefined if empty or agent is processing. */\n dequeue(agentName: string): AgentTask | undefined {\n if (this.processing.has(agentName)) return undefined;\n const queue = this.queues.get(agentName);\n if (!queue || queue.length === 0) return undefined;\n return queue.shift();\n }\n\n /** Mark an agent as currently processing (serial execution). */\n markProcessing(agentName: string): void {\n this.processing.add(agentName);\n }\n\n /** Mark an agent as done processing. */\n markDone(agentName: string): void {\n this.processing.delete(agentName);\n }\n\n /** Check if an agent has queued tasks. */\n hasTasks(agentName: string): boolean {\n const queue = this.queues.get(agentName);\n return !!queue && queue.length > 0;\n }\n\n /** Check if an agent is currently processing a task. */\n isProcessing(agentName: string): boolean {\n return this.processing.has(agentName);\n }\n\n /** Get the number of queued tasks for an agent. */\n queueSize(agentName: string): number {\n return this.queues.get(agentName)?.length ?? 0;\n }\n\n /** Get all queued tasks for an agent. */\n peek(agentName: string): AgentTask[] {\n return [...(this.queues.get(agentName) ?? [])];\n }\n\n /** Clear all tasks for an agent. */\n clear(agentName: string): void {\n this.queues.delete(agentName);\n this.processing.delete(agentName);\n }\n\n /** Clear all queues. */\n clearAll(): void {\n this.queues.clear();\n this.processing.clear();\n }\n}\n","import { writeFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { createLogger } from \"@actant/shared\";\nimport type { ExecutionRecord } from \"./types\";\n\nconst logger = createLogger(\"execution-log\");\n\nexport class ExecutionLog {\n private records: ExecutionRecord[] = [];\n private persistDir?: string;\n private maxInMemory = 1000;\n\n setPersistDir(dir: string): void {\n this.persistDir = dir;\n }\n\n setMaxInMemory(max: number): void {\n this.maxInMemory = max;\n }\n\n async record(entry: ExecutionRecord): Promise<void> {\n this.records.push(entry);\n\n // Trim old records if over limit\n if (this.records.length > this.maxInMemory) {\n this.records = this.records.slice(-this.maxInMemory);\n }\n\n if (this.persistDir) {\n await this.persistRecord(entry);\n }\n }\n\n /** Get recent execution records, optionally filtered by agent. */\n getRecords(agentName?: string, limit = 50): ExecutionRecord[] {\n let filtered = this.records;\n if (agentName) {\n filtered = filtered.filter((r) => r.agentName === agentName);\n }\n return filtered.slice(-limit);\n }\n\n /** Get the last execution record for an agent. */\n getLastRecord(agentName: string): ExecutionRecord | undefined {\n for (let i = this.records.length - 1; i >= 0; i--) {\n const record = this.records[i];\n if (record?.agentName === agentName) return record;\n }\n return undefined;\n }\n\n /** Count records by status for an agent. */\n getStats(agentName?: string): Record<string, number> {\n const filtered = agentName\n ? this.records.filter((r) => r.agentName === agentName)\n : this.records;\n\n const stats: Record<string, number> = {};\n for (const r of filtered) {\n stats[r.status] = (stats[r.status] ?? 0) + 1;\n }\n return stats;\n }\n\n clear(): void {\n this.records = [];\n }\n\n private async persistRecord(entry: ExecutionRecord): Promise<void> {\n if (!this.persistDir) return;\n try {\n await mkdir(this.persistDir, { recursive: true });\n const filePath = join(this.persistDir, `${entry.agentName}-log.jsonl`);\n await writeFile(filePath, JSON.stringify(entry) + \"\\n\", { flag: \"a\" });\n } catch (err) {\n logger.warn({ err, taskId: entry.taskId }, \"Failed to persist execution record\");\n }\n }\n}\n","import { createLogger } from \"@actant/shared\";\nimport type { AgentTask, ExecutionRecord } from \"./types\";\nimport type { TaskQueue } from \"./task-queue\";\nimport type { ExecutionLog } from \"./execution-log\";\n\nconst logger = createLogger(\"task-dispatcher\");\n\nexport interface PromptAgentFn {\n (agentName: string, prompt: string): Promise<string>;\n}\n\nexport class TaskDispatcher {\n private running = false;\n private dispatchInterval: ReturnType<typeof setInterval> | null = null;\n private agentNames = new Set<string>();\n\n constructor(\n private readonly queue: TaskQueue,\n private readonly log: ExecutionLog,\n private readonly promptAgent: PromptAgentFn,\n private readonly pollIntervalMs = 1000,\n ) {}\n\n /** Register an agent name to be dispatched. */\n registerAgent(agentName: string): void {\n this.agentNames.add(agentName);\n }\n\n /** Unregister an agent. */\n unregisterAgent(agentName: string): void {\n this.agentNames.delete(agentName);\n this.queue.clear(agentName);\n }\n\n /** Start the dispatch loop. */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.dispatchInterval = setInterval(() => {\n void this.tick();\n }, this.pollIntervalMs);\n logger.info(\"TaskDispatcher started\");\n }\n\n /** Stop the dispatch loop. */\n stop(): void {\n this.running = false;\n if (this.dispatchInterval) {\n clearInterval(this.dispatchInterval);\n this.dispatchInterval = null;\n }\n logger.info(\"TaskDispatcher stopped\");\n }\n\n /** Manual dispatch — process one tick immediately. */\n async tick(): Promise<void> {\n for (const agentName of this.agentNames) {\n if (this.queue.isProcessing(agentName)) continue;\n\n const task = this.queue.dequeue(agentName);\n if (!task) continue;\n\n // Process asynchronously (non-blocking for other agents)\n void this.executeTask(task);\n }\n }\n\n private async executeTask(task: AgentTask): Promise<void> {\n this.queue.markProcessing(task.agentName);\n const startedAt = new Date().toISOString();\n\n const record: ExecutionRecord = {\n taskId: task.id,\n agentName: task.agentName,\n prompt: task.prompt,\n source: task.source,\n status: \"running\",\n startedAt,\n };\n\n try {\n logger.debug(\n { taskId: task.id, agentName: task.agentName, source: task.source },\n \"Executing task\",\n );\n const result = await this.promptAgent(task.agentName, task.prompt);\n\n record.status = \"completed\";\n record.result = result;\n record.completedAt = new Date().toISOString();\n record.durationMs = Date.now() - new Date(startedAt).getTime();\n\n logger.info({ taskId: task.id, durationMs: record.durationMs }, \"Task completed\");\n } catch (err) {\n record.status = \"failed\";\n record.error = err instanceof Error ? err.message : String(err);\n record.completedAt = new Date().toISOString();\n record.durationMs = Date.now() - new Date(startedAt).getTime();\n\n logger.warn({ taskId: task.id, error: record.error }, \"Task failed\");\n } finally {\n this.queue.markDone(task.agentName);\n await this.log.record(record);\n }\n }\n\n get isRunning(): boolean {\n return this.running;\n }\n}\n","import { EventEmitter } from \"node:events\";\nimport { randomUUID } from \"node:crypto\";\nimport { createLogger } from \"@actant/shared\";\nimport { TaskQueue } from \"./task-queue\";\nimport { TaskDispatcher, type PromptAgentFn } from \"./task-dispatcher\";\nimport { ExecutionLog } from \"./execution-log\";\nimport { InputRouter } from \"./inputs/input-router\";\nimport { HeartbeatInput } from \"./inputs/heartbeat-input\";\nimport { CronInput } from \"./inputs/cron-input\";\nimport { HookInput } from \"./inputs/hook-input\";\nimport type { ScheduleConfigInput } from \"./schedule-config\";\n\nconst logger = createLogger(\"employee-scheduler\");\n\nexport class EmployeeScheduler {\n private readonly queue: TaskQueue;\n private readonly dispatcher: TaskDispatcher;\n private readonly log: ExecutionLog;\n private readonly router: InputRouter;\n private readonly eventBus: EventEmitter;\n private _running = false;\n\n constructor(\n private readonly agentName: string,\n promptAgent: PromptAgentFn,\n config?: { persistDir?: string },\n ) {\n this.queue = new TaskQueue();\n this.log = new ExecutionLog();\n if (config?.persistDir) {\n this.log.setPersistDir(config.persistDir);\n }\n this.dispatcher = new TaskDispatcher(this.queue, this.log, promptAgent);\n this.router = new InputRouter(this.queue);\n this.eventBus = new EventEmitter();\n }\n\n /** Configure schedule from template config. */\n configure(scheduleConfig: ScheduleConfigInput): void {\n if (scheduleConfig.heartbeat) {\n this.router.register(new HeartbeatInput(scheduleConfig.heartbeat));\n }\n for (const cronConfig of scheduleConfig.cron ?? []) {\n this.router.register(new CronInput(cronConfig));\n }\n for (const hookConfig of scheduleConfig.hooks ?? []) {\n this.router.register(new HookInput(hookConfig, this.eventBus));\n }\n logger.info({ agentName: this.agentName, sources: this.router.sourceCount }, \"Schedule configured\");\n }\n\n /** Start the scheduler — begins accepting and dispatching tasks. */\n start(): void {\n if (this._running) return;\n this._running = true;\n this.dispatcher.registerAgent(this.agentName);\n this.router.startAll(this.agentName);\n this.dispatcher.start();\n logger.info({ agentName: this.agentName }, \"EmployeeScheduler started\");\n }\n\n /** Stop the scheduler. */\n stop(): void {\n if (!this._running) return;\n this.router.stopAll();\n this.dispatcher.stop();\n this.dispatcher.unregisterAgent(this.agentName);\n this._running = false;\n logger.info({ agentName: this.agentName }, \"EmployeeScheduler stopped\");\n }\n\n /** Manually dispatch a one-off task. */\n dispatch(prompt: string, priority: \"low\" | \"normal\" | \"high\" | \"critical\" = \"normal\"): void {\n this.queue.enqueue({\n id: randomUUID(),\n agentName: this.agentName,\n prompt,\n priority,\n source: \"manual\",\n createdAt: new Date().toISOString(),\n });\n }\n\n /** Emit an event to trigger HookInput sources. */\n emitEvent(eventName: string, payload?: unknown): void {\n this.eventBus.emit(eventName, payload);\n }\n\n /** Get queued tasks. */\n getTasks(): { queued: number; processing: boolean; tasks: unknown[] } {\n return {\n queued: this.queue.queueSize(this.agentName),\n processing: this.queue.isProcessing(this.agentName),\n tasks: this.queue.peek(this.agentName),\n };\n }\n\n /** Get execution logs. */\n getLogs(limit?: number): unknown[] {\n return this.log.getRecords(this.agentName, limit);\n }\n\n /** Get execution stats. */\n getStats(): Record<string, number> {\n return this.log.getStats(this.agentName);\n }\n\n /** Get input sources info. */\n getSources(): { id: string; type: string; active: boolean }[] {\n return this.router.listSources();\n }\n\n get running(): boolean {\n return this._running;\n }\n\n get executionLog(): ExecutionLog {\n return this.log;\n }\n}\n","import { createLogger } from \"@actant/shared\";\nimport type { TaskQueue } from \"../task-queue\";\nimport type { InputSource } from \"./input-source\";\n\nconst logger = createLogger(\"input-router\");\n\nexport class InputRouter {\n private sources = new Map<string, InputSource>();\n private agentName?: string;\n\n constructor(private readonly queue: TaskQueue) {}\n\n /** Register an input source. */\n register(source: InputSource): void {\n if (this.sources.has(source.id)) {\n logger.warn({ id: source.id }, \"Input source already registered, replacing\");\n this.sources.get(source.id)?.stop();\n }\n this.sources.set(source.id, source);\n // If already started, start the new source too\n if (this.agentName) {\n source.start(this.agentName, (task) => this.queue.enqueue(task));\n }\n }\n\n /** Unregister an input source. */\n unregister(sourceId: string): boolean {\n const source = this.sources.get(sourceId);\n if (!source) return false;\n source.stop();\n this.sources.delete(sourceId);\n return true;\n }\n\n /** Start all registered input sources. */\n startAll(agentName: string): void {\n this.agentName = agentName;\n for (const source of this.sources.values()) {\n if (!source.active) {\n source.start(agentName, (task) => this.queue.enqueue(task));\n }\n }\n logger.info({ agentName, sourceCount: this.sources.size }, \"InputRouter started all sources\");\n }\n\n /** Stop all registered input sources. */\n stopAll(): void {\n for (const source of this.sources.values()) {\n source.stop();\n }\n this.agentName = undefined;\n logger.info(\"InputRouter stopped all sources\");\n }\n\n /** Get all registered source IDs. */\n listSources(): { id: string; type: string; active: boolean }[] {\n return Array.from(this.sources.values()).map((s) => ({\n id: s.id,\n type: s.type,\n active: s.active,\n }));\n }\n\n /** Get a specific source by ID. */\n getSource(id: string): InputSource | undefined {\n return this.sources.get(id);\n }\n\n get sourceCount(): number {\n return this.sources.size;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { createLogger } from \"@actant/shared\";\nimport type { InputSource, TaskCallback } from \"./input-source\";\n\nconst logger = createLogger(\"heartbeat-input\");\n\nexport interface HeartbeatConfig {\n intervalMs: number;\n prompt: string;\n priority?: \"low\" | \"normal\" | \"high\" | \"critical\";\n}\n\nexport class HeartbeatInput implements InputSource {\n readonly id: string;\n readonly type = \"heartbeat\";\n private interval: ReturnType<typeof setInterval> | null = null;\n private _active = false;\n\n constructor(private readonly config: HeartbeatConfig, id?: string) {\n this.id = id ?? `heartbeat-${randomUUID().slice(0, 8)}`;\n }\n\n start(agentName: string, onTask: TaskCallback): void {\n if (this._active) return;\n this._active = true;\n this.interval = setInterval(() => {\n onTask({\n id: randomUUID(),\n agentName,\n prompt: this.config.prompt,\n priority: this.config.priority ?? \"normal\",\n source: `heartbeat:${this.id}`,\n createdAt: new Date().toISOString(),\n });\n }, this.config.intervalMs);\n logger.info({ id: this.id, intervalMs: this.config.intervalMs }, \"HeartbeatInput started\");\n }\n\n stop(): void {\n if (!this._active) return;\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n this._active = false;\n logger.info({ id: this.id }, \"HeartbeatInput stopped\");\n }\n\n get active(): boolean {\n return this._active;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { Cron } from \"croner\";\nimport { createLogger } from \"@actant/shared\";\nimport type { InputSource, TaskCallback } from \"./input-source\";\n\nconst logger = createLogger(\"cron-input\");\n\nexport interface CronConfig {\n pattern: string; // e.g. \"0 9 * * *\" (every day at 9am)\n prompt: string;\n timezone?: string; // e.g. \"Asia/Shanghai\"\n priority?: \"low\" | \"normal\" | \"high\" | \"critical\";\n}\n\nexport class CronInput implements InputSource {\n readonly id: string;\n readonly type = \"cron\";\n private job: Cron | null = null;\n private _active = false;\n\n constructor(private readonly config: CronConfig, id?: string) {\n this.id = id ?? `cron-${randomUUID().slice(0, 8)}`;\n }\n\n start(agentName: string, onTask: TaskCallback): void {\n if (this._active) return;\n this._active = true;\n this.job = new Cron(\n this.config.pattern,\n {\n timezone: this.config.timezone,\n },\n () => {\n onTask({\n id: randomUUID(),\n agentName,\n prompt: this.config.prompt,\n priority: this.config.priority ?? \"normal\",\n source: `cron:${this.id}`,\n createdAt: new Date().toISOString(),\n });\n },\n );\n logger.info({ id: this.id, pattern: this.config.pattern }, \"CronInput started\");\n }\n\n stop(): void {\n if (!this._active) return;\n if (this.job) {\n this.job.stop();\n this.job = null;\n }\n this._active = false;\n logger.info({ id: this.id }, \"CronInput stopped\");\n }\n\n get active(): boolean {\n return this._active;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { EventEmitter } from \"node:events\";\nimport { createLogger } from \"@actant/shared\";\nimport type { InputSource, TaskCallback } from \"./input-source\";\n\nconst logger = createLogger(\"hook-input\");\n\nexport interface HookConfig {\n eventName: string;\n prompt: string; // May contain {{payload}} placeholder\n priority?: \"low\" | \"normal\" | \"high\" | \"critical\";\n}\n\nexport class HookInput implements InputSource {\n readonly id: string;\n readonly type = \"hook\";\n private _active = false;\n private handler: ((...args: unknown[]) => void) | null = null;\n\n constructor(\n private readonly config: HookConfig,\n private readonly emitter: EventEmitter,\n id?: string,\n ) {\n this.id = id ?? `hook-${config.eventName}`;\n }\n\n start(agentName: string, onTask: TaskCallback): void {\n if (this._active) return;\n this._active = true;\n this.handler = (...args: unknown[]) => {\n const payload = args.length > 0 ? JSON.stringify(args[0]) : \"\";\n const prompt = this.config.prompt.replace(\"{{payload}}\", payload);\n onTask({\n id: randomUUID(),\n agentName,\n prompt,\n priority: this.config.priority ?? \"normal\",\n source: `hook:${this.config.eventName}`,\n createdAt: new Date().toISOString(),\n metadata: args.length > 0 ? { payload: args[0] as Record<string, unknown> } : undefined,\n });\n };\n this.emitter.on(this.config.eventName, this.handler);\n logger.info({ id: this.id, eventName: this.config.eventName }, \"HookInput started\");\n }\n\n stop(): void {\n if (!this._active) return;\n if (this.handler) {\n this.emitter.off(this.config.eventName, this.handler);\n this.handler = null;\n }\n this._active = false;\n logger.info({ id: this.id }, \"HookInput stopped\");\n }\n\n get active(): boolean {\n return this._active;\n }\n}\n","import { z } from \"zod/v4\";\n\nexport const HeartbeatConfigSchema = z.object({\n intervalMs: z.number().min(1000),\n prompt: z.string().min(1),\n priority: z.enum([\"low\", \"normal\", \"high\", \"critical\"]).optional(),\n});\n\nexport const CronConfigSchema = z.object({\n pattern: z.string().min(1),\n prompt: z.string().min(1),\n timezone: z.string().optional(),\n priority: z.enum([\"low\", \"normal\", \"high\", \"critical\"]).optional(),\n});\n\nexport const HookConfigSchema = z.object({\n eventName: z.string().min(1),\n prompt: z.string().min(1),\n priority: z.enum([\"low\", \"normal\", \"high\", \"critical\"]).optional(),\n});\n\nexport const ScheduleConfigSchema = z.object({\n heartbeat: HeartbeatConfigSchema.optional(),\n cron: z.array(CronConfigSchema).optional().default([]),\n hooks: z.array(HookConfigSchema).optional().default([]),\n});\n\nexport type ScheduleConfig = z.infer<typeof ScheduleConfigSchema>;\nexport type ScheduleConfigInput = z.input<typeof ScheduleConfigSchema>;\n","import { z } from \"zod/v4\";\nimport { ScheduleConfigSchema } from \"../../scheduler/schedule-config\";\n\nexport const McpServerRefSchema = z.object({\n name: z.string().min(1),\n command: z.string().min(1),\n args: z.array(z.string()).optional().default([]),\n env: z.record(z.string(), z.string()).optional().default({}),\n});\n\nexport const DomainContextSchema = z.object({\n skills: z.array(z.string()).optional().default([]),\n prompts: z.array(z.string()).optional().default([]),\n mcpServers: z.array(McpServerRefSchema).optional().default([]),\n workflow: z.string().optional(),\n subAgents: z.array(z.string()).optional().default([]),\n plugins: z.array(z.string()).optional().default([]),\n extensions: z.record(z.string(), z.array(z.unknown())).optional(),\n});\n\nexport const AgentBackendSchema = z.object({\n type: z.enum([\"cursor\", \"cursor-agent\", \"claude-code\", \"custom\", \"pi\"]),\n config: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const ModelProviderSchema = z.object({\n type: z.enum([\"anthropic\", \"openai\", \"openai-compatible\", \"custom\"]),\n protocol: z.enum([\"http\", \"websocket\", \"grpc\"]).optional().default(\"http\"),\n baseUrl: z.string().optional(),\n config: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const InitializerStepSchema = z.object({\n type: z.string().min(1),\n config: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const InitializerSchema = z.object({\n steps: z.array(InitializerStepSchema).min(1),\n});\n\n// ---------------------------------------------------------------------------\n// Permissions schema — aligned with Claude Code permissions structure (#51)\n// ---------------------------------------------------------------------------\n\nexport const PermissionModeSchema = z.enum([\n \"default\",\n \"acceptEdits\",\n \"plan\",\n \"dontAsk\",\n \"bypassPermissions\",\n]);\n\nexport const SandboxNetworkSchema = z.object({\n allowedDomains: z.array(z.string()).optional(),\n allowLocalBinding: z.boolean().optional(),\n});\n\nexport const SandboxSchema = z.object({\n enabled: z.boolean().optional().default(false),\n autoAllowBashIfSandboxed: z.boolean().optional().default(false),\n network: SandboxNetworkSchema.optional(),\n});\n\nexport const PermissionsObjectSchema = z.object({\n allow: z.array(z.string()).optional(),\n deny: z.array(z.string()).optional(),\n ask: z.array(z.string()).optional(),\n defaultMode: PermissionModeSchema.optional(),\n sandbox: SandboxSchema.optional(),\n additionalDirectories: z.array(z.string()).optional(),\n});\n\nexport const PermissionPresetSchema = z.enum([\n \"permissive\",\n \"standard\",\n \"restricted\",\n \"readonly\",\n]);\n\n/** Accepts either a preset string or a full permissions object. */\nexport const PermissionsInputSchema = z.union([\n PermissionPresetSchema,\n PermissionsObjectSchema,\n]);\n\n// ---------------------------------------------------------------------------\n// Component origin schema — shared VersionedComponent envelope fields (#119)\n// ---------------------------------------------------------------------------\n\nexport const ComponentOriginSchema = z.object({\n type: z.enum([\"builtin\", \"source\", \"local\"]),\n sourceName: z.string().optional(),\n syncHash: z.string().optional(),\n syncedAt: z.string().optional(),\n modified: z.boolean().optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Agent Template schema — includes VersionedComponent fields (#119)\n// ---------------------------------------------------------------------------\n\nexport const AgentTemplateSchema = z.object({\n name: z.string().min(1).max(100),\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+$/, \"Must be semver format (e.g. 1.0.0)\"),\n description: z.string().optional(),\n $type: z.string().optional(),\n $version: z.number().optional(),\n origin: ComponentOriginSchema.optional(),\n tags: z.array(z.string()).optional(),\n backend: AgentBackendSchema,\n provider: ModelProviderSchema,\n domainContext: DomainContextSchema,\n permissions: PermissionsInputSchema.optional(),\n initializer: InitializerSchema.optional(),\n schedule: ScheduleConfigSchema.optional(),\n metadata: z.record(z.string(), z.string()).optional(),\n});\n\nexport type AgentTemplateInput = z.input<typeof AgentTemplateSchema>;\nexport type AgentTemplateOutput = z.output<typeof AgentTemplateSchema>;\n","import { readFile, readdir, stat } from \"node:fs/promises\";\nimport { join, extname } from \"node:path\";\nimport type { AgentTemplate } from \"@actant/shared\";\nimport {\n ConfigNotFoundError,\n ConfigValidationError,\n} from \"@actant/shared\";\nimport { AgentTemplateSchema, type AgentTemplateOutput } from \"../schema/template-schema\";\n\nexport class TemplateLoader {\n /**\n * Load and validate an Agent Template from a JSON file.\n * @throws {ConfigNotFoundError} if file does not exist\n * @throws {ConfigValidationError} if JSON is malformed or fails schema validation\n */\n async loadFromFile(filePath: string): Promise<AgentTemplate> {\n let raw: string;\n try {\n raw = await readFile(filePath, \"utf-8\");\n } catch (err) {\n if (isNodeError(err) && err.code === \"ENOENT\") {\n throw new ConfigNotFoundError(filePath);\n }\n throw err;\n }\n return this.parseAndValidate(raw, filePath);\n }\n\n /**\n * Parse and validate an Agent Template from a JSON string.\n * @throws {ConfigValidationError} if JSON is malformed or fails schema validation\n */\n async loadFromString(content: string, source?: string): Promise<AgentTemplate> {\n return this.parseAndValidate(content, source ?? \"<string>\");\n }\n\n /**\n * Load all valid Agent Templates from a directory (non-recursive).\n * Only `.json` files are considered; non-template files are skipped.\n * @throws {ConfigNotFoundError} if directory does not exist\n */\n async loadFromDirectory(dirPath: string): Promise<AgentTemplate[]> {\n let entries: string[];\n try {\n entries = await readdir(dirPath);\n } catch (err) {\n if (isNodeError(err) && err.code === \"ENOENT\") {\n throw new ConfigNotFoundError(dirPath);\n }\n throw err;\n }\n\n const jsonFiles = entries.filter((f) => extname(f) === \".json\");\n const templates: AgentTemplate[] = [];\n\n for (const file of jsonFiles) {\n const fullPath = join(dirPath, file);\n const fileStat = await stat(fullPath);\n if (!fileStat.isFile()) continue;\n\n try {\n const template = await this.loadFromFile(fullPath);\n templates.push(template);\n } catch {\n // skip files that are not valid templates\n }\n }\n\n return templates;\n }\n\n private parseAndValidate(raw: string, source: string): AgentTemplate {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new ConfigValidationError(\n `Invalid JSON in ${source}`,\n [{ path: \"\", message: \"Failed to parse JSON\" }],\n );\n }\n\n const result = AgentTemplateSchema.safeParse(parsed);\n if (!result.success) {\n const errors = result.error.issues.map((issue) => ({\n path: issue.path.map(String).join(\".\"),\n message: issue.message,\n }));\n throw new ConfigValidationError(\n `Template validation failed for ${source}`,\n errors,\n );\n }\n\n return toAgentTemplate(result.data);\n }\n}\n\n/**\n * Map Zod's output (with defaults applied) to the shared AgentTemplate type.\n * This ensures the return type satisfies the interface contract exactly.\n */\nexport function toAgentTemplate(output: AgentTemplateOutput): AgentTemplate {\n return {\n name: output.name,\n version: output.version,\n description: output.description,\n $type: output.$type,\n $version: output.$version,\n origin: output.origin,\n tags: output.tags,\n backend: output.backend,\n provider: output.provider,\n domainContext: {\n skills: output.domainContext.skills,\n prompts: output.domainContext.prompts,\n mcpServers: output.domainContext.mcpServers.map((s) => ({\n name: s.name,\n command: s.command,\n args: s.args,\n env: s.env,\n })),\n workflow: output.domainContext.workflow,\n subAgents: output.domainContext.subAgents,\n plugins: output.domainContext.plugins,\n extensions: output.domainContext.extensions,\n },\n initializer: output.initializer,\n permissions: output.permissions,\n schedule: output.schedule,\n metadata: output.metadata,\n };\n}\n\nfunction isNodeError(err: unknown): err is NodeJS.ErrnoException {\n return err instanceof Error && \"code\" in err;\n}\n","/**\n * Standalone config validators (#119).\n * Each function validates a sub-config and returns a ConfigValidationResult\n * with both schema errors and semantic warnings.\n */\nimport type {\n ConfigValidationResult,\n ValidationIssue,\n AgentBackendConfig,\n ModelProviderConfig,\n PermissionsInput,\n DomainContextConfig,\n AgentTemplate,\n} from \"@actant/shared\";\nimport {\n AgentBackendSchema,\n ModelProviderSchema,\n PermissionsInputSchema,\n DomainContextSchema,\n AgentTemplateSchema,\n} from \"./template-schema\";\nimport { ScheduleConfigSchema, type ScheduleConfig } from \"../../scheduler/schedule-config\";\nimport { toAgentTemplate } from \"../loader/template-loader\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction zodToIssues(zodError: { issues: Array<{ path: PropertyKey[]; message: string }> }): ValidationIssue[] {\n return zodError.issues.map((i) => ({\n path: i.path.map(String).join(\".\"),\n message: i.message,\n severity: \"error\" as const,\n }));\n}\n\nfunction warning(path: string, message: string, code?: string): ValidationIssue {\n return { path, message, severity: \"warning\", code };\n}\n\n// ---------------------------------------------------------------------------\n// Sub-config validators\n// ---------------------------------------------------------------------------\n\nexport function validateBackendConfig(data: unknown): ConfigValidationResult<AgentBackendConfig> {\n const result = AgentBackendSchema.safeParse(data);\n if (!result.success) {\n return { valid: false, errors: zodToIssues(result.error), warnings: [] };\n }\n return { valid: true, data: result.data, errors: [], warnings: [] };\n}\n\nexport function validateProviderConfig(data: unknown): ConfigValidationResult<ModelProviderConfig> {\n const result = ModelProviderSchema.safeParse(data);\n if (!result.success) {\n return { valid: false, errors: zodToIssues(result.error), warnings: [] };\n }\n return { valid: true, data: result.data, errors: [], warnings: [] };\n}\n\nexport function validatePermissionsConfig(data: unknown): ConfigValidationResult<PermissionsInput> {\n const result = PermissionsInputSchema.safeParse(data);\n if (!result.success) {\n return { valid: false, errors: zodToIssues(result.error), warnings: [] };\n }\n const warnings: ValidationIssue[] = [];\n\n if (typeof result.data === \"object\" && result.data !== null) {\n const perms = result.data as { allow?: string[]; deny?: string[] };\n if (perms.allow && perms.deny) {\n const overlap = perms.allow.filter((a) => perms.deny?.includes(a));\n if (overlap.length > 0) {\n warnings.push(warning(\n \"permissions\",\n `Rules appear in both allow and deny: ${overlap.join(\", \")}`,\n \"PERMISSION_OVERLAP\",\n ));\n }\n }\n }\n\n return { valid: true, data: result.data, errors: [], warnings };\n}\n\nexport function validateScheduleConfig(data: unknown): ConfigValidationResult<ScheduleConfig> {\n const result = ScheduleConfigSchema.safeParse(data);\n if (!result.success) {\n return { valid: false, errors: zodToIssues(result.error), warnings: [] };\n }\n const warnings: ValidationIssue[] = [];\n\n if (result.data.heartbeat) {\n if (result.data.heartbeat.intervalMs < 5000) {\n warnings.push(warning(\n \"schedule.heartbeat.intervalMs\",\n `Heartbeat interval ${result.data.heartbeat.intervalMs}ms is very short; consider >= 5000ms to avoid excessive API calls`,\n \"SHORT_HEARTBEAT_INTERVAL\",\n ));\n }\n }\n\n return { valid: true, data: result.data, errors: [], warnings };\n}\n\nexport function validateDomainContextConfig(data: unknown): ConfigValidationResult<DomainContextConfig> {\n const result = DomainContextSchema.safeParse(data);\n if (!result.success) {\n return { valid: false, errors: zodToIssues(result.error), warnings: [] };\n }\n const warnings: ValidationIssue[] = [];\n\n const ctx = result.data;\n if (ctx.subAgents && ctx.subAgents.length > 0 && (!ctx.skills || ctx.skills.length === 0) && (!ctx.prompts || ctx.prompts.length === 0)) {\n warnings.push(warning(\n \"domainContext\",\n \"subAgents are defined but no skills or prompts; the agent may lack domain context\",\n \"EMPTY_DOMAIN_WITH_SUBAGENTS\",\n ));\n }\n\n return { valid: true, data: result.data as DomainContextConfig, errors: [], warnings };\n}\n\n// ---------------------------------------------------------------------------\n// Full template semantic validator\n// ---------------------------------------------------------------------------\n\n/**\n * Deep-validate an AgentTemplate: schema + cross-field semantic checks.\n * Returns all errors and warnings.\n */\nexport function validateTemplate(data: unknown): ConfigValidationResult<AgentTemplate> {\n const result = AgentTemplateSchema.safeParse(data);\n if (!result.success) {\n return { valid: false, errors: zodToIssues(result.error), warnings: [] };\n }\n\n const warnings: ValidationIssue[] = [];\n const template = toAgentTemplate(result.data);\n\n // Semantic: permissions overlap\n const permResult = validatePermissionsConfig(template.permissions);\n if (permResult.warnings.length > 0) {\n warnings.push(...permResult.warnings);\n }\n\n // Semantic: schedule checks\n if (template.schedule) {\n const schedResult = validateScheduleConfig(template.schedule);\n if (schedResult.warnings.length > 0) {\n warnings.push(...schedResult.warnings);\n }\n }\n\n // Semantic: domain context checks\n const dcResult = validateDomainContextConfig(template.domainContext);\n if (dcResult.warnings.length > 0) {\n warnings.push(...dcResult.warnings);\n }\n\n // Semantic: custom backend without config\n if (template.backend.type === \"custom\" && !template.backend.config) {\n warnings.push(warning(\n \"backend.config\",\n \"Custom backend type without config; the launcher may not know how to start this agent\",\n \"CUSTOM_BACKEND_NO_CONFIG\",\n ));\n }\n\n // Semantic: custom provider without config\n if (template.provider.type === \"custom\" && !template.provider.config) {\n warnings.push(warning(\n \"provider.config\",\n \"Custom provider type without config; model routing may fail\",\n \"CUSTOM_PROVIDER_NO_CONFIG\",\n ));\n }\n\n return { valid: true, data: template, errors: [], warnings };\n}\n","import { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { AgentTemplate, ConfigValidationResult } from \"@actant/shared\";\nimport { TemplateNotFoundError, ConfigValidationError } from \"@actant/shared\";\nimport { BaseComponentManager } from \"../../domain/base-component-manager\";\nimport { TemplateLoader, toAgentTemplate } from \"../loader/template-loader\";\nimport { AgentTemplateSchema } from \"../schema/template-schema\";\n\nexport interface RegistryOptions {\n /** If true, re-registering the same name overwrites the existing entry. Default: false */\n allowOverwrite?: boolean;\n}\n\n/**\n * Template registry that extends BaseComponentManager (#119).\n * Inherits CRUD, search/filter, import/export from the base class.\n * Adds template-specific overrides: duplicate checking, TemplateLoader-based directory loading.\n */\nexport class TemplateRegistry extends BaseComponentManager<AgentTemplate> {\n protected readonly componentType = \"template\";\n private readonly loader = new TemplateLoader();\n private readonly allowOverwrite: boolean;\n\n constructor(options?: RegistryOptions) {\n super(\"template-registry\");\n this.allowOverwrite = options?.allowOverwrite ?? false;\n }\n\n /**\n * Register a template. Throws if a template with the same name already exists\n * (unless allowOverwrite is enabled).\n */\n override register(template: AgentTemplate): void {\n if (!template.name) {\n throw new ConfigValidationError(\"Template name is required\", [\n { path: \"name\", message: \"name must be a non-empty string\" },\n ]);\n }\n\n if (this.components.has(template.name) && !this.allowOverwrite) {\n throw new ConfigValidationError(\n `Template \"${template.name}\" is already registered`,\n [{ path: \"name\", message: `Duplicate template name: ${template.name}` }],\n );\n }\n\n super.register(template);\n }\n\n /**\n * Get a template by name.\n * @throws {TemplateNotFoundError} if not found\n */\n getOrThrow(name: string): AgentTemplate {\n const template = this.components.get(name);\n if (!template) {\n throw new TemplateNotFoundError(name);\n }\n return template;\n }\n\n /**\n * Load templates from a directory using TemplateLoader (JSON + Zod validation).\n * Invalid files are skipped with a warning log.\n */\n override async loadFromDirectory(dirPath: string): Promise<number> {\n const templates = await this.loader.loadFromDirectory(dirPath);\n let count = 0;\n for (const tpl of templates) {\n try {\n this.register(tpl);\n count++;\n } catch (err) {\n this.logger.warn(\n { templateName: tpl.name, error: err },\n \"Failed to register template, skipping\",\n );\n }\n }\n this.logger.info({ count, dirPath }, \"Templates loaded from directory\");\n return count;\n }\n\n /** @deprecated Use loadFromDirectory instead. */\n async loadBuiltins(configDir: string): Promise<number> {\n return this.loadFromDirectory(configDir);\n }\n\n /**\n * Validate raw data as an AgentTemplate using the Zod schema.\n * Returns structured ConfigValidationResult (#119).\n */\n validate(data: unknown, _source: string): ConfigValidationResult<AgentTemplate> {\n const result = AgentTemplateSchema.safeParse(data);\n if (!result.success) {\n return {\n valid: false,\n errors: result.error.issues.map((issue) => ({\n path: issue.path.map(String).join(\".\"),\n message: issue.message,\n severity: \"error\" as const,\n })),\n warnings: [],\n };\n }\n return { valid: true, data: toAgentTemplate(result.data), errors: [], warnings: [] };\n }\n\n async persist(template: AgentTemplate): Promise<void> {\n if (!this.persistDir) return;\n await mkdir(this.persistDir, { recursive: true });\n const filePath = join(this.persistDir, `${template.name}.json`);\n const { writeFile } = await import(\"node:fs/promises\");\n await writeFile(filePath, JSON.stringify(template, null, 2) + \"\\n\", \"utf-8\");\n this.logger.debug({ templateName: template.name, filePath }, \"Template persisted\");\n }\n}\n","import { readFile, writeFile, readdir, stat, unlink, mkdir } from \"node:fs/promises\";\nimport { join, extname, resolve } from \"node:path\";\nimport { ComponentReferenceError, ConfigNotFoundError, ConfigValidationError, createLogger } from \"@actant/shared\";\nimport type { Logger, ConfigValidationResult } from \"@actant/shared\";\n\nexport interface NamedComponent {\n name: string;\n}\n\n/**\n * Generic base class for Domain Context component managers.\n * Provides CRUD, persist, import/export, search/filter, and load-from-directory.\n */\nexport abstract class BaseComponentManager<T extends NamedComponent> {\n protected readonly components = new Map<string, T>();\n protected readonly logger: Logger;\n protected abstract readonly componentType: string;\n\n protected persistDir?: string;\n\n constructor(loggerName: string) {\n this.logger = createLogger(loggerName);\n }\n\n setPersistDir(dir: string): void {\n this.persistDir = dir;\n }\n\n // ---------------------------------------------------------------------------\n // Core registry operations\n // ---------------------------------------------------------------------------\n\n register(component: T): void {\n this.components.set(component.name, component);\n this.logger.debug({ name: component.name }, `${this.componentType} registered`);\n }\n\n unregister(name: string): boolean {\n return this.components.delete(name);\n }\n\n get(name: string): T | undefined {\n return this.components.get(name);\n }\n\n has(name: string): boolean {\n return this.components.has(name);\n }\n\n /**\n * Resolve a list of component names to their definitions.\n * @throws {ComponentReferenceError} if any name is not found\n */\n resolve(names: string[]): T[] {\n return names.map((name) => {\n const component = this.components.get(name);\n if (!component) {\n throw new ComponentReferenceError(this.componentType, name);\n }\n return component;\n });\n }\n\n list(): T[] {\n return Array.from(this.components.values());\n }\n\n get size(): number {\n return this.components.size;\n }\n\n clear(): void {\n this.components.clear();\n }\n\n // ---------------------------------------------------------------------------\n // CRUD operations (with optional persistence)\n // ---------------------------------------------------------------------------\n\n async add(component: T, persist = false): Promise<void> {\n const validated = this.validateOrThrow(component, \"add\");\n this.register(validated);\n if (persist && this.persistDir) {\n await this.writeComponent(validated);\n }\n }\n\n async update(name: string, patch: Partial<T>, persist = false): Promise<T> {\n const existing = this.get(name);\n if (!existing) {\n throw new ComponentReferenceError(this.componentType, name);\n }\n const merged = { ...existing, ...patch, name } as unknown;\n const validated = this.validateOrThrow(merged, \"update\");\n this.register(validated);\n if (persist && this.persistDir) {\n await this.writeComponent(validated);\n }\n return validated;\n }\n\n async remove(name: string, persist = false): Promise<boolean> {\n const existed = this.unregister(name);\n if (existed && persist && this.persistDir) {\n await this.deleteComponent(name);\n }\n return existed;\n }\n\n // ---------------------------------------------------------------------------\n // Import / Export\n // ---------------------------------------------------------------------------\n\n async importFromFile(filePath: string): Promise<T> {\n const absPath = resolve(filePath);\n const raw = await readFile(absPath, \"utf-8\");\n const parsed = JSON.parse(raw) as unknown;\n const component = this.validateOrThrow(parsed, absPath);\n this.register(component);\n this.logger.info({ name: component.name, filePath: absPath }, `${this.componentType} imported`);\n return component;\n }\n\n async exportToFile(name: string, filePath: string): Promise<void> {\n const component = this.get(name);\n if (!component) {\n throw new ComponentReferenceError(this.componentType, name);\n }\n const absPath = resolve(filePath);\n await writeFile(absPath, JSON.stringify(component, null, 2) + \"\\n\", \"utf-8\");\n this.logger.info({ name, filePath: absPath }, `${this.componentType} exported`);\n }\n\n // ---------------------------------------------------------------------------\n // Search / Filter\n // ---------------------------------------------------------------------------\n\n search(query: string): T[] {\n const lower = query.toLowerCase();\n return this.list().filter((c) => {\n if (c.name.toLowerCase().includes(lower)) return true;\n const desc = (c as Record<string, unknown>).description;\n if (typeof desc === \"string\" && desc.toLowerCase().includes(lower)) return true;\n return false;\n });\n }\n\n filter(predicate: (c: T) => boolean): T[] {\n return this.list().filter(predicate);\n }\n\n // ---------------------------------------------------------------------------\n // Directory loading\n // ---------------------------------------------------------------------------\n\n /**\n * Resolve a content file reference (e.g. \"content.md\") to its file contents.\n * Returns null if the ref is inline text (contains newline) or file not found.\n */\n protected async resolveContentFile(dirPath: string, contentRef: string): Promise<string | null> {\n if (!contentRef || contentRef.includes(\"\\n\")) return null;\n if (contentRef.endsWith(\".md\") || contentRef.endsWith(\".txt\")) {\n try {\n return await readFile(join(dirPath, contentRef), \"utf-8\");\n } catch {\n return null;\n }\n }\n return null;\n }\n\n /**\n * Load component definitions from JSON files and directory-based components (manifest.json).\n * Invalid files/directories are skipped with a warning.\n * @-prefixed directories are scanned recursively as source namespaces.\n */\n async loadFromDirectory(dirPath: string): Promise<number> {\n let entries: string[];\n try {\n entries = await readdir(dirPath);\n } catch (err) {\n if (isNodeError(err) && err.code === \"ENOENT\") {\n throw new ConfigNotFoundError(dirPath);\n }\n throw err;\n }\n\n let count = 0;\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry);\n const entryStat = await stat(fullPath);\n\n if (entryStat.isFile() && extname(entry) === \".json\") {\n // Existing: load flat JSON file\n try {\n const raw = await readFile(fullPath, \"utf-8\");\n const parsed = JSON.parse(raw) as unknown;\n const component = this.validateOrThrow(parsed, fullPath);\n this.register(component);\n count++;\n } catch (err) {\n this.logger.warn({ file: entry, error: err }, `Failed to load ${this.componentType}, skipping`);\n }\n } else if (entryStat.isDirectory() && !entry.startsWith(\"_\") && !entry.startsWith(\".\")) {\n // New: load directory-based component with manifest.json\n const manifestPath = join(fullPath, \"manifest.json\");\n try {\n const manifestStat = await stat(manifestPath);\n if (!manifestStat.isFile()) continue;\n\n const raw = await readFile(manifestPath, \"utf-8\");\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n\n // Resolve content file if applicable\n if (typeof parsed.content === \"string\") {\n const resolved = await this.resolveContentFile(fullPath, parsed.content);\n if (resolved !== null) {\n parsed.content = resolved;\n } else if (\n !parsed.content.includes(\"\\n\") &&\n (parsed.content.endsWith(\".md\") || parsed.content.endsWith(\".txt\"))\n ) {\n this.logger.warn({ file: parsed.content, dir: entry }, `Content file not found, using path as-is`);\n }\n }\n\n // Use directory name as component name if not specified\n if (!parsed.name) {\n parsed.name = entry;\n }\n\n const component = this.validateOrThrow(parsed, manifestPath);\n this.register(component);\n count++;\n } catch (err) {\n this.logger.warn({ dir: entry, error: err }, `Failed to load ${this.componentType} from directory, skipping`);\n }\n }\n }\n\n // Also scan @-prefixed directories (source namespaces) recursively\n const namespaceDirs = entries.filter((e) => e.startsWith(\"@\"));\n for (const nsDir of namespaceDirs) {\n const nsPath = join(dirPath, nsDir);\n try {\n const nsStat = await stat(nsPath);\n if (nsStat.isDirectory()) {\n count += await this.loadFromDirectory(nsPath);\n }\n } catch {\n // skip\n }\n }\n\n this.logger.info({ count, dirPath }, `${this.componentType}s loaded from directory`);\n return count;\n }\n\n // ---------------------------------------------------------------------------\n // Validation (#119) — public returns ConfigValidationResult, internal throws\n // ---------------------------------------------------------------------------\n\n /**\n * Validate raw data against the component schema.\n * Returns a structured ConfigValidationResult with errors and warnings.\n */\n abstract validate(data: unknown, source: string): ConfigValidationResult<T>;\n\n /**\n * Validate and unwrap — throws ConfigValidationError on failure.\n * Used internally by CRUD and loading operations.\n */\n protected validateOrThrow(data: unknown, source: string): T {\n const result = this.validate(data, source);\n if (!result.valid || !result.data) {\n throw new ConfigValidationError(\n `Validation failed for ${this.componentType} in ${source}`,\n result.errors.map((e) => ({ path: e.path, message: e.message })),\n result.errors,\n );\n }\n return result.data;\n }\n\n // ---------------------------------------------------------------------------\n // Persistence helpers\n // ---------------------------------------------------------------------------\n\n protected async writeComponent(component: T): Promise<void> {\n if (!this.persistDir) return;\n await mkdir(this.persistDir, { recursive: true });\n const filePath = join(this.persistDir, `${component.name}.json`);\n await writeFile(filePath, JSON.stringify(component, null, 2) + \"\\n\", \"utf-8\");\n this.logger.debug({ name: component.name, filePath }, `${this.componentType} persisted`);\n }\n\n protected async deleteComponent(name: string): Promise<void> {\n if (!this.persistDir) return;\n const filePath = join(this.persistDir, `${name}.json`);\n try {\n await unlink(filePath);\n this.logger.debug({ name, filePath }, `${this.componentType} file deleted`);\n } catch (err) {\n if (isNodeError(err) && err.code === \"ENOENT\") return;\n throw err;\n }\n }\n}\n\nfunction isNodeError(err: unknown): err is NodeJS.ErrnoException {\n return err instanceof Error && \"code\" in err;\n}\n","import { watch, type FSWatcher } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { access } from \"node:fs/promises\";\nimport { createLogger } from \"@actant/shared\";\nimport type { TemplateRegistry } from \"../registry/template-registry\";\nimport { TemplateLoader } from \"../loader/template-loader\";\n\nconst logger = createLogger(\"template-file-watcher\");\n\nconst DEFAULT_DEBOUNCE_MS = 300;\n\nexport interface TemplateFileWatcherOptions {\n debounceMs?: number;\n}\n\n/**\n * Watches the templates directory for file changes and auto-reloads\n * the TemplateRegistry. Handles create, modify, and delete events.\n *\n * Tracks file→templateName mapping so deletions can correctly unregister\n * templates whose name differs from the filename.\n */\nexport class TemplateFileWatcher {\n private watcher: FSWatcher | null = null;\n private readonly debounceMs: number;\n private readonly loader = new TemplateLoader();\n private debounceTimers = new Map<string, ReturnType<typeof setTimeout>>();\n /** Maps relative filename → template name loaded from that file. */\n private fileToName = new Map<string, string>();\n\n constructor(\n private readonly templatesDir: string,\n private readonly registry: TemplateRegistry,\n options?: TemplateFileWatcherOptions,\n ) {\n this.debounceMs = options?.debounceMs ?? DEFAULT_DEBOUNCE_MS;\n }\n\n start(): void {\n if (this.watcher) return;\n\n try {\n this.watcher = watch(this.templatesDir, { recursive: true }, (_eventType, filename) => {\n if (!filename || !filename.endsWith(\".json\")) return;\n this.handleChange(filename);\n });\n\n this.watcher.on(\"error\", (err) => {\n logger.error({ error: err }, \"File watcher error\");\n });\n\n this.buildFileMap();\n logger.info({ dir: this.templatesDir }, \"Template file watcher started\");\n } catch (err) {\n logger.error({ error: err, dir: this.templatesDir }, \"Failed to start file watcher\");\n }\n }\n\n stop(): void {\n if (!this.watcher) return;\n this.watcher.close();\n this.watcher = null;\n for (const timer of this.debounceTimers.values()) {\n clearTimeout(timer);\n }\n this.debounceTimers.clear();\n logger.info(\"Template file watcher stopped\");\n }\n\n get isWatching(): boolean {\n return this.watcher !== null;\n }\n\n private buildFileMap(): void {\n for (const template of this.registry.list()) {\n const guessedFile = `${template.name}.json`;\n this.fileToName.set(guessedFile, template.name);\n }\n }\n\n private handleChange(filename: string): void {\n const existing = this.debounceTimers.get(filename);\n if (existing) clearTimeout(existing);\n\n this.debounceTimers.set(\n filename,\n setTimeout(() => {\n this.debounceTimers.delete(filename);\n this.processChange(filename).catch((err) => {\n logger.error({ filename, error: err }, \"Error processing template file change\");\n });\n }, this.debounceMs),\n );\n }\n\n private async processChange(filename: string): Promise<void> {\n const filePath = join(this.templatesDir, filename);\n\n let fileExists = true;\n try {\n await access(filePath);\n } catch {\n fileExists = false;\n }\n\n if (!fileExists) {\n const previousName = this.fileToName.get(filename);\n if (previousName && this.registry.has(previousName)) {\n this.registry.unregister(previousName);\n this.fileToName.delete(filename);\n logger.info({ templateName: previousName, filename }, \"Template unregistered (file deleted)\");\n }\n return;\n }\n\n try {\n const template = await this.loader.loadFromFile(filePath);\n\n const previousName = this.fileToName.get(filename);\n if (previousName && previousName !== template.name && this.registry.has(previousName)) {\n this.registry.unregister(previousName);\n }\n\n if (this.registry.has(template.name)) {\n this.registry.unregister(template.name);\n }\n this.registry.register(template);\n this.fileToName.set(filename, template.name);\n\n logger.info({ templateName: template.name, filename }, previousName ? \"Template reloaded\" : \"New template registered\");\n } catch (err) {\n logger.warn({ filePath, error: err }, \"Failed to reload template\");\n }\n }\n}\n","import { mkdir, rm, access, symlink, lstat, unlink, readlink } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport type { AgentInstanceMeta, LaunchMode, WorkspacePolicy, WorkDirConflict, PermissionsInput } from \"@actant/shared\";\nimport {\n ActantError,\n ConfigValidationError,\n InstanceCorruptedError,\n WorkspaceInitError,\n createLogger,\n} from \"@actant/shared\";\nimport type { TemplateRegistry } from \"../template/registry/template-registry\";\nimport { WorkspaceBuilder, type DomainManagers } from \"../builder/workspace-builder\";\nimport { resolvePermissions } from \"../permissions/permission-presets\";\nimport { readInstanceMeta, writeInstanceMeta } from \"../state/index\";\nimport { InitializationPipeline } from \"./pipeline/initialization-pipeline\";\nimport type { StepRegistry } from \"./pipeline/step-registry\";\nimport type { StepContext } from \"./pipeline/types\";\n\nconst logger = createLogger(\"agent-initializer\");\n\nexport interface InitializerOptions {\n defaultLaunchMode?: LaunchMode;\n domainManagers?: DomainManagers;\n /** Step registry for InitializerConfig pipeline execution. When provided, template.initializer.steps will be executed during createInstance(). */\n stepRegistry?: StepRegistry;\n}\n\nexport interface InstanceOverrides {\n launchMode: LaunchMode;\n workspacePolicy: WorkspacePolicy;\n /** Absolute path for the agent workspace. When omitted, defaults to {instancesBaseDir}/{name}. */\n workDir: string;\n /** Behavior when workDir already exists. Default: \"error\". */\n workDirConflict: WorkDirConflict;\n /** Override template permissions at instance level. Completely replaces template.permissions. */\n permissions: PermissionsInput;\n metadata: Record<string, string>;\n}\n\nexport class AgentInitializer {\n private readonly builder: WorkspaceBuilder;\n private readonly pipeline?: InitializationPipeline;\n\n constructor(\n private readonly templateRegistry: TemplateRegistry,\n private readonly instancesBaseDir: string,\n private readonly options?: InitializerOptions,\n ) {\n this.builder = new WorkspaceBuilder(options?.domainManagers);\n if (options?.stepRegistry) {\n this.pipeline = new InitializationPipeline(options.stepRegistry);\n }\n }\n\n get workspaceBuilder(): WorkspaceBuilder {\n return this.builder;\n }\n\n /**\n * Create a new Agent Instance.\n * 1. Resolve template from registry\n * 2. Create workspace directory {instancesBaseDir}/{name}/\n * 3. Materialize Domain Context files\n * 4. Write .actant.json metadata\n *\n * @throws {TemplateNotFoundError} if template is not in registry\n * @throws {ConfigValidationError} if name conflicts with existing directory\n * @throws {WorkspaceInitError} if directory creation or file writing fails\n */\n async createInstance(\n name: string,\n templateName: string,\n overrides?: Partial<InstanceOverrides>,\n ): Promise<AgentInstanceMeta> {\n const template = this.templateRegistry.getOrThrow(templateName);\n const customWorkDir = overrides?.workDir;\n const workspaceDir = customWorkDir ?? join(this.instancesBaseDir, name);\n const conflictPolicy = overrides?.workDirConflict ?? \"error\";\n\n const exists = await dirExists(workspaceDir);\n if (exists) {\n switch (conflictPolicy) {\n case \"error\":\n throw new ConfigValidationError(\n `Instance directory \"${name}\" already exists`,\n [{ path: \"name\", message: `Directory already exists: ${workspaceDir}` }],\n );\n case \"overwrite\":\n await rm(workspaceDir, { recursive: true, force: true });\n logger.info({ workspaceDir }, \"Existing directory removed (overwrite)\");\n break;\n case \"append\":\n logger.info({ workspaceDir }, \"Appending to existing directory\");\n break;\n }\n }\n\n if (customWorkDir) {\n const linkPath = join(this.instancesBaseDir, name);\n if (await entryExists(linkPath)) {\n throw new ConfigValidationError(\n `Instance registration \"${name}\" already exists in instancesBaseDir`,\n [{ path: \"name\", message: `Entry already exists: ${linkPath}` }],\n );\n }\n }\n\n const shouldCleanupOnError = conflictPolicy !== \"append\" && !exists;\n\n try {\n await mkdir(workspaceDir, { recursive: true });\n\n const finalPermissions = overrides?.permissions ?? template.permissions;\n await this.builder.build(\n workspaceDir,\n template.domainContext,\n template.backend.type,\n finalPermissions,\n );\n\n if (this.pipeline && template.initializer?.steps?.length) {\n const stepContext: StepContext = {\n workspaceDir,\n instanceMeta: { name, templateName: template.name },\n template,\n logger,\n state: new Map(),\n };\n const pipelineResult = await this.pipeline.run(template.initializer.steps, stepContext);\n if (!pipelineResult.success) {\n const firstError = pipelineResult.errors[0];\n throw new WorkspaceInitError(\n workspaceDir,\n firstError?.error ?? new Error(\"Initializer pipeline failed\"),\n );\n }\n }\n\n const effectivePermissions = resolvePermissions(finalPermissions);\n\n const now = new Date().toISOString();\n const launchMode = overrides?.launchMode ?? this.options?.defaultLaunchMode ?? \"direct\";\n const defaultPolicy: WorkspacePolicy = launchMode === \"one-shot\" ? \"ephemeral\" : \"persistent\";\n const meta: AgentInstanceMeta = {\n id: randomUUID(),\n name,\n templateName: template.name,\n templateVersion: template.version,\n backendType: template.backend.type,\n backendConfig: template.backend.config ? { ...template.backend.config } : undefined,\n status: \"created\",\n launchMode,\n workspacePolicy: overrides?.workspacePolicy ?? defaultPolicy,\n processOwnership: \"managed\",\n createdAt: now,\n updatedAt: now,\n effectivePermissions,\n metadata: overrides?.metadata,\n };\n\n await writeInstanceMeta(workspaceDir, meta);\n\n if (customWorkDir) {\n const linkType = process.platform === \"win32\" ? \"junction\" : \"dir\";\n await symlink(workspaceDir, join(this.instancesBaseDir, name), linkType);\n }\n\n logger.info({ name, templateName, workspaceDir, customWorkDir: !!customWorkDir }, \"Agent instance created\");\n return meta;\n } catch (err) {\n if (shouldCleanupOnError) {\n await rm(workspaceDir, { recursive: true, force: true }).catch(() => {});\n logger.debug({ workspaceDir }, \"Cleaned up workspace after failed creation\");\n }\n if (err instanceof ActantError) {\n throw err;\n }\n throw new WorkspaceInitError(workspaceDir, err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n /**\n * Find an existing instance or create a new one (idempotent).\n * - Directory exists + valid .actant.json → return existing\n * - Directory does not exist → create new instance\n * - Directory exists but corrupted → throw InstanceCorruptedError\n */\n async findOrCreateInstance(\n name: string,\n templateName: string,\n overrides?: Partial<InstanceOverrides>,\n ): Promise<{ meta: AgentInstanceMeta; created: boolean }> {\n const workspaceDir = join(this.instancesBaseDir, name);\n\n if (await dirExists(workspaceDir)) {\n try {\n const meta = await readInstanceMeta(workspaceDir);\n logger.debug({ name }, \"Existing instance found\");\n return { meta, created: false };\n } catch (err) {\n if (err instanceof InstanceCorruptedError) {\n throw err;\n }\n throw new InstanceCorruptedError(name, err instanceof Error ? err.message : String(err));\n }\n }\n\n const meta = await this.createInstance(name, templateName, overrides);\n return { meta, created: true };\n }\n\n /**\n * Destroy an instance by removing its workspace directory.\n * For symlinked instances (custom workDir): removes the symlink and `.actant.json`\n * from the target, but preserves the rest of the user's directory.\n * For normal instances: removes the entire workspace directory.\n */\n async destroyInstance(name: string): Promise<void> {\n const entryPath = join(this.instancesBaseDir, name);\n if (!(await entryExists(entryPath))) {\n logger.warn({ name }, \"Instance directory not found, nothing to destroy\");\n return;\n }\n\n if (await isSymlink(entryPath)) {\n const targetDir = await readlink(entryPath);\n try {\n await unlink(join(targetDir, \".actant.json\"));\n } catch {\n // .actant.json may have been removed already\n }\n await rm(entryPath, { recursive: true, force: true });\n logger.info({ name, targetDir }, \"Symlinked agent instance unregistered\");\n } else {\n await rm(entryPath, { recursive: true, force: true });\n logger.info({ name }, \"Agent instance destroyed\");\n }\n }\n}\n\nasync function dirExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/** Check if an entry (file, dir, or symlink) exists without following symlinks. */\nasync function entryExists(path: string): Promise<boolean> {\n try {\n await lstat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function isSymlink(path: string): Promise<boolean> {\n try {\n const stats = await lstat(path);\n return stats.isSymbolicLink();\n } catch {\n return false;\n }\n}\n","import { z } from \"zod/v4\";\n\nexport const AgentStatusSchema = z.enum([\n \"created\",\n \"starting\",\n \"running\",\n \"stopping\",\n \"stopped\",\n \"error\",\n \"crashed\",\n]);\n\nexport const LaunchModeSchema = z.enum([\n \"direct\",\n \"acp-background\",\n \"acp-service\",\n \"one-shot\",\n]);\n\nexport const ProcessOwnershipSchema = z.enum([\"managed\", \"external\"]);\n\nexport const WorkspacePolicySchema = z.enum([\"persistent\", \"ephemeral\"]);\n\nconst AgentBackendTypeSchema = z.enum([\"cursor\", \"cursor-agent\", \"claude-code\", \"custom\", \"pi\"]);\n\nconst PermissionModeSchema = z.enum([\n \"default\", \"acceptEdits\", \"plan\", \"dontAsk\", \"bypassPermissions\",\n]);\n\nconst SandboxNetworkConfigSchema = z.object({\n allowedDomains: z.array(z.string()).optional(),\n allowLocalBinding: z.boolean().optional(),\n});\n\nconst SandboxConfigSchema = z.object({\n enabled: z.boolean().optional(),\n autoAllowBashIfSandboxed: z.boolean().optional(),\n network: SandboxNetworkConfigSchema.optional(),\n});\n\nconst PermissionsConfigSchema = z.object({\n allow: z.array(z.string()).optional(),\n deny: z.array(z.string()).optional(),\n ask: z.array(z.string()).optional(),\n defaultMode: PermissionModeSchema.optional(),\n sandbox: SandboxConfigSchema.optional(),\n additionalDirectories: z.array(z.string()).optional(),\n});\n\nexport const AgentInstanceMetaSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n templateName: z.string().min(1),\n templateVersion: z.string().regex(/^\\d+\\.\\d+\\.\\d+$/),\n backendType: AgentBackendTypeSchema.default(\"cursor\"),\n backendConfig: z.record(z.string(), z.unknown()).optional(),\n status: AgentStatusSchema,\n launchMode: LaunchModeSchema,\n workspacePolicy: WorkspacePolicySchema.default(\"persistent\"),\n processOwnership: ProcessOwnershipSchema.default(\"managed\"),\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n pid: z.number().int().positive().optional(),\n effectivePermissions: PermissionsConfigSchema.optional(),\n metadata: z.record(z.string(), z.string()).optional(),\n});\n","import { readFile, writeFile, rename, readdir, stat, mkdir } from \"node:fs/promises\";\nimport { join, dirname } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport type { AgentInstanceMeta } from \"@actant/shared\";\nimport { InstanceCorruptedError } from \"@actant/shared\";\nimport { AgentInstanceMetaSchema } from \"./instance-meta-schema\";\nimport { createLogger } from \"@actant/shared\";\nimport type { InstanceRegistryAdapter } from \"./instance-registry-types\";\n\nconst logger = createLogger(\"instance-meta-io\");\n\nconst META_FILENAME = \".actant.json\";\n\nexport function metaFilePath(workspaceDir: string): string {\n return join(workspaceDir, META_FILENAME);\n}\n\n/** Read and validate `.actant.json` from a workspace directory. */\nexport async function readInstanceMeta(workspaceDir: string): Promise<AgentInstanceMeta> {\n const filePath = metaFilePath(workspaceDir);\n let raw: string;\n try {\n raw = await readFile(filePath, \"utf-8\");\n } catch (err) {\n if (isNodeError(err) && err.code === \"ENOENT\") {\n throw new InstanceCorruptedError(\n workspaceDir,\n `${META_FILENAME} not found`,\n );\n }\n throw err;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new InstanceCorruptedError(workspaceDir, `${META_FILENAME} contains invalid JSON`);\n }\n\n const result = AgentInstanceMetaSchema.safeParse(parsed);\n if (!result.success) {\n throw new InstanceCorruptedError(\n workspaceDir,\n `${META_FILENAME} failed schema validation: ${result.error.issues.map((i) => i.message).join(\", \")}`,\n );\n }\n\n return result.data as AgentInstanceMeta;\n}\n\n/** Atomic write: write to a temp file then rename (prevents partial writes). */\nexport async function writeInstanceMeta(\n workspaceDir: string,\n meta: AgentInstanceMeta,\n): Promise<void> {\n const filePath = metaFilePath(workspaceDir);\n const tmpPath = `${filePath}.${randomUUID().slice(0, 8)}.tmp`;\n const content = JSON.stringify(meta, null, 2) + \"\\n\";\n\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(tmpPath, content, \"utf-8\");\n await rename(tmpPath, filePath);\n}\n\n/** Partially update `.actant.json` — read, merge, write. */\nexport async function updateInstanceMeta(\n workspaceDir: string,\n patch: Partial<AgentInstanceMeta>,\n): Promise<AgentInstanceMeta> {\n const existing = await readInstanceMeta(workspaceDir);\n const updated: AgentInstanceMeta = {\n ...existing,\n ...patch,\n updatedAt: new Date().toISOString(),\n };\n await writeInstanceMeta(workspaceDir, updated);\n return updated;\n}\n\n/**\n * Scan `instancesBaseDir` for all valid instance directories.\n * Directories whose `.actant.json` is missing or invalid are logged and skipped.\n *\n * When `registry` is provided, also includes instances from the registry (external workspaces)\n * and deduplicates by name (registry entries take precedence).\n */\nexport async function scanInstances(\n instancesBaseDir: string,\n registry?: InstanceRegistryAdapter,\n): Promise<{ valid: AgentInstanceMeta[]; corrupted: string[] }> {\n const valid: AgentInstanceMeta[] = [];\n const corrupted: string[] = [];\n const validNames = new Set<string>();\n\n if (registry) {\n for (const entry of registry.list()) {\n if (entry.status === \"orphaned\") continue;\n try {\n const st = await stat(entry.workspacePath);\n if (!st.isDirectory()) {\n corrupted.push(entry.name);\n continue;\n }\n const meta = await readInstanceMeta(entry.workspacePath);\n valid.push(meta);\n validNames.add(entry.name);\n } catch (err) {\n logger.warn({ name: entry.name, path: entry.workspacePath, error: err }, \"Registry entry unreachable or corrupted\");\n corrupted.push(entry.name);\n }\n }\n }\n\n let entries: string[];\n try {\n entries = await readdir(instancesBaseDir);\n } catch (err) {\n if (isNodeError(err) && err.code === \"ENOENT\") {\n return { valid, corrupted };\n }\n throw err;\n }\n\n for (const entry of entries) {\n if (entry.startsWith(\".\")) continue;\n const dirPath = join(instancesBaseDir, entry);\n const dirStat = await stat(dirPath).catch(() => null);\n if (!dirStat?.isDirectory()) continue;\n\n try {\n const meta = await readInstanceMeta(dirPath);\n if (validNames.has(meta.name)) continue;\n valid.push(meta);\n validNames.add(meta.name);\n } catch (err) {\n logger.warn({ dir: entry, error: err }, \"Corrupted instance directory\");\n corrupted.push(entry);\n }\n }\n\n return { valid, corrupted };\n}\n\nfunction isNodeError(err: unknown): err is NodeJS.ErrnoException {\n return err instanceof Error && \"code\" in err;\n}\n","import { readFile, writeFile, rename, readdir, stat, mkdir } from \"node:fs/promises\";\nimport { join, dirname, resolve, relative } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport type { AgentInstanceMeta } from \"@actant/shared\";\nimport { InstanceCorruptedError } from \"@actant/shared\";\nimport { readInstanceMeta } from \"./instance-meta-io\";\nimport type { InstanceRegistryAdapter } from \"./instance-registry-types\";\n\nexport interface InstanceRegistryEntry {\n name: string;\n template: string;\n workspacePath: string;\n location: \"builtin\" | \"external\";\n createdAt: string;\n status: \"stopped\" | \"running\" | \"orphaned\";\n}\n\nexport interface InstanceRegistryData {\n version: 1;\n instances: Record<string, InstanceRegistryEntry>;\n}\n\nconst REGISTRY_VERSION = 1 as const;\n\nfunction mapMetaStatusToRegistry(status: AgentInstanceMeta[\"status\"]): InstanceRegistryEntry[\"status\"] {\n if (status === \"running\" || status === \"starting\") return \"running\";\n return \"stopped\";\n}\n\nexport class InstanceRegistry implements InstanceRegistryAdapter {\n private data: InstanceRegistryData = {\n version: REGISTRY_VERSION,\n instances: {},\n };\n\n constructor(\n private readonly registryPath: string,\n private readonly builtinInstancesDir: string,\n ) {}\n\n async load(): Promise<void> {\n try {\n const raw = await readFile(this.registryPath, \"utf-8\");\n const parsed = JSON.parse(raw) as unknown;\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"version\" in parsed &&\n (parsed as InstanceRegistryData).version === 1 &&\n \"instances\" in parsed &&\n typeof (parsed as InstanceRegistryData).instances === \"object\"\n ) {\n this.data = parsed as InstanceRegistryData;\n }\n } catch (err) {\n if (isNodeError(err) && err.code === \"ENOENT\") {\n this.data = { version: REGISTRY_VERSION, instances: {} };\n return;\n }\n throw err;\n }\n }\n\n async save(): Promise<void> {\n const tmpPath = `${this.registryPath}.${randomUUID().slice(0, 8)}.tmp`;\n const content = JSON.stringify(this.data, null, 2) + \"\\n\";\n await mkdir(dirname(this.registryPath), { recursive: true });\n await writeFile(tmpPath, content, \"utf-8\");\n await rename(tmpPath, this.registryPath);\n }\n\n register(entry: InstanceRegistryEntry): void {\n this.data.instances[entry.name] = entry;\n }\n\n unregister(name: string): boolean {\n if (!(name in this.data.instances)) return false;\n delete this.data.instances[name];\n return true;\n }\n\n get(name: string): InstanceRegistryEntry | undefined {\n return this.data.instances[name];\n }\n\n list(): InstanceRegistryEntry[] {\n return Object.values(this.data.instances);\n }\n\n has(name: string): boolean {\n return name in this.data.instances;\n }\n\n updateStatus(name: string, status: InstanceRegistryEntry[\"status\"]): void {\n const entry = this.data.instances[name];\n if (entry) {\n entry.status = status;\n }\n }\n\n async adopt(workspacePath: string, renameTo?: string): Promise<InstanceRegistryEntry> {\n const resolvedPath = resolve(workspacePath);\n const meta = await readInstanceMeta(resolvedPath);\n\n if (!meta.name || !meta.templateName) {\n throw new InstanceCorruptedError(\n resolvedPath,\n \".actant.json must have name and templateName\",\n );\n }\n\n const name = renameTo ?? meta.name;\n if (this.has(name)) {\n throw new Error(`Instance name \"${name}\" already exists in registry`);\n }\n\n const rel = relative(resolve(this.builtinInstancesDir), resolvedPath);\n const isBuiltin = !rel.startsWith(\"..\");\n const location: \"builtin\" | \"external\" = isBuiltin ? \"builtin\" : \"external\";\n\n const entry: InstanceRegistryEntry = {\n name,\n template: meta.templateName,\n workspacePath: resolvedPath,\n location,\n createdAt: meta.createdAt,\n status: mapMetaStatusToRegistry(meta.status),\n };\n\n this.register(entry);\n await this.save();\n return entry;\n }\n\n async reconcile(): Promise<{ orphaned: string[]; adopted: string[] }> {\n const orphaned: string[] = [];\n const adopted: string[] = [];\n\n for (const entry of this.list()) {\n try {\n const st = await stat(entry.workspacePath);\n if (!st.isDirectory()) {\n this.updateStatus(entry.name, \"orphaned\");\n orphaned.push(entry.name);\n }\n } catch {\n this.updateStatus(entry.name, \"orphaned\");\n orphaned.push(entry.name);\n }\n }\n\n let builtinEntries: string[];\n try {\n builtinEntries = await readdir(this.builtinInstancesDir);\n } catch (err) {\n if (isNodeError(err) && err.code === \"ENOENT\") {\n builtinEntries = [];\n } else {\n throw err;\n }\n }\n\n for (const entry of builtinEntries) {\n if (entry.startsWith(\".\")) continue;\n const dirPath = join(this.builtinInstancesDir, entry);\n const dirStat = await stat(dirPath).catch(() => null);\n if (!dirStat?.isDirectory()) continue;\n\n const registered = this.list().some((e) => e.workspacePath === dirPath);\n if (registered) continue;\n\n try {\n const adoptedEntry = await this.adopt(dirPath);\n adopted.push(adoptedEntry.name);\n } catch {\n // Skip corrupted or invalid directories\n }\n }\n\n await this.save();\n return { orphaned, adopted };\n }\n}\n\nfunction isNodeError(err: unknown): err is NodeJS.ErrnoException {\n return err instanceof Error && \"code\" in err;\n}\n","import { createLogger } from \"@actant/shared\";\nimport type { InitializerStep } from \"@actant/shared\";\nimport type { InitializerStepExecutor } from \"./step-executor\";\nimport type { StepRegistry } from \"./step-registry\";\nimport type {\n StepContext,\n StepValidationResult,\n PipelineOptions,\n PipelineResult,\n PipelineStepError,\n} from \"./types\";\n\nconst logger = createLogger(\"initialization-pipeline\");\n\nconst DEFAULT_STEP_TIMEOUT_MS = 60_000;\nconst DEFAULT_TOTAL_TIMEOUT_MS = 300_000;\n\ninterface ExecutedStep {\n index: number;\n executor: InitializerStepExecutor;\n config: unknown;\n}\n\n/**\n * Executes an ordered list of initializer steps with:\n * - Sequential execution (steps may depend on prior shared state)\n * - Per-step and total pipeline timeout\n * - Transactional rollback on failure (reverse order)\n * - Progress reporting\n */\nexport class InitializationPipeline {\n private readonly stepTimeoutMs: number;\n private readonly totalTimeoutMs: number;\n private readonly onProgress?: PipelineOptions[\"onProgress\"];\n\n constructor(\n private readonly registry: StepRegistry,\n options?: PipelineOptions,\n ) {\n this.stepTimeoutMs = options?.defaultStepTimeoutMs ?? DEFAULT_STEP_TIMEOUT_MS;\n this.totalTimeoutMs = options?.totalTimeoutMs ?? DEFAULT_TOTAL_TIMEOUT_MS;\n this.onProgress = options?.onProgress;\n }\n\n /**\n * Validate all steps without executing them.\n * Returns per-step validation results.\n */\n dryRun(steps: InitializerStep[]): StepValidationResult[] {\n return steps.map((step) => {\n const executor = this.registry.get(step.type);\n if (!executor) {\n return { valid: false, issues: [{ field: \"type\", message: `Unknown step type: \"${step.type}\"` }] };\n }\n return executor.validate(step.config ?? {});\n });\n }\n\n /**\n * Execute all steps sequentially. On failure, rollback executed steps in reverse order.\n */\n async run(steps: InitializerStep[], context: StepContext): Promise<PipelineResult> {\n const outputs = new Map<string, Record<string, unknown>>();\n const errors: PipelineStepError[] = [];\n const executed: ExecutedStep[] = [];\n const pipelineStart = Date.now();\n\n logger.info({ stepsCount: steps.length }, \"Starting initialization pipeline\");\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i];\n if (!step) continue;\n\n if (Date.now() - pipelineStart > this.totalTimeoutMs) {\n const err = new Error(`Pipeline total timeout exceeded (${this.totalTimeoutMs}ms)`);\n errors.push({ stepIndex: i, stepType: step.type, error: err });\n logger.error({ stepIndex: i, stepType: step.type }, \"Pipeline timeout exceeded\");\n await this.rollback(executed, context, err);\n return { success: false, stepsExecuted: i, stepsTotal: steps.length, errors, outputs };\n }\n\n const executor = this.registry.get(step.type);\n if (!executor) {\n const err = new Error(`No executor for step type: \"${step.type}\"`);\n errors.push({ stepIndex: i, stepType: step.type, error: err });\n await this.rollback(executed, context, err);\n return { success: false, stepsExecuted: i, stepsTotal: steps.length, errors, outputs };\n }\n\n this.onProgress?.(i, steps.length, step.type);\n logger.debug({ stepIndex: i, stepType: step.type }, \"Executing step\");\n\n try {\n const result = await this.executeWithTimeout(executor, context, step.config ?? {});\n\n if (!result.success) {\n const err = new Error(result.message ?? `Step \"${step.type}\" reported failure`);\n errors.push({ stepIndex: i, stepType: step.type, error: err });\n executed.push({ index: i, executor, config: step.config ?? {} });\n await this.rollback(executed, context, err);\n return { success: false, stepsExecuted: i + 1, stepsTotal: steps.length, errors, outputs };\n }\n\n executed.push({ index: i, executor, config: step.config ?? {} });\n if (result.output) {\n outputs.set(`step-${i}-${step.type}`, result.output);\n }\n if (result.message) {\n logger.info({ stepIndex: i, stepType: step.type }, result.message);\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n errors.push({ stepIndex: i, stepType: step.type, error });\n logger.error({ stepIndex: i, stepType: step.type, error }, \"Step execution failed\");\n executed.push({ index: i, executor, config: step.config ?? {} });\n await this.rollback(executed, context, error);\n return { success: false, stepsExecuted: i + 1, stepsTotal: steps.length, errors, outputs };\n }\n }\n\n logger.info({ stepsExecuted: steps.length, elapsedMs: Date.now() - pipelineStart }, \"Pipeline completed successfully\");\n return { success: true, stepsExecuted: steps.length, stepsTotal: steps.length, errors, outputs };\n }\n\n private async executeWithTimeout(\n executor: InitializerStepExecutor,\n context: StepContext,\n config: unknown,\n ): Promise<import(\"./types\").StepResult> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`Step \"${executor.type}\" timed out after ${this.stepTimeoutMs}ms`));\n }, this.stepTimeoutMs);\n\n executor.execute(context, config).then(\n (result) => { clearTimeout(timer); resolve(result); },\n (err) => { clearTimeout(timer); reject(err); },\n );\n });\n }\n\n private async rollback(executed: ExecutedStep[], context: StepContext, triggerError: Error): Promise<void> {\n if (executed.length === 0) return;\n logger.info({ stepsToRollback: executed.length }, \"Rolling back executed steps\");\n\n for (let i = executed.length - 1; i >= 0; i--) {\n const entry = executed[i];\n if (!entry) continue;\n const { executor, config, index } = entry;\n if (!executor.rollback) continue;\n\n try {\n await executor.rollback(context, config, triggerError);\n logger.debug({ stepIndex: index, stepType: executor.type }, \"Step rolled back\");\n } catch (rollbackErr) {\n logger.warn(\n { stepIndex: index, stepType: executor.type, error: rollbackErr },\n \"Rollback failed (best-effort)\",\n );\n }\n }\n }\n}\n","import { writeFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { DomainContextConfig, McpServerRef } from \"@actant/shared\";\nimport type { AgentBackendType } from \"@actant/shared\";\nimport { createLogger } from \"@actant/shared\";\nimport type { SkillManager } from \"../../domain/skill/skill-manager\";\nimport type { PromptManager } from \"../../domain/prompt/prompt-manager\";\nimport type { McpConfigManager } from \"../../domain/mcp/mcp-config-manager\";\nimport type { WorkflowManager } from \"../../domain/workflow/workflow-manager\";\n\nconst logger = createLogger(\"context-materializer\");\n\n/** Config directory per backend: Cursor uses .cursor, Claude Code uses .claude (hooks/MCP go here). */\nconst BACKEND_CONFIG_DIR: Record<AgentBackendType, string> = {\n cursor: \".cursor\",\n \"cursor-agent\": \".cursor\",\n \"claude-code\": \".claude\",\n pi: \".pi\",\n custom: \".cursor\",\n};\n\n/**\n * Optional Domain managers for full component resolution.\n * When provided, names are resolved to real definitions and rendered.\n * When absent, placeholder content is generated.\n */\nexport interface DomainManagers {\n skills?: SkillManager;\n prompts?: PromptManager;\n mcp?: McpConfigManager;\n workflows?: WorkflowManager;\n}\n\n/**\n * Materializes Domain Context references into actual files in the instance workspace.\n * Paths for IDE-specific config (MCP, etc.) depend on backendType (e.g. .cursor vs .claude).\n *\n * Materialization rules:\n * skills → AGENTS.md\n * mcpServers → {backendConfigDir}/mcp.json (e.g. .cursor/mcp.json or .claude/mcp.json)\n * workflow → .trellis/workflow.md\n * prompts → prompts/system.md\n * subAgents → recorded in .actant.json (not materialized as files)\n *\n * @deprecated Use WorkspaceBuilder + BackendBuilder instead (Phase 3b).\n * Kept for backward compatibility; will be removed in a future version.\n */\nexport class ContextMaterializer {\n constructor(private readonly managers?: DomainManagers) {}\n\n async materialize(\n workspaceDir: string,\n domainContext: DomainContextConfig,\n backendType: AgentBackendType = \"cursor\",\n ): Promise<void> {\n const configDir = BACKEND_CONFIG_DIR[backendType];\n const tasks: Promise<void>[] = [];\n\n if (domainContext.skills && domainContext.skills.length > 0) {\n tasks.push(this.materializeSkills(workspaceDir, domainContext.skills));\n }\n\n if (domainContext.mcpServers && domainContext.mcpServers.length > 0) {\n tasks.push(this.materializeMcpServers(workspaceDir, domainContext.mcpServers, configDir));\n\n if (backendType === \"claude-code\") {\n tasks.push(this.materializeClaudePermissions(workspaceDir, domainContext.mcpServers, configDir));\n }\n }\n\n if (domainContext.workflow) {\n tasks.push(this.materializeWorkflow(workspaceDir, domainContext.workflow));\n }\n\n if (domainContext.prompts && domainContext.prompts.length > 0) {\n tasks.push(this.materializePrompts(workspaceDir, domainContext.prompts));\n }\n\n await Promise.all(tasks);\n logger.debug({ workspaceDir, backendType, configDir }, \"Domain context materialized\");\n }\n\n private async materializeSkills(workspaceDir: string, skillNames: string[]): Promise<void> {\n let content: string;\n if (this.managers?.skills) {\n const resolved = this.managers.skills.resolve(skillNames);\n content = this.managers.skills.renderSkills(resolved);\n } else {\n content = [\n \"# Agent Skills\",\n \"\",\n ...skillNames.map((s) => `- ${s}`),\n \"\",\n ].join(\"\\n\");\n }\n await writeFile(join(workspaceDir, \"AGENTS.md\"), content, \"utf-8\");\n }\n\n /**\n * MCP Servers → {configDir}/mcp.json (e.g. .cursor/mcp.json or .claude/mcp.json)\n * Template provides inline McpServerRef configs; no name-based resolution needed.\n */\n private async materializeMcpServers(\n workspaceDir: string,\n servers: McpServerRef[],\n configDirName: string,\n ): Promise<void> {\n const configDir = join(workspaceDir, configDirName);\n await mkdir(configDir, { recursive: true });\n\n const mcpConfig: Record<string, { command: string; args: string[]; env?: Record<string, string> }> = {};\n for (const server of servers) {\n mcpConfig[server.name] = {\n command: server.command,\n args: server.args ?? [],\n ...(server.env && Object.keys(server.env).length > 0 ? { env: server.env } : {}),\n };\n }\n\n const config = { mcpServers: mcpConfig };\n await writeFile(\n join(configDir, \"mcp.json\"),\n JSON.stringify(config, null, 2) + \"\\n\",\n \"utf-8\",\n );\n }\n\n /**\n * Claude Code settings.local.json — pre-approve tools so agents can operate autonomously.\n * Includes both MCP tools (`mcp__<server>` prefix) and essential built-in tools.\n */\n private async materializeClaudePermissions(\n workspaceDir: string,\n servers: McpServerRef[],\n configDirName: string,\n ): Promise<void> {\n const configDir = join(workspaceDir, configDirName);\n await mkdir(configDir, { recursive: true });\n\n const allowedTools: string[] = [\n \"Bash\",\n \"Read\",\n \"Write\",\n \"Edit\",\n \"MultiEdit\",\n \"WebFetch\",\n \"WebSearch\",\n ];\n for (const server of servers) {\n allowedTools.push(`mcp__${server.name}`);\n }\n\n const settings = {\n permissions: {\n allow: allowedTools,\n deny: [],\n },\n };\n await writeFile(\n join(configDir, \"settings.local.json\"),\n JSON.stringify(settings, null, 2) + \"\\n\",\n \"utf-8\",\n );\n }\n\n private async materializeWorkflow(workspaceDir: string, workflowName: string): Promise<void> {\n const trellisDir = join(workspaceDir, \".trellis\");\n await mkdir(trellisDir, { recursive: true });\n\n let content: string;\n if (this.managers?.workflows) {\n const resolved = this.managers.workflows.resolve([workflowName]);\n const workflow = resolved[0];\n content = workflow\n ? this.managers.workflows.renderWorkflow(workflow)\n : `# Workflow: ${workflowName}\\n\\n> Workflow \"${workflowName}\" not resolved.\\n`;\n } else {\n content = [\n `# Workflow: ${workflowName}`,\n \"\",\n `> Workflow \"${workflowName}\" referenced by name.`,\n \"\",\n ].join(\"\\n\");\n }\n await writeFile(join(trellisDir, \"workflow.md\"), content, \"utf-8\");\n }\n\n private async materializePrompts(workspaceDir: string, promptNames: string[]): Promise<void> {\n const promptsDir = join(workspaceDir, \"prompts\");\n await mkdir(promptsDir, { recursive: true });\n\n let content: string;\n if (this.managers?.prompts) {\n const resolved = this.managers.prompts.resolve(promptNames);\n content = this.managers.prompts.renderPrompts(resolved);\n } else {\n content = [\n \"# System Prompts\",\n \"\",\n ...promptNames.map((p) => `- ${p}`),\n \"\",\n ].join(\"\\n\");\n }\n await writeFile(join(promptsDir, \"system.md\"), content, \"utf-8\");\n }\n}\n","import type { StepContext, StepResult, StepValidationResult } from \"./types\";\n\n/**\n * Abstract base class for initializer step executors.\n * Each step type (e.g. \"git-clone\", \"exec\") implements this interface.\n */\nexport abstract class InitializerStepExecutor {\n /** Unique identifier matching the `type` field in InitializerStep config. */\n abstract readonly type: string;\n\n /** Validate step-specific config before execution. */\n abstract validate(config: unknown): StepValidationResult;\n\n /** Execute the step within the given context. */\n abstract execute(context: StepContext, config: unknown): Promise<StepResult>;\n\n /** Optional rollback — called in reverse order when a later step fails. */\n rollback?(context: StepContext, config: unknown, error: Error): Promise<void>;\n}\n","import { createLogger } from \"@actant/shared\";\nimport type { InitializerStepExecutor } from \"./step-executor\";\n\nconst logger = createLogger(\"step-registry\");\n\n/**\n * Registry for initializer step executors.\n * Supports registration of custom step types at runtime.\n */\nexport class StepRegistry {\n private readonly executors = new Map<string, InitializerStepExecutor>();\n\n register(executor: InitializerStepExecutor): void {\n if (this.executors.has(executor.type)) {\n logger.warn({ type: executor.type }, \"Overwriting existing step executor\");\n }\n this.executors.set(executor.type, executor);\n logger.debug({ type: executor.type }, \"Step executor registered\");\n }\n\n get(type: string): InitializerStepExecutor | undefined {\n return this.executors.get(type);\n }\n\n getOrThrow(type: string): InitializerStepExecutor {\n const executor = this.executors.get(type);\n if (!executor) {\n throw new Error(`No executor registered for step type: \"${type}\"`);\n }\n return executor;\n }\n\n has(type: string): boolean {\n return this.executors.has(type);\n }\n\n listTypes(): string[] {\n return [...this.executors.keys()];\n }\n}\n","import { mkdir, rm } from \"node:fs/promises\";\nimport { join, isAbsolute } from \"node:path\";\nimport { InitializerStepExecutor } from \"../pipeline/step-executor\";\nimport type { StepContext, StepResult, StepValidationResult } from \"../pipeline/types\";\n\ninterface MkdirConfig {\n paths: string[];\n}\n\n/**\n * Creates directories within the workspace.\n * Paths are relative to workspaceDir (absolute paths are rejected for safety).\n */\nexport class MkdirStep extends InitializerStepExecutor {\n readonly type = \"mkdir\";\n\n validate(config: unknown): StepValidationResult {\n const issues: StepValidationResult[\"issues\"] = [];\n const c = config as Record<string, unknown>;\n\n if (!Array.isArray(c.paths) || c.paths.length === 0) {\n issues.push({ field: \"paths\", message: \"paths must be a non-empty array of strings\" });\n return { valid: false, issues };\n }\n\n for (const p of c.paths) {\n if (typeof p !== \"string\" || p.length === 0) {\n issues.push({ field: \"paths\", message: `Invalid path entry: ${String(p)}` });\n } else if (isAbsolute(p)) {\n issues.push({ field: \"paths\", message: `Absolute paths not allowed: ${p}` });\n }\n }\n\n return { valid: issues.length === 0, issues };\n }\n\n async execute(context: StepContext, config: unknown): Promise<StepResult> {\n const { paths } = config as MkdirConfig;\n const created: string[] = [];\n\n for (const p of paths) {\n const fullPath = join(context.workspaceDir, p);\n await mkdir(fullPath, { recursive: true });\n created.push(p);\n context.logger.debug({ path: fullPath }, \"Directory created\");\n }\n\n return { success: true, output: { created }, message: `Created ${created.length} directories` };\n }\n\n async rollback(context: StepContext, config: unknown, _error: Error): Promise<void> {\n const { paths } = config as MkdirConfig;\n for (const p of [...paths].reverse()) {\n const fullPath = join(context.workspaceDir, p);\n await rm(fullPath, { recursive: true, force: true }).catch(() => {});\n }\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { join, isAbsolute } from \"node:path\";\nimport { InitializerStepExecutor } from \"../pipeline/step-executor\";\nimport type { StepContext, StepResult, StepValidationResult } from \"../pipeline/types\";\n\ninterface ExecConfig {\n command: string;\n args?: string[];\n /** Working directory relative to workspaceDir. Default: workspaceDir itself. */\n cwd?: string;\n env?: Record<string, string>;\n}\n\n/**\n * Execute an arbitrary shell command within the workspace.\n */\nexport class ExecStep extends InitializerStepExecutor {\n readonly type = \"exec\";\n\n validate(config: unknown): StepValidationResult {\n const issues: StepValidationResult[\"issues\"] = [];\n const c = config as Record<string, unknown>;\n\n if (typeof c.command !== \"string\" || c.command.length === 0) {\n issues.push({ field: \"command\", message: \"command is required\" });\n }\n if (c.args !== undefined && !Array.isArray(c.args)) {\n issues.push({ field: \"args\", message: \"args must be an array of strings\" });\n }\n if (c.cwd !== undefined && (typeof c.cwd !== \"string\" || isAbsolute(c.cwd))) {\n issues.push({ field: \"cwd\", message: \"cwd must be a relative path\" });\n }\n\n return { valid: issues.length === 0, issues };\n }\n\n async execute(context: StepContext, config: unknown): Promise<StepResult> {\n const { command, args = [], cwd, env } = config as ExecConfig;\n const workDir = cwd ? join(context.workspaceDir, cwd) : context.workspaceDir;\n\n context.logger.debug({ command, args, cwd: workDir }, \"Executing command\");\n\n let exitCode: number;\n let stdout: string;\n let stderr: string;\n try {\n ({ exitCode, stdout, stderr } = await runCommand(command, args, workDir, env));\n } catch (err) {\n return {\n success: false,\n output: { exitCode: 1, stdout: \"\", stderr: (err as Error).message },\n message: `Command \"${command}\" failed to start: ${(err as Error).message}`,\n };\n }\n\n if (exitCode !== 0) {\n return {\n success: false,\n output: { exitCode, stdout, stderr },\n message: `Command \"${command}\" exited with code ${exitCode}: ${stderr.slice(0, 200)}`,\n };\n }\n\n return {\n success: true,\n output: { exitCode, stdout, stderr },\n message: `Command \"${command}\" completed successfully`,\n };\n }\n}\n\nfunction runCommand(\n command: string,\n args: string[],\n cwd: string,\n env?: Record<string, string>,\n): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n env: env ? { ...process.env, ...env } : process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: true,\n });\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n\n child.stdout.on(\"data\", (chunk: Buffer) => stdoutChunks.push(chunk));\n child.stderr.on(\"data\", (chunk: Buffer) => stderrChunks.push(chunk));\n\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n resolve({\n exitCode: code ?? 1,\n stdout: Buffer.concat(stdoutChunks).toString(\"utf-8\"),\n stderr: Buffer.concat(stderrChunks).toString(\"utf-8\"),\n });\n });\n });\n}\n","import { cp, rm, access } from \"node:fs/promises\";\nimport { join, isAbsolute } from \"node:path\";\nimport { InitializerStepExecutor } from \"../pipeline/step-executor\";\nimport type { StepContext, StepResult, StepValidationResult } from \"../pipeline/types\";\n\ninterface FileCopyConfig {\n /** Source path (absolute or relative to workspaceDir). */\n from: string;\n /** Destination path relative to workspaceDir. */\n to: string;\n /** If true, copy recursively (for directories). Default: true. */\n recursive?: boolean;\n}\n\n/**\n * Copy files or directories into the workspace.\n * `from` can be absolute (external source) or relative to workspaceDir.\n * `to` must be relative to workspaceDir.\n */\nexport class FileCopyStep extends InitializerStepExecutor {\n readonly type = \"file-copy\";\n\n validate(config: unknown): StepValidationResult {\n const issues: StepValidationResult[\"issues\"] = [];\n const c = config as Record<string, unknown>;\n\n if (typeof c.from !== \"string\" || c.from.length === 0) {\n issues.push({ field: \"from\", message: \"from path is required\" });\n }\n if (typeof c.to !== \"string\" || c.to.length === 0) {\n issues.push({ field: \"to\", message: \"to path is required\" });\n } else if (isAbsolute(c.to as string)) {\n issues.push({ field: \"to\", message: \"to must be a relative path within the workspace\" });\n }\n\n return { valid: issues.length === 0, issues };\n }\n\n async execute(context: StepContext, config: unknown): Promise<StepResult> {\n const { from, to, recursive = true } = config as FileCopyConfig;\n const srcPath = isAbsolute(from) ? from : join(context.workspaceDir, from);\n const destPath = join(context.workspaceDir, to);\n\n try {\n await access(srcPath);\n } catch {\n return { success: false, message: `Source path does not exist: ${srcPath}` };\n }\n\n await cp(srcPath, destPath, { recursive, force: true });\n context.logger.debug({ from: srcPath, to: destPath }, \"Files copied\");\n\n return { success: true, output: { from: srcPath, to: destPath }, message: `Copied ${from} → ${to}` };\n }\n\n async rollback(context: StepContext, config: unknown, _error: Error): Promise<void> {\n const { to } = config as FileCopyConfig;\n const destPath = join(context.workspaceDir, to);\n await rm(destPath, { recursive: true, force: true }).catch(() => {});\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { InitializerStepExecutor } from \"../pipeline/step-executor\";\nimport type { StepContext, StepResult, StepValidationResult } from \"../pipeline/types\";\n\ninterface GitCloneConfig {\n repo: string;\n /** Target directory relative to workspaceDir. Default: \".\" (workspace root). */\n target?: string;\n branch?: string;\n depth?: number;\n}\n\n/**\n * Clone a git repository into the workspace.\n */\nexport class GitCloneStep extends InitializerStepExecutor {\n readonly type = \"git-clone\";\n\n validate(config: unknown): StepValidationResult {\n const issues: StepValidationResult[\"issues\"] = [];\n const c = config as Record<string, unknown>;\n\n if (typeof c.repo !== \"string\" || c.repo.length === 0) {\n issues.push({ field: \"repo\", message: \"repo URL is required\" });\n }\n if (c.depth !== undefined && (typeof c.depth !== \"number\" || c.depth < 1)) {\n issues.push({ field: \"depth\", message: \"depth must be a positive integer\" });\n }\n\n return { valid: issues.length === 0, issues };\n }\n\n async execute(context: StepContext, config: unknown): Promise<StepResult> {\n const { repo, target = \".\", branch, depth } = config as GitCloneConfig;\n const targetDir = join(context.workspaceDir, target);\n\n const args = [\"clone\"];\n if (branch) args.push(\"--branch\", branch);\n if (depth) args.push(\"--depth\", String(depth));\n args.push(repo, targetDir);\n\n context.logger.debug({ repo, branch, depth, targetDir }, \"Cloning git repository\");\n\n const result = await gitExec(args);\n\n if (result.exitCode !== 0) {\n return {\n success: false,\n output: { exitCode: result.exitCode, stderr: result.stderr },\n message: `git clone failed: ${result.stderr.slice(0, 200)}`,\n };\n }\n\n return {\n success: true,\n output: { repo, branch, targetDir },\n message: `Cloned ${repo}${branch ? ` (branch: ${branch})` : \"\"}`,\n };\n }\n\n async rollback(context: StepContext, config: unknown, _error: Error): Promise<void> {\n const { target = \".\" } = config as GitCloneConfig;\n if (target !== \".\") {\n const targetDir = join(context.workspaceDir, target);\n await rm(targetDir, { recursive: true, force: true }).catch(() => {});\n }\n }\n}\n\nfunction gitExec(args: string[]): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n const child = spawn(\"git\", args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n\n child.stdout.on(\"data\", (chunk: Buffer) => stdoutChunks.push(chunk));\n child.stderr.on(\"data\", (chunk: Buffer) => stderrChunks.push(chunk));\n\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n resolve({\n exitCode: code ?? 1,\n stdout: Buffer.concat(stdoutChunks).toString(\"utf-8\"),\n stderr: Buffer.concat(stderrChunks).toString(\"utf-8\"),\n });\n });\n });\n}\n","import { spawn } from \"node:child_process\";\nimport { join } from \"node:path\";\nimport { InitializerStepExecutor } from \"../pipeline/step-executor\";\nimport type { StepContext, StepResult, StepValidationResult } from \"../pipeline/types\";\n\ninterface NpmInstallConfig {\n /** Package manager: \"npm\" | \"pnpm\" | \"yarn\". Default: \"npm\". */\n packageManager?: \"npm\" | \"pnpm\" | \"yarn\";\n /** Working directory relative to workspaceDir. Default: \".\" */\n cwd?: string;\n /** Extra arguments (e.g. [\"--frozen-lockfile\"]). */\n args?: string[];\n /** Custom registry URL. */\n registry?: string;\n}\n\n/**\n * Run package installation (npm/pnpm/yarn install) within the workspace.\n */\nexport class NpmInstallStep extends InitializerStepExecutor {\n readonly type = \"npm-install\";\n\n validate(config: unknown): StepValidationResult {\n const issues: StepValidationResult[\"issues\"] = [];\n const c = config as Record<string, unknown>;\n\n if (c.packageManager !== undefined) {\n const valid = [\"npm\", \"pnpm\", \"yarn\"];\n if (!valid.includes(c.packageManager as string)) {\n issues.push({ field: \"packageManager\", message: `Must be one of: ${valid.join(\", \")}` });\n }\n }\n if (c.args !== undefined && !Array.isArray(c.args)) {\n issues.push({ field: \"args\", message: \"args must be an array of strings\" });\n }\n\n return { valid: issues.length === 0, issues };\n }\n\n async execute(context: StepContext, config: unknown): Promise<StepResult> {\n const { packageManager = \"npm\", cwd = \".\", args = [], registry } = config as NpmInstallConfig;\n const workDir = join(context.workspaceDir, cwd);\n const cmdArgs = [\"install\", ...args];\n if (registry) cmdArgs.push(\"--registry\", registry);\n\n context.logger.debug({ packageManager, cwd: workDir, args: cmdArgs }, \"Installing dependencies\");\n\n const result = await runInstall(packageManager, cmdArgs, workDir);\n\n if (result.exitCode !== 0) {\n return {\n success: false,\n output: { exitCode: result.exitCode, stderr: result.stderr },\n message: `${packageManager} install failed (exit ${result.exitCode}): ${result.stderr.slice(0, 200)}`,\n };\n }\n\n return {\n success: true,\n output: { packageManager, exitCode: 0 },\n message: `${packageManager} install completed`,\n };\n }\n}\n\nfunction runInstall(\n pm: string,\n args: string[],\n cwd: string,\n): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n const child = spawn(pm, args, {\n cwd,\n env: process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: process.platform === \"win32\",\n });\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n\n child.stdout.on(\"data\", (chunk: Buffer) => stdoutChunks.push(chunk));\n child.stderr.on(\"data\", (chunk: Buffer) => stderrChunks.push(chunk));\n\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n resolve({\n exitCode: code ?? 1,\n stdout: Buffer.concat(stdoutChunks).toString(\"utf-8\"),\n stderr: Buffer.concat(stderrChunks).toString(\"utf-8\"),\n });\n });\n });\n}\n","import { StepRegistry } from \"../pipeline/step-registry\";\nimport { MkdirStep } from \"./mkdir-step\";\nimport { ExecStep } from \"./exec-step\";\nimport { FileCopyStep } from \"./file-copy-step\";\nimport { GitCloneStep } from \"./git-clone-step\";\nimport { NpmInstallStep } from \"./npm-install-step\";\n\nexport { MkdirStep } from \"./mkdir-step\";\nexport { ExecStep } from \"./exec-step\";\nexport { FileCopyStep } from \"./file-copy-step\";\nexport { GitCloneStep } from \"./git-clone-step\";\nexport { NpmInstallStep } from \"./npm-install-step\";\n\n/**\n * Create a StepRegistry pre-loaded with all built-in step executors.\n */\nexport function createDefaultStepRegistry(): StepRegistry {\n const registry = new StepRegistry();\n registry.register(new MkdirStep());\n registry.register(new ExecStep());\n registry.register(new FileCopyStep());\n registry.register(new GitCloneStep());\n registry.register(new NpmInstallStep());\n return registry;\n}\n","import { join } from \"node:path\";\nimport { rename, mkdir } from \"node:fs/promises\";\nimport type { AgentInstanceMeta, AgentStatus, ResolveResult, DetachResult } from \"@actant/shared\";\nimport {\n AgentNotFoundError,\n AgentAlreadyRunningError,\n AgentAlreadyAttachedError,\n AgentNotAttachedError,\n createLogger,\n} from \"@actant/shared\";\nimport type { AgentInitializer } from \"../initializer/index\";\nimport type { InstanceOverrides } from \"../initializer/index\";\nimport type { AgentLauncher, AgentProcess } from \"./launcher/agent-launcher\";\nimport { resolveBackend, resolveAcpBackend, openBackend, isAcpOnlyBackend } from \"./launcher/backend-resolver\";\nimport { requireMode } from \"./launcher/backend-registry\";\nimport { ProcessWatcher, type ProcessExitInfo } from \"./launcher/process-watcher\";\nimport { getLaunchModeHandler } from \"./launch-mode-handler\";\nimport { RestartTracker, type RestartPolicy } from \"./restart-tracker\";\nimport { delay } from \"./launcher/process-utils\";\nimport { scanInstances, updateInstanceMeta } from \"../state/index\";\nimport type { InstanceRegistryAdapter } from \"../state/instance-registry-types\";\nimport type { PromptResult, StreamChunk, RunPromptOptions } from \"../communicator/agent-communicator\";\nimport { createCommunicator } from \"../communicator/create-communicator\";\n\nconst logger = createLogger(\"agent-manager\");\n\n/**\n * Minimal ACP connection manager interface.\n * The real implementation lives in @actant/acp; this avoids a circular dependency.\n */\nexport interface AcpConnectionManagerLike {\n connect(name: string, options: {\n command: string;\n args: string[];\n cwd: string;\n connectionOptions?: {\n autoApprove?: boolean;\n env?: Record<string, string>;\n };\n }): Promise<{ sessionId: string }>;\n has(name: string): boolean;\n getPrimarySessionId(name: string): string | undefined;\n getConnection(name: string): AcpConnectionLike | undefined;\n disconnect(name: string): Promise<void>;\n disposeAll(): Promise<void>;\n}\n\nexport interface AcpConnectionLike {\n prompt(sessionId: string, text: string): Promise<{ stopReason: string; text: string }>;\n streamPrompt(sessionId: string, text: string): AsyncIterable<unknown>;\n newSession(cwd: string): Promise<{ sessionId: string }>;\n isConnected: boolean;\n}\n\nexport interface ManagerOptions {\n corruptedDir?: string;\n /** Milliseconds between process alive checks. Default: 5000 */\n watcherPollIntervalMs?: number;\n /** Restart policy for acp-service agents. */\n restartPolicy?: Partial<RestartPolicy>;\n /** ACP connection manager for ACP-based backends. */\n acpManager?: AcpConnectionManagerLike;\n /** Instance registry for discovering external workspaces. */\n instanceRegistry?: InstanceRegistryAdapter;\n}\n\nexport class AgentManager {\n private cache = new Map<string, AgentInstanceMeta>();\n private processes = new Map<string, AgentProcess>();\n private readonly corruptedDir: string;\n private readonly watcher: ProcessWatcher;\n private readonly restartTracker: RestartTracker;\n private readonly acpManager?: AcpConnectionManagerLike;\n private readonly instanceRegistry?: InstanceRegistryAdapter;\n\n constructor(\n private readonly initializer: AgentInitializer,\n private readonly launcher: AgentLauncher,\n private readonly instancesBaseDir: string,\n options?: ManagerOptions,\n ) {\n this.corruptedDir = options?.corruptedDir ?? join(instancesBaseDir, \".corrupted\");\n this.instanceRegistry = options?.instanceRegistry;\n this.watcher = new ProcessWatcher(\n (info) => this.handleProcessExit(info),\n { pollIntervalMs: options?.watcherPollIntervalMs },\n );\n this.restartTracker = new RestartTracker(options?.restartPolicy);\n this.acpManager = options?.acpManager;\n }\n\n /**\n * Scan all workspace directories, load metadata into cache,\n * fix stale running/starting states, and start the process watcher.\n */\n async initialize(): Promise<void> {\n const { valid, corrupted } = await scanInstances(\n this.instancesBaseDir,\n this.instanceRegistry,\n );\n\n this.cache.clear();\n this.processes.clear();\n\n const pendingRestarts: string[] = [];\n\n for (const meta of valid) {\n if (meta.status === \"running\" || meta.status === \"starting\" || meta.status === \"stopping\") {\n const handler = getLaunchModeHandler(meta.launchMode);\n const action = handler.getRecoveryAction(meta.name);\n\n const dir = join(this.instancesBaseDir, meta.name);\n const fixed = await updateInstanceMeta(dir, { status: \"stopped\", pid: undefined });\n this.cache.set(meta.name, fixed);\n logger.info({ name: meta.name, oldStatus: meta.status, launchMode: meta.launchMode, recoveryAction: action.type }, \"Stale status corrected\");\n\n if (action.type === \"restart\") {\n pendingRestarts.push(meta.name);\n }\n } else {\n this.cache.set(meta.name, meta);\n }\n }\n\n for (const name of corrupted) {\n await this.moveToCorrupted(name);\n }\n\n this.watcher.start();\n\n logger.info({\n valid: valid.length,\n corrupted: corrupted.length,\n pendingRestarts: pendingRestarts.length,\n }, \"Agent manager initialized\");\n\n for (const name of pendingRestarts) {\n try {\n await this.startAgent(name);\n logger.info({ name }, \"Recovery restart succeeded\");\n } catch (err) {\n logger.error({ name, error: err }, \"Recovery restart failed\");\n }\n }\n }\n\n /** Create a new agent (delegates to Initializer). */\n async createAgent(\n name: string,\n templateName: string,\n overrides?: Partial<InstanceOverrides>,\n ): Promise<AgentInstanceMeta> {\n const meta = await this.initializer.createInstance(name, templateName, overrides);\n this.cache.set(name, meta);\n return meta;\n }\n\n /** Find existing or create new agent (idempotent). */\n async getOrCreateAgent(\n name: string,\n templateName: string,\n overrides?: Partial<InstanceOverrides>,\n ): Promise<{ meta: AgentInstanceMeta; created: boolean }> {\n const cached = this.cache.get(name);\n if (cached) {\n return { meta: cached, created: false };\n }\n\n const { meta, created } = await this.initializer.findOrCreateInstance(\n name,\n templateName,\n overrides,\n );\n this.cache.set(name, meta);\n return { meta, created };\n }\n\n /**\n * Start an agent — launch the backend process via ACP.\n * Requires the backend to support \"acp\" mode.\n * For acpOwnsProcess backends, ProcessLauncher is skipped.\n * @throws {AgentNotFoundError} if agent is not in cache\n * @throws {AgentAlreadyRunningError} if agent is already running\n * @throws {Error} if backend does not support \"acp\" mode\n */\n async startAgent(name: string): Promise<void> {\n const meta = this.requireAgent(name);\n requireMode(meta.backendType, \"acp\");\n\n if (meta.status === \"running\" || meta.status === \"starting\") {\n throw new AgentAlreadyRunningError(name);\n }\n\n const dir = join(this.instancesBaseDir, name);\n const starting = await updateInstanceMeta(dir, { status: \"starting\" });\n this.cache.set(name, starting);\n\n try {\n const acpOnly = isAcpOnlyBackend(meta.backendType);\n let pid: number | undefined;\n\n if (!acpOnly) {\n const proc = await this.launcher.launch(dir, starting);\n this.processes.set(name, proc);\n pid = proc.pid;\n }\n\n if (this.acpManager) {\n const { command, args } = resolveAcpBackend(meta.backendType, dir, meta.backendConfig);\n const connResult = await this.acpManager.connect(name, {\n command,\n args,\n cwd: dir,\n connectionOptions: { autoApprove: true },\n });\n logger.info({ name, acpOnly }, \"ACP connection established\");\n\n if (acpOnly && \"pid\" in connResult && typeof connResult.pid === \"number\") {\n pid = connResult.pid;\n this.processes.set(name, { pid, workspaceDir: dir, instanceName: name });\n }\n }\n\n const running = await updateInstanceMeta(dir, { status: \"running\", pid });\n this.cache.set(name, running);\n if (pid) {\n this.watcher.watch(name, pid);\n }\n this.restartTracker.recordStart(name);\n logger.info({ name, pid, launchMode: starting.launchMode, acp: true }, \"Agent started\");\n } catch (err) {\n if (this.acpManager?.has(name)) {\n await this.acpManager.disconnect(name).catch(() => {});\n }\n const errored = await updateInstanceMeta(dir, { status: \"error\" });\n this.cache.set(name, errored);\n throw err;\n }\n }\n\n /**\n * Stop an agent — disconnect ACP and terminate the backend process.\n * @throws {AgentNotFoundError} if agent is not in cache\n */\n async stopAgent(name: string): Promise<void> {\n const meta = this.requireAgent(name);\n const dir = join(this.instancesBaseDir, name);\n\n if (meta.status !== \"running\" && meta.status !== \"starting\") {\n logger.warn({ name, status: meta.status }, \"Agent is not running, setting to stopped\");\n const stopped = await updateInstanceMeta(dir, { status: \"stopped\", pid: undefined });\n this.cache.set(name, stopped);\n return;\n }\n\n this.watcher.unwatch(name);\n\n const stopping = await updateInstanceMeta(dir, { status: \"stopping\" });\n this.cache.set(name, stopping);\n\n if (this.acpManager?.has(name)) {\n await this.acpManager.disconnect(name).catch((err) => {\n logger.warn({ name, error: err }, \"Error disconnecting ACP during stop\");\n });\n }\n\n const proc = this.processes.get(name);\n if (proc) {\n await this.launcher.terminate(proc);\n this.processes.delete(name);\n }\n\n const stopped = await updateInstanceMeta(dir, { status: \"stopped\", pid: undefined });\n this.cache.set(name, stopped);\n logger.info({ name }, \"Agent stopped\");\n }\n\n /** Destroy an agent — stop it if running, then remove workspace. */\n async destroyAgent(name: string): Promise<void> {\n const meta = this.cache.get(name);\n if (meta && (meta.status === \"running\" || meta.status === \"starting\")) {\n await this.stopAgent(name);\n }\n\n this.watcher.unwatch(name);\n this.restartTracker.reset(name);\n await this.initializer.destroyInstance(name);\n this.cache.delete(name);\n this.processes.delete(name);\n logger.info({ name }, \"Agent destroyed\");\n }\n\n /** Get agent metadata by name. */\n getAgent(name: string): AgentInstanceMeta | undefined {\n return this.cache.get(name);\n }\n\n /** Get agent status by name. */\n getStatus(name: string): AgentStatus | undefined {\n return this.cache.get(name)?.status;\n }\n\n /** List all known agents. */\n listAgents(): AgentInstanceMeta[] {\n return Array.from(this.cache.values());\n }\n\n /** Get count of managed agents. */\n get size(): number {\n return this.cache.size;\n }\n\n /**\n * Resolve spawn info for an agent without starting it.\n * If the agent doesn't exist but templateName is provided, auto-creates it.\n */\n async resolveAgent(\n name: string,\n templateName?: string,\n overrides?: Partial<InstanceOverrides>,\n ): Promise<ResolveResult> {\n let meta = this.cache.get(name);\n let created = false;\n\n if (!meta && templateName) {\n meta = await this.createAgent(name, templateName, overrides);\n created = true;\n }\n\n if (!meta) {\n throw new AgentNotFoundError(name);\n }\n\n const dir = join(this.instancesBaseDir, name);\n const { command, args } = resolveBackend(meta.backendType, dir, meta.backendConfig);\n\n return {\n workspaceDir: dir,\n command,\n args,\n instanceName: name,\n backendType: meta.backendType,\n created,\n };\n }\n\n /**\n * Open an agent's native TUI/UI (e.g. `cursor <dir>`).\n * Requires the backend to support \"open\" mode.\n * @throws if backend does not support \"open\" mode\n */\n async openAgent(name: string): Promise<{ command: string; args: string[] }> {\n const meta = this.requireAgent(name);\n const dir = join(this.instancesBaseDir, name);\n const resolved = openBackend(meta.backendType, dir);\n return resolved;\n }\n\n /**\n * Register an externally-spawned process with the manager.\n * Sets processOwnership to \"external\" and registers ProcessWatcher monitoring.\n * @throws {AgentNotFoundError} if agent is not in cache\n * @throws {AgentAlreadyAttachedError} if agent already has an attached process\n */\n async attachAgent(\n name: string,\n pid: number,\n attachMetadata?: Record<string, string>,\n ): Promise<AgentInstanceMeta> {\n const meta = this.requireAgent(name);\n\n if (meta.status === \"running\" && meta.pid != null) {\n throw new AgentAlreadyAttachedError(name);\n }\n\n const dir = join(this.instancesBaseDir, name);\n const mergedMetadata = attachMetadata\n ? { ...meta.metadata, ...attachMetadata }\n : meta.metadata;\n const updated = await updateInstanceMeta(dir, {\n status: \"running\",\n pid,\n processOwnership: \"external\",\n metadata: mergedMetadata,\n });\n this.cache.set(name, updated);\n this.processes.set(name, { pid, workspaceDir: dir, instanceName: name });\n this.watcher.watch(name, pid);\n logger.info({ name, pid }, \"External process attached\");\n return updated;\n }\n\n /**\n * Detach an externally-managed process.\n * Clears pid and processOwnership. If cleanup is requested and workspace is ephemeral, destroys the instance.\n * @throws {AgentNotFoundError} if agent is not in cache\n * @throws {AgentNotAttachedError} if agent has no attached process\n */\n async detachAgent(name: string, options?: { cleanup?: boolean }): Promise<DetachResult> {\n const meta = this.requireAgent(name);\n\n if (meta.processOwnership !== \"external\") {\n throw new AgentNotAttachedError(name);\n }\n\n this.watcher.unwatch(name);\n this.processes.delete(name);\n\n const dir = join(this.instancesBaseDir, name);\n const updated = await updateInstanceMeta(dir, {\n status: \"stopped\",\n pid: undefined,\n processOwnership: \"managed\",\n });\n this.cache.set(name, updated);\n logger.info({ name }, \"External process detached\");\n\n let workspaceCleaned = false;\n if (options?.cleanup && meta.workspacePolicy === \"ephemeral\") {\n await this.destroyAgent(name);\n workspaceCleaned = true;\n }\n\n return { ok: true, workspaceCleaned };\n }\n\n /**\n * Send a prompt to an agent and collect the full response.\n * Uses ACP connection if the agent is started with ACP, otherwise falls back to CLI pipe mode.\n */\n async runPrompt(\n name: string,\n prompt: string,\n options?: RunPromptOptions,\n ): Promise<PromptResult> {\n const meta = this.requireAgent(name);\n\n if (this.acpManager?.has(name)) {\n const conn = this.acpManager.getConnection(name);\n const sessionId = this.acpManager.getPrimarySessionId(name);\n if (conn && sessionId) {\n logger.debug({ name, sessionId }, \"Sending prompt via ACP\");\n const result = await conn.prompt(sessionId, prompt);\n return { text: result.text, sessionId };\n }\n }\n\n const dir = join(this.instancesBaseDir, name);\n const communicator = createCommunicator(meta.backendType);\n return communicator.runPrompt(dir, prompt, options);\n }\n\n /**\n * Send a prompt to an agent and stream the response.\n * Uses ACP connection if available, otherwise falls back to communicator.\n */\n streamPrompt(\n name: string,\n prompt: string,\n options?: RunPromptOptions,\n ): AsyncIterable<StreamChunk> {\n const meta = this.requireAgent(name);\n\n if (this.acpManager?.has(name)) {\n const conn = this.acpManager.getConnection(name);\n const sessionId = this.acpManager.getPrimarySessionId(name);\n if (conn && sessionId) {\n logger.debug({ name, sessionId }, \"Streaming prompt via ACP\");\n return this.streamFromAcp(conn, sessionId, prompt);\n }\n }\n\n const dir = join(this.instancesBaseDir, name);\n const communicator = createCommunicator(meta.backendType);\n return communicator.streamPrompt(dir, prompt, options);\n }\n\n private async *streamFromAcp(\n conn: AcpConnectionLike,\n sessionId: string,\n prompt: string,\n ): AsyncIterable<StreamChunk> {\n try {\n for await (const event of conn.streamPrompt(sessionId, prompt)) {\n const record = event as Record<string, unknown>;\n const type = record[\"type\"] as string | undefined;\n\n if (type === \"text\" || type === \"assistant\") {\n const content = (record[\"content\"] as string) ?? (record[\"message\"] as string) ?? \"\";\n yield { type: \"text\", content };\n } else if (type === \"tool_use\") {\n const toolName = record[\"name\"] as string | undefined;\n yield { type: \"tool_use\", content: toolName ? `[Tool: ${toolName}]` : \"\" };\n } else if (type === \"result\") {\n yield { type: \"result\", content: (record[\"result\"] as string) ?? \"\" };\n } else if (type === \"error\") {\n const errMsg = (record[\"error\"] as Record<string, unknown>)?.[\"message\"] as string | undefined;\n yield { type: \"error\", content: errMsg ?? \"Unknown error\" };\n } else if (typeof record[\"content\"] === \"string\") {\n yield { type: \"text\", content: record[\"content\"] };\n }\n }\n } catch (err) {\n yield { type: \"error\", content: err instanceof Error ? err.message : String(err) };\n }\n }\n\n /**\n * Send a message to a running agent via its ACP session.\n * Unlike runPrompt, this requires the agent to be started with ACP.\n * @throws {Error} if agent has no ACP connection\n */\n async promptAgent(\n name: string,\n message: string,\n sessionId?: string,\n ): Promise<PromptResult> {\n this.requireAgent(name);\n\n if (!this.acpManager?.has(name)) {\n throw new Error(`Agent \"${name}\" has no ACP connection. Start it first with \\`agent start\\`.`);\n }\n\n const conn = this.acpManager.getConnection(name);\n if (!conn) {\n throw new Error(`ACP connection for \"${name}\" not found`);\n }\n\n const targetSessionId = sessionId ?? this.acpManager.getPrimarySessionId(name);\n if (!targetSessionId) {\n throw new Error(`No session found for agent \"${name}\"`);\n }\n\n const result = await conn.prompt(targetSessionId, message);\n return { text: result.text, sessionId: targetSessionId };\n }\n\n /** Check if an agent has an active ACP connection. */\n hasAcpConnection(name: string): boolean {\n return this.acpManager?.has(name) ?? false;\n }\n\n /** Shut down the process watcher, ACP connections, and release resources. */\n async dispose(): Promise<void> {\n this.watcher.dispose();\n this.restartTracker.dispose();\n await this.acpManager?.disposeAll();\n }\n\n private async handleProcessExit(info: ProcessExitInfo): Promise<void> {\n const { instanceName, pid } = info;\n const meta = this.cache.get(instanceName);\n if (!meta) return;\n\n if (meta.status === \"stopping\" || meta.status === \"stopped\") {\n return;\n }\n\n const handler = getLaunchModeHandler(meta.launchMode);\n const action = handler.getProcessExitAction(instanceName, meta);\n\n logger.warn({ instanceName, pid, launchMode: meta.launchMode, action: action.type, previousStatus: meta.status }, \"Agent process exited unexpectedly\");\n\n if (this.acpManager?.has(instanceName)) {\n await this.acpManager.disconnect(instanceName).catch(() => {});\n }\n\n const dir = join(this.instancesBaseDir, instanceName);\n const exitedAt = new Date().toISOString();\n const exitStatus: AgentStatus = meta.processOwnership === \"external\" ? \"crashed\" : \"stopped\";\n const stopped = await updateInstanceMeta(dir, {\n status: exitStatus,\n pid: undefined,\n metadata: { ...meta.metadata, exitedAt },\n });\n this.cache.set(instanceName, stopped);\n this.processes.delete(instanceName);\n\n switch (action.type) {\n case \"restart\": {\n const decision = this.restartTracker.shouldRestart(instanceName);\n if (!decision.allowed) {\n const errored = await updateInstanceMeta(dir, { status: \"error\" });\n this.cache.set(instanceName, errored);\n logger.error({ instanceName, attempt: decision.attempt }, \"Restart limit exceeded — marking as error\");\n break;\n }\n\n logger.info({ instanceName, attempt: decision.attempt, delayMs: decision.delayMs }, \"Scheduling crash restart with backoff\");\n\n if (decision.delayMs > 0) {\n await delay(decision.delayMs);\n }\n\n this.restartTracker.recordRestart(instanceName);\n try {\n await this.startAgent(instanceName);\n logger.info({ instanceName, attempt: decision.attempt }, \"Crash restart succeeded\");\n } catch (err) {\n logger.error({ instanceName, attempt: decision.attempt, error: err }, \"Crash restart failed\");\n }\n break;\n }\n case \"destroy\":\n try {\n await this.destroyAgent(instanceName);\n logger.info({ instanceName }, \"One-shot agent destroyed after exit\");\n } catch (err) {\n logger.error({ instanceName, error: err }, \"One-shot auto-destroy failed\");\n }\n break;\n case \"mark-stopped\":\n break;\n }\n }\n\n private requireAgent(name: string): AgentInstanceMeta {\n const meta = this.cache.get(name);\n if (!meta) {\n throw new AgentNotFoundError(name);\n }\n return meta;\n }\n\n private async moveToCorrupted(name: string): Promise<void> {\n try {\n await mkdir(this.corruptedDir, { recursive: true });\n const src = join(this.instancesBaseDir, name);\n const dest = join(this.corruptedDir, `${name}-${Date.now()}`);\n await rename(src, dest);\n logger.warn({ name, dest }, \"Corrupted instance moved\");\n } catch (err) {\n logger.error({ name, error: err }, \"Failed to move corrupted instance\");\n }\n }\n}\n","import type { AgentBackendType, AgentOpenMode, BackendDescriptor } from \"@actant/shared\";\n\nconst registry = new Map<AgentBackendType, BackendDescriptor>();\n\n/**\n * Register a backend descriptor.\n * Call at startup for built-in backends and from external packages (e.g. @actant/pi).\n */\nexport function registerBackend(descriptor: BackendDescriptor): void {\n registry.set(descriptor.type, descriptor);\n}\n\n/**\n * Retrieve the descriptor for a backend type.\n * @throws if the type has not been registered.\n */\nexport function getBackendDescriptor(type: AgentBackendType): BackendDescriptor {\n const desc = registry.get(type);\n if (!desc) {\n throw new Error(\n `Backend \"${type}\" is not registered. ` +\n `Ensure the backend package is installed and registerBackend() was called at startup.`,\n );\n }\n return desc;\n}\n\n/** Check whether a backend supports a specific open mode. */\nexport function supportsMode(type: AgentBackendType, mode: AgentOpenMode): boolean {\n const desc = registry.get(type);\n return desc != null && desc.supportedModes.includes(mode);\n}\n\n/**\n * Assert that a backend supports a mode, throwing a descriptive error if not.\n * Used as a guard in manager methods before executing mode-specific logic.\n */\nexport function requireMode(type: AgentBackendType, mode: AgentOpenMode): void {\n const desc = getBackendDescriptor(type);\n if (!desc.supportedModes.includes(mode)) {\n const supported = desc.supportedModes.join(\", \");\n throw new Error(\n `Backend \"${type}\" does not support \"${mode}\" mode. ` +\n `Supported modes: [${supported}]. ` +\n (mode === \"resolve\"\n ? `Use \\`agent start\\` or \\`agent run\\` instead.`\n : mode === \"open\"\n ? `This backend has no native TUI/UI to open.`\n : `Use \\`agent resolve\\` or \\`agent open\\` instead.`),\n );\n }\n}\n\n/** Get the platform-resolved command string from a PlatformCommand. */\nexport function getPlatformCommand(cmd: { win32: string; default: string }): string {\n return process.platform === \"win32\" ? cmd.win32 : cmd.default;\n}\n\n/**\n * Reset the registry (for testing only).\n * @internal\n */\nexport function _resetRegistry(): void {\n registry.clear();\n}\n","import { registerBackend } from \"./backend-registry\";\n\n/**\n * Register descriptors for all built-in backends.\n * Called once at module load time so the registry is populated before any manager code runs.\n * External backends (e.g. Pi) register themselves via their own packages.\n */\nexport function registerBuiltinBackends(): void {\n registerBackend({\n type: \"cursor\",\n supportedModes: [\"resolve\", \"open\"],\n resolveCommand: { win32: \"cursor.cmd\", default: \"cursor\" },\n openCommand: { win32: \"cursor.cmd\", default: \"cursor\" },\n });\n\n registerBackend({\n type: \"cursor-agent\",\n supportedModes: [\"resolve\", \"open\", \"acp\"],\n resolveCommand: { win32: \"cursor.cmd\", default: \"cursor\" },\n openCommand: { win32: \"cursor.cmd\", default: \"cursor\" },\n });\n\n registerBackend({\n type: \"claude-code\",\n supportedModes: [\"resolve\", \"acp\"],\n resolveCommand: { win32: \"claude-agent-acp.cmd\", default: \"claude-agent-acp\" },\n });\n\n registerBackend({\n type: \"custom\",\n supportedModes: [\"resolve\"],\n });\n}\n\nregisterBuiltinBackends();\n","import type { AgentBackendType } from \"@actant/shared\";\nimport {\n getBackendDescriptor,\n supportsMode,\n requireMode,\n getPlatformCommand,\n} from \"./backend-registry\";\nimport \"./builtin-backends\";\n\nexport type { BackendDescriptor, AgentOpenMode, PlatformCommand } from \"@actant/shared\";\n\nexport interface ResolvedBackend {\n command: string;\n args: string[];\n}\n\n/**\n * Whether a backend type supports the ACP protocol for Actant-managed control.\n * Replaces the old hardcoded `isAcpBackend()`.\n */\nexport function isAcpBackend(backendType: AgentBackendType): boolean {\n return supportsMode(backendType, \"acp\");\n}\n\n/**\n * Whether a backend's ACP connection owns the process lifecycle.\n * When true, ProcessLauncher.launch() is skipped — only AcpConnectionManager spawns the process.\n */\nexport function isAcpOnlyBackend(backendType: AgentBackendType): boolean {\n const desc = getBackendDescriptor(backendType);\n return supportsMode(backendType, \"acp\") && desc.acpOwnsProcess === true;\n}\n\n/**\n * Build launch arguments for a backend.\n * - Backends with `open` mode use `[workspaceDir]` to open the IDE at that folder.\n * - ACP backends need no args (workspace is passed via ACP session).\n * - Custom backends use `args` from backendConfig if provided.\n */\nfunction buildArgs(\n backendType: AgentBackendType,\n workspaceDir: string,\n backendConfig?: Record<string, unknown>,\n): string[] {\n const desc = getBackendDescriptor(backendType);\n\n if (backendType === \"custom\") {\n const configArgs = backendConfig?.args;\n if (Array.isArray(configArgs)) return configArgs.map(String);\n return [workspaceDir];\n }\n\n if (desc.supportedModes.includes(\"open\") && !desc.supportedModes.includes(\"acp\")) {\n return [workspaceDir];\n }\n\n if (desc.supportedModes.includes(\"acp\")) {\n return [];\n }\n\n return [workspaceDir];\n}\n\n/**\n * Resolve the executable command and arguments for spawning a backend (resolve mode).\n * @throws if the backend does not support \"resolve\" mode.\n */\nexport function resolveBackend(\n backendType: AgentBackendType,\n workspaceDir: string,\n backendConfig?: Record<string, unknown>,\n): ResolvedBackend {\n requireMode(backendType, \"resolve\");\n\n const desc = getBackendDescriptor(backendType);\n const explicitPath = backendConfig?.executablePath;\n const command = typeof explicitPath === \"string\" && explicitPath.length > 0\n ? explicitPath\n : desc.resolveCommand\n ? getPlatformCommand(desc.resolveCommand)\n : (() => { throw new Error(`Backend \"${backendType}\" has no resolveCommand configured.`); })();\n\n return {\n command,\n args: buildArgs(backendType, workspaceDir, backendConfig),\n };\n}\n\n/**\n * Resolve the open command for directly launching a backend's native TUI/UI.\n * @throws if the backend does not support \"open\" mode.\n */\nexport function openBackend(\n backendType: AgentBackendType,\n workspaceDir: string,\n): ResolvedBackend {\n requireMode(backendType, \"open\");\n\n const desc = getBackendDescriptor(backendType);\n if (!desc.openCommand) {\n throw new Error(`Backend \"${backendType}\" has no openCommand configured.`);\n }\n\n return {\n command: getPlatformCommand(desc.openCommand),\n args: [workspaceDir],\n };\n}\n\n/**\n * Resolve the ACP spawn command for a backend.\n * For ACP backends, this returns the command used by AcpConnectionManager to spawn the agent process.\n * Checks acpCommand first, then falls back to resolveCommand.\n * @throws if the backend does not support \"acp\" mode.\n */\nexport function resolveAcpBackend(\n backendType: AgentBackendType,\n workspaceDir: string,\n backendConfig?: Record<string, unknown>,\n): ResolvedBackend {\n requireMode(backendType, \"acp\");\n\n const desc = getBackendDescriptor(backendType);\n\n if (desc.acpResolver) {\n return desc.acpResolver(workspaceDir, backendConfig);\n }\n\n const explicitPath = backendConfig?.executablePath;\n const commandSource = desc.acpCommand ?? desc.resolveCommand;\n const command = typeof explicitPath === \"string\" && explicitPath.length > 0\n ? explicitPath\n : commandSource\n ? getPlatformCommand(commandSource)\n : (() => { throw new Error(`Backend \"${backendType}\" has no command configured for ACP spawn.`); })();\n\n return {\n command,\n args: buildArgs(backendType, workspaceDir, backendConfig),\n };\n}\n","import { createLogger } from \"@actant/shared\";\nimport { isProcessAlive } from \"./process-utils\";\n\nconst logger = createLogger(\"process-watcher\");\n\nexport interface ProcessExitInfo {\n instanceName: string;\n pid: number;\n}\n\nexport type ProcessExitHandler = (info: ProcessExitInfo) => void | Promise<void>;\n\nexport interface ProcessWatcherOptions {\n /** Milliseconds between alive-checks. Default: 5000 */\n pollIntervalMs?: number;\n}\n\nconst DEFAULT_POLL_INTERVAL = 5_000;\n\ninterface WatchEntry {\n pid: number;\n}\n\n/**\n * Periodically polls tracked PIDs and fires a callback\n * when a watched process is no longer alive.\n *\n * Usage:\n * const watcher = new ProcessWatcher(onExit, { pollIntervalMs: 3000 });\n * watcher.start();\n * watcher.watch(\"my-agent\", 12345);\n * // ... later ...\n * watcher.unwatch(\"my-agent\"); // e.g. before intentional stop\n * watcher.dispose();\n */\nexport class ProcessWatcher {\n private readonly watches = new Map<string, WatchEntry>();\n private timer: ReturnType<typeof setInterval> | null = null;\n private polling = false;\n private readonly pollIntervalMs: number;\n\n constructor(\n private readonly onProcessExit: ProcessExitHandler,\n options?: ProcessWatcherOptions,\n ) {\n this.pollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL;\n }\n\n watch(instanceName: string, pid: number): void {\n this.watches.set(instanceName, { pid });\n logger.debug({ instanceName, pid }, \"Watching process\");\n }\n\n unwatch(instanceName: string): boolean {\n const removed = this.watches.delete(instanceName);\n if (removed) {\n logger.debug({ instanceName }, \"Unwatched process\");\n }\n return removed;\n }\n\n isWatching(instanceName: string): boolean {\n return this.watches.has(instanceName);\n }\n\n get watchCount(): number {\n return this.watches.size;\n }\n\n start(): void {\n if (this.timer) return;\n this.timer = setInterval(() => {\n void this.poll();\n }, this.pollIntervalMs);\n logger.info({ pollIntervalMs: this.pollIntervalMs }, \"ProcessWatcher started\");\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n logger.info(\"ProcessWatcher stopped\");\n }\n }\n\n dispose(): void {\n this.stop();\n this.watches.clear();\n }\n\n get isRunning(): boolean {\n return this.timer !== null;\n }\n\n private async poll(): Promise<void> {\n if (this.polling) return;\n this.polling = true;\n\n try {\n const exited: ProcessExitInfo[] = [];\n\n for (const [instanceName, entry] of this.watches) {\n if (!isProcessAlive(entry.pid)) {\n exited.push({ instanceName, pid: entry.pid });\n }\n }\n\n for (const info of exited) {\n this.watches.delete(info.instanceName);\n logger.info(info, \"Process exited — removed from watch list\");\n\n try {\n await this.onProcessExit(info);\n } catch (err) {\n logger.error({ ...info, error: err }, \"Error in process exit handler\");\n }\n }\n } finally {\n this.polling = false;\n }\n }\n}\n","/**\n * Check whether a process with the given PID is still alive.\n * Uses `kill(pid, 0)` which sends no signal but checks existence.\n */\nexport function isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err: unknown) {\n if (isNodeError(err) && err.code === \"ESRCH\") {\n return false;\n }\n if (isNodeError(err) && err.code === \"EPERM\") {\n return true;\n }\n return false;\n }\n}\n\n/**\n * Send a signal to a process, ignoring ESRCH (already dead).\n * Returns true if the signal was delivered, false if the process was already gone.\n */\nexport function sendSignal(pid: number, signal: NodeJS.Signals): boolean {\n try {\n process.kill(pid, signal);\n return true;\n } catch (err: unknown) {\n if (isNodeError(err) && err.code === \"ESRCH\") {\n return false;\n }\n throw err;\n }\n}\n\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isNodeError(err: unknown): err is NodeJS.ErrnoException {\n return err instanceof Error && \"code\" in err;\n}\n","import type { AgentInstanceMeta, LaunchMode } from \"@actant/shared\";\nimport { createLogger } from \"@actant/shared\";\n\nconst logger = createLogger(\"launch-mode-handler\");\n\n/**\n * What the manager should do when a watched process exits.\n * - \"mark-stopped\": set status to stopped, clear pid (default for most modes)\n * - \"restart\": attempt to relaunch the process (acp-service with restart policy)\n * - \"destroy\": mark stopped then destroy the instance (one-shot with autoDestroy)\n */\nexport type ProcessExitAction =\n | { type: \"mark-stopped\" }\n | { type: \"restart\" }\n | { type: \"destroy\" };\n\n/**\n * What the manager should do for a stale running/starting instance on daemon restart.\n * - \"mark-stopped\": reset status to stopped (default)\n * - \"restart\": attempt to relaunch (acp-service recovery)\n */\nexport type RecoveryAction =\n | { type: \"mark-stopped\" }\n | { type: \"restart\" };\n\nexport interface LaunchModeHandler {\n readonly mode: LaunchMode;\n getProcessExitAction(instanceName: string, meta?: AgentInstanceMeta): ProcessExitAction;\n getRecoveryAction(instanceName: string): RecoveryAction;\n}\n\nclass DirectModeHandler implements LaunchModeHandler {\n readonly mode = \"direct\" as const;\n\n getProcessExitAction(_instanceName: string): ProcessExitAction {\n return { type: \"mark-stopped\" };\n }\n\n getRecoveryAction(_instanceName: string): RecoveryAction {\n return { type: \"mark-stopped\" };\n }\n}\n\nclass AcpBackgroundModeHandler implements LaunchModeHandler {\n readonly mode = \"acp-background\" as const;\n\n getProcessExitAction(_instanceName: string): ProcessExitAction {\n return { type: \"mark-stopped\" };\n }\n\n getRecoveryAction(_instanceName: string): RecoveryAction {\n return { type: \"mark-stopped\" };\n }\n}\n\nclass AcpServiceModeHandler implements LaunchModeHandler {\n readonly mode = \"acp-service\" as const;\n\n getProcessExitAction(instanceName: string): ProcessExitAction {\n logger.info({ instanceName }, \"acp-service process exited — restart policy will be checked\");\n return { type: \"restart\" };\n }\n\n getRecoveryAction(instanceName: string): RecoveryAction {\n logger.info({ instanceName }, \"acp-service stale instance — will attempt recovery restart\");\n return { type: \"restart\" };\n }\n}\n\nclass OneShotModeHandler implements LaunchModeHandler {\n readonly mode = \"one-shot\" as const;\n\n getProcessExitAction(_instanceName: string, meta?: AgentInstanceMeta): ProcessExitAction {\n if (meta?.metadata?.autoDestroy === \"true\") {\n return { type: \"destroy\" };\n }\n return { type: \"mark-stopped\" };\n }\n\n getRecoveryAction(_instanceName: string): RecoveryAction {\n return { type: \"mark-stopped\" };\n }\n}\n\nconst handlers: Record<LaunchMode, LaunchModeHandler> = {\n \"direct\": new DirectModeHandler(),\n \"acp-background\": new AcpBackgroundModeHandler(),\n \"acp-service\": new AcpServiceModeHandler(),\n \"one-shot\": new OneShotModeHandler(),\n};\n\nexport function getLaunchModeHandler(mode: LaunchMode): LaunchModeHandler {\n return handlers[mode];\n}\n","import { createLogger } from \"@actant/shared\";\n\nconst logger = createLogger(\"restart-tracker\");\n\nexport interface RestartPolicy {\n /** Maximum number of restarts before giving up. Default: 5 */\n maxRestarts: number;\n /** Base delay for exponential backoff (ms). Default: 1000 */\n backoffBaseMs: number;\n /** Maximum backoff delay cap (ms). Default: 60000 */\n backoffMaxMs: number;\n /** Reset restart counter after this many ms of stable running. Default: 300000 (5 min) */\n resetAfterMs: number;\n}\n\nexport const DEFAULT_RESTART_POLICY: RestartPolicy = {\n maxRestarts: 5,\n backoffBaseMs: 1_000,\n backoffMaxMs: 60_000,\n resetAfterMs: 300_000,\n};\n\nexport interface RestartDecision {\n allowed: boolean;\n delayMs: number;\n attempt: number;\n}\n\ninterface RestartState {\n count: number;\n lastRestartAt: number;\n lastStartAt: number;\n}\n\n/**\n * Tracks restart attempts per instance and enforces exponential backoff.\n *\n * Usage:\n * const tracker = new RestartTracker();\n * // Before restarting:\n * const decision = tracker.shouldRestart(\"my-agent\");\n * if (decision.allowed) {\n * await delay(decision.delayMs);\n * tracker.recordRestart(\"my-agent\");\n * // ... do restart ...\n * }\n * // After agent successfully starts:\n * tracker.recordStart(\"my-agent\");\n */\nexport class RestartTracker {\n private states = new Map<string, RestartState>();\n private readonly policy: RestartPolicy;\n\n constructor(policy?: Partial<RestartPolicy>) {\n this.policy = { ...DEFAULT_RESTART_POLICY, ...policy };\n }\n\n shouldRestart(instanceName: string): RestartDecision {\n const state = this.getOrCreate(instanceName);\n\n if (state.lastStartAt > 0) {\n const stableMs = Date.now() - state.lastStartAt;\n if (stableMs >= this.policy.resetAfterMs) {\n logger.info({ instanceName, stableMs, resetAfterMs: this.policy.resetAfterMs }, \"Resetting restart counter — agent was stable\");\n state.count = 0;\n }\n }\n\n if (state.count >= this.policy.maxRestarts) {\n logger.warn({ instanceName, count: state.count, maxRestarts: this.policy.maxRestarts }, \"Restart limit exceeded\");\n return { allowed: false, delayMs: 0, attempt: state.count };\n }\n\n const delayMs = Math.min(\n this.policy.backoffBaseMs * Math.pow(2, state.count),\n this.policy.backoffMaxMs,\n );\n\n return { allowed: true, delayMs, attempt: state.count + 1 };\n }\n\n recordRestart(instanceName: string): void {\n const state = this.getOrCreate(instanceName);\n state.count++;\n state.lastRestartAt = Date.now();\n logger.debug({ instanceName, count: state.count }, \"Restart recorded\");\n }\n\n recordStart(instanceName: string): void {\n const state = this.getOrCreate(instanceName);\n state.lastStartAt = Date.now();\n }\n\n reset(instanceName: string): void {\n this.states.delete(instanceName);\n }\n\n getRestartCount(instanceName: string): number {\n return this.states.get(instanceName)?.count ?? 0;\n }\n\n dispose(): void {\n this.states.clear();\n }\n\n private getOrCreate(instanceName: string): RestartState {\n let state = this.states.get(instanceName);\n if (!state) {\n state = { count: 0, lastRestartAt: 0, lastStartAt: 0 };\n this.states.set(instanceName, state);\n }\n return state;\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { createLogger } from \"@actant/shared\";\nimport type {\n AgentCommunicator,\n PromptResult,\n RunPromptOptions,\n StreamChunk,\n} from \"./agent-communicator\";\n\nconst logger = createLogger(\"claude-code-communicator\");\n\nconst DEFAULT_TIMEOUT_MS = 300_000; // 5 minutes\n\n/**\n * Communicates with an agent via the `claude` CLI in print mode.\n * Uses `claude -p --output-format stream-json \"prompt\"` for streaming\n * and `claude -p --output-format json \"prompt\"` for one-shot.\n */\nexport class ClaudeCodeCommunicator implements AgentCommunicator {\n private readonly executable: string;\n\n constructor(executable = \"claude\") {\n this.executable = executable;\n }\n\n async runPrompt(\n workspaceDir: string,\n prompt: string,\n options?: RunPromptOptions,\n ): Promise<PromptResult> {\n const args = this.buildArgs(prompt, options, \"json\");\n\n logger.debug({ workspaceDir, args }, \"Running claude-code prompt\");\n\n return new Promise<PromptResult>((resolve, reject) => {\n const child = spawn(this.executable, args, {\n cwd: workspaceDir,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env },\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.on(\"data\", (chunk: Buffer) => {\n stdout += chunk.toString();\n });\n\n child.stderr.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n\n const timeout = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const timer = setTimeout(() => {\n child.kill(\"SIGTERM\");\n reject(new Error(`Claude-code prompt timed out after ${timeout}ms`));\n }, timeout);\n\n child.on(\"close\", (code) => {\n clearTimeout(timer);\n\n if (code !== 0) {\n logger.warn({ code, stderr: stderr.slice(0, 500) }, \"claude-code exited with error\");\n reject(new Error(`claude-code exited with code ${code}: ${stderr.slice(0, 500)}`));\n return;\n }\n\n try {\n const parsed = JSON.parse(stdout) as Record<string, unknown>;\n const result = parsed[\"result\"] as string | undefined;\n const sessionId = parsed[\"session_id\"] as string | undefined;\n const subtype = parsed[\"subtype\"] as string | undefined;\n\n if (subtype && subtype !== \"success\") {\n logger.warn({ subtype }, \"claude-code returned non-success subtype\");\n }\n\n let text: string;\n if (result && result.length > 0) {\n text = result;\n } else if (subtype === \"error_max_turns\") {\n text = \"[max turns reached — no final result text]\";\n } else {\n text = stdout.trim();\n }\n\n resolve({ text, sessionId });\n } catch {\n resolve({ text: stdout.trim() });\n }\n });\n\n child.on(\"error\", (err) => {\n clearTimeout(timer);\n reject(new Error(`Failed to spawn claude-code: ${err.message}`));\n });\n\n child.stdin.end();\n });\n }\n\n async *streamPrompt(\n workspaceDir: string,\n prompt: string,\n options?: RunPromptOptions,\n ): AsyncIterable<StreamChunk> {\n const args = this.buildArgs(prompt, options, \"stream-json\");\n\n logger.debug({ workspaceDir, args }, \"Streaming claude-code prompt\");\n\n const child = spawn(this.executable, args, {\n cwd: workspaceDir,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env },\n });\n\n const timeout = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const timer = setTimeout(() => {\n child.kill(\"SIGTERM\");\n }, timeout);\n\n child.stdin.end();\n\n let buffer = \"\";\n\n try {\n for await (const chunk of child.stdout) {\n buffer += (chunk as Buffer).toString();\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n try {\n const event = JSON.parse(trimmed) as Record<string, unknown>;\n const streamChunk = parseStreamEvent(event);\n if (streamChunk) {\n yield streamChunk;\n }\n } catch {\n yield { type: \"text\", content: trimmed };\n }\n }\n }\n\n if (buffer.trim()) {\n try {\n const event = JSON.parse(buffer.trim()) as Record<string, unknown>;\n const streamChunk = parseStreamEvent(event);\n if (streamChunk) {\n yield streamChunk;\n }\n } catch {\n yield { type: \"text\", content: buffer.trim() };\n }\n }\n } finally {\n clearTimeout(timer);\n if (child.exitCode === null) {\n child.kill(\"SIGTERM\");\n }\n }\n }\n\n private buildArgs(\n prompt: string,\n options: RunPromptOptions | undefined,\n outputFormat: \"json\" | \"stream-json\",\n ): string[] {\n const args = [\"-p\", \"--output-format\", outputFormat];\n\n if (options?.systemPromptFile) {\n args.push(\"--system-prompt-file\", options.systemPromptFile);\n }\n\n if (options?.appendSystemPrompt) {\n args.push(\"--append-system-prompt\", options.appendSystemPrompt);\n }\n\n if (options?.sessionId) {\n args.push(\"--resume\", options.sessionId);\n }\n\n if (options?.maxTurns !== undefined) {\n args.push(\"--max-turns\", String(options.maxTurns));\n }\n\n if (options?.model) {\n args.push(\"--model\", options.model);\n }\n\n args.push(prompt);\n return args;\n }\n}\n\nfunction parseStreamEvent(event: Record<string, unknown>): StreamChunk | null {\n const type = event[\"type\"] as string | undefined;\n\n if (type === \"assistant\" || type === \"text\") {\n const message = event[\"message\"] as string | undefined;\n const content = message ?? (event[\"content\"] as string | undefined) ?? \"\";\n return { type: \"text\", content };\n }\n\n if (type === \"tool_use\") {\n const name = event[\"name\"] as string | undefined;\n const input = event[\"input\"] as unknown;\n return { type: \"tool_use\", content: name ? `[Tool: ${name}] ${JSON.stringify(input)}` : \"\" };\n }\n\n if (type === \"result\") {\n const result = event[\"result\"] as string | undefined;\n return { type: \"result\", content: result ?? \"\" };\n }\n\n if (type === \"error\") {\n const error = event[\"error\"] as { message?: string } | undefined;\n return { type: \"error\", content: error?.message ?? \"Unknown error\" };\n }\n\n // For unrecognized events, extract text content if available\n if (typeof event[\"content\"] === \"string\") {\n return { type: \"text\", content: event[\"content\"] };\n }\n\n return null;\n}\n","import { createLogger } from \"@actant/shared\";\nimport type {\n AgentCommunicator,\n PromptResult,\n RunPromptOptions,\n StreamChunk,\n} from \"./agent-communicator\";\n\nconst logger = createLogger(\"cursor-communicator\");\n\n/**\n * Communicator stub for Cursor backend.\n * Cursor CLI does not yet support a pipe mode for programmatic communication.\n * This implementation provides a clear error until Cursor adds this capability.\n */\nexport class CursorCommunicator implements AgentCommunicator {\n async runPrompt(\n _workspaceDir: string,\n _prompt: string,\n _options?: RunPromptOptions,\n ): Promise<PromptResult> {\n logger.warn(\"Cursor backend does not yet support programmatic communication\");\n throw new Error(\n \"Cursor backend does not support programmatic communication yet. \" +\n \"Use claude-code backend for agent.run / agent.chat functionality.\",\n );\n }\n\n // eslint-disable-next-line require-yield\n async *streamPrompt(\n _workspaceDir: string,\n _prompt: string,\n _options?: RunPromptOptions,\n ): AsyncIterable<StreamChunk> {\n throw new Error(\n \"Cursor backend does not support programmatic communication yet. \" +\n \"Use claude-code backend for agent.run / agent.chat functionality.\",\n );\n }\n}\n","import type { AgentBackendType } from \"@actant/shared\";\nimport type { AgentCommunicator } from \"./agent-communicator\";\nimport { ClaudeCodeCommunicator } from \"./claude-code-communicator\";\nimport { CursorCommunicator } from \"./cursor-communicator\";\n\nconst registry = new Map<AgentBackendType, (backendConfig?: Record<string, unknown>) => AgentCommunicator>();\n\n/**\n * Register a communicator factory for a backend type.\n * External packages (e.g. @actant/pi) call this at startup.\n * The factory receives the template's `backend.config` so it can extract\n * provider-specific settings (provider, model, apiKey, etc.).\n */\nexport function registerCommunicator(\n backendType: AgentBackendType,\n factory: (backendConfig?: Record<string, unknown>) => AgentCommunicator,\n): void {\n registry.set(backendType, factory);\n}\n\nexport function createCommunicator(\n backendType: AgentBackendType,\n backendConfig?: Record<string, unknown>,\n): AgentCommunicator {\n const registered = registry.get(backendType);\n if (registered) return registered(backendConfig);\n\n switch (backendType) {\n case \"claude-code\":\n return new ClaudeCodeCommunicator();\n case \"cursor\":\n case \"cursor-agent\":\n return new CursorCommunicator();\n case \"custom\":\n throw new Error(\n \"Custom backend communicator not yet supported. \" +\n \"Implement AgentCommunicator for your backend.\",\n );\n case \"pi\":\n throw new Error(\n \"Pi backend communicator not registered. \" +\n \"Ensure @actant/pi is installed and initialized.\",\n );\n }\n}\n","import type { AgentInstanceMeta } from \"@actant/shared\";\nimport type { AgentLauncher, AgentProcess } from \"./agent-launcher\";\n\nlet nextPid = 10000;\n\n/**\n * Mock launcher for testing — simulates launching a process\n * by returning a fake PID without actually spawning anything.\n */\nexport class MockLauncher implements AgentLauncher {\n readonly launched: AgentProcess[] = [];\n readonly terminated: AgentProcess[] = [];\n\n async launch(workspaceDir: string, meta: AgentInstanceMeta): Promise<AgentProcess> {\n const process: AgentProcess = {\n pid: nextPid++,\n workspaceDir,\n instanceName: meta.name,\n };\n this.launched.push(process);\n return process;\n }\n\n async terminate(process: AgentProcess): Promise<void> {\n this.terminated.push(process);\n }\n}\n","import { spawn } from \"node:child_process\";\nimport type { AgentInstanceMeta } from \"@actant/shared\";\nimport { AgentLaunchError, createLogger } from \"@actant/shared\";\nimport type { AgentLauncher, AgentProcess } from \"./agent-launcher\";\nimport { resolveBackend, isAcpBackend } from \"./backend-resolver\";\nimport { isProcessAlive, sendSignal, delay } from \"./process-utils\";\nimport { ProcessLogWriter, type ProcessLogWriterOptions } from \"./process-log-writer\";\n\nconst logger = createLogger(\"process-launcher\");\n\nexport interface ProcessLauncherOptions {\n /** Milliseconds to wait for graceful shutdown before SIGKILL. Default: 5000 */\n terminateTimeoutMs?: number;\n /** Milliseconds to wait after spawn to verify the process is still alive. Default: 500 */\n spawnVerifyDelayMs?: number;\n /** Enable process log capture for non-ACP backends. Default: true. */\n enableProcessLogs?: boolean;\n /** Options for process log file writer. */\n logWriterOptions?: ProcessLogWriterOptions;\n}\n\nconst DEFAULT_TERMINATE_TIMEOUT = 5_000;\nconst DEFAULT_SPAWN_VERIFY_DELAY = 500;\n\n/**\n * Real launcher that spawns IDE/CLI backend processes.\n *\n * Lifecycle:\n * launch() → spawn detached child → verify alive → return AgentProcess\n * terminate() → SIGTERM → wait → SIGKILL if still alive\n */\nexport class ProcessLauncher implements AgentLauncher {\n private readonly terminateTimeoutMs: number;\n private readonly spawnVerifyDelayMs: number;\n private readonly enableProcessLogs: boolean;\n private readonly logWriterOptions?: ProcessLogWriterOptions;\n private readonly logWriters = new Map<string, ProcessLogWriter>();\n\n constructor(options?: ProcessLauncherOptions) {\n this.terminateTimeoutMs = options?.terminateTimeoutMs ?? DEFAULT_TERMINATE_TIMEOUT;\n this.spawnVerifyDelayMs = options?.spawnVerifyDelayMs ?? DEFAULT_SPAWN_VERIFY_DELAY;\n this.enableProcessLogs = options?.enableProcessLogs ?? true;\n this.logWriterOptions = options?.logWriterOptions;\n }\n\n async launch(workspaceDir: string, meta: AgentInstanceMeta): Promise<AgentProcess> {\n const { command, args } = resolveBackend(\n meta.backendType,\n workspaceDir,\n meta.backendConfig,\n );\n\n const useAcp = isAcpBackend(meta.backendType);\n\n logger.info({ name: meta.name, command, args, backendType: meta.backendType, acp: useAcp }, \"Spawning backend process\");\n\n const captureNonAcpLogs = !useAcp && this.enableProcessLogs;\n\n let stdio: import(\"node:child_process\").StdioOptions;\n if (useAcp) {\n stdio = [\"pipe\", \"pipe\", \"pipe\"];\n } else if (captureNonAcpLogs) {\n stdio = [\"ignore\", \"pipe\", \"pipe\"];\n } else {\n stdio = \"ignore\";\n }\n\n const child = spawn(command, args, {\n cwd: workspaceDir,\n detached: !useAcp,\n stdio,\n });\n\n const spawnResult = await new Promise<{ pid: number } | { error: Error }>((resolve) => {\n child.on(\"error\", (err) => {\n resolve({ error: err });\n });\n\n if (child.pid != null) {\n resolve({ pid: child.pid });\n } else {\n child.once(\"spawn\", () => {\n if (child.pid == null) {\n resolve({ error: new Error(\"spawn event fired but pid is null\") });\n return;\n }\n resolve({ pid: child.pid });\n });\n }\n });\n\n if (\"error\" in spawnResult) {\n throw new AgentLaunchError(meta.name, spawnResult.error);\n }\n\n const pid = spawnResult.pid;\n\n if (!useAcp) {\n child.unref();\n }\n\n let earlyExit = false;\n child.once(\"exit\", () => { earlyExit = true; });\n\n child.on(\"error\", (err) => {\n logger.error({ name: meta.name, pid, error: err }, \"Backend process error after spawn\");\n });\n\n if (this.spawnVerifyDelayMs > 0) {\n await delay(this.spawnVerifyDelayMs);\n\n if (earlyExit || !isProcessAlive(pid)) {\n throw new AgentLaunchError(\n meta.name,\n new Error(`Process exited immediately after spawn (pid=${pid}, command=${command})`),\n );\n }\n }\n\n logger.info({ name: meta.name, pid, command, acp: useAcp }, \"Backend process spawned\");\n\n if (captureNonAcpLogs && child.stdout && child.stderr) {\n const logWriter = new ProcessLogWriter(workspaceDir, this.logWriterOptions);\n try {\n await logWriter.initialize();\n logWriter.attach(child.stdout, child.stderr);\n this.logWriters.set(meta.name, logWriter);\n logger.debug({ name: meta.name }, \"Process log capture enabled\");\n } catch (err) {\n logger.warn({ name: meta.name, error: err }, \"Failed to initialize log writer, continuing without log capture\");\n }\n }\n\n const result: AgentProcess = {\n pid,\n workspaceDir,\n instanceName: meta.name,\n };\n\n if (useAcp && child.stdin && child.stdout && child.stderr) {\n result.stdio = {\n stdin: child.stdin,\n stdout: child.stdout,\n stderr: child.stderr,\n };\n }\n\n return result;\n }\n\n getLogWriter(instanceName: string): ProcessLogWriter | undefined {\n return this.logWriters.get(instanceName);\n }\n\n async terminate(agentProcess: AgentProcess): Promise<void> {\n const { pid, instanceName } = agentProcess;\n\n const logWriter = this.logWriters.get(instanceName);\n if (logWriter) {\n await logWriter.close().catch(() => {});\n this.logWriters.delete(instanceName);\n }\n\n if (!isProcessAlive(pid)) {\n logger.info({ instanceName, pid }, \"Process already exited\");\n return;\n }\n\n logger.info({ instanceName, pid }, \"Sending SIGTERM\");\n sendSignal(pid, \"SIGTERM\");\n\n const deadline = Date.now() + this.terminateTimeoutMs;\n const pollInterval = 200;\n\n while (Date.now() < deadline) {\n await delay(pollInterval);\n if (!isProcessAlive(pid)) {\n logger.info({ instanceName, pid }, \"Process terminated gracefully\");\n return;\n }\n }\n\n logger.warn({ instanceName, pid }, \"Process did not exit after SIGTERM, sending SIGKILL\");\n sendSignal(pid, \"SIGKILL\");\n await delay(500);\n\n if (isProcessAlive(pid)) {\n logger.error({ instanceName, pid }, \"Process still alive after SIGKILL\");\n } else {\n logger.info({ instanceName, pid }, \"Process killed with SIGKILL\");\n }\n }\n}\n","import { createWriteStream, type WriteStream } from \"node:fs\";\nimport { mkdir, rename, stat, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport { createLogger } from \"@actant/shared\";\n\nconst logger = createLogger(\"process-log-writer\");\n\nconst DEFAULT_MAX_SIZE_BYTES = 10 * 1024 * 1024; // 10 MB\nconst DEFAULT_MAX_FILES = 3;\n\nexport interface ProcessLogWriterOptions {\n /** Max file size in bytes before rotation. Default: 10 MB. */\n maxSizeBytes?: number;\n /** Number of rotated files to keep. Default: 3. */\n maxFiles?: number;\n}\n\n/**\n * Captures stdout/stderr from a child process into log files within\n * {instanceDir}/logs/. Supports size-based log rotation.\n */\nexport class ProcessLogWriter {\n private readonly logsDir: string;\n private readonly maxSize: number;\n private readonly maxFiles: number;\n private stdoutStream: WriteStream | null = null;\n private stderrStream: WriteStream | null = null;\n private stdoutBytes = 0;\n private stderrBytes = 0;\n private closed = false;\n\n constructor(\n instanceDir: string,\n options?: ProcessLogWriterOptions,\n ) {\n this.logsDir = join(instanceDir, \"logs\");\n this.maxSize = options?.maxSizeBytes ?? DEFAULT_MAX_SIZE_BYTES;\n this.maxFiles = options?.maxFiles ?? DEFAULT_MAX_FILES;\n }\n\n /**\n * Initialize the log directory and open write streams.\n * Call this before piping process streams.\n */\n async initialize(): Promise<void> {\n await mkdir(this.logsDir, { recursive: true });\n this.stdoutStream = createWriteStream(join(this.logsDir, \"stdout.log\"), { flags: \"a\" });\n this.stderrStream = createWriteStream(join(this.logsDir, \"stderr.log\"), { flags: \"a\" });\n\n try {\n const stdoutStat = await stat(join(this.logsDir, \"stdout.log\"));\n this.stdoutBytes = stdoutStat.size;\n } catch { this.stdoutBytes = 0; }\n\n try {\n const stderrStat = await stat(join(this.logsDir, \"stderr.log\"));\n this.stderrBytes = stderrStat.size;\n } catch { this.stderrBytes = 0; }\n\n logger.debug({ logsDir: this.logsDir }, \"Log writer initialized\");\n }\n\n /**\n * Attach to readable streams from a spawned process.\n */\n attach(stdout: Readable | null, stderr: Readable | null): void {\n if (stdout && this.stdoutStream) {\n stdout.on(\"data\", (chunk: Buffer) => {\n if (this.closed || !this.stdoutStream) return;\n this.stdoutStream.write(chunk);\n this.stdoutBytes += chunk.length;\n if (this.stdoutBytes >= this.maxSize) {\n this.rotateFile(\"stdout.log\").catch(() => {});\n }\n });\n }\n\n if (stderr && this.stderrStream) {\n stderr.on(\"data\", (chunk: Buffer) => {\n if (this.closed || !this.stderrStream) return;\n this.stderrStream.write(chunk);\n this.stderrBytes += chunk.length;\n if (this.stderrBytes >= this.maxSize) {\n this.rotateFile(\"stderr.log\").catch(() => {});\n }\n });\n }\n }\n\n /**\n * Close all write streams gracefully.\n */\n async close(): Promise<void> {\n this.closed = true;\n await Promise.all([\n this.closeStream(this.stdoutStream),\n this.closeStream(this.stderrStream),\n ]);\n this.stdoutStream = null;\n this.stderrStream = null;\n }\n\n /**\n * Read the last N lines from a log file (stdout or stderr).\n */\n async readTail(stream: \"stdout\" | \"stderr\", lines: number): Promise<string[]> {\n const filePath = join(this.logsDir, `${stream}.log`);\n try {\n const content = await readFile(filePath, \"utf-8\");\n const allLines = content.split(\"\\n\").filter(Boolean);\n return allLines.slice(-lines);\n } catch {\n return [];\n }\n }\n\n get logDirectory(): string {\n return this.logsDir;\n }\n\n private async rotateFile(filename: string): Promise<void> {\n const basePath = join(this.logsDir, filename);\n const isStdout = filename === \"stdout.log\";\n\n const stream = isStdout ? this.stdoutStream : this.stderrStream;\n if (stream) {\n await this.closeStream(stream);\n }\n\n for (let i = this.maxFiles - 1; i >= 1; i--) {\n try {\n await rename(`${basePath}.${i}`, `${basePath}.${i + 1}`);\n } catch { /* old file may not exist */ }\n }\n\n try {\n await rename(basePath, `${basePath}.1`);\n } catch { /* file may not exist */ }\n\n const newStream = createWriteStream(basePath, { flags: \"a\" });\n if (isStdout) {\n this.stdoutStream = newStream;\n this.stdoutBytes = 0;\n } else {\n this.stderrStream = newStream;\n this.stderrBytes = 0;\n }\n\n logger.debug({ filename }, \"Log file rotated\");\n }\n\n private closeStream(stream: WriteStream | null): Promise<void> {\n if (!stream) return Promise.resolve();\n return new Promise((resolve) => {\n stream.end(() => resolve());\n });\n }\n}\n","import type { AgentLauncher } from \"./agent-launcher\";\nimport { MockLauncher } from \"./mock-launcher\";\nimport { ProcessLauncher, type ProcessLauncherOptions } from \"./process-launcher\";\n\nexport type LauncherMode = \"mock\" | \"real\";\n\nexport interface LauncherConfig {\n mode: LauncherMode;\n processOptions?: ProcessLauncherOptions;\n}\n\n/**\n * Factory function to create the appropriate AgentLauncher.\n *\n * - \"mock\": returns MockLauncher (for testing / development without real IDE)\n * - \"real\": returns ProcessLauncher (spawns actual processes)\n *\n * Default: \"real\" in production, can be overridden by config or env.\n */\nexport function createLauncher(config?: Partial<LauncherConfig>): AgentLauncher {\n const mode = config?.mode ?? (process.env.ACTANT_LAUNCHER_MODE === \"mock\" ? \"mock\" : \"real\");\n\n switch (mode) {\n case \"mock\":\n return new MockLauncher();\n case \"real\":\n return new ProcessLauncher(config?.processOptions);\n }\n}\n","import { z } from \"zod/v4\";\nimport type { ConfigValidationResult, SkillDefinition } from \"@actant/shared\";\nimport { BaseComponentManager } from \"../base-component-manager\";\n\nconst SkillDefinitionSchema = z\n .object({\n name: z.string().min(1),\n description: z.string().optional(),\n content: z.string().min(1),\n tags: z.array(z.string()).optional(),\n })\n .passthrough();\n\nexport class SkillManager extends BaseComponentManager<SkillDefinition> {\n protected readonly componentType = \"Skill\";\n\n constructor() {\n super(\"skill-manager\");\n }\n\n /** Render all resolved skills into a single AGENTS.md content block. */\n renderSkills(skills: SkillDefinition[]): string {\n const sections = skills.map((s) => {\n const header = `## ${s.name}`;\n const desc = s.description ? `\\n> ${s.description}\\n` : \"\";\n return `${header}${desc}\\n${s.content}`;\n });\n return `# Agent Skills\\n\\n${sections.join(\"\\n\\n---\\n\\n\")}\\n`;\n }\n\n validate(data: unknown, _source: string): ConfigValidationResult<SkillDefinition> {\n const result = SkillDefinitionSchema.safeParse(data);\n if (!result.success) {\n return {\n valid: false,\n errors: result.error.issues.map((i) => ({\n path: i.path.map(String).join(\".\"),\n message: i.message,\n severity: \"error\" as const,\n })),\n warnings: [],\n };\n }\n return { valid: true, data: result.data, errors: [], warnings: [] };\n }\n}\n","import { z } from \"zod/v4\";\nimport type { ConfigValidationResult, PromptDefinition } from \"@actant/shared\";\nimport { BaseComponentManager } from \"../base-component-manager\";\n\nconst PromptDefinitionSchema = z\n .object({\n name: z.string().min(1),\n description: z.string().optional(),\n content: z.string().min(1),\n variables: z.array(z.string()).optional(),\n })\n .passthrough();\n\nexport class PromptManager extends BaseComponentManager<PromptDefinition> {\n protected readonly componentType = \"Prompt\";\n\n constructor() {\n super(\"prompt-manager\");\n }\n\n /**\n * Render a prompt with variable interpolation.\n * Replaces {{variableName}} placeholders with provided values.\n */\n renderPrompt(prompt: PromptDefinition, variables?: Record<string, string>): string {\n if (!variables) return prompt.content;\n return prompt.content.replace(\n /\\{\\{(\\w+)\\}\\}/g,\n (_match: string, key: string) => variables[key] ?? `{{${key}}}`,\n );\n }\n\n /** Render multiple prompts into a single system.md content block. */\n renderPrompts(prompts: PromptDefinition[], variables?: Record<string, string>): string {\n const sections = prompts.map((p) => {\n const header = `## ${p.name}`;\n const desc = p.description ? `\\n> ${p.description}\\n` : \"\";\n const content = this.renderPrompt(p, variables);\n return `${header}${desc}\\n${content}`;\n });\n return `# System Prompts\\n\\n${sections.join(\"\\n\\n---\\n\\n\")}\\n`;\n }\n\n validate(data: unknown, _source: string): ConfigValidationResult<PromptDefinition> {\n const result = PromptDefinitionSchema.safeParse(data);\n if (!result.success) {\n return {\n valid: false,\n errors: result.error.issues.map((i) => ({\n path: i.path.map(String).join(\".\"),\n message: i.message,\n severity: \"error\" as const,\n })),\n warnings: [],\n };\n }\n return { valid: true, data: result.data, errors: [], warnings: [] };\n }\n}\n","import { z } from \"zod/v4\";\nimport type { ConfigValidationResult, McpServerDefinition } from \"@actant/shared\";\nimport { BaseComponentManager } from \"../base-component-manager\";\n\nconst McpServerDefinitionSchema = z\n .object({\n name: z.string().min(1),\n description: z.string().optional(),\n command: z.string().min(1),\n args: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n })\n .passthrough();\n\nexport class McpConfigManager extends BaseComponentManager<McpServerDefinition> {\n protected readonly componentType = \"McpServer\";\n\n constructor() {\n super(\"mcp-config-manager\");\n }\n\n /**\n * Render resolved MCP servers into the .cursor/mcp.json format.\n * Returns the JSON object ready to be serialized.\n */\n renderMcpConfig(servers: McpServerDefinition[]): Record<string, unknown> {\n const mcpServers: Record<string, { command: string; args: string[]; env?: Record<string, string> }> = {};\n for (const server of servers) {\n mcpServers[server.name] = {\n command: server.command,\n args: server.args ?? [],\n ...(server.env && Object.keys(server.env).length > 0 ? { env: server.env } : {}),\n };\n }\n return { mcpServers };\n }\n\n validate(data: unknown, _source: string): ConfigValidationResult<McpServerDefinition> {\n const result = McpServerDefinitionSchema.safeParse(data);\n if (!result.success) {\n return {\n valid: false,\n errors: result.error.issues.map((i) => ({\n path: i.path.map(String).join(\".\"),\n message: i.message,\n severity: \"error\" as const,\n })),\n warnings: [],\n };\n }\n return { valid: true, data: result.data, errors: [], warnings: [] };\n }\n}\n","import { z } from \"zod/v4\";\nimport type { ConfigValidationResult, WorkflowDefinition } from \"@actant/shared\";\nimport { BaseComponentManager } from \"../base-component-manager\";\n\nconst WorkflowDefinitionSchema = z\n .object({\n name: z.string().min(1),\n description: z.string().optional(),\n content: z.string().min(1),\n })\n .passthrough();\n\nexport class WorkflowManager extends BaseComponentManager<WorkflowDefinition> {\n protected readonly componentType = \"Workflow\";\n\n constructor() {\n super(\"workflow-manager\");\n }\n\n /** Get the workflow content ready to write to .trellis/workflow.md */\n renderWorkflow(workflow: WorkflowDefinition): string {\n return workflow.content;\n }\n\n validate(data: unknown, _source: string): ConfigValidationResult<WorkflowDefinition> {\n const result = WorkflowDefinitionSchema.safeParse(data);\n if (!result.success) {\n return {\n valid: false,\n errors: result.error.issues.map((i) => ({\n path: i.path.map(String).join(\".\"),\n message: i.message,\n severity: \"error\" as const,\n })),\n warnings: [],\n };\n }\n return { valid: true, data: result.data, errors: [], warnings: [] };\n }\n}\n","import { z } from \"zod/v4\";\nimport type { ConfigValidationResult, PluginDefinition } from \"@actant/shared\";\nimport { BaseComponentManager } from \"../base-component-manager\";\n\nconst PluginDefinitionSchema = z\n .object({\n name: z.string().min(1),\n description: z.string().optional(),\n type: z.enum([\"npm\", \"file\", \"config\"]),\n source: z.string().optional(),\n config: z.record(z.string(), z.unknown()).optional(),\n enabled: z.boolean().optional().default(true),\n })\n .passthrough();\n\nexport class PluginManager extends BaseComponentManager<PluginDefinition> {\n protected readonly componentType = \"Plugin\";\n\n constructor() {\n super(\"plugin-manager\");\n }\n\n /**\n * Render plugins into a Claude Code plugins.json format.\n * Only includes enabled plugins with npm type.\n */\n renderPluginsJson(plugins: PluginDefinition[]): string {\n const entries = plugins\n .filter((p) => p.enabled !== false)\n .map((p) => {\n if (p.type === \"npm\") {\n return { name: p.name, package: p.source ?? p.name, ...p.config };\n }\n return { name: p.name, type: p.type, source: p.source, ...p.config };\n });\n return JSON.stringify(entries, null, 2);\n }\n\n /**\n * Render plugins as a Cursor extensions.json format.\n */\n renderExtensionsJson(plugins: PluginDefinition[]): string {\n const recommendations = plugins\n .filter((p) => p.enabled !== false && p.type === \"npm\")\n .map((p) => p.source ?? p.name);\n return JSON.stringify({ recommendations }, null, 2);\n }\n\n validate(data: unknown, _source: string): ConfigValidationResult<PluginDefinition> {\n const result = PluginDefinitionSchema.safeParse(data);\n if (!result.success) {\n return {\n valid: false,\n errors: result.error.issues.map((i) => ({\n path: i.path.map(String).join(\".\"),\n message: i.message,\n severity: \"error\" as const,\n })),\n warnings: [],\n };\n }\n return { valid: true, data: result.data, errors: [], warnings: [] };\n }\n}\n","import type { PermissionsConfig } from \"@actant/shared\";\nimport { createLogger } from \"@actant/shared\";\n\nconst logger = createLogger(\"permission-policy-enforcer\");\n\n/**\n * Minimal tool information extracted from ACP RequestPermissionRequest.toolCall\n * for pattern matching against PermissionsConfig rules.\n */\nexport interface ToolCallInfo {\n /** ACP ToolKind: read | edit | delete | move | search | execute | think | fetch | switch_mode | other */\n kind?: string;\n /** Human-readable title, e.g. \"Bash: npm run build\", \"Write to /src/foo.ts\" */\n title?: string;\n /** Tool call ID for audit trail */\n toolCallId: string;\n}\n\nexport type PolicyAction = \"allow\" | \"deny\" | \"ask\";\n\nexport interface PolicyDecision {\n action: PolicyAction;\n matchedRule?: string;\n}\n\n/**\n * Maps ACP ToolKind values to Claude Code tool names for pattern matching.\n */\nconst KIND_TO_TOOL: Record<string, string> = {\n read: \"Read\",\n edit: \"Edit\",\n execute: \"Bash\",\n fetch: \"WebFetch\",\n search: \"WebSearch\",\n delete: \"Write\",\n move: \"Write\",\n};\n\n/**\n * Permission policy enforcer that evaluates ACP tool calls against\n * a PermissionsConfig (allow/deny/ask lists with Claude Code glob syntax).\n *\n * Evaluation order: deny -> ask -> allow (deny wins).\n */\nexport class PermissionPolicyEnforcer {\n private config: PermissionsConfig;\n\n constructor(config: PermissionsConfig) {\n this.config = { ...config };\n }\n\n updateConfig(config: PermissionsConfig): void {\n this.config = { ...config };\n logger.info(\"Permission policy config updated\");\n }\n\n getConfig(): Readonly<PermissionsConfig> {\n return this.config;\n }\n\n /**\n * Evaluate a tool call against the configured permission rules.\n * Order: deny > ask > allow > defaultMode fallback.\n */\n evaluate(toolCall: ToolCallInfo): PolicyDecision {\n const toolName = this.extractToolName(toolCall);\n const toolArg = this.extractToolArg(toolCall);\n\n // Phase 1: Check deny list\n const denyMatch = this.matchList(this.config.deny, toolName, toolArg);\n if (denyMatch) {\n return { action: \"deny\", matchedRule: denyMatch };\n }\n\n // Phase 2: Check ask list\n const askMatch = this.matchList(this.config.ask, toolName, toolArg);\n if (askMatch) {\n return { action: \"ask\", matchedRule: askMatch };\n }\n\n // Phase 3: Check allow list\n const allowMatch = this.matchList(this.config.allow, toolName, toolArg);\n if (allowMatch) {\n return { action: \"allow\", matchedRule: allowMatch };\n }\n\n // Phase 4: Default — not explicitly listed anywhere\n const mode = this.config.defaultMode ?? \"default\";\n if (mode === \"bypassPermissions\") {\n return { action: \"allow\" };\n }\n return { action: \"deny\" };\n }\n\n /**\n * Build an ACP RequestPermissionOutcome from a PolicyDecision.\n * Returns the appropriate option selection based on the decision.\n */\n buildOutcome(\n decision: PolicyDecision,\n options: ReadonlyArray<{ kind: string; optionId: string }>,\n ): { outcome: \"selected\"; optionId: string } | { outcome: \"cancelled\" } {\n if (decision.action === \"allow\") {\n const opt = options.find((o) => o.kind === \"allow_once\" || o.kind === \"allow_always\");\n if (opt) return { outcome: \"selected\", optionId: opt.optionId };\n }\n if (decision.action === \"deny\") {\n const opt = options.find((o) => o.kind === \"reject_once\" || o.kind === \"reject_always\");\n if (opt) return { outcome: \"selected\", optionId: opt.optionId };\n return { outcome: \"cancelled\" };\n }\n // \"ask\" — no auto-decision, return cancelled to let caller decide (e.g. forward to IDE)\n return { outcome: \"cancelled\" };\n }\n\n /* ---------------------------------------------------------------- */\n /* Tool info extraction */\n /* ---------------------------------------------------------------- */\n\n private extractToolName(toolCall: ToolCallInfo): string {\n if (toolCall.title) {\n const colonIdx = toolCall.title.indexOf(\":\");\n if (colonIdx > 0) {\n const prefix = toolCall.title.slice(0, colonIdx).trim();\n if (prefix && /^[A-Za-z_][\\w]*$/.test(prefix)) {\n return prefix;\n }\n }\n const match = toolCall.title.match(/^\\[?Tool:\\s*(\\w+)\\]?/);\n if (match?.[1]) return match[1];\n\n const writeMatch = toolCall.title.match(/^(Write|Read|Edit|MultiEdit)\\b/i);\n if (writeMatch?.[1]) return writeMatch[1];\n }\n\n if (toolCall.kind) {\n const mapped = KIND_TO_TOOL[toolCall.kind];\n if (mapped) return mapped;\n }\n\n return toolCall.kind ?? \"unknown\";\n }\n\n private extractToolArg(toolCall: ToolCallInfo): string | undefined {\n if (!toolCall.title) return undefined;\n const colonIdx = toolCall.title.indexOf(\":\");\n if (colonIdx > 0) {\n return toolCall.title.slice(colonIdx + 1).trim();\n }\n const toMatch = toolCall.title.match(/^(?:Write|Read|Edit)\\s+(?:to\\s+)?(.+)/i);\n if (toMatch?.[1]) return toMatch[1].trim();\n return undefined;\n }\n\n /* ---------------------------------------------------------------- */\n /* Pattern matching */\n /* ---------------------------------------------------------------- */\n\n /**\n * Check if toolName+toolArg match any pattern in the list.\n * Returns the matched pattern string, or undefined.\n */\n private matchList(\n list: string[] | undefined,\n toolName: string,\n toolArg: string | undefined,\n ): string | undefined {\n if (!list || list.length === 0) return undefined;\n\n for (const pattern of list) {\n if (this.matchPattern(pattern, toolName, toolArg)) {\n return pattern;\n }\n }\n return undefined;\n }\n\n /**\n * Match a single Claude Code permission pattern against tool name + arg.\n *\n * Supported formats:\n * \"*\" — matches everything\n * \"ToolName\" — matches tool by name (case-insensitive)\n * \"Tool(specifier)\" — matches tool with glob specifier\n * \"mcp__server\" — matches MCP server prefix\n * \"mcp__server__tool\" — matches specific MCP tool\n */\n private matchPattern(pattern: string, toolName: string, toolArg: string | undefined): boolean {\n if (pattern === \"*\") return true;\n\n // MCP pattern: \"mcp__server\" or \"mcp__server__tool\"\n if (pattern.startsWith(\"mcp__\")) {\n const lowerName = toolName.toLowerCase();\n const lowerPattern = pattern.toLowerCase();\n return lowerName === lowerPattern || lowerName.startsWith(lowerPattern + \"__\");\n }\n\n // Tool(specifier) pattern\n const parenIdx = pattern.indexOf(\"(\");\n if (parenIdx > 0 && pattern.endsWith(\")\")) {\n const patternTool = pattern.slice(0, parenIdx);\n const specifier = pattern.slice(parenIdx + 1, -1);\n\n if (!this.toolNameMatches(patternTool, toolName)) return false;\n if (!toolArg) return false;\n return globMatch(specifier, toolArg);\n }\n\n // Plain tool name\n return this.toolNameMatches(pattern, toolName);\n }\n\n private toolNameMatches(patternName: string, toolName: string): boolean {\n return patternName.toLowerCase() === toolName.toLowerCase();\n }\n}\n\n/**\n * Simple glob matcher supporting * (match any sequence) and ** (match across path separators).\n * Sufficient for Claude Code permission patterns like \"npm run *\", \"./src/**\", \"domain:*.com\".\n */\nexport function globMatch(pattern: string, input: string): boolean {\n const regex = globToRegex(pattern);\n return regex.test(input);\n}\n\nfunction globToRegex(pattern: string): RegExp {\n let regexStr = \"^\";\n let i = 0;\n while (i < pattern.length) {\n const ch = pattern.charAt(i);\n if (ch === \"*\" && pattern.charAt(i + 1) === \"*\") {\n regexStr += \".*\";\n i += 2;\n if (pattern.charAt(i) === \"/\") i++;\n } else if (ch === \"*\") {\n regexStr += \"[^/]*\";\n i++;\n } else if (ch === \"?\") {\n regexStr += \"[^/]\";\n i++;\n } else {\n regexStr += escapeRegex(ch);\n i++;\n }\n }\n regexStr += \"$\";\n return new RegExp(regexStr, \"i\");\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import { createLogger } from \"@actant/shared\";\nimport type { ToolCallInfo, PolicyDecision } from \"./permission-policy-enforcer\";\n\nconst logger = createLogger(\"permission-audit\");\n\nexport type PermissionAuditEvent =\n | \"permission.resolved\"\n | \"permission.injected\"\n | \"permission.evaluated\"\n | \"permission.updated\";\n\nexport interface AuditEntry {\n event: PermissionAuditEvent;\n instanceName?: string;\n templateName?: string;\n toolCall?: ToolCallInfo;\n decision?: PolicyDecision;\n detail?: Record<string, unknown>;\n timestamp: string;\n}\n\nexport class PermissionAuditLogger {\n private readonly instanceName: string | undefined;\n\n constructor(instanceName?: string) {\n this.instanceName = instanceName;\n }\n\n log(event: PermissionAuditEvent, detail?: Omit<AuditEntry, \"event\" | \"timestamp\" | \"instanceName\">): void {\n const entry: AuditEntry = {\n event,\n instanceName: this.instanceName,\n ...detail,\n timestamp: new Date().toISOString(),\n };\n logger.info(entry, `[audit] ${event}`);\n }\n\n logEvaluation(toolCall: ToolCallInfo, decision: PolicyDecision): void {\n this.log(\"permission.evaluated\", { toolCall, decision });\n }\n\n logResolved(templateName: string, preset?: string): void {\n this.log(\"permission.resolved\", {\n templateName,\n detail: preset ? { preset } : undefined,\n });\n }\n\n logInjected(backendType: string): void {\n this.log(\"permission.injected\", { detail: { backendType } });\n }\n\n logUpdated(source: string): void {\n this.log(\"permission.updated\", { detail: { source } });\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { createLogger } from \"@actant/shared\";\n\nconst logger = createLogger(\"session-registry\");\n\nconst DEFAULT_IDLE_TTL_MS = 30 * 60 * 1000; // 30 minutes\nconst TTL_CHECK_INTERVAL_MS = 60 * 1000; // 1 minute\n\nexport type SessionState = \"active\" | \"idle\" | \"expired\";\n\nexport interface SessionLease {\n sessionId: string;\n agentName: string;\n /** Currently-bound client identifier. null when idle (client disconnected). */\n clientId: string | null;\n state: SessionState;\n createdAt: string;\n lastActivityAt: string;\n /** Milliseconds of idle time before the session expires. */\n idleTtlMs: number;\n}\n\nexport interface CreateSessionOptions {\n agentName: string;\n clientId: string;\n idleTtlMs?: number;\n}\n\nexport interface SessionRegistryOptions {\n defaultIdleTtlMs?: number;\n ttlCheckIntervalMs?: number;\n}\n\n/**\n * In-memory registry of Session Lease objects.\n * Tracks which client owns which session, handles idle/expire transitions,\n * and runs a periodic sweep to expire stale sessions.\n */\nexport class SessionRegistry {\n private sessions = new Map<string, SessionLease>();\n private sweepTimer: ReturnType<typeof setInterval> | null = null;\n private readonly defaultIdleTtlMs: number;\n private onExpireCallback?: (session: SessionLease) => void;\n\n constructor(options?: SessionRegistryOptions) {\n this.defaultIdleTtlMs = options?.defaultIdleTtlMs ?? DEFAULT_IDLE_TTL_MS;\n const interval = options?.ttlCheckIntervalMs ?? TTL_CHECK_INTERVAL_MS;\n this.sweepTimer = setInterval(() => this.sweepExpired(), interval);\n this.sweepTimer.unref();\n }\n\n /** Register a callback invoked when a session expires. */\n onExpire(callback: (session: SessionLease) => void): void {\n this.onExpireCallback = callback;\n }\n\n /** Create a new session for an agent, bound to a client. */\n create(opts: CreateSessionOptions): SessionLease {\n const now = new Date().toISOString();\n const session: SessionLease = {\n sessionId: randomUUID(),\n agentName: opts.agentName,\n clientId: opts.clientId,\n state: \"active\",\n createdAt: now,\n lastActivityAt: now,\n idleTtlMs: opts.idleTtlMs ?? this.defaultIdleTtlMs,\n };\n this.sessions.set(session.sessionId, session);\n logger.info({ sessionId: session.sessionId, agentName: opts.agentName, clientId: opts.clientId }, \"Session created\");\n return session;\n }\n\n /** Get a session by ID, or undefined if not found. */\n get(sessionId: string): SessionLease | undefined {\n return this.sessions.get(sessionId);\n }\n\n /** List all sessions, optionally filtered by agent name. */\n list(agentName?: string): SessionLease[] {\n const all = Array.from(this.sessions.values());\n return agentName ? all.filter((s) => s.agentName === agentName) : all;\n }\n\n /**\n * Record activity on a session, updating lastActivityAt\n * and ensuring state is \"active\".\n */\n touch(sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (!session || session.state === \"expired\") return;\n session.lastActivityAt = new Date().toISOString();\n session.state = \"active\";\n }\n\n /**\n * Mark a session as idle (client disconnected but session is kept alive).\n * The session will expire after its idleTtlMs elapses.\n */\n release(sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (!session || session.state === \"expired\") return;\n session.clientId = null;\n session.state = \"idle\";\n session.lastActivityAt = new Date().toISOString();\n logger.info({ sessionId, agentName: session.agentName }, \"Session released to idle\");\n }\n\n /**\n * Resume an idle session, binding it to a (potentially new) client.\n * Returns false if the session is not found, expired, or already active.\n */\n resume(sessionId: string, clientId: string): boolean {\n const session = this.sessions.get(sessionId);\n if (!session || session.state === \"expired\") return false;\n if (session.state === \"active\" && session.clientId !== null) return false;\n\n session.clientId = clientId;\n session.state = \"active\";\n session.lastActivityAt = new Date().toISOString();\n logger.info({ sessionId, clientId, agentName: session.agentName }, \"Session resumed\");\n return true;\n }\n\n /** Explicitly close and remove a session. */\n close(sessionId: string): boolean {\n const session = this.sessions.get(sessionId);\n if (!session) return false;\n this.sessions.delete(sessionId);\n logger.info({ sessionId, agentName: session.agentName }, \"Session closed\");\n return true;\n }\n\n /** Close all sessions for a given agent. */\n closeByAgent(agentName: string): number {\n let count = 0;\n for (const [id, session] of this.sessions) {\n if (session.agentName === agentName) {\n this.sessions.delete(id);\n count++;\n }\n }\n if (count > 0) {\n logger.info({ agentName, count }, \"Sessions closed for agent\");\n }\n return count;\n }\n\n /** Number of active sessions. */\n get size(): number {\n return this.sessions.size;\n }\n\n /** Stop the TTL sweep timer and clear all sessions. */\n dispose(): void {\n if (this.sweepTimer) {\n clearInterval(this.sweepTimer);\n this.sweepTimer = null;\n }\n this.sessions.clear();\n }\n\n private sweepExpired(): void {\n const now = Date.now();\n for (const [id, session] of this.sessions) {\n if (session.state !== \"idle\") continue;\n\n const lastActivity = new Date(session.lastActivityAt).getTime();\n if (now - lastActivity > session.idleTtlMs) {\n session.state = \"expired\";\n this.sessions.delete(id);\n logger.info({ sessionId: id, agentName: session.agentName, idleMs: now - lastActivity }, \"Session expired (TTL)\");\n this.onExpireCallback?.(session);\n }\n }\n }\n}\n","import { join } from \"node:path\";\nimport { mkdir, rm } from \"node:fs/promises\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport type { GitHubSourceConfig } from \"@actant/shared\";\nimport { createLogger } from \"@actant/shared\";\nimport type { ComponentSource, FetchResult } from \"./component-source\";\nimport { LocalSource } from \"./local-source\";\n\nconst execFileAsync = promisify(execFile);\nconst logger = createLogger(\"github-source\");\n\n/**\n * Fetches component packages from GitHub repositories via shallow clone.\n * After cloning, delegates to LocalSource for actual file parsing.\n */\nexport class GitHubSource implements ComponentSource {\n readonly type = \"github\";\n readonly packageName: string;\n readonly config: GitHubSourceConfig;\n private readonly cacheDir: string;\n\n constructor(packageName: string, config: GitHubSourceConfig, cacheDir: string) {\n this.packageName = packageName;\n this.config = config;\n this.cacheDir = join(cacheDir, packageName);\n }\n\n async fetch(): Promise<FetchResult> {\n await this.clone();\n return this.readCached();\n }\n\n async sync(): Promise<FetchResult> {\n try {\n await this.pull();\n } catch {\n logger.info(\"Pull failed, re-cloning\");\n await this.clone();\n }\n return this.readCached();\n }\n\n async dispose(): Promise<void> {\n await rm(this.cacheDir, { recursive: true, force: true });\n logger.debug({ cacheDir: this.cacheDir }, \"Cache cleaned\");\n }\n\n private async clone(): Promise<void> {\n await rm(this.cacheDir, { recursive: true, force: true });\n await mkdir(this.cacheDir, { recursive: true });\n const branch = this.config.branch ?? \"main\";\n const args = [\"clone\", \"--depth\", \"1\", \"--branch\", branch, this.config.url, this.cacheDir];\n logger.info({ url: this.config.url, branch }, \"Cloning repository\");\n await execFileAsync(\"git\", args, { timeout: 60_000 });\n }\n\n private async pull(): Promise<void> {\n await execFileAsync(\"git\", [\"pull\", \"--depth\", \"1\"], {\n cwd: this.cacheDir,\n timeout: 30_000,\n });\n }\n\n private async readCached(): Promise<FetchResult> {\n const localSource = new LocalSource(this.packageName, { type: \"local\", path: this.cacheDir });\n return localSource.fetch();\n }\n}\n","import { readFile, readdir, stat } from \"node:fs/promises\";\nimport { join, extname } from \"node:path\";\nimport type {\n LocalSourceConfig,\n PackageManifest,\n PresetDefinition,\n SkillDefinition,\n PromptDefinition,\n McpServerDefinition,\n WorkflowDefinition,\n AgentTemplate,\n} from \"@actant/shared\";\nimport { createLogger } from \"@actant/shared\";\nimport type { ComponentSource, FetchResult } from \"./component-source\";\n\nconst logger = createLogger(\"local-source\");\n\nexport class LocalSource implements ComponentSource {\n readonly type = \"local\";\n readonly packageName: string;\n readonly config: LocalSourceConfig;\n\n constructor(packageName: string, config: LocalSourceConfig) {\n this.packageName = packageName;\n this.config = config;\n }\n\n async fetch(): Promise<FetchResult> {\n return this.loadPackage();\n }\n\n async sync(): Promise<FetchResult> {\n return this.loadPackage();\n }\n\n async dispose(): Promise<void> {\n // local source has no cache to clean up\n }\n\n private async loadPackage(): Promise<FetchResult> {\n const rootDir = this.config.path;\n const manifest = await this.loadManifest(rootDir);\n\n const [skills, prompts, mcpServers, workflows, presets, templates] = await Promise.all([\n this.loadJsonDir<SkillDefinition>(rootDir, manifest.components?.skills, \"skills\"),\n this.loadJsonDir<PromptDefinition>(rootDir, manifest.components?.prompts, \"prompts\"),\n this.loadJsonDir<McpServerDefinition>(rootDir, manifest.components?.mcp, \"mcp\"),\n this.loadJsonDir<WorkflowDefinition>(rootDir, manifest.components?.workflows, \"workflows\"),\n this.loadPresets(rootDir, manifest.presets),\n this.loadJsonDir<AgentTemplate>(rootDir, manifest.components?.templates, \"templates\"),\n ]);\n\n logger.info({ packageName: this.packageName, rootDir }, \"Local package loaded\");\n return { manifest, skills, prompts, mcpServers, workflows, presets, templates };\n }\n\n private async loadManifest(rootDir: string): Promise<PackageManifest> {\n const manifestPath = join(rootDir, \"actant.json\");\n try {\n const raw = await readFile(manifestPath, \"utf-8\");\n return JSON.parse(raw) as PackageManifest;\n } catch {\n logger.debug({ rootDir }, \"No actant.json found, scanning directories\");\n return { name: this.packageName };\n }\n }\n\n private async loadJsonDir<T>(\n rootDir: string,\n explicitFiles: string[] | undefined,\n subDir: string,\n ): Promise<T[]> {\n if (explicitFiles) {\n const items: T[] = [];\n for (const relPath of explicitFiles) {\n try {\n const raw = await readFile(join(rootDir, relPath), \"utf-8\");\n items.push(JSON.parse(raw) as T);\n } catch (err) {\n logger.warn({ file: relPath, error: err }, `Failed to load from manifest, skipping`);\n }\n }\n return items;\n }\n\n const dirPath = join(rootDir, subDir);\n try {\n const dirStat = await stat(dirPath);\n if (!dirStat.isDirectory()) return [];\n } catch {\n return [];\n }\n\n const entries = await readdir(dirPath);\n const items: T[] = [];\n\n for (const file of entries) {\n if (extname(file) !== \".json\") continue;\n const fullPath = join(dirPath, file);\n try {\n const fileStat = await stat(fullPath);\n if (!fileStat.isFile()) continue;\n const raw = await readFile(fullPath, \"utf-8\");\n items.push(JSON.parse(raw) as T);\n } catch (err) {\n logger.warn({ file, error: err }, `Failed to load ${subDir} file, skipping`);\n }\n }\n\n // Also check subdirectories for manifest.json (directory-based components)\n for (const entry of entries) {\n if (extname(entry) === \".json\") continue;\n const subDirPath = join(dirPath, entry);\n try {\n const subStat = await stat(subDirPath);\n if (!subStat.isDirectory()) continue;\n const manifestPath = join(subDirPath, \"manifest.json\");\n const mRaw = await readFile(manifestPath, \"utf-8\");\n const parsed = JSON.parse(mRaw) as Record<string, unknown>;\n if (typeof parsed.content === \"string\" && parsed.content.endsWith(\".md\")) {\n try {\n const content = await readFile(join(subDirPath, parsed.content), \"utf-8\");\n parsed.content = content;\n } catch {\n /* use as-is */\n }\n }\n if (!parsed.name) parsed.name = entry;\n items.push(parsed as T);\n } catch {\n /* skip */\n }\n }\n\n // For skills specifically, also check SKILL.md in subdirectories\n if (subDir === \"skills\") {\n const { parseSkillMd } = await import(\"./skill-md-parser\");\n for (const entry of entries) {\n if (extname(entry) === \".json\") continue;\n const subDirPath = join(dirPath, entry);\n try {\n const subStat = await stat(subDirPath);\n if (!subStat.isDirectory()) continue;\n const skillMdPath = join(subDirPath, \"SKILL.md\");\n const skill = await parseSkillMd(skillMdPath);\n if (skill && !(items as Array<{ name: string }>).find((i) => i.name === skill.name)) {\n items.push(skill as unknown as T);\n }\n } catch {\n /* skip */\n }\n }\n }\n\n return items;\n }\n\n private async loadPresets(\n rootDir: string,\n explicitFiles: string[] | undefined,\n ): Promise<PresetDefinition[]> {\n return this.loadJsonDir<PresetDefinition>(rootDir, explicitFiles, \"presets\");\n }\n}\n","import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n SourceConfig,\n SourceEntry,\n PresetDefinition,\n SkillDefinition,\n PromptDefinition,\n McpServerDefinition,\n WorkflowDefinition,\n AgentTemplate,\n} from \"@actant/shared\";\n\nexport const DEFAULT_SOURCE_NAME = \"actant-hub\";\nexport const DEFAULT_SOURCE_CONFIG: SourceConfig = {\n type: \"github\" as const,\n url: \"https://github.com/blackplume233/actant-hub.git\",\n branch: \"main\",\n};\nimport { createLogger } from \"@actant/shared\";\nimport type { ComponentSource, FetchResult } from \"./component-source\";\nimport type { BaseComponentManager, NamedComponent } from \"../domain/base-component-manager\";\nimport type { TemplateRegistry } from \"../template/registry/template-registry\";\nimport { GitHubSource } from \"./github-source\";\nimport { LocalSource } from \"./local-source\";\nimport {\n createEmptySyncReport,\n mergeSyncReports,\n type SyncReport,\n type ComponentTypeName,\n} from \"../version\";\n\nconst logger = createLogger(\"source-manager\");\n\nexport interface SourceManagerDeps {\n skillManager: BaseComponentManager<SkillDefinition>;\n promptManager: BaseComponentManager<PromptDefinition>;\n mcpConfigManager: BaseComponentManager<McpServerDefinition>;\n workflowManager: BaseComponentManager<WorkflowDefinition>;\n templateRegistry?: TemplateRegistry;\n}\n\n/**\n * Manages component sources (GitHub repos, local dirs, etc.).\n * Syncs remote components into the domain managers with `package@name` namespacing.\n */\nexport interface SourceManagerOptions {\n /** Skip auto-registration of the default actant-hub source (useful for tests). */\n skipDefaultSource?: boolean;\n}\n\nexport class SourceManager {\n private readonly sources = new Map<string, ComponentSource>();\n private readonly presets = new Map<string, PresetDefinition>();\n private readonly managers: SourceManagerDeps;\n private readonly homeDir: string;\n private readonly sourcesFilePath: string;\n private readonly cacheDir: string;\n private readonly skipDefaultSource: boolean;\n\n constructor(homeDir: string, managers: SourceManagerDeps, options?: SourceManagerOptions) {\n this.homeDir = homeDir;\n this.managers = managers;\n this.sourcesFilePath = join(homeDir, \"sources.json\");\n this.cacheDir = join(homeDir, \"sources-cache\");\n this.skipDefaultSource = options?.skipDefaultSource ?? false;\n }\n\n // ---------------------------------------------------------------------------\n // Source CRUD\n // ---------------------------------------------------------------------------\n\n async addSource(name: string, config: SourceConfig): Promise<FetchResult> {\n if (this.sources.has(name)) {\n throw new Error(`Source \"${name}\" already registered`);\n }\n const source = this.createSource(name, config);\n const result = await source.fetch();\n this.sources.set(name, source);\n this.injectComponents(name, result);\n await this.persistSources();\n logger.info({ name, type: config.type }, \"Source added\");\n return result;\n }\n\n async syncSource(name: string): Promise<FetchResult> {\n const { fetchResult } = await this.syncSourceWithReport(name);\n return fetchResult;\n }\n\n async syncSourceWithReport(name: string): Promise<{ fetchResult: FetchResult; report: SyncReport }> {\n const source = this.getSourceOrThrow(name);\n const oldSnapshot = this.snapshotComponents(name);\n this.removeNamespacedComponents(name);\n const result = await source.sync();\n this.injectComponents(name, result);\n const newSnapshot = this.snapshotComponents(name);\n await this.persistSources();\n const report = this.buildSyncReport(oldSnapshot, newSnapshot);\n logger.info({ name, report }, \"Source synced\");\n return { fetchResult: result, report };\n }\n\n async syncAll(): Promise<void> {\n await this.syncAllWithReport();\n }\n\n async syncAllWithReport(): Promise<{ report: SyncReport }> {\n const reports: SyncReport[] = [];\n for (const name of this.sources.keys()) {\n try {\n const { report } = await this.syncSourceWithReport(name);\n reports.push(report);\n } catch (err) {\n logger.warn({ name, error: err }, \"Failed to sync source, skipping\");\n }\n }\n return { report: mergeSyncReports(reports) };\n }\n\n async removeSource(name: string): Promise<boolean> {\n const source = this.sources.get(name);\n if (!source) return false;\n this.removeNamespacedComponents(name);\n this.removeNamespacedPresets(name);\n await source.dispose();\n this.sources.delete(name);\n await this.persistSources();\n logger.info({ name }, \"Source removed\");\n return true;\n }\n\n listSources(): SourceEntry[] {\n return Array.from(this.sources.entries()).map(([name, source]) => ({\n name,\n config: source.config,\n syncedAt: new Date().toISOString(),\n }));\n }\n\n hasSource(name: string): boolean {\n return this.sources.has(name);\n }\n\n // ---------------------------------------------------------------------------\n // Preset operations\n // ---------------------------------------------------------------------------\n\n listPresets(packageName?: string): PresetDefinition[] {\n const all = Array.from(this.presets.values());\n if (!packageName) return all;\n const prefix = `${packageName}@`;\n return all.filter((p) => p.name.startsWith(prefix));\n }\n\n getPreset(qualifiedName: string): PresetDefinition | undefined {\n return this.presets.get(qualifiedName);\n }\n\n /**\n * Apply a preset to a template — expands preset component refs\n * into the template's domainContext with `package@name` namespacing.\n * Returns a new template (does not mutate input).\n */\n applyPreset(qualifiedName: string, template: AgentTemplate): AgentTemplate {\n const preset = this.presets.get(qualifiedName);\n if (!preset) {\n throw new Error(`Preset \"${qualifiedName}\" not found`);\n }\n\n const packageName = qualifiedName.split(\"@\")[0];\n const ns = (name: string) => `${packageName}@${name}`;\n\n const dc = { ...template.domainContext };\n if (preset.skills?.length) {\n dc.skills = [...(dc.skills ?? []), ...preset.skills.map(ns)];\n }\n if (preset.prompts?.length) {\n dc.prompts = [...(dc.prompts ?? []), ...preset.prompts.map(ns)];\n }\n if (preset.mcpServers?.length) {\n const newRefs = preset.mcpServers.map((mcpName: string) => {\n const fullName = ns(mcpName);\n const existing = this.managers.mcpConfigManager.get(fullName);\n return {\n name: fullName,\n command: existing?.command ?? \"\",\n args: existing?.args,\n env: existing?.env,\n };\n });\n dc.mcpServers = [...(dc.mcpServers ?? []), ...newRefs];\n }\n if (preset.workflows?.length) {\n const firstWorkflow = preset.workflows[0];\n if (firstWorkflow && !dc.workflow) {\n dc.workflow = ns(firstWorkflow);\n }\n }\n if (preset.templates?.length && this.managers.templateRegistry) {\n for (const tplName of preset.templates) {\n const fullName = ns(tplName);\n const tpl = this.managers.templateRegistry.get(fullName);\n if (tpl) {\n this.managers.templateRegistry.register(tpl);\n }\n }\n }\n\n return { ...template, domainContext: dc };\n }\n\n // ---------------------------------------------------------------------------\n // Initialization (load persisted sources on startup)\n // ---------------------------------------------------------------------------\n\n async initialize(): Promise<void> {\n let entries: SourceEntry[] = [];\n try {\n const raw = await readFile(this.sourcesFilePath, \"utf-8\");\n const data = JSON.parse(raw) as { sources?: Record<string, SourceConfig> };\n entries = Object.entries(data.sources ?? {}).map(([name, config]) => ({ name, config }));\n } catch {\n logger.debug(\"No sources.json found, starting with empty sources\");\n }\n\n for (const entry of entries) {\n try {\n const source = this.createSource(entry.name, entry.config);\n const result = await source.fetch();\n this.sources.set(entry.name, source);\n this.injectComponents(entry.name, result);\n logger.info({ name: entry.name }, \"Source restored from config\");\n } catch (err) {\n logger.warn({ name: entry.name, error: err }, \"Failed to restore source, skipping\");\n }\n }\n\n await this.ensureDefaultSource();\n }\n\n /**\n * Registers the official actant-hub as the default source if not already present.\n * Fails silently when offline or the repo is unreachable.\n */\n private async ensureDefaultSource(): Promise<void> {\n if (this.skipDefaultSource) return;\n if (this.sources.has(DEFAULT_SOURCE_NAME)) return;\n try {\n await this.addSource(DEFAULT_SOURCE_NAME, DEFAULT_SOURCE_CONFIG);\n logger.info(\"Default source registered: %s\", DEFAULT_SOURCE_NAME);\n } catch (err) {\n logger.debug({ error: err }, \"Failed to register default source (offline?), skipping\");\n }\n }\n\n // ---------------------------------------------------------------------------\n // Internals\n // ---------------------------------------------------------------------------\n\n private createSource(name: string, config: SourceConfig): ComponentSource {\n switch (config.type) {\n case \"github\":\n return new GitHubSource(name, config, this.cacheDir);\n case \"local\":\n return new LocalSource(name, config);\n default:\n throw new Error(`Unsupported source type: ${(config as { type: string }).type}`);\n }\n }\n\n private injectComponents(packageName: string, result: FetchResult): void {\n const ns = (c: NamedComponent) => ({ ...c, name: `${packageName}@${c.name}` });\n\n for (const skill of result.skills) {\n this.managers.skillManager.register(ns(skill) as SkillDefinition);\n }\n for (const prompt of result.prompts) {\n this.managers.promptManager.register(ns(prompt) as PromptDefinition);\n }\n for (const mcp of result.mcpServers) {\n this.managers.mcpConfigManager.register(ns(mcp) as McpServerDefinition);\n }\n for (const wf of result.workflows) {\n this.managers.workflowManager.register(ns(wf) as WorkflowDefinition);\n }\n for (const preset of result.presets) {\n this.presets.set(`${packageName}@${preset.name}`, preset);\n }\n if (this.managers.templateRegistry && result.templates.length > 0) {\n for (const template of result.templates) {\n const nsTemplate = { ...template, name: `${packageName}@${template.name}` };\n this.managers.templateRegistry.register(nsTemplate);\n }\n }\n\n logger.debug(\n {\n packageName,\n skills: result.skills.length,\n prompts: result.prompts.length,\n mcp: result.mcpServers.length,\n workflows: result.workflows.length,\n presets: result.presets.length,\n templates: result.templates.length,\n },\n \"Components injected\",\n );\n }\n\n private removeNamespacedComponents(packageName: string): void {\n const prefix = `${packageName}@`;\n const removeFrom = <T extends NamedComponent>(mgr: BaseComponentManager<T>) => {\n for (const c of mgr.list()) {\n if (c.name.startsWith(prefix)) {\n mgr.unregister(c.name);\n }\n }\n };\n removeFrom(this.managers.skillManager);\n removeFrom(this.managers.promptManager);\n removeFrom(this.managers.mcpConfigManager);\n removeFrom(this.managers.workflowManager);\n if (this.managers.templateRegistry) {\n for (const t of this.managers.templateRegistry.list()) {\n if (t.name.startsWith(prefix)) {\n this.managers.templateRegistry.unregister(t.name);\n }\n }\n }\n }\n\n private removeNamespacedPresets(packageName: string): void {\n const prefix = `${packageName}@`;\n for (const key of this.presets.keys()) {\n if (key.startsWith(prefix)) {\n this.presets.delete(key);\n }\n }\n }\n\n private async persistSources(): Promise<void> {\n const data: Record<string, SourceConfig> = {};\n for (const [name, source] of this.sources) {\n data[name] = source.config;\n }\n await mkdir(this.homeDir, { recursive: true });\n await writeFile(this.sourcesFilePath, JSON.stringify({ sources: data }, null, 2) + \"\\n\", \"utf-8\");\n }\n\n private getSourceOrThrow(name: string): ComponentSource {\n const source = this.sources.get(name);\n if (!source) {\n throw new Error(`Source \"${name}\" not found`);\n }\n return source;\n }\n\n private snapshotComponents(packageName: string): Map<string, { type: ComponentTypeName; version?: string }> {\n const prefix = `${packageName}@`;\n const snapshot = new Map<string, { type: ComponentTypeName; version?: string }>();\n\n const addFrom = <T extends { name: string; version?: string }>(\n mgr: BaseComponentManager<T>,\n type: ComponentTypeName,\n ) => {\n for (const c of mgr.list()) {\n if (c.name.startsWith(prefix)) {\n snapshot.set(c.name, { type, version: c.version });\n }\n }\n };\n addFrom(this.managers.skillManager, \"skill\");\n addFrom(this.managers.promptManager, \"prompt\");\n addFrom(this.managers.mcpConfigManager, \"mcpServer\");\n addFrom(this.managers.workflowManager, \"workflow\");\n\n if (this.managers.templateRegistry) {\n for (const t of this.managers.templateRegistry.list()) {\n if (t.name.startsWith(prefix)) {\n snapshot.set(t.name, { type: \"template\", version: t.version });\n }\n }\n }\n\n for (const [key, preset] of this.presets) {\n if (key.startsWith(prefix)) {\n snapshot.set(key, { type: \"preset\", version: preset.version });\n }\n }\n\n return snapshot;\n }\n\n private buildSyncReport(\n oldSnapshot: Map<string, { type: ComponentTypeName; version?: string }>,\n newSnapshot: Map<string, { type: ComponentTypeName; version?: string }>,\n ): SyncReport {\n const report = createEmptySyncReport();\n\n for (const [name, newEntry] of newSnapshot) {\n const oldEntry = oldSnapshot.get(name);\n if (!oldEntry) {\n report.added.push({\n type: newEntry.type,\n name,\n newVersion: newEntry.version,\n });\n } else if (oldEntry.version !== newEntry.version) {\n report.updated.push({\n type: newEntry.type,\n name,\n oldVersion: oldEntry.version,\n newVersion: newEntry.version,\n });\n if (isMajorVersionChange(oldEntry.version, newEntry.version)) {\n report.hasBreakingChanges = true;\n }\n } else {\n report.unchanged.push(name);\n }\n }\n\n for (const [name, oldEntry] of oldSnapshot) {\n if (!newSnapshot.has(name)) {\n report.removed.push({\n type: oldEntry.type,\n name,\n oldVersion: oldEntry.version,\n });\n }\n }\n\n return report;\n }\n}\n\nfunction parseMajor(version?: string): number | undefined {\n if (!version) return undefined;\n const m = version.match(/^(\\d+)/);\n const major = m?.[1];\n return major !== undefined ? parseInt(major, 10) : undefined;\n}\n\nfunction isMajorVersionChange(oldVersion?: string, newVersion?: string): boolean {\n const oldMajor = parseMajor(oldVersion);\n const newMajor = parseMajor(newVersion);\n if (oldMajor === undefined || newMajor === undefined) return false;\n return newMajor !== oldMajor;\n}\n","export type ComponentTypeName = \"skill\" | \"prompt\" | \"workflow\" | \"mcpServer\" | \"plugin\" | \"template\" | \"preset\";\n\nexport interface ComponentVersionDelta {\n type: ComponentTypeName;\n name: string;\n oldVersion?: string;\n newVersion?: string;\n}\n\nexport interface SyncReport {\n added: ComponentVersionDelta[];\n updated: ComponentVersionDelta[];\n removed: ComponentVersionDelta[];\n unchanged: string[];\n hasBreakingChanges: boolean;\n}\n\nexport function createEmptySyncReport(): SyncReport {\n return { added: [], updated: [], removed: [], unchanged: [], hasBreakingChanges: false };\n}\n\n/** Merge multiple SyncReports into one (e.g. when syncing all sources). */\nexport function mergeSyncReports(reports: SyncReport[]): SyncReport {\n const merged = createEmptySyncReport();\n for (const r of reports) {\n merged.added.push(...r.added);\n merged.updated.push(...r.updated);\n merged.removed.push(...r.removed);\n merged.unchanged.push(...r.unchanged);\n if (r.hasBreakingChanges) merged.hasBreakingChanges = true;\n }\n return merged;\n}\n"],"mappings":"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","names":["writeFile","mkdir","stat","join","createLogger","logger","createLogger","mkdir","join","writeFile","stat","createLogger","logger","createLogger","writeFile","mkdir","join","createLogger","logger","createLogger","logger","randomUUID","createLogger","createLogger","logger","createLogger","logger","randomUUID","createLogger","logger","randomUUID","createLogger","logger","logger","createLogger","randomUUID","z","z","stat","join","join","stat","mkdir","join","ConfigValidationError","readFile","writeFile","readdir","stat","mkdir","join","extname","ConfigNotFoundError","ConfigValidationError","createLogger","isNodeError","ConfigValidationError","mkdir","join","writeFile","join","createLogger","logger","createLogger","registry","join","mkdir","access","unlink","join","randomUUID","ConfigValidationError","InstanceCorruptedError","createLogger","z","PermissionModeSchema","readFile","writeFile","readdir","stat","mkdir","join","randomUUID","createLogger","logger","join","readFile","isNodeError","randomUUID","mkdir","writeFile","registry","stat","readdir","readFile","writeFile","rename","readdir","stat","mkdir","join","dirname","resolve","randomUUID","InstanceCorruptedError","readFile","isNodeError","randomUUID","mkdir","dirname","writeFile","rename","resolve","InstanceCorruptedError","stat","readdir","join","createLogger","logger","registry","resolve","logger","createLogger","join","ConfigValidationError","mkdir","randomUUID","meta","InstanceCorruptedError","unlink","access","writeFile","mkdir","join","createLogger","logger","createLogger","logger","mkdir","rm","join","join","mkdir","rm","join","isAbsolute","isAbsolute","join","resolve","rm","access","join","isAbsolute","isAbsolute","join","access","rm","spawn","rm","join","join","rm","resolve","spawn","spawn","join","registry","join","resolve","spawn","registry","join","rename","mkdir","createLogger","createLogger","isNodeError","resolve","logger","createLogger","createLogger","logger","createLogger","logger","spawn","createLogger","logger","resolve","createLogger","logger","registry","logger","createLogger","join","stopped","mkdir","rename","process","spawn","createLogger","mkdir","rename","stat","readFile","join","createLogger","logger","resolve","logger","createLogger","spawn","resolve","z","z","z","z","z","z","z","z","z","z","createLogger","logger","createLogger","logger","randomUUID","createLogger","logger","join","mkdir","rm","createLogger","readFile","readdir","stat","join","extname","createLogger","logger","items","logger","createLogger","join","rm","mkdir","readFile","writeFile","mkdir","join","createLogger","logger","createLogger","join","readFile","mkdir","writeFile"]}
1
+ {"version":3,"sources":["../src/builder/cursor-builder.ts","../src/permissions/permission-presets.ts","../src/builder/claude-code-builder.ts","../src/builder/custom-builder.ts","../src/builder/workspace-builder.ts","../src/builder/handlers/skills-handler.ts","../src/builder/handlers/prompts-handler.ts","../src/builder/handlers/mcp-servers-handler.ts","../src/builder/handlers/workflow-handler.ts","../src/builder/handlers/plugins-handler.ts","../src/scheduler/task-queue.ts","../src/scheduler/execution-log.ts","../src/scheduler/task-dispatcher.ts","../src/scheduler/employee-scheduler.ts","../src/scheduler/inputs/input-router.ts","../src/scheduler/inputs/heartbeat-input.ts","../src/scheduler/inputs/cron-input.ts","../src/scheduler/inputs/hook-input.ts","../src/scheduler/schedule-config.ts","../src/template/schema/template-schema.ts","../src/template/loader/template-loader.ts","../src/provider/model-provider-registry.ts","../src/template/schema/config-validators.ts","../src/template/registry/template-registry.ts","../src/domain/base-component-manager.ts","../src/template/watcher/template-file-watcher.ts","../src/initializer/agent-initializer.ts","../src/state/instance-meta-schema.ts","../src/state/instance-meta-io.ts","../src/state/instance-registry.ts","../src/initializer/pipeline/initialization-pipeline.ts","../src/initializer/context/context-materializer.ts","../src/initializer/pipeline/step-executor.ts","../src/initializer/pipeline/step-registry.ts","../src/initializer/steps/mkdir-step.ts","../src/initializer/steps/exec-step.ts","../src/initializer/steps/file-copy-step.ts","../src/initializer/steps/git-clone-step.ts","../src/initializer/steps/npm-install-step.ts","../src/initializer/steps/index.ts","../src/manager/agent-manager.ts","../src/domain/backend/backend-manager.ts","../src/domain/backend/backend-schema.ts","../src/manager/launcher/backend-registry.ts","../src/manager/launcher/builtin-backends.ts","../src/manager/launcher/backend-resolver.ts","../src/manager/launcher/process-watcher.ts","../src/manager/launcher/process-utils.ts","../src/manager/launch-mode-handler.ts","../src/manager/restart-tracker.ts","../src/communicator/claude-code-communicator.ts","../src/communicator/cursor-communicator.ts","../src/communicator/create-communicator.ts","../src/manager/launcher/mock-launcher.ts","../src/manager/launcher/process-launcher.ts","../src/manager/launcher/process-log-writer.ts","../src/manager/launcher/create-launcher.ts","../src/domain/skill/skill-manager.ts","../src/domain/prompt/prompt-manager.ts","../src/domain/mcp/mcp-config-manager.ts","../src/domain/workflow/workflow-manager.ts","../src/domain/plugin/plugin-manager.ts","../src/permissions/permission-policy-enforcer.ts","../src/permissions/permission-audit.ts","../src/session/session-registry.ts","../src/source/github-source.ts","../src/source/local-source.ts","../src/source/source-manager.ts","../src/version/sync-report.ts","../src/source/source-validator.ts","../src/source/source-schemas.ts","../src/provider/builtin-providers.ts"],"sourcesContent":["import { writeFile, mkdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n AgentBackendType,\n SkillDefinition,\n PromptDefinition,\n McpServerDefinition,\n WorkflowDefinition,\n PluginDefinition,\n PermissionsInput,\n} from \"@actant/shared\";\nimport { createLogger } from \"@actant/shared\";\nimport type { BackendBuilder, VerifyResult } from \"./backend-builder\";\nimport { resolvePermissionsWithMcp } from \"../permissions/permission-presets\";\n\nconst logger = createLogger(\"cursor-builder\");\n\nexport class CursorBuilder implements BackendBuilder {\n readonly backendType: AgentBackendType = \"cursor\";\n\n async scaffold(workspaceDir: string): Promise<void> {\n await mkdir(join(workspaceDir, \".cursor\", \"rules\"), { recursive: true });\n await mkdir(join(workspaceDir, \"prompts\"), { recursive: true });\n await writeFile(join(workspaceDir, \"AGENTS.md\"), \"# Agent Skills\\n\", \"utf-8\");\n }\n\n async materializeSkills(workspaceDir: string, skills: SkillDefinition[]): Promise<void> {\n const rulesDir = join(workspaceDir, \".cursor\", \"rules\");\n for (const skill of skills) {\n const fileName = `${skill.name.replace(/[/\\\\]/g, \"-\")}.mdc`;\n const content = [\n \"---\",\n `description: \"${(skill.description ?? skill.name).replace(/\"/g, '\\\\\"')}\"`,\n \"alwaysApply: true\",\n \"---\",\n \"\",\n skill.content,\n \"\",\n ].join(\"\\n\");\n await writeFile(join(rulesDir, fileName), content, \"utf-8\");\n }\n const sections = skills.map((s) => {\n const header = `## ${s.name}`;\n const desc = s.description ? `\\n> ${s.description}\\n` : \"\";\n return `${header}${desc}\\n${s.content}`;\n });\n const agentsContent = `# Agent Skills\\n\\n${sections.join(\"\\n\\n---\\n\\n\")}\\n`;\n await writeFile(join(workspaceDir, \"AGENTS.md\"), agentsContent, \"utf-8\");\n logger.debug({ workspaceDir, count: skills.length }, \"Skills materialized\");\n }\n\n async materializePrompts(workspaceDir: string, prompts: PromptDefinition[]): Promise<void> {\n const content = prompts\n .map((p) => {\n const lines = [`## ${p.name}`];\n if (p.description) lines.push(`\\n> ${p.description}\\n`);\n lines.push(\"\", p.content);\n return lines.join(\"\\n\");\n })\n .join(\"\\n\\n---\\n\\n\");\n await writeFile(join(workspaceDir, \"prompts\", \"system.md\"), content + \"\\n\", \"utf-8\");\n }\n\n async materializeMcpConfig(workspaceDir: string, servers: McpServerDefinition[]): Promise<void> {\n const configDir = join(workspaceDir, \".cursor\");\n await mkdir(configDir, { recursive: true });\n\n const mcpConfig: Record<\n string,\n { command: string; args: string[]; env?: Record<string, string> }\n > = {};\n for (const server of servers) {\n mcpConfig[server.name] = {\n command: server.command,\n args: server.args ?? [],\n ...(server.env && Object.keys(server.env).length > 0 ? { env: server.env } : {}),\n };\n }\n await writeFile(\n join(configDir, \"mcp.json\"),\n JSON.stringify({ mcpServers: mcpConfig }, null, 2) + \"\\n\",\n \"utf-8\",\n );\n }\n\n async materializePlugins(workspaceDir: string, plugins: PluginDefinition[]): Promise<void> {\n const npmPlugins = plugins.filter((p) => p.enabled !== false && p.type === \"npm\");\n if (npmPlugins.length === 0) return;\n\n const configDir = join(workspaceDir, \".cursor\");\n await mkdir(configDir, { recursive: true });\n const recommendations = npmPlugins.map((p) => p.source ?? p.name);\n await writeFile(\n join(configDir, \"extensions.json\"),\n JSON.stringify({ recommendations }, null, 2) + \"\\n\",\n \"utf-8\",\n );\n }\n\n async materializeWorkflow(workspaceDir: string, workflow: WorkflowDefinition): Promise<void> {\n const trellisDir = join(workspaceDir, \".trellis\");\n await mkdir(trellisDir, { recursive: true });\n await writeFile(join(trellisDir, \"workflow.md\"), workflow.content + \"\\n\", \"utf-8\");\n }\n\n async injectPermissions(\n workspaceDir: string,\n servers: McpServerDefinition[],\n permissions?: PermissionsInput,\n ): Promise<void> {\n // Cursor doesn't have the same permission model as Claude Code.\n // Best-effort: write .cursor/settings.json with allowed tools if we have permissions.\n if (!permissions) return;\n\n const resolved = resolvePermissionsWithMcp(\n permissions,\n servers.map((s) => s.name),\n );\n if (!resolved.allow?.length) return;\n\n try {\n const configDir = join(workspaceDir, \".cursor\");\n await mkdir(configDir, { recursive: true });\n const settings = {\n // Cursor may support agent tool allowlist; structure is best-effort\n agentTools: { allow: resolved.allow },\n };\n await writeFile(\n join(configDir, \"settings.json\"),\n JSON.stringify(settings, null, 2) + \"\\n\",\n \"utf-8\",\n );\n } catch {\n logger.warn(\n \"Cursor permission model differs from Claude Code; .cursor/settings.json injection skipped\",\n );\n }\n }\n\n async verify(workspaceDir: string): Promise<VerifyResult> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n const checks = [\n { path: \".cursor\", type: \"dir\" as const },\n { path: \"AGENTS.md\", type: \"file\" as const },\n ];\n\n for (const check of checks) {\n try {\n const s = await stat(join(workspaceDir, check.path));\n if (check.type === \"dir\" && !s.isDirectory()) {\n errors.push(`Expected directory: ${check.path}`);\n } else if (check.type === \"file\" && !s.isFile()) {\n errors.push(`Expected file: ${check.path}`);\n }\n } catch {\n warnings.push(`Missing: ${check.path}`);\n }\n }\n\n return { valid: errors.length === 0, errors, warnings };\n }\n}\n","import type { PermissionsConfig, PermissionsInput } from \"@actant/shared\";\n\nconst PRESETS: Record<string, PermissionsConfig> = {\n permissive: {\n allow: [\"*\"],\n deny: [],\n ask: [],\n defaultMode: \"bypassPermissions\",\n },\n standard: {\n allow: [\n \"Read\",\n \"Edit\",\n \"Write\",\n \"Bash(npm run *)\",\n \"Bash(git *)\",\n \"WebFetch\",\n \"WebSearch\",\n ],\n deny: [],\n ask: [\"Bash\"],\n defaultMode: \"default\",\n },\n restricted: {\n allow: [\"Read\", \"WebSearch\"],\n deny: [\"Bash\", \"WebFetch\"],\n ask: [\"Edit\", \"Write\"],\n defaultMode: \"dontAsk\",\n },\n readonly: {\n allow: [\"Read\", \"WebFetch\", \"WebSearch\"],\n deny: [\"Bash\", \"Edit\", \"Write\", \"MultiEdit\"],\n ask: [],\n defaultMode: \"plan\",\n },\n};\n\nexport function resolvePermissions(input: PermissionsInput | undefined): PermissionsConfig {\n if (!input) return { ...PRESETS.permissive };\n if (typeof input === \"string\") {\n const preset = PRESETS[input];\n if (!preset) throw new Error(`Unknown permission preset: ${input}`);\n return { ...preset };\n }\n return { ...input };\n}\n\nexport function resolvePermissionsWithMcp(\n input: PermissionsInput | undefined,\n mcpServerNames: string[],\n): PermissionsConfig {\n const resolved = resolvePermissions(input);\n const allow = [...(resolved.allow ?? [])];\n // Auto-append MCP tools to allow list (unless wildcard already covers everything)\n if (!allow.includes(\"*\") && mcpServerNames.length > 0) {\n for (const name of mcpServerNames) {\n allow.push(`mcp__${name}`);\n }\n }\n return { ...resolved, allow };\n}\n","import { writeFile, mkdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n SkillDefinition,\n PromptDefinition,\n McpServerDefinition,\n WorkflowDefinition,\n PluginDefinition,\n PermissionsInput,\n} from \"@actant/shared\";\nimport { createLogger } from \"@actant/shared\";\nimport type { BackendBuilder, VerifyResult } from \"./backend-builder\";\nimport { resolvePermissionsWithMcp } from \"../permissions/permission-presets\";\n\nconst logger = createLogger(\"claude-code-builder\");\n\nexport class ClaudeCodeBuilder implements BackendBuilder {\n readonly backendType = \"claude-code\" as const;\n\n async scaffold(workspaceDir: string): Promise<void> {\n await mkdir(join(workspaceDir, \".claude\"), { recursive: true });\n await mkdir(join(workspaceDir, \"prompts\"), { recursive: true });\n }\n\n async materializeSkills(workspaceDir: string, skills: SkillDefinition[]): Promise<void> {\n const sections = skills.map((s) => {\n const header = `## ${s.name}`;\n const desc = s.description ? `\\n> ${s.description}\\n` : \"\";\n return `${header}${desc}\\n${s.content}`;\n });\n const agentsContent = `# Agent Skills\\n\\n${sections.join(\"\\n\\n---\\n\\n\")}\\n`;\n await writeFile(join(workspaceDir, \"AGENTS.md\"), agentsContent, \"utf-8\");\n\n const claudeContent = `# Claude Code Skills\\n\\n${sections.join(\"\\n\\n---\\n\\n\")}\\n`;\n await writeFile(join(workspaceDir, \"CLAUDE.md\"), claudeContent, \"utf-8\");\n logger.debug({ workspaceDir, count: skills.length }, \"Skills materialized\");\n }\n\n async materializePrompts(workspaceDir: string, prompts: PromptDefinition[]): Promise<void> {\n const content = prompts\n .map((p) => {\n const lines = [`## ${p.name}`];\n if (p.description) lines.push(`\\n> ${p.description}\\n`);\n lines.push(\"\", p.content);\n return lines.join(\"\\n\");\n })\n .join(\"\\n\\n---\\n\\n\");\n await writeFile(join(workspaceDir, \"prompts\", \"system.md\"), content + \"\\n\", \"utf-8\");\n }\n\n async materializeMcpConfig(workspaceDir: string, servers: McpServerDefinition[]): Promise<void> {\n const configDir = join(workspaceDir, \".claude\");\n await mkdir(configDir, { recursive: true });\n\n const mcpConfig: Record<\n string,\n { command: string; args: string[]; env?: Record<string, string> }\n > = {};\n for (const server of servers) {\n mcpConfig[server.name] = {\n command: server.command,\n args: server.args ?? [],\n ...(server.env && Object.keys(server.env).length > 0 ? { env: server.env } : {}),\n };\n }\n await writeFile(\n join(configDir, \"mcp.json\"),\n JSON.stringify({ mcpServers: mcpConfig }, null, 2) + \"\\n\",\n \"utf-8\",\n );\n }\n\n async materializePlugins(workspaceDir: string, plugins: PluginDefinition[]): Promise<void> {\n const enabledPlugins = plugins.filter((p) => p.enabled !== false);\n if (enabledPlugins.length === 0) return;\n\n const configDir = join(workspaceDir, \".claude\");\n await mkdir(configDir, { recursive: true });\n const entries = enabledPlugins.map((p) => {\n if (p.type === \"npm\") {\n return { name: p.name, package: p.source ?? p.name, ...p.config };\n }\n return { name: p.name, type: p.type, source: p.source, ...p.config };\n });\n await writeFile(\n join(configDir, \"plugins.json\"),\n JSON.stringify(entries, null, 2) + \"\\n\",\n \"utf-8\",\n );\n }\n\n async materializeWorkflow(workspaceDir: string, workflow: WorkflowDefinition): Promise<void> {\n const trellisDir = join(workspaceDir, \".trellis\");\n await mkdir(trellisDir, { recursive: true });\n await writeFile(join(trellisDir, \"workflow.md\"), workflow.content + \"\\n\", \"utf-8\");\n }\n\n async injectPermissions(\n workspaceDir: string,\n servers: McpServerDefinition[],\n permissions?: PermissionsInput,\n ): Promise<void> {\n const configDir = join(workspaceDir, \".claude\");\n await mkdir(configDir, { recursive: true });\n\n const resolved = resolvePermissionsWithMcp(\n permissions,\n servers.map((s) => s.name),\n );\n\n const settings: Record<string, unknown> = {\n permissions: {\n allow: resolved.allow ?? [],\n deny: resolved.deny ?? [],\n ask: resolved.ask ?? [],\n },\n };\n if (resolved.sandbox) {\n settings.sandbox = resolved.sandbox;\n }\n await writeFile(\n join(configDir, \"settings.local.json\"),\n JSON.stringify(settings, null, 2) + \"\\n\",\n \"utf-8\",\n );\n }\n\n async verify(workspaceDir: string): Promise<VerifyResult> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n const checks = [\n { path: \".claude\", type: \"dir\" as const },\n { path: \"AGENTS.md\", type: \"file\" as const },\n { path: \"CLAUDE.md\", type: \"file\" as const },\n ];\n\n for (const check of checks) {\n try {\n const s = await stat(join(workspaceDir, check.path));\n if (check.type === \"dir\" && !s.isDirectory()) {\n errors.push(`Expected directory: ${check.path}`);\n } else if (check.type === \"file\" && !s.isFile()) {\n errors.push(`Expected file: ${check.path}`);\n }\n } catch {\n warnings.push(`Missing: ${check.path}`);\n }\n }\n\n return { valid: errors.length === 0, errors, warnings };\n }\n}\n","import type { AgentBackendType } from \"@actant/shared\";\nimport { CursorBuilder } from \"./cursor-builder\";\n\nexport interface CustomBuilderConfig {\n configDir?: string; // default \".cursor\"\n skillsDir?: string; // default \".cursor/rules\"\n // Additional overrides...\n}\n\nexport class CustomBuilder extends CursorBuilder {\n override readonly backendType: AgentBackendType = \"custom\";\n\n // CustomBuilder inherits CursorBuilder behavior but with \"custom\" type\n // Future: use config to customize paths\n}\n","import { createLogger } from \"@actant/shared\";\nimport type {\n AgentBackendType,\n DomainContextConfig,\n McpServerDefinition,\n PermissionsInput,\n} from \"@actant/shared\";\nimport type { SkillManager } from \"../domain/skill/skill-manager\";\nimport type { PromptManager } from \"../domain/prompt/prompt-manager\";\nimport type { McpConfigManager } from \"../domain/mcp/mcp-config-manager\";\nimport type { WorkflowManager } from \"../domain/workflow/workflow-manager\";\nimport type { PluginManager } from \"../domain/plugin/plugin-manager\";\nimport type { BaseComponentManager, NamedComponent } from \"../domain/base-component-manager\";\nimport type { BackendBuilder, VerifyResult } from \"./backend-builder\";\nimport type { ComponentTypeHandler } from \"./component-type-handler\";\nimport { CursorBuilder } from \"./cursor-builder\";\nimport { ClaudeCodeBuilder } from \"./claude-code-builder\";\nimport {\n skillsHandler,\n promptsHandler,\n mcpServersHandler,\n workflowHandler,\n pluginsHandler,\n} from \"./handlers\";\n\nconst logger = createLogger(\"workspace-builder\");\n\nexport interface DomainManagers {\n skills?: SkillManager;\n prompts?: PromptManager;\n mcp?: McpConfigManager;\n workflows?: WorkflowManager;\n plugins?: PluginManager;\n}\n\nexport interface WorkspaceBuildResult {\n verify: VerifyResult;\n backendType: AgentBackendType;\n}\n\nexport class WorkspaceBuilder {\n private readonly builders: Map<AgentBackendType, BackendBuilder>;\n private readonly handlers: ComponentTypeHandler[] = [];\n\n constructor(private readonly managers?: DomainManagers) {\n this.builders = new Map<AgentBackendType, BackendBuilder>([\n [\"cursor\", new CursorBuilder()],\n [\"claude-code\", new ClaudeCodeBuilder()],\n ]);\n this.handlers.push(skillsHandler, promptsHandler, mcpServersHandler, workflowHandler, pluginsHandler);\n }\n\n /** Register a custom BackendBuilder (e.g. for \"custom\" backend type) */\n registerBuilder(builder: BackendBuilder): void {\n this.builders.set(builder.backendType, builder);\n }\n\n /** Register a component type handler for custom component types or extensions */\n registerHandler(handler: ComponentTypeHandler): void {\n this.handlers.push(handler);\n }\n\n private getManager(contextKey: string): BaseComponentManager<NamedComponent> | undefined {\n const managerMap: Record<string, BaseComponentManager<NamedComponent> | undefined> = {\n skills: this.managers?.skills,\n prompts: this.managers?.prompts,\n mcpServers: this.managers?.mcp,\n workflow: this.managers?.workflows,\n plugins: this.managers?.plugins,\n };\n return managerMap[contextKey];\n }\n\n /**\n * Build workspace using the 6-step pipeline:\n * 1. Resolve — select builder + resolve domain context names to definitions\n * 2. Validate — check that required components exist\n * 3. Scaffold — create directory structure\n * 4. Materialize — write component files\n * 5. Inject — set up permissions\n * 6. Verify — check workspace integrity\n */\n async build(\n workspaceDir: string,\n domainContext: DomainContextConfig,\n backendType: AgentBackendType = \"cursor\",\n permissions?: PermissionsInput,\n ): Promise<WorkspaceBuildResult> {\n // Step 1: Resolve\n let builder = this.builders.get(backendType);\n if (!builder) {\n logger.warn({ backendType }, \"No builder registered, falling back to cursor\");\n builder = this.builders.get(\"cursor\");\n }\n if (!builder) {\n throw new Error(`No builder available for backend type: ${backendType}`);\n }\n const activeBuilder = builder;\n\n // Step 2: Validate (log warnings for missing references, don't fail)\n // Already handled by resolve — missing managers use placeholders or empty arrays\n\n // Step 3: Scaffold\n await activeBuilder.scaffold(workspaceDir);\n logger.debug({ workspaceDir }, \"Scaffold complete\");\n\n // Step 4: Materialize via registered handlers\n let resolvedMcpServers: McpServerDefinition[] = [];\n\n for (const handler of this.handlers) {\n const refs = domainContext[handler.contextKey as keyof DomainContextConfig];\n if (refs === undefined || refs === null) continue;\n if (Array.isArray(refs) && refs.length === 0) continue;\n\n const manager = this.getManager(handler.contextKey);\n const definitions = handler.resolve(refs, manager);\n if (definitions.length > 0) {\n await handler.materialize(workspaceDir, definitions, backendType, activeBuilder);\n if (handler.contextKey === \"mcpServers\") {\n resolvedMcpServers = definitions as McpServerDefinition[];\n }\n }\n }\n\n if (domainContext.extensions) {\n for (const [key, refs] of Object.entries(domainContext.extensions)) {\n const handler = this.handlers.find((h) => h.contextKey === key);\n if (handler && Array.isArray(refs) && refs.length > 0) {\n const defs = handler.resolve(refs, this.getManager(key));\n if (defs.length > 0) {\n await handler.materialize(workspaceDir, defs, backendType, activeBuilder);\n if (handler.contextKey === \"mcpServers\") {\n resolvedMcpServers = [...resolvedMcpServers, ...(defs as McpServerDefinition[])];\n }\n }\n }\n }\n }\n\n logger.debug({ workspaceDir }, \"Materialize complete\");\n\n // Step 5: Inject permissions\n await activeBuilder.injectPermissions(workspaceDir, resolvedMcpServers, permissions);\n logger.debug({ workspaceDir }, \"Permissions injected\");\n\n // Step 6: Verify\n const verify = await activeBuilder.verify(workspaceDir);\n logger.info({ workspaceDir, backendType: activeBuilder.backendType, valid: verify.valid }, \"Workspace build complete\");\n\n return { verify, backendType: activeBuilder.backendType };\n }\n}\n","import type { SkillDefinition } from \"@actant/shared\";\nimport type { ComponentTypeHandler } from \"../component-type-handler\";\nimport type { BackendBuilder } from \"../backend-builder\";\n\nexport const skillsHandler: ComponentTypeHandler<SkillDefinition> = {\n contextKey: \"skills\",\n resolve(refs, manager) {\n if (!refs || !Array.isArray(refs) || refs.length === 0) return [];\n return (manager?.resolve(refs as string[]) ?? refs.map((name) => ({ name, content: `- ${name}` }))) as SkillDefinition[];\n },\n async materialize(workspaceDir, definitions, _backendType, builder) {\n await (builder as BackendBuilder).materializeSkills(workspaceDir, definitions);\n },\n};\n","import type { PromptDefinition } from \"@actant/shared\";\nimport type { ComponentTypeHandler } from \"../component-type-handler\";\nimport type { BackendBuilder } from \"../backend-builder\";\n\nexport const promptsHandler: ComponentTypeHandler<PromptDefinition> = {\n contextKey: \"prompts\",\n resolve(refs, manager) {\n if (!refs || !Array.isArray(refs) || refs.length === 0) return [];\n return (manager?.resolve(refs as string[]) ?? refs.map((name) => ({ name, content: `- ${name}` }))) as PromptDefinition[];\n },\n async materialize(workspaceDir, definitions, _backendType, builder) {\n await (builder as BackendBuilder).materializePrompts(workspaceDir, definitions);\n },\n};\n","import type { McpServerDefinition, McpServerRef } from \"@actant/shared\";\nimport type { ComponentTypeHandler } from \"../component-type-handler\";\nimport type { BackendBuilder } from \"../backend-builder\";\n\nfunction isMcpServerRef(obj: unknown): obj is McpServerRef {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"name\" in obj &&\n \"command\" in obj &&\n typeof (obj as McpServerRef).name === \"string\" &&\n typeof (obj as McpServerRef).command === \"string\"\n );\n}\n\nexport const mcpServersHandler: ComponentTypeHandler<McpServerDefinition> = {\n contextKey: \"mcpServers\",\n resolve(refs, manager) {\n if (!refs || !Array.isArray(refs) || refs.length === 0) return [];\n const arr = refs as unknown[];\n if (arr.every(isMcpServerRef)) {\n return arr.map((ref) => ({\n name: ref.name,\n command: ref.command,\n args: ref.args,\n env: ref.env,\n })) as McpServerDefinition[];\n }\n return (manager?.resolve(arr as string[]) ?? []) as McpServerDefinition[];\n },\n async materialize(workspaceDir, definitions, _backendType, builder) {\n await (builder as BackendBuilder).materializeMcpConfig(workspaceDir, definitions);\n },\n};\n","import type { WorkflowDefinition } from \"@actant/shared\";\nimport type { ComponentTypeHandler } from \"../component-type-handler\";\nimport type { BackendBuilder } from \"../backend-builder\";\n\nexport const workflowHandler: ComponentTypeHandler<WorkflowDefinition> = {\n contextKey: \"workflow\",\n resolve(refs, manager) {\n if (refs === undefined || refs === null) return [];\n const name =\n typeof refs === \"string\" ? refs : Array.isArray(refs) && typeof refs[0] === \"string\" ? refs[0] : undefined;\n if (!name) return [];\n const resolved = manager?.resolve([name]);\n if (resolved && resolved.length > 0) return resolved as WorkflowDefinition[];\n return [\n {\n name,\n content: `# Workflow: ${name}\\n\\n> Workflow \"${name}\" referenced by name.\\n`,\n } as WorkflowDefinition,\n ];\n },\n async materialize(workspaceDir, definitions, _backendType, builder) {\n const wf = definitions[0];\n if (wf) {\n await (builder as BackendBuilder).materializeWorkflow(workspaceDir, wf);\n }\n },\n};\n","import type { PluginDefinition } from \"@actant/shared\";\nimport type { ComponentTypeHandler } from \"../component-type-handler\";\nimport type { BackendBuilder } from \"../backend-builder\";\n\nexport const pluginsHandler: ComponentTypeHandler<PluginDefinition> = {\n contextKey: \"plugins\",\n resolve(refs, manager) {\n if (!refs || !Array.isArray(refs) || refs.length === 0) return [];\n return (manager?.resolve(refs as string[]) ?? []) as PluginDefinition[];\n },\n async materialize(workspaceDir, definitions, _backendType, builder) {\n await (builder as BackendBuilder).materializePlugins(workspaceDir, definitions);\n },\n};\n","import type { AgentTask, TaskPriority } from \"./types\";\n\nconst PRIORITY_ORDER: Record<TaskPriority, number> = {\n critical: 0,\n high: 1,\n normal: 2,\n low: 3,\n};\n\nexport class TaskQueue {\n private queues = new Map<string, AgentTask[]>();\n private processing = new Set<string>();\n\n /** Enqueue a task. Sorts by priority. */\n enqueue(task: AgentTask): void {\n if (!this.queues.has(task.agentName)) {\n this.queues.set(task.agentName, []);\n }\n const queue = this.queues.get(task.agentName) ?? [];\n queue.push(task);\n queue.sort((a, b) => PRIORITY_ORDER[a.priority] - PRIORITY_ORDER[b.priority]);\n }\n\n /** Dequeue the highest-priority task for an agent. Returns undefined if empty or agent is processing. */\n dequeue(agentName: string): AgentTask | undefined {\n if (this.processing.has(agentName)) return undefined;\n const queue = this.queues.get(agentName);\n if (!queue || queue.length === 0) return undefined;\n return queue.shift();\n }\n\n /** Mark an agent as currently processing (serial execution). */\n markProcessing(agentName: string): void {\n this.processing.add(agentName);\n }\n\n /** Mark an agent as done processing. */\n markDone(agentName: string): void {\n this.processing.delete(agentName);\n }\n\n /** Check if an agent has queued tasks. */\n hasTasks(agentName: string): boolean {\n const queue = this.queues.get(agentName);\n return !!queue && queue.length > 0;\n }\n\n /** Check if an agent is currently processing a task. */\n isProcessing(agentName: string): boolean {\n return this.processing.has(agentName);\n }\n\n /** Get the number of queued tasks for an agent. */\n queueSize(agentName: string): number {\n return this.queues.get(agentName)?.length ?? 0;\n }\n\n /** Get all queued tasks for an agent. */\n peek(agentName: string): AgentTask[] {\n return [...(this.queues.get(agentName) ?? [])];\n }\n\n /** Clear all tasks for an agent. */\n clear(agentName: string): void {\n this.queues.delete(agentName);\n this.processing.delete(agentName);\n }\n\n /** Clear all queues. */\n clearAll(): void {\n this.queues.clear();\n this.processing.clear();\n }\n}\n","import { writeFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { createLogger } from \"@actant/shared\";\nimport type { ExecutionRecord } from \"./types\";\n\nconst logger = createLogger(\"execution-log\");\n\nexport class ExecutionLog {\n private records: ExecutionRecord[] = [];\n private persistDir?: string;\n private maxInMemory = 1000;\n\n setPersistDir(dir: string): void {\n this.persistDir = dir;\n }\n\n setMaxInMemory(max: number): void {\n this.maxInMemory = max;\n }\n\n async record(entry: ExecutionRecord): Promise<void> {\n this.records.push(entry);\n\n // Trim old records if over limit\n if (this.records.length > this.maxInMemory) {\n this.records = this.records.slice(-this.maxInMemory);\n }\n\n if (this.persistDir) {\n await this.persistRecord(entry);\n }\n }\n\n /** Get recent execution records, optionally filtered by agent. */\n getRecords(agentName?: string, limit = 50): ExecutionRecord[] {\n let filtered = this.records;\n if (agentName) {\n filtered = filtered.filter((r) => r.agentName === agentName);\n }\n return filtered.slice(-limit);\n }\n\n /** Get the last execution record for an agent. */\n getLastRecord(agentName: string): ExecutionRecord | undefined {\n for (let i = this.records.length - 1; i >= 0; i--) {\n const record = this.records[i];\n if (record?.agentName === agentName) return record;\n }\n return undefined;\n }\n\n /** Count records by status for an agent. */\n getStats(agentName?: string): Record<string, number> {\n const filtered = agentName\n ? this.records.filter((r) => r.agentName === agentName)\n : this.records;\n\n const stats: Record<string, number> = {};\n for (const r of filtered) {\n stats[r.status] = (stats[r.status] ?? 0) + 1;\n }\n return stats;\n }\n\n clear(): void {\n this.records = [];\n }\n\n private async persistRecord(entry: ExecutionRecord): Promise<void> {\n if (!this.persistDir) return;\n try {\n await mkdir(this.persistDir, { recursive: true });\n const filePath = join(this.persistDir, `${entry.agentName}-log.jsonl`);\n await writeFile(filePath, JSON.stringify(entry) + \"\\n\", { flag: \"a\" });\n } catch (err) {\n logger.warn({ err, taskId: entry.taskId }, \"Failed to persist execution record\");\n }\n }\n}\n","import { createLogger } from \"@actant/shared\";\nimport type { AgentTask, ExecutionRecord } from \"./types\";\nimport type { TaskQueue } from \"./task-queue\";\nimport type { ExecutionLog } from \"./execution-log\";\n\nconst logger = createLogger(\"task-dispatcher\");\n\nexport interface PromptAgentFn {\n (agentName: string, prompt: string): Promise<string>;\n}\n\nexport class TaskDispatcher {\n private running = false;\n private dispatchInterval: ReturnType<typeof setInterval> | null = null;\n private agentNames = new Set<string>();\n\n constructor(\n private readonly queue: TaskQueue,\n private readonly log: ExecutionLog,\n private readonly promptAgent: PromptAgentFn,\n private readonly pollIntervalMs = 1000,\n ) {}\n\n /** Register an agent name to be dispatched. */\n registerAgent(agentName: string): void {\n this.agentNames.add(agentName);\n }\n\n /** Unregister an agent. */\n unregisterAgent(agentName: string): void {\n this.agentNames.delete(agentName);\n this.queue.clear(agentName);\n }\n\n /** Start the dispatch loop. */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.dispatchInterval = setInterval(() => {\n void this.tick();\n }, this.pollIntervalMs);\n logger.info(\"TaskDispatcher started\");\n }\n\n /** Stop the dispatch loop. */\n stop(): void {\n this.running = false;\n if (this.dispatchInterval) {\n clearInterval(this.dispatchInterval);\n this.dispatchInterval = null;\n }\n logger.info(\"TaskDispatcher stopped\");\n }\n\n /** Manual dispatch — process one tick immediately. */\n async tick(): Promise<void> {\n for (const agentName of this.agentNames) {\n if (this.queue.isProcessing(agentName)) continue;\n\n const task = this.queue.dequeue(agentName);\n if (!task) continue;\n\n // Process asynchronously (non-blocking for other agents)\n void this.executeTask(task);\n }\n }\n\n private async executeTask(task: AgentTask): Promise<void> {\n this.queue.markProcessing(task.agentName);\n const startedAt = new Date().toISOString();\n\n const record: ExecutionRecord = {\n taskId: task.id,\n agentName: task.agentName,\n prompt: task.prompt,\n source: task.source,\n status: \"running\",\n startedAt,\n };\n\n try {\n logger.debug(\n { taskId: task.id, agentName: task.agentName, source: task.source },\n \"Executing task\",\n );\n const result = await this.promptAgent(task.agentName, task.prompt);\n\n record.status = \"completed\";\n record.result = result;\n record.completedAt = new Date().toISOString();\n record.durationMs = Date.now() - new Date(startedAt).getTime();\n\n logger.info({ taskId: task.id, durationMs: record.durationMs }, \"Task completed\");\n } catch (err) {\n record.status = \"failed\";\n record.error = err instanceof Error ? err.message : String(err);\n record.completedAt = new Date().toISOString();\n record.durationMs = Date.now() - new Date(startedAt).getTime();\n\n logger.warn({ taskId: task.id, error: record.error }, \"Task failed\");\n } finally {\n this.queue.markDone(task.agentName);\n await this.log.record(record);\n }\n }\n\n get isRunning(): boolean {\n return this.running;\n }\n}\n","import { EventEmitter } from \"node:events\";\nimport { randomUUID } from \"node:crypto\";\nimport { createLogger } from \"@actant/shared\";\nimport { TaskQueue } from \"./task-queue\";\nimport { TaskDispatcher, type PromptAgentFn } from \"./task-dispatcher\";\nimport { ExecutionLog } from \"./execution-log\";\nimport { InputRouter } from \"./inputs/input-router\";\nimport { HeartbeatInput } from \"./inputs/heartbeat-input\";\nimport { CronInput } from \"./inputs/cron-input\";\nimport { HookInput } from \"./inputs/hook-input\";\nimport type { ScheduleConfigInput } from \"./schedule-config\";\n\nconst logger = createLogger(\"employee-scheduler\");\n\nexport class EmployeeScheduler {\n private readonly queue: TaskQueue;\n private readonly dispatcher: TaskDispatcher;\n private readonly log: ExecutionLog;\n private readonly router: InputRouter;\n private readonly eventBus: EventEmitter;\n private _running = false;\n\n constructor(\n private readonly agentName: string,\n promptAgent: PromptAgentFn,\n config?: { persistDir?: string },\n ) {\n this.queue = new TaskQueue();\n this.log = new ExecutionLog();\n if (config?.persistDir) {\n this.log.setPersistDir(config.persistDir);\n }\n this.dispatcher = new TaskDispatcher(this.queue, this.log, promptAgent);\n this.router = new InputRouter(this.queue);\n this.eventBus = new EventEmitter();\n }\n\n /** Configure schedule from template config. */\n configure(scheduleConfig: ScheduleConfigInput): void {\n if (scheduleConfig.heartbeat) {\n this.router.register(new HeartbeatInput(scheduleConfig.heartbeat));\n }\n for (const cronConfig of scheduleConfig.cron ?? []) {\n this.router.register(new CronInput(cronConfig));\n }\n for (const hookConfig of scheduleConfig.hooks ?? []) {\n this.router.register(new HookInput(hookConfig, this.eventBus));\n }\n logger.info({ agentName: this.agentName, sources: this.router.sourceCount }, \"Schedule configured\");\n }\n\n /** Start the scheduler — begins accepting and dispatching tasks. */\n start(): void {\n if (this._running) return;\n this._running = true;\n this.dispatcher.registerAgent(this.agentName);\n this.router.startAll(this.agentName);\n this.dispatcher.start();\n logger.info({ agentName: this.agentName }, \"EmployeeScheduler started\");\n }\n\n /** Stop the scheduler. */\n stop(): void {\n if (!this._running) return;\n this.router.stopAll();\n this.dispatcher.stop();\n this.dispatcher.unregisterAgent(this.agentName);\n this._running = false;\n logger.info({ agentName: this.agentName }, \"EmployeeScheduler stopped\");\n }\n\n /** Manually dispatch a one-off task. */\n dispatch(prompt: string, priority: \"low\" | \"normal\" | \"high\" | \"critical\" = \"normal\"): void {\n this.queue.enqueue({\n id: randomUUID(),\n agentName: this.agentName,\n prompt,\n priority,\n source: \"manual\",\n createdAt: new Date().toISOString(),\n });\n }\n\n /** Emit an event to trigger HookInput sources. */\n emitEvent(eventName: string, payload?: unknown): void {\n this.eventBus.emit(eventName, payload);\n }\n\n /** Get queued tasks. */\n getTasks(): { queued: number; processing: boolean; tasks: unknown[] } {\n return {\n queued: this.queue.queueSize(this.agentName),\n processing: this.queue.isProcessing(this.agentName),\n tasks: this.queue.peek(this.agentName),\n };\n }\n\n /** Get execution logs. */\n getLogs(limit?: number): unknown[] {\n return this.log.getRecords(this.agentName, limit);\n }\n\n /** Get execution stats. */\n getStats(): Record<string, number> {\n return this.log.getStats(this.agentName);\n }\n\n /** Get input sources info. */\n getSources(): { id: string; type: string; active: boolean }[] {\n return this.router.listSources();\n }\n\n get running(): boolean {\n return this._running;\n }\n\n get executionLog(): ExecutionLog {\n return this.log;\n }\n}\n","import { createLogger } from \"@actant/shared\";\nimport type { TaskQueue } from \"../task-queue\";\nimport type { InputSource } from \"./input-source\";\n\nconst logger = createLogger(\"input-router\");\n\nexport class InputRouter {\n private sources = new Map<string, InputSource>();\n private agentName?: string;\n\n constructor(private readonly queue: TaskQueue) {}\n\n /** Register an input source. */\n register(source: InputSource): void {\n if (this.sources.has(source.id)) {\n logger.warn({ id: source.id }, \"Input source already registered, replacing\");\n this.sources.get(source.id)?.stop();\n }\n this.sources.set(source.id, source);\n // If already started, start the new source too\n if (this.agentName) {\n source.start(this.agentName, (task) => this.queue.enqueue(task));\n }\n }\n\n /** Unregister an input source. */\n unregister(sourceId: string): boolean {\n const source = this.sources.get(sourceId);\n if (!source) return false;\n source.stop();\n this.sources.delete(sourceId);\n return true;\n }\n\n /** Start all registered input sources. */\n startAll(agentName: string): void {\n this.agentName = agentName;\n for (const source of this.sources.values()) {\n if (!source.active) {\n source.start(agentName, (task) => this.queue.enqueue(task));\n }\n }\n logger.info({ agentName, sourceCount: this.sources.size }, \"InputRouter started all sources\");\n }\n\n /** Stop all registered input sources. */\n stopAll(): void {\n for (const source of this.sources.values()) {\n source.stop();\n }\n this.agentName = undefined;\n logger.info(\"InputRouter stopped all sources\");\n }\n\n /** Get all registered source IDs. */\n listSources(): { id: string; type: string; active: boolean }[] {\n return Array.from(this.sources.values()).map((s) => ({\n id: s.id,\n type: s.type,\n active: s.active,\n }));\n }\n\n /** Get a specific source by ID. */\n getSource(id: string): InputSource | undefined {\n return this.sources.get(id);\n }\n\n get sourceCount(): number {\n return this.sources.size;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { createLogger } from \"@actant/shared\";\nimport type { InputSource, TaskCallback } from \"./input-source\";\n\nconst logger = createLogger(\"heartbeat-input\");\n\nexport interface HeartbeatConfig {\n intervalMs: number;\n prompt: string;\n priority?: \"low\" | \"normal\" | \"high\" | \"critical\";\n}\n\nexport class HeartbeatInput implements InputSource {\n readonly id: string;\n readonly type = \"heartbeat\";\n private interval: ReturnType<typeof setInterval> | null = null;\n private _active = false;\n\n constructor(private readonly config: HeartbeatConfig, id?: string) {\n this.id = id ?? `heartbeat-${randomUUID().slice(0, 8)}`;\n }\n\n start(agentName: string, onTask: TaskCallback): void {\n if (this._active) return;\n this._active = true;\n this.interval = setInterval(() => {\n onTask({\n id: randomUUID(),\n agentName,\n prompt: this.config.prompt,\n priority: this.config.priority ?? \"normal\",\n source: `heartbeat:${this.id}`,\n createdAt: new Date().toISOString(),\n });\n }, this.config.intervalMs);\n logger.info({ id: this.id, intervalMs: this.config.intervalMs }, \"HeartbeatInput started\");\n }\n\n stop(): void {\n if (!this._active) return;\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n this._active = false;\n logger.info({ id: this.id }, \"HeartbeatInput stopped\");\n }\n\n get active(): boolean {\n return this._active;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { Cron } from \"croner\";\nimport { createLogger } from \"@actant/shared\";\nimport type { InputSource, TaskCallback } from \"./input-source\";\n\nconst logger = createLogger(\"cron-input\");\n\nexport interface CronConfig {\n pattern: string; // e.g. \"0 9 * * *\" (every day at 9am)\n prompt: string;\n timezone?: string; // e.g. \"Asia/Shanghai\"\n priority?: \"low\" | \"normal\" | \"high\" | \"critical\";\n}\n\nexport class CronInput implements InputSource {\n readonly id: string;\n readonly type = \"cron\";\n private job: Cron | null = null;\n private _active = false;\n\n constructor(private readonly config: CronConfig, id?: string) {\n this.id = id ?? `cron-${randomUUID().slice(0, 8)}`;\n }\n\n start(agentName: string, onTask: TaskCallback): void {\n if (this._active) return;\n this._active = true;\n this.job = new Cron(\n this.config.pattern,\n {\n timezone: this.config.timezone,\n },\n () => {\n onTask({\n id: randomUUID(),\n agentName,\n prompt: this.config.prompt,\n priority: this.config.priority ?? \"normal\",\n source: `cron:${this.id}`,\n createdAt: new Date().toISOString(),\n });\n },\n );\n logger.info({ id: this.id, pattern: this.config.pattern }, \"CronInput started\");\n }\n\n stop(): void {\n if (!this._active) return;\n if (this.job) {\n this.job.stop();\n this.job = null;\n }\n this._active = false;\n logger.info({ id: this.id }, \"CronInput stopped\");\n }\n\n get active(): boolean {\n return this._active;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { EventEmitter } from \"node:events\";\nimport { createLogger } from \"@actant/shared\";\nimport type { InputSource, TaskCallback } from \"./input-source\";\n\nconst logger = createLogger(\"hook-input\");\n\nexport interface HookConfig {\n eventName: string;\n prompt: string; // May contain {{payload}} placeholder\n priority?: \"low\" | \"normal\" | \"high\" | \"critical\";\n}\n\nexport class HookInput implements InputSource {\n readonly id: string;\n readonly type = \"hook\";\n private _active = false;\n private handler: ((...args: unknown[]) => void) | null = null;\n\n constructor(\n private readonly config: HookConfig,\n private readonly emitter: EventEmitter,\n id?: string,\n ) {\n this.id = id ?? `hook-${config.eventName}`;\n }\n\n start(agentName: string, onTask: TaskCallback): void {\n if (this._active) return;\n this._active = true;\n this.handler = (...args: unknown[]) => {\n const payload = args.length > 0 ? JSON.stringify(args[0]) : \"\";\n const prompt = this.config.prompt.replace(\"{{payload}}\", payload);\n onTask({\n id: randomUUID(),\n agentName,\n prompt,\n priority: this.config.priority ?? \"normal\",\n source: `hook:${this.config.eventName}`,\n createdAt: new Date().toISOString(),\n metadata: args.length > 0 ? { payload: args[0] as Record<string, unknown> } : undefined,\n });\n };\n this.emitter.on(this.config.eventName, this.handler);\n logger.info({ id: this.id, eventName: this.config.eventName }, \"HookInput started\");\n }\n\n stop(): void {\n if (!this._active) return;\n if (this.handler) {\n this.emitter.off(this.config.eventName, this.handler);\n this.handler = null;\n }\n this._active = false;\n logger.info({ id: this.id }, \"HookInput stopped\");\n }\n\n get active(): boolean {\n return this._active;\n }\n}\n","import { z } from \"zod/v4\";\n\nexport const HeartbeatConfigSchema = z.object({\n intervalMs: z.number().min(1000),\n prompt: z.string().min(1),\n priority: z.enum([\"low\", \"normal\", \"high\", \"critical\"]).optional(),\n});\n\nexport const CronConfigSchema = z.object({\n pattern: z.string().min(1),\n prompt: z.string().min(1),\n timezone: z.string().optional(),\n priority: z.enum([\"low\", \"normal\", \"high\", \"critical\"]).optional(),\n});\n\nexport const HookConfigSchema = z.object({\n eventName: z.string().min(1),\n prompt: z.string().min(1),\n priority: z.enum([\"low\", \"normal\", \"high\", \"critical\"]).optional(),\n});\n\nexport const ScheduleConfigSchema = z.object({\n heartbeat: HeartbeatConfigSchema.optional(),\n cron: z.array(CronConfigSchema).optional().default([]),\n hooks: z.array(HookConfigSchema).optional().default([]),\n});\n\nexport type ScheduleConfig = z.infer<typeof ScheduleConfigSchema>;\nexport type ScheduleConfigInput = z.input<typeof ScheduleConfigSchema>;\n","import { z } from \"zod/v4\";\nimport { ScheduleConfigSchema } from \"../../scheduler/schedule-config\";\n\nexport const McpServerRefSchema = z.object({\n name: z.string().min(1),\n command: z.string().min(1),\n args: z.array(z.string()).optional().default([]),\n env: z.record(z.string(), z.string()).optional().default({}),\n});\n\nexport const DomainContextSchema = z.object({\n skills: z.array(z.string()).optional().default([]),\n prompts: z.array(z.string()).optional().default([]),\n mcpServers: z.array(McpServerRefSchema).optional().default([]),\n workflow: z.string().optional(),\n subAgents: z.array(z.string()).optional().default([]),\n plugins: z.array(z.string()).optional().default([]),\n extensions: z.record(z.string(), z.array(z.unknown())).optional(),\n});\n\nexport const AgentBackendSchema = z.object({\n type: z.enum([\"cursor\", \"cursor-agent\", \"claude-code\", \"custom\", \"pi\"]),\n config: z.record(z.string(), z.unknown()).optional(),\n});\n\nconst ModelApiProtocolEnum = z.enum([\"openai\", \"anthropic\", \"custom\"]);\n\ntype ApiProtocol = z.infer<typeof ModelApiProtocolEnum>;\n\n/**\n * Default API protocol for well-known built-in provider types.\n * Used as fallback when `protocol` is omitted in a template.\n * For providers not in this map, protocol defaults to \"custom\".\n */\nconst DEFAULT_PROTOCOL: Record<string, ApiProtocol> = {\n anthropic: \"anthropic\",\n openai: \"openai\",\n deepseek: \"openai\",\n ollama: \"openai\",\n azure: \"openai\",\n bedrock: \"anthropic\",\n vertex: \"anthropic\",\n custom: \"custom\",\n};\n\nexport const ModelProviderSchema = z\n .object({\n type: z.string().min(1),\n protocol: ModelApiProtocolEnum.optional(),\n baseUrl: z.string().optional(),\n config: z.record(z.string(), z.unknown()).optional(),\n })\n .transform((val) => ({\n ...val,\n protocol: (val.protocol ?? DEFAULT_PROTOCOL[val.type] ?? \"custom\") as ApiProtocol,\n }));\n\nexport const InitializerStepSchema = z.object({\n type: z.string().min(1),\n config: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const InitializerSchema = z.object({\n steps: z.array(InitializerStepSchema).min(1),\n});\n\n// ---------------------------------------------------------------------------\n// Permissions schema — aligned with Claude Code permissions structure (#51)\n// ---------------------------------------------------------------------------\n\nexport const PermissionModeSchema = z.enum([\n \"default\",\n \"acceptEdits\",\n \"plan\",\n \"dontAsk\",\n \"bypassPermissions\",\n]);\n\nexport const SandboxNetworkSchema = z.object({\n allowedDomains: z.array(z.string()).optional(),\n allowLocalBinding: z.boolean().optional(),\n});\n\nexport const SandboxSchema = z.object({\n enabled: z.boolean().optional().default(false),\n autoAllowBashIfSandboxed: z.boolean().optional().default(false),\n network: SandboxNetworkSchema.optional(),\n});\n\nexport const PermissionsObjectSchema = z.object({\n allow: z.array(z.string()).optional(),\n deny: z.array(z.string()).optional(),\n ask: z.array(z.string()).optional(),\n defaultMode: PermissionModeSchema.optional(),\n sandbox: SandboxSchema.optional(),\n additionalDirectories: z.array(z.string()).optional(),\n});\n\nexport const PermissionPresetSchema = z.enum([\n \"permissive\",\n \"standard\",\n \"restricted\",\n \"readonly\",\n]);\n\n/** Accepts either a preset string or a full permissions object. */\nexport const PermissionsInputSchema = z.union([\n PermissionPresetSchema,\n PermissionsObjectSchema,\n]);\n\n// ---------------------------------------------------------------------------\n// Component origin schema — shared VersionedComponent envelope fields (#119)\n// ---------------------------------------------------------------------------\n\nexport const ComponentOriginSchema = z.object({\n type: z.enum([\"builtin\", \"source\", \"local\"]),\n sourceName: z.string().optional(),\n syncHash: z.string().optional(),\n syncedAt: z.string().optional(),\n modified: z.boolean().optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Agent Template schema — includes VersionedComponent fields (#119)\n// ---------------------------------------------------------------------------\n\nexport const AgentTemplateSchema = z.object({\n name: z.string().min(1).max(100),\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+$/, \"Must be semver format (e.g. 1.0.0)\"),\n description: z.string().optional(),\n $type: z.string().optional(),\n $version: z.number().optional(),\n origin: ComponentOriginSchema.optional(),\n tags: z.array(z.string()).optional(),\n backend: AgentBackendSchema,\n provider: ModelProviderSchema.optional(),\n domainContext: DomainContextSchema,\n permissions: PermissionsInputSchema.optional(),\n initializer: InitializerSchema.optional(),\n schedule: ScheduleConfigSchema.optional(),\n metadata: z.record(z.string(), z.string()).optional(),\n});\n\nexport type AgentTemplateInput = z.input<typeof AgentTemplateSchema>;\nexport type AgentTemplateOutput = z.output<typeof AgentTemplateSchema>;\n","import { readFile, readdir, stat } from \"node:fs/promises\";\nimport { join, extname } from \"node:path\";\nimport type { AgentTemplate } from \"@actant/shared\";\nimport {\n ConfigNotFoundError,\n ConfigValidationError,\n} from \"@actant/shared\";\nimport { AgentTemplateSchema, type AgentTemplateOutput } from \"../schema/template-schema\";\n\nexport class TemplateLoader {\n /**\n * Load and validate an Agent Template from a JSON file.\n * @throws {ConfigNotFoundError} if file does not exist\n * @throws {ConfigValidationError} if JSON is malformed or fails schema validation\n */\n async loadFromFile(filePath: string): Promise<AgentTemplate> {\n let raw: string;\n try {\n raw = await readFile(filePath, \"utf-8\");\n } catch (err) {\n if (isNodeError(err) && err.code === \"ENOENT\") {\n throw new ConfigNotFoundError(filePath);\n }\n throw err;\n }\n return this.parseAndValidate(raw, filePath);\n }\n\n /**\n * Parse and validate an Agent Template from a JSON string.\n * @throws {ConfigValidationError} if JSON is malformed or fails schema validation\n */\n async loadFromString(content: string, source?: string): Promise<AgentTemplate> {\n return this.parseAndValidate(content, source ?? \"<string>\");\n }\n\n /**\n * Load all valid Agent Templates from a directory (non-recursive).\n * Only `.json` files are considered; non-template files are skipped.\n * @throws {ConfigNotFoundError} if directory does not exist\n */\n async loadFromDirectory(dirPath: string): Promise<AgentTemplate[]> {\n let entries: string[];\n try {\n entries = await readdir(dirPath);\n } catch (err) {\n if (isNodeError(err) && err.code === \"ENOENT\") {\n throw new ConfigNotFoundError(dirPath);\n }\n throw err;\n }\n\n const jsonFiles = entries.filter((f) => extname(f) === \".json\");\n const templates: AgentTemplate[] = [];\n\n for (const file of jsonFiles) {\n const fullPath = join(dirPath, file);\n const fileStat = await stat(fullPath);\n if (!fileStat.isFile()) continue;\n\n try {\n const template = await this.loadFromFile(fullPath);\n templates.push(template);\n } catch {\n // skip files that are not valid templates\n }\n }\n\n return templates;\n }\n\n private parseAndValidate(raw: string, source: string): AgentTemplate {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new ConfigValidationError(\n `Invalid JSON in ${source}`,\n [{ path: \"\", message: \"Failed to parse JSON\" }],\n );\n }\n\n const result = AgentTemplateSchema.safeParse(parsed);\n if (!result.success) {\n const errors = result.error.issues.map((issue) => ({\n path: issue.path.map(String).join(\".\"),\n message: issue.message,\n }));\n throw new ConfigValidationError(\n `Template validation failed for ${source}`,\n errors,\n );\n }\n\n return toAgentTemplate(result.data);\n }\n}\n\n/**\n * Map Zod's output (with defaults applied) to the shared AgentTemplate type.\n * This ensures the return type satisfies the interface contract exactly.\n */\nexport function toAgentTemplate(output: AgentTemplateOutput): AgentTemplate {\n return {\n name: output.name,\n version: output.version,\n description: output.description,\n $type: output.$type,\n $version: output.$version,\n origin: output.origin,\n tags: output.tags,\n backend: output.backend,\n provider: output.provider,\n domainContext: {\n skills: output.domainContext.skills,\n prompts: output.domainContext.prompts,\n mcpServers: output.domainContext.mcpServers.map((s) => ({\n name: s.name,\n command: s.command,\n args: s.args,\n env: s.env,\n })),\n workflow: output.domainContext.workflow,\n subAgents: output.domainContext.subAgents,\n plugins: output.domainContext.plugins,\n extensions: output.domainContext.extensions,\n },\n initializer: output.initializer,\n permissions: output.permissions,\n schedule: output.schedule,\n metadata: output.metadata,\n };\n}\n\nfunction isNodeError(err: unknown): err is NodeJS.ErrnoException {\n return err instanceof Error && \"code\" in err;\n}\n","import type { ModelProviderDescriptor } from \"@actant/shared\";\nimport { createLogger } from \"@actant/shared\";\n\nconst logger = createLogger(\"model-provider-registry\");\n\n/**\n * Registry for model provider descriptors.\n *\n * Sources (registered at startup in this order):\n * 1. Built-in providers (anthropic, openai, deepseek, ...)\n * 2. Default provider from config.json `provider` field\n * 3. User-registered providers from config.json `providers` field\n *\n * Consumers:\n * - Zod schema validation (warning for unknown types)\n * - CLI setup wizard (dynamic provider list)\n * - AgentInitializer (resolve default when template omits provider)\n * - AgentManager (resolve provider → env vars for ACP)\n */\nexport class ModelProviderRegistry {\n private readonly descriptors = new Map<string, ModelProviderDescriptor>();\n private defaultType: string | undefined;\n\n register(descriptor: ModelProviderDescriptor): void {\n this.descriptors.set(descriptor.type, descriptor);\n logger.debug({ type: descriptor.type }, \"Provider registered\");\n }\n\n get(type: string): ModelProviderDescriptor | undefined {\n return this.descriptors.get(type);\n }\n\n getOrThrow(type: string): ModelProviderDescriptor {\n const desc = this.descriptors.get(type);\n if (!desc) {\n throw new Error(\n `Provider \"${type}\" is not registered. ` +\n `Available providers: [${[...this.descriptors.keys()].join(\", \")}].`,\n );\n }\n return desc;\n }\n\n has(type: string): boolean {\n return this.descriptors.has(type);\n }\n\n list(): ModelProviderDescriptor[] {\n return [...this.descriptors.values()];\n }\n\n setDefault(type: string): void {\n if (!this.descriptors.has(type)) {\n throw new Error(\n `Cannot set default: provider \"${type}\" is not registered.`,\n );\n }\n this.defaultType = type;\n logger.info({ type }, \"Default provider set\");\n }\n\n getDefault(): ModelProviderDescriptor | undefined {\n if (!this.defaultType) return undefined;\n return this.descriptors.get(this.defaultType);\n }\n\n getDefaultType(): string | undefined {\n return this.defaultType;\n }\n\n /** @internal Test-only: clear all registrations. */\n _reset(): void {\n this.descriptors.clear();\n this.defaultType = undefined;\n }\n}\n\n/** Singleton instance used throughout the application. */\nexport const modelProviderRegistry = new ModelProviderRegistry();\n","/**\n * Standalone config validators (#119).\n * Each function validates a sub-config and returns a ConfigValidationResult\n * with both schema errors and semantic warnings.\n */\nimport type {\n ConfigValidationResult,\n ValidationIssue,\n AgentBackendConfig,\n ModelProviderConfig,\n PermissionsInput,\n DomainContextConfig,\n AgentTemplate,\n} from \"@actant/shared\";\nimport {\n AgentBackendSchema,\n ModelProviderSchema,\n PermissionsInputSchema,\n DomainContextSchema,\n AgentTemplateSchema,\n} from \"./template-schema\";\nimport { ScheduleConfigSchema, type ScheduleConfig } from \"../../scheduler/schedule-config\";\nimport { toAgentTemplate } from \"../loader/template-loader\";\nimport { modelProviderRegistry } from \"../../provider/model-provider-registry\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction zodToIssues(zodError: { issues: Array<{ path: PropertyKey[]; message: string }> }): ValidationIssue[] {\n return zodError.issues.map((i) => ({\n path: i.path.map(String).join(\".\"),\n message: i.message,\n severity: \"error\" as const,\n }));\n}\n\nfunction warning(path: string, message: string, code?: string): ValidationIssue {\n return { path, message, severity: \"warning\", code };\n}\n\n// ---------------------------------------------------------------------------\n// Sub-config validators\n// ---------------------------------------------------------------------------\n\nexport function validateBackendConfig(data: unknown): ConfigValidationResult<AgentBackendConfig> {\n const result = AgentBackendSchema.safeParse(data);\n if (!result.success) {\n return { valid: false, errors: zodToIssues(result.error), warnings: [] };\n }\n return { valid: true, data: result.data, errors: [], warnings: [] };\n}\n\nexport function validateProviderConfig(data: unknown): ConfigValidationResult<ModelProviderConfig> {\n const result = ModelProviderSchema.safeParse(data);\n if (!result.success) {\n return { valid: false, errors: zodToIssues(result.error), warnings: [] };\n }\n const warnings: ValidationIssue[] = [];\n\n if (!modelProviderRegistry.has(result.data.type)) {\n warnings.push(warning(\n \"provider.type\",\n `Provider type \"${result.data.type}\" is not registered; it will be treated as a custom provider`,\n \"UNKNOWN_PROVIDER_TYPE\",\n ));\n }\n\n return { valid: true, data: result.data, errors: [], warnings };\n}\n\nexport function validatePermissionsConfig(data: unknown): ConfigValidationResult<PermissionsInput> {\n const result = PermissionsInputSchema.safeParse(data);\n if (!result.success) {\n return { valid: false, errors: zodToIssues(result.error), warnings: [] };\n }\n const warnings: ValidationIssue[] = [];\n\n if (typeof result.data === \"object\" && result.data !== null) {\n const perms = result.data as { allow?: string[]; deny?: string[] };\n if (perms.allow && perms.deny) {\n const overlap = perms.allow.filter((a) => perms.deny?.includes(a));\n if (overlap.length > 0) {\n warnings.push(warning(\n \"permissions\",\n `Rules appear in both allow and deny: ${overlap.join(\", \")}`,\n \"PERMISSION_OVERLAP\",\n ));\n }\n }\n }\n\n return { valid: true, data: result.data, errors: [], warnings };\n}\n\nexport function validateScheduleConfig(data: unknown): ConfigValidationResult<ScheduleConfig> {\n const result = ScheduleConfigSchema.safeParse(data);\n if (!result.success) {\n return { valid: false, errors: zodToIssues(result.error), warnings: [] };\n }\n const warnings: ValidationIssue[] = [];\n\n if (result.data.heartbeat) {\n if (result.data.heartbeat.intervalMs < 5000) {\n warnings.push(warning(\n \"schedule.heartbeat.intervalMs\",\n `Heartbeat interval ${result.data.heartbeat.intervalMs}ms is very short; consider >= 5000ms to avoid excessive API calls`,\n \"SHORT_HEARTBEAT_INTERVAL\",\n ));\n }\n }\n\n return { valid: true, data: result.data, errors: [], warnings };\n}\n\nexport function validateDomainContextConfig(data: unknown): ConfigValidationResult<DomainContextConfig> {\n const result = DomainContextSchema.safeParse(data);\n if (!result.success) {\n return { valid: false, errors: zodToIssues(result.error), warnings: [] };\n }\n const warnings: ValidationIssue[] = [];\n\n const ctx = result.data;\n if (ctx.subAgents && ctx.subAgents.length > 0 && (!ctx.skills || ctx.skills.length === 0) && (!ctx.prompts || ctx.prompts.length === 0)) {\n warnings.push(warning(\n \"domainContext\",\n \"subAgents are defined but no skills or prompts; the agent may lack domain context\",\n \"EMPTY_DOMAIN_WITH_SUBAGENTS\",\n ));\n }\n\n return { valid: true, data: result.data as DomainContextConfig, errors: [], warnings };\n}\n\n// ---------------------------------------------------------------------------\n// Full template semantic validator\n// ---------------------------------------------------------------------------\n\n/**\n * Deep-validate an AgentTemplate: schema + cross-field semantic checks.\n * Returns all errors and warnings.\n */\nexport function validateTemplate(data: unknown): ConfigValidationResult<AgentTemplate> {\n const result = AgentTemplateSchema.safeParse(data);\n if (!result.success) {\n return { valid: false, errors: zodToIssues(result.error), warnings: [] };\n }\n\n const warnings: ValidationIssue[] = [];\n const template = toAgentTemplate(result.data);\n\n // Semantic: permissions overlap\n const permResult = validatePermissionsConfig(template.permissions);\n if (permResult.warnings.length > 0) {\n warnings.push(...permResult.warnings);\n }\n\n // Semantic: schedule checks\n if (template.schedule) {\n const schedResult = validateScheduleConfig(template.schedule);\n if (schedResult.warnings.length > 0) {\n warnings.push(...schedResult.warnings);\n }\n }\n\n // Semantic: domain context checks\n const dcResult = validateDomainContextConfig(template.domainContext);\n if (dcResult.warnings.length > 0) {\n warnings.push(...dcResult.warnings);\n }\n\n // Semantic: custom backend without config\n if (template.backend.type === \"custom\" && !template.backend.config) {\n warnings.push(warning(\n \"backend.config\",\n \"Custom backend type without config; the launcher may not know how to start this agent\",\n \"CUSTOM_BACKEND_NO_CONFIG\",\n ));\n }\n\n // Semantic: provider checks\n if (template.provider) {\n if (template.provider.type === \"custom\" && !template.provider.config) {\n warnings.push(warning(\n \"provider.config\",\n \"Custom provider type without config; model routing may fail\",\n \"CUSTOM_PROVIDER_NO_CONFIG\",\n ));\n }\n if (!modelProviderRegistry.has(template.provider.type)) {\n warnings.push(warning(\n \"provider.type\",\n `Provider type \"${template.provider.type}\" is not registered; it will be treated as a custom provider`,\n \"UNKNOWN_PROVIDER_TYPE\",\n ));\n }\n }\n\n return { valid: true, data: template, errors: [], warnings };\n}\n","import { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { AgentTemplate, ConfigValidationResult } from \"@actant/shared\";\nimport { TemplateNotFoundError, ConfigValidationError } from \"@actant/shared\";\nimport { BaseComponentManager } from \"../../domain/base-component-manager\";\nimport { TemplateLoader, toAgentTemplate } from \"../loader/template-loader\";\nimport { AgentTemplateSchema } from \"../schema/template-schema\";\n\nexport interface RegistryOptions {\n /** If true, re-registering the same name overwrites the existing entry. Default: false */\n allowOverwrite?: boolean;\n}\n\n/**\n * Template registry that extends BaseComponentManager (#119).\n * Inherits CRUD, search/filter, import/export from the base class.\n * Adds template-specific overrides: duplicate checking, TemplateLoader-based directory loading.\n */\nexport class TemplateRegistry extends BaseComponentManager<AgentTemplate> {\n protected readonly componentType = \"template\";\n private readonly loader = new TemplateLoader();\n private readonly allowOverwrite: boolean;\n\n constructor(options?: RegistryOptions) {\n super(\"template-registry\");\n this.allowOverwrite = options?.allowOverwrite ?? false;\n }\n\n /**\n * Register a template. Throws if a template with the same name already exists\n * (unless allowOverwrite is enabled).\n */\n override register(template: AgentTemplate): void {\n if (!template.name) {\n throw new ConfigValidationError(\"Template name is required\", [\n { path: \"name\", message: \"name must be a non-empty string\" },\n ]);\n }\n\n if (this.components.has(template.name) && !this.allowOverwrite) {\n throw new ConfigValidationError(\n `Template \"${template.name}\" is already registered`,\n [{ path: \"name\", message: `Duplicate template name: ${template.name}` }],\n );\n }\n\n super.register(template);\n }\n\n /**\n * Get a template by name.\n * @throws {TemplateNotFoundError} if not found\n */\n getOrThrow(name: string): AgentTemplate {\n const template = this.components.get(name);\n if (!template) {\n throw new TemplateNotFoundError(name);\n }\n return template;\n }\n\n /**\n * Load templates from a directory using TemplateLoader (JSON + Zod validation).\n * Invalid files are skipped with a warning log.\n */\n override async loadFromDirectory(dirPath: string): Promise<number> {\n const templates = await this.loader.loadFromDirectory(dirPath);\n let count = 0;\n for (const tpl of templates) {\n try {\n this.register(tpl);\n count++;\n } catch (err) {\n this.logger.warn(\n { templateName: tpl.name, error: err },\n \"Failed to register template, skipping\",\n );\n }\n }\n this.logger.info({ count, dirPath }, \"Templates loaded from directory\");\n return count;\n }\n\n /** @deprecated Use loadFromDirectory instead. */\n async loadBuiltins(configDir: string): Promise<number> {\n return this.loadFromDirectory(configDir);\n }\n\n /**\n * Validate raw data as an AgentTemplate using the Zod schema.\n * Returns structured ConfigValidationResult (#119).\n */\n validate(data: unknown, _source: string): ConfigValidationResult<AgentTemplate> {\n const result = AgentTemplateSchema.safeParse(data);\n if (!result.success) {\n return {\n valid: false,\n errors: result.error.issues.map((issue) => ({\n path: issue.path.map(String).join(\".\"),\n message: issue.message,\n severity: \"error\" as const,\n })),\n warnings: [],\n };\n }\n return { valid: true, data: toAgentTemplate(result.data), errors: [], warnings: [] };\n }\n\n async persist(template: AgentTemplate): Promise<void> {\n if (!this.persistDir) return;\n await mkdir(this.persistDir, { recursive: true });\n const filePath = join(this.persistDir, `${template.name}.json`);\n const { writeFile } = await import(\"node:fs/promises\");\n await writeFile(filePath, JSON.stringify(template, null, 2) + \"\\n\", \"utf-8\");\n this.logger.debug({ templateName: template.name, filePath }, \"Template persisted\");\n }\n}\n","import { readFile, writeFile, readdir, stat, unlink, mkdir } from \"node:fs/promises\";\nimport { join, extname, resolve } from \"node:path\";\nimport { ComponentReferenceError, ConfigNotFoundError, ConfigValidationError, createLogger } from \"@actant/shared\";\nimport type { Logger, ConfigValidationResult } from \"@actant/shared\";\n\nexport interface NamedComponent {\n name: string;\n}\n\n/**\n * Generic base class for Domain Context component managers.\n * Provides CRUD, persist, import/export, search/filter, and load-from-directory.\n */\nexport abstract class BaseComponentManager<T extends NamedComponent> {\n protected readonly components = new Map<string, T>();\n protected readonly logger: Logger;\n protected abstract readonly componentType: string;\n\n protected persistDir?: string;\n\n constructor(loggerName: string) {\n this.logger = createLogger(loggerName);\n }\n\n setPersistDir(dir: string): void {\n this.persistDir = dir;\n }\n\n // ---------------------------------------------------------------------------\n // Core registry operations\n // ---------------------------------------------------------------------------\n\n register(component: T): void {\n this.components.set(component.name, component);\n this.logger.debug({ name: component.name }, `${this.componentType} registered`);\n }\n\n unregister(name: string): boolean {\n return this.components.delete(name);\n }\n\n get(name: string): T | undefined {\n return this.components.get(name);\n }\n\n has(name: string): boolean {\n return this.components.has(name);\n }\n\n /**\n * Resolve a list of component names to their definitions.\n * @throws {ComponentReferenceError} if any name is not found\n */\n resolve(names: string[]): T[] {\n return names.map((name) => {\n const component = this.components.get(name);\n if (!component) {\n throw new ComponentReferenceError(this.componentType, name);\n }\n return component;\n });\n }\n\n list(): T[] {\n return Array.from(this.components.values());\n }\n\n get size(): number {\n return this.components.size;\n }\n\n clear(): void {\n this.components.clear();\n }\n\n // ---------------------------------------------------------------------------\n // CRUD operations (with optional persistence)\n // ---------------------------------------------------------------------------\n\n async add(component: T, persist = false): Promise<void> {\n const validated = this.validateOrThrow(component, \"add\");\n this.register(validated);\n if (persist && this.persistDir) {\n await this.writeComponent(validated);\n }\n }\n\n async update(name: string, patch: Partial<T>, persist = false): Promise<T> {\n const existing = this.get(name);\n if (!existing) {\n throw new ComponentReferenceError(this.componentType, name);\n }\n const merged = { ...existing, ...patch, name } as unknown;\n const validated = this.validateOrThrow(merged, \"update\");\n this.register(validated);\n if (persist && this.persistDir) {\n await this.writeComponent(validated);\n }\n return validated;\n }\n\n async remove(name: string, persist = false): Promise<boolean> {\n const existed = this.unregister(name);\n if (existed && persist && this.persistDir) {\n await this.deleteComponent(name);\n }\n return existed;\n }\n\n // ---------------------------------------------------------------------------\n // Import / Export\n // ---------------------------------------------------------------------------\n\n async importFromFile(filePath: string): Promise<T> {\n const absPath = resolve(filePath);\n const raw = await readFile(absPath, \"utf-8\");\n const parsed = JSON.parse(raw) as unknown;\n const component = this.validateOrThrow(parsed, absPath);\n this.register(component);\n this.logger.info({ name: component.name, filePath: absPath }, `${this.componentType} imported`);\n return component;\n }\n\n async exportToFile(name: string, filePath: string): Promise<void> {\n const component = this.get(name);\n if (!component) {\n throw new ComponentReferenceError(this.componentType, name);\n }\n const absPath = resolve(filePath);\n await writeFile(absPath, JSON.stringify(component, null, 2) + \"\\n\", \"utf-8\");\n this.logger.info({ name, filePath: absPath }, `${this.componentType} exported`);\n }\n\n // ---------------------------------------------------------------------------\n // Search / Filter\n // ---------------------------------------------------------------------------\n\n search(query: string): T[] {\n const lower = query.toLowerCase();\n return this.list().filter((c) => {\n if (c.name.toLowerCase().includes(lower)) return true;\n const desc = (c as Record<string, unknown>).description;\n if (typeof desc === \"string\" && desc.toLowerCase().includes(lower)) return true;\n return false;\n });\n }\n\n filter(predicate: (c: T) => boolean): T[] {\n return this.list().filter(predicate);\n }\n\n // ---------------------------------------------------------------------------\n // Directory loading\n // ---------------------------------------------------------------------------\n\n /**\n * Resolve a content file reference (e.g. \"content.md\") to its file contents.\n * Returns null if the ref is inline text (contains newline) or file not found.\n */\n protected async resolveContentFile(dirPath: string, contentRef: string): Promise<string | null> {\n if (!contentRef || contentRef.includes(\"\\n\")) return null;\n if (contentRef.endsWith(\".md\") || contentRef.endsWith(\".txt\")) {\n try {\n return await readFile(join(dirPath, contentRef), \"utf-8\");\n } catch {\n return null;\n }\n }\n return null;\n }\n\n /**\n * Load component definitions from JSON files and directory-based components (manifest.json).\n * Invalid files/directories are skipped with a warning.\n * @-prefixed directories are scanned recursively as source namespaces.\n */\n async loadFromDirectory(dirPath: string): Promise<number> {\n let entries: string[];\n try {\n entries = await readdir(dirPath);\n } catch (err) {\n if (isNodeError(err) && err.code === \"ENOENT\") {\n throw new ConfigNotFoundError(dirPath);\n }\n throw err;\n }\n\n let count = 0;\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry);\n const entryStat = await stat(fullPath);\n\n if (entryStat.isFile() && extname(entry) === \".json\") {\n // Existing: load flat JSON file\n try {\n const raw = await readFile(fullPath, \"utf-8\");\n const parsed = JSON.parse(raw) as unknown;\n const component = this.validateOrThrow(parsed, fullPath);\n this.register(component);\n count++;\n } catch (err) {\n this.logger.warn({ file: entry, error: err }, `Failed to load ${this.componentType}, skipping`);\n }\n } else if (entryStat.isDirectory() && !entry.startsWith(\"_\") && !entry.startsWith(\".\")) {\n // New: load directory-based component with manifest.json\n const manifestPath = join(fullPath, \"manifest.json\");\n try {\n const manifestStat = await stat(manifestPath);\n if (!manifestStat.isFile()) continue;\n\n const raw = await readFile(manifestPath, \"utf-8\");\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n\n // Resolve content file if applicable\n if (typeof parsed.content === \"string\") {\n const resolved = await this.resolveContentFile(fullPath, parsed.content);\n if (resolved !== null) {\n parsed.content = resolved;\n } else if (\n !parsed.content.includes(\"\\n\") &&\n (parsed.content.endsWith(\".md\") || parsed.content.endsWith(\".txt\"))\n ) {\n this.logger.warn({ file: parsed.content, dir: entry }, `Content file not found, using path as-is`);\n }\n }\n\n // Use directory name as component name if not specified\n if (!parsed.name) {\n parsed.name = entry;\n }\n\n const component = this.validateOrThrow(parsed, manifestPath);\n this.register(component);\n count++;\n } catch (err) {\n this.logger.warn({ dir: entry, error: err }, `Failed to load ${this.componentType} from directory, skipping`);\n }\n }\n }\n\n // Also scan @-prefixed directories (source namespaces) recursively\n const namespaceDirs = entries.filter((e) => e.startsWith(\"@\"));\n for (const nsDir of namespaceDirs) {\n const nsPath = join(dirPath, nsDir);\n try {\n const nsStat = await stat(nsPath);\n if (nsStat.isDirectory()) {\n count += await this.loadFromDirectory(nsPath);\n }\n } catch {\n // skip\n }\n }\n\n this.logger.info({ count, dirPath }, `${this.componentType}s loaded from directory`);\n return count;\n }\n\n // ---------------------------------------------------------------------------\n // Validation (#119) — public returns ConfigValidationResult, internal throws\n // ---------------------------------------------------------------------------\n\n /**\n * Validate raw data against the component schema.\n * Returns a structured ConfigValidationResult with errors and warnings.\n */\n abstract validate(data: unknown, source: string): ConfigValidationResult<T>;\n\n /**\n * Validate and unwrap — throws ConfigValidationError on failure.\n * Used internally by CRUD and loading operations.\n */\n protected validateOrThrow(data: unknown, source: string): T {\n const result = this.validate(data, source);\n if (!result.valid || !result.data) {\n throw new ConfigValidationError(\n `Validation failed for ${this.componentType} in ${source}`,\n result.errors.map((e) => ({ path: e.path, message: e.message })),\n result.errors,\n );\n }\n return result.data;\n }\n\n // ---------------------------------------------------------------------------\n // Persistence helpers\n // ---------------------------------------------------------------------------\n\n protected async writeComponent(component: T): Promise<void> {\n if (!this.persistDir) return;\n await mkdir(this.persistDir, { recursive: true });\n const filePath = join(this.persistDir, `${component.name}.json`);\n await writeFile(filePath, JSON.stringify(component, null, 2) + \"\\n\", \"utf-8\");\n this.logger.debug({ name: component.name, filePath }, `${this.componentType} persisted`);\n }\n\n protected async deleteComponent(name: string): Promise<void> {\n if (!this.persistDir) return;\n const filePath = join(this.persistDir, `${name}.json`);\n try {\n await unlink(filePath);\n this.logger.debug({ name, filePath }, `${this.componentType} file deleted`);\n } catch (err) {\n if (isNodeError(err) && err.code === \"ENOENT\") return;\n throw err;\n }\n }\n}\n\nfunction isNodeError(err: unknown): err is NodeJS.ErrnoException {\n return err instanceof Error && \"code\" in err;\n}\n","import { watch, type FSWatcher } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { access } from \"node:fs/promises\";\nimport { createLogger } from \"@actant/shared\";\nimport type { TemplateRegistry } from \"../registry/template-registry\";\nimport { TemplateLoader } from \"../loader/template-loader\";\n\nconst logger = createLogger(\"template-file-watcher\");\n\nconst DEFAULT_DEBOUNCE_MS = 300;\n\nexport interface TemplateFileWatcherOptions {\n debounceMs?: number;\n}\n\n/**\n * Watches the templates directory for file changes and auto-reloads\n * the TemplateRegistry. Handles create, modify, and delete events.\n *\n * Tracks file→templateName mapping so deletions can correctly unregister\n * templates whose name differs from the filename.\n */\nexport class TemplateFileWatcher {\n private watcher: FSWatcher | null = null;\n private readonly debounceMs: number;\n private readonly loader = new TemplateLoader();\n private debounceTimers = new Map<string, ReturnType<typeof setTimeout>>();\n /** Maps relative filename → template name loaded from that file. */\n private fileToName = new Map<string, string>();\n\n constructor(\n private readonly templatesDir: string,\n private readonly registry: TemplateRegistry,\n options?: TemplateFileWatcherOptions,\n ) {\n this.debounceMs = options?.debounceMs ?? DEFAULT_DEBOUNCE_MS;\n }\n\n start(): void {\n if (this.watcher) return;\n\n try {\n this.watcher = watch(this.templatesDir, { recursive: true }, (_eventType, filename) => {\n if (!filename || !filename.endsWith(\".json\")) return;\n this.handleChange(filename);\n });\n\n this.watcher.on(\"error\", (err) => {\n logger.error({ error: err }, \"File watcher error\");\n });\n\n this.buildFileMap();\n logger.info({ dir: this.templatesDir }, \"Template file watcher started\");\n } catch (err) {\n logger.error({ error: err, dir: this.templatesDir }, \"Failed to start file watcher\");\n }\n }\n\n stop(): void {\n if (!this.watcher) return;\n this.watcher.close();\n this.watcher = null;\n for (const timer of this.debounceTimers.values()) {\n clearTimeout(timer);\n }\n this.debounceTimers.clear();\n logger.info(\"Template file watcher stopped\");\n }\n\n get isWatching(): boolean {\n return this.watcher !== null;\n }\n\n private buildFileMap(): void {\n for (const template of this.registry.list()) {\n const guessedFile = `${template.name}.json`;\n this.fileToName.set(guessedFile, template.name);\n }\n }\n\n private handleChange(filename: string): void {\n const existing = this.debounceTimers.get(filename);\n if (existing) clearTimeout(existing);\n\n this.debounceTimers.set(\n filename,\n setTimeout(() => {\n this.debounceTimers.delete(filename);\n this.processChange(filename).catch((err) => {\n logger.error({ filename, error: err }, \"Error processing template file change\");\n });\n }, this.debounceMs),\n );\n }\n\n private async processChange(filename: string): Promise<void> {\n const filePath = join(this.templatesDir, filename);\n\n let fileExists = true;\n try {\n await access(filePath);\n } catch {\n fileExists = false;\n }\n\n if (!fileExists) {\n const previousName = this.fileToName.get(filename);\n if (previousName && this.registry.has(previousName)) {\n this.registry.unregister(previousName);\n this.fileToName.delete(filename);\n logger.info({ templateName: previousName, filename }, \"Template unregistered (file deleted)\");\n }\n return;\n }\n\n try {\n const template = await this.loader.loadFromFile(filePath);\n\n const previousName = this.fileToName.get(filename);\n if (previousName && previousName !== template.name && this.registry.has(previousName)) {\n this.registry.unregister(previousName);\n }\n\n if (this.registry.has(template.name)) {\n this.registry.unregister(template.name);\n }\n this.registry.register(template);\n this.fileToName.set(filename, template.name);\n\n logger.info({ templateName: template.name, filename }, previousName ? \"Template reloaded\" : \"New template registered\");\n } catch (err) {\n logger.warn({ filePath, error: err }, \"Failed to reload template\");\n }\n }\n}\n","import { mkdir, rm, access, symlink, lstat, unlink, readlink } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport type { AgentInstanceMeta, LaunchMode, WorkspacePolicy, WorkDirConflict, PermissionsInput, ModelProviderConfig } from \"@actant/shared\";\nimport {\n ActantError,\n ConfigValidationError,\n InstanceCorruptedError,\n WorkspaceInitError,\n createLogger,\n} from \"@actant/shared\";\nimport type { TemplateRegistry } from \"../template/registry/template-registry\";\nimport { WorkspaceBuilder, type DomainManagers } from \"../builder/workspace-builder\";\nimport { resolvePermissions } from \"../permissions/permission-presets\";\nimport { readInstanceMeta, writeInstanceMeta } from \"../state/index\";\nimport { InitializationPipeline } from \"./pipeline/initialization-pipeline\";\nimport type { StepRegistry } from \"./pipeline/step-registry\";\nimport type { StepContext } from \"./pipeline/types\";\nimport { modelProviderRegistry } from \"../provider/model-provider-registry\";\n\nconst logger = createLogger(\"agent-initializer\");\n\nexport interface InitializerOptions {\n defaultLaunchMode?: LaunchMode;\n domainManagers?: DomainManagers;\n /** Step registry for InitializerConfig pipeline execution. When provided, template.initializer.steps will be executed during createInstance(). */\n stepRegistry?: StepRegistry;\n}\n\nexport interface InstanceOverrides {\n launchMode: LaunchMode;\n workspacePolicy: WorkspacePolicy;\n /** Absolute path for the agent workspace. When omitted, defaults to {instancesBaseDir}/{name}. */\n workDir: string;\n /** Behavior when workDir already exists. Default: \"error\". */\n workDirConflict: WorkDirConflict;\n /** Override template permissions at instance level. Completely replaces template.permissions. */\n permissions: PermissionsInput;\n metadata: Record<string, string>;\n}\n\nexport class AgentInitializer {\n private readonly builder: WorkspaceBuilder;\n private readonly pipeline?: InitializationPipeline;\n\n constructor(\n private readonly templateRegistry: TemplateRegistry,\n private readonly instancesBaseDir: string,\n private readonly options?: InitializerOptions,\n ) {\n this.builder = new WorkspaceBuilder(options?.domainManagers);\n if (options?.stepRegistry) {\n this.pipeline = new InitializationPipeline(options.stepRegistry);\n }\n }\n\n get workspaceBuilder(): WorkspaceBuilder {\n return this.builder;\n }\n\n /**\n * Create a new Agent Instance.\n * 1. Resolve template from registry\n * 2. Create workspace directory {instancesBaseDir}/{name}/\n * 3. Materialize Domain Context files\n * 4. Write .actant.json metadata\n *\n * @throws {TemplateNotFoundError} if template is not in registry\n * @throws {ConfigValidationError} if name conflicts with existing directory\n * @throws {WorkspaceInitError} if directory creation or file writing fails\n */\n async createInstance(\n name: string,\n templateName: string,\n overrides?: Partial<InstanceOverrides>,\n ): Promise<AgentInstanceMeta> {\n const template = this.templateRegistry.getOrThrow(templateName);\n const customWorkDir = overrides?.workDir;\n const workspaceDir = customWorkDir ?? join(this.instancesBaseDir, name);\n const conflictPolicy = overrides?.workDirConflict ?? \"error\";\n\n const exists = await dirExists(workspaceDir);\n if (exists) {\n switch (conflictPolicy) {\n case \"error\":\n throw new ConfigValidationError(\n `Instance directory \"${name}\" already exists`,\n [{ path: \"name\", message: `Directory already exists: ${workspaceDir}` }],\n );\n case \"overwrite\":\n await rm(workspaceDir, { recursive: true, force: true });\n logger.info({ workspaceDir }, \"Existing directory removed (overwrite)\");\n break;\n case \"append\":\n logger.info({ workspaceDir }, \"Appending to existing directory\");\n break;\n }\n }\n\n if (customWorkDir) {\n const linkPath = join(this.instancesBaseDir, name);\n if (await entryExists(linkPath)) {\n throw new ConfigValidationError(\n `Instance registration \"${name}\" already exists in instancesBaseDir`,\n [{ path: \"name\", message: `Entry already exists: ${linkPath}` }],\n );\n }\n }\n\n const shouldCleanupOnError = conflictPolicy !== \"append\" && !exists;\n\n try {\n await mkdir(workspaceDir, { recursive: true });\n\n const finalPermissions = overrides?.permissions ?? template.permissions;\n await this.builder.build(\n workspaceDir,\n template.domainContext,\n template.backend.type,\n finalPermissions,\n );\n\n if (this.pipeline && template.initializer?.steps?.length) {\n const stepContext: StepContext = {\n workspaceDir,\n instanceMeta: { name, templateName: template.name },\n template,\n logger,\n state: new Map(),\n };\n const pipelineResult = await this.pipeline.run(template.initializer.steps, stepContext);\n if (!pipelineResult.success) {\n const firstError = pipelineResult.errors[0];\n throw new WorkspaceInitError(\n workspaceDir,\n firstError?.error ?? new Error(\"Initializer pipeline failed\"),\n );\n }\n }\n\n const effectivePermissions = resolvePermissions(finalPermissions);\n\n const resolvedProvider = resolveProviderConfig(template.provider);\n\n const now = new Date().toISOString();\n const launchMode = overrides?.launchMode ?? this.options?.defaultLaunchMode ?? \"direct\";\n const defaultPolicy: WorkspacePolicy = launchMode === \"one-shot\" ? \"ephemeral\" : \"persistent\";\n const meta: AgentInstanceMeta = {\n id: randomUUID(),\n name,\n templateName: template.name,\n templateVersion: template.version,\n backendType: template.backend.type,\n backendConfig: template.backend.config ? { ...template.backend.config } : undefined,\n providerConfig: resolvedProvider,\n status: \"created\",\n launchMode,\n workspacePolicy: overrides?.workspacePolicy ?? defaultPolicy,\n processOwnership: \"managed\",\n createdAt: now,\n updatedAt: now,\n effectivePermissions,\n metadata: overrides?.metadata,\n };\n\n await writeInstanceMeta(workspaceDir, meta);\n\n if (customWorkDir) {\n const linkType = process.platform === \"win32\" ? \"junction\" : \"dir\";\n await symlink(workspaceDir, join(this.instancesBaseDir, name), linkType);\n }\n\n logger.info({ name, templateName, workspaceDir, customWorkDir: !!customWorkDir }, \"Agent instance created\");\n return meta;\n } catch (err) {\n if (shouldCleanupOnError) {\n await rm(workspaceDir, { recursive: true, force: true }).catch(() => {});\n logger.debug({ workspaceDir }, \"Cleaned up workspace after failed creation\");\n }\n if (err instanceof ActantError) {\n throw err;\n }\n throw new WorkspaceInitError(workspaceDir, err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n /**\n * Find an existing instance or create a new one (idempotent).\n * - Directory exists + valid .actant.json → return existing\n * - Directory does not exist → create new instance\n * - Directory exists but corrupted → throw InstanceCorruptedError\n */\n async findOrCreateInstance(\n name: string,\n templateName: string,\n overrides?: Partial<InstanceOverrides>,\n ): Promise<{ meta: AgentInstanceMeta; created: boolean }> {\n const workspaceDir = join(this.instancesBaseDir, name);\n\n if (await dirExists(workspaceDir)) {\n try {\n const meta = await readInstanceMeta(workspaceDir);\n logger.debug({ name }, \"Existing instance found\");\n return { meta, created: false };\n } catch (err) {\n if (err instanceof InstanceCorruptedError) {\n throw err;\n }\n throw new InstanceCorruptedError(name, err instanceof Error ? err.message : String(err));\n }\n }\n\n const meta = await this.createInstance(name, templateName, overrides);\n return { meta, created: true };\n }\n\n /**\n * Destroy an instance by removing its workspace directory.\n * For symlinked instances (custom workDir): removes the symlink and `.actant.json`\n * from the target, but preserves the rest of the user's directory.\n * For normal instances: removes the entire workspace directory.\n */\n async destroyInstance(name: string): Promise<void> {\n const entryPath = join(this.instancesBaseDir, name);\n if (!(await entryExists(entryPath))) {\n logger.warn({ name }, \"Instance directory not found, nothing to destroy\");\n return;\n }\n\n if (await isSymlink(entryPath)) {\n const targetDir = await readlink(entryPath);\n try {\n await unlink(join(targetDir, \".actant.json\"));\n } catch {\n // .actant.json may have been removed already\n }\n await rm(entryPath, { recursive: true, force: true });\n logger.info({ name, targetDir }, \"Symlinked agent instance unregistered\");\n } else {\n await rm(entryPath, { recursive: true, force: true });\n logger.info({ name }, \"Agent instance destroyed\");\n }\n }\n}\n\n/**\n * Resolve the effective provider config for an instance.\n * Template-level provider takes priority; falls back to registry default.\n * Always ensures `protocol` is set (uses registry descriptor or \"custom\" fallback).\n */\nfunction resolveProviderConfig(templateProvider?: ModelProviderConfig): ModelProviderConfig | undefined {\n if (templateProvider) {\n if (templateProvider.protocol) return templateProvider;\n const desc = modelProviderRegistry.get(templateProvider.type);\n return {\n ...templateProvider,\n protocol: desc?.protocol ?? \"custom\",\n };\n }\n\n const defaultDesc = modelProviderRegistry.getDefault();\n if (!defaultDesc) return undefined;\n\n return {\n type: defaultDesc.type,\n protocol: defaultDesc.protocol,\n baseUrl: defaultDesc.defaultBaseUrl,\n };\n}\n\nasync function dirExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/** Check if an entry (file, dir, or symlink) exists without following symlinks. */\nasync function entryExists(path: string): Promise<boolean> {\n try {\n await lstat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function isSymlink(path: string): Promise<boolean> {\n try {\n const stats = await lstat(path);\n return stats.isSymbolicLink();\n } catch {\n return false;\n }\n}\n","import { z } from \"zod/v4\";\n\nexport const AgentStatusSchema = z.enum([\n \"created\",\n \"starting\",\n \"running\",\n \"stopping\",\n \"stopped\",\n \"error\",\n \"crashed\",\n]);\n\nexport const LaunchModeSchema = z.enum([\n \"direct\",\n \"acp-background\",\n \"acp-service\",\n \"one-shot\",\n]);\n\nexport const ProcessOwnershipSchema = z.enum([\"managed\", \"external\"]);\n\nexport const WorkspacePolicySchema = z.enum([\"persistent\", \"ephemeral\"]);\n\nconst AgentBackendTypeSchema = z.string().min(1);\n\nconst PermissionModeSchema = z.enum([\n \"default\", \"acceptEdits\", \"plan\", \"dontAsk\", \"bypassPermissions\",\n]);\n\nconst SandboxNetworkConfigSchema = z.object({\n allowedDomains: z.array(z.string()).optional(),\n allowLocalBinding: z.boolean().optional(),\n});\n\nconst SandboxConfigSchema = z.object({\n enabled: z.boolean().optional(),\n autoAllowBashIfSandboxed: z.boolean().optional(),\n network: SandboxNetworkConfigSchema.optional(),\n});\n\nconst PermissionsConfigSchema = z.object({\n allow: z.array(z.string()).optional(),\n deny: z.array(z.string()).optional(),\n ask: z.array(z.string()).optional(),\n defaultMode: PermissionModeSchema.optional(),\n sandbox: SandboxConfigSchema.optional(),\n additionalDirectories: z.array(z.string()).optional(),\n});\n\nconst ModelApiProtocolSchema = z.enum([\"openai\", \"anthropic\", \"custom\"]);\n\nconst ModelProviderConfigSchema = z.object({\n type: z.string().min(1),\n protocol: ModelApiProtocolSchema.optional().default(\"custom\"),\n baseUrl: z.string().optional(),\n config: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const AgentInstanceMetaSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n templateName: z.string().min(1),\n templateVersion: z.string().regex(/^\\d+\\.\\d+\\.\\d+$/),\n backendType: AgentBackendTypeSchema.default(\"cursor\"),\n backendConfig: z.record(z.string(), z.unknown()).optional(),\n providerConfig: ModelProviderConfigSchema.optional(),\n status: AgentStatusSchema,\n launchMode: LaunchModeSchema,\n workspacePolicy: WorkspacePolicySchema.default(\"persistent\"),\n processOwnership: ProcessOwnershipSchema.default(\"managed\"),\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n pid: z.number().int().positive().optional(),\n effectivePermissions: PermissionsConfigSchema.optional(),\n metadata: z.record(z.string(), z.string()).optional(),\n});\n","import { readFile, writeFile, rename, readdir, stat, mkdir } from \"node:fs/promises\";\nimport { join, dirname } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport type { AgentInstanceMeta } from \"@actant/shared\";\nimport { InstanceCorruptedError } from \"@actant/shared\";\nimport { AgentInstanceMetaSchema } from \"./instance-meta-schema\";\nimport { createLogger } from \"@actant/shared\";\nimport type { InstanceRegistryAdapter } from \"./instance-registry-types\";\n\nconst logger = createLogger(\"instance-meta-io\");\n\nconst META_FILENAME = \".actant.json\";\n\nexport function metaFilePath(workspaceDir: string): string {\n return join(workspaceDir, META_FILENAME);\n}\n\n/** Read and validate `.actant.json` from a workspace directory. */\nexport async function readInstanceMeta(workspaceDir: string): Promise<AgentInstanceMeta> {\n const filePath = metaFilePath(workspaceDir);\n let raw: string;\n try {\n raw = await readFile(filePath, \"utf-8\");\n } catch (err) {\n if (isNodeError(err) && err.code === \"ENOENT\") {\n throw new InstanceCorruptedError(\n workspaceDir,\n `${META_FILENAME} not found`,\n );\n }\n throw err;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new InstanceCorruptedError(workspaceDir, `${META_FILENAME} contains invalid JSON`);\n }\n\n const result = AgentInstanceMetaSchema.safeParse(parsed);\n if (!result.success) {\n throw new InstanceCorruptedError(\n workspaceDir,\n `${META_FILENAME} failed schema validation: ${result.error.issues.map((i) => i.message).join(\", \")}`,\n );\n }\n\n return result.data as AgentInstanceMeta;\n}\n\n/** Atomic write: write to a temp file then rename (prevents partial writes). */\nexport async function writeInstanceMeta(\n workspaceDir: string,\n meta: AgentInstanceMeta,\n): Promise<void> {\n const filePath = metaFilePath(workspaceDir);\n const tmpPath = `${filePath}.${randomUUID().slice(0, 8)}.tmp`;\n const content = JSON.stringify(meta, null, 2) + \"\\n\";\n\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(tmpPath, content, \"utf-8\");\n await rename(tmpPath, filePath);\n}\n\n/** Partially update `.actant.json` — read, merge, write. */\nexport async function updateInstanceMeta(\n workspaceDir: string,\n patch: Partial<AgentInstanceMeta>,\n): Promise<AgentInstanceMeta> {\n const existing = await readInstanceMeta(workspaceDir);\n const updated: AgentInstanceMeta = {\n ...existing,\n ...patch,\n updatedAt: new Date().toISOString(),\n };\n await writeInstanceMeta(workspaceDir, updated);\n return updated;\n}\n\n/**\n * Scan `instancesBaseDir` for all valid instance directories.\n * Directories whose `.actant.json` is missing or invalid are logged and skipped.\n *\n * When `registry` is provided, also includes instances from the registry (external workspaces)\n * and deduplicates by name (registry entries take precedence).\n */\nexport async function scanInstances(\n instancesBaseDir: string,\n registry?: InstanceRegistryAdapter,\n): Promise<{ valid: AgentInstanceMeta[]; corrupted: string[] }> {\n const valid: AgentInstanceMeta[] = [];\n const corrupted: string[] = [];\n const validNames = new Set<string>();\n\n if (registry) {\n for (const entry of registry.list()) {\n if (entry.status === \"orphaned\") continue;\n try {\n const st = await stat(entry.workspacePath);\n if (!st.isDirectory()) {\n corrupted.push(entry.name);\n continue;\n }\n const meta = await readInstanceMeta(entry.workspacePath);\n valid.push(meta);\n validNames.add(entry.name);\n } catch (err) {\n logger.warn({ name: entry.name, path: entry.workspacePath, error: err }, \"Registry entry unreachable or corrupted\");\n corrupted.push(entry.name);\n }\n }\n }\n\n let entries: string[];\n try {\n entries = await readdir(instancesBaseDir);\n } catch (err) {\n if (isNodeError(err) && err.code === \"ENOENT\") {\n return { valid, corrupted };\n }\n throw err;\n }\n\n for (const entry of entries) {\n if (entry.startsWith(\".\")) continue;\n const dirPath = join(instancesBaseDir, entry);\n const dirStat = await stat(dirPath).catch(() => null);\n if (!dirStat?.isDirectory()) continue;\n\n try {\n const meta = await readInstanceMeta(dirPath);\n if (validNames.has(meta.name)) continue;\n valid.push(meta);\n validNames.add(meta.name);\n } catch (err) {\n logger.warn({ dir: entry, error: err }, \"Corrupted instance directory\");\n corrupted.push(entry);\n }\n }\n\n return { valid, corrupted };\n}\n\nfunction isNodeError(err: unknown): err is NodeJS.ErrnoException {\n return err instanceof Error && \"code\" in err;\n}\n","import { readFile, writeFile, rename, readdir, stat, mkdir } from \"node:fs/promises\";\nimport { join, dirname, resolve, relative } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport type { AgentInstanceMeta } from \"@actant/shared\";\nimport { InstanceCorruptedError } from \"@actant/shared\";\nimport { readInstanceMeta } from \"./instance-meta-io\";\nimport type { InstanceRegistryAdapter } from \"./instance-registry-types\";\n\nexport interface InstanceRegistryEntry {\n name: string;\n template: string;\n workspacePath: string;\n location: \"builtin\" | \"external\";\n createdAt: string;\n status: \"stopped\" | \"running\" | \"orphaned\";\n}\n\nexport interface InstanceRegistryData {\n version: 1;\n instances: Record<string, InstanceRegistryEntry>;\n}\n\nconst REGISTRY_VERSION = 1 as const;\n\nfunction mapMetaStatusToRegistry(status: AgentInstanceMeta[\"status\"]): InstanceRegistryEntry[\"status\"] {\n if (status === \"running\" || status === \"starting\") return \"running\";\n return \"stopped\";\n}\n\nexport class InstanceRegistry implements InstanceRegistryAdapter {\n private data: InstanceRegistryData = {\n version: REGISTRY_VERSION,\n instances: {},\n };\n\n constructor(\n private readonly registryPath: string,\n private readonly builtinInstancesDir: string,\n ) {}\n\n async load(): Promise<void> {\n try {\n const raw = await readFile(this.registryPath, \"utf-8\");\n const parsed = JSON.parse(raw) as unknown;\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"version\" in parsed &&\n (parsed as InstanceRegistryData).version === 1 &&\n \"instances\" in parsed &&\n typeof (parsed as InstanceRegistryData).instances === \"object\"\n ) {\n this.data = parsed as InstanceRegistryData;\n }\n } catch (err) {\n if (isNodeError(err) && err.code === \"ENOENT\") {\n this.data = { version: REGISTRY_VERSION, instances: {} };\n return;\n }\n throw err;\n }\n }\n\n async save(): Promise<void> {\n const tmpPath = `${this.registryPath}.${randomUUID().slice(0, 8)}.tmp`;\n const content = JSON.stringify(this.data, null, 2) + \"\\n\";\n await mkdir(dirname(this.registryPath), { recursive: true });\n await writeFile(tmpPath, content, \"utf-8\");\n await rename(tmpPath, this.registryPath);\n }\n\n register(entry: InstanceRegistryEntry): void {\n this.data.instances[entry.name] = entry;\n }\n\n unregister(name: string): boolean {\n if (!(name in this.data.instances)) return false;\n delete this.data.instances[name];\n return true;\n }\n\n get(name: string): InstanceRegistryEntry | undefined {\n return this.data.instances[name];\n }\n\n list(): InstanceRegistryEntry[] {\n return Object.values(this.data.instances);\n }\n\n has(name: string): boolean {\n return name in this.data.instances;\n }\n\n updateStatus(name: string, status: InstanceRegistryEntry[\"status\"]): void {\n const entry = this.data.instances[name];\n if (entry) {\n entry.status = status;\n }\n }\n\n async adopt(workspacePath: string, renameTo?: string): Promise<InstanceRegistryEntry> {\n const resolvedPath = resolve(workspacePath);\n const meta = await readInstanceMeta(resolvedPath);\n\n if (!meta.name || !meta.templateName) {\n throw new InstanceCorruptedError(\n resolvedPath,\n \".actant.json must have name and templateName\",\n );\n }\n\n const name = renameTo ?? meta.name;\n if (this.has(name)) {\n throw new Error(`Instance name \"${name}\" already exists in registry`);\n }\n\n const rel = relative(resolve(this.builtinInstancesDir), resolvedPath);\n const isBuiltin = !rel.startsWith(\"..\");\n const location: \"builtin\" | \"external\" = isBuiltin ? \"builtin\" : \"external\";\n\n const entry: InstanceRegistryEntry = {\n name,\n template: meta.templateName,\n workspacePath: resolvedPath,\n location,\n createdAt: meta.createdAt,\n status: mapMetaStatusToRegistry(meta.status),\n };\n\n this.register(entry);\n await this.save();\n return entry;\n }\n\n async reconcile(): Promise<{ orphaned: string[]; adopted: string[] }> {\n const orphaned: string[] = [];\n const adopted: string[] = [];\n\n for (const entry of this.list()) {\n try {\n const st = await stat(entry.workspacePath);\n if (!st.isDirectory()) {\n this.updateStatus(entry.name, \"orphaned\");\n orphaned.push(entry.name);\n }\n } catch {\n this.updateStatus(entry.name, \"orphaned\");\n orphaned.push(entry.name);\n }\n }\n\n let builtinEntries: string[];\n try {\n builtinEntries = await readdir(this.builtinInstancesDir);\n } catch (err) {\n if (isNodeError(err) && err.code === \"ENOENT\") {\n builtinEntries = [];\n } else {\n throw err;\n }\n }\n\n for (const entry of builtinEntries) {\n if (entry.startsWith(\".\")) continue;\n const dirPath = join(this.builtinInstancesDir, entry);\n const dirStat = await stat(dirPath).catch(() => null);\n if (!dirStat?.isDirectory()) continue;\n\n const registered = this.list().some((e) => e.workspacePath === dirPath);\n if (registered) continue;\n\n try {\n const adoptedEntry = await this.adopt(dirPath);\n adopted.push(adoptedEntry.name);\n } catch {\n // Skip corrupted or invalid directories\n }\n }\n\n await this.save();\n return { orphaned, adopted };\n }\n}\n\nfunction isNodeError(err: unknown): err is NodeJS.ErrnoException {\n return err instanceof Error && \"code\" in err;\n}\n","import { createLogger } from \"@actant/shared\";\nimport type { InitializerStep } from \"@actant/shared\";\nimport type { InitializerStepExecutor } from \"./step-executor\";\nimport type { StepRegistry } from \"./step-registry\";\nimport type {\n StepContext,\n StepValidationResult,\n PipelineOptions,\n PipelineResult,\n PipelineStepError,\n} from \"./types\";\n\nconst logger = createLogger(\"initialization-pipeline\");\n\nconst DEFAULT_STEP_TIMEOUT_MS = 60_000;\nconst DEFAULT_TOTAL_TIMEOUT_MS = 300_000;\n\ninterface ExecutedStep {\n index: number;\n executor: InitializerStepExecutor;\n config: unknown;\n}\n\n/**\n * Executes an ordered list of initializer steps with:\n * - Sequential execution (steps may depend on prior shared state)\n * - Per-step and total pipeline timeout\n * - Transactional rollback on failure (reverse order)\n * - Progress reporting\n */\nexport class InitializationPipeline {\n private readonly stepTimeoutMs: number;\n private readonly totalTimeoutMs: number;\n private readonly onProgress?: PipelineOptions[\"onProgress\"];\n\n constructor(\n private readonly registry: StepRegistry,\n options?: PipelineOptions,\n ) {\n this.stepTimeoutMs = options?.defaultStepTimeoutMs ?? DEFAULT_STEP_TIMEOUT_MS;\n this.totalTimeoutMs = options?.totalTimeoutMs ?? DEFAULT_TOTAL_TIMEOUT_MS;\n this.onProgress = options?.onProgress;\n }\n\n /**\n * Validate all steps without executing them.\n * Returns per-step validation results.\n */\n dryRun(steps: InitializerStep[]): StepValidationResult[] {\n return steps.map((step) => {\n const executor = this.registry.get(step.type);\n if (!executor) {\n return { valid: false, issues: [{ field: \"type\", message: `Unknown step type: \"${step.type}\"` }] };\n }\n return executor.validate(step.config ?? {});\n });\n }\n\n /**\n * Execute all steps sequentially. On failure, rollback executed steps in reverse order.\n */\n async run(steps: InitializerStep[], context: StepContext): Promise<PipelineResult> {\n const outputs = new Map<string, Record<string, unknown>>();\n const errors: PipelineStepError[] = [];\n const executed: ExecutedStep[] = [];\n const pipelineStart = Date.now();\n\n logger.info({ stepsCount: steps.length }, \"Starting initialization pipeline\");\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i];\n if (!step) continue;\n\n if (Date.now() - pipelineStart > this.totalTimeoutMs) {\n const err = new Error(`Pipeline total timeout exceeded (${this.totalTimeoutMs}ms)`);\n errors.push({ stepIndex: i, stepType: step.type, error: err });\n logger.error({ stepIndex: i, stepType: step.type }, \"Pipeline timeout exceeded\");\n await this.rollback(executed, context, err);\n return { success: false, stepsExecuted: i, stepsTotal: steps.length, errors, outputs };\n }\n\n const executor = this.registry.get(step.type);\n if (!executor) {\n const err = new Error(`No executor for step type: \"${step.type}\"`);\n errors.push({ stepIndex: i, stepType: step.type, error: err });\n await this.rollback(executed, context, err);\n return { success: false, stepsExecuted: i, stepsTotal: steps.length, errors, outputs };\n }\n\n this.onProgress?.(i, steps.length, step.type);\n logger.debug({ stepIndex: i, stepType: step.type }, \"Executing step\");\n\n try {\n const result = await this.executeWithTimeout(executor, context, step.config ?? {});\n\n if (!result.success) {\n const err = new Error(result.message ?? `Step \"${step.type}\" reported failure`);\n errors.push({ stepIndex: i, stepType: step.type, error: err });\n executed.push({ index: i, executor, config: step.config ?? {} });\n await this.rollback(executed, context, err);\n return { success: false, stepsExecuted: i + 1, stepsTotal: steps.length, errors, outputs };\n }\n\n executed.push({ index: i, executor, config: step.config ?? {} });\n if (result.output) {\n outputs.set(`step-${i}-${step.type}`, result.output);\n }\n if (result.message) {\n logger.info({ stepIndex: i, stepType: step.type }, result.message);\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n errors.push({ stepIndex: i, stepType: step.type, error });\n logger.error({ stepIndex: i, stepType: step.type, error }, \"Step execution failed\");\n executed.push({ index: i, executor, config: step.config ?? {} });\n await this.rollback(executed, context, error);\n return { success: false, stepsExecuted: i + 1, stepsTotal: steps.length, errors, outputs };\n }\n }\n\n logger.info({ stepsExecuted: steps.length, elapsedMs: Date.now() - pipelineStart }, \"Pipeline completed successfully\");\n return { success: true, stepsExecuted: steps.length, stepsTotal: steps.length, errors, outputs };\n }\n\n private async executeWithTimeout(\n executor: InitializerStepExecutor,\n context: StepContext,\n config: unknown,\n ): Promise<import(\"./types\").StepResult> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`Step \"${executor.type}\" timed out after ${this.stepTimeoutMs}ms`));\n }, this.stepTimeoutMs);\n\n executor.execute(context, config).then(\n (result) => { clearTimeout(timer); resolve(result); },\n (err) => { clearTimeout(timer); reject(err); },\n );\n });\n }\n\n private async rollback(executed: ExecutedStep[], context: StepContext, triggerError: Error): Promise<void> {\n if (executed.length === 0) return;\n logger.info({ stepsToRollback: executed.length }, \"Rolling back executed steps\");\n\n for (let i = executed.length - 1; i >= 0; i--) {\n const entry = executed[i];\n if (!entry) continue;\n const { executor, config, index } = entry;\n if (!executor.rollback) continue;\n\n try {\n await executor.rollback(context, config, triggerError);\n logger.debug({ stepIndex: index, stepType: executor.type }, \"Step rolled back\");\n } catch (rollbackErr) {\n logger.warn(\n { stepIndex: index, stepType: executor.type, error: rollbackErr },\n \"Rollback failed (best-effort)\",\n );\n }\n }\n }\n}\n","import { writeFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { DomainContextConfig, McpServerRef } from \"@actant/shared\";\nimport type { AgentBackendType } from \"@actant/shared\";\nimport { createLogger } from \"@actant/shared\";\nimport type { SkillManager } from \"../../domain/skill/skill-manager\";\nimport type { PromptManager } from \"../../domain/prompt/prompt-manager\";\nimport type { McpConfigManager } from \"../../domain/mcp/mcp-config-manager\";\nimport type { WorkflowManager } from \"../../domain/workflow/workflow-manager\";\n\nconst logger = createLogger(\"context-materializer\");\n\n/** Config directory per backend: Cursor uses .cursor, Claude Code uses .claude (hooks/MCP go here). */\nconst BACKEND_CONFIG_DIR: Record<string, string> = {\n cursor: \".cursor\",\n \"cursor-agent\": \".cursor\",\n \"claude-code\": \".claude\",\n pi: \".pi\",\n custom: \".cursor\",\n};\n\n/**\n * Optional Domain managers for full component resolution.\n * When provided, names are resolved to real definitions and rendered.\n * When absent, placeholder content is generated.\n */\nexport interface DomainManagers {\n skills?: SkillManager;\n prompts?: PromptManager;\n mcp?: McpConfigManager;\n workflows?: WorkflowManager;\n}\n\n/**\n * Materializes Domain Context references into actual files in the instance workspace.\n * Paths for IDE-specific config (MCP, etc.) depend on backendType (e.g. .cursor vs .claude).\n *\n * Materialization rules:\n * skills → AGENTS.md\n * mcpServers → {backendConfigDir}/mcp.json (e.g. .cursor/mcp.json or .claude/mcp.json)\n * workflow → .trellis/workflow.md\n * prompts → prompts/system.md\n * subAgents → recorded in .actant.json (not materialized as files)\n *\n * @deprecated Use WorkspaceBuilder + BackendBuilder instead (Phase 3b).\n * Kept for backward compatibility; will be removed in a future version.\n */\nexport class ContextMaterializer {\n constructor(private readonly managers?: DomainManagers) {}\n\n async materialize(\n workspaceDir: string,\n domainContext: DomainContextConfig,\n backendType: AgentBackendType = \"cursor\",\n ): Promise<void> {\n const configDir = BACKEND_CONFIG_DIR[backendType] ?? \".cursor\";\n const tasks: Promise<void>[] = [];\n\n if (domainContext.skills && domainContext.skills.length > 0) {\n tasks.push(this.materializeSkills(workspaceDir, domainContext.skills));\n }\n\n if (domainContext.mcpServers && domainContext.mcpServers.length > 0) {\n tasks.push(this.materializeMcpServers(workspaceDir, domainContext.mcpServers, configDir));\n\n if (backendType === \"claude-code\") {\n tasks.push(this.materializeClaudePermissions(workspaceDir, domainContext.mcpServers, configDir));\n }\n }\n\n if (domainContext.workflow) {\n tasks.push(this.materializeWorkflow(workspaceDir, domainContext.workflow));\n }\n\n if (domainContext.prompts && domainContext.prompts.length > 0) {\n tasks.push(this.materializePrompts(workspaceDir, domainContext.prompts));\n }\n\n await Promise.all(tasks);\n logger.debug({ workspaceDir, backendType, configDir }, \"Domain context materialized\");\n }\n\n private async materializeSkills(workspaceDir: string, skillNames: string[]): Promise<void> {\n let content: string;\n if (this.managers?.skills) {\n const resolved = this.managers.skills.resolve(skillNames);\n content = this.managers.skills.renderSkills(resolved);\n } else {\n content = [\n \"# Agent Skills\",\n \"\",\n ...skillNames.map((s) => `- ${s}`),\n \"\",\n ].join(\"\\n\");\n }\n await writeFile(join(workspaceDir, \"AGENTS.md\"), content, \"utf-8\");\n }\n\n /**\n * MCP Servers → {configDir}/mcp.json (e.g. .cursor/mcp.json or .claude/mcp.json)\n * Template provides inline McpServerRef configs; no name-based resolution needed.\n */\n private async materializeMcpServers(\n workspaceDir: string,\n servers: McpServerRef[],\n configDirName: string,\n ): Promise<void> {\n const configDir = join(workspaceDir, configDirName);\n await mkdir(configDir, { recursive: true });\n\n const mcpConfig: Record<string, { command: string; args: string[]; env?: Record<string, string> }> = {};\n for (const server of servers) {\n mcpConfig[server.name] = {\n command: server.command,\n args: server.args ?? [],\n ...(server.env && Object.keys(server.env).length > 0 ? { env: server.env } : {}),\n };\n }\n\n const config = { mcpServers: mcpConfig };\n await writeFile(\n join(configDir, \"mcp.json\"),\n JSON.stringify(config, null, 2) + \"\\n\",\n \"utf-8\",\n );\n }\n\n /**\n * Claude Code settings.local.json — pre-approve tools so agents can operate autonomously.\n * Includes both MCP tools (`mcp__<server>` prefix) and essential built-in tools.\n */\n private async materializeClaudePermissions(\n workspaceDir: string,\n servers: McpServerRef[],\n configDirName: string,\n ): Promise<void> {\n const configDir = join(workspaceDir, configDirName);\n await mkdir(configDir, { recursive: true });\n\n const allowedTools: string[] = [\n \"Bash\",\n \"Read\",\n \"Write\",\n \"Edit\",\n \"MultiEdit\",\n \"WebFetch\",\n \"WebSearch\",\n ];\n for (const server of servers) {\n allowedTools.push(`mcp__${server.name}`);\n }\n\n const settings = {\n permissions: {\n allow: allowedTools,\n deny: [],\n },\n };\n await writeFile(\n join(configDir, \"settings.local.json\"),\n JSON.stringify(settings, null, 2) + \"\\n\",\n \"utf-8\",\n );\n }\n\n private async materializeWorkflow(workspaceDir: string, workflowName: string): Promise<void> {\n const trellisDir = join(workspaceDir, \".trellis\");\n await mkdir(trellisDir, { recursive: true });\n\n let content: string;\n if (this.managers?.workflows) {\n const resolved = this.managers.workflows.resolve([workflowName]);\n const workflow = resolved[0];\n content = workflow\n ? this.managers.workflows.renderWorkflow(workflow)\n : `# Workflow: ${workflowName}\\n\\n> Workflow \"${workflowName}\" not resolved.\\n`;\n } else {\n content = [\n `# Workflow: ${workflowName}`,\n \"\",\n `> Workflow \"${workflowName}\" referenced by name.`,\n \"\",\n ].join(\"\\n\");\n }\n await writeFile(join(trellisDir, \"workflow.md\"), content, \"utf-8\");\n }\n\n private async materializePrompts(workspaceDir: string, promptNames: string[]): Promise<void> {\n const promptsDir = join(workspaceDir, \"prompts\");\n await mkdir(promptsDir, { recursive: true });\n\n let content: string;\n if (this.managers?.prompts) {\n const resolved = this.managers.prompts.resolve(promptNames);\n content = this.managers.prompts.renderPrompts(resolved);\n } else {\n content = [\n \"# System Prompts\",\n \"\",\n ...promptNames.map((p) => `- ${p}`),\n \"\",\n ].join(\"\\n\");\n }\n await writeFile(join(promptsDir, \"system.md\"), content, \"utf-8\");\n }\n}\n","import type { StepContext, StepResult, StepValidationResult } from \"./types\";\n\n/**\n * Abstract base class for initializer step executors.\n * Each step type (e.g. \"git-clone\", \"exec\") implements this interface.\n */\nexport abstract class InitializerStepExecutor {\n /** Unique identifier matching the `type` field in InitializerStep config. */\n abstract readonly type: string;\n\n /** Validate step-specific config before execution. */\n abstract validate(config: unknown): StepValidationResult;\n\n /** Execute the step within the given context. */\n abstract execute(context: StepContext, config: unknown): Promise<StepResult>;\n\n /** Optional rollback — called in reverse order when a later step fails. */\n rollback?(context: StepContext, config: unknown, error: Error): Promise<void>;\n}\n","import { createLogger } from \"@actant/shared\";\nimport type { InitializerStepExecutor } from \"./step-executor\";\n\nconst logger = createLogger(\"step-registry\");\n\n/**\n * Registry for initializer step executors.\n * Supports registration of custom step types at runtime.\n */\nexport class StepRegistry {\n private readonly executors = new Map<string, InitializerStepExecutor>();\n\n register(executor: InitializerStepExecutor): void {\n if (this.executors.has(executor.type)) {\n logger.warn({ type: executor.type }, \"Overwriting existing step executor\");\n }\n this.executors.set(executor.type, executor);\n logger.debug({ type: executor.type }, \"Step executor registered\");\n }\n\n get(type: string): InitializerStepExecutor | undefined {\n return this.executors.get(type);\n }\n\n getOrThrow(type: string): InitializerStepExecutor {\n const executor = this.executors.get(type);\n if (!executor) {\n throw new Error(`No executor registered for step type: \"${type}\"`);\n }\n return executor;\n }\n\n has(type: string): boolean {\n return this.executors.has(type);\n }\n\n listTypes(): string[] {\n return [...this.executors.keys()];\n }\n}\n","import { mkdir, rm } from \"node:fs/promises\";\nimport { join, isAbsolute } from \"node:path\";\nimport { InitializerStepExecutor } from \"../pipeline/step-executor\";\nimport type { StepContext, StepResult, StepValidationResult } from \"../pipeline/types\";\n\ninterface MkdirConfig {\n paths: string[];\n}\n\n/**\n * Creates directories within the workspace.\n * Paths are relative to workspaceDir (absolute paths are rejected for safety).\n */\nexport class MkdirStep extends InitializerStepExecutor {\n readonly type = \"mkdir\";\n\n validate(config: unknown): StepValidationResult {\n const issues: StepValidationResult[\"issues\"] = [];\n const c = config as Record<string, unknown>;\n\n if (!Array.isArray(c.paths) || c.paths.length === 0) {\n issues.push({ field: \"paths\", message: \"paths must be a non-empty array of strings\" });\n return { valid: false, issues };\n }\n\n for (const p of c.paths) {\n if (typeof p !== \"string\" || p.length === 0) {\n issues.push({ field: \"paths\", message: `Invalid path entry: ${String(p)}` });\n } else if (isAbsolute(p)) {\n issues.push({ field: \"paths\", message: `Absolute paths not allowed: ${p}` });\n }\n }\n\n return { valid: issues.length === 0, issues };\n }\n\n async execute(context: StepContext, config: unknown): Promise<StepResult> {\n const { paths } = config as MkdirConfig;\n const created: string[] = [];\n\n for (const p of paths) {\n const fullPath = join(context.workspaceDir, p);\n await mkdir(fullPath, { recursive: true });\n created.push(p);\n context.logger.debug({ path: fullPath }, \"Directory created\");\n }\n\n return { success: true, output: { created }, message: `Created ${created.length} directories` };\n }\n\n async rollback(context: StepContext, config: unknown, _error: Error): Promise<void> {\n const { paths } = config as MkdirConfig;\n for (const p of [...paths].reverse()) {\n const fullPath = join(context.workspaceDir, p);\n await rm(fullPath, { recursive: true, force: true }).catch(() => {});\n }\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { join, isAbsolute } from \"node:path\";\nimport { InitializerStepExecutor } from \"../pipeline/step-executor\";\nimport type { StepContext, StepResult, StepValidationResult } from \"../pipeline/types\";\n\ninterface ExecConfig {\n command: string;\n args?: string[];\n /** Working directory relative to workspaceDir. Default: workspaceDir itself. */\n cwd?: string;\n env?: Record<string, string>;\n}\n\n/**\n * Execute an arbitrary shell command within the workspace.\n */\nexport class ExecStep extends InitializerStepExecutor {\n readonly type = \"exec\";\n\n validate(config: unknown): StepValidationResult {\n const issues: StepValidationResult[\"issues\"] = [];\n const c = config as Record<string, unknown>;\n\n if (typeof c.command !== \"string\" || c.command.length === 0) {\n issues.push({ field: \"command\", message: \"command is required\" });\n }\n if (c.args !== undefined && !Array.isArray(c.args)) {\n issues.push({ field: \"args\", message: \"args must be an array of strings\" });\n }\n if (c.cwd !== undefined && (typeof c.cwd !== \"string\" || isAbsolute(c.cwd))) {\n issues.push({ field: \"cwd\", message: \"cwd must be a relative path\" });\n }\n\n return { valid: issues.length === 0, issues };\n }\n\n async execute(context: StepContext, config: unknown): Promise<StepResult> {\n const { command, args = [], cwd, env } = config as ExecConfig;\n const workDir = cwd ? join(context.workspaceDir, cwd) : context.workspaceDir;\n\n context.logger.debug({ command, args, cwd: workDir }, \"Executing command\");\n\n let exitCode: number;\n let stdout: string;\n let stderr: string;\n try {\n ({ exitCode, stdout, stderr } = await runCommand(command, args, workDir, env));\n } catch (err) {\n return {\n success: false,\n output: { exitCode: 1, stdout: \"\", stderr: (err as Error).message },\n message: `Command \"${command}\" failed to start: ${(err as Error).message}`,\n };\n }\n\n if (exitCode !== 0) {\n return {\n success: false,\n output: { exitCode, stdout, stderr },\n message: `Command \"${command}\" exited with code ${exitCode}: ${stderr.slice(0, 200)}`,\n };\n }\n\n return {\n success: true,\n output: { exitCode, stdout, stderr },\n message: `Command \"${command}\" completed successfully`,\n };\n }\n}\n\nfunction runCommand(\n command: string,\n args: string[],\n cwd: string,\n env?: Record<string, string>,\n): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n env: env ? { ...process.env, ...env } : process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: true,\n });\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n\n child.stdout.on(\"data\", (chunk: Buffer) => stdoutChunks.push(chunk));\n child.stderr.on(\"data\", (chunk: Buffer) => stderrChunks.push(chunk));\n\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n resolve({\n exitCode: code ?? 1,\n stdout: Buffer.concat(stdoutChunks).toString(\"utf-8\"),\n stderr: Buffer.concat(stderrChunks).toString(\"utf-8\"),\n });\n });\n });\n}\n","import { cp, rm, access } from \"node:fs/promises\";\nimport { join, isAbsolute } from \"node:path\";\nimport { InitializerStepExecutor } from \"../pipeline/step-executor\";\nimport type { StepContext, StepResult, StepValidationResult } from \"../pipeline/types\";\n\ninterface FileCopyConfig {\n /** Source path (absolute or relative to workspaceDir). */\n from: string;\n /** Destination path relative to workspaceDir. */\n to: string;\n /** If true, copy recursively (for directories). Default: true. */\n recursive?: boolean;\n}\n\n/**\n * Copy files or directories into the workspace.\n * `from` can be absolute (external source) or relative to workspaceDir.\n * `to` must be relative to workspaceDir.\n */\nexport class FileCopyStep extends InitializerStepExecutor {\n readonly type = \"file-copy\";\n\n validate(config: unknown): StepValidationResult {\n const issues: StepValidationResult[\"issues\"] = [];\n const c = config as Record<string, unknown>;\n\n if (typeof c.from !== \"string\" || c.from.length === 0) {\n issues.push({ field: \"from\", message: \"from path is required\" });\n }\n if (typeof c.to !== \"string\" || c.to.length === 0) {\n issues.push({ field: \"to\", message: \"to path is required\" });\n } else if (isAbsolute(c.to as string)) {\n issues.push({ field: \"to\", message: \"to must be a relative path within the workspace\" });\n }\n\n return { valid: issues.length === 0, issues };\n }\n\n async execute(context: StepContext, config: unknown): Promise<StepResult> {\n const { from, to, recursive = true } = config as FileCopyConfig;\n const srcPath = isAbsolute(from) ? from : join(context.workspaceDir, from);\n const destPath = join(context.workspaceDir, to);\n\n try {\n await access(srcPath);\n } catch {\n return { success: false, message: `Source path does not exist: ${srcPath}` };\n }\n\n await cp(srcPath, destPath, { recursive, force: true });\n context.logger.debug({ from: srcPath, to: destPath }, \"Files copied\");\n\n return { success: true, output: { from: srcPath, to: destPath }, message: `Copied ${from} → ${to}` };\n }\n\n async rollback(context: StepContext, config: unknown, _error: Error): Promise<void> {\n const { to } = config as FileCopyConfig;\n const destPath = join(context.workspaceDir, to);\n await rm(destPath, { recursive: true, force: true }).catch(() => {});\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { InitializerStepExecutor } from \"../pipeline/step-executor\";\nimport type { StepContext, StepResult, StepValidationResult } from \"../pipeline/types\";\n\ninterface GitCloneConfig {\n repo: string;\n /** Target directory relative to workspaceDir. Default: \".\" (workspace root). */\n target?: string;\n branch?: string;\n depth?: number;\n}\n\n/**\n * Clone a git repository into the workspace.\n */\nexport class GitCloneStep extends InitializerStepExecutor {\n readonly type = \"git-clone\";\n\n validate(config: unknown): StepValidationResult {\n const issues: StepValidationResult[\"issues\"] = [];\n const c = config as Record<string, unknown>;\n\n if (typeof c.repo !== \"string\" || c.repo.length === 0) {\n issues.push({ field: \"repo\", message: \"repo URL is required\" });\n }\n if (c.depth !== undefined && (typeof c.depth !== \"number\" || c.depth < 1)) {\n issues.push({ field: \"depth\", message: \"depth must be a positive integer\" });\n }\n\n return { valid: issues.length === 0, issues };\n }\n\n async execute(context: StepContext, config: unknown): Promise<StepResult> {\n const { repo, target = \".\", branch, depth } = config as GitCloneConfig;\n const targetDir = join(context.workspaceDir, target);\n\n const args = [\"clone\"];\n if (branch) args.push(\"--branch\", branch);\n if (depth) args.push(\"--depth\", String(depth));\n args.push(repo, targetDir);\n\n context.logger.debug({ repo, branch, depth, targetDir }, \"Cloning git repository\");\n\n const result = await gitExec(args);\n\n if (result.exitCode !== 0) {\n return {\n success: false,\n output: { exitCode: result.exitCode, stderr: result.stderr },\n message: `git clone failed: ${result.stderr.slice(0, 200)}`,\n };\n }\n\n return {\n success: true,\n output: { repo, branch, targetDir },\n message: `Cloned ${repo}${branch ? ` (branch: ${branch})` : \"\"}`,\n };\n }\n\n async rollback(context: StepContext, config: unknown, _error: Error): Promise<void> {\n const { target = \".\" } = config as GitCloneConfig;\n if (target !== \".\") {\n const targetDir = join(context.workspaceDir, target);\n await rm(targetDir, { recursive: true, force: true }).catch(() => {});\n }\n }\n}\n\nfunction gitExec(args: string[]): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n const child = spawn(\"git\", args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n\n child.stdout.on(\"data\", (chunk: Buffer) => stdoutChunks.push(chunk));\n child.stderr.on(\"data\", (chunk: Buffer) => stderrChunks.push(chunk));\n\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n resolve({\n exitCode: code ?? 1,\n stdout: Buffer.concat(stdoutChunks).toString(\"utf-8\"),\n stderr: Buffer.concat(stderrChunks).toString(\"utf-8\"),\n });\n });\n });\n}\n","import { spawn } from \"node:child_process\";\nimport { join } from \"node:path\";\nimport { InitializerStepExecutor } from \"../pipeline/step-executor\";\nimport type { StepContext, StepResult, StepValidationResult } from \"../pipeline/types\";\n\ninterface NpmInstallConfig {\n /** Package manager: \"npm\" | \"pnpm\" | \"yarn\". Default: \"npm\". */\n packageManager?: \"npm\" | \"pnpm\" | \"yarn\";\n /** Working directory relative to workspaceDir. Default: \".\" */\n cwd?: string;\n /** Extra arguments (e.g. [\"--frozen-lockfile\"]). */\n args?: string[];\n /** Custom registry URL. */\n registry?: string;\n}\n\n/**\n * Run package installation (npm/pnpm/yarn install) within the workspace.\n */\nexport class NpmInstallStep extends InitializerStepExecutor {\n readonly type = \"npm-install\";\n\n validate(config: unknown): StepValidationResult {\n const issues: StepValidationResult[\"issues\"] = [];\n const c = config as Record<string, unknown>;\n\n if (c.packageManager !== undefined) {\n const valid = [\"npm\", \"pnpm\", \"yarn\"];\n if (!valid.includes(c.packageManager as string)) {\n issues.push({ field: \"packageManager\", message: `Must be one of: ${valid.join(\", \")}` });\n }\n }\n if (c.args !== undefined && !Array.isArray(c.args)) {\n issues.push({ field: \"args\", message: \"args must be an array of strings\" });\n }\n\n return { valid: issues.length === 0, issues };\n }\n\n async execute(context: StepContext, config: unknown): Promise<StepResult> {\n const { packageManager = \"npm\", cwd = \".\", args = [], registry } = config as NpmInstallConfig;\n const workDir = join(context.workspaceDir, cwd);\n const cmdArgs = [\"install\", ...args];\n if (registry) cmdArgs.push(\"--registry\", registry);\n\n context.logger.debug({ packageManager, cwd: workDir, args: cmdArgs }, \"Installing dependencies\");\n\n const result = await runInstall(packageManager, cmdArgs, workDir);\n\n if (result.exitCode !== 0) {\n return {\n success: false,\n output: { exitCode: result.exitCode, stderr: result.stderr },\n message: `${packageManager} install failed (exit ${result.exitCode}): ${result.stderr.slice(0, 200)}`,\n };\n }\n\n return {\n success: true,\n output: { packageManager, exitCode: 0 },\n message: `${packageManager} install completed`,\n };\n }\n}\n\nfunction runInstall(\n pm: string,\n args: string[],\n cwd: string,\n): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n const child = spawn(pm, args, {\n cwd,\n env: process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: process.platform === \"win32\",\n });\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n\n child.stdout.on(\"data\", (chunk: Buffer) => stdoutChunks.push(chunk));\n child.stderr.on(\"data\", (chunk: Buffer) => stderrChunks.push(chunk));\n\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n resolve({\n exitCode: code ?? 1,\n stdout: Buffer.concat(stdoutChunks).toString(\"utf-8\"),\n stderr: Buffer.concat(stderrChunks).toString(\"utf-8\"),\n });\n });\n });\n}\n","import { StepRegistry } from \"../pipeline/step-registry\";\nimport { MkdirStep } from \"./mkdir-step\";\nimport { ExecStep } from \"./exec-step\";\nimport { FileCopyStep } from \"./file-copy-step\";\nimport { GitCloneStep } from \"./git-clone-step\";\nimport { NpmInstallStep } from \"./npm-install-step\";\n\nexport { MkdirStep } from \"./mkdir-step\";\nexport { ExecStep } from \"./exec-step\";\nexport { FileCopyStep } from \"./file-copy-step\";\nexport { GitCloneStep } from \"./git-clone-step\";\nexport { NpmInstallStep } from \"./npm-install-step\";\n\n/**\n * Create a StepRegistry pre-loaded with all built-in step executors.\n */\nexport function createDefaultStepRegistry(): StepRegistry {\n const registry = new StepRegistry();\n registry.register(new MkdirStep());\n registry.register(new ExecStep());\n registry.register(new FileCopyStep());\n registry.register(new GitCloneStep());\n registry.register(new NpmInstallStep());\n return registry;\n}\n","import { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { rename, mkdir } from \"node:fs/promises\";\nimport type { AgentInstanceMeta, AgentStatus, ResolveResult, DetachResult, ModelProviderConfig } from \"@actant/shared\";\nimport {\n AgentNotFoundError,\n AgentAlreadyRunningError,\n AgentAlreadyAttachedError,\n AgentNotAttachedError,\n AgentLaunchError,\n createLogger,\n} from \"@actant/shared\";\nimport type { AgentInitializer } from \"../initializer/index\";\nimport type { InstanceOverrides } from \"../initializer/index\";\nimport type { AgentLauncher, AgentProcess } from \"./launcher/agent-launcher\";\nimport { resolveBackend, resolveAcpBackend, openBackend, isAcpOnlyBackend, type ResolvedBackend } from \"./launcher/backend-resolver\";\nimport { requireMode, getInstallHint } from \"./launcher/backend-registry\";\nimport { ProcessWatcher, type ProcessExitInfo } from \"./launcher/process-watcher\";\nimport { getLaunchModeHandler } from \"./launch-mode-handler\";\nimport { RestartTracker, type RestartPolicy } from \"./restart-tracker\";\nimport { delay } from \"./launcher/process-utils\";\nimport { scanInstances, updateInstanceMeta } from \"../state/index\";\nimport type { InstanceRegistryAdapter } from \"../state/instance-registry-types\";\nimport type { PromptResult, StreamChunk, RunPromptOptions } from \"../communicator/agent-communicator\";\nimport { createCommunicator } from \"../communicator/create-communicator\";\nimport { modelProviderRegistry } from \"../provider/model-provider-registry\";\n\nconst logger = createLogger(\"agent-manager\");\n\n/**\n * Minimal ACP connection manager interface.\n * The real implementation lives in @actant/acp; this avoids a circular dependency.\n */\nexport interface AcpConnectionManagerLike {\n connect(name: string, options: {\n command: string;\n args: string[];\n cwd: string;\n resolvePackage?: string;\n connectionOptions?: {\n autoApprove?: boolean;\n env?: Record<string, string>;\n };\n }): Promise<{ sessionId: string }>;\n has(name: string): boolean;\n getPrimarySessionId(name: string): string | undefined;\n getConnection(name: string): AcpConnectionLike | undefined;\n disconnect(name: string): Promise<void>;\n disposeAll(): Promise<void>;\n}\n\nexport interface AcpConnectionLike {\n prompt(sessionId: string, text: string): Promise<{ stopReason: string; text: string }>;\n streamPrompt(sessionId: string, text: string): AsyncIterable<unknown>;\n newSession(cwd: string): Promise<{ sessionId: string }>;\n isConnected: boolean;\n}\n\nexport interface ManagerOptions {\n corruptedDir?: string;\n /** Milliseconds between process alive checks. Default: 5000 */\n watcherPollIntervalMs?: number;\n /** Restart policy for acp-service agents. */\n restartPolicy?: Partial<RestartPolicy>;\n /** ACP connection manager for ACP-based backends. */\n acpManager?: AcpConnectionManagerLike;\n /** Instance registry for discovering external workspaces. */\n instanceRegistry?: InstanceRegistryAdapter;\n}\n\nexport class AgentManager {\n private cache = new Map<string, AgentInstanceMeta>();\n private processes = new Map<string, AgentProcess>();\n private readonly corruptedDir: string;\n private readonly watcher: ProcessWatcher;\n private readonly restartTracker: RestartTracker;\n private readonly acpManager?: AcpConnectionManagerLike;\n private readonly instanceRegistry?: InstanceRegistryAdapter;\n\n constructor(\n private readonly initializer: AgentInitializer,\n private readonly launcher: AgentLauncher,\n private readonly instancesBaseDir: string,\n options?: ManagerOptions,\n ) {\n this.corruptedDir = options?.corruptedDir ?? join(instancesBaseDir, \".corrupted\");\n this.instanceRegistry = options?.instanceRegistry;\n this.watcher = new ProcessWatcher(\n (info) => this.handleProcessExit(info),\n { pollIntervalMs: options?.watcherPollIntervalMs },\n );\n this.restartTracker = new RestartTracker(options?.restartPolicy);\n this.acpManager = options?.acpManager;\n }\n\n /**\n * Scan all workspace directories, load metadata into cache,\n * fix stale running/starting states, and start the process watcher.\n */\n async initialize(): Promise<void> {\n const { valid, corrupted } = await scanInstances(\n this.instancesBaseDir,\n this.instanceRegistry,\n );\n\n this.cache.clear();\n this.processes.clear();\n\n const pendingRestarts: string[] = [];\n\n for (const meta of valid) {\n if (meta.status === \"running\" || meta.status === \"starting\" || meta.status === \"stopping\") {\n const handler = getLaunchModeHandler(meta.launchMode);\n const action = handler.getRecoveryAction(meta.name);\n\n const dir = join(this.instancesBaseDir, meta.name);\n const fixed = await updateInstanceMeta(dir, { status: \"stopped\", pid: undefined });\n this.cache.set(meta.name, fixed);\n logger.info({ name: meta.name, oldStatus: meta.status, launchMode: meta.launchMode, recoveryAction: action.type }, \"Stale status corrected\");\n\n if (action.type === \"restart\") {\n pendingRestarts.push(meta.name);\n }\n } else {\n this.cache.set(meta.name, meta);\n }\n }\n\n for (const name of corrupted) {\n await this.moveToCorrupted(name);\n }\n\n this.watcher.start();\n\n logger.info({\n valid: valid.length,\n corrupted: corrupted.length,\n pendingRestarts: pendingRestarts.length,\n }, \"Agent manager initialized\");\n\n for (const name of pendingRestarts) {\n try {\n await this.startAgent(name);\n logger.info({ name }, \"Recovery restart succeeded\");\n } catch (err) {\n logger.error({ name, error: err }, \"Recovery restart failed\");\n }\n }\n }\n\n /** Create a new agent (delegates to Initializer). */\n async createAgent(\n name: string,\n templateName: string,\n overrides?: Partial<InstanceOverrides>,\n ): Promise<AgentInstanceMeta> {\n const meta = await this.initializer.createInstance(name, templateName, overrides);\n this.cache.set(name, meta);\n return meta;\n }\n\n /** Find existing or create new agent (idempotent). */\n async getOrCreateAgent(\n name: string,\n templateName: string,\n overrides?: Partial<InstanceOverrides>,\n ): Promise<{ meta: AgentInstanceMeta; created: boolean }> {\n const cached = this.cache.get(name);\n if (cached) {\n return { meta: cached, created: false };\n }\n\n const { meta, created } = await this.initializer.findOrCreateInstance(\n name,\n templateName,\n overrides,\n );\n this.cache.set(name, meta);\n return { meta, created };\n }\n\n /**\n * Start an agent — launch the backend process via ACP.\n * Requires the backend to support \"acp\" mode.\n * For acpOwnsProcess backends, ProcessLauncher is skipped.\n * @throws {AgentNotFoundError} if agent is not in cache\n * @throws {AgentAlreadyRunningError} if agent is already running\n * @throws {Error} if backend does not support \"acp\" mode\n */\n async startAgent(name: string): Promise<void> {\n const meta = this.requireAgent(name);\n requireMode(meta.backendType, \"acp\");\n\n if (meta.status === \"running\" || meta.status === \"starting\") {\n throw new AgentAlreadyRunningError(name);\n }\n\n const dir = join(this.instancesBaseDir, name);\n const starting = await updateInstanceMeta(dir, { status: \"starting\" });\n this.cache.set(name, starting);\n\n try {\n const acpOnly = isAcpOnlyBackend(meta.backendType);\n let pid: number | undefined;\n\n if (!acpOnly) {\n const proc = await this.launcher.launch(dir, starting);\n this.processes.set(name, proc);\n pid = proc.pid;\n }\n\n if (this.acpManager) {\n const acpResolved = resolveAcpBackend(meta.backendType, dir, meta.backendConfig);\n const providerEnv = buildProviderEnv(meta.providerConfig);\n const connResult = await this.acpManager.connect(name, {\n command: acpResolved.command,\n args: acpResolved.args,\n cwd: dir,\n resolvePackage: acpResolved.resolvePackage,\n connectionOptions: {\n autoApprove: true,\n ...(Object.keys(providerEnv).length > 0 ? { env: providerEnv } : {}),\n },\n });\n logger.info({ name, acpOnly, providerType: meta.providerConfig?.type }, \"ACP connection established\");\n\n if (acpOnly && \"pid\" in connResult && typeof connResult.pid === \"number\") {\n pid = connResult.pid;\n this.processes.set(name, { pid, workspaceDir: dir, instanceName: name });\n }\n }\n\n const running = await updateInstanceMeta(dir, { status: \"running\", pid });\n this.cache.set(name, running);\n if (pid) {\n this.watcher.watch(name, pid);\n }\n this.restartTracker.recordStart(name);\n logger.info({ name, pid, launchMode: starting.launchMode, acp: true }, \"Agent started\");\n } catch (err) {\n if (this.acpManager?.has(name)) {\n await this.acpManager.disconnect(name).catch(() => {});\n }\n const errored = await updateInstanceMeta(dir, { status: \"error\" });\n this.cache.set(name, errored);\n if (err instanceof AgentLaunchError) throw err;\n const spawnMsg = err instanceof Error ? err.message : String(err);\n throw new AgentLaunchError(name, new Error(\n isSpawnNotFound(spawnMsg)\n ? buildSpawnNotFoundMessage(meta.backendType)\n : spawnMsg,\n ));\n }\n }\n\n /**\n * Stop an agent — disconnect ACP and terminate the backend process.\n * @throws {AgentNotFoundError} if agent is not in cache\n */\n async stopAgent(name: string): Promise<void> {\n const meta = this.requireAgent(name);\n const dir = join(this.instancesBaseDir, name);\n\n if (meta.status !== \"running\" && meta.status !== \"starting\") {\n logger.warn({ name, status: meta.status }, \"Agent is not running, setting to stopped\");\n const stopped = await updateInstanceMeta(dir, { status: \"stopped\", pid: undefined });\n this.cache.set(name, stopped);\n return;\n }\n\n this.watcher.unwatch(name);\n\n const stopping = await updateInstanceMeta(dir, { status: \"stopping\" });\n this.cache.set(name, stopping);\n\n if (this.acpManager?.has(name)) {\n await this.acpManager.disconnect(name).catch((err) => {\n logger.warn({ name, error: err }, \"Error disconnecting ACP during stop\");\n });\n }\n\n const proc = this.processes.get(name);\n if (proc) {\n await this.launcher.terminate(proc);\n this.processes.delete(name);\n }\n\n const stopped = await updateInstanceMeta(dir, { status: \"stopped\", pid: undefined });\n this.cache.set(name, stopped);\n logger.info({ name }, \"Agent stopped\");\n }\n\n /** Destroy an agent — stop it if running, then remove workspace. */\n async destroyAgent(name: string): Promise<void> {\n const meta = this.cache.get(name);\n if (!meta && !existsSync(join(this.instancesBaseDir, name))) {\n throw new AgentNotFoundError(name);\n }\n if (meta && (meta.status === \"running\" || meta.status === \"starting\")) {\n await this.stopAgent(name);\n }\n\n this.watcher.unwatch(name);\n this.restartTracker.reset(name);\n await this.initializer.destroyInstance(name);\n this.cache.delete(name);\n this.processes.delete(name);\n logger.info({ name }, \"Agent destroyed\");\n }\n\n /** Get agent metadata by name. */\n getAgent(name: string): AgentInstanceMeta | undefined {\n return this.cache.get(name);\n }\n\n /** Get agent status by name. */\n getStatus(name: string): AgentStatus | undefined {\n return this.cache.get(name)?.status;\n }\n\n /** List all known agents. */\n listAgents(): AgentInstanceMeta[] {\n return Array.from(this.cache.values());\n }\n\n /** Get count of managed agents. */\n get size(): number {\n return this.cache.size;\n }\n\n /**\n * Resolve spawn info for an agent without starting it.\n * If the agent doesn't exist but templateName is provided, auto-creates it.\n */\n async resolveAgent(\n name: string,\n templateName?: string,\n overrides?: Partial<InstanceOverrides>,\n ): Promise<ResolveResult> {\n let meta = this.cache.get(name);\n let created = false;\n\n if (!meta && templateName) {\n meta = await this.createAgent(name, templateName, overrides);\n created = true;\n }\n\n if (!meta) {\n throw new AgentNotFoundError(name);\n }\n\n const dir = join(this.instancesBaseDir, name);\n const resolved = resolveBackend(meta.backendType, dir, meta.backendConfig);\n\n return {\n workspaceDir: dir,\n command: resolved.command,\n args: resolved.args,\n instanceName: name,\n backendType: meta.backendType,\n created,\n resolvePackage: resolved.resolvePackage,\n };\n }\n\n /**\n * Open an agent's native TUI/UI (e.g. `cursor <dir>`).\n * Requires the backend to support \"open\" mode.\n * @throws if backend does not support \"open\" mode\n */\n async openAgent(name: string): Promise<ResolvedBackend> {\n const meta = this.requireAgent(name);\n const dir = join(this.instancesBaseDir, name);\n return openBackend(meta.backendType, dir);\n }\n\n /**\n * Register an externally-spawned process with the manager.\n * Sets processOwnership to \"external\" and registers ProcessWatcher monitoring.\n * @throws {AgentNotFoundError} if agent is not in cache\n * @throws {AgentAlreadyAttachedError} if agent already has an attached process\n */\n async attachAgent(\n name: string,\n pid: number,\n attachMetadata?: Record<string, string>,\n ): Promise<AgentInstanceMeta> {\n const meta = this.requireAgent(name);\n\n if (meta.status === \"running\" && meta.pid != null) {\n throw new AgentAlreadyAttachedError(name);\n }\n\n try {\n process.kill(pid, 0);\n } catch (err: unknown) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"ESRCH\") {\n throw new AgentLaunchError(\n name,\n new Error(`Process with PID ${pid} does not exist`),\n );\n }\n }\n\n const dir = join(this.instancesBaseDir, name);\n const mergedMetadata = attachMetadata\n ? { ...meta.metadata, ...attachMetadata }\n : meta.metadata;\n const updated = await updateInstanceMeta(dir, {\n status: \"running\",\n pid,\n processOwnership: \"external\",\n metadata: mergedMetadata,\n });\n this.cache.set(name, updated);\n this.processes.set(name, { pid, workspaceDir: dir, instanceName: name });\n this.watcher.watch(name, pid);\n logger.info({ name, pid }, \"External process attached\");\n return updated;\n }\n\n /**\n * Detach an externally-managed process.\n * Clears pid and processOwnership. If cleanup is requested and workspace is ephemeral, destroys the instance.\n * @throws {AgentNotFoundError} if agent is not in cache\n * @throws {AgentNotAttachedError} if agent has no attached process\n */\n async detachAgent(name: string, options?: { cleanup?: boolean }): Promise<DetachResult> {\n const meta = this.requireAgent(name);\n\n if (meta.processOwnership !== \"external\") {\n throw new AgentNotAttachedError(name);\n }\n\n this.watcher.unwatch(name);\n this.processes.delete(name);\n\n const dir = join(this.instancesBaseDir, name);\n const updated = await updateInstanceMeta(dir, {\n status: \"stopped\",\n pid: undefined,\n processOwnership: \"managed\",\n });\n this.cache.set(name, updated);\n logger.info({ name }, \"External process detached\");\n\n let workspaceCleaned = false;\n if (options?.cleanup && meta.workspacePolicy === \"ephemeral\") {\n await this.destroyAgent(name);\n workspaceCleaned = true;\n }\n\n return { ok: true, workspaceCleaned };\n }\n\n /**\n * Send a prompt to an agent and collect the full response.\n * Uses ACP connection if the agent is started with ACP, otherwise falls back to CLI pipe mode.\n */\n async runPrompt(\n name: string,\n prompt: string,\n options?: RunPromptOptions,\n ): Promise<PromptResult> {\n const meta = this.requireAgent(name);\n\n if (this.acpManager?.has(name)) {\n const conn = this.acpManager.getConnection(name);\n const sessionId = this.acpManager.getPrimarySessionId(name);\n if (conn && sessionId) {\n logger.debug({ name, sessionId }, \"Sending prompt via ACP\");\n const result = await conn.prompt(sessionId, prompt);\n return { text: result.text, sessionId };\n }\n }\n\n const dir = join(this.instancesBaseDir, name);\n const communicator = createCommunicator(meta.backendType);\n return communicator.runPrompt(dir, prompt, options);\n }\n\n /**\n * Send a prompt to an agent and stream the response.\n * Uses ACP connection if available, otherwise falls back to communicator.\n */\n streamPrompt(\n name: string,\n prompt: string,\n options?: RunPromptOptions,\n ): AsyncIterable<StreamChunk> {\n const meta = this.requireAgent(name);\n\n if (this.acpManager?.has(name)) {\n const conn = this.acpManager.getConnection(name);\n const sessionId = this.acpManager.getPrimarySessionId(name);\n if (conn && sessionId) {\n logger.debug({ name, sessionId }, \"Streaming prompt via ACP\");\n return this.streamFromAcp(conn, sessionId, prompt);\n }\n }\n\n const dir = join(this.instancesBaseDir, name);\n const communicator = createCommunicator(meta.backendType);\n return communicator.streamPrompt(dir, prompt, options);\n }\n\n private async *streamFromAcp(\n conn: AcpConnectionLike,\n sessionId: string,\n prompt: string,\n ): AsyncIterable<StreamChunk> {\n try {\n for await (const event of conn.streamPrompt(sessionId, prompt)) {\n const record = event as Record<string, unknown>;\n const type = record[\"type\"] as string | undefined;\n\n if (type === \"text\" || type === \"assistant\") {\n const content = (record[\"content\"] as string) ?? (record[\"message\"] as string) ?? \"\";\n yield { type: \"text\", content };\n } else if (type === \"tool_use\") {\n const toolName = record[\"name\"] as string | undefined;\n yield { type: \"tool_use\", content: toolName ? `[Tool: ${toolName}]` : \"\" };\n } else if (type === \"result\") {\n yield { type: \"result\", content: (record[\"result\"] as string) ?? \"\" };\n } else if (type === \"error\") {\n const errMsg = (record[\"error\"] as Record<string, unknown>)?.[\"message\"] as string | undefined;\n yield { type: \"error\", content: errMsg ?? \"Unknown error\" };\n } else if (typeof record[\"content\"] === \"string\") {\n yield { type: \"text\", content: record[\"content\"] };\n }\n }\n } catch (err) {\n yield { type: \"error\", content: err instanceof Error ? err.message : String(err) };\n }\n }\n\n /**\n * Send a message to a running agent via its ACP session.\n * Unlike runPrompt, this requires the agent to be started with ACP.\n * @throws {Error} if agent has no ACP connection\n */\n async promptAgent(\n name: string,\n message: string,\n sessionId?: string,\n ): Promise<PromptResult> {\n this.requireAgent(name);\n\n if (!this.acpManager?.has(name)) {\n throw new Error(`Agent \"${name}\" has no ACP connection. Start it first with \\`agent start\\`.`);\n }\n\n const conn = this.acpManager.getConnection(name);\n if (!conn) {\n throw new Error(`ACP connection for \"${name}\" not found`);\n }\n\n const targetSessionId = sessionId ?? this.acpManager.getPrimarySessionId(name);\n if (!targetSessionId) {\n throw new Error(`No session found for agent \"${name}\"`);\n }\n\n const result = await conn.prompt(targetSessionId, message);\n return { text: result.text, sessionId: targetSessionId };\n }\n\n /** Check if an agent has an active ACP connection. */\n hasAcpConnection(name: string): boolean {\n return this.acpManager?.has(name) ?? false;\n }\n\n /** Shut down the process watcher, ACP connections, and release resources. */\n async dispose(): Promise<void> {\n this.watcher.dispose();\n this.restartTracker.dispose();\n await this.acpManager?.disposeAll();\n }\n\n private async handleProcessExit(info: ProcessExitInfo): Promise<void> {\n const { instanceName, pid } = info;\n const meta = this.cache.get(instanceName);\n if (!meta) return;\n\n if (meta.status === \"stopping\" || meta.status === \"stopped\") {\n return;\n }\n\n const handler = getLaunchModeHandler(meta.launchMode);\n const action = handler.getProcessExitAction(instanceName, meta);\n\n logger.warn({ instanceName, pid, launchMode: meta.launchMode, action: action.type, previousStatus: meta.status }, \"Agent process exited unexpectedly\");\n\n if (this.acpManager?.has(instanceName)) {\n await this.acpManager.disconnect(instanceName).catch(() => {});\n }\n\n const dir = join(this.instancesBaseDir, instanceName);\n const exitedAt = new Date().toISOString();\n const exitStatus: AgentStatus = meta.processOwnership === \"external\" ? \"crashed\" : \"stopped\";\n const stopped = await updateInstanceMeta(dir, {\n status: exitStatus,\n pid: undefined,\n metadata: { ...meta.metadata, exitedAt },\n });\n this.cache.set(instanceName, stopped);\n this.processes.delete(instanceName);\n\n switch (action.type) {\n case \"restart\": {\n const decision = this.restartTracker.shouldRestart(instanceName);\n if (!decision.allowed) {\n const errored = await updateInstanceMeta(dir, { status: \"error\" });\n this.cache.set(instanceName, errored);\n logger.error({ instanceName, attempt: decision.attempt }, \"Restart limit exceeded — marking as error\");\n break;\n }\n\n logger.info({ instanceName, attempt: decision.attempt, delayMs: decision.delayMs }, \"Scheduling crash restart with backoff\");\n\n if (decision.delayMs > 0) {\n await delay(decision.delayMs);\n }\n\n this.restartTracker.recordRestart(instanceName);\n try {\n await this.startAgent(instanceName);\n logger.info({ instanceName, attempt: decision.attempt }, \"Crash restart succeeded\");\n } catch (err) {\n logger.error({ instanceName, attempt: decision.attempt, error: err }, \"Crash restart failed\");\n }\n break;\n }\n case \"destroy\":\n try {\n await this.destroyAgent(instanceName);\n logger.info({ instanceName }, \"One-shot agent destroyed after exit\");\n } catch (err) {\n logger.error({ instanceName, error: err }, \"One-shot auto-destroy failed\");\n }\n break;\n case \"mark-stopped\":\n break;\n }\n }\n\n private requireAgent(name: string): AgentInstanceMeta {\n const meta = this.cache.get(name);\n if (!meta) {\n throw new AgentNotFoundError(name);\n }\n return meta;\n }\n\n private async moveToCorrupted(name: string): Promise<void> {\n try {\n await mkdir(this.corruptedDir, { recursive: true });\n const src = join(this.instancesBaseDir, name);\n const dest = join(this.corruptedDir, `${name}-${Date.now()}`);\n await rename(src, dest);\n logger.warn({ name, dest }, \"Corrupted instance moved\");\n } catch (err) {\n logger.error({ name, error: err }, \"Failed to move corrupted instance\");\n }\n }\n}\n\n/**\n * Build ACTANT_* env vars from a resolved provider config.\n *\n * SECURITY: apiKey is resolved exclusively from the in-memory registry\n * (loaded from ~/.actant/config.json at daemon startup). It is never\n * read from providerConfig (which is persisted in the agent workspace\n * .actant.json and could be visible to the LLM).\n */\nfunction buildProviderEnv(providerConfig?: ModelProviderConfig): Record<string, string> {\n const env: Record<string, string> = {};\n\n const defaultDesc = modelProviderRegistry.getDefault();\n const providerType = providerConfig?.type ?? defaultDesc?.type;\n\n if (providerType) {\n env[\"ACTANT_PROVIDER\"] = providerType;\n }\n\n const descriptor = providerType ? modelProviderRegistry.get(providerType) : defaultDesc;\n const apiKey = descriptor?.apiKey ?? process.env[\"ACTANT_API_KEY\"];\n if (apiKey) {\n env[\"ACTANT_API_KEY\"] = apiKey;\n }\n\n const baseUrl = providerConfig?.baseUrl ?? descriptor?.defaultBaseUrl;\n if (baseUrl) {\n env[\"ACTANT_BASE_URL\"] = baseUrl;\n }\n\n return env;\n}\n\nfunction isSpawnNotFound(msg: string): boolean {\n return /ENOENT|EINVAL|is not recognized|not found/i.test(msg);\n}\n\nfunction buildSpawnNotFoundMessage(backendType: string): string {\n const hint = getInstallHint(backendType as import(\"@actant/shared\").AgentBackendType);\n const base = `Backend \"${backendType}\" executable not found.`;\n return hint\n ? `${base}\\nInstall with: ${hint}`\n : `${base} Ensure the required CLI is installed and in your PATH.`;\n}\n","import { execFile } from \"node:child_process\";\nimport type {\n AgentOpenMode,\n BackendDefinition,\n BackendInstallMethod,\n ConfigValidationResult,\n PlatformCommand,\n} from \"@actant/shared\";\nimport { BaseComponentManager } from \"../base-component-manager\";\nimport { BackendDefinitionSchema } from \"./backend-schema\";\n\nexport type AcpResolverFn = (\n workspaceDir: string,\n backendConfig?: Record<string, unknown>,\n) => { command: string; args: string[] };\n\n/**\n * Manages backend definitions as VersionedComponents.\n *\n * Pure-data definitions are stored in the component registry (JSON-serializable,\n * loadable from `~/.actant/configs/backends/`). Non-serializable behavioral\n * extensions (acpResolver) are stored in a separate Map keyed by backend name.\n */\nexport class BackendManager extends BaseComponentManager<BackendDefinition> {\n protected readonly componentType = \"Backend\";\n\n private readonly acpResolvers = new Map<string, AcpResolverFn>();\n\n constructor() {\n super(\"backend-manager\");\n }\n\n // ---------------------------------------------------------------------------\n // ACP resolver (behavioral extension, not serializable)\n // ---------------------------------------------------------------------------\n\n registerAcpResolver(backendName: string, resolver: AcpResolverFn): void {\n this.acpResolvers.set(backendName, resolver);\n }\n\n getAcpResolver(backendName: string): AcpResolverFn | undefined {\n return this.acpResolvers.get(backendName);\n }\n\n // ---------------------------------------------------------------------------\n // Mode queries\n // ---------------------------------------------------------------------------\n\n supportsMode(backendName: string, mode: AgentOpenMode): boolean {\n const def = this.get(backendName);\n return def != null && def.supportedModes.includes(mode);\n }\n\n requireMode(backendName: string, mode: AgentOpenMode): void {\n const def = this.get(backendName);\n if (!def) {\n throw new Error(\n `Backend \"${backendName}\" is not registered. ` +\n `Ensure the backend package is installed and its definition was loaded at startup.`,\n );\n }\n if (!def.supportedModes.includes(mode)) {\n const supported = def.supportedModes.join(\", \");\n throw new Error(\n `Backend \"${backendName}\" does not support \"${mode}\" mode. ` +\n `Supported modes: [${supported}]. ` +\n (mode === \"resolve\"\n ? `Use \\`agent start\\` or \\`agent run\\` instead.`\n : mode === \"open\"\n ? `This backend has no native TUI/UI to open.`\n : `Use \\`agent resolve\\` or \\`agent open\\` instead.`),\n );\n }\n }\n\n // ---------------------------------------------------------------------------\n // Platform command helper\n // ---------------------------------------------------------------------------\n\n getPlatformCommand(cmd: PlatformCommand): string {\n return process.platform === \"win32\" ? cmd.win32 : cmd.default;\n }\n\n // ---------------------------------------------------------------------------\n // Availability check\n // ---------------------------------------------------------------------------\n\n /**\n * Probe whether a backend binary is available on the system.\n * Uses the `existenceCheck` field. Returns `{ available, version? }`.\n * If no `existenceCheck` is configured, returns `{ available: true }` (assume ok).\n */\n async checkAvailability(backendName: string): Promise<BackendAvailability> {\n const def = this.get(backendName);\n if (!def) return { available: false, error: `Backend \"${backendName}\" not registered` };\n if (!def.existenceCheck) return { available: true };\n\n const { command, args = [\"--version\"], expectedExitCode = 0, versionPattern } = def.existenceCheck;\n\n try {\n const { stdout, exitCode } = await execCommand(command, args);\n if (exitCode !== expectedExitCode) {\n return { available: false, error: `Exit code ${exitCode} (expected ${expectedExitCode})` };\n }\n if (versionPattern) {\n const match = new RegExp(versionPattern).exec(stdout);\n if (!match) {\n return { available: false, error: `Version output didn't match pattern: ${versionPattern}` };\n }\n return { available: true, version: match[0] };\n }\n const version = stdout.trim().split(\"\\n\")[0];\n return { available: true, version: version || undefined };\n } catch (err) {\n return { available: false, error: (err as Error).message };\n }\n }\n\n /**\n * Get platform-appropriate install methods for a backend.\n * Filters by `platforms` field; returns all methods if no platform restriction.\n */\n getInstallMethods(backendName: string): BackendInstallMethod[] {\n const def = this.get(backendName);\n if (!def?.install) return [];\n const plat = process.platform;\n return def.install.filter((m) => !m.platforms || m.platforms.includes(plat));\n }\n\n // ---------------------------------------------------------------------------\n // Validation\n // ---------------------------------------------------------------------------\n\n validate(data: unknown, _source: string): ConfigValidationResult<BackendDefinition> {\n const result = BackendDefinitionSchema.safeParse(data);\n if (!result.success) {\n return {\n valid: false,\n errors: result.error.issues.map((i) => ({\n path: i.path.map(String).join(\".\"),\n message: i.message,\n severity: \"error\" as const,\n })),\n warnings: [],\n };\n }\n return { valid: true, data: result.data as BackendDefinition, errors: [], warnings: [] };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Supporting types\n// ---------------------------------------------------------------------------\n\nexport interface BackendAvailability {\n available: boolean;\n version?: string;\n error?: string;\n}\n\nfunction execCommand(command: string, args: string[]): Promise<{ stdout: string; exitCode: number }> {\n return new Promise((resolve) => {\n execFile(command, args, { timeout: 10_000, windowsHide: true }, (err, stdout) => {\n if (err && typeof (err as NodeJS.ErrnoException).code === \"string\" && (err as NodeJS.ErrnoException).code === \"ENOENT\") {\n resolve({ stdout: \"\", exitCode: -1 });\n return;\n }\n const exitCode = err && \"code\" in err && typeof err.code === \"number\" ? err.code : err ? 1 : 0;\n resolve({ stdout: stdout ?? \"\", exitCode });\n });\n });\n}\n","import { z } from \"zod/v4\";\n\nconst PlatformCommandSchema = z.object({\n win32: z.string().min(1),\n default: z.string().min(1),\n});\n\nconst OpenSpawnOptionsSchema = z.object({\n stdio: z.enum([\"inherit\", \"ignore\"]).optional(),\n detached: z.boolean().optional(),\n windowsHide: z.boolean().optional(),\n shell: z.boolean().optional(),\n});\n\nconst ExistenceCheckSchema = z.object({\n command: z.string().min(1),\n args: z.array(z.string()).optional(),\n expectedExitCode: z.number().int().optional(),\n versionPattern: z.string().optional(),\n});\n\nconst InstallMethodSchema = z.object({\n type: z.enum([\"npm\", \"brew\", \"winget\", \"choco\", \"url\", \"manual\"]),\n package: z.string().optional(),\n platforms: z.array(z.string()).optional(),\n label: z.string().optional(),\n instructions: z.string().optional(),\n});\n\nexport const BackendDefinitionSchema = z\n .object({\n name: z.string().min(1),\n version: z.string().optional(),\n description: z.string().optional(),\n tags: z.array(z.string()).optional(),\n supportedModes: z.array(z.enum([\"resolve\", \"open\", \"acp\"])).min(1),\n resolveCommand: PlatformCommandSchema.optional(),\n openCommand: PlatformCommandSchema.optional(),\n acpCommand: PlatformCommandSchema.optional(),\n acpOwnsProcess: z.boolean().optional(),\n resolvePackage: z.string().optional(),\n openWorkspaceDir: z.enum([\"arg\", \"cwd\"]).optional(),\n openSpawnOptions: OpenSpawnOptionsSchema.optional(),\n existenceCheck: ExistenceCheckSchema.optional(),\n install: z.array(InstallMethodSchema).optional(),\n })\n .passthrough();\n","import type { AgentBackendType, AgentOpenMode, BackendDefinition, BackendDescriptor, PlatformCommand } from \"@actant/shared\";\nimport { BackendManager, type AcpResolverFn } from \"../../domain/backend/backend-manager\";\n\n// ---------------------------------------------------------------------------\n// Singleton BackendManager instance\n// ---------------------------------------------------------------------------\n\nconst manager = new BackendManager();\n\n/** Access the singleton BackendManager for advanced operations (CRUD, persistence, directory loading). */\nexport function getBackendManager(): BackendManager {\n return manager;\n}\n\n// ---------------------------------------------------------------------------\n// Compatibility API — thin wrappers over BackendManager\n// ---------------------------------------------------------------------------\n\n/**\n * Register a backend descriptor (legacy API).\n * Converts `BackendDescriptor.type` → `BackendDefinition.name` and\n * extracts `acpResolver` into the behavioral registry.\n */\nexport function registerBackend(descriptor: BackendDescriptor): void {\n const { type, acpResolver, ...rest } = descriptor;\n const definition: BackendDefinition = { ...rest, name: type };\n manager.register(definition);\n if (acpResolver) {\n manager.registerAcpResolver(type, acpResolver);\n }\n}\n\n/**\n * Register a BackendDefinition directly (new API).\n * For behavioral extensions, use `getBackendManager().registerAcpResolver()`.\n */\nexport function registerBackendDefinition(definition: BackendDefinition): void {\n manager.register(definition);\n}\n\nexport function getBackendDescriptor(type: AgentBackendType): BackendDefinition {\n const def = manager.get(type);\n if (!def) {\n throw new Error(\n `Backend \"${type}\" is not registered. ` +\n `Ensure the backend package is installed and registerBackend() was called at startup.`,\n );\n }\n return def;\n}\n\nexport function supportsMode(type: AgentBackendType, mode: AgentOpenMode): boolean {\n return manager.supportsMode(type, mode);\n}\n\nexport function requireMode(type: AgentBackendType, mode: AgentOpenMode): void {\n manager.requireMode(type, mode);\n}\n\nexport function getPlatformCommand(cmd: PlatformCommand): string {\n return manager.getPlatformCommand(cmd);\n}\n\nexport function getInstallHint(type: AgentBackendType): string | undefined {\n const methods = manager.getInstallMethods(type);\n const first = methods[0];\n return first?.label ?? first?.instructions;\n}\n\nexport function getAcpResolver(type: AgentBackendType): AcpResolverFn | undefined {\n return manager.getAcpResolver(type);\n}\n\n/**\n * Reset the registry (for testing only).\n * @internal\n */\nexport function _resetRegistry(): void {\n manager.clear();\n}\n","import type { BackendDefinition } from \"@actant/shared\";\nimport { getBackendManager } from \"./backend-registry\";\n\n/**\n * Built-in backend definitions.\n * Pure data — no functions, no runtime dependencies.\n * These are registered as `origin: \"builtin\"` VersionedComponents.\n */\nconst BUILTIN_BACKENDS: BackendDefinition[] = [\n {\n name: \"cursor\",\n version: \"1.0.0\",\n description: \"Cursor IDE\",\n origin: { type: \"builtin\" },\n supportedModes: [\"resolve\", \"open\"],\n resolveCommand: { win32: \"cursor.cmd\", default: \"cursor\" },\n openCommand: { win32: \"cursor.cmd\", default: \"cursor\" },\n openSpawnOptions: { shell: process.platform === \"win32\" },\n existenceCheck: { command: \"cursor\", args: [\"--version\"] },\n install: [\n { type: \"url\", package: \"https://cursor.com\", label: \"Download Cursor\", platforms: [\"win32\", \"darwin\", \"linux\"] },\n { type: \"brew\", package: \"cursor\", label: \"brew install --cask cursor\", platforms: [\"darwin\"] },\n { type: \"winget\", package: \"Anysphere.Cursor\", label: \"winget install Anysphere.Cursor\", platforms: [\"win32\"] },\n ],\n },\n {\n name: \"cursor-agent\",\n version: \"1.0.0\",\n description: \"Cursor Agent (TUI)\",\n origin: { type: \"builtin\" },\n supportedModes: [\"resolve\", \"open\", \"acp\"],\n resolveCommand: { win32: \"agent\", default: \"agent\" },\n openCommand: { win32: \"agent\", default: \"agent\" },\n openWorkspaceDir: \"cwd\",\n openSpawnOptions: { stdio: \"inherit\", detached: false, windowsHide: false },\n existenceCheck: { command: \"agent\", args: [\"--version\"] },\n install: [\n { type: \"manual\", label: \"Included with Cursor\", instructions: \"Install Cursor from https://cursor.com — the `agent` CLI is bundled.\" },\n ],\n },\n {\n name: \"claude-code\",\n version: \"1.0.0\",\n description: \"Claude Code CLI\",\n origin: { type: \"builtin\" },\n supportedModes: [\"resolve\", \"open\", \"acp\"],\n resolveCommand: { win32: \"claude-agent-acp.cmd\", default: \"claude-agent-acp\" },\n openCommand: { win32: \"claude.exe\", default: \"claude\" },\n openWorkspaceDir: \"cwd\",\n openSpawnOptions: { stdio: \"inherit\", detached: false, windowsHide: false },\n resolvePackage: \"@zed-industries/claude-agent-acp\",\n existenceCheck: { command: \"claude\", args: [\"--version\"] },\n install: [\n { type: \"npm\", package: \"@anthropic-ai/claude-code\", label: \"npm install -g @anthropic-ai/claude-code\" },\n ],\n },\n {\n name: \"custom\",\n version: \"1.0.0\",\n description: \"Custom backend (user-provided executable)\",\n origin: { type: \"builtin\" },\n supportedModes: [\"resolve\"],\n },\n];\n\nexport function registerBuiltinBackends(): void {\n const mgr = getBackendManager();\n for (const def of BUILTIN_BACKENDS) {\n mgr.register(def);\n }\n}\n\nregisterBuiltinBackends();\n","import type { AgentBackendType, OpenSpawnOptions } from \"@actant/shared\";\nimport {\n getBackendDescriptor,\n getAcpResolver,\n supportsMode,\n requireMode,\n getPlatformCommand,\n} from \"./backend-registry\";\nimport \"./builtin-backends\";\n\nexport type { BackendDefinition, BackendDescriptor, AgentOpenMode, PlatformCommand, OpenSpawnOptions } from \"@actant/shared\";\n\nexport interface ResolvedBackend {\n command: string;\n args: string[];\n /** npm package providing the binary (for auto-resolution when not on PATH). */\n resolvePackage?: string;\n /** Working directory for the spawned process. */\n cwd?: string;\n /** Declarative spawn options for `open` mode (from BackendDescriptor). */\n openSpawnOptions?: OpenSpawnOptions;\n}\n\n/**\n * Whether a backend type supports the ACP protocol for Actant-managed control.\n * Replaces the old hardcoded `isAcpBackend()`.\n */\nexport function isAcpBackend(backendType: AgentBackendType): boolean {\n return supportsMode(backendType, \"acp\");\n}\n\n/**\n * Whether a backend's ACP connection owns the process lifecycle.\n * When true, ProcessLauncher.launch() is skipped — only AcpConnectionManager spawns the process.\n */\nexport function isAcpOnlyBackend(backendType: AgentBackendType): boolean {\n const desc = getBackendDescriptor(backendType);\n return supportsMode(backendType, \"acp\") && desc.acpOwnsProcess === true;\n}\n\n/**\n * Build launch arguments for a backend.\n * - Backends with `open` mode use `[workspaceDir]` to open the IDE at that folder.\n * - ACP backends need no args (workspace is passed via ACP session).\n * - Custom backends use `args` from backendConfig if provided.\n */\nfunction buildArgs(\n backendType: AgentBackendType,\n workspaceDir: string,\n backendConfig?: Record<string, unknown>,\n): string[] {\n const desc = getBackendDescriptor(backendType);\n\n if (backendType === \"custom\") {\n const configArgs = backendConfig?.args;\n if (Array.isArray(configArgs)) return configArgs.map(String);\n return [workspaceDir];\n }\n\n if (desc.supportedModes.includes(\"open\") && !desc.supportedModes.includes(\"acp\")) {\n return [workspaceDir];\n }\n\n if (desc.supportedModes.includes(\"acp\")) {\n return [];\n }\n\n return [workspaceDir];\n}\n\n/**\n * Resolve the executable command and arguments for spawning a backend (resolve mode).\n * @throws if the backend does not support \"resolve\" mode.\n */\nexport function resolveBackend(\n backendType: AgentBackendType,\n workspaceDir: string,\n backendConfig?: Record<string, unknown>,\n): ResolvedBackend {\n requireMode(backendType, \"resolve\");\n\n const desc = getBackendDescriptor(backendType);\n const explicitPath = backendConfig?.executablePath;\n const command = typeof explicitPath === \"string\" && explicitPath.length > 0\n ? explicitPath\n : desc.resolveCommand\n ? getPlatformCommand(desc.resolveCommand)\n : (() => { throw new Error(`Backend \"${backendType}\" has no resolveCommand configured.`); })();\n\n return {\n command,\n args: buildArgs(backendType, workspaceDir, backendConfig),\n resolvePackage: desc.resolvePackage,\n };\n}\n\n/** Default spawn options: GUI-style (detached, ignore stdio, hide window). */\nconst DEFAULT_OPEN_SPAWN: OpenSpawnOptions = {\n stdio: \"ignore\",\n detached: true,\n windowsHide: true,\n shell: false,\n};\n\n/**\n * Resolve the open command for directly launching a backend's native TUI/UI.\n * `openWorkspaceDir` is consumed here to build `args`/`cwd`; the returned\n * `openSpawnOptions` maps 1:1 to `child_process.SpawnOptions` so the CLI\n * can spread it as-is with zero branching.\n */\nexport function openBackend(\n backendType: AgentBackendType,\n workspaceDir: string,\n): ResolvedBackend {\n requireMode(backendType, \"open\");\n\n const desc = getBackendDescriptor(backendType);\n if (!desc.openCommand) {\n throw new Error(`Backend \"${backendType}\" has no openCommand configured.`);\n }\n\n const useCwd = desc.openWorkspaceDir === \"cwd\";\n\n return {\n command: getPlatformCommand(desc.openCommand),\n args: useCwd ? [] : [workspaceDir],\n cwd: useCwd ? workspaceDir : undefined,\n openSpawnOptions: { ...DEFAULT_OPEN_SPAWN, ...desc.openSpawnOptions },\n };\n}\n\n/**\n * Resolve the ACP spawn command for a backend.\n * For ACP backends, this returns the command used by AcpConnectionManager to spawn the agent process.\n * Checks acpCommand first, then falls back to resolveCommand.\n * @throws if the backend does not support \"acp\" mode.\n */\nexport function resolveAcpBackend(\n backendType: AgentBackendType,\n workspaceDir: string,\n backendConfig?: Record<string, unknown>,\n): ResolvedBackend {\n requireMode(backendType, \"acp\");\n\n const desc = getBackendDescriptor(backendType);\n\n const resolver = getAcpResolver(backendType);\n if (resolver) {\n return resolver(workspaceDir, backendConfig);\n }\n\n const explicitPath = backendConfig?.executablePath;\n const commandSource = desc.acpCommand ?? desc.resolveCommand;\n const command = typeof explicitPath === \"string\" && explicitPath.length > 0\n ? explicitPath\n : commandSource\n ? getPlatformCommand(commandSource)\n : (() => { throw new Error(`Backend \"${backendType}\" has no command configured for ACP spawn.`); })();\n\n return {\n command,\n args: buildArgs(backendType, workspaceDir, backendConfig),\n resolvePackage: desc.resolvePackage,\n };\n}\n","import { createLogger } from \"@actant/shared\";\nimport { isProcessAlive } from \"./process-utils\";\n\nconst logger = createLogger(\"process-watcher\");\n\nexport interface ProcessExitInfo {\n instanceName: string;\n pid: number;\n}\n\nexport type ProcessExitHandler = (info: ProcessExitInfo) => void | Promise<void>;\n\nexport interface ProcessWatcherOptions {\n /** Milliseconds between alive-checks. Default: 5000 */\n pollIntervalMs?: number;\n}\n\nconst DEFAULT_POLL_INTERVAL = 5_000;\n\ninterface WatchEntry {\n pid: number;\n}\n\n/**\n * Periodically polls tracked PIDs and fires a callback\n * when a watched process is no longer alive.\n *\n * Usage:\n * const watcher = new ProcessWatcher(onExit, { pollIntervalMs: 3000 });\n * watcher.start();\n * watcher.watch(\"my-agent\", 12345);\n * // ... later ...\n * watcher.unwatch(\"my-agent\"); // e.g. before intentional stop\n * watcher.dispose();\n */\nexport class ProcessWatcher {\n private readonly watches = new Map<string, WatchEntry>();\n private timer: ReturnType<typeof setInterval> | null = null;\n private polling = false;\n private readonly pollIntervalMs: number;\n\n constructor(\n private readonly onProcessExit: ProcessExitHandler,\n options?: ProcessWatcherOptions,\n ) {\n this.pollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL;\n }\n\n watch(instanceName: string, pid: number): void {\n this.watches.set(instanceName, { pid });\n logger.debug({ instanceName, pid }, \"Watching process\");\n }\n\n unwatch(instanceName: string): boolean {\n const removed = this.watches.delete(instanceName);\n if (removed) {\n logger.debug({ instanceName }, \"Unwatched process\");\n }\n return removed;\n }\n\n isWatching(instanceName: string): boolean {\n return this.watches.has(instanceName);\n }\n\n get watchCount(): number {\n return this.watches.size;\n }\n\n start(): void {\n if (this.timer) return;\n this.timer = setInterval(() => {\n void this.poll();\n }, this.pollIntervalMs);\n logger.info({ pollIntervalMs: this.pollIntervalMs }, \"ProcessWatcher started\");\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n logger.info(\"ProcessWatcher stopped\");\n }\n }\n\n dispose(): void {\n this.stop();\n this.watches.clear();\n }\n\n get isRunning(): boolean {\n return this.timer !== null;\n }\n\n private async poll(): Promise<void> {\n if (this.polling) return;\n this.polling = true;\n\n try {\n const exited: ProcessExitInfo[] = [];\n\n for (const [instanceName, entry] of this.watches) {\n if (!isProcessAlive(entry.pid)) {\n exited.push({ instanceName, pid: entry.pid });\n }\n }\n\n for (const info of exited) {\n this.watches.delete(info.instanceName);\n logger.info(info, \"Process exited — removed from watch list\");\n\n try {\n await this.onProcessExit(info);\n } catch (err) {\n logger.error({ ...info, error: err }, \"Error in process exit handler\");\n }\n }\n } finally {\n this.polling = false;\n }\n }\n}\n","/**\n * Check whether a process with the given PID is still alive.\n * Uses `kill(pid, 0)` which sends no signal but checks existence.\n */\nexport function isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err: unknown) {\n if (isNodeError(err) && err.code === \"ESRCH\") {\n return false;\n }\n if (isNodeError(err) && err.code === \"EPERM\") {\n return true;\n }\n return false;\n }\n}\n\n/**\n * Send a signal to a process, ignoring ESRCH (already dead).\n * Returns true if the signal was delivered, false if the process was already gone.\n */\nexport function sendSignal(pid: number, signal: NodeJS.Signals): boolean {\n try {\n process.kill(pid, signal);\n return true;\n } catch (err: unknown) {\n if (isNodeError(err) && err.code === \"ESRCH\") {\n return false;\n }\n throw err;\n }\n}\n\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isNodeError(err: unknown): err is NodeJS.ErrnoException {\n return err instanceof Error && \"code\" in err;\n}\n","import type { AgentInstanceMeta, LaunchMode } from \"@actant/shared\";\nimport { createLogger } from \"@actant/shared\";\n\nconst logger = createLogger(\"launch-mode-handler\");\n\n/**\n * What the manager should do when a watched process exits.\n * - \"mark-stopped\": set status to stopped, clear pid (default for most modes)\n * - \"restart\": attempt to relaunch the process (acp-service with restart policy)\n * - \"destroy\": mark stopped then destroy the instance (one-shot with autoDestroy)\n */\nexport type ProcessExitAction =\n | { type: \"mark-stopped\" }\n | { type: \"restart\" }\n | { type: \"destroy\" };\n\n/**\n * What the manager should do for a stale running/starting instance on daemon restart.\n * - \"mark-stopped\": reset status to stopped (default)\n * - \"restart\": attempt to relaunch (acp-service recovery)\n */\nexport type RecoveryAction =\n | { type: \"mark-stopped\" }\n | { type: \"restart\" };\n\nexport interface LaunchModeHandler {\n readonly mode: LaunchMode;\n getProcessExitAction(instanceName: string, meta?: AgentInstanceMeta): ProcessExitAction;\n getRecoveryAction(instanceName: string): RecoveryAction;\n}\n\nclass DirectModeHandler implements LaunchModeHandler {\n readonly mode = \"direct\" as const;\n\n getProcessExitAction(_instanceName: string): ProcessExitAction {\n return { type: \"mark-stopped\" };\n }\n\n getRecoveryAction(_instanceName: string): RecoveryAction {\n return { type: \"mark-stopped\" };\n }\n}\n\nclass AcpBackgroundModeHandler implements LaunchModeHandler {\n readonly mode = \"acp-background\" as const;\n\n getProcessExitAction(_instanceName: string): ProcessExitAction {\n return { type: \"mark-stopped\" };\n }\n\n getRecoveryAction(_instanceName: string): RecoveryAction {\n return { type: \"mark-stopped\" };\n }\n}\n\nclass AcpServiceModeHandler implements LaunchModeHandler {\n readonly mode = \"acp-service\" as const;\n\n getProcessExitAction(instanceName: string): ProcessExitAction {\n logger.info({ instanceName }, \"acp-service process exited — restart policy will be checked\");\n return { type: \"restart\" };\n }\n\n getRecoveryAction(instanceName: string): RecoveryAction {\n logger.info({ instanceName }, \"acp-service stale instance — will attempt recovery restart\");\n return { type: \"restart\" };\n }\n}\n\nclass OneShotModeHandler implements LaunchModeHandler {\n readonly mode = \"one-shot\" as const;\n\n getProcessExitAction(_instanceName: string, meta?: AgentInstanceMeta): ProcessExitAction {\n if (meta?.metadata?.autoDestroy === \"true\") {\n return { type: \"destroy\" };\n }\n return { type: \"mark-stopped\" };\n }\n\n getRecoveryAction(_instanceName: string): RecoveryAction {\n return { type: \"mark-stopped\" };\n }\n}\n\nconst handlers: Record<LaunchMode, LaunchModeHandler> = {\n \"direct\": new DirectModeHandler(),\n \"acp-background\": new AcpBackgroundModeHandler(),\n \"acp-service\": new AcpServiceModeHandler(),\n \"one-shot\": new OneShotModeHandler(),\n};\n\nexport function getLaunchModeHandler(mode: LaunchMode): LaunchModeHandler {\n return handlers[mode];\n}\n","import { createLogger } from \"@actant/shared\";\n\nconst logger = createLogger(\"restart-tracker\");\n\nexport interface RestartPolicy {\n /** Maximum number of restarts before giving up. Default: 5 */\n maxRestarts: number;\n /** Base delay for exponential backoff (ms). Default: 1000 */\n backoffBaseMs: number;\n /** Maximum backoff delay cap (ms). Default: 60000 */\n backoffMaxMs: number;\n /** Reset restart counter after this many ms of stable running. Default: 300000 (5 min) */\n resetAfterMs: number;\n}\n\nexport const DEFAULT_RESTART_POLICY: RestartPolicy = {\n maxRestarts: 5,\n backoffBaseMs: 1_000,\n backoffMaxMs: 60_000,\n resetAfterMs: 300_000,\n};\n\nexport interface RestartDecision {\n allowed: boolean;\n delayMs: number;\n attempt: number;\n}\n\ninterface RestartState {\n count: number;\n lastRestartAt: number;\n lastStartAt: number;\n}\n\n/**\n * Tracks restart attempts per instance and enforces exponential backoff.\n *\n * Usage:\n * const tracker = new RestartTracker();\n * // Before restarting:\n * const decision = tracker.shouldRestart(\"my-agent\");\n * if (decision.allowed) {\n * await delay(decision.delayMs);\n * tracker.recordRestart(\"my-agent\");\n * // ... do restart ...\n * }\n * // After agent successfully starts:\n * tracker.recordStart(\"my-agent\");\n */\nexport class RestartTracker {\n private states = new Map<string, RestartState>();\n private readonly policy: RestartPolicy;\n\n constructor(policy?: Partial<RestartPolicy>) {\n this.policy = { ...DEFAULT_RESTART_POLICY, ...policy };\n }\n\n shouldRestart(instanceName: string): RestartDecision {\n const state = this.getOrCreate(instanceName);\n\n if (state.lastStartAt > 0) {\n const stableMs = Date.now() - state.lastStartAt;\n if (stableMs >= this.policy.resetAfterMs) {\n logger.info({ instanceName, stableMs, resetAfterMs: this.policy.resetAfterMs }, \"Resetting restart counter — agent was stable\");\n state.count = 0;\n }\n }\n\n if (state.count >= this.policy.maxRestarts) {\n logger.warn({ instanceName, count: state.count, maxRestarts: this.policy.maxRestarts }, \"Restart limit exceeded\");\n return { allowed: false, delayMs: 0, attempt: state.count };\n }\n\n const delayMs = Math.min(\n this.policy.backoffBaseMs * Math.pow(2, state.count),\n this.policy.backoffMaxMs,\n );\n\n return { allowed: true, delayMs, attempt: state.count + 1 };\n }\n\n recordRestart(instanceName: string): void {\n const state = this.getOrCreate(instanceName);\n state.count++;\n state.lastRestartAt = Date.now();\n logger.debug({ instanceName, count: state.count }, \"Restart recorded\");\n }\n\n recordStart(instanceName: string): void {\n const state = this.getOrCreate(instanceName);\n state.lastStartAt = Date.now();\n }\n\n reset(instanceName: string): void {\n this.states.delete(instanceName);\n }\n\n getRestartCount(instanceName: string): number {\n return this.states.get(instanceName)?.count ?? 0;\n }\n\n dispose(): void {\n this.states.clear();\n }\n\n private getOrCreate(instanceName: string): RestartState {\n let state = this.states.get(instanceName);\n if (!state) {\n state = { count: 0, lastRestartAt: 0, lastStartAt: 0 };\n this.states.set(instanceName, state);\n }\n return state;\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { createLogger } from \"@actant/shared\";\nimport type {\n AgentCommunicator,\n PromptResult,\n RunPromptOptions,\n StreamChunk,\n} from \"./agent-communicator\";\n\nconst logger = createLogger(\"claude-code-communicator\");\n\nconst DEFAULT_TIMEOUT_MS = 300_000; // 5 minutes\n\n/**\n * Communicates with an agent via the `claude` CLI in print mode.\n * Uses `claude -p --output-format stream-json \"prompt\"` for streaming\n * and `claude -p --output-format json \"prompt\"` for one-shot.\n */\nexport class ClaudeCodeCommunicator implements AgentCommunicator {\n private readonly executable: string;\n\n constructor(executable = \"claude\") {\n this.executable = executable;\n }\n\n async runPrompt(\n workspaceDir: string,\n prompt: string,\n options?: RunPromptOptions,\n ): Promise<PromptResult> {\n const args = this.buildArgs(prompt, options, \"json\");\n\n logger.debug({ workspaceDir, args }, \"Running claude-code prompt\");\n\n return new Promise<PromptResult>((resolve, reject) => {\n const child = spawn(this.executable, args, {\n cwd: workspaceDir,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env },\n windowsHide: true,\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.on(\"data\", (chunk: Buffer) => {\n stdout += chunk.toString();\n });\n\n child.stderr.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n\n const timeout = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const timer = setTimeout(() => {\n child.kill(\"SIGTERM\");\n reject(new Error(`Claude-code prompt timed out after ${timeout}ms`));\n }, timeout);\n\n child.on(\"close\", (code) => {\n clearTimeout(timer);\n\n if (code !== 0) {\n logger.warn({ code, stderr: stderr.slice(0, 500) }, \"claude-code exited with error\");\n reject(new Error(`claude-code exited with code ${code}: ${stderr.slice(0, 500)}`));\n return;\n }\n\n try {\n const parsed = JSON.parse(stdout) as Record<string, unknown>;\n const result = parsed[\"result\"] as string | undefined;\n const sessionId = parsed[\"session_id\"] as string | undefined;\n const subtype = parsed[\"subtype\"] as string | undefined;\n\n if (subtype && subtype !== \"success\") {\n logger.warn({ subtype }, \"claude-code returned non-success subtype\");\n }\n\n let text: string;\n if (result && result.length > 0) {\n text = result;\n } else if (subtype === \"error_max_turns\") {\n text = \"[max turns reached — no final result text]\";\n } else {\n const costUsd = parsed[\"cost_usd\"] as number | undefined;\n const duration = parsed[\"duration_ms\"] as number | undefined;\n const parts: string[] = [\"[no result text]\"];\n if (subtype) parts.push(`subtype=${subtype}`);\n if (costUsd != null) parts.push(`cost=$${costUsd.toFixed(4)}`);\n if (duration != null) parts.push(`duration=${duration}ms`);\n text = parts.join(\" \");\n }\n\n resolve({ text, sessionId });\n } catch {\n const firstLine = stdout.slice(0, 200).split(\"\\n\")[0] ?? \"\";\n resolve({ text: firstLine || \"[unparseable response]\" });\n }\n });\n\n child.on(\"error\", (err) => {\n clearTimeout(timer);\n reject(new Error(`Failed to spawn claude-code: ${err.message}`));\n });\n\n child.stdin.end();\n });\n }\n\n async *streamPrompt(\n workspaceDir: string,\n prompt: string,\n options?: RunPromptOptions,\n ): AsyncIterable<StreamChunk> {\n const args = this.buildArgs(prompt, options, \"stream-json\");\n\n logger.debug({ workspaceDir, args }, \"Streaming claude-code prompt\");\n\n const child = spawn(this.executable, args, {\n cwd: workspaceDir,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env },\n windowsHide: true,\n });\n\n const timeout = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const timer = setTimeout(() => {\n child.kill(\"SIGTERM\");\n }, timeout);\n\n child.stdin.end();\n\n let buffer = \"\";\n\n try {\n for await (const chunk of child.stdout) {\n buffer += (chunk as Buffer).toString();\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n try {\n const event = JSON.parse(trimmed) as Record<string, unknown>;\n const streamChunk = parseStreamEvent(event);\n if (streamChunk) {\n yield streamChunk;\n }\n } catch {\n yield { type: \"text\", content: trimmed };\n }\n }\n }\n\n if (buffer.trim()) {\n try {\n const event = JSON.parse(buffer.trim()) as Record<string, unknown>;\n const streamChunk = parseStreamEvent(event);\n if (streamChunk) {\n yield streamChunk;\n }\n } catch {\n yield { type: \"text\", content: buffer.trim() };\n }\n }\n } finally {\n clearTimeout(timer);\n if (child.exitCode === null) {\n child.kill(\"SIGTERM\");\n }\n }\n }\n\n private buildArgs(\n prompt: string,\n options: RunPromptOptions | undefined,\n outputFormat: \"json\" | \"stream-json\",\n ): string[] {\n const args = [\"-p\", \"--output-format\", outputFormat];\n\n if (options?.systemPromptFile) {\n args.push(\"--system-prompt-file\", options.systemPromptFile);\n }\n\n if (options?.appendSystemPrompt) {\n args.push(\"--append-system-prompt\", options.appendSystemPrompt);\n }\n\n if (options?.sessionId) {\n args.push(\"--resume\", options.sessionId);\n }\n\n if (options?.maxTurns !== undefined) {\n args.push(\"--max-turns\", String(options.maxTurns));\n }\n\n if (options?.model) {\n args.push(\"--model\", options.model);\n }\n\n args.push(prompt);\n return args;\n }\n}\n\nfunction parseStreamEvent(event: Record<string, unknown>): StreamChunk | null {\n const type = event[\"type\"] as string | undefined;\n\n if (type === \"assistant\" || type === \"text\") {\n const message = event[\"message\"] as string | undefined;\n const content = message ?? (event[\"content\"] as string | undefined) ?? \"\";\n return { type: \"text\", content };\n }\n\n if (type === \"tool_use\") {\n const name = event[\"name\"] as string | undefined;\n const input = event[\"input\"] as unknown;\n return { type: \"tool_use\", content: name ? `[Tool: ${name}] ${JSON.stringify(input)}` : \"\" };\n }\n\n if (type === \"result\") {\n const result = event[\"result\"] as string | undefined;\n return { type: \"result\", content: result ?? \"\" };\n }\n\n if (type === \"error\") {\n const error = event[\"error\"] as { message?: string } | undefined;\n return { type: \"error\", content: error?.message ?? \"Unknown error\" };\n }\n\n // For unrecognized events, extract text content if available\n if (typeof event[\"content\"] === \"string\") {\n return { type: \"text\", content: event[\"content\"] };\n }\n\n return null;\n}\n","import { createLogger } from \"@actant/shared\";\nimport type {\n AgentCommunicator,\n PromptResult,\n RunPromptOptions,\n StreamChunk,\n} from \"./agent-communicator\";\n\nconst logger = createLogger(\"cursor-communicator\");\n\n/**\n * Communicator stub for Cursor backend.\n * Cursor CLI does not yet support a pipe mode for programmatic communication.\n * This implementation provides a clear error until Cursor adds this capability.\n */\nexport class CursorCommunicator implements AgentCommunicator {\n async runPrompt(\n _workspaceDir: string,\n _prompt: string,\n _options?: RunPromptOptions,\n ): Promise<PromptResult> {\n logger.warn(\"Cursor backend does not yet support programmatic communication\");\n throw new Error(\n \"Cursor backend does not support programmatic communication yet. \" +\n \"Use claude-code backend for agent.run / agent.chat functionality.\",\n );\n }\n\n // eslint-disable-next-line require-yield\n async *streamPrompt(\n _workspaceDir: string,\n _prompt: string,\n _options?: RunPromptOptions,\n ): AsyncIterable<StreamChunk> {\n throw new Error(\n \"Cursor backend does not support programmatic communication yet. \" +\n \"Use claude-code backend for agent.run / agent.chat functionality.\",\n );\n }\n}\n","import type { AgentBackendType } from \"@actant/shared\";\nimport type { AgentCommunicator } from \"./agent-communicator\";\nimport { ClaudeCodeCommunicator } from \"./claude-code-communicator\";\nimport { CursorCommunicator } from \"./cursor-communicator\";\n\nconst registry = new Map<AgentBackendType, (backendConfig?: Record<string, unknown>) => AgentCommunicator>();\n\n/**\n * Register a communicator factory for a backend type.\n * External packages (e.g. @actant/pi) call this at startup.\n * The factory receives the template's `backend.config` so it can extract\n * provider-specific settings (provider, model, apiKey, etc.).\n */\nexport function registerCommunicator(\n backendType: AgentBackendType,\n factory: (backendConfig?: Record<string, unknown>) => AgentCommunicator,\n): void {\n registry.set(backendType, factory);\n}\n\nexport function createCommunicator(\n backendType: AgentBackendType,\n backendConfig?: Record<string, unknown>,\n): AgentCommunicator {\n const registered = registry.get(backendType);\n if (registered) return registered(backendConfig);\n\n switch (backendType) {\n case \"claude-code\":\n return new ClaudeCodeCommunicator();\n case \"cursor\":\n case \"cursor-agent\":\n return new CursorCommunicator();\n default:\n throw new Error(\n `No communicator registered for backend \"${backendType}\". ` +\n `Register one via registerCommunicator() at startup.`,\n );\n }\n}\n","import type { AgentInstanceMeta } from \"@actant/shared\";\nimport type { AgentLauncher, AgentProcess } from \"./agent-launcher\";\n\nlet nextPid = 10000;\n\n/**\n * Mock launcher for testing — simulates launching a process\n * by returning a fake PID without actually spawning anything.\n */\nexport class MockLauncher implements AgentLauncher {\n readonly launched: AgentProcess[] = [];\n readonly terminated: AgentProcess[] = [];\n\n async launch(workspaceDir: string, meta: AgentInstanceMeta): Promise<AgentProcess> {\n const process: AgentProcess = {\n pid: nextPid++,\n workspaceDir,\n instanceName: meta.name,\n };\n this.launched.push(process);\n return process;\n }\n\n async terminate(process: AgentProcess): Promise<void> {\n this.terminated.push(process);\n }\n}\n","import { spawn } from \"node:child_process\";\nimport type { AgentInstanceMeta } from \"@actant/shared\";\nimport { AgentLaunchError, createLogger } from \"@actant/shared\";\nimport type { AgentLauncher, AgentProcess } from \"./agent-launcher\";\nimport { resolveBackend, isAcpBackend } from \"./backend-resolver\";\nimport { isProcessAlive, sendSignal, delay } from \"./process-utils\";\nimport { ProcessLogWriter, type ProcessLogWriterOptions } from \"./process-log-writer\";\n\nconst logger = createLogger(\"process-launcher\");\n\nexport interface ProcessLauncherOptions {\n /** Milliseconds to wait for graceful shutdown before SIGKILL. Default: 5000 */\n terminateTimeoutMs?: number;\n /** Milliseconds to wait after spawn to verify the process is still alive. Default: 500 */\n spawnVerifyDelayMs?: number;\n /** Enable process log capture for non-ACP backends. Default: true. */\n enableProcessLogs?: boolean;\n /** Options for process log file writer. */\n logWriterOptions?: ProcessLogWriterOptions;\n}\n\nconst DEFAULT_TERMINATE_TIMEOUT = 5_000;\nconst DEFAULT_SPAWN_VERIFY_DELAY = 500;\n\n/**\n * Real launcher that spawns IDE/CLI backend processes.\n *\n * Lifecycle:\n * launch() → spawn detached child → verify alive → return AgentProcess\n * terminate() → SIGTERM → wait → SIGKILL if still alive\n */\nexport class ProcessLauncher implements AgentLauncher {\n private readonly terminateTimeoutMs: number;\n private readonly spawnVerifyDelayMs: number;\n private readonly enableProcessLogs: boolean;\n private readonly logWriterOptions?: ProcessLogWriterOptions;\n private readonly logWriters = new Map<string, ProcessLogWriter>();\n\n constructor(options?: ProcessLauncherOptions) {\n this.terminateTimeoutMs = options?.terminateTimeoutMs ?? DEFAULT_TERMINATE_TIMEOUT;\n this.spawnVerifyDelayMs = options?.spawnVerifyDelayMs ?? DEFAULT_SPAWN_VERIFY_DELAY;\n this.enableProcessLogs = options?.enableProcessLogs ?? true;\n this.logWriterOptions = options?.logWriterOptions;\n }\n\n async launch(workspaceDir: string, meta: AgentInstanceMeta): Promise<AgentProcess> {\n const { command, args } = resolveBackend(\n meta.backendType,\n workspaceDir,\n meta.backendConfig,\n );\n\n const useAcp = isAcpBackend(meta.backendType);\n\n logger.info({ name: meta.name, command, args, backendType: meta.backendType, acp: useAcp }, \"Spawning backend process\");\n\n const captureNonAcpLogs = !useAcp && this.enableProcessLogs;\n\n let stdio: import(\"node:child_process\").StdioOptions;\n if (useAcp) {\n stdio = [\"pipe\", \"pipe\", \"pipe\"];\n } else if (captureNonAcpLogs) {\n stdio = [\"ignore\", \"pipe\", \"pipe\"];\n } else {\n stdio = \"ignore\";\n }\n\n const child = spawn(command, args, {\n cwd: workspaceDir,\n detached: !useAcp,\n stdio,\n });\n\n const spawnResult = await new Promise<{ pid: number } | { error: Error }>((resolve) => {\n child.on(\"error\", (err) => {\n resolve({ error: err });\n });\n\n if (child.pid != null) {\n resolve({ pid: child.pid });\n } else {\n child.once(\"spawn\", () => {\n if (child.pid == null) {\n resolve({ error: new Error(\"spawn event fired but pid is null\") });\n return;\n }\n resolve({ pid: child.pid });\n });\n }\n });\n\n if (\"error\" in spawnResult) {\n throw new AgentLaunchError(meta.name, spawnResult.error);\n }\n\n const pid = spawnResult.pid;\n\n if (!useAcp) {\n child.unref();\n }\n\n let earlyExit = false;\n child.once(\"exit\", () => { earlyExit = true; });\n\n child.on(\"error\", (err) => {\n logger.error({ name: meta.name, pid, error: err }, \"Backend process error after spawn\");\n });\n\n if (this.spawnVerifyDelayMs > 0) {\n await delay(this.spawnVerifyDelayMs);\n\n if (earlyExit || !isProcessAlive(pid)) {\n throw new AgentLaunchError(\n meta.name,\n new Error(`Process exited immediately after spawn (pid=${pid}, command=${command})`),\n );\n }\n }\n\n logger.info({ name: meta.name, pid, command, acp: useAcp }, \"Backend process spawned\");\n\n if (captureNonAcpLogs && child.stdout && child.stderr) {\n const logWriter = new ProcessLogWriter(workspaceDir, this.logWriterOptions);\n try {\n await logWriter.initialize();\n logWriter.attach(child.stdout, child.stderr);\n this.logWriters.set(meta.name, logWriter);\n logger.debug({ name: meta.name }, \"Process log capture enabled\");\n } catch (err) {\n logger.warn({ name: meta.name, error: err }, \"Failed to initialize log writer, continuing without log capture\");\n }\n }\n\n const result: AgentProcess = {\n pid,\n workspaceDir,\n instanceName: meta.name,\n };\n\n if (useAcp && child.stdin && child.stdout && child.stderr) {\n result.stdio = {\n stdin: child.stdin,\n stdout: child.stdout,\n stderr: child.stderr,\n };\n }\n\n return result;\n }\n\n getLogWriter(instanceName: string): ProcessLogWriter | undefined {\n return this.logWriters.get(instanceName);\n }\n\n async terminate(agentProcess: AgentProcess): Promise<void> {\n const { pid, instanceName } = agentProcess;\n\n const logWriter = this.logWriters.get(instanceName);\n if (logWriter) {\n await logWriter.close().catch(() => {});\n this.logWriters.delete(instanceName);\n }\n\n if (!isProcessAlive(pid)) {\n logger.info({ instanceName, pid }, \"Process already exited\");\n return;\n }\n\n logger.info({ instanceName, pid }, \"Sending SIGTERM\");\n sendSignal(pid, \"SIGTERM\");\n\n const deadline = Date.now() + this.terminateTimeoutMs;\n const pollInterval = 200;\n\n while (Date.now() < deadline) {\n await delay(pollInterval);\n if (!isProcessAlive(pid)) {\n logger.info({ instanceName, pid }, \"Process terminated gracefully\");\n return;\n }\n }\n\n logger.warn({ instanceName, pid }, \"Process did not exit after SIGTERM, sending SIGKILL\");\n sendSignal(pid, \"SIGKILL\");\n await delay(500);\n\n if (isProcessAlive(pid)) {\n logger.error({ instanceName, pid }, \"Process still alive after SIGKILL\");\n } else {\n logger.info({ instanceName, pid }, \"Process killed with SIGKILL\");\n }\n }\n}\n","import { createWriteStream, type WriteStream } from \"node:fs\";\nimport { mkdir, rename, stat, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport { createLogger } from \"@actant/shared\";\n\nconst logger = createLogger(\"process-log-writer\");\n\nconst DEFAULT_MAX_SIZE_BYTES = 10 * 1024 * 1024; // 10 MB\nconst DEFAULT_MAX_FILES = 3;\n\nexport interface ProcessLogWriterOptions {\n /** Max file size in bytes before rotation. Default: 10 MB. */\n maxSizeBytes?: number;\n /** Number of rotated files to keep. Default: 3. */\n maxFiles?: number;\n}\n\n/**\n * Captures stdout/stderr from a child process into log files within\n * {instanceDir}/logs/. Supports size-based log rotation.\n */\nexport class ProcessLogWriter {\n private readonly logsDir: string;\n private readonly maxSize: number;\n private readonly maxFiles: number;\n private stdoutStream: WriteStream | null = null;\n private stderrStream: WriteStream | null = null;\n private stdoutBytes = 0;\n private stderrBytes = 0;\n private closed = false;\n\n constructor(\n instanceDir: string,\n options?: ProcessLogWriterOptions,\n ) {\n this.logsDir = join(instanceDir, \"logs\");\n this.maxSize = options?.maxSizeBytes ?? DEFAULT_MAX_SIZE_BYTES;\n this.maxFiles = options?.maxFiles ?? DEFAULT_MAX_FILES;\n }\n\n /**\n * Initialize the log directory and open write streams.\n * Call this before piping process streams.\n */\n async initialize(): Promise<void> {\n await mkdir(this.logsDir, { recursive: true });\n this.stdoutStream = createWriteStream(join(this.logsDir, \"stdout.log\"), { flags: \"a\" });\n this.stderrStream = createWriteStream(join(this.logsDir, \"stderr.log\"), { flags: \"a\" });\n\n try {\n const stdoutStat = await stat(join(this.logsDir, \"stdout.log\"));\n this.stdoutBytes = stdoutStat.size;\n } catch { this.stdoutBytes = 0; }\n\n try {\n const stderrStat = await stat(join(this.logsDir, \"stderr.log\"));\n this.stderrBytes = stderrStat.size;\n } catch { this.stderrBytes = 0; }\n\n logger.debug({ logsDir: this.logsDir }, \"Log writer initialized\");\n }\n\n /**\n * Attach to readable streams from a spawned process.\n */\n attach(stdout: Readable | null, stderr: Readable | null): void {\n if (stdout && this.stdoutStream) {\n stdout.on(\"data\", (chunk: Buffer) => {\n if (this.closed || !this.stdoutStream) return;\n this.stdoutStream.write(chunk);\n this.stdoutBytes += chunk.length;\n if (this.stdoutBytes >= this.maxSize) {\n this.rotateFile(\"stdout.log\").catch(() => {});\n }\n });\n }\n\n if (stderr && this.stderrStream) {\n stderr.on(\"data\", (chunk: Buffer) => {\n if (this.closed || !this.stderrStream) return;\n this.stderrStream.write(chunk);\n this.stderrBytes += chunk.length;\n if (this.stderrBytes >= this.maxSize) {\n this.rotateFile(\"stderr.log\").catch(() => {});\n }\n });\n }\n }\n\n /**\n * Close all write streams gracefully.\n */\n async close(): Promise<void> {\n this.closed = true;\n await Promise.all([\n this.closeStream(this.stdoutStream),\n this.closeStream(this.stderrStream),\n ]);\n this.stdoutStream = null;\n this.stderrStream = null;\n }\n\n /**\n * Read the last N lines from a log file (stdout or stderr).\n */\n async readTail(stream: \"stdout\" | \"stderr\", lines: number): Promise<string[]> {\n const filePath = join(this.logsDir, `${stream}.log`);\n try {\n const content = await readFile(filePath, \"utf-8\");\n const allLines = content.split(\"\\n\").filter(Boolean);\n return allLines.slice(-lines);\n } catch {\n return [];\n }\n }\n\n get logDirectory(): string {\n return this.logsDir;\n }\n\n private async rotateFile(filename: string): Promise<void> {\n const basePath = join(this.logsDir, filename);\n const isStdout = filename === \"stdout.log\";\n\n const stream = isStdout ? this.stdoutStream : this.stderrStream;\n if (stream) {\n await this.closeStream(stream);\n }\n\n for (let i = this.maxFiles - 1; i >= 1; i--) {\n try {\n await rename(`${basePath}.${i}`, `${basePath}.${i + 1}`);\n } catch { /* old file may not exist */ }\n }\n\n try {\n await rename(basePath, `${basePath}.1`);\n } catch { /* file may not exist */ }\n\n const newStream = createWriteStream(basePath, { flags: \"a\" });\n if (isStdout) {\n this.stdoutStream = newStream;\n this.stdoutBytes = 0;\n } else {\n this.stderrStream = newStream;\n this.stderrBytes = 0;\n }\n\n logger.debug({ filename }, \"Log file rotated\");\n }\n\n private closeStream(stream: WriteStream | null): Promise<void> {\n if (!stream) return Promise.resolve();\n return new Promise((resolve) => {\n stream.end(() => resolve());\n });\n }\n}\n","import type { AgentLauncher } from \"./agent-launcher\";\nimport { MockLauncher } from \"./mock-launcher\";\nimport { ProcessLauncher, type ProcessLauncherOptions } from \"./process-launcher\";\n\nexport type LauncherMode = \"mock\" | \"real\";\n\nexport interface LauncherConfig {\n mode: LauncherMode;\n processOptions?: ProcessLauncherOptions;\n}\n\n/**\n * Factory function to create the appropriate AgentLauncher.\n *\n * - \"mock\": returns MockLauncher (for testing / development without real IDE)\n * - \"real\": returns ProcessLauncher (spawns actual processes)\n *\n * Default: \"real\" in production, can be overridden by config or env.\n */\nexport function createLauncher(config?: Partial<LauncherConfig>): AgentLauncher {\n const mode = config?.mode ?? (process.env.ACTANT_LAUNCHER_MODE === \"mock\" ? \"mock\" : \"real\");\n\n switch (mode) {\n case \"mock\":\n return new MockLauncher();\n case \"real\":\n return new ProcessLauncher(config?.processOptions);\n }\n}\n","import { z } from \"zod/v4\";\nimport type { ConfigValidationResult, SkillDefinition } from \"@actant/shared\";\nimport { BaseComponentManager } from \"../base-component-manager\";\n\nconst SkillDefinitionSchema = z\n .object({\n name: z.string().min(1),\n description: z.string().optional(),\n content: z.string().min(1),\n tags: z.array(z.string()).optional(),\n license: z.string().optional(),\n compatibility: z.string().optional(),\n allowedTools: z.array(z.string()).optional(),\n })\n .passthrough();\n\nexport class SkillManager extends BaseComponentManager<SkillDefinition> {\n protected readonly componentType = \"Skill\";\n\n constructor() {\n super(\"skill-manager\");\n }\n\n /** Render all resolved skills into a single AGENTS.md content block. */\n renderSkills(skills: SkillDefinition[]): string {\n const sections = skills.map((s) => {\n const header = `## ${s.name}`;\n const desc = s.description ? `\\n> ${s.description}\\n` : \"\";\n return `${header}${desc}\\n${s.content}`;\n });\n return `# Agent Skills\\n\\n${sections.join(\"\\n\\n---\\n\\n\")}\\n`;\n }\n\n validate(data: unknown, _source: string): ConfigValidationResult<SkillDefinition> {\n const result = SkillDefinitionSchema.safeParse(data);\n if (!result.success) {\n return {\n valid: false,\n errors: result.error.issues.map((i) => ({\n path: i.path.map(String).join(\".\"),\n message: i.message,\n severity: \"error\" as const,\n })),\n warnings: [],\n };\n }\n return { valid: true, data: result.data, errors: [], warnings: [] };\n }\n}\n","import { z } from \"zod/v4\";\nimport type { ConfigValidationResult, PromptDefinition } from \"@actant/shared\";\nimport { BaseComponentManager } from \"../base-component-manager\";\n\nconst PromptDefinitionSchema = z\n .object({\n name: z.string().min(1),\n description: z.string().optional(),\n content: z.string().min(1),\n variables: z.array(z.string()).optional(),\n })\n .passthrough();\n\nexport class PromptManager extends BaseComponentManager<PromptDefinition> {\n protected readonly componentType = \"Prompt\";\n\n constructor() {\n super(\"prompt-manager\");\n }\n\n /**\n * Render a prompt with variable interpolation.\n * Replaces {{variableName}} placeholders with provided values.\n */\n renderPrompt(prompt: PromptDefinition, variables?: Record<string, string>): string {\n if (!variables) return prompt.content;\n return prompt.content.replace(\n /\\{\\{(\\w+)\\}\\}/g,\n (_match: string, key: string) => variables[key] ?? `{{${key}}}`,\n );\n }\n\n /** Render multiple prompts into a single system.md content block. */\n renderPrompts(prompts: PromptDefinition[], variables?: Record<string, string>): string {\n const sections = prompts.map((p) => {\n const header = `## ${p.name}`;\n const desc = p.description ? `\\n> ${p.description}\\n` : \"\";\n const content = this.renderPrompt(p, variables);\n return `${header}${desc}\\n${content}`;\n });\n return `# System Prompts\\n\\n${sections.join(\"\\n\\n---\\n\\n\")}\\n`;\n }\n\n validate(data: unknown, _source: string): ConfigValidationResult<PromptDefinition> {\n const result = PromptDefinitionSchema.safeParse(data);\n if (!result.success) {\n return {\n valid: false,\n errors: result.error.issues.map((i) => ({\n path: i.path.map(String).join(\".\"),\n message: i.message,\n severity: \"error\" as const,\n })),\n warnings: [],\n };\n }\n return { valid: true, data: result.data, errors: [], warnings: [] };\n }\n}\n","import { z } from \"zod/v4\";\nimport type { ConfigValidationResult, McpServerDefinition } from \"@actant/shared\";\nimport { BaseComponentManager } from \"../base-component-manager\";\n\nconst McpServerDefinitionSchema = z\n .object({\n name: z.string().min(1),\n description: z.string().optional(),\n command: z.string().min(1),\n args: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n })\n .passthrough();\n\nexport class McpConfigManager extends BaseComponentManager<McpServerDefinition> {\n protected readonly componentType = \"McpServer\";\n\n constructor() {\n super(\"mcp-config-manager\");\n }\n\n /**\n * Render resolved MCP servers into the .cursor/mcp.json format.\n * Returns the JSON object ready to be serialized.\n */\n renderMcpConfig(servers: McpServerDefinition[]): Record<string, unknown> {\n const mcpServers: Record<string, { command: string; args: string[]; env?: Record<string, string> }> = {};\n for (const server of servers) {\n mcpServers[server.name] = {\n command: server.command,\n args: server.args ?? [],\n ...(server.env && Object.keys(server.env).length > 0 ? { env: server.env } : {}),\n };\n }\n return { mcpServers };\n }\n\n validate(data: unknown, _source: string): ConfigValidationResult<McpServerDefinition> {\n const result = McpServerDefinitionSchema.safeParse(data);\n if (!result.success) {\n return {\n valid: false,\n errors: result.error.issues.map((i) => ({\n path: i.path.map(String).join(\".\"),\n message: i.message,\n severity: \"error\" as const,\n })),\n warnings: [],\n };\n }\n return { valid: true, data: result.data, errors: [], warnings: [] };\n }\n}\n","import { z } from \"zod/v4\";\nimport type { ConfigValidationResult, WorkflowDefinition } from \"@actant/shared\";\nimport { BaseComponentManager } from \"../base-component-manager\";\n\nconst WorkflowDefinitionSchema = z\n .object({\n name: z.string().min(1),\n description: z.string().optional(),\n content: z.string().min(1),\n })\n .passthrough();\n\nexport class WorkflowManager extends BaseComponentManager<WorkflowDefinition> {\n protected readonly componentType = \"Workflow\";\n\n constructor() {\n super(\"workflow-manager\");\n }\n\n /** Get the workflow content ready to write to .trellis/workflow.md */\n renderWorkflow(workflow: WorkflowDefinition): string {\n return workflow.content;\n }\n\n validate(data: unknown, _source: string): ConfigValidationResult<WorkflowDefinition> {\n const result = WorkflowDefinitionSchema.safeParse(data);\n if (!result.success) {\n return {\n valid: false,\n errors: result.error.issues.map((i) => ({\n path: i.path.map(String).join(\".\"),\n message: i.message,\n severity: \"error\" as const,\n })),\n warnings: [],\n };\n }\n return { valid: true, data: result.data, errors: [], warnings: [] };\n }\n}\n","import { z } from \"zod/v4\";\nimport type { ConfigValidationResult, PluginDefinition } from \"@actant/shared\";\nimport { BaseComponentManager } from \"../base-component-manager\";\n\nconst PluginDefinitionSchema = z\n .object({\n name: z.string().min(1),\n description: z.string().optional(),\n type: z.enum([\"npm\", \"file\", \"config\"]),\n source: z.string().optional(),\n config: z.record(z.string(), z.unknown()).optional(),\n enabled: z.boolean().optional().default(true),\n })\n .passthrough();\n\nexport class PluginManager extends BaseComponentManager<PluginDefinition> {\n protected readonly componentType = \"Plugin\";\n\n constructor() {\n super(\"plugin-manager\");\n }\n\n /**\n * Render plugins into a Claude Code plugins.json format.\n * Only includes enabled plugins with npm type.\n */\n renderPluginsJson(plugins: PluginDefinition[]): string {\n const entries = plugins\n .filter((p) => p.enabled !== false)\n .map((p) => {\n if (p.type === \"npm\") {\n return { name: p.name, package: p.source ?? p.name, ...p.config };\n }\n return { name: p.name, type: p.type, source: p.source, ...p.config };\n });\n return JSON.stringify(entries, null, 2);\n }\n\n /**\n * Render plugins as a Cursor extensions.json format.\n */\n renderExtensionsJson(plugins: PluginDefinition[]): string {\n const recommendations = plugins\n .filter((p) => p.enabled !== false && p.type === \"npm\")\n .map((p) => p.source ?? p.name);\n return JSON.stringify({ recommendations }, null, 2);\n }\n\n validate(data: unknown, _source: string): ConfigValidationResult<PluginDefinition> {\n const result = PluginDefinitionSchema.safeParse(data);\n if (!result.success) {\n return {\n valid: false,\n errors: result.error.issues.map((i) => ({\n path: i.path.map(String).join(\".\"),\n message: i.message,\n severity: \"error\" as const,\n })),\n warnings: [],\n };\n }\n return { valid: true, data: result.data, errors: [], warnings: [] };\n }\n}\n","import type { PermissionsConfig } from \"@actant/shared\";\nimport { createLogger } from \"@actant/shared\";\n\nconst logger = createLogger(\"permission-policy-enforcer\");\n\n/**\n * Minimal tool information extracted from ACP RequestPermissionRequest.toolCall\n * for pattern matching against PermissionsConfig rules.\n */\nexport interface ToolCallInfo {\n /** ACP ToolKind: read | edit | delete | move | search | execute | think | fetch | switch_mode | other */\n kind?: string;\n /** Human-readable title, e.g. \"Bash: npm run build\", \"Write to /src/foo.ts\" */\n title?: string;\n /** Tool call ID for audit trail */\n toolCallId: string;\n}\n\nexport type PolicyAction = \"allow\" | \"deny\" | \"ask\";\n\nexport interface PolicyDecision {\n action: PolicyAction;\n matchedRule?: string;\n}\n\n/**\n * Maps ACP ToolKind values to Claude Code tool names for pattern matching.\n */\nconst KIND_TO_TOOL: Record<string, string> = {\n read: \"Read\",\n edit: \"Edit\",\n execute: \"Bash\",\n fetch: \"WebFetch\",\n search: \"WebSearch\",\n delete: \"Write\",\n move: \"Write\",\n};\n\n/**\n * Permission policy enforcer that evaluates ACP tool calls against\n * a PermissionsConfig (allow/deny/ask lists with Claude Code glob syntax).\n *\n * Evaluation order: deny -> ask -> allow (deny wins).\n */\nexport class PermissionPolicyEnforcer {\n private config: PermissionsConfig;\n\n constructor(config: PermissionsConfig) {\n this.config = { ...config };\n }\n\n updateConfig(config: PermissionsConfig): void {\n this.config = { ...config };\n logger.info(\"Permission policy config updated\");\n }\n\n getConfig(): Readonly<PermissionsConfig> {\n return this.config;\n }\n\n /**\n * Evaluate a tool call against the configured permission rules.\n * Order: deny > ask > allow > defaultMode fallback.\n */\n evaluate(toolCall: ToolCallInfo): PolicyDecision {\n const toolName = this.extractToolName(toolCall);\n const toolArg = this.extractToolArg(toolCall);\n\n // Phase 1: Check deny list\n const denyMatch = this.matchList(this.config.deny, toolName, toolArg);\n if (denyMatch) {\n return { action: \"deny\", matchedRule: denyMatch };\n }\n\n // Phase 2: Check ask list\n const askMatch = this.matchList(this.config.ask, toolName, toolArg);\n if (askMatch) {\n return { action: \"ask\", matchedRule: askMatch };\n }\n\n // Phase 3: Check allow list\n const allowMatch = this.matchList(this.config.allow, toolName, toolArg);\n if (allowMatch) {\n return { action: \"allow\", matchedRule: allowMatch };\n }\n\n // Phase 4: Default — not explicitly listed anywhere\n const mode = this.config.defaultMode ?? \"default\";\n if (mode === \"bypassPermissions\") {\n return { action: \"allow\" };\n }\n return { action: \"deny\" };\n }\n\n /**\n * Build an ACP RequestPermissionOutcome from a PolicyDecision.\n * Returns the appropriate option selection based on the decision.\n */\n buildOutcome(\n decision: PolicyDecision,\n options: ReadonlyArray<{ kind: string; optionId: string }>,\n ): { outcome: \"selected\"; optionId: string } | { outcome: \"cancelled\" } {\n if (decision.action === \"allow\") {\n const opt = options.find((o) => o.kind === \"allow_once\" || o.kind === \"allow_always\");\n if (opt) return { outcome: \"selected\", optionId: opt.optionId };\n }\n if (decision.action === \"deny\") {\n const opt = options.find((o) => o.kind === \"reject_once\" || o.kind === \"reject_always\");\n if (opt) return { outcome: \"selected\", optionId: opt.optionId };\n return { outcome: \"cancelled\" };\n }\n // \"ask\" — no auto-decision, return cancelled to let caller decide (e.g. forward to IDE)\n return { outcome: \"cancelled\" };\n }\n\n /* ---------------------------------------------------------------- */\n /* Tool info extraction */\n /* ---------------------------------------------------------------- */\n\n private extractToolName(toolCall: ToolCallInfo): string {\n if (toolCall.title) {\n const colonIdx = toolCall.title.indexOf(\":\");\n if (colonIdx > 0) {\n const prefix = toolCall.title.slice(0, colonIdx).trim();\n if (prefix && /^[A-Za-z_][\\w]*$/.test(prefix)) {\n return prefix;\n }\n }\n const match = toolCall.title.match(/^\\[?Tool:\\s*(\\w+)\\]?/);\n if (match?.[1]) return match[1];\n\n const writeMatch = toolCall.title.match(/^(Write|Read|Edit|MultiEdit)\\b/i);\n if (writeMatch?.[1]) return writeMatch[1];\n }\n\n if (toolCall.kind) {\n const mapped = KIND_TO_TOOL[toolCall.kind];\n if (mapped) return mapped;\n }\n\n return toolCall.kind ?? \"unknown\";\n }\n\n private extractToolArg(toolCall: ToolCallInfo): string | undefined {\n if (!toolCall.title) return undefined;\n const colonIdx = toolCall.title.indexOf(\":\");\n if (colonIdx > 0) {\n return toolCall.title.slice(colonIdx + 1).trim();\n }\n const toMatch = toolCall.title.match(/^(?:Write|Read|Edit)\\s+(?:to\\s+)?(.+)/i);\n if (toMatch?.[1]) return toMatch[1].trim();\n return undefined;\n }\n\n /* ---------------------------------------------------------------- */\n /* Pattern matching */\n /* ---------------------------------------------------------------- */\n\n /**\n * Check if toolName+toolArg match any pattern in the list.\n * Returns the matched pattern string, or undefined.\n */\n private matchList(\n list: string[] | undefined,\n toolName: string,\n toolArg: string | undefined,\n ): string | undefined {\n if (!list || list.length === 0) return undefined;\n\n for (const pattern of list) {\n if (this.matchPattern(pattern, toolName, toolArg)) {\n return pattern;\n }\n }\n return undefined;\n }\n\n /**\n * Match a single Claude Code permission pattern against tool name + arg.\n *\n * Supported formats:\n * \"*\" — matches everything\n * \"ToolName\" — matches tool by name (case-insensitive)\n * \"Tool(specifier)\" — matches tool with glob specifier\n * \"mcp__server\" — matches MCP server prefix\n * \"mcp__server__tool\" — matches specific MCP tool\n */\n private matchPattern(pattern: string, toolName: string, toolArg: string | undefined): boolean {\n if (pattern === \"*\") return true;\n\n // MCP pattern: \"mcp__server\" or \"mcp__server__tool\"\n if (pattern.startsWith(\"mcp__\")) {\n const lowerName = toolName.toLowerCase();\n const lowerPattern = pattern.toLowerCase();\n return lowerName === lowerPattern || lowerName.startsWith(lowerPattern + \"__\");\n }\n\n // Tool(specifier) pattern\n const parenIdx = pattern.indexOf(\"(\");\n if (parenIdx > 0 && pattern.endsWith(\")\")) {\n const patternTool = pattern.slice(0, parenIdx);\n const specifier = pattern.slice(parenIdx + 1, -1);\n\n if (!this.toolNameMatches(patternTool, toolName)) return false;\n if (!toolArg) return false;\n return globMatch(specifier, toolArg);\n }\n\n // Plain tool name\n return this.toolNameMatches(pattern, toolName);\n }\n\n private toolNameMatches(patternName: string, toolName: string): boolean {\n return patternName.toLowerCase() === toolName.toLowerCase();\n }\n}\n\n/**\n * Simple glob matcher supporting * (match any sequence) and ** (match across path separators).\n * Sufficient for Claude Code permission patterns like \"npm run *\", \"./src/**\", \"domain:*.com\".\n */\nexport function globMatch(pattern: string, input: string): boolean {\n const regex = globToRegex(pattern);\n return regex.test(input);\n}\n\nfunction globToRegex(pattern: string): RegExp {\n let regexStr = \"^\";\n let i = 0;\n while (i < pattern.length) {\n const ch = pattern.charAt(i);\n if (ch === \"*\" && pattern.charAt(i + 1) === \"*\") {\n regexStr += \".*\";\n i += 2;\n if (pattern.charAt(i) === \"/\") i++;\n } else if (ch === \"*\") {\n regexStr += \"[^/]*\";\n i++;\n } else if (ch === \"?\") {\n regexStr += \"[^/]\";\n i++;\n } else {\n regexStr += escapeRegex(ch);\n i++;\n }\n }\n regexStr += \"$\";\n return new RegExp(regexStr, \"i\");\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import { createLogger } from \"@actant/shared\";\nimport type { ToolCallInfo, PolicyDecision } from \"./permission-policy-enforcer\";\n\nconst logger = createLogger(\"permission-audit\");\n\nexport type PermissionAuditEvent =\n | \"permission.resolved\"\n | \"permission.injected\"\n | \"permission.evaluated\"\n | \"permission.updated\";\n\nexport interface AuditEntry {\n event: PermissionAuditEvent;\n instanceName?: string;\n templateName?: string;\n toolCall?: ToolCallInfo;\n decision?: PolicyDecision;\n detail?: Record<string, unknown>;\n timestamp: string;\n}\n\nexport class PermissionAuditLogger {\n private readonly instanceName: string | undefined;\n\n constructor(instanceName?: string) {\n this.instanceName = instanceName;\n }\n\n log(event: PermissionAuditEvent, detail?: Omit<AuditEntry, \"event\" | \"timestamp\" | \"instanceName\">): void {\n const entry: AuditEntry = {\n event,\n instanceName: this.instanceName,\n ...detail,\n timestamp: new Date().toISOString(),\n };\n logger.info(entry, `[audit] ${event}`);\n }\n\n logEvaluation(toolCall: ToolCallInfo, decision: PolicyDecision): void {\n this.log(\"permission.evaluated\", { toolCall, decision });\n }\n\n logResolved(templateName: string, preset?: string): void {\n this.log(\"permission.resolved\", {\n templateName,\n detail: preset ? { preset } : undefined,\n });\n }\n\n logInjected(backendType: string): void {\n this.log(\"permission.injected\", { detail: { backendType } });\n }\n\n logUpdated(source: string): void {\n this.log(\"permission.updated\", { detail: { source } });\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { createLogger } from \"@actant/shared\";\n\nconst logger = createLogger(\"session-registry\");\n\nconst DEFAULT_IDLE_TTL_MS = 30 * 60 * 1000; // 30 minutes\nconst TTL_CHECK_INTERVAL_MS = 60 * 1000; // 1 minute\n\nexport type SessionState = \"active\" | \"idle\" | \"expired\";\n\nexport interface SessionLease {\n sessionId: string;\n agentName: string;\n /** Currently-bound client identifier. null when idle (client disconnected). */\n clientId: string | null;\n state: SessionState;\n createdAt: string;\n lastActivityAt: string;\n /** Milliseconds of idle time before the session expires. */\n idleTtlMs: number;\n}\n\nexport interface CreateSessionOptions {\n agentName: string;\n clientId: string;\n idleTtlMs?: number;\n}\n\nexport interface SessionRegistryOptions {\n defaultIdleTtlMs?: number;\n ttlCheckIntervalMs?: number;\n}\n\n/**\n * In-memory registry of Session Lease objects.\n * Tracks which client owns which session, handles idle/expire transitions,\n * and runs a periodic sweep to expire stale sessions.\n */\nexport class SessionRegistry {\n private sessions = new Map<string, SessionLease>();\n private sweepTimer: ReturnType<typeof setInterval> | null = null;\n private readonly defaultIdleTtlMs: number;\n private onExpireCallback?: (session: SessionLease) => void;\n\n constructor(options?: SessionRegistryOptions) {\n this.defaultIdleTtlMs = options?.defaultIdleTtlMs ?? DEFAULT_IDLE_TTL_MS;\n const interval = options?.ttlCheckIntervalMs ?? TTL_CHECK_INTERVAL_MS;\n this.sweepTimer = setInterval(() => this.sweepExpired(), interval);\n this.sweepTimer.unref();\n }\n\n /** Register a callback invoked when a session expires. */\n onExpire(callback: (session: SessionLease) => void): void {\n this.onExpireCallback = callback;\n }\n\n /** Create a new session for an agent, bound to a client. */\n create(opts: CreateSessionOptions): SessionLease {\n const now = new Date().toISOString();\n const session: SessionLease = {\n sessionId: randomUUID(),\n agentName: opts.agentName,\n clientId: opts.clientId,\n state: \"active\",\n createdAt: now,\n lastActivityAt: now,\n idleTtlMs: opts.idleTtlMs ?? this.defaultIdleTtlMs,\n };\n this.sessions.set(session.sessionId, session);\n logger.info({ sessionId: session.sessionId, agentName: opts.agentName, clientId: opts.clientId }, \"Session created\");\n return session;\n }\n\n /** Get a session by ID, or undefined if not found. */\n get(sessionId: string): SessionLease | undefined {\n return this.sessions.get(sessionId);\n }\n\n /** List all sessions, optionally filtered by agent name. */\n list(agentName?: string): SessionLease[] {\n const all = Array.from(this.sessions.values());\n return agentName ? all.filter((s) => s.agentName === agentName) : all;\n }\n\n /**\n * Record activity on a session, updating lastActivityAt\n * and ensuring state is \"active\".\n */\n touch(sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (!session || session.state === \"expired\") return;\n session.lastActivityAt = new Date().toISOString();\n session.state = \"active\";\n }\n\n /**\n * Mark a session as idle (client disconnected but session is kept alive).\n * The session will expire after its idleTtlMs elapses.\n */\n release(sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (!session || session.state === \"expired\") return;\n session.clientId = null;\n session.state = \"idle\";\n session.lastActivityAt = new Date().toISOString();\n logger.info({ sessionId, agentName: session.agentName }, \"Session released to idle\");\n }\n\n /**\n * Resume an idle session, binding it to a (potentially new) client.\n * Returns false if the session is not found, expired, or already active.\n */\n resume(sessionId: string, clientId: string): boolean {\n const session = this.sessions.get(sessionId);\n if (!session || session.state === \"expired\") return false;\n if (session.state === \"active\" && session.clientId !== null) return false;\n\n session.clientId = clientId;\n session.state = \"active\";\n session.lastActivityAt = new Date().toISOString();\n logger.info({ sessionId, clientId, agentName: session.agentName }, \"Session resumed\");\n return true;\n }\n\n /** Explicitly close and remove a session. */\n close(sessionId: string): boolean {\n const session = this.sessions.get(sessionId);\n if (!session) return false;\n this.sessions.delete(sessionId);\n logger.info({ sessionId, agentName: session.agentName }, \"Session closed\");\n return true;\n }\n\n /** Close all sessions for a given agent. */\n closeByAgent(agentName: string): number {\n let count = 0;\n for (const [id, session] of this.sessions) {\n if (session.agentName === agentName) {\n this.sessions.delete(id);\n count++;\n }\n }\n if (count > 0) {\n logger.info({ agentName, count }, \"Sessions closed for agent\");\n }\n return count;\n }\n\n /** Number of active sessions. */\n get size(): number {\n return this.sessions.size;\n }\n\n /** Stop the TTL sweep timer and clear all sessions. */\n dispose(): void {\n if (this.sweepTimer) {\n clearInterval(this.sweepTimer);\n this.sweepTimer = null;\n }\n this.sessions.clear();\n }\n\n private sweepExpired(): void {\n const now = Date.now();\n for (const [id, session] of this.sessions) {\n if (session.state !== \"idle\") continue;\n\n const lastActivity = new Date(session.lastActivityAt).getTime();\n if (now - lastActivity > session.idleTtlMs) {\n session.state = \"expired\";\n this.sessions.delete(id);\n logger.info({ sessionId: id, agentName: session.agentName, idleMs: now - lastActivity }, \"Session expired (TTL)\");\n this.onExpireCallback?.(session);\n }\n }\n }\n}\n","import { join } from \"node:path\";\nimport { mkdir, rm } from \"node:fs/promises\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport type { GitHubSourceConfig } from \"@actant/shared\";\nimport { createLogger } from \"@actant/shared\";\nimport type { ComponentSource, FetchResult } from \"./component-source\";\nimport { LocalSource } from \"./local-source\";\n\nconst execFileAsync = promisify(execFile);\nconst logger = createLogger(\"github-source\");\n\n/**\n * Fetches component packages from GitHub repositories via shallow clone.\n * After cloning, delegates to LocalSource for actual file parsing.\n */\nexport class GitHubSource implements ComponentSource {\n readonly type = \"github\";\n readonly packageName: string;\n readonly config: GitHubSourceConfig;\n private readonly cacheDir: string;\n\n constructor(packageName: string, config: GitHubSourceConfig, cacheDir: string) {\n this.packageName = packageName;\n this.config = config;\n this.cacheDir = join(cacheDir, packageName);\n }\n\n getRootDir(): string {\n return this.cacheDir;\n }\n\n async fetch(): Promise<FetchResult> {\n await this.clone();\n return this.readCached();\n }\n\n async sync(): Promise<FetchResult> {\n try {\n await this.pull();\n } catch {\n logger.info(\"Pull failed, re-cloning\");\n await this.clone();\n }\n return this.readCached();\n }\n\n async dispose(): Promise<void> {\n await rm(this.cacheDir, { recursive: true, force: true });\n logger.debug({ cacheDir: this.cacheDir }, \"Cache cleaned\");\n }\n\n private async clone(): Promise<void> {\n await rm(this.cacheDir, { recursive: true, force: true });\n await mkdir(this.cacheDir, { recursive: true });\n const branch = this.config.branch ?? \"main\";\n const args = [\"clone\", \"--depth\", \"1\", \"--branch\", branch, this.config.url, this.cacheDir];\n logger.info({ url: this.config.url, branch }, \"Cloning repository\");\n await execFileAsync(\"git\", args, { timeout: 60_000 });\n }\n\n private async pull(): Promise<void> {\n await execFileAsync(\"git\", [\"pull\", \"--depth\", \"1\"], {\n cwd: this.cacheDir,\n timeout: 30_000,\n });\n }\n\n private async readCached(): Promise<FetchResult> {\n const localSource = new LocalSource(this.packageName, { type: \"local\", path: this.cacheDir });\n return localSource.fetch();\n }\n}\n","import { readFile, readdir, stat } from \"node:fs/promises\";\nimport { join, extname } from \"node:path\";\nimport type {\n LocalSourceConfig,\n PackageManifest,\n PresetDefinition,\n SkillDefinition,\n PromptDefinition,\n McpServerDefinition,\n WorkflowDefinition,\n BackendDefinition,\n AgentTemplate,\n} from \"@actant/shared\";\nimport { createLogger } from \"@actant/shared\";\nimport type { ComponentSource, FetchResult } from \"./component-source\";\n\nconst logger = createLogger(\"local-source\");\n\nexport class LocalSource implements ComponentSource {\n readonly type = \"local\";\n readonly packageName: string;\n readonly config: LocalSourceConfig;\n\n constructor(packageName: string, config: LocalSourceConfig) {\n this.packageName = packageName;\n this.config = config;\n }\n\n getRootDir(): string {\n return this.config.path;\n }\n\n async fetch(): Promise<FetchResult> {\n return this.loadPackage();\n }\n\n async sync(): Promise<FetchResult> {\n return this.loadPackage();\n }\n\n async dispose(): Promise<void> {\n // local source has no cache to clean up\n }\n\n private async loadPackage(): Promise<FetchResult> {\n const rootDir = this.config.path;\n const manifest = await this.loadManifest(rootDir);\n\n const [skills, prompts, mcpServers, workflows, backends, presets, templates] = await Promise.all([\n this.loadJsonDir<SkillDefinition>(rootDir, manifest.components?.skills, \"skills\"),\n this.loadJsonDir<PromptDefinition>(rootDir, manifest.components?.prompts, \"prompts\"),\n this.loadJsonDir<McpServerDefinition>(rootDir, manifest.components?.mcp, \"mcp\"),\n this.loadJsonDir<WorkflowDefinition>(rootDir, manifest.components?.workflows, \"workflows\"),\n this.loadJsonDir<BackendDefinition>(rootDir, manifest.components?.backends, \"backends\"),\n this.loadPresets(rootDir, manifest.presets),\n this.loadJsonDir<AgentTemplate>(rootDir, manifest.components?.templates, \"templates\"),\n ]);\n\n logger.info({ packageName: this.packageName, rootDir }, \"Local package loaded\");\n return { manifest, skills, prompts, mcpServers, workflows, backends, presets, templates };\n }\n\n private async loadManifest(rootDir: string): Promise<PackageManifest> {\n const manifestPath = join(rootDir, \"actant.json\");\n try {\n const raw = await readFile(manifestPath, \"utf-8\");\n return JSON.parse(raw) as PackageManifest;\n } catch {\n logger.debug({ rootDir }, \"No actant.json found, scanning directories\");\n return { name: this.packageName };\n }\n }\n\n private async loadJsonDir<T>(\n rootDir: string,\n explicitFiles: string[] | undefined,\n subDir: string,\n ): Promise<T[]> {\n if (explicitFiles) {\n const items: T[] = [];\n for (const relPath of explicitFiles) {\n try {\n const raw = await readFile(join(rootDir, relPath), \"utf-8\");\n items.push(JSON.parse(raw) as T);\n } catch (err) {\n logger.warn({ file: relPath, error: err }, `Failed to load from manifest, skipping`);\n }\n }\n return items;\n }\n\n const dirPath = join(rootDir, subDir);\n try {\n const dirStat = await stat(dirPath);\n if (!dirStat.isDirectory()) return [];\n } catch {\n return [];\n }\n\n const entries = await readdir(dirPath);\n const items: T[] = [];\n\n for (const file of entries) {\n if (extname(file) !== \".json\") continue;\n const fullPath = join(dirPath, file);\n try {\n const fileStat = await stat(fullPath);\n if (!fileStat.isFile()) continue;\n const raw = await readFile(fullPath, \"utf-8\");\n items.push(JSON.parse(raw) as T);\n } catch (err) {\n logger.warn({ file, error: err }, `Failed to load ${subDir} file, skipping`);\n }\n }\n\n // Also check subdirectories for manifest.json (directory-based components)\n for (const entry of entries) {\n if (extname(entry) === \".json\") continue;\n const subDirPath = join(dirPath, entry);\n try {\n const subStat = await stat(subDirPath);\n if (!subStat.isDirectory()) continue;\n const manifestPath = join(subDirPath, \"manifest.json\");\n const mRaw = await readFile(manifestPath, \"utf-8\");\n const parsed = JSON.parse(mRaw) as Record<string, unknown>;\n if (typeof parsed.content === \"string\" && parsed.content.endsWith(\".md\")) {\n try {\n const content = await readFile(join(subDirPath, parsed.content), \"utf-8\");\n parsed.content = content;\n } catch {\n /* use as-is */\n }\n }\n if (!parsed.name) parsed.name = entry;\n items.push(parsed as T);\n } catch {\n /* skip */\n }\n }\n\n // For skills specifically, also check SKILL.md in subdirectories\n if (subDir === \"skills\") {\n const { parseSkillMd } = await import(\"./skill-md-parser\");\n for (const entry of entries) {\n if (extname(entry) === \".json\") continue;\n const subDirPath = join(dirPath, entry);\n try {\n const subStat = await stat(subDirPath);\n if (!subStat.isDirectory()) continue;\n const skillMdPath = join(subDirPath, \"SKILL.md\");\n const skill = await parseSkillMd(skillMdPath);\n if (skill && !(items as Array<{ name: string }>).find((i) => i.name === skill.name)) {\n items.push(skill as unknown as T);\n }\n } catch {\n /* skip */\n }\n }\n }\n\n return items;\n }\n\n private async loadPresets(\n rootDir: string,\n explicitFiles: string[] | undefined,\n ): Promise<PresetDefinition[]> {\n return this.loadJsonDir<PresetDefinition>(rootDir, explicitFiles, \"presets\");\n }\n}\n","import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n SourceConfig,\n SourceEntry,\n PresetDefinition,\n SkillDefinition,\n PromptDefinition,\n McpServerDefinition,\n WorkflowDefinition,\n BackendDefinition,\n AgentTemplate,\n} from \"@actant/shared\";\n\nexport const DEFAULT_SOURCE_NAME = \"actant-hub\";\nexport const DEFAULT_SOURCE_CONFIG: SourceConfig = {\n type: \"github\" as const,\n url: \"https://github.com/blackplume233/actant-hub.git\",\n branch: \"main\",\n};\nimport { createLogger } from \"@actant/shared\";\nimport type { ComponentSource, FetchResult } from \"./component-source\";\nimport type { BaseComponentManager, NamedComponent } from \"../domain/base-component-manager\";\nimport type { TemplateRegistry } from \"../template/registry/template-registry\";\nimport { GitHubSource } from \"./github-source\";\nimport { LocalSource } from \"./local-source\";\nimport {\n createEmptySyncReport,\n mergeSyncReports,\n type SyncReport,\n type ComponentTypeName,\n} from \"../version\";\n\nconst logger = createLogger(\"source-manager\");\n\nexport interface SourceManagerDeps {\n skillManager: BaseComponentManager<SkillDefinition>;\n promptManager: BaseComponentManager<PromptDefinition>;\n mcpConfigManager: BaseComponentManager<McpServerDefinition>;\n workflowManager: BaseComponentManager<WorkflowDefinition>;\n backendManager?: BaseComponentManager<BackendDefinition>;\n templateRegistry?: TemplateRegistry;\n}\n\n/**\n * Manages component sources (GitHub repos, local dirs, etc.).\n * Syncs remote components into the domain managers with `package@name` namespacing.\n */\nexport interface SourceManagerOptions {\n /** Skip auto-registration of the default actant-hub source (useful for tests). */\n skipDefaultSource?: boolean;\n}\n\nexport class SourceManager {\n private readonly sources = new Map<string, ComponentSource>();\n private readonly presets = new Map<string, PresetDefinition>();\n private readonly managers: SourceManagerDeps;\n private readonly homeDir: string;\n private readonly sourcesFilePath: string;\n private readonly cacheDir: string;\n private readonly skipDefaultSource: boolean;\n\n constructor(homeDir: string, managers: SourceManagerDeps, options?: SourceManagerOptions) {\n this.homeDir = homeDir;\n this.managers = managers;\n this.sourcesFilePath = join(homeDir, \"sources.json\");\n this.cacheDir = join(homeDir, \"sources-cache\");\n this.skipDefaultSource = options?.skipDefaultSource ?? false;\n }\n\n // ---------------------------------------------------------------------------\n // Source CRUD\n // ---------------------------------------------------------------------------\n\n async addSource(name: string, config: SourceConfig): Promise<FetchResult> {\n if (this.sources.has(name)) {\n throw new Error(`Source \"${name}\" already registered`);\n }\n const source = this.createSource(name, config);\n const result = await source.fetch();\n this.sources.set(name, source);\n this.injectComponents(name, result);\n await this.persistSources();\n logger.info({ name, type: config.type }, \"Source added\");\n return result;\n }\n\n async syncSource(name: string): Promise<FetchResult> {\n const { fetchResult } = await this.syncSourceWithReport(name);\n return fetchResult;\n }\n\n async syncSourceWithReport(name: string): Promise<{ fetchResult: FetchResult; report: SyncReport }> {\n const source = this.getSourceOrThrow(name);\n const oldSnapshot = this.snapshotComponents(name);\n this.removeNamespacedComponents(name);\n const result = await source.sync();\n this.injectComponents(name, result);\n const newSnapshot = this.snapshotComponents(name);\n await this.persistSources();\n const report = this.buildSyncReport(oldSnapshot, newSnapshot);\n logger.info({ name, report }, \"Source synced\");\n return { fetchResult: result, report };\n }\n\n async syncAll(): Promise<void> {\n await this.syncAllWithReport();\n }\n\n async syncAllWithReport(): Promise<{ report: SyncReport }> {\n const reports: SyncReport[] = [];\n for (const name of this.sources.keys()) {\n try {\n const { report } = await this.syncSourceWithReport(name);\n reports.push(report);\n } catch (err) {\n logger.warn({ name, error: err }, \"Failed to sync source, skipping\");\n }\n }\n return { report: mergeSyncReports(reports) };\n }\n\n async removeSource(name: string): Promise<boolean> {\n const source = this.sources.get(name);\n if (!source) return false;\n this.removeNamespacedComponents(name);\n this.removeNamespacedPresets(name);\n await source.dispose();\n this.sources.delete(name);\n await this.persistSources();\n logger.info({ name }, \"Source removed\");\n return true;\n }\n\n listSources(): SourceEntry[] {\n return Array.from(this.sources.entries()).map(([name, source]) => ({\n name,\n config: source.config,\n syncedAt: new Date().toISOString(),\n }));\n }\n\n hasSource(name: string): boolean {\n return this.sources.has(name);\n }\n\n /** Resolve a registered source name to its filesystem root directory. */\n getSourceRootDir(name: string): string {\n return this.getSourceOrThrow(name).getRootDir();\n }\n\n // ---------------------------------------------------------------------------\n // Preset operations\n // ---------------------------------------------------------------------------\n\n listPresets(packageName?: string): PresetDefinition[] {\n const all = Array.from(this.presets.values());\n if (!packageName) return all;\n const prefix = `${packageName}@`;\n return all.filter((p) => p.name.startsWith(prefix));\n }\n\n getPreset(qualifiedName: string): PresetDefinition | undefined {\n return this.presets.get(qualifiedName);\n }\n\n /**\n * Apply a preset to a template — expands preset component refs\n * into the template's domainContext with `package@name` namespacing.\n * Returns a new template (does not mutate input).\n */\n applyPreset(qualifiedName: string, template: AgentTemplate): AgentTemplate {\n const preset = this.presets.get(qualifiedName);\n if (!preset) {\n throw new Error(`Preset \"${qualifiedName}\" not found`);\n }\n\n const packageName = qualifiedName.split(\"@\")[0];\n const ns = (name: string) => `${packageName}@${name}`;\n\n const dc = { ...template.domainContext };\n if (preset.skills?.length) {\n dc.skills = [...(dc.skills ?? []), ...preset.skills.map(ns)];\n }\n if (preset.prompts?.length) {\n dc.prompts = [...(dc.prompts ?? []), ...preset.prompts.map(ns)];\n }\n if (preset.mcpServers?.length) {\n const newRefs = preset.mcpServers.map((mcpName: string) => {\n const fullName = ns(mcpName);\n const existing = this.managers.mcpConfigManager.get(fullName);\n return {\n name: fullName,\n command: existing?.command ?? \"\",\n args: existing?.args,\n env: existing?.env,\n };\n });\n dc.mcpServers = [...(dc.mcpServers ?? []), ...newRefs];\n }\n if (preset.workflows?.length) {\n const firstWorkflow = preset.workflows[0];\n if (firstWorkflow && !dc.workflow) {\n dc.workflow = ns(firstWorkflow);\n }\n }\n if (preset.templates?.length && this.managers.templateRegistry) {\n for (const tplName of preset.templates) {\n const fullName = ns(tplName);\n const tpl = this.managers.templateRegistry.get(fullName);\n if (tpl) {\n this.managers.templateRegistry.register(tpl);\n }\n }\n }\n\n return { ...template, domainContext: dc };\n }\n\n // ---------------------------------------------------------------------------\n // Initialization (load persisted sources on startup)\n // ---------------------------------------------------------------------------\n\n async initialize(): Promise<void> {\n let entries: SourceEntry[] = [];\n try {\n const raw = await readFile(this.sourcesFilePath, \"utf-8\");\n const data = JSON.parse(raw) as { sources?: Record<string, SourceConfig> };\n entries = Object.entries(data.sources ?? {}).map(([name, config]) => ({ name, config }));\n } catch {\n logger.debug(\"No sources.json found, starting with empty sources\");\n }\n\n for (const entry of entries) {\n try {\n const source = this.createSource(entry.name, entry.config);\n const result = await source.fetch();\n this.sources.set(entry.name, source);\n this.injectComponents(entry.name, result);\n logger.info({ name: entry.name }, \"Source restored from config\");\n } catch (err) {\n logger.warn({ name: entry.name, error: err }, \"Failed to restore source, skipping\");\n }\n }\n\n await this.ensureDefaultSource();\n }\n\n /**\n * Registers the official actant-hub as the default source if not already present.\n * Fails silently when offline or the repo is unreachable.\n */\n private async ensureDefaultSource(): Promise<void> {\n if (this.skipDefaultSource) return;\n if (this.sources.has(DEFAULT_SOURCE_NAME)) return;\n try {\n await this.addSource(DEFAULT_SOURCE_NAME, DEFAULT_SOURCE_CONFIG);\n logger.info(\"Default source registered: %s\", DEFAULT_SOURCE_NAME);\n } catch (err) {\n logger.debug({ error: err }, \"Failed to register default source (offline?), skipping\");\n }\n }\n\n // ---------------------------------------------------------------------------\n // Internals\n // ---------------------------------------------------------------------------\n\n private createSource(name: string, config: SourceConfig): ComponentSource {\n switch (config.type) {\n case \"github\":\n return new GitHubSource(name, config, this.cacheDir);\n case \"local\":\n return new LocalSource(name, config);\n default:\n throw new Error(`Unsupported source type: ${(config as { type: string }).type}`);\n }\n }\n\n private injectComponents(packageName: string, result: FetchResult): void {\n const ns = (c: NamedComponent) => ({ ...c, name: `${packageName}@${c.name}` });\n\n for (const skill of result.skills) {\n this.managers.skillManager.register(ns(skill) as SkillDefinition);\n }\n for (const prompt of result.prompts) {\n this.managers.promptManager.register(ns(prompt) as PromptDefinition);\n }\n for (const mcp of result.mcpServers) {\n this.managers.mcpConfigManager.register(ns(mcp) as McpServerDefinition);\n }\n for (const wf of result.workflows) {\n this.managers.workflowManager.register(ns(wf) as WorkflowDefinition);\n }\n if (this.managers.backendManager) {\n for (const backend of result.backends) {\n this.managers.backendManager.register(ns(backend) as BackendDefinition);\n }\n }\n for (const preset of result.presets) {\n this.presets.set(`${packageName}@${preset.name}`, preset);\n }\n if (this.managers.templateRegistry && result.templates.length > 0) {\n const nsRef = (ref: string) => ref.includes(\"@\") ? ref : `${packageName}@${ref}`;\n for (const template of result.templates) {\n const dc = template.domainContext;\n const nsTemplate = {\n ...template,\n name: `${packageName}@${template.name}`,\n domainContext: {\n ...dc,\n skills: dc.skills?.map(nsRef),\n prompts: dc.prompts?.map(nsRef),\n subAgents: dc.subAgents?.map(nsRef),\n workflow: dc.workflow ? nsRef(dc.workflow) : dc.workflow,\n },\n };\n this.managers.templateRegistry.register(nsTemplate);\n }\n }\n\n logger.debug(\n {\n packageName,\n skills: result.skills.length,\n prompts: result.prompts.length,\n mcp: result.mcpServers.length,\n workflows: result.workflows.length,\n backends: result.backends.length,\n presets: result.presets.length,\n templates: result.templates.length,\n },\n \"Components injected\",\n );\n }\n\n private removeNamespacedComponents(packageName: string): void {\n const prefix = `${packageName}@`;\n const removeFrom = <T extends NamedComponent>(mgr: BaseComponentManager<T>) => {\n for (const c of mgr.list()) {\n if (c.name.startsWith(prefix)) {\n mgr.unregister(c.name);\n }\n }\n };\n removeFrom(this.managers.skillManager);\n removeFrom(this.managers.promptManager);\n removeFrom(this.managers.mcpConfigManager);\n removeFrom(this.managers.workflowManager);\n if (this.managers.backendManager) {\n removeFrom(this.managers.backendManager);\n }\n if (this.managers.templateRegistry) {\n for (const t of this.managers.templateRegistry.list()) {\n if (t.name.startsWith(prefix)) {\n this.managers.templateRegistry.unregister(t.name);\n }\n }\n }\n }\n\n private removeNamespacedPresets(packageName: string): void {\n const prefix = `${packageName}@`;\n for (const key of this.presets.keys()) {\n if (key.startsWith(prefix)) {\n this.presets.delete(key);\n }\n }\n }\n\n private async persistSources(): Promise<void> {\n const data: Record<string, SourceConfig> = {};\n for (const [name, source] of this.sources) {\n data[name] = source.config;\n }\n await mkdir(this.homeDir, { recursive: true });\n await writeFile(this.sourcesFilePath, JSON.stringify({ sources: data }, null, 2) + \"\\n\", \"utf-8\");\n }\n\n private getSourceOrThrow(name: string): ComponentSource {\n const source = this.sources.get(name);\n if (!source) {\n throw new Error(`Source \"${name}\" not found`);\n }\n return source;\n }\n\n private snapshotComponents(packageName: string): Map<string, { type: ComponentTypeName; version?: string }> {\n const prefix = `${packageName}@`;\n const snapshot = new Map<string, { type: ComponentTypeName; version?: string }>();\n\n const addFrom = <T extends { name: string; version?: string }>(\n mgr: BaseComponentManager<T>,\n type: ComponentTypeName,\n ) => {\n for (const c of mgr.list()) {\n if (c.name.startsWith(prefix)) {\n snapshot.set(c.name, { type, version: c.version });\n }\n }\n };\n addFrom(this.managers.skillManager, \"skill\");\n addFrom(this.managers.promptManager, \"prompt\");\n addFrom(this.managers.mcpConfigManager, \"mcpServer\");\n addFrom(this.managers.workflowManager, \"workflow\");\n\n if (this.managers.templateRegistry) {\n for (const t of this.managers.templateRegistry.list()) {\n if (t.name.startsWith(prefix)) {\n snapshot.set(t.name, { type: \"template\", version: t.version });\n }\n }\n }\n\n for (const [key, preset] of this.presets) {\n if (key.startsWith(prefix)) {\n snapshot.set(key, { type: \"preset\", version: preset.version });\n }\n }\n\n return snapshot;\n }\n\n private buildSyncReport(\n oldSnapshot: Map<string, { type: ComponentTypeName; version?: string }>,\n newSnapshot: Map<string, { type: ComponentTypeName; version?: string }>,\n ): SyncReport {\n const report = createEmptySyncReport();\n\n for (const [name, newEntry] of newSnapshot) {\n const oldEntry = oldSnapshot.get(name);\n if (!oldEntry) {\n report.added.push({\n type: newEntry.type,\n name,\n newVersion: newEntry.version,\n });\n } else if (oldEntry.version !== newEntry.version) {\n report.updated.push({\n type: newEntry.type,\n name,\n oldVersion: oldEntry.version,\n newVersion: newEntry.version,\n });\n if (isMajorVersionChange(oldEntry.version, newEntry.version)) {\n report.hasBreakingChanges = true;\n }\n } else {\n report.unchanged.push(name);\n }\n }\n\n for (const [name, oldEntry] of oldSnapshot) {\n if (!newSnapshot.has(name)) {\n report.removed.push({\n type: oldEntry.type,\n name,\n oldVersion: oldEntry.version,\n });\n }\n }\n\n return report;\n }\n}\n\nfunction parseMajor(version?: string): number | undefined {\n if (!version) return undefined;\n const m = version.match(/^(\\d+)/);\n const major = m?.[1];\n return major !== undefined ? parseInt(major, 10) : undefined;\n}\n\nfunction isMajorVersionChange(oldVersion?: string, newVersion?: string): boolean {\n const oldMajor = parseMajor(oldVersion);\n const newMajor = parseMajor(newVersion);\n if (oldMajor === undefined || newMajor === undefined) return false;\n return newMajor !== oldMajor;\n}\n","export type ComponentTypeName = \"skill\" | \"prompt\" | \"workflow\" | \"mcpServer\" | \"plugin\" | \"template\" | \"preset\";\n\nexport interface ComponentVersionDelta {\n type: ComponentTypeName;\n name: string;\n oldVersion?: string;\n newVersion?: string;\n}\n\nexport interface SyncReport {\n added: ComponentVersionDelta[];\n updated: ComponentVersionDelta[];\n removed: ComponentVersionDelta[];\n unchanged: string[];\n hasBreakingChanges: boolean;\n}\n\nexport function createEmptySyncReport(): SyncReport {\n return { added: [], updated: [], removed: [], unchanged: [], hasBreakingChanges: false };\n}\n\n/** Merge multiple SyncReports into one (e.g. when syncing all sources). */\nexport function mergeSyncReports(reports: SyncReport[]): SyncReport {\n const merged = createEmptySyncReport();\n for (const r of reports) {\n merged.added.push(...r.added);\n merged.updated.push(...r.updated);\n merged.removed.push(...r.removed);\n merged.unchanged.push(...r.unchanged);\n if (r.hasBreakingChanges) merged.hasBreakingChanges = true;\n }\n return merged;\n}\n","/**\n * Source Validator — recursively validates all assets in a component source.\n * Checks: manifest integrity, component schema conformance, file reference\n * existence, cross-component reference consistency, and template semantics.\n */\nimport { readFile, readdir, stat, access } from \"node:fs/promises\";\nimport { join, relative, extname } from \"node:path\";\nimport type { ZodSchema } from \"zod\";\nimport {\n PackageManifestSchema,\n SkillDefinitionSchema,\n PromptDefinitionSchema,\n McpServerDefinitionSchema,\n WorkflowDefinitionSchema,\n PresetDefinitionSchema,\n type ComponentType,\n} from \"./source-schemas\";\nimport { AgentTemplateSchema } from \"../template/schema/template-schema\";\nimport { validateTemplate } from \"../template/schema/config-validators\";\nimport { parseSkillMdContent } from \"./skill-md-parser\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface SourceValidationIssue {\n severity: \"error\" | \"warning\" | \"info\";\n path: string;\n component?: string;\n message: string;\n code?: string;\n}\n\nexport interface SourceValidationReport {\n valid: boolean;\n sourceName: string;\n rootDir: string;\n summary: { pass: number; warn: number; error: number };\n issues: SourceValidationIssue[];\n}\n\nexport type CompatMode = \"agent-skills\";\n\nexport interface ValidateOptions {\n strict?: boolean;\n /** Enable compatibility checks against an external standard. */\n compat?: CompatMode;\n}\n\n// ---------------------------------------------------------------------------\n// Component type → Zod schema mapping\n// ---------------------------------------------------------------------------\n\nconst COMPONENT_DIR_SCHEMAS: Record<string, ZodSchema> = {\n skills: SkillDefinitionSchema,\n prompts: PromptDefinitionSchema,\n mcp: McpServerDefinitionSchema,\n workflows: WorkflowDefinitionSchema,\n presets: PresetDefinitionSchema,\n};\n\nconst COMPONENT_DIRS: ComponentType[] = [\"skills\", \"prompts\", \"mcp\", \"workflows\", \"templates\", \"presets\"];\n\n// ---------------------------------------------------------------------------\n// SourceValidator\n// ---------------------------------------------------------------------------\n\nexport class SourceValidator {\n /**\n * Validate all assets in a source directory.\n * Returns a report with pass/warn/error counts and detailed issues.\n */\n async validate(rootDir: string, options?: ValidateOptions): Promise<SourceValidationReport> {\n const issues: SourceValidationIssue[] = [];\n let passCount = 0;\n const validatedFiles = new Set<string>();\n const compat = options?.compat;\n\n // Layer 1: Manifest\n const manifest = await this.validateManifest(rootDir, issues);\n if (manifest) passCount++;\n\n // Layer 2: Components (explicit from manifest + directory scan)\n const componentNames = new Map<string, Set<string>>();\n if (manifest) {\n passCount += await this.validateExplicitFiles(rootDir, manifest, issues, componentNames, validatedFiles, compat);\n }\n passCount += await this.validateComponentDirs(rootDir, issues, componentNames, validatedFiles, compat);\n\n // Layer 3: Cross-references (presets referencing components)\n await this.validatePresetReferences(rootDir, manifest, componentNames, issues);\n\n // Layer 4: Template deep validation (already covered in component scan)\n\n const errorCount = issues.filter((i) => i.severity === \"error\").length;\n const warnCount = issues.filter((i) => i.severity === \"warning\").length;\n\n const valid = options?.strict\n ? errorCount === 0 && warnCount === 0\n : errorCount === 0;\n\n return {\n valid,\n sourceName: (manifest?.name as string) ?? \"unknown\",\n rootDir,\n summary: { pass: passCount, warn: warnCount, error: errorCount },\n issues,\n };\n }\n\n // -------------------------------------------------------------------------\n // Layer 1: Manifest validation\n // -------------------------------------------------------------------------\n\n private async validateManifest(\n rootDir: string,\n issues: SourceValidationIssue[],\n ): Promise<Record<string, unknown> | null> {\n const manifestPath = join(rootDir, \"actant.json\");\n let raw: string;\n\n try {\n raw = await readFile(manifestPath, \"utf-8\");\n } catch {\n issues.push({\n severity: \"error\",\n path: \"actant.json\",\n message: \"actant.json not found in source root\",\n code: \"MANIFEST_MISSING\",\n });\n return null;\n }\n\n let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch (err) {\n issues.push({\n severity: \"error\",\n path: \"actant.json\",\n message: `Invalid JSON: ${err instanceof Error ? err.message : String(err)}`,\n code: \"MANIFEST_INVALID_JSON\",\n });\n return null;\n }\n\n const result = PackageManifestSchema.safeParse(data);\n if (!result.success) {\n for (const issue of result.error.issues) {\n issues.push({\n severity: \"error\",\n path: \"actant.json\",\n message: `${issue.path.join(\".\")}: ${issue.message}`,\n code: \"MANIFEST_SCHEMA\",\n });\n }\n return null;\n }\n\n // Verify file references exist\n const manifest = result.data;\n await this.verifyManifestFileRefs(rootDir, manifest, issues);\n\n return manifest as Record<string, unknown>;\n }\n\n private async verifyManifestFileRefs(\n rootDir: string,\n manifest: { components?: Record<string, string[]>; presets?: string[] },\n issues: SourceValidationIssue[],\n ): Promise<void> {\n const allRefs: Array<{ ref: string; section: string }> = [];\n\n if (manifest.components) {\n for (const [type, files] of Object.entries(manifest.components)) {\n if (files) {\n for (const f of files) {\n allRefs.push({ ref: f, section: `components.${type}` });\n }\n }\n }\n }\n if (manifest.presets) {\n for (const f of manifest.presets) {\n allRefs.push({ ref: f, section: \"presets\" });\n }\n }\n\n for (const { ref, section } of allRefs) {\n const fullPath = join(rootDir, ref);\n try {\n await access(fullPath);\n } catch {\n issues.push({\n severity: \"error\",\n path: `actant.json`,\n component: ref,\n message: `File referenced in ${section} does not exist: ${ref}`,\n code: \"MANIFEST_FILE_MISSING\",\n });\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Layer 2a: Validate files explicitly listed in manifest\n // -------------------------------------------------------------------------\n\n private async validateExplicitFiles(\n rootDir: string,\n manifest: Record<string, unknown>,\n issues: SourceValidationIssue[],\n componentNames: Map<string, Set<string>>,\n validatedFiles: Set<string>,\n compat?: CompatMode,\n ): Promise<number> {\n let passCount = 0;\n const components = manifest.components as Record<string, string[]> | undefined;\n if (!components && !manifest.presets) return 0;\n\n if (components) {\n for (const [type, files] of Object.entries(components)) {\n if (!files) continue;\n for (const filePath of files) {\n validatedFiles.add(filePath);\n const ok = await this.validateSingleFile(rootDir, filePath, type as ComponentType, issues, componentNames);\n if (ok) passCount++;\n }\n }\n }\n\n const presets = manifest.presets as string[] | undefined;\n if (presets) {\n for (const filePath of presets) {\n validatedFiles.add(filePath);\n const ok = await this.validateSingleFile(rootDir, filePath, \"presets\", issues, componentNames);\n if (ok) passCount++;\n }\n }\n\n // compat parameter reserved for future explicit-file compat checks\n void compat;\n return passCount;\n }\n\n // -------------------------------------------------------------------------\n // Layer 2b: Scan component directories\n // -------------------------------------------------------------------------\n\n private async validateComponentDirs(\n rootDir: string,\n issues: SourceValidationIssue[],\n componentNames: Map<string, Set<string>>,\n validatedFiles: Set<string>,\n compat?: CompatMode,\n ): Promise<number> {\n let passCount = 0;\n\n for (const dir of COMPONENT_DIRS) {\n const dirPath = join(rootDir, dir);\n try {\n const dirStat = await stat(dirPath);\n if (!dirStat.isDirectory()) continue;\n } catch {\n continue;\n }\n\n passCount += await this.scanDirectory(rootDir, dirPath, dir, issues, componentNames, validatedFiles, compat);\n }\n\n return passCount;\n }\n\n private async scanDirectory(\n rootDir: string,\n dirPath: string,\n componentType: ComponentType,\n issues: SourceValidationIssue[],\n componentNames: Map<string, Set<string>>,\n validatedFiles: Set<string>,\n compat?: CompatMode,\n ): Promise<number> {\n let passCount = 0;\n const entries = await readdir(dirPath);\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry);\n const relPath = relative(rootDir, fullPath).replace(/\\\\/g, \"/\");\n const entryStat = await stat(fullPath).catch(() => null);\n if (!entryStat) continue;\n\n if (entryStat.isFile() && extname(entry) === \".json\") {\n if (validatedFiles.has(relPath)) continue;\n validatedFiles.add(relPath);\n const ok = await this.validateSingleFile(rootDir, relPath, componentType, issues, componentNames);\n if (ok) passCount++;\n } else if (entryStat.isDirectory()) {\n if (componentType === \"skills\") {\n const skillMdPath = join(fullPath, \"SKILL.md\");\n try {\n await access(skillMdPath);\n const skillRelPath = relative(rootDir, skillMdPath).replace(/\\\\/g, \"/\");\n if (!validatedFiles.has(skillRelPath)) {\n validatedFiles.add(skillRelPath);\n const ok = await this.validateSkillMd(rootDir, skillRelPath, issues, componentNames, entry, compat);\n if (ok) passCount++;\n }\n if (compat === \"agent-skills\") {\n await this.validateSkillDirConventions(rootDir, fullPath, entry, issues);\n }\n } catch {\n const manifestJsonPath = join(fullPath, \"manifest.json\");\n try {\n await access(manifestJsonPath);\n const mRelPath = relative(rootDir, manifestJsonPath).replace(/\\\\/g, \"/\");\n if (!validatedFiles.has(mRelPath)) {\n validatedFiles.add(mRelPath);\n const ok = await this.validateSingleFile(rootDir, mRelPath, componentType, issues, componentNames);\n if (ok) passCount++;\n }\n } catch {\n /* no recognizable format, skip */\n }\n }\n }\n }\n }\n\n return passCount;\n }\n\n // -------------------------------------------------------------------------\n // Single file validation\n // -------------------------------------------------------------------------\n\n private async validateSingleFile(\n rootDir: string,\n relPath: string,\n componentType: ComponentType,\n issues: SourceValidationIssue[],\n componentNames: Map<string, Set<string>>,\n ): Promise<boolean> {\n const fullPath = join(rootDir, relPath);\n\n let raw: string;\n try {\n raw = await readFile(fullPath, \"utf-8\");\n } catch {\n issues.push({\n severity: \"error\",\n path: relPath,\n message: \"Cannot read file\",\n code: \"FILE_UNREADABLE\",\n });\n return false;\n }\n\n let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch (err) {\n issues.push({\n severity: \"error\",\n path: relPath,\n message: `Invalid JSON: ${err instanceof Error ? err.message : String(err)}`,\n code: \"INVALID_JSON\",\n });\n return false;\n }\n\n // Templates use the full AgentTemplateSchema + semantic validation\n if (componentType === \"templates\") {\n return this.validateTemplateComponent(relPath, data, issues, componentNames);\n }\n\n const schema = COMPONENT_DIR_SCHEMAS[componentType];\n if (!schema) return true;\n\n const result = schema.safeParse(data);\n if (!result.success) {\n for (const issue of result.error.issues) {\n issues.push({\n severity: \"error\",\n path: relPath,\n component: (data as { name?: string })?.name,\n message: `${issue.path.join(\".\")}: ${issue.message}`,\n code: \"COMPONENT_SCHEMA\",\n });\n }\n return false;\n }\n\n const parsed = result.data as { name: string; description?: string };\n this.trackComponentName(componentNames, componentType, parsed.name);\n\n if (!parsed.description) {\n issues.push({\n severity: \"warning\",\n path: relPath,\n component: parsed.name,\n message: `Missing \"description\" field`,\n code: \"MISSING_DESCRIPTION\",\n });\n }\n\n return true;\n }\n\n private validateTemplateComponent(\n relPath: string,\n data: unknown,\n issues: SourceValidationIssue[],\n componentNames: Map<string, Set<string>>,\n ): boolean {\n const schemaResult = AgentTemplateSchema.safeParse(data);\n if (!schemaResult.success) {\n for (const issue of schemaResult.error.issues) {\n issues.push({\n severity: \"error\",\n path: relPath,\n component: (data as { name?: string })?.name,\n message: `${issue.path.join(\".\")}: ${issue.message}`,\n code: \"TEMPLATE_SCHEMA\",\n });\n }\n return false;\n }\n\n const semanticResult = validateTemplate(data);\n for (const w of semanticResult.warnings ?? []) {\n issues.push({\n severity: \"warning\",\n path: relPath,\n component: schemaResult.data.name,\n message: w.message,\n code: w.code ?? \"TEMPLATE_SEMANTIC\",\n });\n }\n\n this.trackComponentName(componentNames, \"templates\", schemaResult.data.name);\n return true;\n }\n\n // -------------------------------------------------------------------------\n // SKILL.md validation\n // -------------------------------------------------------------------------\n\n private async validateSkillMd(\n rootDir: string,\n relPath: string,\n issues: SourceValidationIssue[],\n componentNames: Map<string, Set<string>>,\n parentDirName?: string,\n compat?: CompatMode,\n ): Promise<boolean> {\n const fullPath = join(rootDir, relPath);\n\n let raw: string;\n try {\n raw = await readFile(fullPath, \"utf-8\");\n } catch {\n issues.push({\n severity: \"error\",\n path: relPath,\n message: \"Cannot read SKILL.md file\",\n code: \"FILE_UNREADABLE\",\n });\n return false;\n }\n\n const skill = parseSkillMdContent(raw);\n if (!skill) {\n issues.push({\n severity: \"error\",\n path: relPath,\n message: \"Invalid SKILL.md: missing YAML frontmatter or required 'name' field\",\n code: \"SKILL_MD_INVALID\",\n });\n return false;\n }\n\n this.trackComponentName(componentNames, \"skills\", skill.name);\n\n if (compat === \"agent-skills\") {\n this.validateAgentSkillsCompat(skill, relPath, issues, parentDirName, raw);\n } else {\n if (!skill.description) {\n issues.push({\n severity: \"warning\",\n path: relPath,\n component: skill.name,\n message: `Missing \"description\" in SKILL.md frontmatter`,\n code: \"SKILL_MD_MISSING_DESCRIPTION\",\n });\n }\n }\n\n if (!skill.content || skill.content.trim().length === 0) {\n issues.push({\n severity: \"warning\",\n path: relPath,\n component: skill.name,\n message: \"SKILL.md has empty content body\",\n code: \"SKILL_MD_EMPTY_CONTENT\",\n });\n }\n\n return true;\n }\n\n // -------------------------------------------------------------------------\n // Agent Skills (agentskills.io) compatibility checks\n // -------------------------------------------------------------------------\n\n private validateAgentSkillsCompat(\n skill: { name: string; description?: string; compatibility?: string; content: string },\n relPath: string,\n issues: SourceValidationIssue[],\n parentDirName?: string,\n raw?: string,\n ): void {\n const name = skill.name;\n\n // name: lowercase + hyphens only, 1-64 chars\n const NAME_RE = /^[a-z][a-z0-9-]*$/;\n if (name.length > 64) {\n issues.push({\n severity: \"error\",\n path: relPath,\n component: name,\n message: `Name exceeds 64 characters (${name.length})`,\n code: \"AGENT_SKILLS_NAME_TOO_LONG\",\n });\n } else if (!NAME_RE.test(name)) {\n issues.push({\n severity: \"error\",\n path: relPath,\n component: name,\n message: `Name must contain only lowercase letters, numbers, and hyphens, starting with a letter`,\n code: \"AGENT_SKILLS_NAME_FORMAT\",\n });\n } else {\n if (name.endsWith(\"-\")) {\n issues.push({\n severity: \"error\",\n path: relPath,\n component: name,\n message: \"Name must not end with a hyphen\",\n code: \"AGENT_SKILLS_NAME_TRAILING_HYPHEN\",\n });\n }\n if (name.includes(\"--\")) {\n issues.push({\n severity: \"error\",\n path: relPath,\n component: name,\n message: \"Name must not contain consecutive hyphens\",\n code: \"AGENT_SKILLS_NAME_CONSECUTIVE_HYPHENS\",\n });\n }\n }\n\n // name must match parent directory\n if (parentDirName && name !== parentDirName) {\n issues.push({\n severity: \"error\",\n path: relPath,\n component: name,\n message: `Name \"${name}\" does not match parent directory \"${parentDirName}\"`,\n code: \"AGENT_SKILLS_NAME_DIR_MISMATCH\",\n });\n }\n\n // description: required, max 1024 chars\n if (!skill.description) {\n issues.push({\n severity: \"error\",\n path: relPath,\n component: name,\n message: `Missing required \"description\" field (Agent Skills spec)`,\n code: \"AGENT_SKILLS_DESCRIPTION_REQUIRED\",\n });\n } else if (skill.description.length > 1024) {\n issues.push({\n severity: \"warning\",\n path: relPath,\n component: name,\n message: `Description exceeds 1024 characters (${skill.description.length})`,\n code: \"AGENT_SKILLS_DESCRIPTION_TOO_LONG\",\n });\n }\n\n // compatibility: max 500 chars if present\n if (skill.compatibility && skill.compatibility.length > 500) {\n issues.push({\n severity: \"warning\",\n path: relPath,\n component: name,\n message: `Compatibility field exceeds 500 characters (${skill.compatibility.length})`,\n code: \"AGENT_SKILLS_COMPAT_TOO_LONG\",\n });\n }\n\n // Body: warn if > 500 lines (progressive disclosure recommendation)\n if (raw) {\n const frontmatterEnd = raw.indexOf(\"---\", 3);\n if (frontmatterEnd !== -1) {\n const body = raw.substring(frontmatterEnd + 3).trim();\n const lineCount = body.split(\"\\n\").length;\n if (lineCount > 500) {\n issues.push({\n severity: \"warning\",\n path: relPath,\n component: name,\n message: `SKILL.md body has ${lineCount} lines; Agent Skills spec recommends < 500 lines`,\n code: \"AGENT_SKILLS_BODY_TOO_LONG\",\n });\n }\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Agent Skills directory convention (scripts/, references/, assets/)\n // -------------------------------------------------------------------------\n\n private async validateSkillDirConventions(\n rootDir: string,\n skillDir: string,\n skillName: string,\n issues: SourceValidationIssue[],\n ): Promise<void> {\n const KNOWN_DIRS = new Set([\"scripts\", \"references\", \"assets\"]);\n const KNOWN_FILES = new Set([\"SKILL.md\", \"LICENSE\", \"LICENSE.txt\", \"LICENSE.md\"]);\n\n let entries: string[];\n try {\n entries = await readdir(skillDir);\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const fullPath = join(skillDir, entry);\n const relPath = relative(rootDir, fullPath).replace(/\\\\/g, \"/\");\n const entryStat = await stat(fullPath).catch(() => null);\n if (!entryStat) continue;\n\n if (entryStat.isDirectory()) {\n if (KNOWN_DIRS.has(entry)) {\n issues.push({\n severity: \"info\",\n path: relPath,\n component: skillName,\n message: `Agent Skills convention: ${entry}/ directory detected`,\n code: \"AGENT_SKILLS_DIR_FOUND\",\n });\n }\n } else if (!KNOWN_FILES.has(entry)) {\n // Non-standard files are fine; no warning needed\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Layer 3: Cross-reference validation\n // -------------------------------------------------------------------------\n\n private async validatePresetReferences(\n rootDir: string,\n manifest: Record<string, unknown> | null,\n componentNames: Map<string, Set<string>>,\n issues: SourceValidationIssue[],\n ): Promise<void> {\n const presetsDir = join(rootDir, \"presets\");\n const presetFiles: string[] = [];\n\n // Collect preset file paths\n if (manifest?.presets) {\n for (const p of manifest.presets as string[]) {\n presetFiles.push(p);\n }\n } else {\n try {\n const entries = await readdir(presetsDir);\n for (const e of entries) {\n if (extname(e) === \".json\") {\n presetFiles.push(`presets/${e}`);\n }\n }\n } catch {\n return; // no presets dir\n }\n }\n\n for (const presetFile of presetFiles) {\n const fullPath = join(rootDir, presetFile);\n let data: Record<string, unknown>;\n try {\n const raw = await readFile(fullPath, \"utf-8\");\n data = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n continue; // already reported in component scan\n }\n\n const presetName = (data.name as string) || presetFile;\n const refMap: Array<[string, ComponentType]> = [\n [\"skills\", \"skills\"],\n [\"prompts\", \"prompts\"],\n [\"mcpServers\", \"mcp\"],\n [\"workflows\", \"workflows\"],\n [\"templates\", \"templates\"],\n ];\n\n for (const [field, compType] of refMap) {\n const refs = data[field] as string[] | undefined;\n if (!refs) continue;\n const available = componentNames.get(compType) ?? new Set();\n for (const ref of refs) {\n if (!available.has(ref)) {\n issues.push({\n severity: \"warning\",\n path: presetFile,\n component: presetName,\n message: `Preset references ${compType} \"${ref}\" which was not found in this source`,\n code: \"PRESET_REF_MISSING\",\n });\n }\n }\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Helpers\n // -------------------------------------------------------------------------\n\n private trackComponentName(\n componentNames: Map<string, Set<string>>,\n type: string,\n name: string,\n ): void {\n let set = componentNames.get(type);\n if (!set) {\n set = new Set();\n componentNames.set(type, set);\n }\n set.add(name);\n }\n}\n","/**\n * Zod validation schemas for Source package components.\n * Used by SourceValidator to verify component data integrity.\n */\nimport { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Shared base: VersionedComponent fields\n// ---------------------------------------------------------------------------\n\nconst VersionedComponentFields = {\n name: z.string().min(1, \"name is required\"),\n version: z.string().optional(),\n description: z.string().optional(),\n $type: z.string().optional(),\n $version: z.number().optional(),\n origin: z.object({\n type: z.enum([\"builtin\", \"source\", \"local\"]),\n sourceName: z.string().optional(),\n syncHash: z.string().optional(),\n syncedAt: z.string().optional(),\n modified: z.boolean().optional(),\n }).optional(),\n tags: z.array(z.string()).optional(),\n};\n\n// ---------------------------------------------------------------------------\n// PackageManifest (actant.json)\n// ---------------------------------------------------------------------------\n\nexport const PackageManifestSchema = z.object({\n name: z.string().min(1, \"name is required\"),\n version: z.string().optional(),\n description: z.string().optional(),\n components: z.object({\n skills: z.array(z.string()).optional(),\n prompts: z.array(z.string()).optional(),\n mcp: z.array(z.string()).optional(),\n workflows: z.array(z.string()).optional(),\n templates: z.array(z.string()).optional(),\n backends: z.array(z.string()).optional(),\n }).optional(),\n presets: z.array(z.string()).optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Component schemas\n// ---------------------------------------------------------------------------\n\nexport const SkillDefinitionSchema = z.object({\n ...VersionedComponentFields,\n content: z.string().min(1, \"content is required\"),\n license: z.string().optional(),\n compatibility: z.string().optional(),\n allowedTools: z.array(z.string()).optional(),\n});\n\nexport const PromptDefinitionSchema = z.object({\n ...VersionedComponentFields,\n content: z.string().min(1, \"content is required\"),\n variables: z.array(z.string()).optional(),\n});\n\nexport const McpServerDefinitionSchema = z.object({\n ...VersionedComponentFields,\n command: z.string().min(1, \"command is required\"),\n args: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n});\n\nexport const WorkflowDefinitionSchema = z.object({\n ...VersionedComponentFields,\n content: z.string().min(1, \"content is required\"),\n});\n\nconst PlatformCommandSchema = z.object({\n win32: z.string().min(1),\n default: z.string().min(1),\n});\n\nexport const SourceBackendDefinitionSchema = z.object({\n ...VersionedComponentFields,\n supportedModes: z.array(z.enum([\"resolve\", \"open\", \"acp\"])).min(1),\n resolveCommand: PlatformCommandSchema.optional(),\n openCommand: PlatformCommandSchema.optional(),\n acpCommand: PlatformCommandSchema.optional(),\n acpOwnsProcess: z.boolean().optional(),\n resolvePackage: z.string().optional(),\n openWorkspaceDir: z.enum([\"arg\", \"cwd\"]).optional(),\n openSpawnOptions: z.object({\n stdio: z.enum([\"inherit\", \"ignore\"]).optional(),\n detached: z.boolean().optional(),\n windowsHide: z.boolean().optional(),\n shell: z.boolean().optional(),\n }).optional(),\n existenceCheck: z.object({\n command: z.string().min(1),\n args: z.array(z.string()).optional(),\n expectedExitCode: z.number().int().optional(),\n versionPattern: z.string().optional(),\n }).optional(),\n install: z.array(z.object({\n type: z.enum([\"npm\", \"brew\", \"winget\", \"choco\", \"url\", \"manual\"]),\n package: z.string().optional(),\n platforms: z.array(z.string()).optional(),\n label: z.string().optional(),\n instructions: z.string().optional(),\n })).optional(),\n});\n\nexport const PresetDefinitionSchema = z.object({\n name: z.string().min(1, \"name is required\"),\n version: z.string().optional(),\n description: z.string().optional(),\n skills: z.array(z.string()).optional(),\n prompts: z.array(z.string()).optional(),\n mcpServers: z.array(z.string()).optional(),\n workflows: z.array(z.string()).optional(),\n templates: z.array(z.string()).optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Schema registry by component type\n// ---------------------------------------------------------------------------\n\nexport const COMPONENT_SCHEMAS = {\n skills: SkillDefinitionSchema,\n prompts: PromptDefinitionSchema,\n mcp: McpServerDefinitionSchema,\n workflows: WorkflowDefinitionSchema,\n backends: SourceBackendDefinitionSchema,\n templates: null, // uses AgentTemplateSchema from template-schema.ts\n presets: PresetDefinitionSchema,\n} as const;\n\nexport type ComponentType = keyof typeof COMPONENT_SCHEMAS;\n","import type { ModelProviderDescriptor } from \"@actant/shared\";\nimport { modelProviderRegistry } from \"./model-provider-registry\";\n\nexport const BUILTIN_PROVIDERS: readonly ModelProviderDescriptor[] = [\n {\n type: \"anthropic\",\n displayName: \"Anthropic (Claude)\",\n protocol: \"anthropic\",\n defaultBaseUrl: \"https://api.anthropic.com\",\n models: [\"claude-sonnet-4-20250514\", \"claude-opus-4-20250514\"],\n },\n {\n type: \"openai\",\n displayName: \"OpenAI\",\n protocol: \"openai\",\n defaultBaseUrl: \"https://api.openai.com/v1\",\n models: [\"gpt-4o\", \"gpt-4o-mini\", \"o3-mini\"],\n },\n {\n type: \"deepseek\",\n displayName: \"DeepSeek\",\n protocol: \"openai\",\n defaultBaseUrl: \"https://api.deepseek.com/v1\",\n models: [\"deepseek-chat\", \"deepseek-reasoner\"],\n },\n {\n type: \"ollama\",\n displayName: \"Ollama (Local)\",\n protocol: \"openai\",\n defaultBaseUrl: \"http://localhost:11434/v1\",\n },\n {\n type: \"azure\",\n displayName: \"Azure OpenAI\",\n protocol: \"openai\",\n defaultBaseUrl: \"https://<resource>.openai.azure.com\",\n },\n {\n type: \"bedrock\",\n displayName: \"AWS Bedrock\",\n protocol: \"anthropic\",\n defaultBaseUrl: \"https://bedrock-runtime.<region>.amazonaws.com\",\n },\n {\n type: \"vertex\",\n displayName: \"Google Vertex AI\",\n protocol: \"anthropic\",\n defaultBaseUrl: \"https://<region>-aiplatform.googleapis.com\",\n },\n {\n type: \"custom\",\n displayName: \"Custom\",\n protocol: \"custom\",\n defaultBaseUrl: \"http://localhost:8080\",\n },\n] as const;\n\n/** Register all built-in providers into the singleton registry. */\nexport function registerBuiltinProviders(): void {\n for (const descriptor of BUILTIN_PROVIDERS) {\n modelProviderRegistry.register(descriptor);\n }\n}\n"],"mappings":";;;;;AAAA,SAAS,WAAW,OAAO,YAAY;AACvC,SAAS,YAAY;AAUrB,SAAS,oBAAoB;;;ACT7B,IAAM,UAA6C;AAAA,EACjD,YAAY;AAAA,IACV,OAAO,CAAC,GAAG;AAAA,IACX,MAAM,CAAC;AAAA,IACP,KAAK,CAAC;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM,CAAC;AAAA,IACP,KAAK,CAAC,MAAM;AAAA,IACZ,aAAa;AAAA,EACf;AAAA,EACA,YAAY;AAAA,IACV,OAAO,CAAC,QAAQ,WAAW;AAAA,IAC3B,MAAM,CAAC,QAAQ,UAAU;AAAA,IACzB,KAAK,CAAC,QAAQ,OAAO;AAAA,IACrB,aAAa;AAAA,EACf;AAAA,EACA,UAAU;AAAA,IACR,OAAO,CAAC,QAAQ,YAAY,WAAW;AAAA,IACvC,MAAM,CAAC,QAAQ,QAAQ,SAAS,WAAW;AAAA,IAC3C,KAAK,CAAC;AAAA,IACN,aAAa;AAAA,EACf;AACF;AAEO,SAAS,mBAAmB,OAAwD;AACzF,MAAI,CAAC,MAAO,QAAO,EAAE,GAAG,QAAQ,WAAW;AAC3C,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,SAAS,QAAQ,KAAK;AAC5B,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,8BAA8B,KAAK,EAAE;AAClE,WAAO,EAAE,GAAG,OAAO;AAAA,EACrB;AACA,SAAO,EAAE,GAAG,MAAM;AACpB;AAEO,SAAS,0BACd,OACA,gBACmB;AACnB,QAAM,WAAW,mBAAmB,KAAK;AACzC,QAAM,QAAQ,CAAC,GAAI,SAAS,SAAS,CAAC,CAAE;AAExC,MAAI,CAAC,MAAM,SAAS,GAAG,KAAK,eAAe,SAAS,GAAG;AACrD,eAAW,QAAQ,gBAAgB;AACjC,YAAM,KAAK,QAAQ,IAAI,EAAE;AAAA,IAC3B;AAAA,EACF;AACA,SAAO,EAAE,GAAG,UAAU,MAAM;AAC9B;;;AD7CA,IAAM,SAAS,aAAa,gBAAgB;AAErC,IAAM,gBAAN,MAA8C;AAAA,EAC1C,cAAgC;AAAA,EAEzC,MAAM,SAAS,cAAqC;AAClD,UAAM,MAAM,KAAK,cAAc,WAAW,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AACvE,UAAM,MAAM,KAAK,cAAc,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9D,UAAM,UAAU,KAAK,cAAc,WAAW,GAAG,oBAAoB,OAAO;AAAA,EAC9E;AAAA,EAEA,MAAM,kBAAkB,cAAsB,QAA0C;AACtF,UAAM,WAAW,KAAK,cAAc,WAAW,OAAO;AACtD,eAAW,SAAS,QAAQ;AAC1B,YAAM,WAAW,GAAG,MAAM,KAAK,QAAQ,UAAU,GAAG,CAAC;AACrD,YAAM,UAAU;AAAA,QACd;AAAA,QACA,kBAAkB,MAAM,eAAe,MAAM,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA,QACvE;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN;AAAA,MACF,EAAE,KAAK,IAAI;AACX,YAAM,UAAU,KAAK,UAAU,QAAQ,GAAG,SAAS,OAAO;AAAA,IAC5D;AACA,UAAM,WAAW,OAAO,IAAI,CAAC,MAAM;AACjC,YAAM,SAAS,MAAM,EAAE,IAAI;AAC3B,YAAM,OAAO,EAAE,cAAc;AAAA,IAAO,EAAE,WAAW;AAAA,IAAO;AACxD,aAAO,GAAG,MAAM,GAAG,IAAI;AAAA,EAAK,EAAE,OAAO;AAAA,IACvC,CAAC;AACD,UAAM,gBAAgB;AAAA;AAAA,EAAqB,SAAS,KAAK,aAAa,CAAC;AAAA;AACvE,UAAM,UAAU,KAAK,cAAc,WAAW,GAAG,eAAe,OAAO;AACvE,WAAO,MAAM,EAAE,cAAc,OAAO,OAAO,OAAO,GAAG,qBAAqB;AAAA,EAC5E;AAAA,EAEA,MAAM,mBAAmB,cAAsB,SAA4C;AACzF,UAAM,UAAU,QACb,IAAI,CAAC,MAAM;AACV,YAAM,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE;AAC7B,UAAI,EAAE,YAAa,OAAM,KAAK;AAAA,IAAO,EAAE,WAAW;AAAA,CAAI;AACtD,YAAM,KAAK,IAAI,EAAE,OAAO;AACxB,aAAO,MAAM,KAAK,IAAI;AAAA,IACxB,CAAC,EACA,KAAK,aAAa;AACrB,UAAM,UAAU,KAAK,cAAc,WAAW,WAAW,GAAG,UAAU,MAAM,OAAO;AAAA,EACrF;AAAA,EAEA,MAAM,qBAAqB,cAAsB,SAA+C;AAC9F,UAAM,YAAY,KAAK,cAAc,SAAS;AAC9C,UAAM,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAE1C,UAAM,YAGF,CAAC;AACL,eAAW,UAAU,SAAS;AAC5B,gBAAU,OAAO,IAAI,IAAI;AAAA,QACvB,SAAS,OAAO;AAAA,QAChB,MAAM,OAAO,QAAQ,CAAC;AAAA,QACtB,GAAI,OAAO,OAAO,OAAO,KAAK,OAAO,GAAG,EAAE,SAAS,IAAI,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC;AAAA,MAChF;AAAA,IACF;AACA,UAAM;AAAA,MACJ,KAAK,WAAW,UAAU;AAAA,MAC1B,KAAK,UAAU,EAAE,YAAY,UAAU,GAAG,MAAM,CAAC,IAAI;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,mBAAmB,cAAsB,SAA4C;AACzF,UAAM,aAAa,QAAQ,OAAO,CAAC,MAAM,EAAE,YAAY,SAAS,EAAE,SAAS,KAAK;AAChF,QAAI,WAAW,WAAW,EAAG;AAE7B,UAAM,YAAY,KAAK,cAAc,SAAS;AAC9C,UAAM,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1C,UAAM,kBAAkB,WAAW,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI;AAChE,UAAM;AAAA,MACJ,KAAK,WAAW,iBAAiB;AAAA,MACjC,KAAK,UAAU,EAAE,gBAAgB,GAAG,MAAM,CAAC,IAAI;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,cAAsB,UAA6C;AAC3F,UAAM,aAAa,KAAK,cAAc,UAAU;AAChD,UAAM,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAC3C,UAAM,UAAU,KAAK,YAAY,aAAa,GAAG,SAAS,UAAU,MAAM,OAAO;AAAA,EACnF;AAAA,EAEA,MAAM,kBACJ,cACA,SACA,aACe;AAGf,QAAI,CAAC,YAAa;AAElB,UAAM,WAAW;AAAA,MACf;AAAA,MACA,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IAC3B;AACA,QAAI,CAAC,SAAS,OAAO,OAAQ;AAE7B,QAAI;AACF,YAAM,YAAY,KAAK,cAAc,SAAS;AAC9C,YAAM,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1C,YAAM,WAAW;AAAA;AAAA,QAEf,YAAY,EAAE,OAAO,SAAS,MAAM;AAAA,MACtC;AACA,YAAM;AAAA,QACJ,KAAK,WAAW,eAAe;AAAA,QAC/B,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI;AAAA,QACpC;AAAA,MACF;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,cAA6C;AACxD,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAqB,CAAC;AAE5B,UAAM,SAAS;AAAA,MACb,EAAE,MAAM,WAAW,MAAM,MAAe;AAAA,MACxC,EAAE,MAAM,aAAa,MAAM,OAAgB;AAAA,IAC7C;AAEA,eAAW,SAAS,QAAQ;AAC1B,UAAI;AACF,cAAM,IAAI,MAAM,KAAK,KAAK,cAAc,MAAM,IAAI,CAAC;AACnD,YAAI,MAAM,SAAS,SAAS,CAAC,EAAE,YAAY,GAAG;AAC5C,iBAAO,KAAK,uBAAuB,MAAM,IAAI,EAAE;AAAA,QACjD,WAAW,MAAM,SAAS,UAAU,CAAC,EAAE,OAAO,GAAG;AAC/C,iBAAO,KAAK,kBAAkB,MAAM,IAAI,EAAE;AAAA,QAC5C;AAAA,MACF,QAAQ;AACN,iBAAS,KAAK,YAAY,MAAM,IAAI,EAAE;AAAA,MACxC;AAAA,IACF;AAEA,WAAO,EAAE,OAAO,OAAO,WAAW,GAAG,QAAQ,SAAS;AAAA,EACxD;AACF;;;AEnKA,SAAS,aAAAA,YAAW,SAAAC,QAAO,QAAAC,aAAY;AACvC,SAAS,QAAAC,aAAY;AASrB,SAAS,gBAAAC,qBAAoB;AAI7B,IAAMC,UAASC,cAAa,qBAAqB;AAE1C,IAAM,oBAAN,MAAkD;AAAA,EAC9C,cAAc;AAAA,EAEvB,MAAM,SAAS,cAAqC;AAClD,UAAMC,OAAMC,MAAK,cAAc,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9D,UAAMD,OAAMC,MAAK,cAAc,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EAChE;AAAA,EAEA,MAAM,kBAAkB,cAAsB,QAA0C;AACtF,UAAM,WAAW,OAAO,IAAI,CAAC,MAAM;AACjC,YAAM,SAAS,MAAM,EAAE,IAAI;AAC3B,YAAM,OAAO,EAAE,cAAc;AAAA,IAAO,EAAE,WAAW;AAAA,IAAO;AACxD,aAAO,GAAG,MAAM,GAAG,IAAI;AAAA,EAAK,EAAE,OAAO;AAAA,IACvC,CAAC;AACD,UAAM,gBAAgB;AAAA;AAAA,EAAqB,SAAS,KAAK,aAAa,CAAC;AAAA;AACvE,UAAMC,WAAUD,MAAK,cAAc,WAAW,GAAG,eAAe,OAAO;AAEvE,UAAM,gBAAgB;AAAA;AAAA,EAA2B,SAAS,KAAK,aAAa,CAAC;AAAA;AAC7E,UAAMC,WAAUD,MAAK,cAAc,WAAW,GAAG,eAAe,OAAO;AACvE,IAAAH,QAAO,MAAM,EAAE,cAAc,OAAO,OAAO,OAAO,GAAG,qBAAqB;AAAA,EAC5E;AAAA,EAEA,MAAM,mBAAmB,cAAsB,SAA4C;AACzF,UAAM,UAAU,QACb,IAAI,CAAC,MAAM;AACV,YAAM,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE;AAC7B,UAAI,EAAE,YAAa,OAAM,KAAK;AAAA,IAAO,EAAE,WAAW;AAAA,CAAI;AACtD,YAAM,KAAK,IAAI,EAAE,OAAO;AACxB,aAAO,MAAM,KAAK,IAAI;AAAA,IACxB,CAAC,EACA,KAAK,aAAa;AACrB,UAAMI,WAAUD,MAAK,cAAc,WAAW,WAAW,GAAG,UAAU,MAAM,OAAO;AAAA,EACrF;AAAA,EAEA,MAAM,qBAAqB,cAAsB,SAA+C;AAC9F,UAAM,YAAYA,MAAK,cAAc,SAAS;AAC9C,UAAMD,OAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAE1C,UAAM,YAGF,CAAC;AACL,eAAW,UAAU,SAAS;AAC5B,gBAAU,OAAO,IAAI,IAAI;AAAA,QACvB,SAAS,OAAO;AAAA,QAChB,MAAM,OAAO,QAAQ,CAAC;AAAA,QACtB,GAAI,OAAO,OAAO,OAAO,KAAK,OAAO,GAAG,EAAE,SAAS,IAAI,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC;AAAA,MAChF;AAAA,IACF;AACA,UAAME;AAAA,MACJD,MAAK,WAAW,UAAU;AAAA,MAC1B,KAAK,UAAU,EAAE,YAAY,UAAU,GAAG,MAAM,CAAC,IAAI;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,mBAAmB,cAAsB,SAA4C;AACzF,UAAM,iBAAiB,QAAQ,OAAO,CAAC,MAAM,EAAE,YAAY,KAAK;AAChE,QAAI,eAAe,WAAW,EAAG;AAEjC,UAAM,YAAYA,MAAK,cAAc,SAAS;AAC9C,UAAMD,OAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1C,UAAM,UAAU,eAAe,IAAI,CAAC,MAAM;AACxC,UAAI,EAAE,SAAS,OAAO;AACpB,eAAO,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,EAAE,OAAO;AAAA,MAClE;AACA,aAAO,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,QAAQ,EAAE,QAAQ,GAAG,EAAE,OAAO;AAAA,IACrE,CAAC;AACD,UAAME;AAAA,MACJD,MAAK,WAAW,cAAc;AAAA,MAC9B,KAAK,UAAU,SAAS,MAAM,CAAC,IAAI;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,cAAsB,UAA6C;AAC3F,UAAM,aAAaA,MAAK,cAAc,UAAU;AAChD,UAAMD,OAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAC3C,UAAME,WAAUD,MAAK,YAAY,aAAa,GAAG,SAAS,UAAU,MAAM,OAAO;AAAA,EACnF;AAAA,EAEA,MAAM,kBACJ,cACA,SACA,aACe;AACf,UAAM,YAAYA,MAAK,cAAc,SAAS;AAC9C,UAAMD,OAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAE1C,UAAM,WAAW;AAAA,MACf;AAAA,MACA,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IAC3B;AAEA,UAAM,WAAoC;AAAA,MACxC,aAAa;AAAA,QACX,OAAO,SAAS,SAAS,CAAC;AAAA,QAC1B,MAAM,SAAS,QAAQ,CAAC;AAAA,QACxB,KAAK,SAAS,OAAO,CAAC;AAAA,MACxB;AAAA,IACF;AACA,QAAI,SAAS,SAAS;AACpB,eAAS,UAAU,SAAS;AAAA,IAC9B;AACA,UAAME;AAAA,MACJD,MAAK,WAAW,qBAAqB;AAAA,MACrC,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,cAA6C;AACxD,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAqB,CAAC;AAE5B,UAAM,SAAS;AAAA,MACb,EAAE,MAAM,WAAW,MAAM,MAAe;AAAA,MACxC,EAAE,MAAM,aAAa,MAAM,OAAgB;AAAA,MAC3C,EAAE,MAAM,aAAa,MAAM,OAAgB;AAAA,IAC7C;AAEA,eAAW,SAAS,QAAQ;AAC1B,UAAI;AACF,cAAM,IAAI,MAAME,MAAKF,MAAK,cAAc,MAAM,IAAI,CAAC;AACnD,YAAI,MAAM,SAAS,SAAS,CAAC,EAAE,YAAY,GAAG;AAC5C,iBAAO,KAAK,uBAAuB,MAAM,IAAI,EAAE;AAAA,QACjD,WAAW,MAAM,SAAS,UAAU,CAAC,EAAE,OAAO,GAAG;AAC/C,iBAAO,KAAK,kBAAkB,MAAM,IAAI,EAAE;AAAA,QAC5C;AAAA,MACF,QAAQ;AACN,iBAAS,KAAK,YAAY,MAAM,IAAI,EAAE;AAAA,MACxC;AAAA,IACF;AAEA,WAAO,EAAE,OAAO,OAAO,WAAW,GAAG,QAAQ,SAAS;AAAA,EACxD;AACF;;;AC/IO,IAAM,gBAAN,cAA4B,cAAc;AAAA,EAC7B,cAAgC;AAAA;AAAA;AAIpD;;;ACdA,SAAS,gBAAAG,qBAAoB;;;ACItB,IAAM,gBAAuD;AAAA,EAClE,YAAY;AAAA,EACZ,QAAQ,MAAMC,UAAS;AACrB,QAAI,CAAC,QAAQ,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,EAAG,QAAO,CAAC;AAChE,WAAQA,UAAS,QAAQ,IAAgB,KAAK,KAAK,IAAI,CAAC,UAAU,EAAE,MAAM,SAAS,KAAK,IAAI,GAAG,EAAE;AAAA,EACnG;AAAA,EACA,MAAM,YAAY,cAAc,aAAa,cAAc,SAAS;AAClE,UAAO,QAA2B,kBAAkB,cAAc,WAAW;AAAA,EAC/E;AACF;;;ACTO,IAAM,iBAAyD;AAAA,EACpE,YAAY;AAAA,EACZ,QAAQ,MAAMC,UAAS;AACrB,QAAI,CAAC,QAAQ,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,EAAG,QAAO,CAAC;AAChE,WAAQA,UAAS,QAAQ,IAAgB,KAAK,KAAK,IAAI,CAAC,UAAU,EAAE,MAAM,SAAS,KAAK,IAAI,GAAG,EAAE;AAAA,EACnG;AAAA,EACA,MAAM,YAAY,cAAc,aAAa,cAAc,SAAS;AAClE,UAAO,QAA2B,mBAAmB,cAAc,WAAW;AAAA,EAChF;AACF;;;ACTA,SAAS,eAAe,KAAmC;AACzD,SACE,OAAO,QAAQ,YACf,QAAQ,QACR,UAAU,OACV,aAAa,OACb,OAAQ,IAAqB,SAAS,YACtC,OAAQ,IAAqB,YAAY;AAE7C;AAEO,IAAM,oBAA+D;AAAA,EAC1E,YAAY;AAAA,EACZ,QAAQ,MAAMC,UAAS;AACrB,QAAI,CAAC,QAAQ,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,EAAG,QAAO,CAAC;AAChE,UAAM,MAAM;AACZ,QAAI,IAAI,MAAM,cAAc,GAAG;AAC7B,aAAO,IAAI,IAAI,CAAC,SAAS;AAAA,QACvB,MAAM,IAAI;AAAA,QACV,SAAS,IAAI;AAAA,QACb,MAAM,IAAI;AAAA,QACV,KAAK,IAAI;AAAA,MACX,EAAE;AAAA,IACJ;AACA,WAAQA,UAAS,QAAQ,GAAe,KAAK,CAAC;AAAA,EAChD;AAAA,EACA,MAAM,YAAY,cAAc,aAAa,cAAc,SAAS;AAClE,UAAO,QAA2B,qBAAqB,cAAc,WAAW;AAAA,EAClF;AACF;;;AC7BO,IAAM,kBAA4D;AAAA,EACvE,YAAY;AAAA,EACZ,QAAQ,MAAMC,UAAS;AACrB,QAAI,SAAS,UAAa,SAAS,KAAM,QAAO,CAAC;AACjD,UAAM,OACJ,OAAO,SAAS,WAAW,OAAO,MAAM,QAAQ,IAAI,KAAK,OAAO,KAAK,CAAC,MAAM,WAAW,KAAK,CAAC,IAAI;AACnG,QAAI,CAAC,KAAM,QAAO,CAAC;AACnB,UAAM,WAAWA,UAAS,QAAQ,CAAC,IAAI,CAAC;AACxC,QAAI,YAAY,SAAS,SAAS,EAAG,QAAO;AAC5C,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA,SAAS,eAAe,IAAI;AAAA;AAAA,cAAmB,IAAI;AAAA;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,YAAY,cAAc,aAAa,cAAc,SAAS;AAClE,UAAM,KAAK,YAAY,CAAC;AACxB,QAAI,IAAI;AACN,YAAO,QAA2B,oBAAoB,cAAc,EAAE;AAAA,IACxE;AAAA,EACF;AACF;;;ACtBO,IAAM,iBAAyD;AAAA,EACpE,YAAY;AAAA,EACZ,QAAQ,MAAMC,UAAS;AACrB,QAAI,CAAC,QAAQ,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,EAAG,QAAO,CAAC;AAChE,WAAQA,UAAS,QAAQ,IAAgB,KAAK,CAAC;AAAA,EACjD;AAAA,EACA,MAAM,YAAY,cAAc,aAAa,cAAc,SAAS;AAClE,UAAO,QAA2B,mBAAmB,cAAc,WAAW;AAAA,EAChF;AACF;;;ALYA,IAAMC,UAASC,cAAa,mBAAmB;AAexC,IAAM,mBAAN,MAAuB;AAAA,EAI5B,YAA6B,UAA2B;AAA3B;AAC3B,SAAK,WAAW,oBAAI,IAAsC;AAAA,MACxD,CAAC,UAAU,IAAI,cAAc,CAAC;AAAA,MAC9B,CAAC,eAAe,IAAI,kBAAkB,CAAC;AAAA,IACzC,CAAC;AACD,SAAK,SAAS,KAAK,eAAe,gBAAgB,mBAAmB,iBAAiB,cAAc;AAAA,EACtG;AAAA,EATiB;AAAA,EACA,WAAmC,CAAC;AAAA;AAAA,EAWrD,gBAAgB,SAA+B;AAC7C,SAAK,SAAS,IAAI,QAAQ,aAAa,OAAO;AAAA,EAChD;AAAA;AAAA,EAGA,gBAAgB,SAAqC;AACnD,SAAK,SAAS,KAAK,OAAO;AAAA,EAC5B;AAAA,EAEQ,WAAW,YAAsE;AACvF,UAAM,aAA+E;AAAA,MACnF,QAAQ,KAAK,UAAU;AAAA,MACvB,SAAS,KAAK,UAAU;AAAA,MACxB,YAAY,KAAK,UAAU;AAAA,MAC3B,UAAU,KAAK,UAAU;AAAA,MACzB,SAAS,KAAK,UAAU;AAAA,IAC1B;AACA,WAAO,WAAW,UAAU;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,MACJ,cACA,eACA,cAAgC,UAChC,aAC+B;AAE/B,QAAI,UAAU,KAAK,SAAS,IAAI,WAAW;AAC3C,QAAI,CAAC,SAAS;AACZ,MAAAD,QAAO,KAAK,EAAE,YAAY,GAAG,+CAA+C;AAC5E,gBAAU,KAAK,SAAS,IAAI,QAAQ;AAAA,IACtC;AACA,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,0CAA0C,WAAW,EAAE;AAAA,IACzE;AACA,UAAM,gBAAgB;AAMtB,UAAM,cAAc,SAAS,YAAY;AACzC,IAAAA,QAAO,MAAM,EAAE,aAAa,GAAG,mBAAmB;AAGlD,QAAI,qBAA4C,CAAC;AAEjD,eAAW,WAAW,KAAK,UAAU;AACnC,YAAM,OAAO,cAAc,QAAQ,UAAuC;AAC1E,UAAI,SAAS,UAAa,SAAS,KAAM;AACzC,UAAI,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,EAAG;AAE9C,YAAME,WAAU,KAAK,WAAW,QAAQ,UAAU;AAClD,YAAM,cAAc,QAAQ,QAAQ,MAAMA,QAAO;AACjD,UAAI,YAAY,SAAS,GAAG;AAC1B,cAAM,QAAQ,YAAY,cAAc,aAAa,aAAa,aAAa;AAC/E,YAAI,QAAQ,eAAe,cAAc;AACvC,+BAAqB;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,cAAc,YAAY;AAC5B,iBAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,cAAc,UAAU,GAAG;AAClE,cAAM,UAAU,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,eAAe,GAAG;AAC9D,YAAI,WAAW,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,GAAG;AACrD,gBAAM,OAAO,QAAQ,QAAQ,MAAM,KAAK,WAAW,GAAG,CAAC;AACvD,cAAI,KAAK,SAAS,GAAG;AACnB,kBAAM,QAAQ,YAAY,cAAc,MAAM,aAAa,aAAa;AACxE,gBAAI,QAAQ,eAAe,cAAc;AACvC,mCAAqB,CAAC,GAAG,oBAAoB,GAAI,IAA8B;AAAA,YACjF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAAF,QAAO,MAAM,EAAE,aAAa,GAAG,sBAAsB;AAGrD,UAAM,cAAc,kBAAkB,cAAc,oBAAoB,WAAW;AACnF,IAAAA,QAAO,MAAM,EAAE,aAAa,GAAG,sBAAsB;AAGrD,UAAM,SAAS,MAAM,cAAc,OAAO,YAAY;AACtD,IAAAA,QAAO,KAAK,EAAE,cAAc,aAAa,cAAc,aAAa,OAAO,OAAO,MAAM,GAAG,0BAA0B;AAErH,WAAO,EAAE,QAAQ,aAAa,cAAc,YAAY;AAAA,EAC1D;AACF;;;AMrJA,IAAM,iBAA+C;AAAA,EACnD,UAAU;AAAA,EACV,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AACP;AAEO,IAAM,YAAN,MAAgB;AAAA,EACb,SAAS,oBAAI,IAAyB;AAAA,EACtC,aAAa,oBAAI,IAAY;AAAA;AAAA,EAGrC,QAAQ,MAAuB;AAC7B,QAAI,CAAC,KAAK,OAAO,IAAI,KAAK,SAAS,GAAG;AACpC,WAAK,OAAO,IAAI,KAAK,WAAW,CAAC,CAAC;AAAA,IACpC;AACA,UAAM,QAAQ,KAAK,OAAO,IAAI,KAAK,SAAS,KAAK,CAAC;AAClD,UAAM,KAAK,IAAI;AACf,UAAM,KAAK,CAAC,GAAG,MAAM,eAAe,EAAE,QAAQ,IAAI,eAAe,EAAE,QAAQ,CAAC;AAAA,EAC9E;AAAA;AAAA,EAGA,QAAQ,WAA0C;AAChD,QAAI,KAAK,WAAW,IAAI,SAAS,EAAG,QAAO;AAC3C,UAAM,QAAQ,KAAK,OAAO,IAAI,SAAS;AACvC,QAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO;AACzC,WAAO,MAAM,MAAM;AAAA,EACrB;AAAA;AAAA,EAGA,eAAe,WAAyB;AACtC,SAAK,WAAW,IAAI,SAAS;AAAA,EAC/B;AAAA;AAAA,EAGA,SAAS,WAAyB;AAChC,SAAK,WAAW,OAAO,SAAS;AAAA,EAClC;AAAA;AAAA,EAGA,SAAS,WAA4B;AACnC,UAAM,QAAQ,KAAK,OAAO,IAAI,SAAS;AACvC,WAAO,CAAC,CAAC,SAAS,MAAM,SAAS;AAAA,EACnC;AAAA;AAAA,EAGA,aAAa,WAA4B;AACvC,WAAO,KAAK,WAAW,IAAI,SAAS;AAAA,EACtC;AAAA;AAAA,EAGA,UAAU,WAA2B;AACnC,WAAO,KAAK,OAAO,IAAI,SAAS,GAAG,UAAU;AAAA,EAC/C;AAAA;AAAA,EAGA,KAAK,WAAgC;AACnC,WAAO,CAAC,GAAI,KAAK,OAAO,IAAI,SAAS,KAAK,CAAC,CAAE;AAAA,EAC/C;AAAA;AAAA,EAGA,MAAM,WAAyB;AAC7B,SAAK,OAAO,OAAO,SAAS;AAC5B,SAAK,WAAW,OAAO,SAAS;AAAA,EAClC;AAAA;AAAA,EAGA,WAAiB;AACf,SAAK,OAAO,MAAM;AAClB,SAAK,WAAW,MAAM;AAAA,EACxB;AACF;;;ACzEA,SAAS,aAAAG,YAAW,SAAAC,cAAa;AACjC,SAAS,QAAAC,aAAY;AACrB,SAAS,gBAAAC,qBAAoB;AAG7B,IAAMC,UAASD,cAAa,eAAe;AAEpC,IAAM,eAAN,MAAmB;AAAA,EAChB,UAA6B,CAAC;AAAA,EAC9B;AAAA,EACA,cAAc;AAAA,EAEtB,cAAc,KAAmB;AAC/B,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,eAAe,KAAmB;AAChC,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,MAAM,OAAO,OAAuC;AAClD,SAAK,QAAQ,KAAK,KAAK;AAGvB,QAAI,KAAK,QAAQ,SAAS,KAAK,aAAa;AAC1C,WAAK,UAAU,KAAK,QAAQ,MAAM,CAAC,KAAK,WAAW;AAAA,IACrD;AAEA,QAAI,KAAK,YAAY;AACnB,YAAM,KAAK,cAAc,KAAK;AAAA,IAChC;AAAA,EACF;AAAA;AAAA,EAGA,WAAW,WAAoB,QAAQ,IAAuB;AAC5D,QAAI,WAAW,KAAK;AACpB,QAAI,WAAW;AACb,iBAAW,SAAS,OAAO,CAAC,MAAM,EAAE,cAAc,SAAS;AAAA,IAC7D;AACA,WAAO,SAAS,MAAM,CAAC,KAAK;AAAA,EAC9B;AAAA;AAAA,EAGA,cAAc,WAAgD;AAC5D,aAAS,IAAI,KAAK,QAAQ,SAAS,GAAG,KAAK,GAAG,KAAK;AACjD,YAAM,SAAS,KAAK,QAAQ,CAAC;AAC7B,UAAI,QAAQ,cAAc,UAAW,QAAO;AAAA,IAC9C;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,SAAS,WAA4C;AACnD,UAAM,WAAW,YACb,KAAK,QAAQ,OAAO,CAAC,MAAM,EAAE,cAAc,SAAS,IACpD,KAAK;AAET,UAAM,QAAgC,CAAC;AACvC,eAAW,KAAK,UAAU;AACxB,YAAM,EAAE,MAAM,KAAK,MAAM,EAAE,MAAM,KAAK,KAAK;AAAA,IAC7C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAc;AACZ,SAAK,UAAU,CAAC;AAAA,EAClB;AAAA,EAEA,MAAc,cAAc,OAAuC;AACjE,QAAI,CAAC,KAAK,WAAY;AACtB,QAAI;AACF,YAAMF,OAAM,KAAK,YAAY,EAAE,WAAW,KAAK,CAAC;AAChD,YAAM,WAAWC,MAAK,KAAK,YAAY,GAAG,MAAM,SAAS,YAAY;AACrE,YAAMF,WAAU,UAAU,KAAK,UAAU,KAAK,IAAI,MAAM,EAAE,MAAM,IAAI,CAAC;AAAA,IACvE,SAAS,KAAK;AACZ,MAAAI,QAAO,KAAK,EAAE,KAAK,QAAQ,MAAM,OAAO,GAAG,oCAAoC;AAAA,IACjF;AAAA,EACF;AACF;;;AC9EA,SAAS,gBAAAC,qBAAoB;AAK7B,IAAMC,UAASD,cAAa,iBAAiB;AAMtC,IAAM,iBAAN,MAAqB;AAAA,EAK1B,YACmB,OACA,KACA,aACA,iBAAiB,KAClC;AAJiB;AACA;AACA;AACA;AAAA,EAChB;AAAA,EATK,UAAU;AAAA,EACV,mBAA0D;AAAA,EAC1D,aAAa,oBAAI,IAAY;AAAA;AAAA,EAUrC,cAAc,WAAyB;AACrC,SAAK,WAAW,IAAI,SAAS;AAAA,EAC/B;AAAA;AAAA,EAGA,gBAAgB,WAAyB;AACvC,SAAK,WAAW,OAAO,SAAS;AAChC,SAAK,MAAM,MAAM,SAAS;AAAA,EAC5B;AAAA;AAAA,EAGA,QAAc;AACZ,QAAI,KAAK,QAAS;AAClB,SAAK,UAAU;AACf,SAAK,mBAAmB,YAAY,MAAM;AACxC,WAAK,KAAK,KAAK;AAAA,IACjB,GAAG,KAAK,cAAc;AACtB,IAAAC,QAAO,KAAK,wBAAwB;AAAA,EACtC;AAAA;AAAA,EAGA,OAAa;AACX,SAAK,UAAU;AACf,QAAI,KAAK,kBAAkB;AACzB,oBAAc,KAAK,gBAAgB;AACnC,WAAK,mBAAmB;AAAA,IAC1B;AACA,IAAAA,QAAO,KAAK,wBAAwB;AAAA,EACtC;AAAA;AAAA,EAGA,MAAM,OAAsB;AAC1B,eAAW,aAAa,KAAK,YAAY;AACvC,UAAI,KAAK,MAAM,aAAa,SAAS,EAAG;AAExC,YAAM,OAAO,KAAK,MAAM,QAAQ,SAAS;AACzC,UAAI,CAAC,KAAM;AAGX,WAAK,KAAK,YAAY,IAAI;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAc,YAAY,MAAgC;AACxD,SAAK,MAAM,eAAe,KAAK,SAAS;AACxC,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AAEzC,UAAM,SAA0B;AAAA,MAC9B,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,QAAQ;AAAA,MACR;AAAA,IACF;AAEA,QAAI;AACF,MAAAA,QAAO;AAAA,QACL,EAAE,QAAQ,KAAK,IAAI,WAAW,KAAK,WAAW,QAAQ,KAAK,OAAO;AAAA,QAClE;AAAA,MACF;AACA,YAAM,SAAS,MAAM,KAAK,YAAY,KAAK,WAAW,KAAK,MAAM;AAEjE,aAAO,SAAS;AAChB,aAAO,SAAS;AAChB,aAAO,eAAc,oBAAI,KAAK,GAAE,YAAY;AAC5C,aAAO,aAAa,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,QAAQ;AAE7D,MAAAA,QAAO,KAAK,EAAE,QAAQ,KAAK,IAAI,YAAY,OAAO,WAAW,GAAG,gBAAgB;AAAA,IAClF,SAAS,KAAK;AACZ,aAAO,SAAS;AAChB,aAAO,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC9D,aAAO,eAAc,oBAAI,KAAK,GAAE,YAAY;AAC5C,aAAO,aAAa,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,QAAQ;AAE7D,MAAAA,QAAO,KAAK,EAAE,QAAQ,KAAK,IAAI,OAAO,OAAO,MAAM,GAAG,aAAa;AAAA,IACrE,UAAE;AACA,WAAK,MAAM,SAAS,KAAK,SAAS;AAClC,YAAM,KAAK,IAAI,OAAO,MAAM;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,IAAI,YAAqB;AACvB,WAAO,KAAK;AAAA,EACd;AACF;;;AC7GA,SAAS,oBAAoB;AAC7B,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,gBAAAC,sBAAoB;;;ACF7B,SAAS,gBAAAC,qBAAoB;AAI7B,IAAMC,UAASD,cAAa,cAAc;AAEnC,IAAM,cAAN,MAAkB;AAAA,EAIvB,YAA6B,OAAkB;AAAlB;AAAA,EAAmB;AAAA,EAHxC,UAAU,oBAAI,IAAyB;AAAA,EACvC;AAAA;AAAA,EAKR,SAAS,QAA2B;AAClC,QAAI,KAAK,QAAQ,IAAI,OAAO,EAAE,GAAG;AAC/B,MAAAC,QAAO,KAAK,EAAE,IAAI,OAAO,GAAG,GAAG,4CAA4C;AAC3E,WAAK,QAAQ,IAAI,OAAO,EAAE,GAAG,KAAK;AAAA,IACpC;AACA,SAAK,QAAQ,IAAI,OAAO,IAAI,MAAM;AAElC,QAAI,KAAK,WAAW;AAClB,aAAO,MAAM,KAAK,WAAW,CAAC,SAAS,KAAK,MAAM,QAAQ,IAAI,CAAC;AAAA,IACjE;AAAA,EACF;AAAA;AAAA,EAGA,WAAW,UAA2B;AACpC,UAAM,SAAS,KAAK,QAAQ,IAAI,QAAQ;AACxC,QAAI,CAAC,OAAQ,QAAO;AACpB,WAAO,KAAK;AACZ,SAAK,QAAQ,OAAO,QAAQ;AAC5B,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,SAAS,WAAyB;AAChC,SAAK,YAAY;AACjB,eAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,UAAI,CAAC,OAAO,QAAQ;AAClB,eAAO,MAAM,WAAW,CAAC,SAAS,KAAK,MAAM,QAAQ,IAAI,CAAC;AAAA,MAC5D;AAAA,IACF;AACA,IAAAA,QAAO,KAAK,EAAE,WAAW,aAAa,KAAK,QAAQ,KAAK,GAAG,iCAAiC;AAAA,EAC9F;AAAA;AAAA,EAGA,UAAgB;AACd,eAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,aAAO,KAAK;AAAA,IACd;AACA,SAAK,YAAY;AACjB,IAAAA,QAAO,KAAK,iCAAiC;AAAA,EAC/C;AAAA;AAAA,EAGA,cAA+D;AAC7D,WAAO,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO;AAAA,MACnD,IAAI,EAAE;AAAA,MACN,MAAM,EAAE;AAAA,MACR,QAAQ,EAAE;AAAA,IACZ,EAAE;AAAA,EACJ;AAAA;AAAA,EAGA,UAAU,IAAqC;AAC7C,WAAO,KAAK,QAAQ,IAAI,EAAE;AAAA,EAC5B;AAAA,EAEA,IAAI,cAAsB;AACxB,WAAO,KAAK,QAAQ;AAAA,EACtB;AACF;;;ACvEA,SAAS,kBAAkB;AAC3B,SAAS,gBAAAC,qBAAoB;AAG7B,IAAMC,UAASD,cAAa,iBAAiB;AAQtC,IAAM,iBAAN,MAA4C;AAAA,EAMjD,YAA6B,QAAyB,IAAa;AAAtC;AAC3B,SAAK,KAAK,MAAM,aAAa,WAAW,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,EACvD;AAAA,EAPS;AAAA,EACA,OAAO;AAAA,EACR,WAAkD;AAAA,EAClD,UAAU;AAAA,EAMlB,MAAM,WAAmB,QAA4B;AACnD,QAAI,KAAK,QAAS;AAClB,SAAK,UAAU;AACf,SAAK,WAAW,YAAY,MAAM;AAChC,aAAO;AAAA,QACL,IAAI,WAAW;AAAA,QACf;AAAA,QACA,QAAQ,KAAK,OAAO;AAAA,QACpB,UAAU,KAAK,OAAO,YAAY;AAAA,QAClC,QAAQ,aAAa,KAAK,EAAE;AAAA,QAC5B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AAAA,IACH,GAAG,KAAK,OAAO,UAAU;AACzB,IAAAC,QAAO,KAAK,EAAE,IAAI,KAAK,IAAI,YAAY,KAAK,OAAO,WAAW,GAAG,wBAAwB;AAAA,EAC3F;AAAA,EAEA,OAAa;AACX,QAAI,CAAC,KAAK,QAAS;AACnB,QAAI,KAAK,UAAU;AACjB,oBAAc,KAAK,QAAQ;AAC3B,WAAK,WAAW;AAAA,IAClB;AACA,SAAK,UAAU;AACf,IAAAA,QAAO,KAAK,EAAE,IAAI,KAAK,GAAG,GAAG,wBAAwB;AAAA,EACvD;AAAA,EAEA,IAAI,SAAkB;AACpB,WAAO,KAAK;AAAA,EACd;AACF;;;ACnDA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,YAAY;AACrB,SAAS,gBAAAC,qBAAoB;AAG7B,IAAMC,UAASD,cAAa,YAAY;AASjC,IAAM,YAAN,MAAuC;AAAA,EAM5C,YAA6B,QAAoB,IAAa;AAAjC;AAC3B,SAAK,KAAK,MAAM,QAAQD,YAAW,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,EAClD;AAAA,EAPS;AAAA,EACA,OAAO;AAAA,EACR,MAAmB;AAAA,EACnB,UAAU;AAAA,EAMlB,MAAM,WAAmB,QAA4B;AACnD,QAAI,KAAK,QAAS;AAClB,SAAK,UAAU;AACf,SAAK,MAAM,IAAI;AAAA,MACb,KAAK,OAAO;AAAA,MACZ;AAAA,QACE,UAAU,KAAK,OAAO;AAAA,MACxB;AAAA,MACA,MAAM;AACJ,eAAO;AAAA,UACL,IAAIA,YAAW;AAAA,UACf;AAAA,UACA,QAAQ,KAAK,OAAO;AAAA,UACpB,UAAU,KAAK,OAAO,YAAY;AAAA,UAClC,QAAQ,QAAQ,KAAK,EAAE;AAAA,UACvB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,CAAC;AAAA,MACH;AAAA,IACF;AACA,IAAAE,QAAO,KAAK,EAAE,IAAI,KAAK,IAAI,SAAS,KAAK,OAAO,QAAQ,GAAG,mBAAmB;AAAA,EAChF;AAAA,EAEA,OAAa;AACX,QAAI,CAAC,KAAK,QAAS;AACnB,QAAI,KAAK,KAAK;AACZ,WAAK,IAAI,KAAK;AACd,WAAK,MAAM;AAAA,IACb;AACA,SAAK,UAAU;AACf,IAAAA,QAAO,KAAK,EAAE,IAAI,KAAK,GAAG,GAAG,mBAAmB;AAAA,EAClD;AAAA,EAEA,IAAI,SAAkB;AACpB,WAAO,KAAK;AAAA,EACd;AACF;;;AC3DA,SAAS,cAAAC,mBAAkB;AAE3B,SAAS,gBAAAC,qBAAoB;AAG7B,IAAMC,UAASD,cAAa,YAAY;AAQjC,IAAM,YAAN,MAAuC;AAAA,EAM5C,YACmB,QACA,SACjB,IACA;AAHiB;AACA;AAGjB,SAAK,KAAK,MAAM,QAAQ,OAAO,SAAS;AAAA,EAC1C;AAAA,EAXS;AAAA,EACA,OAAO;AAAA,EACR,UAAU;AAAA,EACV,UAAiD;AAAA,EAUzD,MAAM,WAAmB,QAA4B;AACnD,QAAI,KAAK,QAAS;AAClB,SAAK,UAAU;AACf,SAAK,UAAU,IAAI,SAAoB;AACrC,YAAM,UAAU,KAAK,SAAS,IAAI,KAAK,UAAU,KAAK,CAAC,CAAC,IAAI;AAC5D,YAAM,SAAS,KAAK,OAAO,OAAO,QAAQ,eAAe,OAAO;AAChE,aAAO;AAAA,QACL,IAAID,YAAW;AAAA,QACf;AAAA,QACA;AAAA,QACA,UAAU,KAAK,OAAO,YAAY;AAAA,QAClC,QAAQ,QAAQ,KAAK,OAAO,SAAS;AAAA,QACrC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,UAAU,KAAK,SAAS,IAAI,EAAE,SAAS,KAAK,CAAC,EAA6B,IAAI;AAAA,MAChF,CAAC;AAAA,IACH;AACA,SAAK,QAAQ,GAAG,KAAK,OAAO,WAAW,KAAK,OAAO;AACnD,IAAAE,QAAO,KAAK,EAAE,IAAI,KAAK,IAAI,WAAW,KAAK,OAAO,UAAU,GAAG,mBAAmB;AAAA,EACpF;AAAA,EAEA,OAAa;AACX,QAAI,CAAC,KAAK,QAAS;AACnB,QAAI,KAAK,SAAS;AAChB,WAAK,QAAQ,IAAI,KAAK,OAAO,WAAW,KAAK,OAAO;AACpD,WAAK,UAAU;AAAA,IACjB;AACA,SAAK,UAAU;AACf,IAAAA,QAAO,KAAK,EAAE,IAAI,KAAK,GAAG,GAAG,mBAAmB;AAAA,EAClD;AAAA,EAEA,IAAI,SAAkB;AACpB,WAAO,KAAK;AAAA,EACd;AACF;;;AJhDA,IAAMC,WAASC,eAAa,oBAAoB;AAEzC,IAAM,oBAAN,MAAwB;AAAA,EAQ7B,YACmB,WACjB,aACA,QACA;AAHiB;AAIjB,SAAK,QAAQ,IAAI,UAAU;AAC3B,SAAK,MAAM,IAAI,aAAa;AAC5B,QAAI,QAAQ,YAAY;AACtB,WAAK,IAAI,cAAc,OAAO,UAAU;AAAA,IAC1C;AACA,SAAK,aAAa,IAAI,eAAe,KAAK,OAAO,KAAK,KAAK,WAAW;AACtE,SAAK,SAAS,IAAI,YAAY,KAAK,KAAK;AACxC,SAAK,WAAW,IAAI,aAAa;AAAA,EACnC;AAAA,EApBiB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,WAAW;AAAA;AAAA,EAkBnB,UAAU,gBAA2C;AACnD,QAAI,eAAe,WAAW;AAC5B,WAAK,OAAO,SAAS,IAAI,eAAe,eAAe,SAAS,CAAC;AAAA,IACnE;AACA,eAAW,cAAc,eAAe,QAAQ,CAAC,GAAG;AAClD,WAAK,OAAO,SAAS,IAAI,UAAU,UAAU,CAAC;AAAA,IAChD;AACA,eAAW,cAAc,eAAe,SAAS,CAAC,GAAG;AACnD,WAAK,OAAO,SAAS,IAAI,UAAU,YAAY,KAAK,QAAQ,CAAC;AAAA,IAC/D;AACA,IAAAD,SAAO,KAAK,EAAE,WAAW,KAAK,WAAW,SAAS,KAAK,OAAO,YAAY,GAAG,qBAAqB;AAAA,EACpG;AAAA;AAAA,EAGA,QAAc;AACZ,QAAI,KAAK,SAAU;AACnB,SAAK,WAAW;AAChB,SAAK,WAAW,cAAc,KAAK,SAAS;AAC5C,SAAK,OAAO,SAAS,KAAK,SAAS;AACnC,SAAK,WAAW,MAAM;AACtB,IAAAA,SAAO,KAAK,EAAE,WAAW,KAAK,UAAU,GAAG,2BAA2B;AAAA,EACxE;AAAA;AAAA,EAGA,OAAa;AACX,QAAI,CAAC,KAAK,SAAU;AACpB,SAAK,OAAO,QAAQ;AACpB,SAAK,WAAW,KAAK;AACrB,SAAK,WAAW,gBAAgB,KAAK,SAAS;AAC9C,SAAK,WAAW;AAChB,IAAAA,SAAO,KAAK,EAAE,WAAW,KAAK,UAAU,GAAG,2BAA2B;AAAA,EACxE;AAAA;AAAA,EAGA,SAAS,QAAgB,WAAmD,UAAgB;AAC1F,SAAK,MAAM,QAAQ;AAAA,MACjB,IAAIE,YAAW;AAAA,MACf,WAAW,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,UAAU,WAAmB,SAAyB;AACpD,SAAK,SAAS,KAAK,WAAW,OAAO;AAAA,EACvC;AAAA;AAAA,EAGA,WAAsE;AACpE,WAAO;AAAA,MACL,QAAQ,KAAK,MAAM,UAAU,KAAK,SAAS;AAAA,MAC3C,YAAY,KAAK,MAAM,aAAa,KAAK,SAAS;AAAA,MAClD,OAAO,KAAK,MAAM,KAAK,KAAK,SAAS;AAAA,IACvC;AAAA,EACF;AAAA;AAAA,EAGA,QAAQ,OAA2B;AACjC,WAAO,KAAK,IAAI,WAAW,KAAK,WAAW,KAAK;AAAA,EAClD;AAAA;AAAA,EAGA,WAAmC;AACjC,WAAO,KAAK,IAAI,SAAS,KAAK,SAAS;AAAA,EACzC;AAAA;AAAA,EAGA,aAA8D;AAC5D,WAAO,KAAK,OAAO,YAAY;AAAA,EACjC;AAAA,EAEA,IAAI,UAAmB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,eAA6B;AAC/B,WAAO,KAAK;AAAA,EACd;AACF;;;AKvHA,SAAS,SAAS;AAEX,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,YAAY,EAAE,OAAO,EAAE,IAAI,GAAI;AAAA,EAC/B,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACxB,UAAU,EAAE,KAAK,CAAC,OAAO,UAAU,QAAQ,UAAU,CAAC,EAAE,SAAS;AACnE,CAAC;AAEM,IAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACxB,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,UAAU,EAAE,KAAK,CAAC,OAAO,UAAU,QAAQ,UAAU,CAAC,EAAE,SAAS;AACnE,CAAC;AAEM,IAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC3B,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACxB,UAAU,EAAE,KAAK,CAAC,OAAO,UAAU,QAAQ,UAAU,CAAC,EAAE,SAAS;AACnE,CAAC;AAEM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,WAAW,sBAAsB,SAAS;AAAA,EAC1C,MAAM,EAAE,MAAM,gBAAgB,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EACrD,OAAO,EAAE,MAAM,gBAAgB,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACxD,CAAC;;;ACzBD,SAAS,KAAAC,UAAS;AAGX,IAAM,qBAAqBC,GAAE,OAAO;AAAA,EACzC,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,SAASA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC/C,KAAKA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC7D,CAAC;AAEM,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EAC1C,QAAQA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EACjD,SAASA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EAClD,YAAYA,GAAE,MAAM,kBAAkB,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC7D,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpD,SAASA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EAClD,YAAYA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,MAAMA,GAAE,QAAQ,CAAC,CAAC,EAAE,SAAS;AAClE,CAAC;AAEM,IAAM,qBAAqBA,GAAE,OAAO;AAAA,EACzC,MAAMA,GAAE,KAAK,CAAC,UAAU,gBAAgB,eAAe,UAAU,IAAI,CAAC;AAAA,EACtE,QAAQA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAAE,SAAS;AACrD,CAAC;AAED,IAAM,uBAAuBA,GAAE,KAAK,CAAC,UAAU,aAAa,QAAQ,CAAC;AASrE,IAAM,mBAAgD;AAAA,EACpD,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AACV;AAEO,IAAM,sBAAsBA,GAChC,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,UAAU,qBAAqB,SAAS;AAAA,EACxC,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,QAAQA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAAE,SAAS;AACrD,CAAC,EACA,UAAU,CAAC,SAAS;AAAA,EACnB,GAAG;AAAA,EACH,UAAW,IAAI,YAAY,iBAAiB,IAAI,IAAI,KAAK;AAC3D,EAAE;AAEG,IAAM,wBAAwBA,GAAE,OAAO;AAAA,EAC5C,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,QAAQA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAAE,SAAS;AACrD,CAAC;AAEM,IAAM,oBAAoBA,GAAE,OAAO;AAAA,EACxC,OAAOA,GAAE,MAAM,qBAAqB,EAAE,IAAI,CAAC;AAC7C,CAAC;AAMM,IAAM,uBAAuBA,GAAE,KAAK;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,uBAAuBA,GAAE,OAAO;AAAA,EAC3C,gBAAgBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC7C,mBAAmBA,GAAE,QAAQ,EAAE,SAAS;AAC1C,CAAC;AAEM,IAAM,gBAAgBA,GAAE,OAAO;AAAA,EACpC,SAASA,GAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,0BAA0BA,GAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC9D,SAAS,qBAAqB,SAAS;AACzC,CAAC;AAEM,IAAM,0BAA0BA,GAAE,OAAO;AAAA,EAC9C,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACpC,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,KAAKA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAClC,aAAa,qBAAqB,SAAS;AAAA,EAC3C,SAAS,cAAc,SAAS;AAAA,EAChC,uBAAuBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AACtD,CAAC;AAEM,IAAM,yBAAyBA,GAAE,KAAK;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,yBAAyBA,GAAE,MAAM;AAAA,EAC5C;AAAA,EACA;AACF,CAAC;AAMM,IAAM,wBAAwBA,GAAE,OAAO;AAAA,EAC5C,MAAMA,GAAE,KAAK,CAAC,WAAW,UAAU,OAAO,CAAC;AAAA,EAC3C,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,UAAUA,GAAE,QAAQ,EAAE,SAAS;AACjC,CAAC;AAMM,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EAC1C,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAC/B,SAASA,GAAE,OAAO,EAAE,MAAM,mBAAmB,oCAAoC;AAAA,EACjF,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,QAAQ,sBAAsB,SAAS;AAAA,EACvC,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,SAAS;AAAA,EACT,UAAU,oBAAoB,SAAS;AAAA,EACvC,eAAe;AAAA,EACf,aAAa,uBAAuB,SAAS;AAAA,EAC7C,aAAa,kBAAkB,SAAS;AAAA,EACxC,UAAU,qBAAqB,SAAS;AAAA,EACxC,UAAUA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,EAAE,SAAS;AACtD,CAAC;;;AC9ID,SAAS,UAAU,SAAS,QAAAC,aAAY;AACxC,SAAS,QAAAC,OAAM,eAAe;AAE9B;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAGA,IAAM,iBAAN,MAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM1B,MAAM,aAAa,UAA0C;AAC3D,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,SAAS,UAAU,OAAO;AAAA,IACxC,SAAS,KAAK;AACZ,UAAI,YAAY,GAAG,KAAK,IAAI,SAAS,UAAU;AAC7C,cAAM,IAAI,oBAAoB,QAAQ;AAAA,MACxC;AACA,YAAM;AAAA,IACR;AACA,WAAO,KAAK,iBAAiB,KAAK,QAAQ;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAe,SAAiB,QAAyC;AAC7E,WAAO,KAAK,iBAAiB,SAAS,UAAU,UAAU;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBAAkB,SAA2C;AACjE,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM,QAAQ,OAAO;AAAA,IACjC,SAAS,KAAK;AACZ,UAAI,YAAY,GAAG,KAAK,IAAI,SAAS,UAAU;AAC7C,cAAM,IAAI,oBAAoB,OAAO;AAAA,MACvC;AACA,YAAM;AAAA,IACR;AAEA,UAAM,YAAY,QAAQ,OAAO,CAAC,MAAM,QAAQ,CAAC,MAAM,OAAO;AAC9D,UAAM,YAA6B,CAAC;AAEpC,eAAW,QAAQ,WAAW;AAC5B,YAAM,WAAWC,MAAK,SAAS,IAAI;AACnC,YAAM,WAAW,MAAMC,MAAK,QAAQ;AACpC,UAAI,CAAC,SAAS,OAAO,EAAG;AAExB,UAAI;AACF,cAAM,WAAW,MAAM,KAAK,aAAa,QAAQ;AACjD,kBAAU,KAAK,QAAQ;AAAA,MACzB,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,KAAa,QAA+B;AACnE,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,GAAG;AAAA,IACzB,QAAQ;AACN,YAAM,IAAI;AAAA,QACR,mBAAmB,MAAM;AAAA,QACzB,CAAC,EAAE,MAAM,IAAI,SAAS,uBAAuB,CAAC;AAAA,MAChD;AAAA,IACF;AAEA,UAAM,SAAS,oBAAoB,UAAU,MAAM;AACnD,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,SAAS,OAAO,MAAM,OAAO,IAAI,CAAC,WAAW;AAAA,QACjD,MAAM,MAAM,KAAK,IAAI,MAAM,EAAE,KAAK,GAAG;AAAA,QACrC,SAAS,MAAM;AAAA,MACjB,EAAE;AACF,YAAM,IAAI;AAAA,QACR,kCAAkC,MAAM;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAEA,WAAO,gBAAgB,OAAO,IAAI;AAAA,EACpC;AACF;AAMO,SAAS,gBAAgB,QAA4C;AAC1E,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,SAAS,OAAO;AAAA,IAChB,aAAa,OAAO;AAAA,IACpB,OAAO,OAAO;AAAA,IACd,UAAU,OAAO;AAAA,IACjB,QAAQ,OAAO;AAAA,IACf,MAAM,OAAO;AAAA,IACb,SAAS,OAAO;AAAA,IAChB,UAAU,OAAO;AAAA,IACjB,eAAe;AAAA,MACb,QAAQ,OAAO,cAAc;AAAA,MAC7B,SAAS,OAAO,cAAc;AAAA,MAC9B,YAAY,OAAO,cAAc,WAAW,IAAI,CAAC,OAAO;AAAA,QACtD,MAAM,EAAE;AAAA,QACR,SAAS,EAAE;AAAA,QACX,MAAM,EAAE;AAAA,QACR,KAAK,EAAE;AAAA,MACT,EAAE;AAAA,MACF,UAAU,OAAO,cAAc;AAAA,MAC/B,WAAW,OAAO,cAAc;AAAA,MAChC,SAAS,OAAO,cAAc;AAAA,MAC9B,YAAY,OAAO,cAAc;AAAA,IACnC;AAAA,IACA,aAAa,OAAO;AAAA,IACpB,aAAa,OAAO;AAAA,IACpB,UAAU,OAAO;AAAA,IACjB,UAAU,OAAO;AAAA,EACnB;AACF;AAEA,SAAS,YAAY,KAA4C;AAC/D,SAAO,eAAe,SAAS,UAAU;AAC3C;;;ACvIA,SAAS,gBAAAC,sBAAoB;AAE7B,IAAMC,WAASD,eAAa,yBAAyB;AAgB9C,IAAM,wBAAN,MAA4B;AAAA,EAChB,cAAc,oBAAI,IAAqC;AAAA,EAChE;AAAA,EAER,SAAS,YAA2C;AAClD,SAAK,YAAY,IAAI,WAAW,MAAM,UAAU;AAChD,IAAAC,SAAO,MAAM,EAAE,MAAM,WAAW,KAAK,GAAG,qBAAqB;AAAA,EAC/D;AAAA,EAEA,IAAI,MAAmD;AACrD,WAAO,KAAK,YAAY,IAAI,IAAI;AAAA,EAClC;AAAA,EAEA,WAAW,MAAuC;AAChD,UAAM,OAAO,KAAK,YAAY,IAAI,IAAI;AACtC,QAAI,CAAC,MAAM;AACT,YAAM,IAAI;AAAA,QACR,aAAa,IAAI,8CACQ,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,MAClE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,MAAuB;AACzB,WAAO,KAAK,YAAY,IAAI,IAAI;AAAA,EAClC;AAAA,EAEA,OAAkC;AAChC,WAAO,CAAC,GAAG,KAAK,YAAY,OAAO,CAAC;AAAA,EACtC;AAAA,EAEA,WAAW,MAAoB;AAC7B,QAAI,CAAC,KAAK,YAAY,IAAI,IAAI,GAAG;AAC/B,YAAM,IAAI;AAAA,QACR,iCAAiC,IAAI;AAAA,MACvC;AAAA,IACF;AACA,SAAK,cAAc;AACnB,IAAAA,SAAO,KAAK,EAAE,KAAK,GAAG,sBAAsB;AAAA,EAC9C;AAAA,EAEA,aAAkD;AAChD,QAAI,CAAC,KAAK,YAAa,QAAO;AAC9B,WAAO,KAAK,YAAY,IAAI,KAAK,WAAW;AAAA,EAC9C;AAAA,EAEA,iBAAqC;AACnC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,SAAe;AACb,SAAK,YAAY,MAAM;AACvB,SAAK,cAAc;AAAA,EACrB;AACF;AAGO,IAAM,wBAAwB,IAAI,sBAAsB;;;ACjD/D,SAAS,YAAY,UAA0F;AAC7G,SAAO,SAAS,OAAO,IAAI,CAAC,OAAO;AAAA,IACjC,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,GAAG;AAAA,IACjC,SAAS,EAAE;AAAA,IACX,UAAU;AAAA,EACZ,EAAE;AACJ;AAEA,SAAS,QAAQ,MAAc,SAAiB,MAAgC;AAC9E,SAAO,EAAE,MAAM,SAAS,UAAU,WAAW,KAAK;AACpD;AAMO,SAAS,sBAAsB,MAA2D;AAC/F,QAAM,SAAS,mBAAmB,UAAU,IAAI;AAChD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,EAAE,OAAO,OAAO,QAAQ,YAAY,OAAO,KAAK,GAAG,UAAU,CAAC,EAAE;AAAA,EACzE;AACA,SAAO,EAAE,OAAO,MAAM,MAAM,OAAO,MAAM,QAAQ,CAAC,GAAG,UAAU,CAAC,EAAE;AACpE;AAEO,SAAS,uBAAuB,MAA4D;AACjG,QAAM,SAAS,oBAAoB,UAAU,IAAI;AACjD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,EAAE,OAAO,OAAO,QAAQ,YAAY,OAAO,KAAK,GAAG,UAAU,CAAC,EAAE;AAAA,EACzE;AACA,QAAM,WAA8B,CAAC;AAErC,MAAI,CAAC,sBAAsB,IAAI,OAAO,KAAK,IAAI,GAAG;AAChD,aAAS,KAAK;AAAA,MACZ;AAAA,MACA,kBAAkB,OAAO,KAAK,IAAI;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,OAAO,MAAM,MAAM,OAAO,MAAM,QAAQ,CAAC,GAAG,SAAS;AAChE;AAEO,SAAS,0BAA0B,MAAyD;AACjG,QAAM,SAAS,uBAAuB,UAAU,IAAI;AACpD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,EAAE,OAAO,OAAO,QAAQ,YAAY,OAAO,KAAK,GAAG,UAAU,CAAC,EAAE;AAAA,EACzE;AACA,QAAM,WAA8B,CAAC;AAErC,MAAI,OAAO,OAAO,SAAS,YAAY,OAAO,SAAS,MAAM;AAC3D,UAAM,QAAQ,OAAO;AACrB,QAAI,MAAM,SAAS,MAAM,MAAM;AAC7B,YAAM,UAAU,MAAM,MAAM,OAAO,CAAC,MAAM,MAAM,MAAM,SAAS,CAAC,CAAC;AACjE,UAAI,QAAQ,SAAS,GAAG;AACtB,iBAAS,KAAK;AAAA,UACZ;AAAA,UACA,wCAAwC,QAAQ,KAAK,IAAI,CAAC;AAAA,UAC1D;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,MAAM,MAAM,OAAO,MAAM,QAAQ,CAAC,GAAG,SAAS;AAChE;AAEO,SAAS,uBAAuB,MAAuD;AAC5F,QAAM,SAAS,qBAAqB,UAAU,IAAI;AAClD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,EAAE,OAAO,OAAO,QAAQ,YAAY,OAAO,KAAK,GAAG,UAAU,CAAC,EAAE;AAAA,EACzE;AACA,QAAM,WAA8B,CAAC;AAErC,MAAI,OAAO,KAAK,WAAW;AACzB,QAAI,OAAO,KAAK,UAAU,aAAa,KAAM;AAC3C,eAAS,KAAK;AAAA,QACZ;AAAA,QACA,sBAAsB,OAAO,KAAK,UAAU,UAAU;AAAA,QACtD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,MAAM,MAAM,OAAO,MAAM,QAAQ,CAAC,GAAG,SAAS;AAChE;AAEO,SAAS,4BAA4B,MAA4D;AACtG,QAAM,SAAS,oBAAoB,UAAU,IAAI;AACjD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,EAAE,OAAO,OAAO,QAAQ,YAAY,OAAO,KAAK,GAAG,UAAU,CAAC,EAAE;AAAA,EACzE;AACA,QAAM,WAA8B,CAAC;AAErC,QAAM,MAAM,OAAO;AACnB,MAAI,IAAI,aAAa,IAAI,UAAU,SAAS,MAAM,CAAC,IAAI,UAAU,IAAI,OAAO,WAAW,OAAO,CAAC,IAAI,WAAW,IAAI,QAAQ,WAAW,IAAI;AACvI,aAAS,KAAK;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,OAAO,MAAM,MAAM,OAAO,MAA6B,QAAQ,CAAC,GAAG,SAAS;AACvF;AAUO,SAAS,iBAAiB,MAAsD;AACrF,QAAM,SAAS,oBAAoB,UAAU,IAAI;AACjD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,EAAE,OAAO,OAAO,QAAQ,YAAY,OAAO,KAAK,GAAG,UAAU,CAAC,EAAE;AAAA,EACzE;AAEA,QAAM,WAA8B,CAAC;AACrC,QAAM,WAAW,gBAAgB,OAAO,IAAI;AAG5C,QAAM,aAAa,0BAA0B,SAAS,WAAW;AACjE,MAAI,WAAW,SAAS,SAAS,GAAG;AAClC,aAAS,KAAK,GAAG,WAAW,QAAQ;AAAA,EACtC;AAGA,MAAI,SAAS,UAAU;AACrB,UAAM,cAAc,uBAAuB,SAAS,QAAQ;AAC5D,QAAI,YAAY,SAAS,SAAS,GAAG;AACnC,eAAS,KAAK,GAAG,YAAY,QAAQ;AAAA,IACvC;AAAA,EACF;AAGA,QAAM,WAAW,4BAA4B,SAAS,aAAa;AACnE,MAAI,SAAS,SAAS,SAAS,GAAG;AAChC,aAAS,KAAK,GAAG,SAAS,QAAQ;AAAA,EACpC;AAGA,MAAI,SAAS,QAAQ,SAAS,YAAY,CAAC,SAAS,QAAQ,QAAQ;AAClE,aAAS,KAAK;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,SAAS,UAAU;AACrB,QAAI,SAAS,SAAS,SAAS,YAAY,CAAC,SAAS,SAAS,QAAQ;AACpE,eAAS,KAAK;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,CAAC,sBAAsB,IAAI,SAAS,SAAS,IAAI,GAAG;AACtD,eAAS,KAAK;AAAA,QACZ;AAAA,QACA,kBAAkB,SAAS,SAAS,IAAI;AAAA,QACxC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,MAAM,MAAM,UAAU,QAAQ,CAAC,GAAG,SAAS;AAC7D;;;ACvMA,SAAS,SAAAC,cAAa;AACtB,SAAS,QAAAC,aAAY;AAErB,SAAS,uBAAuB,yBAAAC,8BAA6B;;;ACH7D,SAAS,YAAAC,WAAU,aAAAC,YAAW,WAAAC,UAAS,QAAAC,OAAM,QAAQ,SAAAC,cAAa;AAClE,SAAS,QAAAC,OAAM,WAAAC,UAAS,eAAe;AACvC,SAAS,yBAAyB,uBAAAC,sBAAqB,yBAAAC,wBAAuB,gBAAAC,sBAAoB;AAW3F,IAAe,uBAAf,MAA8D;AAAA,EAChD,aAAa,oBAAI,IAAe;AAAA,EAChC;AAAA,EAGT;AAAA,EAEV,YAAY,YAAoB;AAC9B,SAAK,SAASA,eAAa,UAAU;AAAA,EACvC;AAAA,EAEA,cAAc,KAAmB;AAC/B,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,WAAoB;AAC3B,SAAK,WAAW,IAAI,UAAU,MAAM,SAAS;AAC7C,SAAK,OAAO,MAAM,EAAE,MAAM,UAAU,KAAK,GAAG,GAAG,KAAK,aAAa,aAAa;AAAA,EAChF;AAAA,EAEA,WAAW,MAAuB;AAChC,WAAO,KAAK,WAAW,OAAO,IAAI;AAAA,EACpC;AAAA,EAEA,IAAI,MAA6B;AAC/B,WAAO,KAAK,WAAW,IAAI,IAAI;AAAA,EACjC;AAAA,EAEA,IAAI,MAAuB;AACzB,WAAO,KAAK,WAAW,IAAI,IAAI;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,OAAsB;AAC5B,WAAO,MAAM,IAAI,CAAC,SAAS;AACzB,YAAM,YAAY,KAAK,WAAW,IAAI,IAAI;AAC1C,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,wBAAwB,KAAK,eAAe,IAAI;AAAA,MAC5D;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,OAAY;AACV,WAAO,MAAM,KAAK,KAAK,WAAW,OAAO,CAAC;AAAA,EAC5C;AAAA,EAEA,IAAI,OAAe;AACjB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,QAAc;AACZ,SAAK,WAAW,MAAM;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAI,WAAc,UAAU,OAAsB;AACtD,UAAM,YAAY,KAAK,gBAAgB,WAAW,KAAK;AACvD,SAAK,SAAS,SAAS;AACvB,QAAI,WAAW,KAAK,YAAY;AAC9B,YAAM,KAAK,eAAe,SAAS;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAc,OAAmB,UAAU,OAAmB;AACzE,UAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,wBAAwB,KAAK,eAAe,IAAI;AAAA,IAC5D;AACA,UAAM,SAAS,EAAE,GAAG,UAAU,GAAG,OAAO,KAAK;AAC7C,UAAM,YAAY,KAAK,gBAAgB,QAAQ,QAAQ;AACvD,SAAK,SAAS,SAAS;AACvB,QAAI,WAAW,KAAK,YAAY;AAC9B,YAAM,KAAK,eAAe,SAAS;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,MAAc,UAAU,OAAyB;AAC5D,UAAM,UAAU,KAAK,WAAW,IAAI;AACpC,QAAI,WAAW,WAAW,KAAK,YAAY;AACzC,YAAM,KAAK,gBAAgB,IAAI;AAAA,IACjC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAe,UAA8B;AACjD,UAAM,UAAU,QAAQ,QAAQ;AAChC,UAAM,MAAM,MAAMT,UAAS,SAAS,OAAO;AAC3C,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAM,YAAY,KAAK,gBAAgB,QAAQ,OAAO;AACtD,SAAK,SAAS,SAAS;AACvB,SAAK,OAAO,KAAK,EAAE,MAAM,UAAU,MAAM,UAAU,QAAQ,GAAG,GAAG,KAAK,aAAa,WAAW;AAC9F,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,MAAc,UAAiC;AAChE,UAAM,YAAY,KAAK,IAAI,IAAI;AAC/B,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,wBAAwB,KAAK,eAAe,IAAI;AAAA,IAC5D;AACA,UAAM,UAAU,QAAQ,QAAQ;AAChC,UAAMC,WAAU,SAAS,KAAK,UAAU,WAAW,MAAM,CAAC,IAAI,MAAM,OAAO;AAC3E,SAAK,OAAO,KAAK,EAAE,MAAM,UAAU,QAAQ,GAAG,GAAG,KAAK,aAAa,WAAW;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,OAAoB;AACzB,UAAM,QAAQ,MAAM,YAAY;AAChC,WAAO,KAAK,KAAK,EAAE,OAAO,CAAC,MAAM;AAC/B,UAAI,EAAE,KAAK,YAAY,EAAE,SAAS,KAAK,EAAG,QAAO;AACjD,YAAM,OAAQ,EAA8B;AAC5C,UAAI,OAAO,SAAS,YAAY,KAAK,YAAY,EAAE,SAAS,KAAK,EAAG,QAAO;AAC3E,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,WAAmC;AACxC,WAAO,KAAK,KAAK,EAAE,OAAO,SAAS;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAgB,mBAAmB,SAAiB,YAA4C;AAC9F,QAAI,CAAC,cAAc,WAAW,SAAS,IAAI,EAAG,QAAO;AACrD,QAAI,WAAW,SAAS,KAAK,KAAK,WAAW,SAAS,MAAM,GAAG;AAC7D,UAAI;AACF,eAAO,MAAMD,UAASK,MAAK,SAAS,UAAU,GAAG,OAAO;AAAA,MAC1D,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBAAkB,SAAkC;AACxD,QAAI;AACJ,QAAI;AACF,gBAAU,MAAMH,SAAQ,OAAO;AAAA,IACjC,SAAS,KAAK;AACZ,UAAIQ,aAAY,GAAG,KAAK,IAAI,SAAS,UAAU;AAC7C,cAAM,IAAIH,qBAAoB,OAAO;AAAA,MACvC;AACA,YAAM;AAAA,IACR;AAEA,QAAI,QAAQ;AAEZ,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAWF,MAAK,SAAS,KAAK;AACpC,YAAM,YAAY,MAAMF,MAAK,QAAQ;AAErC,UAAI,UAAU,OAAO,KAAKG,SAAQ,KAAK,MAAM,SAAS;AAEpD,YAAI;AACF,gBAAM,MAAM,MAAMN,UAAS,UAAU,OAAO;AAC5C,gBAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,gBAAM,YAAY,KAAK,gBAAgB,QAAQ,QAAQ;AACvD,eAAK,SAAS,SAAS;AACvB;AAAA,QACF,SAAS,KAAK;AACZ,eAAK,OAAO,KAAK,EAAE,MAAM,OAAO,OAAO,IAAI,GAAG,kBAAkB,KAAK,aAAa,YAAY;AAAA,QAChG;AAAA,MACF,WAAW,UAAU,YAAY,KAAK,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,WAAW,GAAG,GAAG;AAEtF,cAAM,eAAeK,MAAK,UAAU,eAAe;AACnD,YAAI;AACF,gBAAM,eAAe,MAAMF,MAAK,YAAY;AAC5C,cAAI,CAAC,aAAa,OAAO,EAAG;AAE5B,gBAAM,MAAM,MAAMH,UAAS,cAAc,OAAO;AAChD,gBAAM,SAAS,KAAK,MAAM,GAAG;AAG7B,cAAI,OAAO,OAAO,YAAY,UAAU;AACtC,kBAAM,WAAW,MAAM,KAAK,mBAAmB,UAAU,OAAO,OAAO;AACvE,gBAAI,aAAa,MAAM;AACrB,qBAAO,UAAU;AAAA,YACnB,WACE,CAAC,OAAO,QAAQ,SAAS,IAAI,MAC5B,OAAO,QAAQ,SAAS,KAAK,KAAK,OAAO,QAAQ,SAAS,MAAM,IACjE;AACA,mBAAK,OAAO,KAAK,EAAE,MAAM,OAAO,SAAS,KAAK,MAAM,GAAG,0CAA0C;AAAA,YACnG;AAAA,UACF;AAGA,cAAI,CAAC,OAAO,MAAM;AAChB,mBAAO,OAAO;AAAA,UAChB;AAEA,gBAAM,YAAY,KAAK,gBAAgB,QAAQ,YAAY;AAC3D,eAAK,SAAS,SAAS;AACvB;AAAA,QACF,SAAS,KAAK;AACZ,eAAK,OAAO,KAAK,EAAE,KAAK,OAAO,OAAO,IAAI,GAAG,kBAAkB,KAAK,aAAa,2BAA2B;AAAA,QAC9G;AAAA,MACF;AAAA,IACF;AAGA,UAAM,gBAAgB,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,CAAC;AAC7D,eAAW,SAAS,eAAe;AACjC,YAAM,SAASK,MAAK,SAAS,KAAK;AAClC,UAAI;AACF,cAAM,SAAS,MAAMF,MAAK,MAAM;AAChC,YAAI,OAAO,YAAY,GAAG;AACxB,mBAAS,MAAM,KAAK,kBAAkB,MAAM;AAAA,QAC9C;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,SAAK,OAAO,KAAK,EAAE,OAAO,QAAQ,GAAG,GAAG,KAAK,aAAa,yBAAyB;AACnF,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBU,gBAAgB,MAAe,QAAmB;AAC1D,UAAM,SAAS,KAAK,SAAS,MAAM,MAAM;AACzC,QAAI,CAAC,OAAO,SAAS,CAAC,OAAO,MAAM;AACjC,YAAM,IAAIK;AAAA,QACR,yBAAyB,KAAK,aAAa,OAAO,MAAM;AAAA,QACxD,OAAO,OAAO,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE,QAAQ,EAAE;AAAA,QAC/D,OAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAMA,MAAgB,eAAe,WAA6B;AAC1D,QAAI,CAAC,KAAK,WAAY;AACtB,UAAMJ,OAAM,KAAK,YAAY,EAAE,WAAW,KAAK,CAAC;AAChD,UAAM,WAAWC,MAAK,KAAK,YAAY,GAAG,UAAU,IAAI,OAAO;AAC/D,UAAMJ,WAAU,UAAU,KAAK,UAAU,WAAW,MAAM,CAAC,IAAI,MAAM,OAAO;AAC5E,SAAK,OAAO,MAAM,EAAE,MAAM,UAAU,MAAM,SAAS,GAAG,GAAG,KAAK,aAAa,YAAY;AAAA,EACzF;AAAA,EAEA,MAAgB,gBAAgB,MAA6B;AAC3D,QAAI,CAAC,KAAK,WAAY;AACtB,UAAM,WAAWI,MAAK,KAAK,YAAY,GAAG,IAAI,OAAO;AACrD,QAAI;AACF,YAAM,OAAO,QAAQ;AACrB,WAAK,OAAO,MAAM,EAAE,MAAM,SAAS,GAAG,GAAG,KAAK,aAAa,eAAe;AAAA,IAC5E,SAAS,KAAK;AACZ,UAAIK,aAAY,GAAG,KAAK,IAAI,SAAS,SAAU;AAC/C,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAASA,aAAY,KAA4C;AAC/D,SAAO,eAAe,SAAS,UAAU;AAC3C;;;ADtSO,IAAM,mBAAN,cAA+B,qBAAoC;AAAA,EACrD,gBAAgB;AAAA,EAClB,SAAS,IAAI,eAAe;AAAA,EAC5B;AAAA,EAEjB,YAAY,SAA2B;AACrC,UAAM,mBAAmB;AACzB,SAAK,iBAAiB,SAAS,kBAAkB;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMS,SAAS,UAA+B;AAC/C,QAAI,CAAC,SAAS,MAAM;AAClB,YAAM,IAAIC,uBAAsB,6BAA6B;AAAA,QAC3D,EAAE,MAAM,QAAQ,SAAS,kCAAkC;AAAA,MAC7D,CAAC;AAAA,IACH;AAEA,QAAI,KAAK,WAAW,IAAI,SAAS,IAAI,KAAK,CAAC,KAAK,gBAAgB;AAC9D,YAAM,IAAIA;AAAA,QACR,aAAa,SAAS,IAAI;AAAA,QAC1B,CAAC,EAAE,MAAM,QAAQ,SAAS,4BAA4B,SAAS,IAAI,GAAG,CAAC;AAAA,MACzE;AAAA,IACF;AAEA,UAAM,SAAS,QAAQ;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,MAA6B;AACtC,UAAM,WAAW,KAAK,WAAW,IAAI,IAAI;AACzC,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,sBAAsB,IAAI;AAAA,IACtC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAe,kBAAkB,SAAkC;AACjE,UAAM,YAAY,MAAM,KAAK,OAAO,kBAAkB,OAAO;AAC7D,QAAI,QAAQ;AACZ,eAAW,OAAO,WAAW;AAC3B,UAAI;AACF,aAAK,SAAS,GAAG;AACjB;AAAA,MACF,SAAS,KAAK;AACZ,aAAK,OAAO;AAAA,UACV,EAAE,cAAc,IAAI,MAAM,OAAO,IAAI;AAAA,UACrC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,SAAK,OAAO,KAAK,EAAE,OAAO,QAAQ,GAAG,iCAAiC;AACtE,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,aAAa,WAAoC;AACrD,WAAO,KAAK,kBAAkB,SAAS;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,MAAe,SAAwD;AAC9E,UAAM,SAAS,oBAAoB,UAAU,IAAI;AACjD,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,OAAO,MAAM,OAAO,IAAI,CAAC,WAAW;AAAA,UAC1C,MAAM,MAAM,KAAK,IAAI,MAAM,EAAE,KAAK,GAAG;AAAA,UACrC,SAAS,MAAM;AAAA,UACf,UAAU;AAAA,QACZ,EAAE;AAAA,QACF,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AACA,WAAO,EAAE,OAAO,MAAM,MAAM,gBAAgB,OAAO,IAAI,GAAG,QAAQ,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,EACrF;AAAA,EAEA,MAAM,QAAQ,UAAwC;AACpD,QAAI,CAAC,KAAK,WAAY;AACtB,UAAMC,OAAM,KAAK,YAAY,EAAE,WAAW,KAAK,CAAC;AAChD,UAAM,WAAWC,MAAK,KAAK,YAAY,GAAG,SAAS,IAAI,OAAO;AAC9D,UAAM,EAAE,WAAAC,WAAU,IAAI,MAAM,OAAO,aAAkB;AACrD,UAAMA,WAAU,UAAU,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI,MAAM,OAAO;AAC3E,SAAK,OAAO,MAAM,EAAE,cAAc,SAAS,MAAM,SAAS,GAAG,oBAAoB;AAAA,EACnF;AACF;;;AEpHA,SAAS,aAA6B;AACtC,SAAS,QAAAC,aAAY;AACrB,SAAS,cAAc;AACvB,SAAS,gBAAAC,sBAAoB;AAI7B,IAAMC,WAASC,eAAa,uBAAuB;AAEnD,IAAM,sBAAsB;AAarB,IAAM,sBAAN,MAA0B;AAAA,EAQ/B,YACmB,cACAC,WACjB,SACA;AAHiB;AACA,oBAAAA;AAGjB,SAAK,aAAa,SAAS,cAAc;AAAA,EAC3C;AAAA,EAbQ,UAA4B;AAAA,EACnB;AAAA,EACA,SAAS,IAAI,eAAe;AAAA,EACrC,iBAAiB,oBAAI,IAA2C;AAAA;AAAA,EAEhE,aAAa,oBAAI,IAAoB;AAAA,EAU7C,QAAc;AACZ,QAAI,KAAK,QAAS;AAElB,QAAI;AACF,WAAK,UAAU,MAAM,KAAK,cAAc,EAAE,WAAW,KAAK,GAAG,CAAC,YAAY,aAAa;AACrF,YAAI,CAAC,YAAY,CAAC,SAAS,SAAS,OAAO,EAAG;AAC9C,aAAK,aAAa,QAAQ;AAAA,MAC5B,CAAC;AAED,WAAK,QAAQ,GAAG,SAAS,CAAC,QAAQ;AAChC,QAAAF,SAAO,MAAM,EAAE,OAAO,IAAI,GAAG,oBAAoB;AAAA,MACnD,CAAC;AAED,WAAK,aAAa;AAClB,MAAAA,SAAO,KAAK,EAAE,KAAK,KAAK,aAAa,GAAG,+BAA+B;AAAA,IACzE,SAAS,KAAK;AACZ,MAAAA,SAAO,MAAM,EAAE,OAAO,KAAK,KAAK,KAAK,aAAa,GAAG,8BAA8B;AAAA,IACrF;AAAA,EACF;AAAA,EAEA,OAAa;AACX,QAAI,CAAC,KAAK,QAAS;AACnB,SAAK,QAAQ,MAAM;AACnB,SAAK,UAAU;AACf,eAAW,SAAS,KAAK,eAAe,OAAO,GAAG;AAChD,mBAAa,KAAK;AAAA,IACpB;AACA,SAAK,eAAe,MAAM;AAC1B,IAAAA,SAAO,KAAK,+BAA+B;AAAA,EAC7C;AAAA,EAEA,IAAI,aAAsB;AACxB,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA,EAEQ,eAAqB;AAC3B,eAAW,YAAY,KAAK,SAAS,KAAK,GAAG;AAC3C,YAAM,cAAc,GAAG,SAAS,IAAI;AACpC,WAAK,WAAW,IAAI,aAAa,SAAS,IAAI;AAAA,IAChD;AAAA,EACF;AAAA,EAEQ,aAAa,UAAwB;AAC3C,UAAM,WAAW,KAAK,eAAe,IAAI,QAAQ;AACjD,QAAI,SAAU,cAAa,QAAQ;AAEnC,SAAK,eAAe;AAAA,MAClB;AAAA,MACA,WAAW,MAAM;AACf,aAAK,eAAe,OAAO,QAAQ;AACnC,aAAK,cAAc,QAAQ,EAAE,MAAM,CAAC,QAAQ;AAC1C,UAAAA,SAAO,MAAM,EAAE,UAAU,OAAO,IAAI,GAAG,uCAAuC;AAAA,QAChF,CAAC;AAAA,MACH,GAAG,KAAK,UAAU;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAc,cAAc,UAAiC;AAC3D,UAAM,WAAWG,MAAK,KAAK,cAAc,QAAQ;AAEjD,QAAI,aAAa;AACjB,QAAI;AACF,YAAM,OAAO,QAAQ;AAAA,IACvB,QAAQ;AACN,mBAAa;AAAA,IACf;AAEA,QAAI,CAAC,YAAY;AACf,YAAM,eAAe,KAAK,WAAW,IAAI,QAAQ;AACjD,UAAI,gBAAgB,KAAK,SAAS,IAAI,YAAY,GAAG;AACnD,aAAK,SAAS,WAAW,YAAY;AACrC,aAAK,WAAW,OAAO,QAAQ;AAC/B,QAAAH,SAAO,KAAK,EAAE,cAAc,cAAc,SAAS,GAAG,sCAAsC;AAAA,MAC9F;AACA;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,OAAO,aAAa,QAAQ;AAExD,YAAM,eAAe,KAAK,WAAW,IAAI,QAAQ;AACjD,UAAI,gBAAgB,iBAAiB,SAAS,QAAQ,KAAK,SAAS,IAAI,YAAY,GAAG;AACrF,aAAK,SAAS,WAAW,YAAY;AAAA,MACvC;AAEA,UAAI,KAAK,SAAS,IAAI,SAAS,IAAI,GAAG;AACpC,aAAK,SAAS,WAAW,SAAS,IAAI;AAAA,MACxC;AACA,WAAK,SAAS,SAAS,QAAQ;AAC/B,WAAK,WAAW,IAAI,UAAU,SAAS,IAAI;AAE3C,MAAAA,SAAO,KAAK,EAAE,cAAc,SAAS,MAAM,SAAS,GAAG,eAAe,sBAAsB,yBAAyB;AAAA,IACvH,SAAS,KAAK;AACZ,MAAAA,SAAO,KAAK,EAAE,UAAU,OAAO,IAAI,GAAG,2BAA2B;AAAA,IACnE;AAAA,EACF;AACF;;;ACtIA,SAAS,SAAAI,QAAO,IAAI,UAAAC,SAAQ,SAAS,OAAO,UAAAC,SAAQ,gBAAgB;AACpE,SAAS,QAAAC,cAAY;AACrB,SAAS,cAAAC,mBAAkB;AAE3B;AAAA,EACE;AAAA,EACA,yBAAAC;AAAA,EACA,0BAAAC;AAAA,EACA;AAAA,EACA,gBAAAC;AAAA,OACK;;;ACVP,SAAS,KAAAC,UAAS;AAEX,IAAM,oBAAoBA,GAAE,KAAK;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,mBAAmBA,GAAE,KAAK;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,yBAAyBA,GAAE,KAAK,CAAC,WAAW,UAAU,CAAC;AAE7D,IAAM,wBAAwBA,GAAE,KAAK,CAAC,cAAc,WAAW,CAAC;AAEvE,IAAM,yBAAyBA,GAAE,OAAO,EAAE,IAAI,CAAC;AAE/C,IAAMC,wBAAuBD,GAAE,KAAK;AAAA,EAClC;AAAA,EAAW;AAAA,EAAe;AAAA,EAAQ;AAAA,EAAW;AAC/C,CAAC;AAED,IAAM,6BAA6BA,GAAE,OAAO;AAAA,EAC1C,gBAAgBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC7C,mBAAmBA,GAAE,QAAQ,EAAE,SAAS;AAC1C,CAAC;AAED,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EACnC,SAASA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC9B,0BAA0BA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC/C,SAAS,2BAA2B,SAAS;AAC/C,CAAC;AAED,IAAM,0BAA0BA,GAAE,OAAO;AAAA,EACvC,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACpC,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,KAAKA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAClC,aAAaC,sBAAqB,SAAS;AAAA,EAC3C,SAAS,oBAAoB,SAAS;AAAA,EACtC,uBAAuBD,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AACtD,CAAC;AAED,IAAM,yBAAyBA,GAAE,KAAK,CAAC,UAAU,aAAa,QAAQ,CAAC;AAEvE,IAAM,4BAA4BA,GAAE,OAAO;AAAA,EACzC,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,UAAU,uBAAuB,SAAS,EAAE,QAAQ,QAAQ;AAAA,EAC5D,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,QAAQA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAAE,SAAS;AACrD,CAAC;AAEM,IAAM,0BAA0BA,GAAE,OAAO;AAAA,EAC9C,IAAIA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACpB,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,cAAcA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC9B,iBAAiBA,GAAE,OAAO,EAAE,MAAM,iBAAiB;AAAA,EACnD,aAAa,uBAAuB,QAAQ,QAAQ;AAAA,EACpD,eAAeA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EAC1D,gBAAgB,0BAA0B,SAAS;AAAA,EACnD,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,iBAAiB,sBAAsB,QAAQ,YAAY;AAAA,EAC3D,kBAAkB,uBAAuB,QAAQ,SAAS;AAAA,EAC1D,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,KAAKA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC1C,sBAAsB,wBAAwB,SAAS;AAAA,EACvD,UAAUA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,EAAE,SAAS;AACtD,CAAC;;;AC3ED,SAAS,YAAAE,WAAU,aAAAC,YAAW,QAAQ,WAAAC,UAAS,QAAAC,OAAM,SAAAC,cAAa;AAClE,SAAS,QAAAC,OAAM,eAAe;AAC9B,SAAS,cAAAC,mBAAkB;AAE3B,SAAS,8BAA8B;AAEvC,SAAS,gBAAAC,sBAAoB;AAG7B,IAAMC,WAASD,eAAa,kBAAkB;AAE9C,IAAM,gBAAgB;AAEf,SAAS,aAAa,cAA8B;AACzD,SAAOE,MAAK,cAAc,aAAa;AACzC;AAGA,eAAsB,iBAAiB,cAAkD;AACvF,QAAM,WAAW,aAAa,YAAY;AAC1C,MAAI;AACJ,MAAI;AACF,UAAM,MAAMC,UAAS,UAAU,OAAO;AAAA,EACxC,SAAS,KAAK;AACZ,QAAIC,aAAY,GAAG,KAAK,IAAI,SAAS,UAAU;AAC7C,YAAM,IAAI;AAAA,QACR;AAAA,QACA,GAAG,aAAa;AAAA,MAClB;AAAA,IACF;AACA,UAAM;AAAA,EACR;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,QAAQ;AACN,UAAM,IAAI,uBAAuB,cAAc,GAAG,aAAa,wBAAwB;AAAA,EACzF;AAEA,QAAM,SAAS,wBAAwB,UAAU,MAAM;AACvD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI;AAAA,MACR;AAAA,MACA,GAAG,aAAa,8BAA8B,OAAO,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,IACpG;AAAA,EACF;AAEA,SAAO,OAAO;AAChB;AAGA,eAAsB,kBACpB,cACA,MACe;AACf,QAAM,WAAW,aAAa,YAAY;AAC1C,QAAM,UAAU,GAAG,QAAQ,IAAIC,YAAW,EAAE,MAAM,GAAG,CAAC,CAAC;AACvD,QAAM,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI;AAEhD,QAAMC,OAAM,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAClD,QAAMC,WAAU,SAAS,SAAS,OAAO;AACzC,QAAM,OAAO,SAAS,QAAQ;AAChC;AAGA,eAAsB,mBACpB,cACA,OAC4B;AAC5B,QAAM,WAAW,MAAM,iBAAiB,YAAY;AACpD,QAAM,UAA6B;AAAA,IACjC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACA,QAAM,kBAAkB,cAAc,OAAO;AAC7C,SAAO;AACT;AASA,eAAsB,cACpB,kBACAC,WAC8D;AAC9D,QAAM,QAA6B,CAAC;AACpC,QAAM,YAAsB,CAAC;AAC7B,QAAM,aAAa,oBAAI,IAAY;AAEnC,MAAIA,WAAU;AACZ,eAAW,SAASA,UAAS,KAAK,GAAG;AACnC,UAAI,MAAM,WAAW,WAAY;AACjC,UAAI;AACF,cAAM,KAAK,MAAMC,MAAK,MAAM,aAAa;AACzC,YAAI,CAAC,GAAG,YAAY,GAAG;AACrB,oBAAU,KAAK,MAAM,IAAI;AACzB;AAAA,QACF;AACA,cAAM,OAAO,MAAM,iBAAiB,MAAM,aAAa;AACvD,cAAM,KAAK,IAAI;AACf,mBAAW,IAAI,MAAM,IAAI;AAAA,MAC3B,SAAS,KAAK;AACZ,QAAAR,SAAO,KAAK,EAAE,MAAM,MAAM,MAAM,MAAM,MAAM,eAAe,OAAO,IAAI,GAAG,yCAAyC;AAClH,kBAAU,KAAK,MAAM,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,cAAU,MAAMS,SAAQ,gBAAgB;AAAA,EAC1C,SAAS,KAAK;AACZ,QAAIN,aAAY,GAAG,KAAK,IAAI,SAAS,UAAU;AAC7C,aAAO,EAAE,OAAO,UAAU;AAAA,IAC5B;AACA,UAAM;AAAA,EACR;AAEA,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,WAAW,GAAG,EAAG;AAC3B,UAAM,UAAUF,MAAK,kBAAkB,KAAK;AAC5C,UAAM,UAAU,MAAMO,MAAK,OAAO,EAAE,MAAM,MAAM,IAAI;AACpD,QAAI,CAAC,SAAS,YAAY,EAAG;AAE7B,QAAI;AACF,YAAM,OAAO,MAAM,iBAAiB,OAAO;AAC3C,UAAI,WAAW,IAAI,KAAK,IAAI,EAAG;AAC/B,YAAM,KAAK,IAAI;AACf,iBAAW,IAAI,KAAK,IAAI;AAAA,IAC1B,SAAS,KAAK;AACZ,MAAAR,SAAO,KAAK,EAAE,KAAK,OAAO,OAAO,IAAI,GAAG,8BAA8B;AACtE,gBAAU,KAAK,KAAK;AAAA,IACtB;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,UAAU;AAC5B;AAEA,SAASG,aAAY,KAA4C;AAC/D,SAAO,eAAe,SAAS,UAAU;AAC3C;;;AClJA,SAAS,YAAAO,WAAU,aAAAC,YAAW,UAAAC,SAAQ,WAAAC,UAAS,QAAAC,OAAM,SAAAC,cAAa;AAClE,SAAS,QAAAC,OAAM,WAAAC,UAAS,WAAAC,UAAS,gBAAgB;AACjD,SAAS,cAAAC,mBAAkB;AAE3B,SAAS,0BAAAC,+BAA8B;AAkBvC,IAAM,mBAAmB;AAEzB,SAAS,wBAAwB,QAAsE;AACrG,MAAI,WAAW,aAAa,WAAW,WAAY,QAAO;AAC1D,SAAO;AACT;AAEO,IAAM,mBAAN,MAA0D;AAAA,EAM/D,YACmB,cACA,qBACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EARK,OAA6B;AAAA,IACnC,SAAS;AAAA,IACT,WAAW,CAAC;AAAA,EACd;AAAA,EAOA,MAAM,OAAsB;AAC1B,QAAI;AACF,YAAM,MAAM,MAAMC,UAAS,KAAK,cAAc,OAAO;AACrD,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UACE,OAAO,WAAW,YAClB,WAAW,QACX,aAAa,UACZ,OAAgC,YAAY,KAC7C,eAAe,UACf,OAAQ,OAAgC,cAAc,UACtD;AACA,aAAK,OAAO;AAAA,MACd;AAAA,IACF,SAAS,KAAK;AACZ,UAAIC,aAAY,GAAG,KAAK,IAAI,SAAS,UAAU;AAC7C,aAAK,OAAO,EAAE,SAAS,kBAAkB,WAAW,CAAC,EAAE;AACvD;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,OAAsB;AAC1B,UAAM,UAAU,GAAG,KAAK,YAAY,IAAIC,YAAW,EAAE,MAAM,GAAG,CAAC,CAAC;AAChE,UAAM,UAAU,KAAK,UAAU,KAAK,MAAM,MAAM,CAAC,IAAI;AACrD,UAAMC,OAAMC,SAAQ,KAAK,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AAC3D,UAAMC,WAAU,SAAS,SAAS,OAAO;AACzC,UAAMC,QAAO,SAAS,KAAK,YAAY;AAAA,EACzC;AAAA,EAEA,SAAS,OAAoC;AAC3C,SAAK,KAAK,UAAU,MAAM,IAAI,IAAI;AAAA,EACpC;AAAA,EAEA,WAAW,MAAuB;AAChC,QAAI,EAAE,QAAQ,KAAK,KAAK,WAAY,QAAO;AAC3C,WAAO,KAAK,KAAK,UAAU,IAAI;AAC/B,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,MAAiD;AACnD,WAAO,KAAK,KAAK,UAAU,IAAI;AAAA,EACjC;AAAA,EAEA,OAAgC;AAC9B,WAAO,OAAO,OAAO,KAAK,KAAK,SAAS;AAAA,EAC1C;AAAA,EAEA,IAAI,MAAuB;AACzB,WAAO,QAAQ,KAAK,KAAK;AAAA,EAC3B;AAAA,EAEA,aAAa,MAAc,QAA+C;AACxE,UAAM,QAAQ,KAAK,KAAK,UAAU,IAAI;AACtC,QAAI,OAAO;AACT,YAAM,SAAS;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,eAAuB,UAAmD;AACpF,UAAM,eAAeC,SAAQ,aAAa;AAC1C,UAAM,OAAO,MAAM,iBAAiB,YAAY;AAEhD,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,cAAc;AACpC,YAAM,IAAIC;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAAO,YAAY,KAAK;AAC9B,QAAI,KAAK,IAAI,IAAI,GAAG;AAClB,YAAM,IAAI,MAAM,kBAAkB,IAAI,8BAA8B;AAAA,IACtE;AAEA,UAAM,MAAM,SAASD,SAAQ,KAAK,mBAAmB,GAAG,YAAY;AACpE,UAAM,YAAY,CAAC,IAAI,WAAW,IAAI;AACtC,UAAM,WAAmC,YAAY,YAAY;AAEjE,UAAM,QAA+B;AAAA,MACnC;AAAA,MACA,UAAU,KAAK;AAAA,MACf,eAAe;AAAA,MACf;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,QAAQ,wBAAwB,KAAK,MAAM;AAAA,IAC7C;AAEA,SAAK,SAAS,KAAK;AACnB,UAAM,KAAK,KAAK;AAChB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAgE;AACpE,UAAM,WAAqB,CAAC;AAC5B,UAAM,UAAoB,CAAC;AAE3B,eAAW,SAAS,KAAK,KAAK,GAAG;AAC/B,UAAI;AACF,cAAM,KAAK,MAAME,MAAK,MAAM,aAAa;AACzC,YAAI,CAAC,GAAG,YAAY,GAAG;AACrB,eAAK,aAAa,MAAM,MAAM,UAAU;AACxC,mBAAS,KAAK,MAAM,IAAI;AAAA,QAC1B;AAAA,MACF,QAAQ;AACN,aAAK,aAAa,MAAM,MAAM,UAAU;AACxC,iBAAS,KAAK,MAAM,IAAI;AAAA,MAC1B;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,uBAAiB,MAAMC,SAAQ,KAAK,mBAAmB;AAAA,IACzD,SAAS,KAAK;AACZ,UAAIT,aAAY,GAAG,KAAK,IAAI,SAAS,UAAU;AAC7C,yBAAiB,CAAC;AAAA,MACpB,OAAO;AACL,cAAM;AAAA,MACR;AAAA,IACF;AAEA,eAAW,SAAS,gBAAgB;AAClC,UAAI,MAAM,WAAW,GAAG,EAAG;AAC3B,YAAM,UAAUU,MAAK,KAAK,qBAAqB,KAAK;AACpD,YAAM,UAAU,MAAMF,MAAK,OAAO,EAAE,MAAM,MAAM,IAAI;AACpD,UAAI,CAAC,SAAS,YAAY,EAAG;AAE7B,YAAM,aAAa,KAAK,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,kBAAkB,OAAO;AACtE,UAAI,WAAY;AAEhB,UAAI;AACF,cAAM,eAAe,MAAM,KAAK,MAAM,OAAO;AAC7C,gBAAQ,KAAK,aAAa,IAAI;AAAA,MAChC,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,UAAM,KAAK,KAAK;AAChB,WAAO,EAAE,UAAU,QAAQ;AAAA,EAC7B;AACF;AAEA,SAASR,aAAY,KAA4C;AAC/D,SAAO,eAAe,SAAS,UAAU;AAC3C;;;AC1LA,SAAS,gBAAAW,sBAAoB;AAY7B,IAAMC,WAASD,eAAa,yBAAyB;AAErD,IAAM,0BAA0B;AAChC,IAAM,2BAA2B;AAe1B,IAAM,yBAAN,MAA6B;AAAA,EAKlC,YACmBE,WACjB,SACA;AAFiB,oBAAAA;AAGjB,SAAK,gBAAgB,SAAS,wBAAwB;AACtD,SAAK,iBAAiB,SAAS,kBAAkB;AACjD,SAAK,aAAa,SAAS;AAAA,EAC7B;AAAA,EAXiB;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAejB,OAAO,OAAkD;AACvD,WAAO,MAAM,IAAI,CAAC,SAAS;AACzB,YAAM,WAAW,KAAK,SAAS,IAAI,KAAK,IAAI;AAC5C,UAAI,CAAC,UAAU;AACb,eAAO,EAAE,OAAO,OAAO,QAAQ,CAAC,EAAE,OAAO,QAAQ,SAAS,uBAAuB,KAAK,IAAI,IAAI,CAAC,EAAE;AAAA,MACnG;AACA,aAAO,SAAS,SAAS,KAAK,UAAU,CAAC,CAAC;AAAA,IAC5C,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,OAA0B,SAA+C;AACjF,UAAM,UAAU,oBAAI,IAAqC;AACzD,UAAM,SAA8B,CAAC;AACrC,UAAM,WAA2B,CAAC;AAClC,UAAM,gBAAgB,KAAK,IAAI;AAE/B,IAAAD,SAAO,KAAK,EAAE,YAAY,MAAM,OAAO,GAAG,kCAAkC;AAE5E,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC;AACpB,UAAI,CAAC,KAAM;AAEX,UAAI,KAAK,IAAI,IAAI,gBAAgB,KAAK,gBAAgB;AACpD,cAAM,MAAM,IAAI,MAAM,oCAAoC,KAAK,cAAc,KAAK;AAClF,eAAO,KAAK,EAAE,WAAW,GAAG,UAAU,KAAK,MAAM,OAAO,IAAI,CAAC;AAC7D,QAAAA,SAAO,MAAM,EAAE,WAAW,GAAG,UAAU,KAAK,KAAK,GAAG,2BAA2B;AAC/E,cAAM,KAAK,SAAS,UAAU,SAAS,GAAG;AAC1C,eAAO,EAAE,SAAS,OAAO,eAAe,GAAG,YAAY,MAAM,QAAQ,QAAQ,QAAQ;AAAA,MACvF;AAEA,YAAM,WAAW,KAAK,SAAS,IAAI,KAAK,IAAI;AAC5C,UAAI,CAAC,UAAU;AACb,cAAM,MAAM,IAAI,MAAM,+BAA+B,KAAK,IAAI,GAAG;AACjE,eAAO,KAAK,EAAE,WAAW,GAAG,UAAU,KAAK,MAAM,OAAO,IAAI,CAAC;AAC7D,cAAM,KAAK,SAAS,UAAU,SAAS,GAAG;AAC1C,eAAO,EAAE,SAAS,OAAO,eAAe,GAAG,YAAY,MAAM,QAAQ,QAAQ,QAAQ;AAAA,MACvF;AAEA,WAAK,aAAa,GAAG,MAAM,QAAQ,KAAK,IAAI;AAC5C,MAAAA,SAAO,MAAM,EAAE,WAAW,GAAG,UAAU,KAAK,KAAK,GAAG,gBAAgB;AAEpE,UAAI;AACF,cAAM,SAAS,MAAM,KAAK,mBAAmB,UAAU,SAAS,KAAK,UAAU,CAAC,CAAC;AAEjF,YAAI,CAAC,OAAO,SAAS;AACnB,gBAAM,MAAM,IAAI,MAAM,OAAO,WAAW,SAAS,KAAK,IAAI,oBAAoB;AAC9E,iBAAO,KAAK,EAAE,WAAW,GAAG,UAAU,KAAK,MAAM,OAAO,IAAI,CAAC;AAC7D,mBAAS,KAAK,EAAE,OAAO,GAAG,UAAU,QAAQ,KAAK,UAAU,CAAC,EAAE,CAAC;AAC/D,gBAAM,KAAK,SAAS,UAAU,SAAS,GAAG;AAC1C,iBAAO,EAAE,SAAS,OAAO,eAAe,IAAI,GAAG,YAAY,MAAM,QAAQ,QAAQ,QAAQ;AAAA,QAC3F;AAEA,iBAAS,KAAK,EAAE,OAAO,GAAG,UAAU,QAAQ,KAAK,UAAU,CAAC,EAAE,CAAC;AAC/D,YAAI,OAAO,QAAQ;AACjB,kBAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,MAAM;AAAA,QACrD;AACA,YAAI,OAAO,SAAS;AAClB,UAAAA,SAAO,KAAK,EAAE,WAAW,GAAG,UAAU,KAAK,KAAK,GAAG,OAAO,OAAO;AAAA,QACnE;AAAA,MACF,SAAS,KAAK;AACZ,cAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,eAAO,KAAK,EAAE,WAAW,GAAG,UAAU,KAAK,MAAM,MAAM,CAAC;AACxD,QAAAA,SAAO,MAAM,EAAE,WAAW,GAAG,UAAU,KAAK,MAAM,MAAM,GAAG,uBAAuB;AAClF,iBAAS,KAAK,EAAE,OAAO,GAAG,UAAU,QAAQ,KAAK,UAAU,CAAC,EAAE,CAAC;AAC/D,cAAM,KAAK,SAAS,UAAU,SAAS,KAAK;AAC5C,eAAO,EAAE,SAAS,OAAO,eAAe,IAAI,GAAG,YAAY,MAAM,QAAQ,QAAQ,QAAQ;AAAA,MAC3F;AAAA,IACF;AAEA,IAAAA,SAAO,KAAK,EAAE,eAAe,MAAM,QAAQ,WAAW,KAAK,IAAI,IAAI,cAAc,GAAG,iCAAiC;AACrH,WAAO,EAAE,SAAS,MAAM,eAAe,MAAM,QAAQ,YAAY,MAAM,QAAQ,QAAQ,QAAQ;AAAA,EACjG;AAAA,EAEA,MAAc,mBACZ,UACA,SACA,QACuC;AACvC,WAAO,IAAI,QAAQ,CAACE,UAAS,WAAW;AACtC,YAAM,QAAQ,WAAW,MAAM;AAC7B,eAAO,IAAI,MAAM,SAAS,SAAS,IAAI,qBAAqB,KAAK,aAAa,IAAI,CAAC;AAAA,MACrF,GAAG,KAAK,aAAa;AAErB,eAAS,QAAQ,SAAS,MAAM,EAAE;AAAA,QAChC,CAAC,WAAW;AAAE,uBAAa,KAAK;AAAG,UAAAA,SAAQ,MAAM;AAAA,QAAG;AAAA,QACpD,CAAC,QAAQ;AAAE,uBAAa,KAAK;AAAG,iBAAO,GAAG;AAAA,QAAG;AAAA,MAC/C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,SAAS,UAA0B,SAAsB,cAAoC;AACzG,QAAI,SAAS,WAAW,EAAG;AAC3B,IAAAF,SAAO,KAAK,EAAE,iBAAiB,SAAS,OAAO,GAAG,6BAA6B;AAE/E,aAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC7C,YAAM,QAAQ,SAAS,CAAC;AACxB,UAAI,CAAC,MAAO;AACZ,YAAM,EAAE,UAAU,QAAQ,MAAM,IAAI;AACpC,UAAI,CAAC,SAAS,SAAU;AAExB,UAAI;AACF,cAAM,SAAS,SAAS,SAAS,QAAQ,YAAY;AACrD,QAAAA,SAAO,MAAM,EAAE,WAAW,OAAO,UAAU,SAAS,KAAK,GAAG,kBAAkB;AAAA,MAChF,SAAS,aAAa;AACpB,QAAAA,SAAO;AAAA,UACL,EAAE,WAAW,OAAO,UAAU,SAAS,MAAM,OAAO,YAAY;AAAA,UAChE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AJ9IA,IAAMG,WAASC,eAAa,mBAAmB;AAqBxC,IAAM,mBAAN,MAAuB;AAAA,EAI5B,YACmB,kBACA,kBACA,SACjB;AAHiB;AACA;AACA;AAEjB,SAAK,UAAU,IAAI,iBAAiB,SAAS,cAAc;AAC3D,QAAI,SAAS,cAAc;AACzB,WAAK,WAAW,IAAI,uBAAuB,QAAQ,YAAY;AAAA,IACjE;AAAA,EACF;AAAA,EAZiB;AAAA,EACA;AAAA,EAajB,IAAI,mBAAqC;AACvC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,eACJ,MACA,cACA,WAC4B;AAC5B,UAAM,WAAW,KAAK,iBAAiB,WAAW,YAAY;AAC9D,UAAM,gBAAgB,WAAW;AACjC,UAAM,eAAe,iBAAiBC,OAAK,KAAK,kBAAkB,IAAI;AACtE,UAAM,iBAAiB,WAAW,mBAAmB;AAErD,UAAM,SAAS,MAAM,UAAU,YAAY;AAC3C,QAAI,QAAQ;AACV,cAAQ,gBAAgB;AAAA,QACtB,KAAK;AACH,gBAAM,IAAIC;AAAA,YACR,uBAAuB,IAAI;AAAA,YAC3B,CAAC,EAAE,MAAM,QAAQ,SAAS,6BAA6B,YAAY,GAAG,CAAC;AAAA,UACzE;AAAA,QACF,KAAK;AACH,gBAAM,GAAG,cAAc,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACvD,UAAAH,SAAO,KAAK,EAAE,aAAa,GAAG,wCAAwC;AACtE;AAAA,QACF,KAAK;AACH,UAAAA,SAAO,KAAK,EAAE,aAAa,GAAG,iCAAiC;AAC/D;AAAA,MACJ;AAAA,IACF;AAEA,QAAI,eAAe;AACjB,YAAM,WAAWE,OAAK,KAAK,kBAAkB,IAAI;AACjD,UAAI,MAAM,YAAY,QAAQ,GAAG;AAC/B,cAAM,IAAIC;AAAA,UACR,0BAA0B,IAAI;AAAA,UAC9B,CAAC,EAAE,MAAM,QAAQ,SAAS,yBAAyB,QAAQ,GAAG,CAAC;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAEA,UAAM,uBAAuB,mBAAmB,YAAY,CAAC;AAE7D,QAAI;AACF,YAAMC,OAAM,cAAc,EAAE,WAAW,KAAK,CAAC;AAE7C,YAAM,mBAAmB,WAAW,eAAe,SAAS;AAC5D,YAAM,KAAK,QAAQ;AAAA,QACjB;AAAA,QACA,SAAS;AAAA,QACT,SAAS,QAAQ;AAAA,QACjB;AAAA,MACF;AAEA,UAAI,KAAK,YAAY,SAAS,aAAa,OAAO,QAAQ;AACxD,cAAM,cAA2B;AAAA,UAC/B;AAAA,UACA,cAAc,EAAE,MAAM,cAAc,SAAS,KAAK;AAAA,UAClD;AAAA,UACA,QAAAJ;AAAA,UACA,OAAO,oBAAI,IAAI;AAAA,QACjB;AACA,cAAM,iBAAiB,MAAM,KAAK,SAAS,IAAI,SAAS,YAAY,OAAO,WAAW;AACtF,YAAI,CAAC,eAAe,SAAS;AAC3B,gBAAM,aAAa,eAAe,OAAO,CAAC;AAC1C,gBAAM,IAAI;AAAA,YACR;AAAA,YACA,YAAY,SAAS,IAAI,MAAM,6BAA6B;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AAEA,YAAM,uBAAuB,mBAAmB,gBAAgB;AAEhE,YAAM,mBAAmB,sBAAsB,SAAS,QAAQ;AAEhE,YAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,YAAM,aAAa,WAAW,cAAc,KAAK,SAAS,qBAAqB;AAC/E,YAAM,gBAAiC,eAAe,aAAa,cAAc;AACjF,YAAM,OAA0B;AAAA,QAC9B,IAAIK,YAAW;AAAA,QACf;AAAA,QACA,cAAc,SAAS;AAAA,QACvB,iBAAiB,SAAS;AAAA,QAC1B,aAAa,SAAS,QAAQ;AAAA,QAC9B,eAAe,SAAS,QAAQ,SAAS,EAAE,GAAG,SAAS,QAAQ,OAAO,IAAI;AAAA,QAC1E,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR;AAAA,QACA,iBAAiB,WAAW,mBAAmB;AAAA,QAC/C,kBAAkB;AAAA,QAClB,WAAW;AAAA,QACX,WAAW;AAAA,QACX;AAAA,QACA,UAAU,WAAW;AAAA,MACvB;AAEA,YAAM,kBAAkB,cAAc,IAAI;AAE1C,UAAI,eAAe;AACjB,cAAM,WAAW,QAAQ,aAAa,UAAU,aAAa;AAC7D,cAAM,QAAQ,cAAcH,OAAK,KAAK,kBAAkB,IAAI,GAAG,QAAQ;AAAA,MACzE;AAEA,MAAAF,SAAO,KAAK,EAAE,MAAM,cAAc,cAAc,eAAe,CAAC,CAAC,cAAc,GAAG,wBAAwB;AAC1G,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,UAAI,sBAAsB;AACxB,cAAM,GAAG,cAAc,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AACvE,QAAAA,SAAO,MAAM,EAAE,aAAa,GAAG,4CAA4C;AAAA,MAC7E;AACA,UAAI,eAAe,aAAa;AAC9B,cAAM;AAAA,MACR;AACA,YAAM,IAAI,mBAAmB,cAAc,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;AAAA,IAChG;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,qBACJ,MACA,cACA,WACwD;AACxD,UAAM,eAAeE,OAAK,KAAK,kBAAkB,IAAI;AAErD,QAAI,MAAM,UAAU,YAAY,GAAG;AACjC,UAAI;AACF,cAAMI,QAAO,MAAM,iBAAiB,YAAY;AAChD,QAAAN,SAAO,MAAM,EAAE,KAAK,GAAG,yBAAyB;AAChD,eAAO,EAAE,MAAAM,OAAM,SAAS,MAAM;AAAA,MAChC,SAAS,KAAK;AACZ,YAAI,eAAeC,yBAAwB;AACzC,gBAAM;AAAA,QACR;AACA,cAAM,IAAIA,wBAAuB,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MACzF;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,KAAK,eAAe,MAAM,cAAc,SAAS;AACpE,WAAO,EAAE,MAAM,SAAS,KAAK;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,gBAAgB,MAA6B;AACjD,UAAM,YAAYL,OAAK,KAAK,kBAAkB,IAAI;AAClD,QAAI,CAAE,MAAM,YAAY,SAAS,GAAI;AACnC,MAAAF,SAAO,KAAK,EAAE,KAAK,GAAG,kDAAkD;AACxE;AAAA,IACF;AAEA,QAAI,MAAM,UAAU,SAAS,GAAG;AAC9B,YAAM,YAAY,MAAM,SAAS,SAAS;AAC1C,UAAI;AACF,cAAMQ,QAAON,OAAK,WAAW,cAAc,CAAC;AAAA,MAC9C,QAAQ;AAAA,MAER;AACA,YAAM,GAAG,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACpD,MAAAF,SAAO,KAAK,EAAE,MAAM,UAAU,GAAG,uCAAuC;AAAA,IAC1E,OAAO;AACL,YAAM,GAAG,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACpD,MAAAA,SAAO,KAAK,EAAE,KAAK,GAAG,0BAA0B;AAAA,IAClD;AAAA,EACF;AACF;AAOA,SAAS,sBAAsB,kBAAyE;AACtG,MAAI,kBAAkB;AACpB,QAAI,iBAAiB,SAAU,QAAO;AACtC,UAAM,OAAO,sBAAsB,IAAI,iBAAiB,IAAI;AAC5D,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU,MAAM,YAAY;AAAA,IAC9B;AAAA,EACF;AAEA,QAAM,cAAc,sBAAsB,WAAW;AACrD,MAAI,CAAC,YAAa,QAAO;AAEzB,SAAO;AAAA,IACL,MAAM,YAAY;AAAA,IAClB,UAAU,YAAY;AAAA,IACtB,SAAS,YAAY;AAAA,EACvB;AACF;AAEA,eAAe,UAAU,MAAgC;AACvD,MAAI;AACF,UAAMS,QAAO,IAAI;AACjB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,eAAe,YAAY,MAAgC;AACzD,MAAI;AACF,UAAM,MAAM,IAAI;AAChB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,UAAU,MAAgC;AACvD,MAAI;AACF,UAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,WAAO,MAAM,eAAe;AAAA,EAC9B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AKxSA,SAAS,aAAAC,YAAW,SAAAC,cAAa;AACjC,SAAS,QAAAC,cAAY;AAGrB,SAAS,gBAAAC,sBAAoB;AAM7B,IAAMC,WAASD,eAAa,sBAAsB;AAGlD,IAAM,qBAA6C;AAAA,EACjD,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,IAAI;AAAA,EACJ,QAAQ;AACV;AA4BO,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YAA6B,UAA2B;AAA3B;AAAA,EAA4B;AAAA,EAEzD,MAAM,YACJ,cACA,eACA,cAAgC,UACjB;AACf,UAAM,YAAY,mBAAmB,WAAW,KAAK;AACrD,UAAM,QAAyB,CAAC;AAEhC,QAAI,cAAc,UAAU,cAAc,OAAO,SAAS,GAAG;AAC3D,YAAM,KAAK,KAAK,kBAAkB,cAAc,cAAc,MAAM,CAAC;AAAA,IACvE;AAEA,QAAI,cAAc,cAAc,cAAc,WAAW,SAAS,GAAG;AACnE,YAAM,KAAK,KAAK,sBAAsB,cAAc,cAAc,YAAY,SAAS,CAAC;AAExF,UAAI,gBAAgB,eAAe;AACjC,cAAM,KAAK,KAAK,6BAA6B,cAAc,cAAc,YAAY,SAAS,CAAC;AAAA,MACjG;AAAA,IACF;AAEA,QAAI,cAAc,UAAU;AAC1B,YAAM,KAAK,KAAK,oBAAoB,cAAc,cAAc,QAAQ,CAAC;AAAA,IAC3E;AAEA,QAAI,cAAc,WAAW,cAAc,QAAQ,SAAS,GAAG;AAC7D,YAAM,KAAK,KAAK,mBAAmB,cAAc,cAAc,OAAO,CAAC;AAAA,IACzE;AAEA,UAAM,QAAQ,IAAI,KAAK;AACvB,IAAAC,SAAO,MAAM,EAAE,cAAc,aAAa,UAAU,GAAG,6BAA6B;AAAA,EACtF;AAAA,EAEA,MAAc,kBAAkB,cAAsB,YAAqC;AACzF,QAAI;AACJ,QAAI,KAAK,UAAU,QAAQ;AACzB,YAAM,WAAW,KAAK,SAAS,OAAO,QAAQ,UAAU;AACxD,gBAAU,KAAK,SAAS,OAAO,aAAa,QAAQ;AAAA,IACtD,OAAO;AACL,gBAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA,GAAG,WAAW,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AAAA,QACjC;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AACA,UAAMJ,WAAUE,OAAK,cAAc,WAAW,GAAG,SAAS,OAAO;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,sBACZ,cACA,SACA,eACe;AACf,UAAM,YAAYA,OAAK,cAAc,aAAa;AAClD,UAAMD,OAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAE1C,UAAM,YAA+F,CAAC;AACtG,eAAW,UAAU,SAAS;AAC5B,gBAAU,OAAO,IAAI,IAAI;AAAA,QACvB,SAAS,OAAO;AAAA,QAChB,MAAM,OAAO,QAAQ,CAAC;AAAA,QACtB,GAAI,OAAO,OAAO,OAAO,KAAK,OAAO,GAAG,EAAE,SAAS,IAAI,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC;AAAA,MAChF;AAAA,IACF;AAEA,UAAM,SAAS,EAAE,YAAY,UAAU;AACvC,UAAMD;AAAA,MACJE,OAAK,WAAW,UAAU;AAAA,MAC1B,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,6BACZ,cACA,SACA,eACe;AACf,UAAM,YAAYA,OAAK,cAAc,aAAa;AAClD,UAAMD,OAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAE1C,UAAM,eAAyB;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,eAAW,UAAU,SAAS;AAC5B,mBAAa,KAAK,QAAQ,OAAO,IAAI,EAAE;AAAA,IACzC;AAEA,UAAM,WAAW;AAAA,MACf,aAAa;AAAA,QACX,OAAO;AAAA,QACP,MAAM,CAAC;AAAA,MACT;AAAA,IACF;AACA,UAAMD;AAAA,MACJE,OAAK,WAAW,qBAAqB;AAAA,MACrC,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,oBAAoB,cAAsB,cAAqC;AAC3F,UAAM,aAAaA,OAAK,cAAc,UAAU;AAChD,UAAMD,OAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAE3C,QAAI;AACJ,QAAI,KAAK,UAAU,WAAW;AAC5B,YAAM,WAAW,KAAK,SAAS,UAAU,QAAQ,CAAC,YAAY,CAAC;AAC/D,YAAM,WAAW,SAAS,CAAC;AAC3B,gBAAU,WACN,KAAK,SAAS,UAAU,eAAe,QAAQ,IAC/C,eAAe,YAAY;AAAA;AAAA,cAAmB,YAAY;AAAA;AAAA,IAChE,OAAO;AACL,gBAAU;AAAA,QACR,eAAe,YAAY;AAAA,QAC3B;AAAA,QACA,eAAe,YAAY;AAAA,QAC3B;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AACA,UAAMD,WAAUE,OAAK,YAAY,aAAa,GAAG,SAAS,OAAO;AAAA,EACnE;AAAA,EAEA,MAAc,mBAAmB,cAAsB,aAAsC;AAC3F,UAAM,aAAaA,OAAK,cAAc,SAAS;AAC/C,UAAMD,OAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAE3C,QAAI;AACJ,QAAI,KAAK,UAAU,SAAS;AAC1B,YAAM,WAAW,KAAK,SAAS,QAAQ,QAAQ,WAAW;AAC1D,gBAAU,KAAK,SAAS,QAAQ,cAAc,QAAQ;AAAA,IACxD,OAAO;AACL,gBAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA,GAAG,YAAY,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AAAA,QAClC;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AACA,UAAMD,WAAUE,OAAK,YAAY,WAAW,GAAG,SAAS,OAAO;AAAA,EACjE;AACF;;;ACvMO,IAAe,0BAAf,MAAuC;AAY9C;;;AClBA,SAAS,gBAAAG,sBAAoB;AAG7B,IAAMC,WAASD,eAAa,eAAe;AAMpC,IAAM,eAAN,MAAmB;AAAA,EACP,YAAY,oBAAI,IAAqC;AAAA,EAEtE,SAAS,UAAyC;AAChD,QAAI,KAAK,UAAU,IAAI,SAAS,IAAI,GAAG;AACrC,MAAAC,SAAO,KAAK,EAAE,MAAM,SAAS,KAAK,GAAG,oCAAoC;AAAA,IAC3E;AACA,SAAK,UAAU,IAAI,SAAS,MAAM,QAAQ;AAC1C,IAAAA,SAAO,MAAM,EAAE,MAAM,SAAS,KAAK,GAAG,0BAA0B;AAAA,EAClE;AAAA,EAEA,IAAI,MAAmD;AACrD,WAAO,KAAK,UAAU,IAAI,IAAI;AAAA,EAChC;AAAA,EAEA,WAAW,MAAuC;AAChD,UAAM,WAAW,KAAK,UAAU,IAAI,IAAI;AACxC,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,0CAA0C,IAAI,GAAG;AAAA,IACnE;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,MAAuB;AACzB,WAAO,KAAK,UAAU,IAAI,IAAI;AAAA,EAChC;AAAA,EAEA,YAAsB;AACpB,WAAO,CAAC,GAAG,KAAK,UAAU,KAAK,CAAC;AAAA,EAClC;AACF;;;ACvCA,SAAS,SAAAC,SAAO,MAAAC,WAAU;AAC1B,SAAS,QAAAC,QAAM,kBAAkB;AAY1B,IAAM,YAAN,cAAwB,wBAAwB;AAAA,EAC5C,OAAO;AAAA,EAEhB,SAAS,QAAuC;AAC9C,UAAM,SAAyC,CAAC;AAChD,UAAM,IAAI;AAEV,QAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,WAAW,GAAG;AACnD,aAAO,KAAK,EAAE,OAAO,SAAS,SAAS,6CAA6C,CAAC;AACrF,aAAO,EAAE,OAAO,OAAO,OAAO;AAAA,IAChC;AAEA,eAAW,KAAK,EAAE,OAAO;AACvB,UAAI,OAAO,MAAM,YAAY,EAAE,WAAW,GAAG;AAC3C,eAAO,KAAK,EAAE,OAAO,SAAS,SAAS,uBAAuB,OAAO,CAAC,CAAC,GAAG,CAAC;AAAA,MAC7E,WAAW,WAAW,CAAC,GAAG;AACxB,eAAO,KAAK,EAAE,OAAO,SAAS,SAAS,+BAA+B,CAAC,GAAG,CAAC;AAAA,MAC7E;AAAA,IACF;AAEA,WAAO,EAAE,OAAO,OAAO,WAAW,GAAG,OAAO;AAAA,EAC9C;AAAA,EAEA,MAAM,QAAQ,SAAsB,QAAsC;AACxE,UAAM,EAAE,MAAM,IAAI;AAClB,UAAM,UAAoB,CAAC;AAE3B,eAAW,KAAK,OAAO;AACrB,YAAM,WAAWC,OAAK,QAAQ,cAAc,CAAC;AAC7C,YAAMC,QAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AACzC,cAAQ,KAAK,CAAC;AACd,cAAQ,OAAO,MAAM,EAAE,MAAM,SAAS,GAAG,mBAAmB;AAAA,IAC9D;AAEA,WAAO,EAAE,SAAS,MAAM,QAAQ,EAAE,QAAQ,GAAG,SAAS,WAAW,QAAQ,MAAM,eAAe;AAAA,EAChG;AAAA,EAEA,MAAM,SAAS,SAAsB,QAAiB,QAA8B;AAClF,UAAM,EAAE,MAAM,IAAI;AAClB,eAAW,KAAK,CAAC,GAAG,KAAK,EAAE,QAAQ,GAAG;AACpC,YAAM,WAAWD,OAAK,QAAQ,cAAc,CAAC;AAC7C,YAAME,IAAG,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACrE;AAAA,EACF;AACF;;;ACzDA,SAAS,aAAa;AACtB,SAAS,QAAAC,QAAM,cAAAC,mBAAkB;AAe1B,IAAM,WAAN,cAAuB,wBAAwB;AAAA,EAC3C,OAAO;AAAA,EAEhB,SAAS,QAAuC;AAC9C,UAAM,SAAyC,CAAC;AAChD,UAAM,IAAI;AAEV,QAAI,OAAO,EAAE,YAAY,YAAY,EAAE,QAAQ,WAAW,GAAG;AAC3D,aAAO,KAAK,EAAE,OAAO,WAAW,SAAS,sBAAsB,CAAC;AAAA,IAClE;AACA,QAAI,EAAE,SAAS,UAAa,CAAC,MAAM,QAAQ,EAAE,IAAI,GAAG;AAClD,aAAO,KAAK,EAAE,OAAO,QAAQ,SAAS,mCAAmC,CAAC;AAAA,IAC5E;AACA,QAAI,EAAE,QAAQ,WAAc,OAAO,EAAE,QAAQ,YAAYC,YAAW,EAAE,GAAG,IAAI;AAC3E,aAAO,KAAK,EAAE,OAAO,OAAO,SAAS,8BAA8B,CAAC;AAAA,IACtE;AAEA,WAAO,EAAE,OAAO,OAAO,WAAW,GAAG,OAAO;AAAA,EAC9C;AAAA,EAEA,MAAM,QAAQ,SAAsB,QAAsC;AACxE,UAAM,EAAE,SAAS,OAAO,CAAC,GAAG,KAAK,IAAI,IAAI;AACzC,UAAM,UAAU,MAAMC,OAAK,QAAQ,cAAc,GAAG,IAAI,QAAQ;AAEhE,YAAQ,OAAO,MAAM,EAAE,SAAS,MAAM,KAAK,QAAQ,GAAG,mBAAmB;AAEzE,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,OAAC,EAAE,UAAU,QAAQ,OAAO,IAAI,MAAM,WAAW,SAAS,MAAM,SAAS,GAAG;AAAA,IAC9E,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,EAAE,UAAU,GAAG,QAAQ,IAAI,QAAS,IAAc,QAAQ;AAAA,QAClE,SAAS,YAAY,OAAO,sBAAuB,IAAc,OAAO;AAAA,MAC1E;AAAA,IACF;AAEA,QAAI,aAAa,GAAG;AAClB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,EAAE,UAAU,QAAQ,OAAO;AAAA,QACnC,SAAS,YAAY,OAAO,sBAAsB,QAAQ,KAAK,OAAO,MAAM,GAAG,GAAG,CAAC;AAAA,MACrF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ,EAAE,UAAU,QAAQ,OAAO;AAAA,MACnC,SAAS,YAAY,OAAO;AAAA,IAC9B;AAAA,EACF;AACF;AAEA,SAAS,WACP,SACA,MACA,KACA,KAC+D;AAC/D,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,UAAM,QAAQ,MAAM,SAAS,MAAM;AAAA,MACjC;AAAA,MACA,KAAK,MAAM,EAAE,GAAG,QAAQ,KAAK,GAAG,IAAI,IAAI,QAAQ;AAAA,MAChD,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAChC,OAAO;AAAA,IACT,CAAC;AAED,UAAM,eAAyB,CAAC;AAChC,UAAM,eAAyB,CAAC;AAEhC,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB,aAAa,KAAK,KAAK,CAAC;AACnE,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB,aAAa,KAAK,KAAK,CAAC;AAEnE,UAAM,GAAG,SAAS,MAAM;AACxB,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,MAAAA,SAAQ;AAAA,QACN,UAAU,QAAQ;AAAA,QAClB,QAAQ,OAAO,OAAO,YAAY,EAAE,SAAS,OAAO;AAAA,QACpD,QAAQ,OAAO,OAAO,YAAY,EAAE,SAAS,OAAO;AAAA,MACtD,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;;;ACpGA,SAAS,IAAI,MAAAC,KAAI,UAAAC,eAAc;AAC/B,SAAS,QAAAC,QAAM,cAAAC,mBAAkB;AAkB1B,IAAM,eAAN,cAA2B,wBAAwB;AAAA,EAC/C,OAAO;AAAA,EAEhB,SAAS,QAAuC;AAC9C,UAAM,SAAyC,CAAC;AAChD,UAAM,IAAI;AAEV,QAAI,OAAO,EAAE,SAAS,YAAY,EAAE,KAAK,WAAW,GAAG;AACrD,aAAO,KAAK,EAAE,OAAO,QAAQ,SAAS,wBAAwB,CAAC;AAAA,IACjE;AACA,QAAI,OAAO,EAAE,OAAO,YAAY,EAAE,GAAG,WAAW,GAAG;AACjD,aAAO,KAAK,EAAE,OAAO,MAAM,SAAS,sBAAsB,CAAC;AAAA,IAC7D,WAAWC,YAAW,EAAE,EAAY,GAAG;AACrC,aAAO,KAAK,EAAE,OAAO,MAAM,SAAS,kDAAkD,CAAC;AAAA,IACzF;AAEA,WAAO,EAAE,OAAO,OAAO,WAAW,GAAG,OAAO;AAAA,EAC9C;AAAA,EAEA,MAAM,QAAQ,SAAsB,QAAsC;AACxE,UAAM,EAAE,MAAM,IAAI,YAAY,KAAK,IAAI;AACvC,UAAM,UAAUA,YAAW,IAAI,IAAI,OAAOC,OAAK,QAAQ,cAAc,IAAI;AACzE,UAAM,WAAWA,OAAK,QAAQ,cAAc,EAAE;AAE9C,QAAI;AACF,YAAMC,QAAO,OAAO;AAAA,IACtB,QAAQ;AACN,aAAO,EAAE,SAAS,OAAO,SAAS,+BAA+B,OAAO,GAAG;AAAA,IAC7E;AAEA,UAAM,GAAG,SAAS,UAAU,EAAE,WAAW,OAAO,KAAK,CAAC;AACtD,YAAQ,OAAO,MAAM,EAAE,MAAM,SAAS,IAAI,SAAS,GAAG,cAAc;AAEpE,WAAO,EAAE,SAAS,MAAM,QAAQ,EAAE,MAAM,SAAS,IAAI,SAAS,GAAG,SAAS,UAAU,IAAI,WAAM,EAAE,GAAG;AAAA,EACrG;AAAA,EAEA,MAAM,SAAS,SAAsB,QAAiB,QAA8B;AAClF,UAAM,EAAE,GAAG,IAAI;AACf,UAAM,WAAWD,OAAK,QAAQ,cAAc,EAAE;AAC9C,UAAME,IAAG,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACrE;AACF;;;AC5DA,SAAS,SAAAC,cAAa;AACtB,SAAS,MAAAC,WAAU;AACnB,SAAS,QAAAC,cAAY;AAed,IAAM,eAAN,cAA2B,wBAAwB;AAAA,EAC/C,OAAO;AAAA,EAEhB,SAAS,QAAuC;AAC9C,UAAM,SAAyC,CAAC;AAChD,UAAM,IAAI;AAEV,QAAI,OAAO,EAAE,SAAS,YAAY,EAAE,KAAK,WAAW,GAAG;AACrD,aAAO,KAAK,EAAE,OAAO,QAAQ,SAAS,uBAAuB,CAAC;AAAA,IAChE;AACA,QAAI,EAAE,UAAU,WAAc,OAAO,EAAE,UAAU,YAAY,EAAE,QAAQ,IAAI;AACzE,aAAO,KAAK,EAAE,OAAO,SAAS,SAAS,mCAAmC,CAAC;AAAA,IAC7E;AAEA,WAAO,EAAE,OAAO,OAAO,WAAW,GAAG,OAAO;AAAA,EAC9C;AAAA,EAEA,MAAM,QAAQ,SAAsB,QAAsC;AACxE,UAAM,EAAE,MAAM,SAAS,KAAK,QAAQ,MAAM,IAAI;AAC9C,UAAM,YAAYC,OAAK,QAAQ,cAAc,MAAM;AAEnD,UAAM,OAAO,CAAC,OAAO;AACrB,QAAI,OAAQ,MAAK,KAAK,YAAY,MAAM;AACxC,QAAI,MAAO,MAAK,KAAK,WAAW,OAAO,KAAK,CAAC;AAC7C,SAAK,KAAK,MAAM,SAAS;AAEzB,YAAQ,OAAO,MAAM,EAAE,MAAM,QAAQ,OAAO,UAAU,GAAG,wBAAwB;AAEjF,UAAM,SAAS,MAAM,QAAQ,IAAI;AAEjC,QAAI,OAAO,aAAa,GAAG;AACzB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,EAAE,UAAU,OAAO,UAAU,QAAQ,OAAO,OAAO;AAAA,QAC3D,SAAS,qBAAqB,OAAO,OAAO,MAAM,GAAG,GAAG,CAAC;AAAA,MAC3D;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ,EAAE,MAAM,QAAQ,UAAU;AAAA,MAClC,SAAS,UAAU,IAAI,GAAG,SAAS,aAAa,MAAM,MAAM,EAAE;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,SAAsB,QAAiB,QAA8B;AAClF,UAAM,EAAE,SAAS,IAAI,IAAI;AACzB,QAAI,WAAW,KAAK;AAClB,YAAM,YAAYA,OAAK,QAAQ,cAAc,MAAM;AACnD,YAAMC,IAAG,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACtE;AAAA,EACF;AACF;AAEA,SAAS,QAAQ,MAA+E;AAC9F,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,UAAM,QAAQC,OAAM,OAAO,MAAM,EAAE,OAAO,CAAC,UAAU,QAAQ,MAAM,EAAE,CAAC;AACtE,UAAM,eAAyB,CAAC;AAChC,UAAM,eAAyB,CAAC;AAEhC,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB,aAAa,KAAK,KAAK,CAAC;AACnE,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB,aAAa,KAAK,KAAK,CAAC;AAEnE,UAAM,GAAG,SAAS,MAAM;AACxB,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,MAAAD,SAAQ;AAAA,QACN,UAAU,QAAQ;AAAA,QAClB,QAAQ,OAAO,OAAO,YAAY,EAAE,SAAS,OAAO;AAAA,QACpD,QAAQ,OAAO,OAAO,YAAY,EAAE,SAAS,OAAO;AAAA,MACtD,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;;;ACzFA,SAAS,SAAAE,cAAa;AACtB,SAAS,QAAAC,cAAY;AAkBd,IAAM,iBAAN,cAA6B,wBAAwB;AAAA,EACjD,OAAO;AAAA,EAEhB,SAAS,QAAuC;AAC9C,UAAM,SAAyC,CAAC;AAChD,UAAM,IAAI;AAEV,QAAI,EAAE,mBAAmB,QAAW;AAClC,YAAM,QAAQ,CAAC,OAAO,QAAQ,MAAM;AACpC,UAAI,CAAC,MAAM,SAAS,EAAE,cAAwB,GAAG;AAC/C,eAAO,KAAK,EAAE,OAAO,kBAAkB,SAAS,mBAAmB,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC;AAAA,MACzF;AAAA,IACF;AACA,QAAI,EAAE,SAAS,UAAa,CAAC,MAAM,QAAQ,EAAE,IAAI,GAAG;AAClD,aAAO,KAAK,EAAE,OAAO,QAAQ,SAAS,mCAAmC,CAAC;AAAA,IAC5E;AAEA,WAAO,EAAE,OAAO,OAAO,WAAW,GAAG,OAAO;AAAA,EAC9C;AAAA,EAEA,MAAM,QAAQ,SAAsB,QAAsC;AACxE,UAAM,EAAE,iBAAiB,OAAO,MAAM,KAAK,OAAO,CAAC,GAAG,UAAAC,UAAS,IAAI;AACnE,UAAM,UAAUC,OAAK,QAAQ,cAAc,GAAG;AAC9C,UAAM,UAAU,CAAC,WAAW,GAAG,IAAI;AACnC,QAAID,UAAU,SAAQ,KAAK,cAAcA,SAAQ;AAEjD,YAAQ,OAAO,MAAM,EAAE,gBAAgB,KAAK,SAAS,MAAM,QAAQ,GAAG,yBAAyB;AAE/F,UAAM,SAAS,MAAM,WAAW,gBAAgB,SAAS,OAAO;AAEhE,QAAI,OAAO,aAAa,GAAG;AACzB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,EAAE,UAAU,OAAO,UAAU,QAAQ,OAAO,OAAO;AAAA,QAC3D,SAAS,GAAG,cAAc,yBAAyB,OAAO,QAAQ,MAAM,OAAO,OAAO,MAAM,GAAG,GAAG,CAAC;AAAA,MACrG;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ,EAAE,gBAAgB,UAAU,EAAE;AAAA,MACtC,SAAS,GAAG,cAAc;AAAA,IAC5B;AAAA,EACF;AACF;AAEA,SAAS,WACP,IACA,MACA,KAC+D;AAC/D,SAAO,IAAI,QAAQ,CAACE,UAAS,WAAW;AACtC,UAAM,QAAQC,OAAM,IAAI,MAAM;AAAA,MAC5B;AAAA,MACA,KAAK,QAAQ;AAAA,MACb,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAChC,OAAO,QAAQ,aAAa;AAAA,IAC9B,CAAC;AAED,UAAM,eAAyB,CAAC;AAChC,UAAM,eAAyB,CAAC;AAEhC,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB,aAAa,KAAK,KAAK,CAAC;AACnE,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB,aAAa,KAAK,KAAK,CAAC;AAEnE,UAAM,GAAG,SAAS,MAAM;AACxB,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,MAAAD,SAAQ;AAAA,QACN,UAAU,QAAQ;AAAA,QAClB,QAAQ,OAAO,OAAO,YAAY,EAAE,SAAS,OAAO;AAAA,QACpD,QAAQ,OAAO,OAAO,YAAY,EAAE,SAAS,OAAO;AAAA,MACtD,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;;;AC7EO,SAAS,4BAA0C;AACxD,QAAME,YAAW,IAAI,aAAa;AAClC,EAAAA,UAAS,SAAS,IAAI,UAAU,CAAC;AACjC,EAAAA,UAAS,SAAS,IAAI,SAAS,CAAC;AAChC,EAAAA,UAAS,SAAS,IAAI,aAAa,CAAC;AACpC,EAAAA,UAAS,SAAS,IAAI,aAAa,CAAC;AACpC,EAAAA,UAAS,SAAS,IAAI,eAAe,CAAC;AACtC,SAAOA;AACT;;;ACxBA,SAAS,QAAAC,cAAY;AACrB,SAAS,kBAAkB;AAC3B,SAAS,UAAAC,SAAQ,SAAAC,eAAa;AAE9B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAAC;AAAA,OACK;;;ACXP,SAAS,gBAAgB;;;ACAzB,SAAS,KAAAC,UAAS;AAElB,IAAM,wBAAwBA,GAAE,OAAO;AAAA,EACrC,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,SAASA,GAAE,OAAO,EAAE,IAAI,CAAC;AAC3B,CAAC;AAED,IAAM,yBAAyBA,GAAE,OAAO;AAAA,EACtC,OAAOA,GAAE,KAAK,CAAC,WAAW,QAAQ,CAAC,EAAE,SAAS;AAAA,EAC9C,UAAUA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC/B,aAAaA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAClC,OAAOA,GAAE,QAAQ,EAAE,SAAS;AAC9B,CAAC;AAED,IAAM,uBAAuBA,GAAE,OAAO;AAAA,EACpC,SAASA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,kBAAkBA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAC5C,gBAAgBA,GAAE,OAAO,EAAE,SAAS;AACtC,CAAC;AAED,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EACnC,MAAMA,GAAE,KAAK,CAAC,OAAO,QAAQ,UAAU,SAAS,OAAO,QAAQ,CAAC;AAAA,EAChE,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACxC,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,cAAcA,GAAE,OAAO,EAAE,SAAS;AACpC,CAAC;AAEM,IAAM,0BAA0BA,GACpC,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,gBAAgBA,GAAE,MAAMA,GAAE,KAAK,CAAC,WAAW,QAAQ,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;AAAA,EACjE,gBAAgB,sBAAsB,SAAS;AAAA,EAC/C,aAAa,sBAAsB,SAAS;AAAA,EAC5C,YAAY,sBAAsB,SAAS;AAAA,EAC3C,gBAAgBA,GAAE,QAAQ,EAAE,SAAS;AAAA,EACrC,gBAAgBA,GAAE,OAAO,EAAE,SAAS;AAAA,EACpC,kBAAkBA,GAAE,KAAK,CAAC,OAAO,KAAK,CAAC,EAAE,SAAS;AAAA,EAClD,kBAAkB,uBAAuB,SAAS;AAAA,EAClD,gBAAgB,qBAAqB,SAAS;AAAA,EAC9C,SAASA,GAAE,MAAM,mBAAmB,EAAE,SAAS;AACjD,CAAC,EACA,YAAY;;;ADvBR,IAAM,iBAAN,cAA6B,qBAAwC;AAAA,EACvD,gBAAgB;AAAA,EAElB,eAAe,oBAAI,IAA2B;AAAA,EAE/D,cAAc;AACZ,UAAM,iBAAiB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAoB,aAAqB,UAA+B;AACtE,SAAK,aAAa,IAAI,aAAa,QAAQ;AAAA,EAC7C;AAAA,EAEA,eAAe,aAAgD;AAC7D,WAAO,KAAK,aAAa,IAAI,WAAW;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,aAAqB,MAA8B;AAC9D,UAAM,MAAM,KAAK,IAAI,WAAW;AAChC,WAAO,OAAO,QAAQ,IAAI,eAAe,SAAS,IAAI;AAAA,EACxD;AAAA,EAEA,YAAY,aAAqB,MAA2B;AAC1D,UAAM,MAAM,KAAK,IAAI,WAAW;AAChC,QAAI,CAAC,KAAK;AACR,YAAM,IAAI;AAAA,QACR,YAAY,WAAW;AAAA,MAEzB;AAAA,IACF;AACA,QAAI,CAAC,IAAI,eAAe,SAAS,IAAI,GAAG;AACtC,YAAM,YAAY,IAAI,eAAe,KAAK,IAAI;AAC9C,YAAM,IAAI;AAAA,QACR,YAAY,WAAW,uBAAuB,IAAI,6BAC7B,SAAS,SAC7B,SAAS,YACN,kDACA,SAAS,SACP,+CACA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,mBAAmB,KAA8B;AAC/C,WAAO,QAAQ,aAAa,UAAU,IAAI,QAAQ,IAAI;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,kBAAkB,aAAmD;AACzE,UAAM,MAAM,KAAK,IAAI,WAAW;AAChC,QAAI,CAAC,IAAK,QAAO,EAAE,WAAW,OAAO,OAAO,YAAY,WAAW,mBAAmB;AACtF,QAAI,CAAC,IAAI,eAAgB,QAAO,EAAE,WAAW,KAAK;AAElD,UAAM,EAAE,SAAS,OAAO,CAAC,WAAW,GAAG,mBAAmB,GAAG,eAAe,IAAI,IAAI;AAEpF,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,IAAI,MAAM,YAAY,SAAS,IAAI;AAC5D,UAAI,aAAa,kBAAkB;AACjC,eAAO,EAAE,WAAW,OAAO,OAAO,aAAa,QAAQ,cAAc,gBAAgB,IAAI;AAAA,MAC3F;AACA,UAAI,gBAAgB;AAClB,cAAM,QAAQ,IAAI,OAAO,cAAc,EAAE,KAAK,MAAM;AACpD,YAAI,CAAC,OAAO;AACV,iBAAO,EAAE,WAAW,OAAO,OAAO,wCAAwC,cAAc,GAAG;AAAA,QAC7F;AACA,eAAO,EAAE,WAAW,MAAM,SAAS,MAAM,CAAC,EAAE;AAAA,MAC9C;AACA,YAAM,UAAU,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC;AAC3C,aAAO,EAAE,WAAW,MAAM,SAAS,WAAW,OAAU;AAAA,IAC1D,SAAS,KAAK;AACZ,aAAO,EAAE,WAAW,OAAO,OAAQ,IAAc,QAAQ;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,aAA6C;AAC7D,UAAM,MAAM,KAAK,IAAI,WAAW;AAChC,QAAI,CAAC,KAAK,QAAS,QAAO,CAAC;AAC3B,UAAM,OAAO,QAAQ;AACrB,WAAO,IAAI,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,UAAU,SAAS,IAAI,CAAC;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,MAAe,SAA4D;AAClF,UAAM,SAAS,wBAAwB,UAAU,IAAI;AACrD,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,OAAO,MAAM,OAAO,IAAI,CAAC,OAAO;AAAA,UACtC,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,GAAG;AAAA,UACjC,SAAS,EAAE;AAAA,UACX,UAAU;AAAA,QACZ,EAAE;AAAA,QACF,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AACA,WAAO,EAAE,OAAO,MAAM,MAAM,OAAO,MAA2B,QAAQ,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,EACzF;AACF;AAYA,SAAS,YAAY,SAAiB,MAA+D;AACnG,SAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,aAAS,SAAS,MAAM,EAAE,SAAS,KAAQ,aAAa,KAAK,GAAG,CAAC,KAAK,WAAW;AAC/E,UAAI,OAAO,OAAQ,IAA8B,SAAS,YAAa,IAA8B,SAAS,UAAU;AACtH,QAAAA,SAAQ,EAAE,QAAQ,IAAI,UAAU,GAAG,CAAC;AACpC;AAAA,MACF;AACA,YAAM,WAAW,OAAO,UAAU,OAAO,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO,MAAM,IAAI;AAC7F,MAAAA,SAAQ,EAAE,QAAQ,UAAU,IAAI,SAAS,CAAC;AAAA,IAC5C,CAAC;AAAA,EACH,CAAC;AACH;;;AEpKA,IAAM,UAAU,IAAI,eAAe;AAG5B,SAAS,oBAAoC;AAClD,SAAO;AACT;AAWO,SAAS,gBAAgB,YAAqC;AACnE,QAAM,EAAE,MAAM,aAAa,GAAG,KAAK,IAAI;AACvC,QAAM,aAAgC,EAAE,GAAG,MAAM,MAAM,KAAK;AAC5D,UAAQ,SAAS,UAAU;AAC3B,MAAI,aAAa;AACf,YAAQ,oBAAoB,MAAM,WAAW;AAAA,EAC/C;AACF;AAMO,SAAS,0BAA0B,YAAqC;AAC7E,UAAQ,SAAS,UAAU;AAC7B;AAEO,SAAS,qBAAqB,MAA2C;AAC9E,QAAM,MAAM,QAAQ,IAAI,IAAI;AAC5B,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR,YAAY,IAAI;AAAA,IAElB;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,aAAa,MAAwB,MAA8B;AACjF,SAAO,QAAQ,aAAa,MAAM,IAAI;AACxC;AAEO,SAAS,YAAY,MAAwB,MAA2B;AAC7E,UAAQ,YAAY,MAAM,IAAI;AAChC;AAEO,SAAS,mBAAmB,KAA8B;AAC/D,SAAO,QAAQ,mBAAmB,GAAG;AACvC;AAEO,SAAS,eAAe,MAA4C;AACzE,QAAM,UAAU,QAAQ,kBAAkB,IAAI;AAC9C,QAAM,QAAQ,QAAQ,CAAC;AACvB,SAAO,OAAO,SAAS,OAAO;AAChC;AAEO,SAAS,eAAe,MAAmD;AAChF,SAAO,QAAQ,eAAe,IAAI;AACpC;;;AC/DA,IAAM,mBAAwC;AAAA,EAC5C;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,QAAQ,EAAE,MAAM,UAAU;AAAA,IAC1B,gBAAgB,CAAC,WAAW,MAAM;AAAA,IAClC,gBAAgB,EAAE,OAAO,cAAc,SAAS,SAAS;AAAA,IACzD,aAAa,EAAE,OAAO,cAAc,SAAS,SAAS;AAAA,IACtD,kBAAkB,EAAE,OAAO,QAAQ,aAAa,QAAQ;AAAA,IACxD,gBAAgB,EAAE,SAAS,UAAU,MAAM,CAAC,WAAW,EAAE;AAAA,IACzD,SAAS;AAAA,MACP,EAAE,MAAM,OAAO,SAAS,sBAAsB,OAAO,mBAAmB,WAAW,CAAC,SAAS,UAAU,OAAO,EAAE;AAAA,MAChH,EAAE,MAAM,QAAQ,SAAS,UAAU,OAAO,8BAA8B,WAAW,CAAC,QAAQ,EAAE;AAAA,MAC9F,EAAE,MAAM,UAAU,SAAS,oBAAoB,OAAO,mCAAmC,WAAW,CAAC,OAAO,EAAE;AAAA,IAChH;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,QAAQ,EAAE,MAAM,UAAU;AAAA,IAC1B,gBAAgB,CAAC,WAAW,QAAQ,KAAK;AAAA,IACzC,gBAAgB,EAAE,OAAO,SAAS,SAAS,QAAQ;AAAA,IACnD,aAAa,EAAE,OAAO,SAAS,SAAS,QAAQ;AAAA,IAChD,kBAAkB;AAAA,IAClB,kBAAkB,EAAE,OAAO,WAAW,UAAU,OAAO,aAAa,MAAM;AAAA,IAC1E,gBAAgB,EAAE,SAAS,SAAS,MAAM,CAAC,WAAW,EAAE;AAAA,IACxD,SAAS;AAAA,MACP,EAAE,MAAM,UAAU,OAAO,wBAAwB,cAAc,4EAAuE;AAAA,IACxI;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,QAAQ,EAAE,MAAM,UAAU;AAAA,IAC1B,gBAAgB,CAAC,WAAW,QAAQ,KAAK;AAAA,IACzC,gBAAgB,EAAE,OAAO,wBAAwB,SAAS,mBAAmB;AAAA,IAC7E,aAAa,EAAE,OAAO,cAAc,SAAS,SAAS;AAAA,IACtD,kBAAkB;AAAA,IAClB,kBAAkB,EAAE,OAAO,WAAW,UAAU,OAAO,aAAa,MAAM;AAAA,IAC1E,gBAAgB;AAAA,IAChB,gBAAgB,EAAE,SAAS,UAAU,MAAM,CAAC,WAAW,EAAE;AAAA,IACzD,SAAS;AAAA,MACP,EAAE,MAAM,OAAO,SAAS,6BAA6B,OAAO,2CAA2C;AAAA,IACzG;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,QAAQ,EAAE,MAAM,UAAU;AAAA,IAC1B,gBAAgB,CAAC,SAAS;AAAA,EAC5B;AACF;AAEO,SAAS,0BAAgC;AAC9C,QAAM,MAAM,kBAAkB;AAC9B,aAAW,OAAO,kBAAkB;AAClC,QAAI,SAAS,GAAG;AAAA,EAClB;AACF;AAEA,wBAAwB;;;AC7CjB,SAAS,aAAa,aAAwC;AACnE,SAAO,aAAa,aAAa,KAAK;AACxC;AAMO,SAAS,iBAAiB,aAAwC;AACvE,QAAM,OAAO,qBAAqB,WAAW;AAC7C,SAAO,aAAa,aAAa,KAAK,KAAK,KAAK,mBAAmB;AACrE;AAQA,SAAS,UACP,aACA,cACA,eACU;AACV,QAAM,OAAO,qBAAqB,WAAW;AAE7C,MAAI,gBAAgB,UAAU;AAC5B,UAAM,aAAa,eAAe;AAClC,QAAI,MAAM,QAAQ,UAAU,EAAG,QAAO,WAAW,IAAI,MAAM;AAC3D,WAAO,CAAC,YAAY;AAAA,EACtB;AAEA,MAAI,KAAK,eAAe,SAAS,MAAM,KAAK,CAAC,KAAK,eAAe,SAAS,KAAK,GAAG;AAChF,WAAO,CAAC,YAAY;AAAA,EACtB;AAEA,MAAI,KAAK,eAAe,SAAS,KAAK,GAAG;AACvC,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,CAAC,YAAY;AACtB;AAMO,SAAS,eACd,aACA,cACA,eACiB;AACjB,cAAY,aAAa,SAAS;AAElC,QAAM,OAAO,qBAAqB,WAAW;AAC7C,QAAM,eAAe,eAAe;AACpC,QAAM,UAAU,OAAO,iBAAiB,YAAY,aAAa,SAAS,IACtE,eACA,KAAK,iBACH,mBAAmB,KAAK,cAAc,KACrC,MAAM;AAAE,UAAM,IAAI,MAAM,YAAY,WAAW,qCAAqC;AAAA,EAAG,GAAG;AAEjG,SAAO;AAAA,IACL;AAAA,IACA,MAAM,UAAU,aAAa,cAAc,aAAa;AAAA,IACxD,gBAAgB,KAAK;AAAA,EACvB;AACF;AAGA,IAAM,qBAAuC;AAAA,EAC3C,OAAO;AAAA,EACP,UAAU;AAAA,EACV,aAAa;AAAA,EACb,OAAO;AACT;AAQO,SAAS,YACd,aACA,cACiB;AACjB,cAAY,aAAa,MAAM;AAE/B,QAAM,OAAO,qBAAqB,WAAW;AAC7C,MAAI,CAAC,KAAK,aAAa;AACrB,UAAM,IAAI,MAAM,YAAY,WAAW,kCAAkC;AAAA,EAC3E;AAEA,QAAM,SAAS,KAAK,qBAAqB;AAEzC,SAAO;AAAA,IACL,SAAS,mBAAmB,KAAK,WAAW;AAAA,IAC5C,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY;AAAA,IACjC,KAAK,SAAS,eAAe;AAAA,IAC7B,kBAAkB,EAAE,GAAG,oBAAoB,GAAG,KAAK,iBAAiB;AAAA,EACtE;AACF;AAQO,SAAS,kBACd,aACA,cACA,eACiB;AACjB,cAAY,aAAa,KAAK;AAE9B,QAAM,OAAO,qBAAqB,WAAW;AAE7C,QAAM,WAAW,eAAe,WAAW;AAC3C,MAAI,UAAU;AACZ,WAAO,SAAS,cAAc,aAAa;AAAA,EAC7C;AAEA,QAAM,eAAe,eAAe;AACpC,QAAM,gBAAgB,KAAK,cAAc,KAAK;AAC9C,QAAM,UAAU,OAAO,iBAAiB,YAAY,aAAa,SAAS,IACtE,eACA,gBACE,mBAAmB,aAAa,KAC/B,MAAM;AAAE,UAAM,IAAI,MAAM,YAAY,WAAW,4CAA4C;AAAA,EAAG,GAAG;AAExG,SAAO;AAAA,IACL;AAAA,IACA,MAAM,UAAU,aAAa,cAAc,aAAa;AAAA,IACxD,gBAAgB,KAAK;AAAA,EACvB;AACF;;;ACpKA,SAAS,gBAAAC,sBAAoB;;;ACItB,SAAS,eAAe,KAAsB;AACnD,MAAI;AACF,YAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,SAAS,KAAc;AACrB,QAAIC,aAAY,GAAG,KAAK,IAAI,SAAS,SAAS;AAC5C,aAAO;AAAA,IACT;AACA,QAAIA,aAAY,GAAG,KAAK,IAAI,SAAS,SAAS;AAC5C,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;AAMO,SAAS,WAAW,KAAa,QAAiC;AACvE,MAAI;AACF,YAAQ,KAAK,KAAK,MAAM;AACxB,WAAO;AAAA,EACT,SAAS,KAAc;AACrB,QAAIA,aAAY,GAAG,KAAK,IAAI,SAAS,SAAS;AAC5C,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;AAEO,SAAS,MAAM,IAA2B;AAC/C,SAAO,IAAI,QAAQ,CAACC,aAAY,WAAWA,UAAS,EAAE,CAAC;AACzD;AAEA,SAASD,aAAY,KAA4C;AAC/D,SAAO,eAAe,SAAS,UAAU;AAC3C;;;ADtCA,IAAME,WAASC,eAAa,iBAAiB;AAc7C,IAAM,wBAAwB;AAkBvB,IAAM,iBAAN,MAAqB;AAAA,EAM1B,YACmB,eACjB,SACA;AAFiB;AAGjB,SAAK,iBAAiB,SAAS,kBAAkB;AAAA,EACnD;AAAA,EAViB,UAAU,oBAAI,IAAwB;AAAA,EAC/C,QAA+C;AAAA,EAC/C,UAAU;AAAA,EACD;AAAA,EASjB,MAAM,cAAsB,KAAmB;AAC7C,SAAK,QAAQ,IAAI,cAAc,EAAE,IAAI,CAAC;AACtC,IAAAD,SAAO,MAAM,EAAE,cAAc,IAAI,GAAG,kBAAkB;AAAA,EACxD;AAAA,EAEA,QAAQ,cAA+B;AACrC,UAAM,UAAU,KAAK,QAAQ,OAAO,YAAY;AAChD,QAAI,SAAS;AACX,MAAAA,SAAO,MAAM,EAAE,aAAa,GAAG,mBAAmB;AAAA,IACpD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,cAA+B;AACxC,WAAO,KAAK,QAAQ,IAAI,YAAY;AAAA,EACtC;AAAA,EAEA,IAAI,aAAqB;AACvB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,QAAc;AACZ,QAAI,KAAK,MAAO;AAChB,SAAK,QAAQ,YAAY,MAAM;AAC7B,WAAK,KAAK,KAAK;AAAA,IACjB,GAAG,KAAK,cAAc;AACtB,IAAAA,SAAO,KAAK,EAAE,gBAAgB,KAAK,eAAe,GAAG,wBAAwB;AAAA,EAC/E;AAAA,EAEA,OAAa;AACX,QAAI,KAAK,OAAO;AACd,oBAAc,KAAK,KAAK;AACxB,WAAK,QAAQ;AACb,MAAAA,SAAO,KAAK,wBAAwB;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,UAAgB;AACd,SAAK,KAAK;AACV,SAAK,QAAQ,MAAM;AAAA,EACrB;AAAA,EAEA,IAAI,YAAqB;AACvB,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,MAAc,OAAsB;AAClC,QAAI,KAAK,QAAS;AAClB,SAAK,UAAU;AAEf,QAAI;AACF,YAAM,SAA4B,CAAC;AAEnC,iBAAW,CAAC,cAAc,KAAK,KAAK,KAAK,SAAS;AAChD,YAAI,CAAC,eAAe,MAAM,GAAG,GAAG;AAC9B,iBAAO,KAAK,EAAE,cAAc,KAAK,MAAM,IAAI,CAAC;AAAA,QAC9C;AAAA,MACF;AAEA,iBAAW,QAAQ,QAAQ;AACzB,aAAK,QAAQ,OAAO,KAAK,YAAY;AACrC,QAAAA,SAAO,KAAK,MAAM,+CAA0C;AAE5D,YAAI;AACF,gBAAM,KAAK,cAAc,IAAI;AAAA,QAC/B,SAAS,KAAK;AACZ,UAAAA,SAAO,MAAM,EAAE,GAAG,MAAM,OAAO,IAAI,GAAG,+BAA+B;AAAA,QACvE;AAAA,MACF;AAAA,IACF,UAAE;AACA,WAAK,UAAU;AAAA,IACjB;AAAA,EACF;AACF;;;AExHA,SAAS,gBAAAE,sBAAoB;AAE7B,IAAMC,WAASD,eAAa,qBAAqB;AA4BjD,IAAM,oBAAN,MAAqD;AAAA,EAC1C,OAAO;AAAA,EAEhB,qBAAqB,eAA0C;AAC7D,WAAO,EAAE,MAAM,eAAe;AAAA,EAChC;AAAA,EAEA,kBAAkB,eAAuC;AACvD,WAAO,EAAE,MAAM,eAAe;AAAA,EAChC;AACF;AAEA,IAAM,2BAAN,MAA4D;AAAA,EACjD,OAAO;AAAA,EAEhB,qBAAqB,eAA0C;AAC7D,WAAO,EAAE,MAAM,eAAe;AAAA,EAChC;AAAA,EAEA,kBAAkB,eAAuC;AACvD,WAAO,EAAE,MAAM,eAAe;AAAA,EAChC;AACF;AAEA,IAAM,wBAAN,MAAyD;AAAA,EAC9C,OAAO;AAAA,EAEhB,qBAAqB,cAAyC;AAC5D,IAAAC,SAAO,KAAK,EAAE,aAAa,GAAG,kEAA6D;AAC3F,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AAAA,EAEA,kBAAkB,cAAsC;AACtD,IAAAA,SAAO,KAAK,EAAE,aAAa,GAAG,iEAA4D;AAC1F,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AACF;AAEA,IAAM,qBAAN,MAAsD;AAAA,EAC3C,OAAO;AAAA,EAEhB,qBAAqB,eAAuB,MAA6C;AACvF,QAAI,MAAM,UAAU,gBAAgB,QAAQ;AAC1C,aAAO,EAAE,MAAM,UAAU;AAAA,IAC3B;AACA,WAAO,EAAE,MAAM,eAAe;AAAA,EAChC;AAAA,EAEA,kBAAkB,eAAuC;AACvD,WAAO,EAAE,MAAM,eAAe;AAAA,EAChC;AACF;AAEA,IAAM,WAAkD;AAAA,EACtD,UAAU,IAAI,kBAAkB;AAAA,EAChC,kBAAkB,IAAI,yBAAyB;AAAA,EAC/C,eAAe,IAAI,sBAAsB;AAAA,EACzC,YAAY,IAAI,mBAAmB;AACrC;AAEO,SAAS,qBAAqB,MAAqC;AACxE,SAAO,SAAS,IAAI;AACtB;;;AC7FA,SAAS,gBAAAC,sBAAoB;AAE7B,IAAMC,WAASD,eAAa,iBAAiB;AAatC,IAAM,yBAAwC;AAAA,EACnD,aAAa;AAAA,EACb,eAAe;AAAA,EACf,cAAc;AAAA,EACd,cAAc;AAChB;AA6BO,IAAM,iBAAN,MAAqB;AAAA,EAClB,SAAS,oBAAI,IAA0B;AAAA,EAC9B;AAAA,EAEjB,YAAY,QAAiC;AAC3C,SAAK,SAAS,EAAE,GAAG,wBAAwB,GAAG,OAAO;AAAA,EACvD;AAAA,EAEA,cAAc,cAAuC;AACnD,UAAM,QAAQ,KAAK,YAAY,YAAY;AAE3C,QAAI,MAAM,cAAc,GAAG;AACzB,YAAM,WAAW,KAAK,IAAI,IAAI,MAAM;AACpC,UAAI,YAAY,KAAK,OAAO,cAAc;AACxC,QAAAC,SAAO,KAAK,EAAE,cAAc,UAAU,cAAc,KAAK,OAAO,aAAa,GAAG,mDAA8C;AAC9H,cAAM,QAAQ;AAAA,MAChB;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,KAAK,OAAO,aAAa;AAC1C,MAAAA,SAAO,KAAK,EAAE,cAAc,OAAO,MAAM,OAAO,aAAa,KAAK,OAAO,YAAY,GAAG,wBAAwB;AAChH,aAAO,EAAE,SAAS,OAAO,SAAS,GAAG,SAAS,MAAM,MAAM;AAAA,IAC5D;AAEA,UAAM,UAAU,KAAK;AAAA,MACnB,KAAK,OAAO,gBAAgB,KAAK,IAAI,GAAG,MAAM,KAAK;AAAA,MACnD,KAAK,OAAO;AAAA,IACd;AAEA,WAAO,EAAE,SAAS,MAAM,SAAS,SAAS,MAAM,QAAQ,EAAE;AAAA,EAC5D;AAAA,EAEA,cAAc,cAA4B;AACxC,UAAM,QAAQ,KAAK,YAAY,YAAY;AAC3C,UAAM;AACN,UAAM,gBAAgB,KAAK,IAAI;AAC/B,IAAAA,SAAO,MAAM,EAAE,cAAc,OAAO,MAAM,MAAM,GAAG,kBAAkB;AAAA,EACvE;AAAA,EAEA,YAAY,cAA4B;AACtC,UAAM,QAAQ,KAAK,YAAY,YAAY;AAC3C,UAAM,cAAc,KAAK,IAAI;AAAA,EAC/B;AAAA,EAEA,MAAM,cAA4B;AAChC,SAAK,OAAO,OAAO,YAAY;AAAA,EACjC;AAAA,EAEA,gBAAgB,cAA8B;AAC5C,WAAO,KAAK,OAAO,IAAI,YAAY,GAAG,SAAS;AAAA,EACjD;AAAA,EAEA,UAAgB;AACd,SAAK,OAAO,MAAM;AAAA,EACpB;AAAA,EAEQ,YAAY,cAAoC;AACtD,QAAI,QAAQ,KAAK,OAAO,IAAI,YAAY;AACxC,QAAI,CAAC,OAAO;AACV,cAAQ,EAAE,OAAO,GAAG,eAAe,GAAG,aAAa,EAAE;AACrD,WAAK,OAAO,IAAI,cAAc,KAAK;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AACF;;;ACjHA,SAAS,SAAAC,cAAa;AACtB,SAAS,gBAAAC,sBAAoB;AAQ7B,IAAMC,WAASD,eAAa,0BAA0B;AAEtD,IAAM,qBAAqB;AAOpB,IAAM,yBAAN,MAA0D;AAAA,EAC9C;AAAA,EAEjB,YAAY,aAAa,UAAU;AACjC,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,MAAM,UACJ,cACA,QACA,SACuB;AACvB,UAAM,OAAO,KAAK,UAAU,QAAQ,SAAS,MAAM;AAEnD,IAAAC,SAAO,MAAM,EAAE,cAAc,KAAK,GAAG,4BAA4B;AAEjE,WAAO,IAAI,QAAsB,CAACC,UAAS,WAAW;AACpD,YAAM,QAAQH,OAAM,KAAK,YAAY,MAAM;AAAA,QACzC,KAAK;AAAA,QACL,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,QAC9B,KAAK,EAAE,GAAG,QAAQ,IAAI;AAAA,QACtB,aAAa;AAAA,MACf,CAAC;AAED,UAAI,SAAS;AACb,UAAI,SAAS;AAEb,YAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB;AACzC,kBAAU,MAAM,SAAS;AAAA,MAC3B,CAAC;AAED,YAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB;AACzC,kBAAU,MAAM,SAAS;AAAA,MAC3B,CAAC;AAED,YAAM,UAAU,SAAS,aAAa;AACtC,YAAM,QAAQ,WAAW,MAAM;AAC7B,cAAM,KAAK,SAAS;AACpB,eAAO,IAAI,MAAM,sCAAsC,OAAO,IAAI,CAAC;AAAA,MACrE,GAAG,OAAO;AAEV,YAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,qBAAa,KAAK;AAElB,YAAI,SAAS,GAAG;AACd,UAAAE,SAAO,KAAK,EAAE,MAAM,QAAQ,OAAO,MAAM,GAAG,GAAG,EAAE,GAAG,+BAA+B;AACnF,iBAAO,IAAI,MAAM,gCAAgC,IAAI,KAAK,OAAO,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC;AACjF;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,SAAS,KAAK,MAAM,MAAM;AAChC,gBAAM,SAAS,OAAO,QAAQ;AAC9B,gBAAM,YAAY,OAAO,YAAY;AACrC,gBAAM,UAAU,OAAO,SAAS;AAEhC,cAAI,WAAW,YAAY,WAAW;AACpC,YAAAA,SAAO,KAAK,EAAE,QAAQ,GAAG,0CAA0C;AAAA,UACrE;AAEA,cAAI;AACJ,cAAI,UAAU,OAAO,SAAS,GAAG;AAC/B,mBAAO;AAAA,UACT,WAAW,YAAY,mBAAmB;AACxC,mBAAO;AAAA,UACT,OAAO;AACL,kBAAM,UAAU,OAAO,UAAU;AACjC,kBAAM,WAAW,OAAO,aAAa;AACrC,kBAAM,QAAkB,CAAC,kBAAkB;AAC3C,gBAAI,QAAS,OAAM,KAAK,WAAW,OAAO,EAAE;AAC5C,gBAAI,WAAW,KAAM,OAAM,KAAK,SAAS,QAAQ,QAAQ,CAAC,CAAC,EAAE;AAC7D,gBAAI,YAAY,KAAM,OAAM,KAAK,YAAY,QAAQ,IAAI;AACzD,mBAAO,MAAM,KAAK,GAAG;AAAA,UACvB;AAEA,UAAAC,SAAQ,EAAE,MAAM,UAAU,CAAC;AAAA,QAC7B,QAAQ;AACN,gBAAM,YAAY,OAAO,MAAM,GAAG,GAAG,EAAE,MAAM,IAAI,EAAE,CAAC,KAAK;AACzD,UAAAA,SAAQ,EAAE,MAAM,aAAa,yBAAyB,CAAC;AAAA,QACzD;AAAA,MACF,CAAC;AAED,YAAM,GAAG,SAAS,CAAC,QAAQ;AACzB,qBAAa,KAAK;AAClB,eAAO,IAAI,MAAM,gCAAgC,IAAI,OAAO,EAAE,CAAC;AAAA,MACjE,CAAC;AAED,YAAM,MAAM,IAAI;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,aACL,cACA,QACA,SAC4B;AAC5B,UAAM,OAAO,KAAK,UAAU,QAAQ,SAAS,aAAa;AAE1D,IAAAD,SAAO,MAAM,EAAE,cAAc,KAAK,GAAG,8BAA8B;AAEnE,UAAM,QAAQF,OAAM,KAAK,YAAY,MAAM;AAAA,MACzC,KAAK;AAAA,MACL,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAC9B,KAAK,EAAE,GAAG,QAAQ,IAAI;AAAA,MACtB,aAAa;AAAA,IACf,CAAC;AAED,UAAM,UAAU,SAAS,aAAa;AACtC,UAAM,QAAQ,WAAW,MAAM;AAC7B,YAAM,KAAK,SAAS;AAAA,IACtB,GAAG,OAAO;AAEV,UAAM,MAAM,IAAI;AAEhB,QAAI,SAAS;AAEb,QAAI;AACF,uBAAiB,SAAS,MAAM,QAAQ;AACtC,kBAAW,MAAiB,SAAS;AACrC,cAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,iBAAS,MAAM,IAAI,KAAK;AAExB,mBAAW,QAAQ,OAAO;AACxB,gBAAM,UAAU,KAAK,KAAK;AAC1B,cAAI,CAAC,QAAS;AAEd,cAAI;AACF,kBAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,kBAAM,cAAc,iBAAiB,KAAK;AAC1C,gBAAI,aAAa;AACf,oBAAM;AAAA,YACR;AAAA,UACF,QAAQ;AACN,kBAAM,EAAE,MAAM,QAAQ,SAAS,QAAQ;AAAA,UACzC;AAAA,QACF;AAAA,MACF;AAEA,UAAI,OAAO,KAAK,GAAG;AACjB,YAAI;AACF,gBAAM,QAAQ,KAAK,MAAM,OAAO,KAAK,CAAC;AACtC,gBAAM,cAAc,iBAAiB,KAAK;AAC1C,cAAI,aAAa;AACf,kBAAM;AAAA,UACR;AAAA,QACF,QAAQ;AACN,gBAAM,EAAE,MAAM,QAAQ,SAAS,OAAO,KAAK,EAAE;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,UAAE;AACA,mBAAa,KAAK;AAClB,UAAI,MAAM,aAAa,MAAM;AAC3B,cAAM,KAAK,SAAS;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,UACN,QACA,SACA,cACU;AACV,UAAM,OAAO,CAAC,MAAM,mBAAmB,YAAY;AAEnD,QAAI,SAAS,kBAAkB;AAC7B,WAAK,KAAK,wBAAwB,QAAQ,gBAAgB;AAAA,IAC5D;AAEA,QAAI,SAAS,oBAAoB;AAC/B,WAAK,KAAK,0BAA0B,QAAQ,kBAAkB;AAAA,IAChE;AAEA,QAAI,SAAS,WAAW;AACtB,WAAK,KAAK,YAAY,QAAQ,SAAS;AAAA,IACzC;AAEA,QAAI,SAAS,aAAa,QAAW;AACnC,WAAK,KAAK,eAAe,OAAO,QAAQ,QAAQ,CAAC;AAAA,IACnD;AAEA,QAAI,SAAS,OAAO;AAClB,WAAK,KAAK,WAAW,QAAQ,KAAK;AAAA,IACpC;AAEA,SAAK,KAAK,MAAM;AAChB,WAAO;AAAA,EACT;AACF;AAEA,SAAS,iBAAiB,OAAoD;AAC5E,QAAM,OAAO,MAAM,MAAM;AAEzB,MAAI,SAAS,eAAe,SAAS,QAAQ;AAC3C,UAAM,UAAU,MAAM,SAAS;AAC/B,UAAM,UAAU,WAAY,MAAM,SAAS,KAA4B;AACvE,WAAO,EAAE,MAAM,QAAQ,QAAQ;AAAA,EACjC;AAEA,MAAI,SAAS,YAAY;AACvB,UAAM,OAAO,MAAM,MAAM;AACzB,UAAM,QAAQ,MAAM,OAAO;AAC3B,WAAO,EAAE,MAAM,YAAY,SAAS,OAAO,UAAU,IAAI,KAAK,KAAK,UAAU,KAAK,CAAC,KAAK,GAAG;AAAA,EAC7F;AAEA,MAAI,SAAS,UAAU;AACrB,UAAM,SAAS,MAAM,QAAQ;AAC7B,WAAO,EAAE,MAAM,UAAU,SAAS,UAAU,GAAG;AAAA,EACjD;AAEA,MAAI,SAAS,SAAS;AACpB,UAAM,QAAQ,MAAM,OAAO;AAC3B,WAAO,EAAE,MAAM,SAAS,SAAS,OAAO,WAAW,gBAAgB;AAAA,EACrE;AAGA,MAAI,OAAO,MAAM,SAAS,MAAM,UAAU;AACxC,WAAO,EAAE,MAAM,QAAQ,SAAS,MAAM,SAAS,EAAE;AAAA,EACnD;AAEA,SAAO;AACT;;;AC9OA,SAAS,gBAAAI,sBAAoB;AAQ7B,IAAMC,WAASD,eAAa,qBAAqB;AAO1C,IAAM,qBAAN,MAAsD;AAAA,EAC3D,MAAM,UACJ,eACA,SACA,UACuB;AACvB,IAAAC,SAAO,KAAK,gEAAgE;AAC5E,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AAAA;AAAA,EAGA,OAAO,aACL,eACA,SACA,UAC4B;AAC5B,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AACF;;;AClCA,IAAM,WAAW,oBAAI,IAAsF;AAQpG,SAAS,qBACd,aACA,SACM;AACN,WAAS,IAAI,aAAa,OAAO;AACnC;AAEO,SAAS,mBACd,aACA,eACmB;AACnB,QAAM,aAAa,SAAS,IAAI,WAAW;AAC3C,MAAI,WAAY,QAAO,WAAW,aAAa;AAE/C,UAAQ,aAAa;AAAA,IACnB,KAAK;AACH,aAAO,IAAI,uBAAuB;AAAA,IACpC,KAAK;AAAA,IACL,KAAK;AACH,aAAO,IAAI,mBAAmB;AAAA,IAChC;AACE,YAAM,IAAI;AAAA,QACR,2CAA2C,WAAW;AAAA,MAExD;AAAA,EACJ;AACF;;;AZZA,IAAMC,WAASC,eAAa,eAAe;AA2CpC,IAAM,eAAN,MAAmB;AAAA,EASxB,YACmB,aACA,UACA,kBACjB,SACA;AAJiB;AACA;AACA;AAGjB,SAAK,eAAe,SAAS,gBAAgBC,OAAK,kBAAkB,YAAY;AAChF,SAAK,mBAAmB,SAAS;AACjC,SAAK,UAAU,IAAI;AAAA,MACjB,CAAC,SAAS,KAAK,kBAAkB,IAAI;AAAA,MACrC,EAAE,gBAAgB,SAAS,sBAAsB;AAAA,IACnD;AACA,SAAK,iBAAiB,IAAI,eAAe,SAAS,aAAa;AAC/D,SAAK,aAAa,SAAS;AAAA,EAC7B;AAAA,EAtBQ,QAAQ,oBAAI,IAA+B;AAAA,EAC3C,YAAY,oBAAI,IAA0B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBjB,MAAM,aAA4B;AAChC,UAAM,EAAE,OAAO,UAAU,IAAI,MAAM;AAAA,MACjC,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAEA,SAAK,MAAM,MAAM;AACjB,SAAK,UAAU,MAAM;AAErB,UAAM,kBAA4B,CAAC;AAEnC,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,WAAW,aAAa,KAAK,WAAW,cAAc,KAAK,WAAW,YAAY;AACzF,cAAM,UAAU,qBAAqB,KAAK,UAAU;AACpD,cAAM,SAAS,QAAQ,kBAAkB,KAAK,IAAI;AAElD,cAAM,MAAMA,OAAK,KAAK,kBAAkB,KAAK,IAAI;AACjD,cAAM,QAAQ,MAAM,mBAAmB,KAAK,EAAE,QAAQ,WAAW,KAAK,OAAU,CAAC;AACjF,aAAK,MAAM,IAAI,KAAK,MAAM,KAAK;AAC/B,QAAAF,SAAO,KAAK,EAAE,MAAM,KAAK,MAAM,WAAW,KAAK,QAAQ,YAAY,KAAK,YAAY,gBAAgB,OAAO,KAAK,GAAG,wBAAwB;AAE3I,YAAI,OAAO,SAAS,WAAW;AAC7B,0BAAgB,KAAK,KAAK,IAAI;AAAA,QAChC;AAAA,MACF,OAAO;AACL,aAAK,MAAM,IAAI,KAAK,MAAM,IAAI;AAAA,MAChC;AAAA,IACF;AAEA,eAAW,QAAQ,WAAW;AAC5B,YAAM,KAAK,gBAAgB,IAAI;AAAA,IACjC;AAEA,SAAK,QAAQ,MAAM;AAEnB,IAAAA,SAAO,KAAK;AAAA,MACV,OAAO,MAAM;AAAA,MACb,WAAW,UAAU;AAAA,MACrB,iBAAiB,gBAAgB;AAAA,IACnC,GAAG,2BAA2B;AAE9B,eAAW,QAAQ,iBAAiB;AAClC,UAAI;AACF,cAAM,KAAK,WAAW,IAAI;AAC1B,QAAAA,SAAO,KAAK,EAAE,KAAK,GAAG,4BAA4B;AAAA,MACpD,SAAS,KAAK;AACZ,QAAAA,SAAO,MAAM,EAAE,MAAM,OAAO,IAAI,GAAG,yBAAyB;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,YACJ,MACA,cACA,WAC4B;AAC5B,UAAM,OAAO,MAAM,KAAK,YAAY,eAAe,MAAM,cAAc,SAAS;AAChF,SAAK,MAAM,IAAI,MAAM,IAAI;AACzB,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,iBACJ,MACA,cACA,WACwD;AACxD,UAAM,SAAS,KAAK,MAAM,IAAI,IAAI;AAClC,QAAI,QAAQ;AACV,aAAO,EAAE,MAAM,QAAQ,SAAS,MAAM;AAAA,IACxC;AAEA,UAAM,EAAE,MAAM,QAAQ,IAAI,MAAM,KAAK,YAAY;AAAA,MAC/C;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,SAAK,MAAM,IAAI,MAAM,IAAI;AACzB,WAAO,EAAE,MAAM,QAAQ;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,WAAW,MAA6B;AAC5C,UAAM,OAAO,KAAK,aAAa,IAAI;AACnC,gBAAY,KAAK,aAAa,KAAK;AAEnC,QAAI,KAAK,WAAW,aAAa,KAAK,WAAW,YAAY;AAC3D,YAAM,IAAI,yBAAyB,IAAI;AAAA,IACzC;AAEA,UAAM,MAAME,OAAK,KAAK,kBAAkB,IAAI;AAC5C,UAAM,WAAW,MAAM,mBAAmB,KAAK,EAAE,QAAQ,WAAW,CAAC;AACrE,SAAK,MAAM,IAAI,MAAM,QAAQ;AAE7B,QAAI;AACF,YAAM,UAAU,iBAAiB,KAAK,WAAW;AACjD,UAAI;AAEJ,UAAI,CAAC,SAAS;AACZ,cAAM,OAAO,MAAM,KAAK,SAAS,OAAO,KAAK,QAAQ;AACrD,aAAK,UAAU,IAAI,MAAM,IAAI;AAC7B,cAAM,KAAK;AAAA,MACb;AAEA,UAAI,KAAK,YAAY;AACnB,cAAM,cAAc,kBAAkB,KAAK,aAAa,KAAK,KAAK,aAAa;AAC/E,cAAM,cAAc,iBAAiB,KAAK,cAAc;AACxD,cAAM,aAAa,MAAM,KAAK,WAAW,QAAQ,MAAM;AAAA,UACrD,SAAS,YAAY;AAAA,UACrB,MAAM,YAAY;AAAA,UAClB,KAAK;AAAA,UACL,gBAAgB,YAAY;AAAA,UAC5B,mBAAmB;AAAA,YACjB,aAAa;AAAA,YACb,GAAI,OAAO,KAAK,WAAW,EAAE,SAAS,IAAI,EAAE,KAAK,YAAY,IAAI,CAAC;AAAA,UACpE;AAAA,QACF,CAAC;AACD,QAAAF,SAAO,KAAK,EAAE,MAAM,SAAS,cAAc,KAAK,gBAAgB,KAAK,GAAG,4BAA4B;AAEpG,YAAI,WAAW,SAAS,cAAc,OAAO,WAAW,QAAQ,UAAU;AACxE,gBAAM,WAAW;AACjB,eAAK,UAAU,IAAI,MAAM,EAAE,KAAK,cAAc,KAAK,cAAc,KAAK,CAAC;AAAA,QACzE;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,mBAAmB,KAAK,EAAE,QAAQ,WAAW,IAAI,CAAC;AACxE,WAAK,MAAM,IAAI,MAAM,OAAO;AAC5B,UAAI,KAAK;AACP,aAAK,QAAQ,MAAM,MAAM,GAAG;AAAA,MAC9B;AACA,WAAK,eAAe,YAAY,IAAI;AACpC,MAAAA,SAAO,KAAK,EAAE,MAAM,KAAK,YAAY,SAAS,YAAY,KAAK,KAAK,GAAG,eAAe;AAAA,IACxF,SAAS,KAAK;AACZ,UAAI,KAAK,YAAY,IAAI,IAAI,GAAG;AAC9B,cAAM,KAAK,WAAW,WAAW,IAAI,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MACvD;AACA,YAAM,UAAU,MAAM,mBAAmB,KAAK,EAAE,QAAQ,QAAQ,CAAC;AACjE,WAAK,MAAM,IAAI,MAAM,OAAO;AAC5B,UAAI,eAAe,iBAAkB,OAAM;AAC3C,YAAM,WAAW,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAChE,YAAM,IAAI,iBAAiB,MAAM,IAAI;AAAA,QACnC,gBAAgB,QAAQ,IACpB,0BAA0B,KAAK,WAAW,IAC1C;AAAA,MACN,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAU,MAA6B;AAC3C,UAAM,OAAO,KAAK,aAAa,IAAI;AACnC,UAAM,MAAME,OAAK,KAAK,kBAAkB,IAAI;AAE5C,QAAI,KAAK,WAAW,aAAa,KAAK,WAAW,YAAY;AAC3D,MAAAF,SAAO,KAAK,EAAE,MAAM,QAAQ,KAAK,OAAO,GAAG,0CAA0C;AACrF,YAAMG,WAAU,MAAM,mBAAmB,KAAK,EAAE,QAAQ,WAAW,KAAK,OAAU,CAAC;AACnF,WAAK,MAAM,IAAI,MAAMA,QAAO;AAC5B;AAAA,IACF;AAEA,SAAK,QAAQ,QAAQ,IAAI;AAEzB,UAAM,WAAW,MAAM,mBAAmB,KAAK,EAAE,QAAQ,WAAW,CAAC;AACrE,SAAK,MAAM,IAAI,MAAM,QAAQ;AAE7B,QAAI,KAAK,YAAY,IAAI,IAAI,GAAG;AAC9B,YAAM,KAAK,WAAW,WAAW,IAAI,EAAE,MAAM,CAAC,QAAQ;AACpD,QAAAH,SAAO,KAAK,EAAE,MAAM,OAAO,IAAI,GAAG,qCAAqC;AAAA,MACzE,CAAC;AAAA,IACH;AAEA,UAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AACpC,QAAI,MAAM;AACR,YAAM,KAAK,SAAS,UAAU,IAAI;AAClC,WAAK,UAAU,OAAO,IAAI;AAAA,IAC5B;AAEA,UAAM,UAAU,MAAM,mBAAmB,KAAK,EAAE,QAAQ,WAAW,KAAK,OAAU,CAAC;AACnF,SAAK,MAAM,IAAI,MAAM,OAAO;AAC5B,IAAAA,SAAO,KAAK,EAAE,KAAK,GAAG,eAAe;AAAA,EACvC;AAAA;AAAA,EAGA,MAAM,aAAa,MAA6B;AAC9C,UAAM,OAAO,KAAK,MAAM,IAAI,IAAI;AAChC,QAAI,CAAC,QAAQ,CAAC,WAAWE,OAAK,KAAK,kBAAkB,IAAI,CAAC,GAAG;AAC3D,YAAM,IAAI,mBAAmB,IAAI;AAAA,IACnC;AACA,QAAI,SAAS,KAAK,WAAW,aAAa,KAAK,WAAW,aAAa;AACrE,YAAM,KAAK,UAAU,IAAI;AAAA,IAC3B;AAEA,SAAK,QAAQ,QAAQ,IAAI;AACzB,SAAK,eAAe,MAAM,IAAI;AAC9B,UAAM,KAAK,YAAY,gBAAgB,IAAI;AAC3C,SAAK,MAAM,OAAO,IAAI;AACtB,SAAK,UAAU,OAAO,IAAI;AAC1B,IAAAF,SAAO,KAAK,EAAE,KAAK,GAAG,iBAAiB;AAAA,EACzC;AAAA;AAAA,EAGA,SAAS,MAA6C;AACpD,WAAO,KAAK,MAAM,IAAI,IAAI;AAAA,EAC5B;AAAA;AAAA,EAGA,UAAU,MAAuC;AAC/C,WAAO,KAAK,MAAM,IAAI,IAAI,GAAG;AAAA,EAC/B;AAAA;AAAA,EAGA,aAAkC;AAChC,WAAO,MAAM,KAAK,KAAK,MAAM,OAAO,CAAC;AAAA,EACvC;AAAA;AAAA,EAGA,IAAI,OAAe;AACjB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aACJ,MACA,cACA,WACwB;AACxB,QAAI,OAAO,KAAK,MAAM,IAAI,IAAI;AAC9B,QAAI,UAAU;AAEd,QAAI,CAAC,QAAQ,cAAc;AACzB,aAAO,MAAM,KAAK,YAAY,MAAM,cAAc,SAAS;AAC3D,gBAAU;AAAA,IACZ;AAEA,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,mBAAmB,IAAI;AAAA,IACnC;AAEA,UAAM,MAAME,OAAK,KAAK,kBAAkB,IAAI;AAC5C,UAAM,WAAW,eAAe,KAAK,aAAa,KAAK,KAAK,aAAa;AAEzE,WAAO;AAAA,MACL,cAAc;AAAA,MACd,SAAS,SAAS;AAAA,MAClB,MAAM,SAAS;AAAA,MACf,cAAc;AAAA,MACd,aAAa,KAAK;AAAA,MAClB;AAAA,MACA,gBAAgB,SAAS;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAU,MAAwC;AACtD,UAAM,OAAO,KAAK,aAAa,IAAI;AACnC,UAAM,MAAMA,OAAK,KAAK,kBAAkB,IAAI;AAC5C,WAAO,YAAY,KAAK,aAAa,GAAG;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YACJ,MACA,KACA,gBAC4B;AAC5B,UAAM,OAAO,KAAK,aAAa,IAAI;AAEnC,QAAI,KAAK,WAAW,aAAa,KAAK,OAAO,MAAM;AACjD,YAAM,IAAI,0BAA0B,IAAI;AAAA,IAC1C;AAEA,QAAI;AACF,cAAQ,KAAK,KAAK,CAAC;AAAA,IACrB,SAAS,KAAc;AACrB,YAAM,OAAQ,IAA8B;AAC5C,UAAI,SAAS,SAAS;AACpB,cAAM,IAAI;AAAA,UACR;AAAA,UACA,IAAI,MAAM,oBAAoB,GAAG,iBAAiB;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAMA,OAAK,KAAK,kBAAkB,IAAI;AAC5C,UAAM,iBAAiB,iBACnB,EAAE,GAAG,KAAK,UAAU,GAAG,eAAe,IACtC,KAAK;AACT,UAAM,UAAU,MAAM,mBAAmB,KAAK;AAAA,MAC5C,QAAQ;AAAA,MACR;AAAA,MACA,kBAAkB;AAAA,MAClB,UAAU;AAAA,IACZ,CAAC;AACD,SAAK,MAAM,IAAI,MAAM,OAAO;AAC5B,SAAK,UAAU,IAAI,MAAM,EAAE,KAAK,cAAc,KAAK,cAAc,KAAK,CAAC;AACvE,SAAK,QAAQ,MAAM,MAAM,GAAG;AAC5B,IAAAF,SAAO,KAAK,EAAE,MAAM,IAAI,GAAG,2BAA2B;AACtD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAAY,MAAc,SAAwD;AACtF,UAAM,OAAO,KAAK,aAAa,IAAI;AAEnC,QAAI,KAAK,qBAAqB,YAAY;AACxC,YAAM,IAAI,sBAAsB,IAAI;AAAA,IACtC;AAEA,SAAK,QAAQ,QAAQ,IAAI;AACzB,SAAK,UAAU,OAAO,IAAI;AAE1B,UAAM,MAAME,OAAK,KAAK,kBAAkB,IAAI;AAC5C,UAAM,UAAU,MAAM,mBAAmB,KAAK;AAAA,MAC5C,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,kBAAkB;AAAA,IACpB,CAAC;AACD,SAAK,MAAM,IAAI,MAAM,OAAO;AAC5B,IAAAF,SAAO,KAAK,EAAE,KAAK,GAAG,2BAA2B;AAEjD,QAAI,mBAAmB;AACvB,QAAI,SAAS,WAAW,KAAK,oBAAoB,aAAa;AAC5D,YAAM,KAAK,aAAa,IAAI;AAC5B,yBAAmB;AAAA,IACrB;AAEA,WAAO,EAAE,IAAI,MAAM,iBAAiB;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UACJ,MACA,QACA,SACuB;AACvB,UAAM,OAAO,KAAK,aAAa,IAAI;AAEnC,QAAI,KAAK,YAAY,IAAI,IAAI,GAAG;AAC9B,YAAM,OAAO,KAAK,WAAW,cAAc,IAAI;AAC/C,YAAM,YAAY,KAAK,WAAW,oBAAoB,IAAI;AAC1D,UAAI,QAAQ,WAAW;AACrB,QAAAA,SAAO,MAAM,EAAE,MAAM,UAAU,GAAG,wBAAwB;AAC1D,cAAM,SAAS,MAAM,KAAK,OAAO,WAAW,MAAM;AAClD,eAAO,EAAE,MAAM,OAAO,MAAM,UAAU;AAAA,MACxC;AAAA,IACF;AAEA,UAAM,MAAME,OAAK,KAAK,kBAAkB,IAAI;AAC5C,UAAM,eAAe,mBAAmB,KAAK,WAAW;AACxD,WAAO,aAAa,UAAU,KAAK,QAAQ,OAAO;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aACE,MACA,QACA,SAC4B;AAC5B,UAAM,OAAO,KAAK,aAAa,IAAI;AAEnC,QAAI,KAAK,YAAY,IAAI,IAAI,GAAG;AAC9B,YAAM,OAAO,KAAK,WAAW,cAAc,IAAI;AAC/C,YAAM,YAAY,KAAK,WAAW,oBAAoB,IAAI;AAC1D,UAAI,QAAQ,WAAW;AACrB,QAAAF,SAAO,MAAM,EAAE,MAAM,UAAU,GAAG,0BAA0B;AAC5D,eAAO,KAAK,cAAc,MAAM,WAAW,MAAM;AAAA,MACnD;AAAA,IACF;AAEA,UAAM,MAAME,OAAK,KAAK,kBAAkB,IAAI;AAC5C,UAAM,eAAe,mBAAmB,KAAK,WAAW;AACxD,WAAO,aAAa,aAAa,KAAK,QAAQ,OAAO;AAAA,EACvD;AAAA,EAEA,OAAe,cACb,MACA,WACA,QAC4B;AAC5B,QAAI;AACF,uBAAiB,SAAS,KAAK,aAAa,WAAW,MAAM,GAAG;AAC9D,cAAM,SAAS;AACf,cAAM,OAAO,OAAO,MAAM;AAE1B,YAAI,SAAS,UAAU,SAAS,aAAa;AAC3C,gBAAM,UAAW,OAAO,SAAS,KAAiB,OAAO,SAAS,KAAgB;AAClF,gBAAM,EAAE,MAAM,QAAQ,QAAQ;AAAA,QAChC,WAAW,SAAS,YAAY;AAC9B,gBAAM,WAAW,OAAO,MAAM;AAC9B,gBAAM,EAAE,MAAM,YAAY,SAAS,WAAW,UAAU,QAAQ,MAAM,GAAG;AAAA,QAC3E,WAAW,SAAS,UAAU;AAC5B,gBAAM,EAAE,MAAM,UAAU,SAAU,OAAO,QAAQ,KAAgB,GAAG;AAAA,QACtE,WAAW,SAAS,SAAS;AAC3B,gBAAM,SAAU,OAAO,OAAO,IAAgC,SAAS;AACvE,gBAAM,EAAE,MAAM,SAAS,SAAS,UAAU,gBAAgB;AAAA,QAC5D,WAAW,OAAO,OAAO,SAAS,MAAM,UAAU;AAChD,gBAAM,EAAE,MAAM,QAAQ,SAAS,OAAO,SAAS,EAAE;AAAA,QACnD;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,EAAE,MAAM,SAAS,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,IACnF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YACJ,MACA,SACA,WACuB;AACvB,SAAK,aAAa,IAAI;AAEtB,QAAI,CAAC,KAAK,YAAY,IAAI,IAAI,GAAG;AAC/B,YAAM,IAAI,MAAM,UAAU,IAAI,+DAA+D;AAAA,IAC/F;AAEA,UAAM,OAAO,KAAK,WAAW,cAAc,IAAI;AAC/C,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,uBAAuB,IAAI,aAAa;AAAA,IAC1D;AAEA,UAAM,kBAAkB,aAAa,KAAK,WAAW,oBAAoB,IAAI;AAC7E,QAAI,CAAC,iBAAiB;AACpB,YAAM,IAAI,MAAM,+BAA+B,IAAI,GAAG;AAAA,IACxD;AAEA,UAAM,SAAS,MAAM,KAAK,OAAO,iBAAiB,OAAO;AACzD,WAAO,EAAE,MAAM,OAAO,MAAM,WAAW,gBAAgB;AAAA,EACzD;AAAA;AAAA,EAGA,iBAAiB,MAAuB;AACtC,WAAO,KAAK,YAAY,IAAI,IAAI,KAAK;AAAA,EACvC;AAAA;AAAA,EAGA,MAAM,UAAyB;AAC7B,SAAK,QAAQ,QAAQ;AACrB,SAAK,eAAe,QAAQ;AAC5B,UAAM,KAAK,YAAY,WAAW;AAAA,EACpC;AAAA,EAEA,MAAc,kBAAkB,MAAsC;AACpE,UAAM,EAAE,cAAc,IAAI,IAAI;AAC9B,UAAM,OAAO,KAAK,MAAM,IAAI,YAAY;AACxC,QAAI,CAAC,KAAM;AAEX,QAAI,KAAK,WAAW,cAAc,KAAK,WAAW,WAAW;AAC3D;AAAA,IACF;AAEA,UAAM,UAAU,qBAAqB,KAAK,UAAU;AACpD,UAAM,SAAS,QAAQ,qBAAqB,cAAc,IAAI;AAE9D,IAAAF,SAAO,KAAK,EAAE,cAAc,KAAK,YAAY,KAAK,YAAY,QAAQ,OAAO,MAAM,gBAAgB,KAAK,OAAO,GAAG,mCAAmC;AAErJ,QAAI,KAAK,YAAY,IAAI,YAAY,GAAG;AACtC,YAAM,KAAK,WAAW,WAAW,YAAY,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC/D;AAEA,UAAM,MAAME,OAAK,KAAK,kBAAkB,YAAY;AACpD,UAAM,YAAW,oBAAI,KAAK,GAAE,YAAY;AACxC,UAAM,aAA0B,KAAK,qBAAqB,aAAa,YAAY;AACnF,UAAM,UAAU,MAAM,mBAAmB,KAAK;AAAA,MAC5C,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,UAAU,EAAE,GAAG,KAAK,UAAU,SAAS;AAAA,IACzC,CAAC;AACD,SAAK,MAAM,IAAI,cAAc,OAAO;AACpC,SAAK,UAAU,OAAO,YAAY;AAElC,YAAQ,OAAO,MAAM;AAAA,MACnB,KAAK,WAAW;AACd,cAAM,WAAW,KAAK,eAAe,cAAc,YAAY;AAC/D,YAAI,CAAC,SAAS,SAAS;AACrB,gBAAM,UAAU,MAAM,mBAAmB,KAAK,EAAE,QAAQ,QAAQ,CAAC;AACjE,eAAK,MAAM,IAAI,cAAc,OAAO;AACpC,UAAAF,SAAO,MAAM,EAAE,cAAc,SAAS,SAAS,QAAQ,GAAG,gDAA2C;AACrG;AAAA,QACF;AAEA,QAAAA,SAAO,KAAK,EAAE,cAAc,SAAS,SAAS,SAAS,SAAS,SAAS,QAAQ,GAAG,uCAAuC;AAE3H,YAAI,SAAS,UAAU,GAAG;AACxB,gBAAM,MAAM,SAAS,OAAO;AAAA,QAC9B;AAEA,aAAK,eAAe,cAAc,YAAY;AAC9C,YAAI;AACF,gBAAM,KAAK,WAAW,YAAY;AAClC,UAAAA,SAAO,KAAK,EAAE,cAAc,SAAS,SAAS,QAAQ,GAAG,yBAAyB;AAAA,QACpF,SAAS,KAAK;AACZ,UAAAA,SAAO,MAAM,EAAE,cAAc,SAAS,SAAS,SAAS,OAAO,IAAI,GAAG,sBAAsB;AAAA,QAC9F;AACA;AAAA,MACF;AAAA,MACA,KAAK;AACH,YAAI;AACF,gBAAM,KAAK,aAAa,YAAY;AACpC,UAAAA,SAAO,KAAK,EAAE,aAAa,GAAG,qCAAqC;AAAA,QACrE,SAAS,KAAK;AACZ,UAAAA,SAAO,MAAM,EAAE,cAAc,OAAO,IAAI,GAAG,8BAA8B;AAAA,QAC3E;AACA;AAAA,MACF,KAAK;AACH;AAAA,IACJ;AAAA,EACF;AAAA,EAEQ,aAAa,MAAiC;AACpD,UAAM,OAAO,KAAK,MAAM,IAAI,IAAI;AAChC,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,mBAAmB,IAAI;AAAA,IACnC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,gBAAgB,MAA6B;AACzD,QAAI;AACF,YAAMI,QAAM,KAAK,cAAc,EAAE,WAAW,KAAK,CAAC;AAClD,YAAM,MAAMF,OAAK,KAAK,kBAAkB,IAAI;AAC5C,YAAM,OAAOA,OAAK,KAAK,cAAc,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,EAAE;AAC5D,YAAMG,QAAO,KAAK,IAAI;AACtB,MAAAL,SAAO,KAAK,EAAE,MAAM,KAAK,GAAG,0BAA0B;AAAA,IACxD,SAAS,KAAK;AACZ,MAAAA,SAAO,MAAM,EAAE,MAAM,OAAO,IAAI,GAAG,mCAAmC;AAAA,IACxE;AAAA,EACF;AACF;AAUA,SAAS,iBAAiB,gBAA8D;AACtF,QAAM,MAA8B,CAAC;AAErC,QAAM,cAAc,sBAAsB,WAAW;AACrD,QAAM,eAAe,gBAAgB,QAAQ,aAAa;AAE1D,MAAI,cAAc;AAChB,QAAI,iBAAiB,IAAI;AAAA,EAC3B;AAEA,QAAM,aAAa,eAAe,sBAAsB,IAAI,YAAY,IAAI;AAC5E,QAAM,SAAS,YAAY,UAAU,QAAQ,IAAI,gBAAgB;AACjE,MAAI,QAAQ;AACV,QAAI,gBAAgB,IAAI;AAAA,EAC1B;AAEA,QAAM,UAAU,gBAAgB,WAAW,YAAY;AACvD,MAAI,SAAS;AACX,QAAI,iBAAiB,IAAI;AAAA,EAC3B;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,KAAsB;AAC7C,SAAO,6CAA6C,KAAK,GAAG;AAC9D;AAEA,SAAS,0BAA0B,aAA6B;AAC9D,QAAM,OAAO,eAAe,WAAwD;AACpF,QAAM,OAAO,YAAY,WAAW;AACpC,SAAO,OACH,GAAG,IAAI;AAAA,gBAAmB,IAAI,KAC9B,GAAG,IAAI;AACb;;;AalsBA,IAAI,UAAU;AAMP,IAAM,eAAN,MAA4C;AAAA,EACxC,WAA2B,CAAC;AAAA,EAC5B,aAA6B,CAAC;AAAA,EAEvC,MAAM,OAAO,cAAsB,MAAgD;AACjF,UAAMM,WAAwB;AAAA,MAC5B,KAAK;AAAA,MACL;AAAA,MACA,cAAc,KAAK;AAAA,IACrB;AACA,SAAK,SAAS,KAAKA,QAAO;AAC1B,WAAOA;AAAA,EACT;AAAA,EAEA,MAAM,UAAUA,UAAsC;AACpD,SAAK,WAAW,KAAKA,QAAO;AAAA,EAC9B;AACF;;;AC1BA,SAAS,SAAAC,cAAa;AAEtB,SAAS,oBAAAC,mBAAkB,gBAAAC,sBAAoB;;;ACF/C,SAAS,yBAA2C;AACpD,SAAS,SAAAC,SAAO,UAAAC,SAAQ,QAAAC,OAAM,YAAAC,iBAAgB;AAC9C,SAAS,QAAAC,cAAY;AAErB,SAAS,gBAAAC,sBAAoB;AAE7B,IAAMC,WAASD,eAAa,oBAAoB;AAEhD,IAAM,yBAAyB,KAAK,OAAO;AAC3C,IAAM,oBAAoB;AAanB,IAAM,mBAAN,MAAuB;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACT,eAAmC;AAAA,EACnC,eAAmC;AAAA,EACnC,cAAc;AAAA,EACd,cAAc;AAAA,EACd,SAAS;AAAA,EAEjB,YACE,aACA,SACA;AACA,SAAK,UAAUD,OAAK,aAAa,MAAM;AACvC,SAAK,UAAU,SAAS,gBAAgB;AACxC,SAAK,WAAW,SAAS,YAAY;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAA4B;AAChC,UAAMJ,QAAM,KAAK,SAAS,EAAE,WAAW,KAAK,CAAC;AAC7C,SAAK,eAAe,kBAAkBI,OAAK,KAAK,SAAS,YAAY,GAAG,EAAE,OAAO,IAAI,CAAC;AACtF,SAAK,eAAe,kBAAkBA,OAAK,KAAK,SAAS,YAAY,GAAG,EAAE,OAAO,IAAI,CAAC;AAEtF,QAAI;AACF,YAAM,aAAa,MAAMF,MAAKE,OAAK,KAAK,SAAS,YAAY,CAAC;AAC9D,WAAK,cAAc,WAAW;AAAA,IAChC,QAAQ;AAAE,WAAK,cAAc;AAAA,IAAG;AAEhC,QAAI;AACF,YAAM,aAAa,MAAMF,MAAKE,OAAK,KAAK,SAAS,YAAY,CAAC;AAC9D,WAAK,cAAc,WAAW;AAAA,IAChC,QAAQ;AAAE,WAAK,cAAc;AAAA,IAAG;AAEhC,IAAAE,SAAO,MAAM,EAAE,SAAS,KAAK,QAAQ,GAAG,wBAAwB;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAyB,QAA+B;AAC7D,QAAI,UAAU,KAAK,cAAc;AAC/B,aAAO,GAAG,QAAQ,CAAC,UAAkB;AACnC,YAAI,KAAK,UAAU,CAAC,KAAK,aAAc;AACvC,aAAK,aAAa,MAAM,KAAK;AAC7B,aAAK,eAAe,MAAM;AAC1B,YAAI,KAAK,eAAe,KAAK,SAAS;AACpC,eAAK,WAAW,YAAY,EAAE,MAAM,MAAM;AAAA,UAAC,CAAC;AAAA,QAC9C;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,UAAU,KAAK,cAAc;AAC/B,aAAO,GAAG,QAAQ,CAAC,UAAkB;AACnC,YAAI,KAAK,UAAU,CAAC,KAAK,aAAc;AACvC,aAAK,aAAa,MAAM,KAAK;AAC7B,aAAK,eAAe,MAAM;AAC1B,YAAI,KAAK,eAAe,KAAK,SAAS;AACpC,eAAK,WAAW,YAAY,EAAE,MAAM,MAAM;AAAA,UAAC,CAAC;AAAA,QAC9C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,SAAK,SAAS;AACd,UAAM,QAAQ,IAAI;AAAA,MAChB,KAAK,YAAY,KAAK,YAAY;AAAA,MAClC,KAAK,YAAY,KAAK,YAAY;AAAA,IACpC,CAAC;AACD,SAAK,eAAe;AACpB,SAAK,eAAe;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,QAA6B,OAAkC;AAC5E,UAAM,WAAWF,OAAK,KAAK,SAAS,GAAG,MAAM,MAAM;AACnD,QAAI;AACF,YAAM,UAAU,MAAMD,UAAS,UAAU,OAAO;AAChD,YAAM,WAAW,QAAQ,MAAM,IAAI,EAAE,OAAO,OAAO;AACnD,aAAO,SAAS,MAAM,CAAC,KAAK;AAAA,IAC9B,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,IAAI,eAAuB;AACzB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,WAAW,UAAiC;AACxD,UAAM,WAAWC,OAAK,KAAK,SAAS,QAAQ;AAC5C,UAAM,WAAW,aAAa;AAE9B,UAAM,SAAS,WAAW,KAAK,eAAe,KAAK;AACnD,QAAI,QAAQ;AACV,YAAM,KAAK,YAAY,MAAM;AAAA,IAC/B;AAEA,aAAS,IAAI,KAAK,WAAW,GAAG,KAAK,GAAG,KAAK;AAC3C,UAAI;AACF,cAAMH,QAAO,GAAG,QAAQ,IAAI,CAAC,IAAI,GAAG,QAAQ,IAAI,IAAI,CAAC,EAAE;AAAA,MACzD,QAAQ;AAAA,MAA+B;AAAA,IACzC;AAEA,QAAI;AACF,YAAMA,QAAO,UAAU,GAAG,QAAQ,IAAI;AAAA,IACxC,QAAQ;AAAA,IAA2B;AAEnC,UAAM,YAAY,kBAAkB,UAAU,EAAE,OAAO,IAAI,CAAC;AAC5D,QAAI,UAAU;AACZ,WAAK,eAAe;AACpB,WAAK,cAAc;AAAA,IACrB,OAAO;AACL,WAAK,eAAe;AACpB,WAAK,cAAc;AAAA,IACrB;AAEA,IAAAK,SAAO,MAAM,EAAE,SAAS,GAAG,kBAAkB;AAAA,EAC/C;AAAA,EAEQ,YAAY,QAA2C;AAC7D,QAAI,CAAC,OAAQ,QAAO,QAAQ,QAAQ;AACpC,WAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,aAAO,IAAI,MAAMA,SAAQ,CAAC;AAAA,IAC5B,CAAC;AAAA,EACH;AACF;;;ADtJA,IAAMC,WAASC,eAAa,kBAAkB;AAa9C,IAAM,4BAA4B;AAClC,IAAM,6BAA6B;AAS5B,IAAM,kBAAN,MAA+C;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa,oBAAI,IAA8B;AAAA,EAEhE,YAAY,SAAkC;AAC5C,SAAK,qBAAqB,SAAS,sBAAsB;AACzD,SAAK,qBAAqB,SAAS,sBAAsB;AACzD,SAAK,oBAAoB,SAAS,qBAAqB;AACvD,SAAK,mBAAmB,SAAS;AAAA,EACnC;AAAA,EAEA,MAAM,OAAO,cAAsB,MAAgD;AACjF,UAAM,EAAE,SAAS,KAAK,IAAI;AAAA,MACxB,KAAK;AAAA,MACL;AAAA,MACA,KAAK;AAAA,IACP;AAEA,UAAM,SAAS,aAAa,KAAK,WAAW;AAE5C,IAAAD,SAAO,KAAK,EAAE,MAAM,KAAK,MAAM,SAAS,MAAM,aAAa,KAAK,aAAa,KAAK,OAAO,GAAG,0BAA0B;AAEtH,UAAM,oBAAoB,CAAC,UAAU,KAAK;AAE1C,QAAI;AACJ,QAAI,QAAQ;AACV,cAAQ,CAAC,QAAQ,QAAQ,MAAM;AAAA,IACjC,WAAW,mBAAmB;AAC5B,cAAQ,CAAC,UAAU,QAAQ,MAAM;AAAA,IACnC,OAAO;AACL,cAAQ;AAAA,IACV;AAEA,UAAM,QAAQE,OAAM,SAAS,MAAM;AAAA,MACjC,KAAK;AAAA,MACL,UAAU,CAAC;AAAA,MACX;AAAA,IACF,CAAC;AAED,UAAM,cAAc,MAAM,IAAI,QAA4C,CAACC,aAAY;AACrF,YAAM,GAAG,SAAS,CAAC,QAAQ;AACzB,QAAAA,SAAQ,EAAE,OAAO,IAAI,CAAC;AAAA,MACxB,CAAC;AAED,UAAI,MAAM,OAAO,MAAM;AACrB,QAAAA,SAAQ,EAAE,KAAK,MAAM,IAAI,CAAC;AAAA,MAC5B,OAAO;AACL,cAAM,KAAK,SAAS,MAAM;AACxB,cAAI,MAAM,OAAO,MAAM;AACrB,YAAAA,SAAQ,EAAE,OAAO,IAAI,MAAM,mCAAmC,EAAE,CAAC;AACjE;AAAA,UACF;AACA,UAAAA,SAAQ,EAAE,KAAK,MAAM,IAAI,CAAC;AAAA,QAC5B,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,QAAI,WAAW,aAAa;AAC1B,YAAM,IAAIC,kBAAiB,KAAK,MAAM,YAAY,KAAK;AAAA,IACzD;AAEA,UAAM,MAAM,YAAY;AAExB,QAAI,CAAC,QAAQ;AACX,YAAM,MAAM;AAAA,IACd;AAEA,QAAI,YAAY;AAChB,UAAM,KAAK,QAAQ,MAAM;AAAE,kBAAY;AAAA,IAAM,CAAC;AAE9C,UAAM,GAAG,SAAS,CAAC,QAAQ;AACzB,MAAAJ,SAAO,MAAM,EAAE,MAAM,KAAK,MAAM,KAAK,OAAO,IAAI,GAAG,mCAAmC;AAAA,IACxF,CAAC;AAED,QAAI,KAAK,qBAAqB,GAAG;AAC/B,YAAM,MAAM,KAAK,kBAAkB;AAEnC,UAAI,aAAa,CAAC,eAAe,GAAG,GAAG;AACrC,cAAM,IAAII;AAAA,UACR,KAAK;AAAA,UACL,IAAI,MAAM,+CAA+C,GAAG,aAAa,OAAO,GAAG;AAAA,QACrF;AAAA,MACF;AAAA,IACF;AAEA,IAAAJ,SAAO,KAAK,EAAE,MAAM,KAAK,MAAM,KAAK,SAAS,KAAK,OAAO,GAAG,yBAAyB;AAErF,QAAI,qBAAqB,MAAM,UAAU,MAAM,QAAQ;AACrD,YAAM,YAAY,IAAI,iBAAiB,cAAc,KAAK,gBAAgB;AAC1E,UAAI;AACF,cAAM,UAAU,WAAW;AAC3B,kBAAU,OAAO,MAAM,QAAQ,MAAM,MAAM;AAC3C,aAAK,WAAW,IAAI,KAAK,MAAM,SAAS;AACxC,QAAAA,SAAO,MAAM,EAAE,MAAM,KAAK,KAAK,GAAG,6BAA6B;AAAA,MACjE,SAAS,KAAK;AACZ,QAAAA,SAAO,KAAK,EAAE,MAAM,KAAK,MAAM,OAAO,IAAI,GAAG,iEAAiE;AAAA,MAChH;AAAA,IACF;AAEA,UAAM,SAAuB;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,cAAc,KAAK;AAAA,IACrB;AAEA,QAAI,UAAU,MAAM,SAAS,MAAM,UAAU,MAAM,QAAQ;AACzD,aAAO,QAAQ;AAAA,QACb,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM;AAAA,QACd,QAAQ,MAAM;AAAA,MAChB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,cAAoD;AAC/D,WAAO,KAAK,WAAW,IAAI,YAAY;AAAA,EACzC;AAAA,EAEA,MAAM,UAAU,cAA2C;AACzD,UAAM,EAAE,KAAK,aAAa,IAAI;AAE9B,UAAM,YAAY,KAAK,WAAW,IAAI,YAAY;AAClD,QAAI,WAAW;AACb,YAAM,UAAU,MAAM,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AACtC,WAAK,WAAW,OAAO,YAAY;AAAA,IACrC;AAEA,QAAI,CAAC,eAAe,GAAG,GAAG;AACxB,MAAAA,SAAO,KAAK,EAAE,cAAc,IAAI,GAAG,wBAAwB;AAC3D;AAAA,IACF;AAEA,IAAAA,SAAO,KAAK,EAAE,cAAc,IAAI,GAAG,iBAAiB;AACpD,eAAW,KAAK,SAAS;AAEzB,UAAM,WAAW,KAAK,IAAI,IAAI,KAAK;AACnC,UAAM,eAAe;AAErB,WAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,YAAM,MAAM,YAAY;AACxB,UAAI,CAAC,eAAe,GAAG,GAAG;AACxB,QAAAA,SAAO,KAAK,EAAE,cAAc,IAAI,GAAG,+BAA+B;AAClE;AAAA,MACF;AAAA,IACF;AAEA,IAAAA,SAAO,KAAK,EAAE,cAAc,IAAI,GAAG,qDAAqD;AACxF,eAAW,KAAK,SAAS;AACzB,UAAM,MAAM,GAAG;AAEf,QAAI,eAAe,GAAG,GAAG;AACvB,MAAAA,SAAO,MAAM,EAAE,cAAc,IAAI,GAAG,mCAAmC;AAAA,IACzE,OAAO;AACL,MAAAA,SAAO,KAAK,EAAE,cAAc,IAAI,GAAG,6BAA6B;AAAA,IAClE;AAAA,EACF;AACF;;;AE7KO,SAAS,eAAe,QAAiD;AAC9E,QAAM,OAAO,QAAQ,SAAS,QAAQ,IAAI,yBAAyB,SAAS,SAAS;AAErF,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,IAAI,aAAa;AAAA,IAC1B,KAAK;AACH,aAAO,IAAI,gBAAgB,QAAQ,cAAc;AAAA,EACrD;AACF;;;AC5BA,SAAS,KAAAK,UAAS;AAIlB,IAAM,wBAAwBC,GAC3B,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,SAASA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA,EACnC,cAAcA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAC7C,CAAC,EACA,YAAY;AAER,IAAM,eAAN,cAA2B,qBAAsC;AAAA,EACnD,gBAAgB;AAAA,EAEnC,cAAc;AACZ,UAAM,eAAe;AAAA,EACvB;AAAA;AAAA,EAGA,aAAa,QAAmC;AAC9C,UAAM,WAAW,OAAO,IAAI,CAAC,MAAM;AACjC,YAAM,SAAS,MAAM,EAAE,IAAI;AAC3B,YAAM,OAAO,EAAE,cAAc;AAAA,IAAO,EAAE,WAAW;AAAA,IAAO;AACxD,aAAO,GAAG,MAAM,GAAG,IAAI;AAAA,EAAK,EAAE,OAAO;AAAA,IACvC,CAAC;AACD,WAAO;AAAA;AAAA,EAAqB,SAAS,KAAK,aAAa,CAAC;AAAA;AAAA,EAC1D;AAAA,EAEA,SAAS,MAAe,SAA0D;AAChF,UAAM,SAAS,sBAAsB,UAAU,IAAI;AACnD,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,OAAO,MAAM,OAAO,IAAI,CAAC,OAAO;AAAA,UACtC,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,GAAG;AAAA,UACjC,SAAS,EAAE;AAAA,UACX,UAAU;AAAA,QACZ,EAAE;AAAA,QACF,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AACA,WAAO,EAAE,OAAO,MAAM,MAAM,OAAO,MAAM,QAAQ,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,EACpE;AACF;;;AChDA,SAAS,KAAAC,UAAS;AAIlB,IAAM,yBAAyBC,GAC5B,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,SAASA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAC1C,CAAC,EACA,YAAY;AAER,IAAM,gBAAN,cAA4B,qBAAuC;AAAA,EACrD,gBAAgB;AAAA,EAEnC,cAAc;AACZ,UAAM,gBAAgB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,QAA0B,WAA4C;AACjF,QAAI,CAAC,UAAW,QAAO,OAAO;AAC9B,WAAO,OAAO,QAAQ;AAAA,MACpB;AAAA,MACA,CAAC,QAAgB,QAAgB,UAAU,GAAG,KAAK,KAAK,GAAG;AAAA,IAC7D;AAAA,EACF;AAAA;AAAA,EAGA,cAAc,SAA6B,WAA4C;AACrF,UAAM,WAAW,QAAQ,IAAI,CAAC,MAAM;AAClC,YAAM,SAAS,MAAM,EAAE,IAAI;AAC3B,YAAM,OAAO,EAAE,cAAc;AAAA,IAAO,EAAE,WAAW;AAAA,IAAO;AACxD,YAAM,UAAU,KAAK,aAAa,GAAG,SAAS;AAC9C,aAAO,GAAG,MAAM,GAAG,IAAI;AAAA,EAAK,OAAO;AAAA,IACrC,CAAC;AACD,WAAO;AAAA;AAAA,EAAuB,SAAS,KAAK,aAAa,CAAC;AAAA;AAAA,EAC5D;AAAA,EAEA,SAAS,MAAe,SAA2D;AACjF,UAAM,SAAS,uBAAuB,UAAU,IAAI;AACpD,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,OAAO,MAAM,OAAO,IAAI,CAAC,OAAO;AAAA,UACtC,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,GAAG;AAAA,UACjC,SAAS,EAAE;AAAA,UACX,UAAU;AAAA,QACZ,EAAE;AAAA,QACF,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AACA,WAAO,EAAE,OAAO,MAAM,MAAM,OAAO,MAAM,QAAQ,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,EACpE;AACF;;;AC1DA,SAAS,KAAAC,UAAS;AAIlB,IAAM,4BAA4BC,GAC/B,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,SAASA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,KAAKA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,EAAE,SAAS;AACjD,CAAC,EACA,YAAY;AAER,IAAM,mBAAN,cAA+B,qBAA0C;AAAA,EAC3D,gBAAgB;AAAA,EAEnC,cAAc;AACZ,UAAM,oBAAoB;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,SAAyD;AACvE,UAAM,aAAgG,CAAC;AACvG,eAAW,UAAU,SAAS;AAC5B,iBAAW,OAAO,IAAI,IAAI;AAAA,QACxB,SAAS,OAAO;AAAA,QAChB,MAAM,OAAO,QAAQ,CAAC;AAAA,QACtB,GAAI,OAAO,OAAO,OAAO,KAAK,OAAO,GAAG,EAAE,SAAS,IAAI,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC;AAAA,MAChF;AAAA,IACF;AACA,WAAO,EAAE,WAAW;AAAA,EACtB;AAAA,EAEA,SAAS,MAAe,SAA8D;AACpF,UAAM,SAAS,0BAA0B,UAAU,IAAI;AACvD,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,OAAO,MAAM,OAAO,IAAI,CAAC,OAAO;AAAA,UACtC,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,GAAG;AAAA,UACjC,SAAS,EAAE;AAAA,UACX,UAAU;AAAA,QACZ,EAAE;AAAA,QACF,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AACA,WAAO,EAAE,OAAO,MAAM,MAAM,OAAO,MAAM,QAAQ,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,EACpE;AACF;;;ACpDA,SAAS,KAAAC,UAAS;AAIlB,IAAM,2BAA2BC,GAC9B,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,SAASA,GAAE,OAAO,EAAE,IAAI,CAAC;AAC3B,CAAC,EACA,YAAY;AAER,IAAM,kBAAN,cAA8B,qBAAyC;AAAA,EACzD,gBAAgB;AAAA,EAEnC,cAAc;AACZ,UAAM,kBAAkB;AAAA,EAC1B;AAAA;AAAA,EAGA,eAAe,UAAsC;AACnD,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,SAAS,MAAe,SAA6D;AACnF,UAAM,SAAS,yBAAyB,UAAU,IAAI;AACtD,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,OAAO,MAAM,OAAO,IAAI,CAAC,OAAO;AAAA,UACtC,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,GAAG;AAAA,UACjC,SAAS,EAAE;AAAA,UACX,UAAU;AAAA,QACZ,EAAE;AAAA,QACF,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AACA,WAAO,EAAE,OAAO,MAAM,MAAM,OAAO,MAAM,QAAQ,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,EACpE;AACF;;;ACvCA,SAAS,KAAAC,UAAS;AAIlB,IAAM,yBAAyBC,GAC5B,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,MAAMA,GAAE,KAAK,CAAC,OAAO,QAAQ,QAAQ,CAAC;AAAA,EACtC,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,QAAQA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACnD,SAASA,GAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAC9C,CAAC,EACA,YAAY;AAER,IAAM,gBAAN,cAA4B,qBAAuC;AAAA,EACrD,gBAAgB;AAAA,EAEnC,cAAc;AACZ,UAAM,gBAAgB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,SAAqC;AACrD,UAAM,UAAU,QACb,OAAO,CAAC,MAAM,EAAE,YAAY,KAAK,EACjC,IAAI,CAAC,MAAM;AACV,UAAI,EAAE,SAAS,OAAO;AACpB,eAAO,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,EAAE,OAAO;AAAA,MAClE;AACA,aAAO,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,QAAQ,EAAE,QAAQ,GAAG,EAAE,OAAO;AAAA,IACrE,CAAC;AACH,WAAO,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,SAAqC;AACxD,UAAM,kBAAkB,QACrB,OAAO,CAAC,MAAM,EAAE,YAAY,SAAS,EAAE,SAAS,KAAK,EACrD,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI;AAChC,WAAO,KAAK,UAAU,EAAE,gBAAgB,GAAG,MAAM,CAAC;AAAA,EACpD;AAAA,EAEA,SAAS,MAAe,SAA2D;AACjF,UAAM,SAAS,uBAAuB,UAAU,IAAI;AACpD,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,OAAO,MAAM,OAAO,IAAI,CAAC,OAAO;AAAA,UACtC,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,GAAG;AAAA,UACjC,SAAS,EAAE;AAAA,UACX,UAAU;AAAA,QACZ,EAAE;AAAA,QACF,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AACA,WAAO,EAAE,OAAO,MAAM,MAAM,OAAO,MAAM,QAAQ,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,EACpE;AACF;;;AC9DA,SAAS,gBAAAC,sBAAoB;AAE7B,IAAMC,WAASD,eAAa,4BAA4B;AAyBxD,IAAM,eAAuC;AAAA,EAC3C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AACR;AAQO,IAAM,2BAAN,MAA+B;AAAA,EAC5B;AAAA,EAER,YAAY,QAA2B;AACrC,SAAK,SAAS,EAAE,GAAG,OAAO;AAAA,EAC5B;AAAA,EAEA,aAAa,QAAiC;AAC5C,SAAK,SAAS,EAAE,GAAG,OAAO;AAC1B,IAAAC,SAAO,KAAK,kCAAkC;AAAA,EAChD;AAAA,EAEA,YAAyC;AACvC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,UAAwC;AAC/C,UAAM,WAAW,KAAK,gBAAgB,QAAQ;AAC9C,UAAM,UAAU,KAAK,eAAe,QAAQ;AAG5C,UAAM,YAAY,KAAK,UAAU,KAAK,OAAO,MAAM,UAAU,OAAO;AACpE,QAAI,WAAW;AACb,aAAO,EAAE,QAAQ,QAAQ,aAAa,UAAU;AAAA,IAClD;AAGA,UAAM,WAAW,KAAK,UAAU,KAAK,OAAO,KAAK,UAAU,OAAO;AAClE,QAAI,UAAU;AACZ,aAAO,EAAE,QAAQ,OAAO,aAAa,SAAS;AAAA,IAChD;AAGA,UAAM,aAAa,KAAK,UAAU,KAAK,OAAO,OAAO,UAAU,OAAO;AACtE,QAAI,YAAY;AACd,aAAO,EAAE,QAAQ,SAAS,aAAa,WAAW;AAAA,IACpD;AAGA,UAAM,OAAO,KAAK,OAAO,eAAe;AACxC,QAAI,SAAS,qBAAqB;AAChC,aAAO,EAAE,QAAQ,QAAQ;AAAA,IAC3B;AACA,WAAO,EAAE,QAAQ,OAAO;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aACE,UACA,SACsE;AACtE,QAAI,SAAS,WAAW,SAAS;AAC/B,YAAM,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,SAAS,cAAc;AACpF,UAAI,IAAK,QAAO,EAAE,SAAS,YAAY,UAAU,IAAI,SAAS;AAAA,IAChE;AACA,QAAI,SAAS,WAAW,QAAQ;AAC9B,YAAM,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,SAAS,eAAe;AACtF,UAAI,IAAK,QAAO,EAAE,SAAS,YAAY,UAAU,IAAI,SAAS;AAC9D,aAAO,EAAE,SAAS,YAAY;AAAA,IAChC;AAEA,WAAO,EAAE,SAAS,YAAY;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAgB,UAAgC;AACtD,QAAI,SAAS,OAAO;AAClB,YAAM,WAAW,SAAS,MAAM,QAAQ,GAAG;AAC3C,UAAI,WAAW,GAAG;AAChB,cAAM,SAAS,SAAS,MAAM,MAAM,GAAG,QAAQ,EAAE,KAAK;AACtD,YAAI,UAAU,mBAAmB,KAAK,MAAM,GAAG;AAC7C,iBAAO;AAAA,QACT;AAAA,MACF;AACA,YAAM,QAAQ,SAAS,MAAM,MAAM,sBAAsB;AACzD,UAAI,QAAQ,CAAC,EAAG,QAAO,MAAM,CAAC;AAE9B,YAAM,aAAa,SAAS,MAAM,MAAM,iCAAiC;AACzE,UAAI,aAAa,CAAC,EAAG,QAAO,WAAW,CAAC;AAAA,IAC1C;AAEA,QAAI,SAAS,MAAM;AACjB,YAAM,SAAS,aAAa,SAAS,IAAI;AACzC,UAAI,OAAQ,QAAO;AAAA,IACrB;AAEA,WAAO,SAAS,QAAQ;AAAA,EAC1B;AAAA,EAEQ,eAAe,UAA4C;AACjE,QAAI,CAAC,SAAS,MAAO,QAAO;AAC5B,UAAM,WAAW,SAAS,MAAM,QAAQ,GAAG;AAC3C,QAAI,WAAW,GAAG;AAChB,aAAO,SAAS,MAAM,MAAM,WAAW,CAAC,EAAE,KAAK;AAAA,IACjD;AACA,UAAM,UAAU,SAAS,MAAM,MAAM,wCAAwC;AAC7E,QAAI,UAAU,CAAC,EAAG,QAAO,QAAQ,CAAC,EAAE,KAAK;AACzC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,UACN,MACA,UACA,SACoB;AACpB,QAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO;AAEvC,eAAW,WAAW,MAAM;AAC1B,UAAI,KAAK,aAAa,SAAS,UAAU,OAAO,GAAG;AACjD,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,aAAa,SAAiB,UAAkB,SAAsC;AAC5F,QAAI,YAAY,IAAK,QAAO;AAG5B,QAAI,QAAQ,WAAW,OAAO,GAAG;AAC/B,YAAM,YAAY,SAAS,YAAY;AACvC,YAAM,eAAe,QAAQ,YAAY;AACzC,aAAO,cAAc,gBAAgB,UAAU,WAAW,eAAe,IAAI;AAAA,IAC/E;AAGA,UAAM,WAAW,QAAQ,QAAQ,GAAG;AACpC,QAAI,WAAW,KAAK,QAAQ,SAAS,GAAG,GAAG;AACzC,YAAM,cAAc,QAAQ,MAAM,GAAG,QAAQ;AAC7C,YAAM,YAAY,QAAQ,MAAM,WAAW,GAAG,EAAE;AAEhD,UAAI,CAAC,KAAK,gBAAgB,aAAa,QAAQ,EAAG,QAAO;AACzD,UAAI,CAAC,QAAS,QAAO;AACrB,aAAO,UAAU,WAAW,OAAO;AAAA,IACrC;AAGA,WAAO,KAAK,gBAAgB,SAAS,QAAQ;AAAA,EAC/C;AAAA,EAEQ,gBAAgB,aAAqB,UAA2B;AACtE,WAAO,YAAY,YAAY,MAAM,SAAS,YAAY;AAAA,EAC5D;AACF;AAMO,SAAS,UAAU,SAAiB,OAAwB;AACjE,QAAM,QAAQ,YAAY,OAAO;AACjC,SAAO,MAAM,KAAK,KAAK;AACzB;AAEA,SAAS,YAAY,SAAyB;AAC5C,MAAI,WAAW;AACf,MAAI,IAAI;AACR,SAAO,IAAI,QAAQ,QAAQ;AACzB,UAAM,KAAK,QAAQ,OAAO,CAAC;AAC3B,QAAI,OAAO,OAAO,QAAQ,OAAO,IAAI,CAAC,MAAM,KAAK;AAC/C,kBAAY;AACZ,WAAK;AACL,UAAI,QAAQ,OAAO,CAAC,MAAM,IAAK;AAAA,IACjC,WAAW,OAAO,KAAK;AACrB,kBAAY;AACZ;AAAA,IACF,WAAW,OAAO,KAAK;AACrB,kBAAY;AACZ;AAAA,IACF,OAAO;AACL,kBAAY,YAAY,EAAE;AAC1B;AAAA,IACF;AAAA,EACF;AACA,cAAY;AACZ,SAAO,IAAI,OAAO,UAAU,GAAG;AACjC;AAEA,SAAS,YAAY,KAAqB;AACxC,SAAO,IAAI,QAAQ,uBAAuB,MAAM;AAClD;;;AC5PA,SAAS,gBAAAC,sBAAoB;AAG7B,IAAMC,WAASD,eAAa,kBAAkB;AAkBvC,IAAM,wBAAN,MAA4B;AAAA,EAChB;AAAA,EAEjB,YAAY,cAAuB;AACjC,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,IAAI,OAA6B,QAAyE;AACxG,UAAM,QAAoB;AAAA,MACxB;AAAA,MACA,cAAc,KAAK;AAAA,MACnB,GAAG;AAAA,MACH,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AACA,IAAAC,SAAO,KAAK,OAAO,WAAW,KAAK,EAAE;AAAA,EACvC;AAAA,EAEA,cAAc,UAAwB,UAAgC;AACpE,SAAK,IAAI,wBAAwB,EAAE,UAAU,SAAS,CAAC;AAAA,EACzD;AAAA,EAEA,YAAY,cAAsB,QAAuB;AACvD,SAAK,IAAI,uBAAuB;AAAA,MAC9B;AAAA,MACA,QAAQ,SAAS,EAAE,OAAO,IAAI;AAAA,IAChC,CAAC;AAAA,EACH;AAAA,EAEA,YAAY,aAA2B;AACrC,SAAK,IAAI,uBAAuB,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AAAA,EAC7D;AAAA,EAEA,WAAW,QAAsB;AAC/B,SAAK,IAAI,sBAAsB,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAAA,EACvD;AACF;;;ACxDA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,gBAAAC,sBAAoB;AAE7B,IAAMC,WAASD,eAAa,kBAAkB;AAE9C,IAAM,sBAAsB,KAAK,KAAK;AACtC,IAAM,wBAAwB,KAAK;AAgC5B,IAAM,kBAAN,MAAsB;AAAA,EACnB,WAAW,oBAAI,IAA0B;AAAA,EACzC,aAAoD;AAAA,EAC3C;AAAA,EACT;AAAA,EAER,YAAY,SAAkC;AAC5C,SAAK,mBAAmB,SAAS,oBAAoB;AACrD,UAAM,WAAW,SAAS,sBAAsB;AAChD,SAAK,aAAa,YAAY,MAAM,KAAK,aAAa,GAAG,QAAQ;AACjE,SAAK,WAAW,MAAM;AAAA,EACxB;AAAA;AAAA,EAGA,SAAS,UAAiD;AACxD,SAAK,mBAAmB;AAAA,EAC1B;AAAA;AAAA,EAGA,OAAO,MAA0C;AAC/C,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,UAAM,UAAwB;AAAA,MAC5B,WAAWD,YAAW;AAAA,MACtB,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK;AAAA,MACf,OAAO;AAAA,MACP,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,WAAW,KAAK,aAAa,KAAK;AAAA,IACpC;AACA,SAAK,SAAS,IAAI,QAAQ,WAAW,OAAO;AAC5C,IAAAE,SAAO,KAAK,EAAE,WAAW,QAAQ,WAAW,WAAW,KAAK,WAAW,UAAU,KAAK,SAAS,GAAG,iBAAiB;AACnH,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,WAA6C;AAC/C,WAAO,KAAK,SAAS,IAAI,SAAS;AAAA,EACpC;AAAA;AAAA,EAGA,KAAK,WAAoC;AACvC,UAAM,MAAM,MAAM,KAAK,KAAK,SAAS,OAAO,CAAC;AAC7C,WAAO,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,cAAc,SAAS,IAAI;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAyB;AAC7B,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,QAAI,CAAC,WAAW,QAAQ,UAAU,UAAW;AAC7C,YAAQ,kBAAiB,oBAAI,KAAK,GAAE,YAAY;AAChD,YAAQ,QAAQ;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,WAAyB;AAC/B,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,QAAI,CAAC,WAAW,QAAQ,UAAU,UAAW;AAC7C,YAAQ,WAAW;AACnB,YAAQ,QAAQ;AAChB,YAAQ,kBAAiB,oBAAI,KAAK,GAAE,YAAY;AAChD,IAAAA,SAAO,KAAK,EAAE,WAAW,WAAW,QAAQ,UAAU,GAAG,0BAA0B;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,WAAmB,UAA2B;AACnD,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,QAAI,CAAC,WAAW,QAAQ,UAAU,UAAW,QAAO;AACpD,QAAI,QAAQ,UAAU,YAAY,QAAQ,aAAa,KAAM,QAAO;AAEpE,YAAQ,WAAW;AACnB,YAAQ,QAAQ;AAChB,YAAQ,kBAAiB,oBAAI,KAAK,GAAE,YAAY;AAChD,IAAAA,SAAO,KAAK,EAAE,WAAW,UAAU,WAAW,QAAQ,UAAU,GAAG,iBAAiB;AACpF,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,WAA4B;AAChC,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,QAAI,CAAC,QAAS,QAAO;AACrB,SAAK,SAAS,OAAO,SAAS;AAC9B,IAAAA,SAAO,KAAK,EAAE,WAAW,WAAW,QAAQ,UAAU,GAAG,gBAAgB;AACzE,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,aAAa,WAA2B;AACtC,QAAI,QAAQ;AACZ,eAAW,CAAC,IAAI,OAAO,KAAK,KAAK,UAAU;AACzC,UAAI,QAAQ,cAAc,WAAW;AACnC,aAAK,SAAS,OAAO,EAAE;AACvB;AAAA,MACF;AAAA,IACF;AACA,QAAI,QAAQ,GAAG;AACb,MAAAA,SAAO,KAAK,EAAE,WAAW,MAAM,GAAG,2BAA2B;AAAA,IAC/D;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,OAAe;AACjB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA,EAGA,UAAgB;AACd,QAAI,KAAK,YAAY;AACnB,oBAAc,KAAK,UAAU;AAC7B,WAAK,aAAa;AAAA,IACpB;AACA,SAAK,SAAS,MAAM;AAAA,EACtB;AAAA,EAEQ,eAAqB;AAC3B,UAAM,MAAM,KAAK,IAAI;AACrB,eAAW,CAAC,IAAI,OAAO,KAAK,KAAK,UAAU;AACzC,UAAI,QAAQ,UAAU,OAAQ;AAE9B,YAAM,eAAe,IAAI,KAAK,QAAQ,cAAc,EAAE,QAAQ;AAC9D,UAAI,MAAM,eAAe,QAAQ,WAAW;AAC1C,gBAAQ,QAAQ;AAChB,aAAK,SAAS,OAAO,EAAE;AACvB,QAAAA,SAAO,KAAK,EAAE,WAAW,IAAI,WAAW,QAAQ,WAAW,QAAQ,MAAM,aAAa,GAAG,uBAAuB;AAChH,aAAK,mBAAmB,OAAO;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AACF;;;AChLA,SAAS,QAAAC,cAAY;AACrB,SAAS,SAAAC,SAAO,MAAAC,WAAU;AAC1B,SAAS,YAAAC,iBAAgB;AACzB,SAAS,iBAAiB;AAE1B,SAAS,gBAAAC,sBAAoB;;;ACL7B,SAAS,YAAAC,WAAU,WAAAC,UAAS,QAAAC,aAAY;AACxC,SAAS,QAAAC,QAAM,WAAAC,gBAAe;AAY9B,SAAS,gBAAAC,sBAAoB;AAG7B,IAAMC,WAASD,eAAa,cAAc;AAEnC,IAAM,cAAN,MAA6C;AAAA,EACzC,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EAET,YAAY,aAAqB,QAA2B;AAC1D,SAAK,cAAc;AACnB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,aAAqB;AACnB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,MAAM,QAA8B;AAClC,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA,EAEA,MAAM,OAA6B;AACjC,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA,EAEA,MAAM,UAAyB;AAAA,EAE/B;AAAA,EAEA,MAAc,cAAoC;AAChD,UAAM,UAAU,KAAK,OAAO;AAC5B,UAAM,WAAW,MAAM,KAAK,aAAa,OAAO;AAEhD,UAAM,CAAC,QAAQ,SAAS,YAAY,WAAW,UAAU,SAAS,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC/F,KAAK,YAA6B,SAAS,SAAS,YAAY,QAAQ,QAAQ;AAAA,MAChF,KAAK,YAA8B,SAAS,SAAS,YAAY,SAAS,SAAS;AAAA,MACnF,KAAK,YAAiC,SAAS,SAAS,YAAY,KAAK,KAAK;AAAA,MAC9E,KAAK,YAAgC,SAAS,SAAS,YAAY,WAAW,WAAW;AAAA,MACzF,KAAK,YAA+B,SAAS,SAAS,YAAY,UAAU,UAAU;AAAA,MACtF,KAAK,YAAY,SAAS,SAAS,OAAO;AAAA,MAC1C,KAAK,YAA2B,SAAS,SAAS,YAAY,WAAW,WAAW;AAAA,IACtF,CAAC;AAED,IAAAC,SAAO,KAAK,EAAE,aAAa,KAAK,aAAa,QAAQ,GAAG,sBAAsB;AAC9E,WAAO,EAAE,UAAU,QAAQ,SAAS,YAAY,WAAW,UAAU,SAAS,UAAU;AAAA,EAC1F;AAAA,EAEA,MAAc,aAAa,SAA2C;AACpE,UAAM,eAAeH,OAAK,SAAS,aAAa;AAChD,QAAI;AACF,YAAM,MAAM,MAAMH,UAAS,cAAc,OAAO;AAChD,aAAO,KAAK,MAAM,GAAG;AAAA,IACvB,QAAQ;AACN,MAAAM,SAAO,MAAM,EAAE,QAAQ,GAAG,4CAA4C;AACtE,aAAO,EAAE,MAAM,KAAK,YAAY;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,MAAc,YACZ,SACA,eACA,QACc;AACd,QAAI,eAAe;AACjB,YAAMC,SAAa,CAAC;AACpB,iBAAW,WAAW,eAAe;AACnC,YAAI;AACF,gBAAM,MAAM,MAAMP,UAASG,OAAK,SAAS,OAAO,GAAG,OAAO;AAC1D,UAAAI,OAAM,KAAK,KAAK,MAAM,GAAG,CAAM;AAAA,QACjC,SAAS,KAAK;AACZ,UAAAD,SAAO,KAAK,EAAE,MAAM,SAAS,OAAO,IAAI,GAAG,wCAAwC;AAAA,QACrF;AAAA,MACF;AACA,aAAOC;AAAA,IACT;AAEA,UAAM,UAAUJ,OAAK,SAAS,MAAM;AACpC,QAAI;AACF,YAAM,UAAU,MAAMD,MAAK,OAAO;AAClC,UAAI,CAAC,QAAQ,YAAY,EAAG,QAAO,CAAC;AAAA,IACtC,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,UAAU,MAAMD,SAAQ,OAAO;AACrC,UAAM,QAAa,CAAC;AAEpB,eAAW,QAAQ,SAAS;AAC1B,UAAIG,SAAQ,IAAI,MAAM,QAAS;AAC/B,YAAM,WAAWD,OAAK,SAAS,IAAI;AACnC,UAAI;AACF,cAAM,WAAW,MAAMD,MAAK,QAAQ;AACpC,YAAI,CAAC,SAAS,OAAO,EAAG;AACxB,cAAM,MAAM,MAAMF,UAAS,UAAU,OAAO;AAC5C,cAAM,KAAK,KAAK,MAAM,GAAG,CAAM;AAAA,MACjC,SAAS,KAAK;AACZ,QAAAM,SAAO,KAAK,EAAE,MAAM,OAAO,IAAI,GAAG,kBAAkB,MAAM,iBAAiB;AAAA,MAC7E;AAAA,IACF;AAGA,eAAW,SAAS,SAAS;AAC3B,UAAIF,SAAQ,KAAK,MAAM,QAAS;AAChC,YAAM,aAAaD,OAAK,SAAS,KAAK;AACtC,UAAI;AACF,cAAM,UAAU,MAAMD,MAAK,UAAU;AACrC,YAAI,CAAC,QAAQ,YAAY,EAAG;AAC5B,cAAM,eAAeC,OAAK,YAAY,eAAe;AACrD,cAAM,OAAO,MAAMH,UAAS,cAAc,OAAO;AACjD,cAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,YAAI,OAAO,OAAO,YAAY,YAAY,OAAO,QAAQ,SAAS,KAAK,GAAG;AACxE,cAAI;AACF,kBAAM,UAAU,MAAMA,UAASG,OAAK,YAAY,OAAO,OAAO,GAAG,OAAO;AACxE,mBAAO,UAAU;AAAA,UACnB,QAAQ;AAAA,UAER;AAAA,QACF;AACA,YAAI,CAAC,OAAO,KAAM,QAAO,OAAO;AAChC,cAAM,KAAK,MAAW;AAAA,MACxB,QAAQ;AAAA,MAER;AAAA,IACF;AAGA,QAAI,WAAW,UAAU;AACvB,YAAM,EAAE,aAAa,IAAI,MAAM,OAAO,+BAAmB;AACzD,iBAAW,SAAS,SAAS;AAC3B,YAAIC,SAAQ,KAAK,MAAM,QAAS;AAChC,cAAM,aAAaD,OAAK,SAAS,KAAK;AACtC,YAAI;AACF,gBAAM,UAAU,MAAMD,MAAK,UAAU;AACrC,cAAI,CAAC,QAAQ,YAAY,EAAG;AAC5B,gBAAM,cAAcC,OAAK,YAAY,UAAU;AAC/C,gBAAM,QAAQ,MAAM,aAAa,WAAW;AAC5C,cAAI,SAAS,CAAE,MAAkC,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,IAAI,GAAG;AACnF,kBAAM,KAAK,KAAqB;AAAA,UAClC;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,YACZ,SACA,eAC6B;AAC7B,WAAO,KAAK,YAA8B,SAAS,eAAe,SAAS;AAAA,EAC7E;AACF;;;ADhKA,IAAM,gBAAgB,UAAUK,SAAQ;AACxC,IAAMC,WAASC,eAAa,eAAe;AAMpC,IAAM,eAAN,MAA8C;AAAA,EAC1C,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACQ;AAAA,EAEjB,YAAY,aAAqB,QAA4B,UAAkB;AAC7E,SAAK,cAAc;AACnB,SAAK,SAAS;AACd,SAAK,WAAWC,OAAK,UAAU,WAAW;AAAA,EAC5C;AAAA,EAEA,aAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,QAA8B;AAClC,UAAM,KAAK,MAAM;AACjB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,MAAM,OAA6B;AACjC,QAAI;AACF,YAAM,KAAK,KAAK;AAAA,IAClB,QAAQ;AACN,MAAAF,SAAO,KAAK,yBAAyB;AACrC,YAAM,KAAK,MAAM;AAAA,IACnB;AACA,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,MAAM,UAAyB;AAC7B,UAAMG,IAAG,KAAK,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACxD,IAAAH,SAAO,MAAM,EAAE,UAAU,KAAK,SAAS,GAAG,eAAe;AAAA,EAC3D;AAAA,EAEA,MAAc,QAAuB;AACnC,UAAMG,IAAG,KAAK,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACxD,UAAMC,QAAM,KAAK,UAAU,EAAE,WAAW,KAAK,CAAC;AAC9C,UAAM,SAAS,KAAK,OAAO,UAAU;AACrC,UAAM,OAAO,CAAC,SAAS,WAAW,KAAK,YAAY,QAAQ,KAAK,OAAO,KAAK,KAAK,QAAQ;AACzF,IAAAJ,SAAO,KAAK,EAAE,KAAK,KAAK,OAAO,KAAK,OAAO,GAAG,oBAAoB;AAClE,UAAM,cAAc,OAAO,MAAM,EAAE,SAAS,IAAO,CAAC;AAAA,EACtD;AAAA,EAEA,MAAc,OAAsB;AAClC,UAAM,cAAc,OAAO,CAAC,QAAQ,WAAW,GAAG,GAAG;AAAA,MACnD,KAAK,KAAK;AAAA,MACV,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,aAAmC;AAC/C,UAAM,cAAc,IAAI,YAAY,KAAK,aAAa,EAAE,MAAM,SAAS,MAAM,KAAK,SAAS,CAAC;AAC5F,WAAO,YAAY,MAAM;AAAA,EAC3B;AACF;;;AExEA,SAAS,YAAAK,WAAU,aAAAC,YAAW,SAAAC,eAAa;AAC3C,SAAS,QAAAC,cAAY;AAmBrB,SAAS,gBAAAC,sBAAoB;;;ACHtB,SAAS,wBAAoC;AAClD,SAAO,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,GAAG,WAAW,CAAC,GAAG,oBAAoB,MAAM;AACzF;AAGO,SAAS,iBAAiB,SAAmC;AAClE,QAAM,SAAS,sBAAsB;AACrC,aAAW,KAAK,SAAS;AACvB,WAAO,MAAM,KAAK,GAAG,EAAE,KAAK;AAC5B,WAAO,QAAQ,KAAK,GAAG,EAAE,OAAO;AAChC,WAAO,QAAQ,KAAK,GAAG,EAAE,OAAO;AAChC,WAAO,UAAU,KAAK,GAAG,EAAE,SAAS;AACpC,QAAI,EAAE,mBAAoB,QAAO,qBAAqB;AAAA,EACxD;AACA,SAAO;AACT;;;ADlBO,IAAM,sBAAsB;AAC5B,IAAM,wBAAsC;AAAA,EACjD,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AACV;AAcA,IAAMC,WAASC,eAAa,gBAAgB;AAoBrC,IAAM,gBAAN,MAAoB;AAAA,EACR,UAAU,oBAAI,IAA6B;AAAA,EAC3C,UAAU,oBAAI,IAA8B;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAAiB,UAA6B,SAAgC;AACxF,SAAK,UAAU;AACf,SAAK,WAAW;AAChB,SAAK,kBAAkBC,OAAK,SAAS,cAAc;AACnD,SAAK,WAAWA,OAAK,SAAS,eAAe;AAC7C,SAAK,oBAAoB,SAAS,qBAAqB;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAU,MAAc,QAA4C;AACxE,QAAI,KAAK,QAAQ,IAAI,IAAI,GAAG;AAC1B,YAAM,IAAI,MAAM,WAAW,IAAI,sBAAsB;AAAA,IACvD;AACA,UAAM,SAAS,KAAK,aAAa,MAAM,MAAM;AAC7C,UAAM,SAAS,MAAM,OAAO,MAAM;AAClC,SAAK,QAAQ,IAAI,MAAM,MAAM;AAC7B,SAAK,iBAAiB,MAAM,MAAM;AAClC,UAAM,KAAK,eAAe;AAC1B,IAAAF,SAAO,KAAK,EAAE,MAAM,MAAM,OAAO,KAAK,GAAG,cAAc;AACvD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,MAAoC;AACnD,UAAM,EAAE,YAAY,IAAI,MAAM,KAAK,qBAAqB,IAAI;AAC5D,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,qBAAqB,MAAyE;AAClG,UAAM,SAAS,KAAK,iBAAiB,IAAI;AACzC,UAAM,cAAc,KAAK,mBAAmB,IAAI;AAChD,SAAK,2BAA2B,IAAI;AACpC,UAAM,SAAS,MAAM,OAAO,KAAK;AACjC,SAAK,iBAAiB,MAAM,MAAM;AAClC,UAAM,cAAc,KAAK,mBAAmB,IAAI;AAChD,UAAM,KAAK,eAAe;AAC1B,UAAM,SAAS,KAAK,gBAAgB,aAAa,WAAW;AAC5D,IAAAA,SAAO,KAAK,EAAE,MAAM,OAAO,GAAG,eAAe;AAC7C,WAAO,EAAE,aAAa,QAAQ,OAAO;AAAA,EACvC;AAAA,EAEA,MAAM,UAAyB;AAC7B,UAAM,KAAK,kBAAkB;AAAA,EAC/B;AAAA,EAEA,MAAM,oBAAqD;AACzD,UAAM,UAAwB,CAAC;AAC/B,eAAW,QAAQ,KAAK,QAAQ,KAAK,GAAG;AACtC,UAAI;AACF,cAAM,EAAE,OAAO,IAAI,MAAM,KAAK,qBAAqB,IAAI;AACvD,gBAAQ,KAAK,MAAM;AAAA,MACrB,SAAS,KAAK;AACZ,QAAAA,SAAO,KAAK,EAAE,MAAM,OAAO,IAAI,GAAG,iCAAiC;AAAA,MACrE;AAAA,IACF;AACA,WAAO,EAAE,QAAQ,iBAAiB,OAAO,EAAE;AAAA,EAC7C;AAAA,EAEA,MAAM,aAAa,MAAgC;AACjD,UAAM,SAAS,KAAK,QAAQ,IAAI,IAAI;AACpC,QAAI,CAAC,OAAQ,QAAO;AACpB,SAAK,2BAA2B,IAAI;AACpC,SAAK,wBAAwB,IAAI;AACjC,UAAM,OAAO,QAAQ;AACrB,SAAK,QAAQ,OAAO,IAAI;AACxB,UAAM,KAAK,eAAe;AAC1B,IAAAA,SAAO,KAAK,EAAE,KAAK,GAAG,gBAAgB;AACtC,WAAO;AAAA,EACT;AAAA,EAEA,cAA6B;AAC3B,WAAO,MAAM,KAAK,KAAK,QAAQ,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,MAAM,OAAO;AAAA,MACjE;AAAA,MACA,QAAQ,OAAO;AAAA,MACf,WAAU,oBAAI,KAAK,GAAE,YAAY;AAAA,IACnC,EAAE;AAAA,EACJ;AAAA,EAEA,UAAU,MAAuB;AAC/B,WAAO,KAAK,QAAQ,IAAI,IAAI;AAAA,EAC9B;AAAA;AAAA,EAGA,iBAAiB,MAAsB;AACrC,WAAO,KAAK,iBAAiB,IAAI,EAAE,WAAW;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,aAA0C;AACpD,UAAM,MAAM,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC;AAC5C,QAAI,CAAC,YAAa,QAAO;AACzB,UAAM,SAAS,GAAG,WAAW;AAC7B,WAAO,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,WAAW,MAAM,CAAC;AAAA,EACpD;AAAA,EAEA,UAAU,eAAqD;AAC7D,WAAO,KAAK,QAAQ,IAAI,aAAa;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,eAAuB,UAAwC;AACzE,UAAM,SAAS,KAAK,QAAQ,IAAI,aAAa;AAC7C,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,WAAW,aAAa,aAAa;AAAA,IACvD;AAEA,UAAM,cAAc,cAAc,MAAM,GAAG,EAAE,CAAC;AAC9C,UAAM,KAAK,CAAC,SAAiB,GAAG,WAAW,IAAI,IAAI;AAEnD,UAAM,KAAK,EAAE,GAAG,SAAS,cAAc;AACvC,QAAI,OAAO,QAAQ,QAAQ;AACzB,SAAG,SAAS,CAAC,GAAI,GAAG,UAAU,CAAC,GAAI,GAAG,OAAO,OAAO,IAAI,EAAE,CAAC;AAAA,IAC7D;AACA,QAAI,OAAO,SAAS,QAAQ;AAC1B,SAAG,UAAU,CAAC,GAAI,GAAG,WAAW,CAAC,GAAI,GAAG,OAAO,QAAQ,IAAI,EAAE,CAAC;AAAA,IAChE;AACA,QAAI,OAAO,YAAY,QAAQ;AAC7B,YAAM,UAAU,OAAO,WAAW,IAAI,CAAC,YAAoB;AACzD,cAAM,WAAW,GAAG,OAAO;AAC3B,cAAM,WAAW,KAAK,SAAS,iBAAiB,IAAI,QAAQ;AAC5D,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS,UAAU,WAAW;AAAA,UAC9B,MAAM,UAAU;AAAA,UAChB,KAAK,UAAU;AAAA,QACjB;AAAA,MACF,CAAC;AACD,SAAG,aAAa,CAAC,GAAI,GAAG,cAAc,CAAC,GAAI,GAAG,OAAO;AAAA,IACvD;AACA,QAAI,OAAO,WAAW,QAAQ;AAC5B,YAAM,gBAAgB,OAAO,UAAU,CAAC;AACxC,UAAI,iBAAiB,CAAC,GAAG,UAAU;AACjC,WAAG,WAAW,GAAG,aAAa;AAAA,MAChC;AAAA,IACF;AACA,QAAI,OAAO,WAAW,UAAU,KAAK,SAAS,kBAAkB;AAC9D,iBAAW,WAAW,OAAO,WAAW;AACtC,cAAM,WAAW,GAAG,OAAO;AAC3B,cAAM,MAAM,KAAK,SAAS,iBAAiB,IAAI,QAAQ;AACvD,YAAI,KAAK;AACP,eAAK,SAAS,iBAAiB,SAAS,GAAG;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,GAAG,UAAU,eAAe,GAAG;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAA4B;AAChC,QAAI,UAAyB,CAAC;AAC9B,QAAI;AACF,YAAM,MAAM,MAAMG,UAAS,KAAK,iBAAiB,OAAO;AACxD,YAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,gBAAU,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,MAAM,OAAO,EAAE,MAAM,OAAO,EAAE;AAAA,IACzF,QAAQ;AACN,MAAAH,SAAO,MAAM,oDAAoD;AAAA,IACnE;AAEA,eAAW,SAAS,SAAS;AAC3B,UAAI;AACF,cAAM,SAAS,KAAK,aAAa,MAAM,MAAM,MAAM,MAAM;AACzD,cAAM,SAAS,MAAM,OAAO,MAAM;AAClC,aAAK,QAAQ,IAAI,MAAM,MAAM,MAAM;AACnC,aAAK,iBAAiB,MAAM,MAAM,MAAM;AACxC,QAAAA,SAAO,KAAK,EAAE,MAAM,MAAM,KAAK,GAAG,6BAA6B;AAAA,MACjE,SAAS,KAAK;AACZ,QAAAA,SAAO,KAAK,EAAE,MAAM,MAAM,MAAM,OAAO,IAAI,GAAG,oCAAoC;AAAA,MACpF;AAAA,IACF;AAEA,UAAM,KAAK,oBAAoB;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,sBAAqC;AACjD,QAAI,KAAK,kBAAmB;AAC5B,QAAI,KAAK,QAAQ,IAAI,mBAAmB,EAAG;AAC3C,QAAI;AACF,YAAM,KAAK,UAAU,qBAAqB,qBAAqB;AAC/D,MAAAA,SAAO,KAAK,iCAAiC,mBAAmB;AAAA,IAClE,SAAS,KAAK;AACZ,MAAAA,SAAO,MAAM,EAAE,OAAO,IAAI,GAAG,wDAAwD;AAAA,IACvF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,aAAa,MAAc,QAAuC;AACxE,YAAQ,OAAO,MAAM;AAAA,MACnB,KAAK;AACH,eAAO,IAAI,aAAa,MAAM,QAAQ,KAAK,QAAQ;AAAA,MACrD,KAAK;AACH,eAAO,IAAI,YAAY,MAAM,MAAM;AAAA,MACrC;AACE,cAAM,IAAI,MAAM,4BAA6B,OAA4B,IAAI,EAAE;AAAA,IACnF;AAAA,EACF;AAAA,EAEQ,iBAAiB,aAAqB,QAA2B;AACvE,UAAM,KAAK,CAAC,OAAuB,EAAE,GAAG,GAAG,MAAM,GAAG,WAAW,IAAI,EAAE,IAAI,GAAG;AAE5E,eAAW,SAAS,OAAO,QAAQ;AACjC,WAAK,SAAS,aAAa,SAAS,GAAG,KAAK,CAAoB;AAAA,IAClE;AACA,eAAW,UAAU,OAAO,SAAS;AACnC,WAAK,SAAS,cAAc,SAAS,GAAG,MAAM,CAAqB;AAAA,IACrE;AACA,eAAW,OAAO,OAAO,YAAY;AACnC,WAAK,SAAS,iBAAiB,SAAS,GAAG,GAAG,CAAwB;AAAA,IACxE;AACA,eAAW,MAAM,OAAO,WAAW;AACjC,WAAK,SAAS,gBAAgB,SAAS,GAAG,EAAE,CAAuB;AAAA,IACrE;AACA,QAAI,KAAK,SAAS,gBAAgB;AAChC,iBAAW,WAAW,OAAO,UAAU;AACrC,aAAK,SAAS,eAAe,SAAS,GAAG,OAAO,CAAsB;AAAA,MACxE;AAAA,IACF;AACA,eAAW,UAAU,OAAO,SAAS;AACnC,WAAK,QAAQ,IAAI,GAAG,WAAW,IAAI,OAAO,IAAI,IAAI,MAAM;AAAA,IAC1D;AACA,QAAI,KAAK,SAAS,oBAAoB,OAAO,UAAU,SAAS,GAAG;AACjE,YAAM,QAAQ,CAAC,QAAgB,IAAI,SAAS,GAAG,IAAI,MAAM,GAAG,WAAW,IAAI,GAAG;AAC9E,iBAAW,YAAY,OAAO,WAAW;AACvC,cAAM,KAAK,SAAS;AACpB,cAAM,aAAa;AAAA,UACjB,GAAG;AAAA,UACH,MAAM,GAAG,WAAW,IAAI,SAAS,IAAI;AAAA,UACrC,eAAe;AAAA,YACb,GAAG;AAAA,YACH,QAAQ,GAAG,QAAQ,IAAI,KAAK;AAAA,YAC5B,SAAS,GAAG,SAAS,IAAI,KAAK;AAAA,YAC9B,WAAW,GAAG,WAAW,IAAI,KAAK;AAAA,YAClC,UAAU,GAAG,WAAW,MAAM,GAAG,QAAQ,IAAI,GAAG;AAAA,UAClD;AAAA,QACF;AACA,aAAK,SAAS,iBAAiB,SAAS,UAAU;AAAA,MACpD;AAAA,IACF;AAEA,IAAAA,SAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA,QAAQ,OAAO,OAAO;AAAA,QACtB,SAAS,OAAO,QAAQ;AAAA,QACxB,KAAK,OAAO,WAAW;AAAA,QACvB,WAAW,OAAO,UAAU;AAAA,QAC5B,UAAU,OAAO,SAAS;AAAA,QAC1B,SAAS,OAAO,QAAQ;AAAA,QACxB,WAAW,OAAO,UAAU;AAAA,MAC9B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,2BAA2B,aAA2B;AAC5D,UAAM,SAAS,GAAG,WAAW;AAC7B,UAAM,aAAa,CAA2B,QAAiC;AAC7E,iBAAW,KAAK,IAAI,KAAK,GAAG;AAC1B,YAAI,EAAE,KAAK,WAAW,MAAM,GAAG;AAC7B,cAAI,WAAW,EAAE,IAAI;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AACA,eAAW,KAAK,SAAS,YAAY;AACrC,eAAW,KAAK,SAAS,aAAa;AACtC,eAAW,KAAK,SAAS,gBAAgB;AACzC,eAAW,KAAK,SAAS,eAAe;AACxC,QAAI,KAAK,SAAS,gBAAgB;AAChC,iBAAW,KAAK,SAAS,cAAc;AAAA,IACzC;AACA,QAAI,KAAK,SAAS,kBAAkB;AAClC,iBAAW,KAAK,KAAK,SAAS,iBAAiB,KAAK,GAAG;AACrD,YAAI,EAAE,KAAK,WAAW,MAAM,GAAG;AAC7B,eAAK,SAAS,iBAAiB,WAAW,EAAE,IAAI;AAAA,QAClD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,wBAAwB,aAA2B;AACzD,UAAM,SAAS,GAAG,WAAW;AAC7B,eAAW,OAAO,KAAK,QAAQ,KAAK,GAAG;AACrC,UAAI,IAAI,WAAW,MAAM,GAAG;AAC1B,aAAK,QAAQ,OAAO,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,iBAAgC;AAC5C,UAAM,OAAqC,CAAC;AAC5C,eAAW,CAAC,MAAM,MAAM,KAAK,KAAK,SAAS;AACzC,WAAK,IAAI,IAAI,OAAO;AAAA,IACtB;AACA,UAAMI,QAAM,KAAK,SAAS,EAAE,WAAW,KAAK,CAAC;AAC7C,UAAMC,WAAU,KAAK,iBAAiB,KAAK,UAAU,EAAE,SAAS,KAAK,GAAG,MAAM,CAAC,IAAI,MAAM,OAAO;AAAA,EAClG;AAAA,EAEQ,iBAAiB,MAA+B;AACtD,UAAM,SAAS,KAAK,QAAQ,IAAI,IAAI;AACpC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,WAAW,IAAI,aAAa;AAAA,IAC9C;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,aAAiF;AAC1G,UAAM,SAAS,GAAG,WAAW;AAC7B,UAAM,WAAW,oBAAI,IAA2D;AAEhF,UAAM,UAAU,CACd,KACA,SACG;AACH,iBAAW,KAAK,IAAI,KAAK,GAAG;AAC1B,YAAI,EAAE,KAAK,WAAW,MAAM,GAAG;AAC7B,mBAAS,IAAI,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE,QAAQ,CAAC;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,SAAS,cAAc,OAAO;AAC3C,YAAQ,KAAK,SAAS,eAAe,QAAQ;AAC7C,YAAQ,KAAK,SAAS,kBAAkB,WAAW;AACnD,YAAQ,KAAK,SAAS,iBAAiB,UAAU;AAEjD,QAAI,KAAK,SAAS,kBAAkB;AAClC,iBAAW,KAAK,KAAK,SAAS,iBAAiB,KAAK,GAAG;AACrD,YAAI,EAAE,KAAK,WAAW,MAAM,GAAG;AAC7B,mBAAS,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,SAAS,EAAE,QAAQ,CAAC;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAEA,eAAW,CAAC,KAAK,MAAM,KAAK,KAAK,SAAS;AACxC,UAAI,IAAI,WAAW,MAAM,GAAG;AAC1B,iBAAS,IAAI,KAAK,EAAE,MAAM,UAAU,SAAS,OAAO,QAAQ,CAAC;AAAA,MAC/D;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,gBACN,aACA,aACY;AACZ,UAAM,SAAS,sBAAsB;AAErC,eAAW,CAAC,MAAM,QAAQ,KAAK,aAAa;AAC1C,YAAM,WAAW,YAAY,IAAI,IAAI;AACrC,UAAI,CAAC,UAAU;AACb,eAAO,MAAM,KAAK;AAAA,UAChB,MAAM,SAAS;AAAA,UACf;AAAA,UACA,YAAY,SAAS;AAAA,QACvB,CAAC;AAAA,MACH,WAAW,SAAS,YAAY,SAAS,SAAS;AAChD,eAAO,QAAQ,KAAK;AAAA,UAClB,MAAM,SAAS;AAAA,UACf;AAAA,UACA,YAAY,SAAS;AAAA,UACrB,YAAY,SAAS;AAAA,QACvB,CAAC;AACD,YAAI,qBAAqB,SAAS,SAAS,SAAS,OAAO,GAAG;AAC5D,iBAAO,qBAAqB;AAAA,QAC9B;AAAA,MACF,OAAO;AACL,eAAO,UAAU,KAAK,IAAI;AAAA,MAC5B;AAAA,IACF;AAEA,eAAW,CAAC,MAAM,QAAQ,KAAK,aAAa;AAC1C,UAAI,CAAC,YAAY,IAAI,IAAI,GAAG;AAC1B,eAAO,QAAQ,KAAK;AAAA,UAClB,MAAM,SAAS;AAAA,UACf;AAAA,UACA,YAAY,SAAS;AAAA,QACvB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,WAAW,SAAsC;AACxD,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,IAAI,QAAQ,MAAM,QAAQ;AAChC,QAAM,QAAQ,IAAI,CAAC;AACnB,SAAO,UAAU,SAAY,SAAS,OAAO,EAAE,IAAI;AACrD;AAEA,SAAS,qBAAqB,YAAqB,YAA8B;AAC/E,QAAM,WAAW,WAAW,UAAU;AACtC,QAAM,WAAW,WAAW,UAAU;AACtC,MAAI,aAAa,UAAa,aAAa,OAAW,QAAO;AAC7D,SAAO,aAAa;AACtB;;;AExdA,SAAS,YAAAC,WAAU,WAAAC,UAAS,QAAAC,OAAM,UAAAC,eAAc;AAChD,SAAS,QAAAC,QAAM,YAAAC,WAAU,WAAAC,gBAAe;;;ACFxC,SAAS,KAAAC,WAAS;AAMlB,IAAM,2BAA2B;AAAA,EAC/B,MAAMA,IAAE,OAAO,EAAE,IAAI,GAAG,kBAAkB;AAAA,EAC1C,SAASA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,aAAaA,IAAE,OAAO,EAAE,SAAS;AAAA,EACjC,OAAOA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,UAAUA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,QAAQA,IAAE,OAAO;AAAA,IACf,MAAMA,IAAE,KAAK,CAAC,WAAW,UAAU,OAAO,CAAC;AAAA,IAC3C,YAAYA,IAAE,OAAO,EAAE,SAAS;AAAA,IAChC,UAAUA,IAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,UAAUA,IAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,UAAUA,IAAE,QAAQ,EAAE,SAAS;AAAA,EACjC,CAAC,EAAE,SAAS;AAAA,EACZ,MAAMA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AACrC;AAMO,IAAM,wBAAwBA,IAAE,OAAO;AAAA,EAC5C,MAAMA,IAAE,OAAO,EAAE,IAAI,GAAG,kBAAkB;AAAA,EAC1C,SAASA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,aAAaA,IAAE,OAAO,EAAE,SAAS;AAAA,EACjC,YAAYA,IAAE,OAAO;AAAA,IACnB,QAAQA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACrC,SAASA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACtC,KAAKA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IAClC,WAAWA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACxC,WAAWA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACxC,UAAUA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACzC,CAAC,EAAE,SAAS;AAAA,EACZ,SAASA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AACxC,CAAC;AAMM,IAAMC,yBAAwBD,IAAE,OAAO;AAAA,EAC5C,GAAG;AAAA,EACH,SAASA,IAAE,OAAO,EAAE,IAAI,GAAG,qBAAqB;AAAA,EAChD,SAASA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,eAAeA,IAAE,OAAO,EAAE,SAAS;AAAA,EACnC,cAAcA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAC7C,CAAC;AAEM,IAAME,0BAAyBF,IAAE,OAAO;AAAA,EAC7C,GAAG;AAAA,EACH,SAASA,IAAE,OAAO,EAAE,IAAI,GAAG,qBAAqB;AAAA,EAChD,WAAWA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAC1C,CAAC;AAEM,IAAMG,6BAA4BH,IAAE,OAAO;AAAA,EAChD,GAAG;AAAA,EACH,SAASA,IAAE,OAAO,EAAE,IAAI,GAAG,qBAAqB;AAAA,EAChD,MAAMA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,KAAKA,IAAE,OAAOA,IAAE,OAAO,GAAGA,IAAE,OAAO,CAAC,EAAE,SAAS;AACjD,CAAC;AAEM,IAAMI,4BAA2BJ,IAAE,OAAO;AAAA,EAC/C,GAAG;AAAA,EACH,SAASA,IAAE,OAAO,EAAE,IAAI,GAAG,qBAAqB;AAClD,CAAC;AAED,IAAMK,yBAAwBL,IAAE,OAAO;AAAA,EACrC,OAAOA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,SAASA,IAAE,OAAO,EAAE,IAAI,CAAC;AAC3B,CAAC;AAEM,IAAM,gCAAgCA,IAAE,OAAO;AAAA,EACpD,GAAG;AAAA,EACH,gBAAgBA,IAAE,MAAMA,IAAE,KAAK,CAAC,WAAW,QAAQ,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;AAAA,EACjE,gBAAgBK,uBAAsB,SAAS;AAAA,EAC/C,aAAaA,uBAAsB,SAAS;AAAA,EAC5C,YAAYA,uBAAsB,SAAS;AAAA,EAC3C,gBAAgBL,IAAE,QAAQ,EAAE,SAAS;AAAA,EACrC,gBAAgBA,IAAE,OAAO,EAAE,SAAS;AAAA,EACpC,kBAAkBA,IAAE,KAAK,CAAC,OAAO,KAAK,CAAC,EAAE,SAAS;AAAA,EAClD,kBAAkBA,IAAE,OAAO;AAAA,IACzB,OAAOA,IAAE,KAAK,CAAC,WAAW,QAAQ,CAAC,EAAE,SAAS;AAAA,IAC9C,UAAUA,IAAE,QAAQ,EAAE,SAAS;AAAA,IAC/B,aAAaA,IAAE,QAAQ,EAAE,SAAS;AAAA,IAClC,OAAOA,IAAE,QAAQ,EAAE,SAAS;AAAA,EAC9B,CAAC,EAAE,SAAS;AAAA,EACZ,gBAAgBA,IAAE,OAAO;AAAA,IACvB,SAASA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACzB,MAAMA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACnC,kBAAkBA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,IAC5C,gBAAgBA,IAAE,OAAO,EAAE,SAAS;AAAA,EACtC,CAAC,EAAE,SAAS;AAAA,EACZ,SAASA,IAAE,MAAMA,IAAE,OAAO;AAAA,IACxB,MAAMA,IAAE,KAAK,CAAC,OAAO,QAAQ,UAAU,SAAS,OAAO,QAAQ,CAAC;AAAA,IAChE,SAASA,IAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,WAAWA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACxC,OAAOA,IAAE,OAAO,EAAE,SAAS;AAAA,IAC3B,cAAcA,IAAE,OAAO,EAAE,SAAS;AAAA,EACpC,CAAC,CAAC,EAAE,SAAS;AACf,CAAC;AAEM,IAAM,yBAAyBA,IAAE,OAAO;AAAA,EAC7C,MAAMA,IAAE,OAAO,EAAE,IAAI,GAAG,kBAAkB;AAAA,EAC1C,SAASA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,aAAaA,IAAE,OAAO,EAAE,SAAS;AAAA,EACjC,QAAQA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACrC,SAASA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACtC,YAAYA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACzC,WAAWA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACxC,WAAWA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAC1C,CAAC;;;ADlED,IAAM,wBAAmD;AAAA,EACvD,QAAQM;AAAA,EACR,SAASC;AAAA,EACT,KAAKC;AAAA,EACL,WAAWC;AAAA,EACX,SAAS;AACX;AAEA,IAAM,iBAAkC,CAAC,UAAU,WAAW,OAAO,aAAa,aAAa,SAAS;AAMjG,IAAM,kBAAN,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK3B,MAAM,SAAS,SAAiB,SAA4D;AAC1F,UAAM,SAAkC,CAAC;AACzC,QAAI,YAAY;AAChB,UAAM,iBAAiB,oBAAI,IAAY;AACvC,UAAM,SAAS,SAAS;AAGxB,UAAM,WAAW,MAAM,KAAK,iBAAiB,SAAS,MAAM;AAC5D,QAAI,SAAU;AAGd,UAAM,iBAAiB,oBAAI,IAAyB;AACpD,QAAI,UAAU;AACZ,mBAAa,MAAM,KAAK,sBAAsB,SAAS,UAAU,QAAQ,gBAAgB,gBAAgB,MAAM;AAAA,IACjH;AACA,iBAAa,MAAM,KAAK,sBAAsB,SAAS,QAAQ,gBAAgB,gBAAgB,MAAM;AAGrG,UAAM,KAAK,yBAAyB,SAAS,UAAU,gBAAgB,MAAM;AAI7E,UAAM,aAAa,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO,EAAE;AAChE,UAAM,YAAY,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,SAAS,EAAE;AAEjE,UAAM,QAAQ,SAAS,SACnB,eAAe,KAAK,cAAc,IAClC,eAAe;AAEnB,WAAO;AAAA,MACL;AAAA,MACA,YAAa,UAAU,QAAmB;AAAA,MAC1C;AAAA,MACA,SAAS,EAAE,MAAM,WAAW,MAAM,WAAW,OAAO,WAAW;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,iBACZ,SACA,QACyC;AACzC,UAAM,eAAeC,OAAK,SAAS,aAAa;AAChD,QAAI;AAEJ,QAAI;AACF,YAAM,MAAMC,UAAS,cAAc,OAAO;AAAA,IAC5C,QAAQ;AACN,aAAO,KAAK;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AACD,aAAO;AAAA,IACT;AAEA,QAAI;AACJ,QAAI;AACF,aAAO,KAAK,MAAM,GAAG;AAAA,IACvB,SAAS,KAAK;AACZ,aAAO,KAAK;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SAAS,iBAAiB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QAC1E,MAAM;AAAA,MACR,CAAC;AACD,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,sBAAsB,UAAU,IAAI;AACnD,QAAI,CAAC,OAAO,SAAS;AACnB,iBAAW,SAAS,OAAO,MAAM,QAAQ;AACvC,eAAO,KAAK;AAAA,UACV,UAAU;AAAA,UACV,MAAM;AAAA,UACN,SAAS,GAAG,MAAM,KAAK,KAAK,GAAG,CAAC,KAAK,MAAM,OAAO;AAAA,UAClD,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAGA,UAAM,WAAW,OAAO;AACxB,UAAM,KAAK,uBAAuB,SAAS,UAAU,MAAM;AAE3D,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,uBACZ,SACA,UACA,QACe;AACf,UAAM,UAAmD,CAAC;AAE1D,QAAI,SAAS,YAAY;AACvB,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,SAAS,UAAU,GAAG;AAC/D,YAAI,OAAO;AACT,qBAAW,KAAK,OAAO;AACrB,oBAAQ,KAAK,EAAE,KAAK,GAAG,SAAS,cAAc,IAAI,GAAG,CAAC;AAAA,UACxD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,SAAS,SAAS;AACpB,iBAAW,KAAK,SAAS,SAAS;AAChC,gBAAQ,KAAK,EAAE,KAAK,GAAG,SAAS,UAAU,CAAC;AAAA,MAC7C;AAAA,IACF;AAEA,eAAW,EAAE,KAAK,QAAQ,KAAK,SAAS;AACtC,YAAM,WAAWD,OAAK,SAAS,GAAG;AAClC,UAAI;AACF,cAAME,QAAO,QAAQ;AAAA,MACvB,QAAQ;AACN,eAAO,KAAK;AAAA,UACV,UAAU;AAAA,UACV,MAAM;AAAA,UACN,WAAW;AAAA,UACX,SAAS,sBAAsB,OAAO,oBAAoB,GAAG;AAAA,UAC7D,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,sBACZ,SACA,UACA,QACA,gBACA,gBACA,QACiB;AACjB,QAAI,YAAY;AAChB,UAAM,aAAa,SAAS;AAC5B,QAAI,CAAC,cAAc,CAAC,SAAS,QAAS,QAAO;AAE7C,QAAI,YAAY;AACd,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACtD,YAAI,CAAC,MAAO;AACZ,mBAAW,YAAY,OAAO;AAC5B,yBAAe,IAAI,QAAQ;AAC3B,gBAAM,KAAK,MAAM,KAAK,mBAAmB,SAAS,UAAU,MAAuB,QAAQ,cAAc;AACzG,cAAI,GAAI;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,SAAS;AACzB,QAAI,SAAS;AACX,iBAAW,YAAY,SAAS;AAC9B,uBAAe,IAAI,QAAQ;AAC3B,cAAM,KAAK,MAAM,KAAK,mBAAmB,SAAS,UAAU,WAAW,QAAQ,cAAc;AAC7F,YAAI,GAAI;AAAA,MACV;AAAA,IACF;AAGA,SAAK;AACL,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,sBACZ,SACA,QACA,gBACA,gBACA,QACiB;AACjB,QAAI,YAAY;AAEhB,eAAW,OAAO,gBAAgB;AAChC,YAAM,UAAUF,OAAK,SAAS,GAAG;AACjC,UAAI;AACF,cAAM,UAAU,MAAMG,MAAK,OAAO;AAClC,YAAI,CAAC,QAAQ,YAAY,EAAG;AAAA,MAC9B,QAAQ;AACN;AAAA,MACF;AAEA,mBAAa,MAAM,KAAK,cAAc,SAAS,SAAS,KAAK,QAAQ,gBAAgB,gBAAgB,MAAM;AAAA,IAC7G;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,cACZ,SACA,SACA,eACA,QACA,gBACA,gBACA,QACiB;AACjB,QAAI,YAAY;AAChB,UAAM,UAAU,MAAMC,SAAQ,OAAO;AAErC,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAWJ,OAAK,SAAS,KAAK;AACpC,YAAM,UAAUK,UAAS,SAAS,QAAQ,EAAE,QAAQ,OAAO,GAAG;AAC9D,YAAM,YAAY,MAAMF,MAAK,QAAQ,EAAE,MAAM,MAAM,IAAI;AACvD,UAAI,CAAC,UAAW;AAEhB,UAAI,UAAU,OAAO,KAAKG,SAAQ,KAAK,MAAM,SAAS;AACpD,YAAI,eAAe,IAAI,OAAO,EAAG;AACjC,uBAAe,IAAI,OAAO;AAC1B,cAAM,KAAK,MAAM,KAAK,mBAAmB,SAAS,SAAS,eAAe,QAAQ,cAAc;AAChG,YAAI,GAAI;AAAA,MACV,WAAW,UAAU,YAAY,GAAG;AAClC,YAAI,kBAAkB,UAAU;AAC9B,gBAAM,cAAcN,OAAK,UAAU,UAAU;AAC7C,cAAI;AACF,kBAAME,QAAO,WAAW;AACxB,kBAAM,eAAeG,UAAS,SAAS,WAAW,EAAE,QAAQ,OAAO,GAAG;AACtE,gBAAI,CAAC,eAAe,IAAI,YAAY,GAAG;AACrC,6BAAe,IAAI,YAAY;AAC/B,oBAAM,KAAK,MAAM,KAAK,gBAAgB,SAAS,cAAc,QAAQ,gBAAgB,OAAO,MAAM;AAClG,kBAAI,GAAI;AAAA,YACV;AACA,gBAAI,WAAW,gBAAgB;AAC7B,oBAAM,KAAK,4BAA4B,SAAS,UAAU,OAAO,MAAM;AAAA,YACzE;AAAA,UACF,QAAQ;AACN,kBAAM,mBAAmBL,OAAK,UAAU,eAAe;AACvD,gBAAI;AACF,oBAAME,QAAO,gBAAgB;AAC7B,oBAAM,WAAWG,UAAS,SAAS,gBAAgB,EAAE,QAAQ,OAAO,GAAG;AACvE,kBAAI,CAAC,eAAe,IAAI,QAAQ,GAAG;AACjC,+BAAe,IAAI,QAAQ;AAC3B,sBAAM,KAAK,MAAM,KAAK,mBAAmB,SAAS,UAAU,eAAe,QAAQ,cAAc;AACjG,oBAAI,GAAI;AAAA,cACV;AAAA,YACF,QAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,mBACZ,SACA,SACA,eACA,QACA,gBACkB;AAClB,UAAM,WAAWL,OAAK,SAAS,OAAO;AAEtC,QAAI;AACJ,QAAI;AACF,YAAM,MAAMC,UAAS,UAAU,OAAO;AAAA,IACxC,QAAQ;AACN,aAAO,KAAK;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AACD,aAAO;AAAA,IACT;AAEA,QAAI;AACJ,QAAI;AACF,aAAO,KAAK,MAAM,GAAG;AAAA,IACvB,SAAS,KAAK;AACZ,aAAO,KAAK;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SAAS,iBAAiB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QAC1E,MAAM;AAAA,MACR,CAAC;AACD,aAAO;AAAA,IACT;AAGA,QAAI,kBAAkB,aAAa;AACjC,aAAO,KAAK,0BAA0B,SAAS,MAAM,QAAQ,cAAc;AAAA,IAC7E;AAEA,UAAM,SAAS,sBAAsB,aAAa;AAClD,QAAI,CAAC,OAAQ,QAAO;AAEpB,UAAM,SAAS,OAAO,UAAU,IAAI;AACpC,QAAI,CAAC,OAAO,SAAS;AACnB,iBAAW,SAAS,OAAO,MAAM,QAAQ;AACvC,eAAO,KAAK;AAAA,UACV,UAAU;AAAA,UACV,MAAM;AAAA,UACN,WAAY,MAA4B;AAAA,UACxC,SAAS,GAAG,MAAM,KAAK,KAAK,GAAG,CAAC,KAAK,MAAM,OAAO;AAAA,UAClD,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,OAAO;AACtB,SAAK,mBAAmB,gBAAgB,eAAe,OAAO,IAAI;AAElE,QAAI,CAAC,OAAO,aAAa;AACvB,aAAO,KAAK;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,QACN,WAAW,OAAO;AAAA,QAClB,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,0BACN,SACA,MACA,QACA,gBACS;AACT,UAAM,eAAe,oBAAoB,UAAU,IAAI;AACvD,QAAI,CAAC,aAAa,SAAS;AACzB,iBAAW,SAAS,aAAa,MAAM,QAAQ;AAC7C,eAAO,KAAK;AAAA,UACV,UAAU;AAAA,UACV,MAAM;AAAA,UACN,WAAY,MAA4B;AAAA,UACxC,SAAS,GAAG,MAAM,KAAK,KAAK,GAAG,CAAC,KAAK,MAAM,OAAO;AAAA,UAClD,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,iBAAiB,IAAI;AAC5C,eAAW,KAAK,eAAe,YAAY,CAAC,GAAG;AAC7C,aAAO,KAAK;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,QACN,WAAW,aAAa,KAAK;AAAA,QAC7B,SAAS,EAAE;AAAA,QACX,MAAM,EAAE,QAAQ;AAAA,MAClB,CAAC;AAAA,IACH;AAEA,SAAK,mBAAmB,gBAAgB,aAAa,aAAa,KAAK,IAAI;AAC3E,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,gBACZ,SACA,SACA,QACA,gBACA,eACA,QACkB;AAClB,UAAM,WAAWD,OAAK,SAAS,OAAO;AAEtC,QAAI;AACJ,QAAI;AACF,YAAM,MAAMC,UAAS,UAAU,OAAO;AAAA,IACxC,QAAQ;AACN,aAAO,KAAK;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AACD,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,oBAAoB,GAAG;AACrC,QAAI,CAAC,OAAO;AACV,aAAO,KAAK;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AACD,aAAO;AAAA,IACT;AAEA,SAAK,mBAAmB,gBAAgB,UAAU,MAAM,IAAI;AAE5D,QAAI,WAAW,gBAAgB;AAC7B,WAAK,0BAA0B,OAAO,SAAS,QAAQ,eAAe,GAAG;AAAA,IAC3E,OAAO;AACL,UAAI,CAAC,MAAM,aAAa;AACtB,eAAO,KAAK;AAAA,UACV,UAAU;AAAA,UACV,MAAM;AAAA,UACN,WAAW,MAAM;AAAA,UACjB,SAAS;AAAA,UACT,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,CAAC,MAAM,WAAW,MAAM,QAAQ,KAAK,EAAE,WAAW,GAAG;AACvD,aAAO,KAAK;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,QACN,WAAW,MAAM;AAAA,QACjB,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMQ,0BACN,OACA,SACA,QACA,eACA,KACM;AACN,UAAM,OAAO,MAAM;AAGnB,UAAM,UAAU;AAChB,QAAI,KAAK,SAAS,IAAI;AACpB,aAAO,KAAK;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,QACN,WAAW;AAAA,QACX,SAAS,+BAA+B,KAAK,MAAM;AAAA,QACnD,MAAM;AAAA,MACR,CAAC;AAAA,IACH,WAAW,CAAC,QAAQ,KAAK,IAAI,GAAG;AAC9B,aAAO,KAAK;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,QACN,WAAW;AAAA,QACX,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH,OAAO;AACL,UAAI,KAAK,SAAS,GAAG,GAAG;AACtB,eAAO,KAAK;AAAA,UACV,UAAU;AAAA,UACV,MAAM;AAAA,UACN,WAAW;AAAA,UACX,SAAS;AAAA,UACT,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,UAAI,KAAK,SAAS,IAAI,GAAG;AACvB,eAAO,KAAK;AAAA,UACV,UAAU;AAAA,UACV,MAAM;AAAA,UACN,WAAW;AAAA,UACX,SAAS;AAAA,UACT,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,iBAAiB,SAAS,eAAe;AAC3C,aAAO,KAAK;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,QACN,WAAW;AAAA,QACX,SAAS,SAAS,IAAI,sCAAsC,aAAa;AAAA,QACzE,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAGA,QAAI,CAAC,MAAM,aAAa;AACtB,aAAO,KAAK;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,QACN,WAAW;AAAA,QACX,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH,WAAW,MAAM,YAAY,SAAS,MAAM;AAC1C,aAAO,KAAK;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,QACN,WAAW;AAAA,QACX,SAAS,wCAAwC,MAAM,YAAY,MAAM;AAAA,QACzE,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAGA,QAAI,MAAM,iBAAiB,MAAM,cAAc,SAAS,KAAK;AAC3D,aAAO,KAAK;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,QACN,WAAW;AAAA,QACX,SAAS,+CAA+C,MAAM,cAAc,MAAM;AAAA,QAClF,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAGA,QAAI,KAAK;AACP,YAAM,iBAAiB,IAAI,QAAQ,OAAO,CAAC;AAC3C,UAAI,mBAAmB,IAAI;AACzB,cAAM,OAAO,IAAI,UAAU,iBAAiB,CAAC,EAAE,KAAK;AACpD,cAAM,YAAY,KAAK,MAAM,IAAI,EAAE;AACnC,YAAI,YAAY,KAAK;AACnB,iBAAO,KAAK;AAAA,YACV,UAAU;AAAA,YACV,MAAM;AAAA,YACN,WAAW;AAAA,YACX,SAAS,qBAAqB,SAAS;AAAA,YACvC,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,4BACZ,SACA,UACA,WACA,QACe;AACf,UAAM,aAAa,oBAAI,IAAI,CAAC,WAAW,cAAc,QAAQ,CAAC;AAC9D,UAAM,cAAc,oBAAI,IAAI,CAAC,YAAY,WAAW,eAAe,YAAY,CAAC;AAEhF,QAAI;AACJ,QAAI;AACF,gBAAU,MAAMG,SAAQ,QAAQ;AAAA,IAClC,QAAQ;AACN;AAAA,IACF;AAEA,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAWJ,OAAK,UAAU,KAAK;AACrC,YAAM,UAAUK,UAAS,SAAS,QAAQ,EAAE,QAAQ,OAAO,GAAG;AAC9D,YAAM,YAAY,MAAMF,MAAK,QAAQ,EAAE,MAAM,MAAM,IAAI;AACvD,UAAI,CAAC,UAAW;AAEhB,UAAI,UAAU,YAAY,GAAG;AAC3B,YAAI,WAAW,IAAI,KAAK,GAAG;AACzB,iBAAO,KAAK;AAAA,YACV,UAAU;AAAA,YACV,MAAM;AAAA,YACN,WAAW;AAAA,YACX,SAAS,4BAA4B,KAAK;AAAA,YAC1C,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF,WAAW,CAAC,YAAY,IAAI,KAAK,GAAG;AAAA,MAEpC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,yBACZ,SACA,UACA,gBACA,QACe;AACf,UAAM,aAAaH,OAAK,SAAS,SAAS;AAC1C,UAAM,cAAwB,CAAC;AAG/B,QAAI,UAAU,SAAS;AACrB,iBAAW,KAAK,SAAS,SAAqB;AAC5C,oBAAY,KAAK,CAAC;AAAA,MACpB;AAAA,IACF,OAAO;AACL,UAAI;AACF,cAAM,UAAU,MAAMI,SAAQ,UAAU;AACxC,mBAAW,KAAK,SAAS;AACvB,cAAIE,SAAQ,CAAC,MAAM,SAAS;AAC1B,wBAAY,KAAK,WAAW,CAAC,EAAE;AAAA,UACjC;AAAA,QACF;AAAA,MACF,QAAQ;AACN;AAAA,MACF;AAAA,IACF;AAEA,eAAW,cAAc,aAAa;AACpC,YAAM,WAAWN,OAAK,SAAS,UAAU;AACzC,UAAI;AACJ,UAAI;AACF,cAAM,MAAM,MAAMC,UAAS,UAAU,OAAO;AAC5C,eAAO,KAAK,MAAM,GAAG;AAAA,MACvB,QAAQ;AACN;AAAA,MACF;AAEA,YAAM,aAAc,KAAK,QAAmB;AAC5C,YAAM,SAAyC;AAAA,QAC7C,CAAC,UAAU,QAAQ;AAAA,QACnB,CAAC,WAAW,SAAS;AAAA,QACrB,CAAC,cAAc,KAAK;AAAA,QACpB,CAAC,aAAa,WAAW;AAAA,QACzB,CAAC,aAAa,WAAW;AAAA,MAC3B;AAEA,iBAAW,CAAC,OAAO,QAAQ,KAAK,QAAQ;AACtC,cAAM,OAAO,KAAK,KAAK;AACvB,YAAI,CAAC,KAAM;AACX,cAAM,YAAY,eAAe,IAAI,QAAQ,KAAK,oBAAI,IAAI;AAC1D,mBAAW,OAAO,MAAM;AACtB,cAAI,CAAC,UAAU,IAAI,GAAG,GAAG;AACvB,mBAAO,KAAK;AAAA,cACV,UAAU;AAAA,cACV,MAAM;AAAA,cACN,WAAW;AAAA,cACX,SAAS,qBAAqB,QAAQ,KAAK,GAAG;AAAA,cAC9C,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,mBACN,gBACA,MACA,MACM;AACN,QAAI,MAAM,eAAe,IAAI,IAAI;AACjC,QAAI,CAAC,KAAK;AACR,YAAM,oBAAI,IAAI;AACd,qBAAe,IAAI,MAAM,GAAG;AAAA,IAC9B;AACA,QAAI,IAAI,IAAI;AAAA,EACd;AACF;;;AE1uBO,IAAM,oBAAwD;AAAA,EACnE;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,QAAQ,CAAC,4BAA4B,wBAAwB;AAAA,EAC/D;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,QAAQ,CAAC,UAAU,eAAe,SAAS;AAAA,EAC7C;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,QAAQ,CAAC,iBAAiB,mBAAmB;AAAA,EAC/C;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,gBAAgB;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,gBAAgB;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,gBAAgB;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,gBAAgB;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,gBAAgB;AAAA,EAClB;AACF;AAGO,SAAS,2BAAiC;AAC/C,aAAW,cAAc,mBAAmB;AAC1C,0BAAsB,SAAS,UAAU;AAAA,EAC3C;AACF;","names":["writeFile","mkdir","stat","join","createLogger","logger","createLogger","mkdir","join","writeFile","stat","createLogger","manager","manager","manager","manager","manager","logger","createLogger","manager","writeFile","mkdir","join","createLogger","logger","createLogger","logger","randomUUID","createLogger","createLogger","logger","createLogger","logger","randomUUID","createLogger","logger","randomUUID","createLogger","logger","logger","createLogger","randomUUID","z","z","stat","join","join","stat","createLogger","logger","mkdir","join","ConfigValidationError","readFile","writeFile","readdir","stat","mkdir","join","extname","ConfigNotFoundError","ConfigValidationError","createLogger","isNodeError","ConfigValidationError","mkdir","join","writeFile","join","createLogger","logger","createLogger","registry","join","mkdir","access","unlink","join","randomUUID","ConfigValidationError","InstanceCorruptedError","createLogger","z","PermissionModeSchema","readFile","writeFile","readdir","stat","mkdir","join","randomUUID","createLogger","logger","join","readFile","isNodeError","randomUUID","mkdir","writeFile","registry","stat","readdir","readFile","writeFile","rename","readdir","stat","mkdir","join","dirname","resolve","randomUUID","InstanceCorruptedError","readFile","isNodeError","randomUUID","mkdir","dirname","writeFile","rename","resolve","InstanceCorruptedError","stat","readdir","join","createLogger","logger","registry","resolve","logger","createLogger","join","ConfigValidationError","mkdir","randomUUID","meta","InstanceCorruptedError","unlink","access","writeFile","mkdir","join","createLogger","logger","createLogger","logger","mkdir","rm","join","join","mkdir","rm","join","isAbsolute","isAbsolute","join","resolve","rm","access","join","isAbsolute","isAbsolute","join","access","rm","spawn","rm","join","join","rm","resolve","spawn","spawn","join","registry","join","resolve","spawn","registry","join","rename","mkdir","createLogger","z","resolve","createLogger","isNodeError","resolve","logger","createLogger","createLogger","logger","createLogger","logger","spawn","createLogger","logger","resolve","createLogger","logger","logger","createLogger","join","stopped","mkdir","rename","process","spawn","AgentLaunchError","createLogger","mkdir","rename","stat","readFile","join","createLogger","logger","resolve","logger","createLogger","spawn","resolve","AgentLaunchError","z","z","z","z","z","z","z","z","z","z","createLogger","logger","createLogger","logger","randomUUID","createLogger","logger","join","mkdir","rm","execFile","createLogger","readFile","readdir","stat","join","extname","createLogger","logger","items","execFile","logger","createLogger","join","rm","mkdir","readFile","writeFile","mkdir","join","createLogger","logger","createLogger","join","readFile","mkdir","writeFile","readFile","readdir","stat","access","join","relative","extname","z","SkillDefinitionSchema","PromptDefinitionSchema","McpServerDefinitionSchema","WorkflowDefinitionSchema","PlatformCommandSchema","SkillDefinitionSchema","PromptDefinitionSchema","McpServerDefinitionSchema","WorkflowDefinitionSchema","join","readFile","access","stat","readdir","relative","extname"]}