@almadar/agent 1.1.4 → 1.2.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/orbitals/cache/orbital-fingerprint.ts","../../src/orbitals/cache/structural-templates.ts","../../src/orbitals/cache/prompt-assembler.ts","../../src/orbitals/cache/index.ts","../../src/tools/execute.ts","../../src/tools/validate-schema.ts","../../src/tools/generate-schema.ts","../../src/orbitals/combiner/index.ts","../../src/orbitals/domain-language/index.ts","../../src/orbitals/domain-language/prompts/odl-syntax.ts","../../src/orbitals/domain-language/prompts/odl-examples.ts","../../src/orbitals/domain-language/prompts/odl-patterns.ts","../../src/orbitals/domain-language/prompts/odl-to-schema.ts","../../src/tools/finish-task.ts","../../src/tools/domain-orbital.ts","../../src/orbitals/generation/orbital-generator.ts","../../src/tools/orbital-subagent.ts","../../src/tools/trait-subagent.ts","../../src/tools/combine-schemas.ts","../../src/tools/schema-chunking.ts","../../src/tools/design-transition.ts","../../src/tools/github.ts","../../src/persistence/memory-backend.ts","../../src/persistence/firestore-checkpointer.ts","../../src/persistence/firestore-session-store.ts","../../src/agent/session-manager.ts","../../src/agent/interrupt-config.ts","../../src/agent/skill-agent.ts","../../src/agent/event-budget.ts"],"names":["isEntityReference","getInlineEntity","getTraitName","resolve","path2","tool","fs","z","execAsync","promisify","exec","path3","fs2","path4","getEntityName","AgentDomainCategorySchema","LLMClient","path5","fss","isOrbitalDefinition","CACHE_TTL_MS","CACHE_VERSION","generateFingerprint","crypto","getCached","uuid"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Orbital Fingerprinting for Caching\n *\n * Computes structural fingerprints for Orbital Units to enable\n * prompt caching based on similar structures.\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalUnit, OrbitalEntity, EntityField, OrbitalDefinition, EntityRef } from '@almadar/core/types';\nimport { isOrbitalDefinition, getTraitName, isEntityReference } from '@almadar/core/types';\n\n/**\n * Get entity from EntityRef for signature computation.\n * Returns null if entity is a reference string.\n */\nfunction getInlineEntity(entity: EntityRef): OrbitalEntity | null {\n if (isEntityReference(entity)) {\n return null;\n }\n return entity;\n}\n\n// ============================================================================\n// Fingerprint Computation\n// ============================================================================\n\n/**\n * Compute a structural fingerprint for an Orbital Unit.\n * Units with the same fingerprint can share cached prompts.\n * Only works with full orbital definitions (not references).\n */\nexport function computeOrbitalFingerprint(orbital: OrbitalUnit): string {\n // Note: Orbital is now always OrbitalDefinition (no more OrbitalReference type)\n // The isOrbitalDefinition check is kept for backwards compatibility but always true\n\n // Get inline entity or use fallback for references\n const inlineEntity = getInlineEntity(orbital.entity);\n\n // 1. Entity structure signature\n const entitySig = inlineEntity ? computeEntitySignature(inlineEntity) : 'ref';\n\n // 2. Trait categories (sorted)\n const traitSig = orbital.traits\n .map(getTraitName)\n .sort()\n .join(',');\n\n // 3. Persistence type\n const persistSig = inlineEntity?.persistence || 'persistent';\n\n return `${persistSig}:e[${entitySig}]_t[${traitSig}]`;\n}\n\n/**\n * Compute entity structure signature based on field types.\n */\nexport function computeEntitySignature(entity: OrbitalEntity): string {\n const typeCounts: Record<string, number> = {};\n\n for (const field of entity.fields) {\n const baseType = getFieldTypeKey(field);\n typeCounts[baseType] = (typeCounts[baseType] || 0) + 1;\n }\n\n return Object.entries(typeCounts)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([type, count]) => `${type}:${count}`)\n .join('-');\n}\n\n/**\n * Get field type key for fingerprinting.\n */\nfunction getFieldTypeKey(field: EntityField): string {\n if (field.type === 'relation') {\n const cardinality = field.relation?.cardinality || 'one';\n return `rel:${cardinality}`;\n }\n if (field.type === 'enum') {\n return 'enum';\n }\n return field.type;\n}\n\n// ============================================================================\n// Fingerprint Matching\n// ============================================================================\n\n/**\n * Check if two fingerprints are structurally similar.\n * Similar fingerprints can share template guidance.\n */\nexport function fingerprintsMatch(fp1: string, fp2: string): boolean {\n return fp1 === fp2;\n}\n\n/**\n * Extract fingerprint components.\n */\nexport function parseFingerprint(fingerprint: string): {\n persistence: string;\n entity: string;\n traits: string[];\n patterns: string[];\n} {\n const match = fingerprint.match(/^(\\w+):e\\[([^\\]]*)\\]_t\\[([^\\]]*)\\]_p\\[([^\\]]*)\\]$/);\n if (!match) {\n return { persistence: 'unknown', entity: '', traits: [], patterns: [] };\n }\n\n return {\n persistence: match[1],\n entity: match[2],\n traits: match[3] ? match[3].split(',') : [],\n patterns: match[4] ? match[4].split(',') : [],\n };\n}\n\n/**\n * Compute similarity score between two fingerprints (0-1).\n */\nexport function fingerprintSimilarity(fp1: string, fp2: string): number {\n if (fp1 === fp2) return 1.0;\n\n const p1 = parseFingerprint(fp1);\n const p2 = parseFingerprint(fp2);\n\n let score = 0;\n let total = 4;\n\n // Persistence match\n if (p1.persistence === p2.persistence) score += 1;\n\n // Entity structure match\n if (p1.entity === p2.entity) score += 1;\n\n // Trait overlap\n const traitOverlap = p1.traits.filter((t) => p2.traits.includes(t)).length;\n const traitUnion = new Set([...p1.traits, ...p2.traits]).size;\n if (traitUnion > 0) {\n score += traitOverlap / traitUnion;\n } else {\n score += 1;\n }\n\n // Pattern overlap\n const patternOverlap = p1.patterns.filter((p) => p2.patterns.includes(p)).length;\n const patternUnion = new Set([...p1.patterns, ...p2.patterns]).size;\n if (patternUnion > 0) {\n score += patternOverlap / patternUnion;\n } else {\n score += 1;\n }\n\n return score / total;\n}\n","/**\n * Structural Templates for Cached Generation\n *\n * Pre-defined templates for common structural patterns.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Template Types\n// ============================================================================\n\nexport interface StructuralTemplate {\n /** Fingerprint pattern this template matches */\n fingerprintPattern: string;\n /** Human-readable name */\n name: string;\n /** Template guidance for generation */\n guidance: string;\n /** Example sections */\n exampleSections: string[];\n}\n\n// ============================================================================\n// Common Templates\n// ============================================================================\n\n/**\n * Templates for common structural patterns.\n */\nexport const STRUCTURAL_TEMPLATES: StructuralTemplate[] = [\n {\n fingerprintPattern: 'persistent:e[*]_t[FormSubmission*]_p[*form*]',\n name: 'CRUD Form Entity',\n guidance: `\nThis is a standard CRUD entity with form submission.\nGenerate pages for:\n- List view with search/filter\n- Create form with validation\n- Edit form with existing data\n- Detail view with actions\n`,\n exampleSections: ['page-header', 'search-filters', 'entity-list', 'form-section', 'form-actions'],\n },\n {\n fingerprintPattern: 'persistent:e[*]_t[*Workflow*]_p[*]',\n name: 'Workflow Entity',\n guidance: `\nThis entity has workflow/state machine behavior.\nInclude:\n- Status indicators in list view\n- Transition actions in detail view\n- Workflow history display\n`,\n exampleSections: ['page-header', 'entity-table', 'entity-detail', 'form-actions'],\n },\n {\n fingerprintPattern: 'runtime:e[*]_t[*]_p[dashboard*]',\n name: 'Dashboard View',\n guidance: `\nThis is a runtime dashboard entity.\nFocus on:\n- Statistics and metrics display\n- Charts and visualizations\n- Recent activity lists\n`,\n exampleSections: ['page-header', 'dashboard-stats', 'chart', 'entity-cards'],\n },\n {\n fingerprintPattern: '*:e[*]_t[Platformer*]_p[game*]',\n name: 'Game Entity',\n guidance: `\nThis is a game entity with platformer mechanics.\nInclude:\n- Game canvas for rendering\n- HUD for score/health display\n- Controls panel for input\n`,\n exampleSections: ['game-canvas', 'game-hud', 'game-controls'],\n },\n];\n\n// ============================================================================\n// Template Matching\n// ============================================================================\n\n/**\n * Find matching templates for a fingerprint.\n */\nexport function findMatchingTemplates(fingerprint: string): StructuralTemplate[] {\n return STRUCTURAL_TEMPLATES.filter((template) =>\n matchesPattern(fingerprint, template.fingerprintPattern)\n );\n}\n\n/**\n * Get the best matching template for a fingerprint.\n */\nexport function getBestTemplate(fingerprint: string): StructuralTemplate | null {\n const matches = findMatchingTemplates(fingerprint);\n return matches.length > 0 ? matches[0] : null;\n}\n\n/**\n * Check if fingerprint matches a pattern.\n * Patterns support * as wildcard.\n */\nfunction matchesPattern(fingerprint: string, pattern: string): boolean {\n // Convert pattern to regex\n const regexStr = pattern\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&') // Escape special chars\n .replace(/\\*/g, '.*'); // Replace * with .*\n\n const regex = new RegExp(`^${regexStr}$`);\n return regex.test(fingerprint);\n}\n\n/**\n * Get guidance for a fingerprint.\n */\nexport function getTemplateGuidance(fingerprint: string): string {\n const template = getBestTemplate(fingerprint);\n if (template) {\n return template.guidance;\n }\n\n return `\nNo specific template matched. Use standard patterns:\n- page-header for page titles\n- entity-list or entity-table for list views\n- form-section for input forms\n- entity-detail for detail views\n`;\n}\n","/**\n * Prompt Assembler for Cache-Aware Prompt Construction\n *\n * Assembles prompts with cache markers for efficient LLM caching.\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalUnit, OrbitalDefinition, EntityRef, Entity } from '@almadar/core/types';\nimport { isOrbitalDefinition, getTraitName, isEntityReference } from '@almadar/core/types';\n\n/**\n * Get entity name safely from EntityRef\n */\nfunction getEntityName(entity: EntityRef): string {\n if (isEntityReference(entity)) {\n return entity.replace('.entity', '');\n }\n return entity.name;\n}\n\n/**\n * Get inline entity for detailed access, or null for references\n */\nfunction getInlineEntity(entity: EntityRef): Entity | null {\n if (isEntityReference(entity)) {\n return null;\n }\n return entity;\n}\nimport { computeOrbitalFingerprint } from './orbital-fingerprint.js';\nimport { getTemplateGuidance, getBestTemplate } from './structural-templates.js';\nimport type { CacheableBlock } from '@almadar/llm';\n\n// ============================================================================\n// Cache Markers\n// ============================================================================\n\n/** Anthropic cache control marker (deprecated - use CacheableBlock instead) */\nconst CACHE_BREAK = '<!-- cache_break -->';\n\n// ============================================================================\n// Context Helpers\n// ============================================================================\n\n/**\n * Build context section from orbital's domainContext and design fields.\n * Passes through existing context to the subagent.\n */\nfunction buildContextSection(orbital: OrbitalDefinition): string {\n const parts: string[] = [];\n\n if (orbital.domainContext) {\n const ctx = orbital.domainContext;\n parts.push(`DomainContext: category=${ctx.category || 'business'}`);\n if (ctx.vocabulary) {\n parts.push(`Vocabulary: ${JSON.stringify(ctx.vocabulary)}`);\n }\n if (ctx.requestFragment) {\n parts.push(`RequestFragment: \"${ctx.requestFragment}\"`);\n }\n }\n\n if (orbital.design) {\n const d = orbital.design;\n if (d.style) parts.push(`Style: ${d.style}`);\n if (d.uxHints) {\n const hints = d.uxHints;\n if (hints.flowPattern) parts.push(`FlowPattern: ${hints.flowPattern}`);\n if (hints.listPattern) parts.push(`ListPattern: ${hints.listPattern}`);\n if (hints.formPattern) parts.push(`FormPattern: ${hints.formPattern}`);\n }\n }\n\n return parts.length > 0 ? `Context: ${parts.join(', ')}\\n` : '';\n}\n\n// ============================================================================\n// Prompt Assembly\n// ============================================================================\n\nexport interface AssembledPrompt {\n /** The full prompt text */\n prompt: string;\n /** Fingerprint for this orbital */\n fingerprint: string;\n /** Whether a cached template was used */\n usedCachedTemplate: boolean;\n /** Template name if used */\n templateName?: string;\n}\n\n/**\n * Cache-aware assembled prompt with separate blocks.\n */\nexport interface CacheableAssembledPrompt {\n /** System blocks (cacheable) */\n systemBlocks: CacheableBlock[];\n /** User blocks (usually not cacheable) */\n userBlocks: CacheableBlock[];\n /** Fingerprint for this orbital */\n fingerprint: string;\n /** Whether a cached template was used */\n usedCachedTemplate: boolean;\n /** Template name if used */\n templateName?: string;\n}\n\n/**\n * Assemble a prompt for orbital unit generation.\n * Organizes content to maximize cache hits.\n * Only works with full orbital definitions (not references).\n */\nexport function assembleOrbitalPrompt(\n orbital: OrbitalUnit,\n baseSystemPrompt: string\n): AssembledPrompt {\n const fingerprint = computeOrbitalFingerprint(orbital);\n const template = getBestTemplate(fingerprint);\n const guidance = getTemplateGuidance(fingerprint);\n\n // Note: Orbital is now always OrbitalDefinition (no more OrbitalReference type)\n // This check is kept for backwards compatibility but always passes\n\n // Structure prompt for optimal caching:\n // 1. Static system prompt (cacheable across all calls)\n // 2. Template guidance (cacheable for similar structures)\n // 3. Specific orbital details (unique per call)\n\n const contextSection = buildContextSection(orbital);\n\n // Get entity details safely\n const entityName = getEntityName(orbital.entity);\n const inlineEntity = getInlineEntity(orbital.entity);\n const persistence = inlineEntity?.persistence || 'persistent';\n const fieldNames = inlineEntity?.fields.map((f: { name: string }) => f.name).join(', ') || 'N/A';\n\n const prompt = `${baseSystemPrompt}\n\n${CACHE_BREAK}\n\n## Structural Template\n${guidance}\n\n${CACHE_BREAK}\n\n## Current Orbital Unit\nName: ${orbital.name}\nEntity: ${entityName}\nPersistence: ${persistence}\nFields: ${fieldNames}\nTraits: ${orbital.traits.map(getTraitName).join(', ')}\n${contextSection}\nGenerate a complete FullOrbitalUnit with:\n- Full field definitions with types and validation\n- Trait state machines with transitions and effects\n- Business rule validation using \"guard\" (singular, NOT \"guards\") S-expression on SAVE transitions\n- Pages with trait references\n- domainContext with category, vocabulary, and requestFragment\n- design with style and uxHints (flowPattern, listPattern, formPattern)\n`;\n\n return {\n prompt,\n fingerprint,\n usedCachedTemplate: template !== null,\n templateName: template?.name,\n };\n}\n\n/**\n * Assemble cacheable blocks for Anthropic prompt caching.\n *\n * Structure:\n * - System block 1: Base system prompt (highly cacheable, rarely changes)\n * - System block 2: Template guidance (cacheable per fingerprint)\n * - User block: Specific orbital details (not cached)\n *\n * Only works with full orbital definitions (not references).\n */\nexport function assembleCacheableOrbitalPrompt(\n orbital: OrbitalUnit,\n baseSystemPrompt: string\n): CacheableAssembledPrompt {\n const fingerprint = computeOrbitalFingerprint(orbital);\n const template = getBestTemplate(fingerprint);\n const guidance = getTemplateGuidance(fingerprint);\n\n // Note: Orbital is now always OrbitalDefinition (no more OrbitalReference type)\n // This check is kept for backwards compatibility but always passes\n\n // System blocks - mark as cacheable\n const systemBlocks: CacheableBlock[] = [\n // Block 1: Base system prompt (very stable, max cache benefit)\n {\n type: 'text',\n text: baseSystemPrompt,\n cache_control: { type: 'ephemeral' },\n },\n // Block 2: Template guidance (stable per fingerprint)\n {\n type: 'text',\n text: `\\n## Structural Template\\n${guidance}`,\n cache_control: { type: 'ephemeral' },\n },\n ];\n\n // Build context section if available\n const contextSection = buildContextSection(orbital);\n\n // Build cross-orbital connectivity section\n const emitsSection = orbital.emits?.length ? `Emits: ${orbital.emits.join(', ')}` : '';\n const listensSection = orbital.listens?.length\n ? `Listens: ${orbital.listens.map((l) => `${l.event}→${l.triggers}`).join(', ')}`\n : '';\n const connectivitySection = [emitsSection, listensSection].filter(Boolean).join('\\n');\n\n // Get entity details safely\n const entityName = getEntityName(orbital.entity);\n const inlineEntity = getInlineEntity(orbital.entity);\n const persistence = inlineEntity?.persistence || 'persistent';\n const fieldNames = inlineEntity?.fields.map((f: { name: string }) => f.name).join(', ') || 'N/A';\n\n // User block - unique per request (not cached)\n const userBlocks: CacheableBlock[] = [\n {\n type: 'text',\n text: `## Current Orbital Unit\nName: ${orbital.name}\nEntity: ${entityName}\nPersistence: ${persistence}\nFields: ${fieldNames}\nTraits: ${orbital.traits.map(getTraitName).join(', ')}\n${contextSection}${connectivitySection ? `\\n${connectivitySection}` : ''}\nGenerate a complete FullOrbitalUnit with:\n- Full field definitions with types and validation\n- Trait state machines with transitions and effects\n- Business rule validation using \"guard\" (singular, NOT \"guards\") S-expression on SAVE transitions\n- Pages with trait references\n- domainContext with category, vocabulary, and requestFragment\n- design with style and uxHints (flowPattern, listPattern, formPattern)\n- PRESERVE emits and listens from input if provided`,\n },\n ];\n\n return {\n systemBlocks,\n userBlocks,\n fingerprint,\n usedCachedTemplate: template !== null,\n templateName: template?.name,\n };\n}\n\n/**\n * Assemble prompts for multiple orbitals.\n * Groups by fingerprint for batch efficiency.\n */\nexport function assembleMultiOrbitalPrompts(\n orbitals: OrbitalUnit[],\n baseSystemPrompt: string\n): Map<string, AssembledPrompt[]> {\n const grouped = new Map<string, AssembledPrompt[]>();\n\n for (const orbital of orbitals) {\n const assembled = assembleOrbitalPrompt(orbital, baseSystemPrompt);\n const existing = grouped.get(assembled.fingerprint) || [];\n existing.push(assembled);\n grouped.set(assembled.fingerprint, existing);\n }\n\n return grouped;\n}\n\n/**\n * Get cache statistics for a set of orbitals.\n */\nexport function getCacheStats(orbitals: OrbitalUnit[]): {\n totalOrbitals: number;\n uniqueFingerprints: number;\n potentialCacheHits: number;\n templateMatches: number;\n} {\n const fingerprints = orbitals.map(computeOrbitalFingerprint);\n const unique = new Set(fingerprints);\n\n let templateMatches = 0;\n for (const orbital of orbitals) {\n const fp = computeOrbitalFingerprint(orbital);\n if (getBestTemplate(fp)) {\n templateMatches++;\n }\n }\n\n return {\n totalOrbitals: orbitals.length,\n uniqueFingerprints: unique.size,\n potentialCacheHits: orbitals.length - unique.size,\n templateMatches,\n };\n}\n\n","/**\n * Orbital Cache Module\n *\n * Exports fingerprinting, templates, and prompt assembly utilities\n * for efficient LLM prompt caching.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Fingerprinting\n// ============================================================================\n\nexport {\n computeOrbitalFingerprint,\n computeEntitySignature,\n fingerprintsMatch,\n parseFingerprint,\n fingerprintSimilarity,\n} from './orbital-fingerprint.js';\n\n// ============================================================================\n// Structural Templates\n// ============================================================================\n\nexport {\n type StructuralTemplate,\n STRUCTURAL_TEMPLATES,\n findMatchingTemplates,\n getBestTemplate,\n getTemplateGuidance,\n} from './structural-templates.js';\n\n// ============================================================================\n// Prompt Assembly\n// ============================================================================\n\nexport {\n type AssembledPrompt,\n type CacheableAssembledPrompt,\n assembleOrbitalPrompt,\n assembleCacheableOrbitalPrompt,\n assembleMultiOrbitalPrompts,\n getCacheStats,\n} from './prompt-assembler.js';\n","/**\n * Execute Tool\n *\n * Sandboxed shell command execution within a workspace directory.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { spawn } from 'child_process';\nimport * as path from 'path';\n\n/**\n * Dangerous commands that should be blocked when targeting outside workspace.\n */\nconst DANGEROUS_COMMANDS = [\n 'rm', 'rmdir', 'mv', 'cp', 'ln', 'chmod', 'chown', 'touch', 'mkdir',\n];\n\n/**\n * Commands that should be blocked entirely for security.\n */\nconst BLOCKED_COMMANDS = [\n 'curl', 'wget', 'nc', 'netcat', 'ssh', 'scp', 'rsync', 'ftp', 'sftp',\n 'sudo', 'su', 'doas', 'pkexec', 'eval', 'exec', 'source',\n 'crontab', 'at', 'systemctl', 'service',\n 'dd', 'mkfs', 'fdisk', 'mount', 'umount',\n 'iptables', 'firewall-cmd',\n 'useradd', 'userdel', 'usermod', 'groupadd', 'passwd',\n];\n\n/**\n * Check if a command contains paths outside the workspace.\n * Returns an error message if unsafe, null if safe.\n */\nexport function validateCommandPaths(command: string, workDir: string): string | null {\n const normalizedWorkDir = path.resolve(workDir);\n\n const firstWord = command.trim().split(/[\\s;|&]/)[0];\n if (BLOCKED_COMMANDS.includes(firstWord)) {\n return `Command blocked: \"${firstWord}\" is not allowed for security reasons.`;\n }\n\n // Block shell output/append redirections to absolute paths outside workspace\n const redirectPattern = /(?:>>?|[12&]>>?)\\s*(\\/([\\w.-]+\\/)*[\\w.-]+)/g;\n let redirectMatch;\n while ((redirectMatch = redirectPattern.exec(command)) !== null) {\n const targetPath = redirectMatch[1];\n if (targetPath !== '/dev/null') {\n const resolvedPath = path.resolve(targetPath);\n if (!resolvedPath.startsWith(normalizedWorkDir)) {\n return `Command blocked: output redirection to \"${targetPath}\" is outside workspace.`;\n }\n }\n }\n\n // Block tee command writing outside workspace\n const teePattern = /\\btee\\s+(?:-a\\s+)?(\\/([\\w.-]+\\/)*[\\w.-]+)/g;\n let teeMatch;\n while ((teeMatch = teePattern.exec(command)) !== null) {\n const targetPath = teeMatch[1];\n const resolvedPath = path.resolve(targetPath);\n if (!resolvedPath.startsWith(normalizedWorkDir)) {\n return `Command blocked: tee to \"${targetPath}\" is outside workspace.`;\n }\n }\n\n // Check dangerous commands for path arguments\n for (const cmd of DANGEROUS_COMMANDS) {\n const cmdPattern = new RegExp(`\\\\b${cmd}\\\\s+[^|;&]*`, 'g');\n let cmdMatch;\n while ((cmdMatch = cmdPattern.exec(command)) !== null) {\n const cmdWithArgs = cmdMatch[0];\n const pathsInCmd = cmdWithArgs.match(/\\/([\\w.-]+\\/)*[\\w.-]+/g) || [];\n for (const foundPath of pathsInCmd) {\n if (foundPath === '/dev/null' || foundPath.startsWith('/tmp/')) continue;\n const resolvedPath = path.resolve(foundPath);\n if (!resolvedPath.startsWith(normalizedWorkDir)) {\n return `Command blocked: \"${cmd}\" with path \"${foundPath}\" is outside workspace.`;\n }\n }\n }\n }\n\n // Check absolute paths\n const absolutePathPattern = /(?:^|[\\s'\"=])(\\/([\\w.-]+\\/)+[\\w.-]*)/g;\n let match;\n while ((match = absolutePathPattern.exec(command)) !== null) {\n const foundPath = match[1];\n if (foundPath.startsWith('/dev/') || foundPath.startsWith('/tmp/') || foundPath === '/dev/null') {\n continue;\n }\n const resolvedPath = path.resolve(foundPath);\n if (!resolvedPath.startsWith(normalizedWorkDir)) {\n return `Command blocked: path \"${foundPath}\" is outside workspace.`;\n }\n }\n\n // Block cd to outside workspace\n if (command.includes('cd /') && !command.includes(`cd ${normalizedWorkDir}`)) {\n const cdMatch = command.match(/cd\\s+(\\/[^\\s;|&]+)/);\n if (cdMatch) {\n const cdTarget = path.resolve(cdMatch[1]);\n if (!cdTarget.startsWith(normalizedWorkDir)) {\n return `Command blocked: \"cd ${cdMatch[1]}\" would navigate outside workspace.`;\n }\n }\n }\n\n // Block complex command substitution\n if (command.includes('`') || /\\$\\([^)]+\\)/.test(command)) {\n const simpleSubstitutions = /\\$\\((pwd|echo|date|whoami)\\)/g;\n const strippedCommand = command.replace(simpleSubstitutions, '');\n if (strippedCommand.includes('`') || /\\$\\([^)]+\\)/.test(strippedCommand)) {\n return `Command blocked: complex command substitution detected.`;\n }\n }\n\n return null;\n}\n\n/**\n * Create an execute tool that runs shell commands in the workspace directory.\n */\nexport function createExecuteTool(workDir: string) {\n const normalizedWorkDir = path.resolve(workDir);\n\n return tool(\n async ({ command, timeout = 60000 }) => {\n const validationError = validateCommandPaths(command, workDir);\n if (validationError) {\n return validationError;\n }\n\n return new Promise<string>((resolve) => {\n const parts = command.split(' ');\n const cmd = parts[0];\n const args = parts.slice(1);\n\n const proc = spawn(cmd, args, {\n cwd: workDir,\n shell: true,\n timeout,\n env: {\n PATH: process.env.PATH,\n NODE_PATH: process.env.NODE_PATH,\n NVM_DIR: process.env.NVM_DIR,\n NVM_BIN: process.env.NVM_BIN,\n SHELL: '/bin/sh',\n TERM: 'dumb',\n LANG: process.env.LANG || 'en_US.UTF-8',\n CI: 'true',\n HOME: normalizedWorkDir,\n TMPDIR: path.join(normalizedWorkDir, '.tmp'),\n TEMP: path.join(normalizedWorkDir, '.tmp'),\n TMP: path.join(normalizedWorkDir, '.tmp'),\n HISTFILE: '/dev/null',\n npm_config_cache: path.join(normalizedWorkDir, '.npm-cache'),\n npm_config_prefix: normalizedWorkDir,\n },\n });\n\n let stdout = '';\n let stderr = '';\n\n proc.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n\n proc.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n proc.on('error', (error) => {\n resolve(`Error executing command: ${error.message}`);\n });\n\n proc.on('close', (code) => {\n const output = stdout + (stderr ? `\\n\\nStderr:\\n${stderr}` : '');\n if (code === 0) {\n resolve(output || 'Command completed successfully (no output)');\n } else {\n resolve(`Command exited with code ${code}\\n\\n${output}`);\n }\n });\n\n setTimeout(() => {\n proc.kill('SIGTERM');\n resolve(`Command timed out after ${timeout}ms`);\n }, timeout);\n });\n },\n {\n name: 'execute',\n description: `Execute a shell command in the workspace directory.\n\nIMPORTANT: You are restricted to your workspace directory. Use RELATIVE paths only:\n- ./schema.json (NOT /schema.json or absolute paths)\n- ./app (NOT /app or absolute paths)\n\nExamples:\n- orbital validate ./schema.json --json\n- npx kflow compile ./schema.json -o ./app --verify\n- cd ./app && npm install\n\nCommands using absolute paths outside your workspace will be blocked.`,\n schema: z.object({\n command: z.string().describe('The shell command to execute'),\n timeout: z.number().optional().describe('Timeout in milliseconds (default: 60000)'),\n }),\n },\n );\n}\n","/**\n * Schema Validation Tool\n *\n * Validates orbital schemas using the @almadar/cli npm package.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\n\nconst execAsync = promisify(exec);\n\n/**\n * Maximum number of validation attempts before forcing stop.\n */\nconst MAX_VALIDATION_ATTEMPTS = 5;\n\n/**\n * Create a validate_schema tool that validates schema.json in the workspace.\n *\n * Uses `npx @almadar/cli validate --json` for comprehensive Rust-based validation.\n *\n * Has a built-in cap of MAX_VALIDATION_ATTEMPTS to prevent\n * infinite validation-fix loops.\n */\nexport function createValidateSchemaTool(workDir: string) {\n const schemaPath = path.join(workDir, 'schema.json');\n let validationAttempts = 0;\n\n return tool(\n async () => {\n validationAttempts++;\n\n if (validationAttempts > MAX_VALIDATION_ATTEMPTS) {\n return JSON.stringify({\n success: true,\n valid: false,\n cappedValidation: true,\n message:\n `⚠️ VALIDATION CAP REACHED (${MAX_VALIDATION_ATTEMPTS} attempts). ` +\n `You've tried to fix this schema ${validationAttempts} times. ` +\n `STOP fixing validation errors and proceed with what you have.`,\n recommendation: 'STOP_FIXING',\n });\n }\n\n try {\n try {\n await fs.access(schemaPath);\n } catch {\n return JSON.stringify({\n success: false,\n valid: false,\n validationAttempt: validationAttempts,\n errors: [{\n code: 'FILE_NOT_FOUND',\n path: '',\n message: 'File not found: schema.json. Create it first with write_file.',\n }],\n });\n }\n\n const { stdout, stderr } = await execAsync(\n `npx @almadar/cli validate \"${schemaPath}\" --json`,\n { timeout: 30000 },\n );\n\n let cliResult: {\n success: boolean;\n valid: boolean;\n errors?: Array<{\n code: string;\n path: string;\n message: string;\n suggestion?: string;\n fixGuidance?: string;\n expectedShape?: string;\n validValues?: string[];\n }>;\n warnings?: Array<{\n code: string;\n path: string;\n message: string;\n suggestion?: string;\n }>;\n stats?: {\n orbitals: number;\n entities: number;\n traits: number;\n pages: number;\n };\n };\n\n try {\n cliResult = JSON.parse(stdout);\n } catch {\n return JSON.stringify({\n success: false,\n valid: false,\n validationAttempt: validationAttempts,\n errors: [{\n code: 'CLI_OUTPUT_ERROR',\n path: '',\n message: `Failed to parse orbital CLI output: ${stdout || stderr}`,\n }],\n });\n }\n\n const response = {\n ...cliResult,\n validationAttempt: validationAttempts,\n remainingAttempts: MAX_VALIDATION_ATTEMPTS - validationAttempts,\n ...(validationAttempts >= MAX_VALIDATION_ATTEMPTS - 1 && !cliResult.valid\n ? {\n warning:\n `⚠️ Only ${MAX_VALIDATION_ATTEMPTS - validationAttempts} validation attempt(s) remaining.`,\n }\n : {}),\n };\n\n return JSON.stringify(response);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n if (errorMessage.includes('ENOENT') || errorMessage.includes('not found')) {\n return JSON.stringify({\n success: false,\n valid: false,\n validationAttempt: validationAttempts,\n errors: [{\n code: 'CLI_NOT_FOUND',\n path: '',\n message: '@almadar/cli not found. Ensure it is installed or accessible via npx.',\n suggestion: 'Install with: npm install -g @almadar/cli or ensure npx can access it.',\n }],\n });\n }\n\n return JSON.stringify({\n success: false,\n valid: false,\n validationAttempt: validationAttempts,\n errors: [{\n code: 'VALIDATION_ERROR',\n path: '',\n message: `Validation error: ${errorMessage}`,\n }],\n });\n }\n },\n {\n name: 'validate_schema',\n description: `Validate the schema.json file in the workspace.\n\nRuns validation using \\`npx @almadar/cli validate --json\\`.\n\nReturns detailed errors with code, path, message, suggestion, and expectedShape.\n\n⚠️ VALIDATION CAP: You have a maximum of 5 validation attempts.`,\n schema: z.object({}),\n },\n );\n}\n","/**\n * Schema Generation Tool (via Structured Output LLM)\n *\n * Generates KFlow schemas using OpenAI's structured output mode.\n * Uses @almadar/llm StructuredOutputClient directly.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { OrbitalSchema } from '@almadar/core/types';\nimport {\n getStructuredOutputClient,\n isStructuredOutputAvailable,\n} from '@almadar/llm';\n\nconst GenerateSchemaInputSchema = z.object({\n userRequest: z.string().describe('The user\\'s natural language description'),\n suggestedTraits: z.array(z.string()).optional().describe('Suggested traits'),\n suggestedEntities: z.array(z.string()).optional().describe('Suggested entity names'),\n suggestedPages: z.array(z.string()).optional().describe('Suggested page types/names'),\n suggestedPatterns: z.array(z.string()).optional().describe('Suggested section patterns'),\n additionalInstructions: z.string().optional().describe('Additional instructions'),\n existingSchema: z.string().optional().describe('Existing schema JSON to update'),\n});\n\n/**\n * Create a tool that generates KFlow schemas using structured output.\n */\nexport function createGenerateSchemaTool() {\n return tool(\n async (input) => {\n if (!isStructuredOutputAvailable()) {\n return JSON.stringify({\n success: false,\n error: 'Structured output generation is not available. Set OPENAI_API_KEY.',\n });\n }\n\n try {\n let enhancedRequest = input.userRequest;\n\n if (input.suggestedEntities?.length) {\n enhancedRequest += `\\n\\nSuggested entities: ${input.suggestedEntities.join(', ')}`;\n }\n if (input.suggestedTraits?.length) {\n enhancedRequest += `\\n\\nSuggested traits: ${input.suggestedTraits.join(', ')}`;\n }\n if (input.suggestedPages?.length) {\n enhancedRequest += `\\n\\nSuggested pages: ${input.suggestedPages.join(', ')}`;\n }\n if (input.suggestedPatterns?.length) {\n enhancedRequest += `\\n\\nSuggested section patterns: ${input.suggestedPatterns.join(', ')}`;\n }\n\n const client = getStructuredOutputClient();\n\n const result = await client.generate<OrbitalSchema>({\n userRequest: enhancedRequest,\n schemaName: 'kflow_schema',\n additionalInstructions: input.additionalInstructions,\n existingContext: input.existingSchema,\n });\n\n return JSON.stringify({\n success: true,\n schema: result.data,\n usage: result.usage,\n latencyMs: result.latencyMs,\n model: result.model,\n zodValidation: result.zodValidation,\n }, null, 2);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return JSON.stringify({\n success: false,\n error: errorMessage,\n suggestion: 'Check the error message and try again with adjusted guidance.',\n });\n }\n },\n {\n name: 'generate_schema',\n description: `Generate a KFlow schema using structured output LLM.\n\nUse this to generate the BULK of the schema quickly, then surgically edit as needed.\n\nGUIDANCE YOU CAN PROVIDE:\n- suggestedTraits, suggestedEntities, suggestedPages, suggestedPatterns\n- additionalInstructions\n- existingSchema (for updates)`,\n schema: GenerateSchemaInputSchema,\n },\n );\n}\n","/**\n * Orbital Combiner\n *\n * Deterministically combines multiple Orbitals into a single OrbitalSchema.\n * This removes the need for LLM involvement in the combining step.\n *\n * All UI is rendered via render_ui effects from traits (no static sections).\n *\n * NOTE: Validation is handled externally via `orbital validate` CLI.\n * The combiner only assembles schemas - it does not validate them.\n *\n * @packageDocumentation\n */\n\nimport type {\n Orbital,\n OrbitalSchema,\n DomainContext,\n OrbitalDefinition,\n PageRef,\n Page,\n} from \"@almadar/core/types\";\nimport { isOrbitalDefinition, isPageReferenceString, isPageReferenceObject } from \"@almadar/core/types\";\n\n/**\n * Check if page is an inline definition (not a reference)\n */\nfunction isInlinePage(page: PageRef): page is Page {\n return !isPageReferenceString(page) && !isPageReferenceObject(page);\n}\n\n// Validation result type for API compatibility (actual validation done via Rust CLI)\nexport interface OrbitalSchemaValidationResult {\n valid: boolean;\n errors: Array<{ code: string; message: string; path?: string }>;\n warnings: Array<{ code: string; message: string; path?: string }>;\n}\n\n// Backward compatibility alias\ntype FullOrbitalUnit = Orbital;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CombinerOptions {\n /** Application name */\n name: string;\n /** Optional description */\n description?: string;\n /** Schema version */\n version?: string;\n /** Domain context */\n domain?: DomainContext;\n /** Whether to run validation (default: true) */\n validate?: boolean;\n /** Global theme */\n theme?: string;\n /** Default route (first page if not specified) */\n defaultRoute?: string;\n}\n\nexport interface CombinerResult {\n /** Whether combining succeeded */\n success: boolean;\n /** The combined OrbitalSchema (if successful) */\n schema?: OrbitalSchema;\n /** Validation result (if validation was run) */\n validation?: OrbitalSchemaValidationResult;\n /** Error message (if failed) */\n error?: string;\n /** Statistics about the combining */\n stats: {\n totalOrbitals: number;\n totalEntities: number;\n totalPages: number;\n totalTraits: number;\n };\n}\n\n// ============================================================================\n// Combiner Implementation\n// ============================================================================\n\n/**\n * Combine multiple Orbitals into a single OrbitalSchema.\n *\n * This function performs deterministic merging:\n * 1. Builds an OrbitalSchema from the Orbitals\n * 2. Optionally runs validation\n *\n * Note: All UI is rendered via render_ui effects from traits.\n *\n * @example\n * ```typescript\n * const result = combineOrbitals([taskOrbital, userOrbital], {\n * name: 'My App',\n * validate: true,\n * });\n *\n * if (result.success) {\n * // Write schema to file\n * await fs.writeFile('schema.json', JSON.stringify(result.schema, null, 2));\n * } else {\n * console.error(result.error);\n * console.error(result.validation?.errors);\n * }\n * ```\n */\nexport function combineOrbitals(\n orbitals: FullOrbitalUnit[],\n options: CombinerOptions,\n): CombinerResult {\n const {\n name,\n description,\n version = \"1.0.0\",\n domain,\n validate = true,\n theme,\n } = options;\n\n // Filter to only full orbital definitions for stats\n const orbitalDefs = orbitals.filter(isOrbitalDefinition);\n\n // Stats\n const stats = {\n totalOrbitals: orbitals.length,\n totalEntities: orbitalDefs.length, // 1 entity per orbital definition\n totalPages: orbitalDefs.reduce((sum, o) => sum + o.pages.length, 0),\n totalTraits: orbitalDefs.reduce((sum, o) => sum + o.traits.length, 0),\n };\n\n // Handle empty input\n if (orbitals.length === 0) {\n return {\n success: false,\n error: \"No orbitals provided. At least one Orbital is required.\",\n stats,\n };\n }\n\n try {\n // Build OrbitalSchema from Orbitals\n const orbitalSchema: OrbitalSchema = {\n name,\n description,\n version,\n domainContext: domain,\n orbitals,\n config: theme\n ? {\n theme: { primary: theme },\n }\n : undefined,\n };\n\n // NOTE: Validation is deprecated in combiner - use `orbital validate` CLI instead\n // The validate option is kept for API compatibility but does not run validation\n const validation: OrbitalSchemaValidationResult | undefined = validate\n ? { valid: true, errors: [], warnings: [] }\n : undefined;\n\n return {\n success: true,\n schema: orbitalSchema,\n validation,\n stats,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n stats,\n };\n }\n}\n\n// Legacy alias removed - use combineOrbitals() directly\n\n/**\n * Combine orbitals and return only the schema (throws on error).\n * Use this when you want a simple API and will handle errors upstream.\n */\nexport function combineOrbitalsToSchema(\n orbitals: FullOrbitalUnit[],\n options: CombinerOptions,\n): OrbitalSchema {\n const result = combineOrbitals(orbitals, options);\n if (!result.success || !result.schema) {\n throw new Error(result.error || \"Failed to combine orbitals\");\n }\n return result.schema;\n}\n\n/**\n * Estimate the combination complexity (for progress indication).\n */\nexport function estimateCombineComplexity(orbitals: FullOrbitalUnit[]): {\n entities: number;\n pages: number;\n traits: number;\n totalSections: number;\n} {\n // Filter to only full orbital definitions\n const orbitalDefs = orbitals.filter(isOrbitalDefinition);\n return {\n entities: orbitalDefs.length,\n pages: orbitalDefs.reduce((sum, o) => sum + o.pages.length, 0),\n traits: orbitalDefs.reduce((sum, o) => sum + o.traits.length, 0),\n // Note: sections are no longer supported in trait-driven pages\n // Only count traits from inline page definitions (not references)\n totalSections: orbitalDefs.reduce(\n (sum, o) =>\n sum +\n o.pages.filter(isInlinePage).reduce((pSum: number, p) => pSum + (p.traits?.length ?? 0), 0),\n 0,\n ),\n };\n}\n","/**\n * Domain Language Module\n *\n * MIGRATED: The core domain language engine has been moved to @almadar/core.\n * This file re-exports everything from the core package for backward compatibility.\n * Only agent-specific modules (prompts) remain here.\n */\n\n// Core domain language engine (types, lexer, parsers, formatters, sync, registry)\nexport * from '@almadar/core/domain-language';\n\n// Agent-specific: LLM prompt templates for domain language generation\nexport * from './prompts/index.js';\n","/**\n * Domain Language Syntax Reference\n *\n * Complete syntax reference for the Orbital Domain Language.\n *\n * @packageDocumentation\n */\n\nexport const ODL_SYNTAX_REFERENCE = `\n## Domain Language Syntax\n\n### Entity Definition\n\n\\`\\`\\`\nA [EntityName] is a [persistence] entity that:\n - has [fieldName] as [type] (required|optional)\n - has [fieldName] as [type] with default [value]\n - belongs to [RelatedEntity]\n - belongs to [RelatedEntity] as [alias]\n - has many [RelatedEntity]s\n\\`\\`\\`\n\n**Persistence types:**\n- \\`persistent\\` - Stored in database (default)\n- \\`runtime\\` - Memory only, for games/UI state\n- \\`singleton\\` - Single instance, for config\n\n**Field types:**\n- \\`text\\` / \\`long text\\` - String fields\n- \\`number\\` / \\`currency\\` - Numeric fields\n- \\`yes/no\\` - Boolean fields\n- \\`date\\` / \\`timestamp\\` / \\`datetime\\` - Date fields\n- \\`enum [val1, val2]\\` - Enumeration\n- \\`list\\` / \\`object\\` - Complex types\n\n### Page Definition\n\n\\`\\`\\`\n[PageName] at /[path]:\n - shows [Entity] using [TraitName]\n - view type: [list|detail|create|edit|dashboard]\n - is initial page\n\\`\\`\\`\n\n### Behavior Definition\n\n\\`\\`\\`\n[BehaviorName] behavior:\n States: [State1], [State2], [State3]\n Initial: [State1]\n\n Transitions:\n - From [State1] to [State2] on [EVENT_NAME]\n if [guard condition]\n then [effect1]\n then [effect2]\n\\`\\`\\`\n\n### Section Headers\n\nDomain Language text is organized into sections:\n\n\\`\\`\\`\n# Entities\n[entity definitions]\n\n# Pages\n[page definitions]\n\n# Behaviors\n[behavior/trait definitions]\n\\`\\`\\`\n`;\n","/**\n * Domain Language Examples\n *\n * Complete examples of Domain Language for common patterns.\n *\n * @packageDocumentation\n */\n\nexport const ODL_EXAMPLES = `\n## Complete Example\n\n### Entity\n\n\\`\\`\\`\nA Task is a persistent entity that:\n - has title as text (required)\n - has description as long text\n - has status as enum [todo, in_progress, done] with default \"todo\"\n - has dueDate as date\n - belongs to User as assignee\n - belongs to Project\n\\`\\`\\`\n\n### Page\n\n\\`\\`\\`\nTasksPage at /tasks:\n - shows Task using TaskManagement\n - view type: list\n - is initial page\n\\`\\`\\`\n\n### Behavior\n\n\\`\\`\\`\nTaskManagement behavior:\n States: Viewing, Editing, Creating\n Initial: Viewing\n\n Transitions:\n - From Viewing to Viewing on INIT\n then render page-header to main with title 'Tasks'\n then render entity-table to center for Task\n\n - From Viewing to Editing on EDIT_TASK\n then render form-section to modal for Task\n\n - From Editing to Viewing on SAVE_TASK\n then persist update Task\n then render null to modal\n then emit TASK_UPDATED\n\\`\\`\\`\n\n## Multi-Entity Example\n\n\\`\\`\\`\n# Entities\n\nA User is a persistent entity that:\n - has name as text (required)\n - has email as text (required)\n - has role as enum [admin, user, guest] with default \"user\"\n\nA Project is a persistent entity that:\n - has name as text (required)\n - has description as long text\n - has status as enum [active, archived] with default \"active\"\n - belongs to User as owner\n\nA Task is a persistent entity that:\n - has title as text (required)\n - has status as enum [todo, in_progress, done] with default \"todo\"\n - has priority as number with default 0\n - belongs to Project\n - belongs to User as assignee\n\n# Pages\n\nProjectsPage at /projects:\n - shows Project using ProjectManagement\n - view type: list\n - is initial page\n\nTasksPage at /projects/:projectId/tasks:\n - shows Task using TaskManagement\n - view type: list\n\n# Behaviors\n\nProjectManagement behavior:\n States: List, Detail\n Initial: List\n\n Transitions:\n - From List to List on INIT\n then render entity-table to main for Project\n\n - From List to Detail on VIEW_PROJECT\n then render entity-detail to drawer for Project\n\nTaskManagement behavior:\n States: Viewing, Editing\n Initial: Viewing\n\n Transitions:\n - From Viewing to Viewing on INIT\n then [\"render-ui\", \"main\", {\"type\": \"entity-table\", \"entity\": \"Task\", \"itemActions\": [{\"label\": \"Edit\", \"event\": \"EDIT_TASK\"}, {\"label\": \"Delete\", \"event\": \"DELETE_TASK\", \"variant\": \"danger\"}]}]\n\n - From Viewing to Editing on EDIT_TASK\n then render form-section to modal for Task\n\n - From Editing to Viewing on SAVE_TASK\n then persist update Task\n then render null to modal\n\\`\\`\\`\n\n## Dashboard Example (Complex Patterns)\n\n\\`\\`\\`\nDashboard behavior:\n States: Viewing\n Initial: Viewing\n\n Transitions:\n - From Viewing to Viewing on INIT\n then render page-header to main with title 'Dashboard'\n then [\"render-ui\", \"center\", {\"type\": \"stats\", \"metrics\": [{\"field\": \"totalTasks\", \"label\": \"Total Tasks\"}, {\"field\": \"completedTasks\", \"label\": \"Completed\"}, {\"field\": \"overdueTasks\", \"label\": \"Overdue\"}]}]\n then [\"render-ui\", \"bottom\", {\"type\": \"tabs\", \"tabs\": [{\"id\": \"overview\", \"label\": \"Overview\", \"event\": \"VIEW_OVERVIEW\"}, {\"id\": \"recent\", \"label\": \"Recent Activity\", \"event\": \"VIEW_RECENT\"}]}]\n\\`\\`\\`\n\n**Note**: Use inline JSON for \\`render-ui\\` effects with complex props (metrics, tabs, itemActions, cells).\n`;\n","/**\n * Domain Language Common Patterns\n *\n * Reusable patterns for common application types.\n *\n * @packageDocumentation\n */\n\nexport const ODL_PATTERNS = `\n## Common Patterns\n\n### CRUD Pattern\n\n\\`\\`\\`\n[Entity]Management behavior:\n States: List, Detail, Create, Edit\n Initial: List\n\n Transitions:\n - From List to List on INIT\n then render entity-table to main for [Entity]\n\n - From List to Create on CREATE_[ENTITY]\n then render form-section to modal for [Entity]\n\n - From Create to List on SUBMIT_CREATE\n then persist create [Entity]\n then render null to modal\n\n - From List to Detail on VIEW_[ENTITY]\n then render entity-detail to drawer for [Entity]\n\n - From Detail to Edit on EDIT_[ENTITY]\n then render form-section to modal for [Entity]\n\n - From Edit to Detail on SUBMIT_EDIT\n then persist update [Entity]\n then render null to modal\n\n - From Detail to List on DELETE_[ENTITY]\n then persist delete [Entity]\n then render null to drawer\n\\`\\`\\`\n\n### Game Health Pattern\n\n\\`\\`\\`\nHealth behavior:\n States: Healthy, Wounded, Critical, Dead\n Initial: Healthy\n\n Transitions:\n - From Healthy to Wounded on TAKE_DAMAGE\n if health >= 30 and health < 70\n then update status to 'wounded'\n\n - From Wounded to Critical on TAKE_DAMAGE\n if health < 30\n then update status to 'critical'\n\n - From Critical to Dead on TAKE_DAMAGE\n if health <= 0\n then update isAlive to false\n then emit ENTITY_DIED\n\\`\\`\\`\n\n### Approval Workflow Pattern\n\n\\`\\`\\`\nApprovalWorkflow behavior:\n States: Draft, Pending, Approved, Rejected\n Initial: Draft\n\n Transitions:\n - From Draft to Pending on SUBMIT\n then update status to 'pending'\n then emit APPROVAL_REQUESTED\n\n - From Pending to Approved on APPROVE\n then update status to 'approved'\n then update approvedAt to now\n then emit APPROVAL_GRANTED\n\n - From Pending to Rejected on REJECT\n then update status to 'rejected'\n then emit APPROVAL_DENIED\n\n - From Rejected to Draft on REVISE\n then update status to 'draft'\n\\`\\`\\`\n\n### Form Validation Pattern\n\n\\`\\`\\`\nFormValidation behavior:\n States: Idle, Validating, Valid, Invalid\n Initial: Idle\n\n Transitions:\n - From Idle to Validating on VALIDATE\n then update isValidating to true\n\n - From Validating to Valid on VALIDATION_SUCCESS\n then update isValidating to false\n then update errors to null\n\n - From Validating to Invalid on VALIDATION_FAILED\n then update isValidating to false\n\n - From Invalid to Validating on VALIDATE\n then update isValidating to true\n\n - From Valid to Idle on RESET\n then update errors to null\n\\`\\`\\`\n\n### Dashboard Pattern\n\n\\`\\`\\`\nDashboardView behavior:\n States: Loading, Ready\n Initial: Loading\n\n Transitions:\n - From Loading to Ready on DATA_LOADED\n then render stats to main\n then render entity-cards to center\n\n - From Ready to Loading on REFRESH\n then emit FETCH_DASHBOARD_DATA\n\\`\\`\\`\n`;\n","/**\n * Domain Language to OrbitalSchema Mapping\n *\n * Reference for how Domain Language maps to OrbitalSchema JSON.\n *\n * @packageDocumentation\n */\n\nexport const ODL_TO_SCHEMA_MAPPING = `\n## Domain Language -> OrbitalSchema Mapping\n\n| Domain Language | OrbitalSchema |\n|-----------------|---------------|\n| \"A Task is...\" | \\`{ \"entity\": { \"name\": \"Task\", ... } }\\` |\n| \"persistent entity\" | \\`\"persistence\": \"persistent\"\\` |\n| \"runtime entity\" | \\`\"persistence\": \"runtime\"\\` |\n| \"singleton entity\" | \\`\"persistence\": \"singleton\"\\` |\n| \"has X as text\" | \\`{ \"name\": \"X\", \"type\": \"string\" }\\` |\n| \"has X as number\" | \\`{ \"name\": \"X\", \"type\": \"number\" }\\` |\n| \"has X as yes/no\" | \\`{ \"name\": \"X\", \"type\": \"boolean\" }\\` |\n| \"has X as enum [a, b]\" | \\`{ \"name\": \"X\", \"type\": \"enum\", \"values\": [\"a\", \"b\"] }\\` |\n| \"belongs to Y\" | \\`{ \"type\": \"relation\", \"relation\": { \"entity\": \"Y\" } }\\` |\n| \"belongs to Y as alias\" | \\`{ \"name\": \"alias\", \"type\": \"relation\", \"relation\": { \"entity\": \"Y\" } }\\` |\n| \"States: A, B\" | \\`\"states\": [{ \"name\": \"A\" }, { \"name\": \"B\" }]\\` |\n| \"Initial: A\" | \\`{ \"name\": \"A\", \"isInitial\": true }\\` |\n| \"From X to Y on Z\" | \\`{ \"from\": \"X\", \"to\": \"Y\", \"event\": \"Z\" }\\` |\n| \"if health >= 0\" | \\`\"guard\": [\">=\", \"@entity.health\", 0]\\` |\n| \"then update status to 'done'\" | \\`\"effects\": [[\"set\", \"@entity.status\", \"done\"]]\\` |\n| \"then emit EVENT\" | \\`\"effects\": [[\"emit\", \"EVENT\"]]\\` |\n| \"then render X to slot\" | \\`\"effects\": [[\"render-ui\", \"slot\", { \"type\": \"X\" }]]\\` |\n| \"then persist create Task\" | \\`\"effects\": [[\"persist\", \"create\", \"Task\"]]\\` |\n| \"then navigate to /path\" | \\`\"effects\": [[\"navigate\", \"/path\"]]\\` |\n\n## Conversion Process\n\n1. **Parse Domain Language** - Split into sections (Entities, Pages, Behaviors)\n2. **Extract entities** - Parse \"A X is...\" definitions\n3. **Extract pages** - Parse \"[Name] at /path\" definitions\n4. **Extract behaviors** - Parse \"[Name] behavior:\" definitions\n5. **Parse guards** - Convert human-readable conditions to S-expressions\n6. **Parse effects** - Convert human-readable effects to S-expressions\n7. **Assemble schema** - Build OrbitalSchema JSON structure\n\n## CLI Commands\n\n\\`\\`\\`bash\n# Convert Domain Language to OrbitalSchema\nnpx kflow domain:to-schema input.txt -o output.orb\n\n# Convert OrbitalSchema to Domain Language\nnpx kflow domain:to-text input.orb -o output.txt\n\n# Validate round-trip conversion\nnpx kflow domain:validate input.orb --verbose\n\\`\\`\\`\n`;\n","/**\n * Finish Task Tool\n *\n * Signals the agent has completed the workflow. Automatically combines\n * orbitals and validates the result.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport type { FullOrbitalUnit } from '@almadar/core/types';\nimport { combineOrbitals } from '../orbitals/combiner/index.js';\nimport { convertDomainToSchema } from '../orbitals/domain-language/index.js';\n\nconst execAsync = promisify(exec);\n\n/**\n * Auto-collect orbitals from the .orbitals/ directory in the workspace.\n */\nasync function collectOrbitalsFromDir(workDir: string): Promise<FullOrbitalUnit[]> {\n const orbitalsDir = path.join(workDir, '.orbitals');\n\n try {\n const dirStat = await fs.stat(orbitalsDir);\n if (!dirStat.isDirectory()) {\n return [];\n }\n } catch {\n return [];\n }\n\n const files = await fs.readdir(orbitalsDir);\n const jsonFiles = files.filter((f) => f.endsWith('.json'));\n\n if (jsonFiles.length === 0) {\n return [];\n }\n\n const orbitals: FullOrbitalUnit[] = [];\n for (const file of jsonFiles) {\n try {\n const content = await fs.readFile(path.join(orbitalsDir, file), 'utf-8');\n orbitals.push(JSON.parse(content));\n } catch {\n // Skip invalid files\n }\n }\n\n return orbitals;\n}\n\n/**\n * Validate schema using orbital CLI.\n */\nasync function validateSchemaWithCLI(schemaPath: string): Promise<{\n valid: boolean;\n errors: Array<{ code: string; path: string; message: string; suggestion?: string }>;\n warnings: Array<{ code: string; path: string; message: string }>;\n stats?: { orbitals: number; entities: number; traits: number; pages: number };\n}> {\n try {\n const { stdout } = await execAsync(\n `orbital validate \"${schemaPath}\" --json`,\n { timeout: 30000 },\n );\n const result = JSON.parse(stdout);\n return {\n valid: result.valid,\n errors: result.errors || [],\n warnings: result.warnings || [],\n stats: result.stats,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return {\n valid: false,\n errors: [{ code: 'CLI_ERROR', path: '', message: `Validation CLI error: ${errorMessage}` }],\n warnings: [],\n };\n }\n}\n\n/**\n * Create a finish_task tool that signals the agent has completed the workflow.\n *\n * Automatically combines orbitals from:\n * 1. .orbitals/ directory (for kflow-orbitals skill)\n * 2. domain.txt (for lean skills) - converted to schema via convertDomainToSchema\n */\nexport function createFinishTaskTool(workDir: string | undefined) {\n return tool(\n async (input) => {\n let combinedSchema = null;\n let stats = null;\n let validationResult: {\n valid: boolean;\n errors: Array<{ code: string; path: string; message: string }>;\n warnings: Array<{ code: string; path: string; message: string }>;\n } | null = null;\n let source: 'orbitals' | 'domain' | null = null;\n\n if (workDir) {\n // Strategy 1: Try .orbitals/ directory\n const orbitals = await collectOrbitalsFromDir(workDir);\n\n if (orbitals.length > 0) {\n source = 'orbitals';\n const appName =\n input.summary?.match(/Generated \\d+ orbitals?:?\\s*(.+)/)?.[1] ||\n orbitals[0]?.name ||\n 'Application';\n\n const result = combineOrbitals(orbitals, {\n name: appName,\n validate: false,\n });\n\n if (result.success && result.schema) {\n combinedSchema = result.schema;\n stats = result.stats;\n }\n } else {\n // Strategy 2: Try domain.txt\n const domainPath = path.join(workDir, 'domain.txt');\n try {\n const domainText = await fs.readFile(domainPath, 'utf-8');\n if (domainText.trim()) {\n source = 'domain';\n const appName =\n input.summary?.match(/Generated \\d+ orbitals?:?\\s*(.+)/)?.[1] ||\n 'Application';\n\n const domainResult = convertDomainToSchema(domainText, {\n name: appName,\n orbitals: [],\n });\n\n if (domainResult.success && domainResult.schema) {\n combinedSchema = domainResult.schema;\n const traitCount = (domainResult.schema.orbitals || []).reduce(\n (count, o) => count + ('traits' in o ? (o as { traits?: unknown[] }).traits?.length || 0 : 0),\n 0,\n );\n stats = {\n totalOrbitals: domainResult.schema.orbitals?.length || 0,\n totalEntities: domainResult.schema.orbitals?.length || 0,\n totalTraits: traitCount,\n totalPages:\n domainResult.schema.orbitals?.reduce(\n (sum, o) => sum + ('pages' in o ? (o as { pages?: unknown[] }).pages?.length || 0 : 0),\n 0,\n ) || 0,\n };\n }\n }\n } catch {\n // No domain.txt found\n }\n }\n\n // Write combined schema if we got one\n if (combinedSchema) {\n const schemaPath = path.join(workDir, 'schema.json');\n await fs.writeFile(schemaPath, JSON.stringify(combinedSchema, null, 2));\n validationResult = await validateSchemaWithCLI(schemaPath);\n }\n }\n\n return {\n success: true,\n status: 'TASK_COMPLETE',\n message: '✅ Task completed successfully. STOP HERE - do not make any more tool calls.',\n summary: input.summary,\n autoCombined: combinedSchema ? true : false,\n source: source || undefined,\n stats: stats || undefined,\n validation: validationResult\n ? {\n valid: validationResult.valid,\n errorCount: validationResult.errors?.length || 0,\n warningCount: validationResult.warnings?.length || 0,\n }\n : undefined,\n schemaPath: combinedSchema\n ? path.join(workDir!, 'schema.json')\n : input.schemaPath,\n nextAction: 'NONE - Task is complete. Output a brief success message to the user.',\n };\n },\n {\n name: 'finish_task',\n description: `Signal that the orbital generation workflow is COMPLETE.\n\n⚠️ IMPORTANT: After calling this tool, STOP. Do not make any more tool calls.\n\nWHAT IT DOES:\n1. Automatically collects orbitals from .orbitals/ directory\n2. Combines them into a single OrbitalSchema\n3. Validates the combined schema\n4. Writes schema.json to workspace\n5. Returns success with stats`,\n schema: z.object({\n summary: z.string().describe('Brief summary of what was accomplished'),\n schemaPath: z.string().optional().describe('Path to the combined schema file if already written'),\n }),\n },\n );\n}\n","/**\n * Domain Orbital Tool\n *\n * Generates domain language orbitals incrementally using LLM.\n * Uses @almadar/llm for LLM access and @almadar/skills for prompt sections.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport crypto from 'crypto';\nimport { LLMClient } from '@almadar/llm';\nimport {\n getSExprQuickRef,\n getKeyBehaviorsReference,\n getCommonErrorsSection,\n getArchitectureSection,\n} from '@almadar/skills';\nimport type { SSEEventType } from '../api-types.js';\nimport { AgentDomainCategorySchema } from '@almadar/core/types';\nimport type { AgentDomainCategory } from '@almadar/core/types';\nimport { convertDomainToSchema } from '../orbitals/domain-language/index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type DomainOrbitalEventCallback = (\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number,\n event: {\n type: Exclude<SSEEventType, 'subagent_event'>;\n data: Record<string, unknown>;\n timestamp: number;\n }\n) => void;\n\nexport type DomainOrbitalCompleteCallback = (\n domainText: string,\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number\n) => void | Promise<void>;\n\nexport interface DomainOrbitalToolOptions {\n onEvent?: DomainOrbitalEventCallback;\n onOrbitalComplete?: DomainOrbitalCompleteCallback;\n workDir?: string;\n}\n\nexport interface DomainOrbitalSpec {\n name: string;\n entity: {\n name: string;\n persistence: 'persistent' | 'runtime' | 'singleton';\n fields: Array<{\n name: string;\n type: string;\n required?: boolean;\n default?: unknown;\n }>;\n relations?: Array<{\n entity: string;\n alias?: string;\n type: 'belongs_to' | 'has_many';\n }>;\n };\n pages: Array<{\n name: string;\n path: string;\n viewType: string;\n isInitial?: boolean;\n }>;\n traits: string[];\n patterns: string[];\n domainContext?: {\n request: string;\n requestFragment?: string;\n category: AgentDomainCategory;\n vocabulary?: Record<string, string>;\n };\n design?: {\n style?: 'minimal' | 'modern' | 'playful' | 'data-driven' | 'immersive';\n uxHints?: {\n flowPattern?: 'hub-spoke' | 'master-detail' | 'crud-cycle' | 'linear' | 'role-based';\n listPattern?: 'entity-table' | 'entity-cards' | 'entity-list';\n formPattern?: 'modal' | 'drawer' | 'page';\n detailPattern?: 'drawer' | 'page' | 'split';\n };\n };\n emits?: string[];\n listens?: Array<{\n event: string;\n triggers: string;\n }>;\n}\n\n// ============================================================================\n// Cache\n// ============================================================================\n\ninterface CacheEntry {\n domainText: string;\n timestamp: number;\n usage: { inputTokens: number; outputTokens: number; totalTokens: number };\n}\n\nconst domainOrbitalCache = new Map<string, CacheEntry>();\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000;\nconst CACHE_VERSION = 5;\n\nfunction generateFingerprint(spec: DomainOrbitalSpec): string {\n const normalized = JSON.stringify({\n version: CACHE_VERSION,\n entity: spec.entity,\n pages: spec.pages,\n traits: spec.traits.sort(),\n patterns: spec.patterns.sort(),\n emits: spec.emits?.sort() || [],\n listens: spec.listens?.map(l => `${l.event}:${l.triggers}`).sort() || [],\n });\n return crypto.createHash('sha256').update(normalized).digest('hex').slice(0, 16);\n}\n\nfunction getCached(fingerprint: string): CacheEntry | null {\n const entry = domainOrbitalCache.get(fingerprint);\n if (!entry) return null;\n if (Date.now() - entry.timestamp > CACHE_TTL_MS) {\n domainOrbitalCache.delete(fingerprint);\n return null;\n }\n return entry;\n}\n\nfunction setCache(fingerprint: string, entry: CacheEntry): void {\n domainOrbitalCache.set(fingerprint, entry);\n}\n\n// ============================================================================\n// File-based domain accumulation\n// ============================================================================\n\nfunction appendToDomainFile(workDir: string, domainText: string, _orbitalName: string): void {\n const domainPath = path.join(workDir, 'domain.txt');\n const separator = `\\n\\n---\\n`;\n let existingContent = '';\n if (fs.existsSync(domainPath)) {\n existingContent = fs.readFileSync(domainPath, 'utf-8');\n }\n const newContent = existingContent + separator + domainText;\n fs.writeFileSync(domainPath, newContent, 'utf-8');\n}\n\nfunction readDomainFile(workDir: string): string | null {\n const domainPath = path.join(workDir, 'domain.txt');\n if (!fs.existsSync(domainPath)) {\n return null;\n }\n return fs.readFileSync(domainPath, 'utf-8');\n}\n\n// ============================================================================\n// LLM Generation Prompt (uses @almadar/skills)\n// ============================================================================\n\nfunction buildStaticSystemPrompt(): string {\n const behaviorsRef = getKeyBehaviorsReference();\n const sExprRef = getSExprQuickRef();\n const errorsRef = getCommonErrorsSection();\n const architectureRef = getArchitectureSection();\n\n return `You are a domain language expert. Generate clean, complete domain language for OrbitalSchema applications.\n\n${behaviorsRef}\n\n---\n\n${sExprRef}\n\n---\n\n${architectureRef}\n\n---\n\n${errorsRef}\n\n---\n\n## Output Requirements\n\nGenerate ONLY the domain language text with these EXACT formats:\n\n### Entity Format (CRITICAL)\n\\`\\`\\`\n# Entities\n\nA [EntityName] is a [persistent|runtime|singleton] entity that:\n - has [fieldName] as [type] (required)\n - has [fieldName] as [type] with default [value]\n - belongs to [RelatedEntity]\n - has many [RelatedEntity]s\n\\`\\`\\`\n\n### Page Format (CRITICAL)\n\\`\\`\\`\n# Pages\n\n[PageName] at /[path]:\n - shows [Entity] using [TraitName]\n - view type: list\n - is initial page\n\\`\\`\\`\n\n### Behavior Format (CRITICAL)\n\\`\\`\\`\n# Behaviors\n\n[TraitName] behavior:\n Entity: [EntityName]\n States: [State1], [State2], ...\n Initial: [State1]\n\n Transitions:\n - From [State1] to [State2] on [EVENT]\n then [S-Expression effect]\n\\`\\`\\`\n\n**CRITICAL RULES:**\n1. Entities MUST start with \"A\" or \"An\"\n2. Behaviors MUST have \"Entity: [EntityName]\" line after the behavior name\n3. Pages MUST use \"shows [Entity] using [TraitName]\" format\n\nGenerate ONLY the domain language text, no explanations or markdown code blocks.`;\n}\n\nfunction buildDynamicUserPrompt(spec: DomainOrbitalSpec): string {\n const entityFields = spec.entity.fields\n .map(f => {\n let fieldDef = ` - ${f.name}: ${f.type}`;\n if (f.required) fieldDef += ', required';\n if (f.default !== undefined) fieldDef += `, default ${JSON.stringify(f.default)}`;\n return fieldDef;\n })\n .join('\\n');\n\n const relations = spec.entity.relations\n ?.map(r => {\n if (r.type === 'belongs_to') {\n return r.alias\n ? ` - belongs to ${r.entity} as ${r.alias}`\n : ` - belongs to ${r.entity}`;\n }\n return ` - has many ${r.entity}s`;\n })\n .join('\\n') || '';\n\n const pagesInfo = spec.pages\n .map(p => `- ${p.name} at ${p.path} (${p.viewType}${p.isInitial ? ', initial' : ''})`)\n .join('\\n');\n\n const emitsInfo = spec.emits?.length\n ? `**Emits Events**: ${spec.emits.join(', ')}`\n : '';\n const listensInfo = spec.listens?.length\n ? `**Listens**: ${spec.listens.map(l => `${l.event} → ${l.triggers}`).join(', ')}`\n : '';\n\n return `Generate domain language for the following orbital.\n\n## Orbital Specification\n\n**Entity**: ${spec.entity.name} (${spec.entity.persistence})\n**Fields**:\n${entityFields}\n${relations ? `**Relations**:\\n${relations}` : ''}\n\n**Pages**:\n${pagesInfo}\n\n**Behaviors**: ${spec.traits.join(', ')}\n**UI Patterns**: ${spec.patterns.join(', ')}\n${emitsInfo}\n${listensInfo}\n\nReplace [Entity] placeholders with \"${spec.entity.name}\" in all patterns.`;\n}\n\n// ============================================================================\n// Zod Schema\n// ============================================================================\n\nconst GenerateOrbitalDomainSchema = z.object({\n sessionId: z.string().describe('Unique session ID for this generation batch'),\n orbital: z.object({\n name: z.string(),\n entity: z.object({\n name: z.string(),\n persistence: z.enum(['persistent', 'runtime', 'singleton']),\n fields: z.array(z.object({\n name: z.string(),\n type: z.string(),\n required: z.boolean().optional(),\n default: z.any().optional(),\n })),\n relations: z.array(z.object({\n entity: z.string(),\n alias: z.string().optional(),\n type: z.enum(['belongs_to', 'has_many']),\n })).optional(),\n }),\n pages: z.array(z.object({\n name: z.string(),\n path: z.string(),\n viewType: z.string(),\n isInitial: z.boolean().optional(),\n })),\n traits: z.array(z.string()),\n patterns: z.array(z.string()),\n domainContext: z.object({\n request: z.string(),\n requestFragment: z.string().optional(),\n category: AgentDomainCategorySchema,\n vocabulary: z.record(z.string(), z.string()).optional(),\n }).optional(),\n design: z.object({\n style: z.enum(['minimal', 'modern', 'playful', 'data-driven', 'immersive']).optional(),\n uxHints: z.object({\n flowPattern: z.enum(['hub-spoke', 'master-detail', 'crud-cycle', 'linear', 'role-based']).optional(),\n listPattern: z.enum(['entity-table', 'entity-cards', 'entity-list']).optional(),\n formPattern: z.enum(['modal', 'drawer', 'page']).optional(),\n detailPattern: z.enum(['drawer', 'page', 'split']).optional(),\n }).optional(),\n }).optional(),\n emits: z.array(z.string()).optional(),\n listens: z.array(z.object({\n event: z.string(),\n triggers: z.string(),\n })).optional(),\n }).describe('The orbital specification'),\n orbitalIndex: z.number().describe('Index in the batch (0-based)'),\n totalOrbitals: z.number().describe('Total orbitals in the batch'),\n});\n\nconst ConstructCombinedDomainSchema = z.object({\n appName: z.string().describe('Name of the application'),\n});\n\n// ============================================================================\n// Tool Factories\n// ============================================================================\n\n/**\n * Create the generate_orbital_domain tool.\n * Uses @almadar/llm LLMClient directly for Anthropic calls.\n */\nexport function createGenerateOrbitalDomainTool(\n \n options: DomainOrbitalToolOptions = {},\n) {\n let eventCallback: DomainOrbitalEventCallback | undefined = options.onEvent;\n let completeCallback: DomainOrbitalCompleteCallback | undefined = options.onOrbitalComplete;\n const workDir = options.workDir || process.cwd();\n\n const STATIC_SYSTEM_PROMPT = buildStaticSystemPrompt();\n\n const setEventCallback = (callback: DomainOrbitalEventCallback) => {\n eventCallback = callback;\n };\n\n const setCompleteCallback = (callback: DomainOrbitalCompleteCallback) => {\n completeCallback = callback;\n };\n\n const emitEvent = (\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number,\n type: Exclude<SSEEventType, 'subagent_event'>,\n data: Record<string, unknown>\n ) => {\n if (eventCallback) {\n eventCallback(orbitalName, orbitalIndex, totalOrbitals, {\n type,\n data,\n timestamp: Date.now(),\n });\n }\n };\n\n const generateOrbitalDomainTool = tool(\n async ({ sessionId, orbital, orbitalIndex, totalOrbitals }) => {\n const spec = orbital as DomainOrbitalSpec;\n const fingerprint = generateFingerprint(spec);\n\n try {\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'message', {\n content: `Generating domain orbital: ${spec.name} (${orbitalIndex + 1}/${totalOrbitals})`,\n role: 'assistant',\n isComplete: false,\n });\n\n // Check cache\n const cached = getCached(fingerprint);\n if (cached) {\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: 'info',\n message: `Cache HIT for ${spec.name}`,\n data: { fingerprint, cachedAt: new Date(cached.timestamp).toISOString() },\n orbitalName: spec.name,\n });\n\n appendToDomainFile(workDir, cached.domainText, spec.name);\n\n if (completeCallback) {\n await completeCallback(cached.domainText, spec.name, orbitalIndex, totalOrbitals);\n }\n\n return JSON.stringify({\n success: true,\n orbitalName: spec.name,\n fingerprint,\n cached: true,\n domainWritten: true,\n usage: cached.usage,\n });\n }\n\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: 'info',\n message: `Cache MISS for ${spec.name}, generating with LLM`,\n data: { fingerprint },\n orbitalName: spec.name,\n });\n\n // Use @almadar/llm directly\n const client = new LLMClient({\n provider: 'anthropic',\n model: 'claude-sonnet-4-20250514',\n temperature: 0,\n });\n\n const userPrompt = buildDynamicUserPrompt(spec);\n\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'tool_call', {\n tool: 'llm_generate_domain',\n args: {\n orbital: spec.name,\n entity: spec.entity.name,\n traits: spec.traits,\n },\n });\n\n const response = await client.callWithCache<string>({\n systemPrompt: '',\n systemBlocks: [{\n type: 'text',\n text: STATIC_SYSTEM_PROMPT,\n cache_control: { type: 'ephemeral' },\n }],\n userPrompt,\n maxTokens: 8192,\n rawText: true,\n });\n\n const domainText = (response.raw || String(response.data) || '').trim();\n\n const usage = {\n inputTokens: response.usage?.promptTokens || 0,\n outputTokens: response.usage?.completionTokens || 0,\n totalTokens: response.usage?.totalTokens || 0,\n };\n\n setCache(fingerprint, {\n domainText,\n timestamp: Date.now(),\n usage,\n });\n\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'tool_result', {\n tool: 'llm_generate_domain',\n result: { fingerprint, textLength: domainText.length, usage },\n success: true,\n });\n\n appendToDomainFile(workDir, domainText, spec.name);\n\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'message', {\n content: `Generated domain for ${spec.name} (${usage.totalTokens} tokens) - written to domain.txt`,\n role: 'assistant',\n isComplete: true,\n });\n\n if (completeCallback) {\n try {\n await completeCallback(domainText, spec.name, orbitalIndex, totalOrbitals);\n } catch (error) {\n console.error(`[DomainOrbitalTool] Callback error for ${spec.name}:`, error);\n }\n }\n\n return JSON.stringify({\n success: true,\n orbitalName: spec.name,\n fingerprint,\n cached: false,\n domainWritten: true,\n usage,\n domainText,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'error', {\n error: errorMessage,\n code: 'DOMAIN_ORBITAL_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessage,\n orbitalName: spec.name,\n });\n }\n },\n {\n name: 'generate_orbital_domain',\n description: `Generate domain language for a single orbital using LLM.\n\nTakes a lightweight orbital specification and generates complete domain language text.\nResults are cached by fingerprint to avoid regenerating identical orbitals.\n\nUSAGE:\n1. Decompose app into orbital specs\n2. For each orbital, call generate_orbital_domain\n3. After all orbitals, call construct_combined_domain`,\n schema: GenerateOrbitalDomainSchema,\n }\n );\n\n return {\n tool: generateOrbitalDomainTool,\n setEventCallback,\n setCompleteCallback,\n };\n}\n\n/**\n * Create the construct_combined_domain tool.\n */\nexport function createConstructCombinedDomainTool(\n \n options: { onEvent?: DomainOrbitalEventCallback; workDir?: string } = {},\n) {\n let eventCallback = options.onEvent;\n const workDir = options.workDir || process.cwd();\n\n const setEventCallback = (callback: DomainOrbitalEventCallback) => {\n eventCallback = callback;\n };\n\n const emitEvent = (\n type: Exclude<SSEEventType, 'subagent_event'>,\n data: Record<string, unknown>\n ) => {\n if (eventCallback) {\n eventCallback('combined', 0, 1, {\n type,\n data,\n timestamp: Date.now(),\n });\n }\n };\n\n const constructCombinedDomainTool = tool(\n async ({ appName }) => {\n try {\n const domainText = readDomainFile(workDir);\n if (!domainText) {\n return JSON.stringify({\n success: false,\n error: 'No domain.txt found. Call generate_orbital_domain first.',\n });\n }\n\n emitEvent('message', {\n content: `Converting domain.txt to OrbitalSchema for ${appName}`,\n role: 'assistant',\n isComplete: false,\n });\n\n const schemaResult = convertDomainToSchema(domainText, {\n name: appName,\n orbitals: [],\n });\n\n if (!schemaResult.success) {\n const errorMessages = schemaResult.errors?.map(e => e.message).join('; ') || 'Unknown conversion error';\n\n emitEvent('error', {\n error: errorMessages,\n code: 'DOMAIN_CONVERSION_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessages,\n domainText,\n });\n }\n\n emitEvent('message', {\n content: `Successfully converted domain.txt to OrbitalSchema for ${appName}`,\n role: 'assistant',\n isComplete: true,\n });\n\n const traitCount = (schemaResult.schema?.orbitals || []).reduce((count, o) => {\n if (typeof o === 'object' && o !== null && 'traits' in o) {\n return count + ((o as { traits?: unknown[] }).traits?.length || 0);\n }\n return count;\n }, 0);\n\n return JSON.stringify({\n success: true,\n appName,\n domainText,\n schema: schemaResult.schema,\n stats: {\n orbitalCount: schemaResult.schema?.orbitals?.length || 0,\n traitCount,\n },\n domainPath: path.join(workDir, 'domain.txt'),\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n emitEvent('error', {\n error: errorMessage,\n code: 'CONSTRUCT_COMBINED_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessage,\n });\n }\n },\n {\n name: 'construct_combined_domain',\n description: `Convert accumulated domain.txt to OrbitalSchema.\n\nCall this after all orbitals have been generated via generate_orbital_domain.`,\n schema: ConstructCombinedDomainSchema,\n }\n );\n\n return {\n tool: constructCombinedDomainTool,\n setEventCallback,\n };\n}\n\n/**\n * Create both domain orbital tools together.\n */\nexport function createDomainOrbitalTools(\n options: DomainOrbitalToolOptions = {},\n) {\n const generateTool = createGenerateOrbitalDomainTool(options);\n const constructTool = createConstructCombinedDomainTool({\n onEvent: options.onEvent,\n workDir: options.workDir,\n });\n\n return {\n generateOrbitalDomain: generateTool.tool,\n constructCombinedDomain: constructTool.tool,\n setEventCallback: (callback: DomainOrbitalEventCallback) => {\n generateTool.setEventCallback(callback);\n constructTool.setEventCallback(callback);\n },\n setCompleteCallback: generateTool.setCompleteCallback,\n };\n}\n","/**\n * Orbital Generator\n *\n * Provides utilities for generating FullOrbitalUnit definitions from\n * lightweight OrbitalUnit inputs. Designed for SUBAGENT use where each\n * orbital is generated separately for better caching.\n *\n * ## Subagent Caching Pattern\n *\n * When generating multiple orbitals in a subagent pattern:\n * 1. Main agent decomposes request → OrbitalUnit[]\n * 2. For each orbital, subagent calls generateFullOrbital()\n * 3. Each subagent call uses the SAME cached system prompt blocks\n * 4. Anthropic caches at request level → subsequent calls get 90% discount\n *\n * This is MORE efficient than batch generation because:\n * - System prompt is cached and reused across subagent calls\n * - Template guidance is cached per fingerprint\n * - Only the orbital-specific content varies\n *\n * @packageDocumentation\n */\n\nimport type { LLMClient, LLMProvider } from '@almadar/llm';\nimport { assembleCacheableOrbitalPrompt, assembleOrbitalPrompt } from '../cache/index.js';\nimport { getOrbitalDecompositionPrompt, getFullOrbitalPrompt, getRequirementsDecomposePrompt, getRequirementsTraitPrompt } from '@almadar/skills';\nimport type { OrbitalDefinition, FullOrbitalUnit, EntityRef } from '@almadar/core/types';\nimport { isEntityReference } from '@almadar/core/types';\n// DEPRECATED: Validation removed - use orbital-rust validator instead\n// import { validateFullOrbitalUnit } from '../../validation/index.js';\n\n/**\n * Get entity name safely from EntityRef\n */\nfunction getEntityName(entity: EntityRef): string {\n if (isEntityReference(entity)) {\n return entity.replace('.entity', '');\n }\n return entity.name;\n}\n\n// ============================================================================\n// Requirements Types (imported structure from analysis)\n// ============================================================================\n\n/**\n * Extracted requirements from the analysis phase.\n * Matches ExtractedRequirements from agents/orchestrator/shared/requirements.ts\n */\nexport interface ExtractedRequirements {\n /** Entity names to create */\n entities: string[];\n /** State names that should exist */\n states: string[];\n /** Event/action names */\n events: string[];\n /** Business rules (become guards) */\n guards: string[];\n /** Page types needed */\n pages: string[];\n /** Notifications/side-effects */\n effects: string[];\n /** Raw requirement statements */\n rawRequirements: string[];\n}\n\n// Type alias - OrbitalUnit in generator context is always a full definition\ntype OrbitalUnit = OrbitalDefinition;\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * A structured log entry from the generation process.\n * Used for debugging and observability of subagent reasoning.\n */\nexport interface GenerationLog {\n /** Timestamp of the log entry */\n timestamp: number;\n /** Log level */\n level: 'info' | 'warn' | 'error' | 'debug';\n /** Log message */\n message: string;\n /** Optional structured data */\n data?: Record<string, unknown>;\n}\n\nexport interface OrbitalGenerationOptions {\n /** Maximum tokens for generation */\n maxTokens?: number;\n /** Enable validation after generation */\n validate?: boolean;\n /** Callback for real-time log streaming (SSE integration) */\n onLog?: (log: GenerationLog, orbitalName?: string) => void;\n /** Optional requirements relevant to this orbital (from analysis) */\n requirements?: Partial<ExtractedRequirements>;\n}\n\nexport interface OrbitalGenerationResult {\n /** Generated full orbital unit */\n orbital: FullOrbitalUnit;\n /** Fingerprint used for caching */\n fingerprint: string;\n /** Whether template guidance was used */\n usedTemplate: boolean;\n /** Token usage */\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n /** Validation result */\n validation?: {\n valid: boolean;\n errorCount: number;\n warningCount: number;\n };\n /** Structured logs from the generation process */\n logs: GenerationLog[];\n}\n\n// ============================================================================\n// Provider Concurrency Limits\n// ============================================================================\n\n/**\n * Default concurrency limits per LLM provider.\n * These are conservative defaults to avoid rate limiting.\n */\nexport const PROVIDER_CONCURRENCY_LIMITS: Record<LLMProvider, number> = {\n anthropic: 3,\n openai: 5,\n deepseek: 3,\n kimi: 3,\n};\n\nexport interface ParallelGenerationOptions extends OrbitalGenerationOptions {\n /** Maximum concurrent generations (default: provider-specific) */\n concurrency?: number;\n}\n\nexport interface ParallelGenerationResult {\n /** Results for each orbital (same order as input) */\n results: OrbitalGenerationResult[];\n /** Total duration in milliseconds */\n totalDurationMs: number;\n /** Aggregate logs from all generations */\n aggregateLogs: GenerationLog[];\n /** Summary statistics */\n summary: {\n total: number;\n successful: number;\n failed: number;\n totalTokens: number;\n };\n}\n\n// ============================================================================\n// Logging Utility\n// ============================================================================\n\nfunction createLog(level: GenerationLog['level'], message: string, data?: Record<string, unknown>): GenerationLog {\n return {\n timestamp: Date.now(),\n level,\n message,\n data,\n };\n}\n\n// ============================================================================\n// Single Orbital Generation (For Subagent Use)\n// ============================================================================\n\n/**\n * Generate a full orbital unit from a lightweight orbital input.\n *\n * DESIGNED FOR SUBAGENT USE: Call this once per orbital in separate\n * subagent invocations. Caching works across calls because:\n * - System prompt blocks are marked as cacheable\n * - Anthropic caches at the request level\n * - Subsequent calls with same system prompt get cache hits\n *\n * @example\n * ```typescript\n * // In subagent for each orbital:\n * const result = await generateFullOrbital(client, orbitalUnit, { validate: true });\n * // First call: Cache WRITE: 3500 tokens\n * // Second call: Cache HIT: 3500 tokens (90% discount!)\n * ```\n */\nexport async function generateFullOrbital(\n client: LLMClient,\n orbital: OrbitalUnit,\n options: OrbitalGenerationOptions = {}\n): Promise<OrbitalGenerationResult> {\n const {\n maxTokens = 8192,\n validate = true,\n requirements,\n } = options;\n\n const logs: GenerationLog[] = [];\n const startTime = Date.now();\n\n logs.push(createLog('info', `Starting generation for orbital: ${orbital.name}`, {\n entityName: getEntityName(orbital.entity),\n traitCount: orbital.traits.length,\n hasRequirements: !!requirements,\n }));\n\n // Use requirements-aware prompt if requirements provided\n const systemPrompt = requirements\n ? getRequirementsAwareFullOrbitalPrompt(requirements)\n : getFullOrbitalPrompt();\n\n // Check if using Anthropic for cache support\n const useCache = client.getProvider() === 'anthropic';\n\n let result;\n let fingerprint: string;\n let usedTemplate = false;\n\n if (useCache) {\n // Use cache-aware call - this is where the magic happens\n const cacheablePrompt = assembleCacheableOrbitalPrompt(orbital, systemPrompt);\n fingerprint = cacheablePrompt.fingerprint;\n usedTemplate = cacheablePrompt.usedCachedTemplate;\n\n logs.push(createLog('info', `Using Anthropic caching`, { fingerprint, usedTemplate }));\n console.log(`[OrbitalGenerator] Using Anthropic caching (fingerprint: ${fingerprint})`);\n\n result = await client.callWithCache({\n systemBlocks: cacheablePrompt.systemBlocks,\n userBlocks: cacheablePrompt.userBlocks,\n systemPrompt: '', // Overridden by blocks\n userPrompt: '', // Overridden by blocks\n maxTokens,\n skipSchemaValidation: true, // Parse JSON only\n });\n\n logs.push(createLog('info', `LLM call completed`, {\n promptTokens: result.usage?.promptTokens,\n completionTokens: result.usage?.completionTokens,\n }));\n } else {\n // Standard call for non-Anthropic providers\n const assembledPrompt = assembleOrbitalPrompt(orbital, systemPrompt);\n fingerprint = assembledPrompt.fingerprint;\n usedTemplate = assembledPrompt.usedCachedTemplate;\n\n logs.push(createLog('info', `Using standard generation (${client.getProvider()})`, { fingerprint, usedTemplate }));\n\n const userPrompt = `Generate a complete FullOrbitalUnit for this orbital:\n\n${JSON.stringify(orbital, null, 2)}\n\nReturn valid JSON matching the FullOrbitalUnit schema.`;\n\n result = await client.callWithMetadata({\n systemPrompt: assembledPrompt.prompt,\n userPrompt,\n maxTokens,\n skipSchemaValidation: true,\n });\n\n logs.push(createLog('info', `LLM call completed`, {\n promptTokens: result.usage?.promptTokens,\n completionTokens: result.usage?.completionTokens,\n }));\n }\n\n const generatedOrbital = result.data as OrbitalDefinition;\n\n // Validate if requested\n let validation;\n if (validate) {\n // Use direct per-unit validation\n // DEPRECATED: Validation removed - use orbital-rust validator instead\n // const validationResult = validateFullOrbitalUnit(generatedOrbital);\n const validationResult: any = { valid: true, errors: [], warnings: [] };\n validation = {\n valid: validationResult.valid,\n errorCount: validationResult.errors.length,\n warningCount: (validationResult.warnings || []).length,\n };\n\n if (validationResult.valid) {\n logs.push(createLog('info', `Validation passed`));\n } else {\n logs.push(createLog('warn', `Validation failed`, {\n errorCount: validationResult.errors.length,\n warningCount: (validationResult.warnings || []).length,\n errors: validationResult.errors.slice(0, 3).map((e: any) => e.message || e),\n }));\n }\n }\n\n const durationMs = Date.now() - startTime;\n logs.push(createLog('info', `Generation completed`, { durationMs }));\n\n return {\n orbital: generatedOrbital,\n fingerprint,\n usedTemplate,\n usage: result.usage ?? undefined,\n validation,\n logs,\n };\n}\n\n// ============================================================================\n// Parallel Orbital Generation\n// ============================================================================\n\n/**\n * Generate multiple orbitals in parallel with concurrency control.\n *\n * Uses provider-specific concurrency limits to avoid rate limiting.\n * All orbital units are independent, so parallel execution is safe.\n *\n * @example\n * ```typescript\n * // Generate all orbitals in parallel (max 3 concurrent for Anthropic)\n * const result = await generateFullOrbitalsParallel(client, orbitals, { validate: true });\n * console.log(`Generated ${result.summary.successful}/${result.summary.total} orbitals`);\n * ```\n */\nexport async function generateFullOrbitalsParallel(\n client: LLMClient,\n orbitals: OrbitalUnit[],\n options: ParallelGenerationOptions = {}\n): Promise<ParallelGenerationResult> {\n const provider = client.getProvider();\n const defaultConcurrency = PROVIDER_CONCURRENCY_LIMITS[provider] ?? 3;\n const concurrency = options.concurrency ?? defaultConcurrency;\n\n const aggregateLogs: GenerationLog[] = [];\n const startTime = Date.now();\n\n aggregateLogs.push(createLog('info', `Starting parallel generation`, {\n totalOrbitals: orbitals.length,\n concurrency,\n provider,\n }));\n\n console.log(`[OrbitalGenerator] Parallel generation: ${orbitals.length} orbitals, concurrency=${concurrency}`);\n\n // Simple concurrency limiter using a semaphore pattern\n let activeCount = 0;\n const queue: Array<() => void> = [];\n\n const acquire = (): Promise<void> => {\n return new Promise((resolve) => {\n if (activeCount < concurrency) {\n activeCount++;\n resolve();\n } else {\n queue.push(resolve);\n }\n });\n };\n\n const release = () => {\n activeCount--;\n const next = queue.shift();\n if (next) {\n activeCount++;\n next();\n }\n };\n\n // Generate all orbitals in parallel with concurrency control\n const results = await Promise.all(\n orbitals.map(async (orbital, index) => {\n await acquire();\n try {\n aggregateLogs.push(createLog('debug', `Starting orbital ${index + 1}/${orbitals.length}: ${orbital.name}`));\n const result = await generateFullOrbital(client, orbital, options);\n aggregateLogs.push(createLog('info', `Completed orbital ${index + 1}/${orbitals.length}: ${orbital.name}`, {\n valid: result.validation?.valid,\n tokens: result.usage?.totalTokens,\n }));\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n aggregateLogs.push(createLog('error', `Failed orbital ${index + 1}/${orbitals.length}: ${orbital.name}`, {\n error: errorMessage,\n }));\n // Return a failed result instead of throwing\n return {\n orbital: null as unknown as FullOrbitalUnit,\n fingerprint: '',\n usedTemplate: false,\n logs: [createLog('error', errorMessage)],\n validation: { valid: false, errorCount: 1, warningCount: 0 },\n } as OrbitalGenerationResult;\n } finally {\n release();\n }\n })\n );\n\n const totalDurationMs = Date.now() - startTime;\n const successful = results.filter(r => r.validation?.valid !== false && r.orbital !== null).length;\n const failed = results.length - successful;\n const totalTokens = results.reduce((sum, r) => sum + (r.usage?.totalTokens ?? 0), 0);\n\n aggregateLogs.push(createLog('info', `Parallel generation completed`, {\n totalDurationMs,\n successful,\n failed,\n totalTokens,\n }));\n\n console.log(`[OrbitalGenerator] Parallel generation complete: ${successful}/${results.length} successful in ${totalDurationMs}ms`);\n\n return {\n results,\n totalDurationMs,\n aggregateLogs,\n summary: {\n total: results.length,\n successful,\n failed,\n totalTokens,\n },\n };\n}\n\n// ============================================================================\n// Decomposition (For Main Agent Use)\n// ============================================================================\n\n/**\n * Options for decomposing requests into orbitals.\n */\nexport interface DecomposeOptions {\n /** Maximum tokens for generation */\n maxTokens?: number;\n /** Optional extracted requirements from analysis phase */\n requirements?: ExtractedRequirements;\n}\n\n/**\n * Decompose a user request into OrbitalUnits using LLM.\n *\n * This is typically called by the MAIN AGENT before delegating\n * to subagents for full orbital generation.\n *\n * @example\n * ```typescript\n * // Without requirements (existing behavior):\n * const orbitals = await decomposeToOrbitals(client, \"Build a task manager\");\n *\n * // With requirements (from analysis phase):\n * const orbitals = await decomposeToOrbitals(client, \"Build a task manager\", {\n * requirements: { entities: [\"Task\"], guards: [\"only admins can delete\"], ... }\n * });\n *\n * // Then generate all orbitals in parallel:\n * const result = await generateFullOrbitalsParallel(client, orbitals);\n * ```\n */\nexport async function decomposeToOrbitals(\n client: LLMClient,\n userRequest: string,\n options: DecomposeOptions = {}\n): Promise<OrbitalUnit[]> {\n const { maxTokens = 4096, requirements } = options;\n\n // Use requirements-aware prompt if requirements provided\n const systemPrompt = requirements\n ? getRequirementsAwareDecompositionPrompt(requirements)\n : getOrbitalDecompositionPrompt();\n\n const userPrompt = `Decompose this application request into Orbital Units:\n\n${userRequest}\n\nReturn a JSON array of OrbitalUnit objects.`;\n\n const result = await client.call({\n systemPrompt,\n userPrompt,\n maxTokens,\n skipSchemaValidation: true,\n });\n\n return result as OrbitalUnit[];\n}\n\n/**\n * Build a requirements-aware decomposition prompt.\n */\nfunction getRequirementsAwareDecompositionPrompt(requirements: ExtractedRequirements): string {\n const basePrompt = getOrbitalDecompositionPrompt();\n const requirementsGuidance = getRequirementsDecomposePrompt();\n\n const requirementsList = `\n## Extracted Requirements (Use These!)\n\n### Entities to Create\n${requirements.entities.length > 0 ? requirements.entities.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### States (Map to State Machines)\n${requirements.states.length > 0 ? requirements.states.map(s => `- ${s}`).join('\\n') : '- (none specified)'}\n\n### Events (Map to Transitions)\n${requirements.events.length > 0 ? requirements.events.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### Guards (Map to Transition Guards)\n${requirements.guards.length > 0 ? requirements.guards.map(g => `- ${g}`).join('\\n') : '- (none specified)'}\n\n### Effects (Map to Transition Effects)\n${requirements.effects.length > 0 ? requirements.effects.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### Pages (Map to Page Definitions)\n${requirements.pages.length > 0 ? requirements.pages.map(p => `- ${p}`).join('\\n') : '- (none specified)'}\n\nUse these requirements to:\n1. Create one OrbitalUnit per primary entity in the list\n2. Distribute guards to relevant orbitals\n3. Distribute effects to relevant orbitals\n4. Ensure state machines cover the required states\n`;\n\n return `${basePrompt}\n\n---\n\n${requirementsGuidance}\n\n---\n\n${requirementsList}`;\n}\n\n/**\n * Build a requirements-aware full orbital generation prompt.\n */\nfunction getRequirementsAwareFullOrbitalPrompt(requirements: Partial<ExtractedRequirements>): string {\n const basePrompt = getFullOrbitalPrompt();\n const requirementsGuidance = getRequirementsTraitPrompt();\n\n const sections: string[] = [];\n\n if (requirements.guards && requirements.guards.length > 0) {\n sections.push(`### Guards to Implement\n${requirements.guards.map(g => `- ${g}`).join('\\n')}\n\nConvert these to \\`guard\\` expressions on transitions with \\`guardError\\` messages.`);\n }\n\n if (requirements.effects && requirements.effects.length > 0) {\n sections.push(`### Effects to Implement\n${requirements.effects.map(e => `- ${e}`).join('\\n')}\n\nConvert these to \\`effects\\` arrays on transitions (emit_event or call_service).`);\n }\n\n if (requirements.states && requirements.states.length > 0) {\n sections.push(`### States to Include\n${requirements.states.map(s => `- ${s}`).join('\\n')}\n\nUse these exact states in the state machine. First is initial, identify final states.`);\n }\n\n if (requirements.events && requirements.events.length > 0) {\n sections.push(`### Events to Include\n${requirements.events.map(e => `- ${e}`).join('\\n')}\n\nUse these event names in transitions.`);\n }\n\n if (sections.length === 0) {\n return basePrompt;\n }\n\n return `${basePrompt}\n\n---\n\n${requirementsGuidance}\n\n---\n\n## Requirements for This Orbital\n\n${sections.join('\\n\\n')}\n`;\n}\n\n// ============================================================================\n// Cache Statistics\n// ============================================================================\n\n/**\n * Estimate cache savings for a set of orbitals.\n *\n * Use this to predict how much caching will help for a decomposition.\n */\nexport function estimateCacheSavings(orbitals: OrbitalUnit[]): {\n totalOrbitals: number;\n uniqueFingerprints: number;\n estimatedCacheHits: number;\n estimatedSavingsPercent: number;\n} {\n const { getCacheStats } = require('../cache/index.js');\n const stats = getCacheStats(orbitals);\n\n // Each call after the first with same fingerprint is a cache hit\n const cacheHits = stats.potentialCacheHits;\n const savingsPercent = orbitals.length > 0\n ? Math.round((cacheHits / orbitals.length) * 90) // 90% discount on cache hits\n : 0;\n\n return {\n totalOrbitals: stats.totalOrbitals,\n uniqueFingerprints: stats.uniqueFingerprints,\n estimatedCacheHits: cacheHits,\n estimatedSavingsPercent: savingsPercent,\n };\n}\n","/**\n * Orbital Subagent Tool\n *\n * Spawns nested DeepAgents for orbital generation and forwards\n * their events to the parent stream.\n * Uses @almadar/llm LLMClient directly.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { OrbitalDefinition, EntityRef } from '@almadar/core/types';\nimport { isEntityReference, AgentDomainCategorySchema } from '@almadar/core/types';\nimport { LLMClient } from '@almadar/llm';\nimport type { SSEEvent, SSEEventType } from '../api-types.js';\nimport { generateFullOrbital } from '../orbitals/generation/index.js';\n\n/**\n * Get entity name safely from EntityRef.\n */\nfunction getEntityName(entity: EntityRef): string {\n if (isEntityReference(entity)) {\n return entity.replace('.entity', '');\n }\n return entity.name;\n}\n\n// Type alias for backward compatibility\ntype OrbitalUnit = OrbitalDefinition;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type SubagentEventCallback = (\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number,\n event: {\n type: Exclude<SSEEventType, 'subagent_event'>;\n data: Record<string, unknown>;\n timestamp: number;\n },\n) => void;\n\nexport type OrbitalCompleteCallback = (\n orbital: unknown,\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number,\n) => void | Promise<void>;\n\nexport interface OrbitalRequirements {\n entities?: string[];\n states?: string[];\n events?: string[];\n guards?: string[];\n pages?: string[];\n effects?: string[];\n rawRequirements?: string[];\n}\n\nexport interface OrbitalSubagentToolOptions {\n onSubagentEvent?: SubagentEventCallback;\n onOrbitalComplete?: OrbitalCompleteCallback;\n requirements?: OrbitalRequirements;\n}\n\n// ============================================================================\n// Zod Schema\n// ============================================================================\n\nconst OrbitalInputSchema = z.object({\n orbital: z\n .object({\n name: z.string(),\n entity: z.object({\n name: z.string(),\n persistence: z.enum(['persistent', 'runtime', 'singleton', 'instance']),\n fields: z.array(\n z.object({\n name: z.string(),\n type: z.string(),\n required: z.boolean().optional(),\n }),\n ),\n }),\n traits: z.array(z.string()),\n patterns: z.array(z.string()),\n pages: z.array(\n z.object({\n name: z.string(),\n path: z.string(),\n viewType: z.string(),\n }),\n ).optional(),\n domainContext: z.object({\n request: z.string(),\n requestFragment: z.string().optional(),\n category: AgentDomainCategorySchema,\n vocabulary: z.record(z.string(), z.string()).optional(),\n }).optional(),\n design: z.object({\n style: z.enum(['minimal', 'modern', 'playful', 'data-driven', 'immersive']).optional(),\n uxHints: z.object({\n flowPattern: z.string().optional(),\n listPattern: z.string().optional(),\n formPattern: z.string().optional(),\n detailPattern: z.string().optional(),\n }).optional(),\n }).optional(),\n emits: z.array(z.string()).optional(),\n listens: z.array(\n z.object({\n event: z.string(),\n triggers: z.string(),\n }),\n ).optional(),\n relations: z.array(\n z.object({\n entity: z.string(),\n alias: z.string().optional(),\n cardinality: z.enum(['one', 'many']),\n }),\n ).optional(),\n })\n .describe('The OrbitalUnit to generate'),\n orbitalIndex: z.number().optional().describe('Index in the batch (0-based)'),\n totalOrbitals: z.number().optional().describe('Total orbitals in the batch'),\n});\n\n// ============================================================================\n// Tool Factory\n// ============================================================================\n\n/**\n * Create a tool for generating orbitals with subagent event streaming.\n * Uses @almadar/llm LLMClient directly.\n */\nexport function createOrbitalSubagentTool(\n options: OrbitalSubagentToolOptions = {},\n) {\n let eventCallback: SubagentEventCallback | undefined = options.onSubagentEvent;\n let completeCallback: OrbitalCompleteCallback | undefined = options.onOrbitalComplete;\n const requirements = options.requirements;\n\n const setEventCallback = (callback: SubagentEventCallback) => {\n eventCallback = callback;\n };\n\n const setOrbitalCompleteCallback = (callback: OrbitalCompleteCallback) => {\n completeCallback = callback;\n };\n\n const emitEvent = (\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number,\n type: Exclude<SSEEventType, 'subagent_event'>,\n data: Record<string, unknown>,\n ) => {\n if (eventCallback) {\n eventCallback(orbitalName, orbitalIndex, totalOrbitals, {\n type,\n data,\n timestamp: Date.now(),\n });\n }\n };\n\n const orbitalTool = tool(\n async ({ orbital, orbitalIndex = 0, totalOrbitals = 1 }) => {\n if (!orbital) {\n const errorMsg = 'Missing required parameter: orbital.';\n return JSON.stringify({ success: false, error: errorMsg, orbital: null });\n }\n\n const orbitalUnit = orbital as OrbitalUnit;\n\n if (!orbitalUnit.entity || !orbitalUnit.name) {\n const errorMsg = `Invalid orbital: missing required fields (name: ${orbitalUnit.name}, entity: ${orbitalUnit.entity}).`;\n return JSON.stringify({ success: false, error: errorMsg, orbital: orbitalUnit.name || 'unknown' });\n }\n\n try {\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'message', {\n content: `Starting generation for orbital: ${orbitalUnit.name}${requirements ? ' (with requirements from analysis)' : ''}`,\n role: 'assistant',\n isComplete: false,\n });\n\n if (requirements) {\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: 'info',\n message: 'Using requirements from analysis phase',\n data: {\n guards: requirements.guards?.length ?? 0,\n effects: requirements.effects?.length ?? 0,\n states: requirements.states?.length ?? 0,\n },\n orbitalName: orbitalUnit.name,\n });\n }\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze orbital structure', status: 'in_progress' },\n { id: 'generate', task: 'Generate full schema', status: 'pending' },\n { id: 'validate', task: 'Validate output', status: 'pending' },\n ],\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'message', {\n content: `Analyzing entity: ${getEntityName(orbitalUnit.entity)} with ${orbitalUnit.traits.length} traits`,\n role: 'assistant',\n isComplete: false,\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze orbital structure', status: 'completed' },\n { id: 'generate', task: 'Generate full schema', status: 'in_progress' },\n { id: 'validate', task: 'Validate output', status: 'pending' },\n ],\n });\n\n // Use @almadar/llm directly\n const client = new LLMClient({\n provider: 'anthropic',\n model: 'claude-sonnet-4-20250514',\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'tool_call', {\n tool: 'llm_generate',\n args: {\n orbital: orbitalUnit.name,\n entity: getEntityName(orbitalUnit.entity),\n traits: orbitalUnit.traits,\n },\n });\n\n const result = await generateFullOrbital(client, orbitalUnit, {\n validate: true,\n requirements,\n onLog: (log) => {\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: log.level,\n message: log.message,\n data: log.data,\n orbitalName: orbitalUnit.name,\n });\n },\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'tool_result', {\n tool: 'llm_generate',\n result: {\n fingerprint: result.fingerprint,\n usedTemplate: result.usedTemplate,\n usage: result.usage,\n },\n success: true,\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze orbital structure', status: 'completed' },\n { id: 'generate', task: 'Generate full schema', status: 'completed' },\n { id: 'validate', task: 'Validate output', status: 'in_progress' },\n ],\n });\n\n const finalOrbital = result.orbital;\n const finalValidation = result.validation;\n\n if (finalValidation) {\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'tool_result', {\n tool: 'validate_orbital',\n result: finalValidation,\n success: finalValidation.valid,\n });\n }\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze orbital structure', status: 'completed' },\n { id: 'generate', task: 'Generate full schema', status: 'completed' },\n { id: 'validate', task: 'Validate output', status: 'completed' },\n ],\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'message', {\n content: `Generated orbital: ${orbitalUnit.name} (${result.usage?.totalTokens ?? 0} tokens)`,\n role: 'assistant',\n isComplete: true,\n });\n\n if (completeCallback && finalOrbital) {\n try {\n await completeCallback(finalOrbital, orbitalUnit.name, orbitalIndex, totalOrbitals);\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: 'info',\n message: `Persisted orbital: ${orbitalUnit.name}`,\n orbitalName: orbitalUnit.name,\n });\n } catch (persistError) {\n console.error(`[OrbitalSubagent] Failed to persist ${orbitalUnit.name}:`, persistError);\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: 'warn',\n message: `Failed to persist orbital: ${orbitalUnit.name}`,\n data: { error: String(persistError) },\n orbitalName: orbitalUnit.name,\n });\n }\n }\n\n return JSON.stringify({\n success: true,\n orbital: finalOrbital,\n fingerprint: result.fingerprint,\n usage: result.usage,\n validation: result.validation,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'error', {\n error: errorMessage,\n code: 'ORBITAL_GENERATION_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessage,\n orbital: orbitalUnit.name,\n });\n }\n },\n {\n name: 'generate_orbital',\n description: `Generate a full orbital schema from an OrbitalUnit.\n\nSpawns a subagent to expand a lightweight OrbitalUnit into a complete\nFullOrbitalUnit with all sections, layouts, and configurations.\n\nUSAGE:\n1. Decompose user request into OrbitalUnits\n2. For each orbital, call generate_orbital with embedded context\n3. Collect results and merge into final schema`,\n schema: OrbitalInputSchema,\n },\n );\n\n return {\n tool: orbitalTool,\n setEventCallback,\n setOrbitalCompleteCallback,\n };\n}\n\n/**\n * Create a helper to wrap subagent events into SSE format.\n */\nexport function createSubagentEventWrapper(\n writeEvent: (event: SSEEvent) => void,\n): SubagentEventCallback {\n return (orbitalName, orbitalIndex, totalOrbitals, event) => {\n const sseEvent: SSEEvent = {\n type: 'subagent_event',\n timestamp: Date.now(),\n data: {\n orbitalName,\n orbitalIndex,\n totalOrbitals,\n event,\n },\n };\n writeEvent(sseEvent);\n };\n}\n","/**\n * Trait Subagent Tool\n *\n * Generates custom trait definitions for orbital schemas.\n * Uses @almadar/llm LLMClient directly.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { Trait } from '@almadar/core/types';\nimport { LLMClient } from '@almadar/llm';\nimport type { SSEEventType } from '../api-types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type TraitEventCallback = (\n traitName: string,\n traitIndex: number,\n totalTraits: number,\n event: {\n type: Exclude<SSEEventType, 'subagent_event'>;\n data: Record<string, unknown>;\n timestamp: number;\n }\n) => void;\n\nexport type TraitCompleteCallback = (\n trait: Trait,\n traitName: string,\n traitIndex: number,\n totalTraits: number\n) => void | Promise<void>;\n\nexport interface TraitSubagentToolOptions {\n onTraitEvent?: TraitEventCallback;\n onTraitComplete?: TraitCompleteCallback;\n}\n\nexport interface TraitSpec {\n name: string;\n description: string;\n category?: string;\n states?: string[];\n events?: string[];\n requiredFields?: Array<{\n name: string;\n type: string;\n description?: string;\n }>;\n needsTicks?: boolean;\n needsEmit?: boolean;\n needsListens?: boolean;\n}\n\n// ============================================================================\n// Trait Generation Prompt\n// ============================================================================\n\nfunction getTraitGenerationPrompt(): string {\n return `You are a Trait Generator for KFlow orbital schemas.\n\n## Your Task\n\nGenerate a complete, valid Trait definition that implements the requested behavior.\n\n## Trait Structure\n\n\\`\\`\\`typescript\ninterface Trait {\n name: string;\n description?: string;\n category?: TraitCategory;\n requiredFields?: RequiredField[];\n dataEntities?: TraitDataEntity[];\n stateMachine?: StateMachine;\n initialEffects?: Effect[];\n ticks?: TraitTick[];\n listens?: TraitEventListener[];\n}\n\\`\\`\\`\n\n## State Machine Structure\n\n\\`\\`\\`typescript\ninterface StateMachine {\n states: State[];\n events: Event[];\n transitions: Transition[];\n guards?: Guard[];\n}\n\\`\\`\\`\n\n## Best Practices\n\n1. **State Names**: Use PascalCase (e.g., \"Idle\", \"Loading\", \"Playing\")\n2. **Event Keys**: Use UPPER_SNAKE_CASE (e.g., \"START_GAME\", \"PLAYER_HIT\")\n3. **Initial State**: Always mark exactly one state as \\`isInitial: true\\`\n4. **Terminal States**: Mark end states as \\`isFinal: true\\`\n\n## Output Format\n\nReturn ONLY valid JSON matching the Trait interface. No markdown, no explanation.`;\n}\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\nconst TraitSpecSchema = z.object({\n name: z.string().describe('Name of the trait'),\n description: z.string().describe('Description of what this trait does'),\n category: z.string().optional().describe('Category'),\n states: z.array(z.string()).optional().describe('States the trait should have'),\n events: z.array(z.string()).optional().describe('Events the trait should handle'),\n requiredFields: z.array(z.object({\n name: z.string(),\n type: z.string(),\n description: z.string().optional(),\n })).optional().describe('Fields required from the linked entity'),\n needsTicks: z.boolean().optional().describe('Whether this trait needs temporal behavior'),\n needsEmit: z.boolean().optional().describe('Whether this trait emits events'),\n needsListens: z.boolean().optional().describe('Whether this trait listens for events'),\n});\n\nconst TraitInputSchema = z.object({\n traitSpec: TraitSpecSchema.describe('Specification for the trait to generate'),\n traitIndex: z.number().optional().describe('Index in the batch (0-based)'),\n totalTraits: z.number().optional().describe('Total traits in the batch'),\n});\n\n// ============================================================================\n// Tool Factory\n// ============================================================================\n\n/**\n * Create a tool for generating custom traits.\n * Uses @almadar/llm LLMClient directly.\n */\nexport function createTraitSubagentTool(\n options: TraitSubagentToolOptions = {},\n) {\n let eventCallback: TraitEventCallback | undefined = options.onTraitEvent;\n let completeCallback: TraitCompleteCallback | undefined = options.onTraitComplete;\n\n const setEventCallback = (callback: TraitEventCallback) => {\n eventCallback = callback;\n };\n\n const setTraitCompleteCallback = (callback: TraitCompleteCallback) => {\n completeCallback = callback;\n };\n\n const emitEvent = (\n traitName: string,\n traitIndex: number,\n totalTraits: number,\n type: Exclude<SSEEventType, 'subagent_event'>,\n data: Record<string, unknown>\n ) => {\n if (eventCallback) {\n eventCallback(traitName, traitIndex, totalTraits, {\n type,\n data,\n timestamp: Date.now(),\n });\n }\n };\n\n const traitTool = tool(\n async ({ traitSpec, traitIndex = 0, totalTraits = 1 }) => {\n const spec = traitSpec as TraitSpec;\n\n try {\n emitEvent(spec.name, traitIndex, totalTraits, 'message', {\n content: `Starting generation for custom trait: ${spec.name}`,\n role: 'assistant',\n isComplete: false,\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze trait requirements', status: 'in_progress' },\n { id: 'generate', task: 'Generate state machine', status: 'pending' },\n { id: 'validate', task: 'Validate trait', status: 'pending' },\n ],\n });\n\n const userPrompt = buildTraitUserPrompt(spec);\n\n emitEvent(spec.name, traitIndex, totalTraits, 'message', {\n content: `Analyzing: ${spec.description}`,\n role: 'assistant',\n isComplete: false,\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze trait requirements', status: 'completed' },\n { id: 'generate', task: 'Generate state machine', status: 'in_progress' },\n { id: 'validate', task: 'Validate trait', status: 'pending' },\n ],\n });\n\n // Use @almadar/llm directly\n const client = new LLMClient({\n provider: 'anthropic',\n model: 'claude-sonnet-4-20250514',\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'tool_call', {\n tool: 'llm_generate_trait',\n args: {\n traitName: spec.name,\n states: spec.states,\n events: spec.events,\n },\n });\n\n const result = await client.call({\n systemPrompt: getTraitGenerationPrompt(),\n userPrompt,\n maxTokens: 4096,\n skipSchemaValidation: true,\n });\n\n const generatedTrait = result as Trait;\n\n emitEvent(spec.name, traitIndex, totalTraits, 'tool_result', {\n tool: 'llm_generate_trait',\n result: {\n traitName: generatedTrait.name,\n stateCount: generatedTrait.stateMachine?.states?.length ?? 0,\n transitionCount: generatedTrait.stateMachine?.transitions?.length ?? 0,\n },\n success: true,\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze trait requirements', status: 'completed' },\n { id: 'generate', task: 'Generate state machine', status: 'completed' },\n { id: 'validate', task: 'Validate trait', status: 'in_progress' },\n ],\n });\n\n const validation = validateGeneratedTrait(generatedTrait, spec);\n\n emitEvent(spec.name, traitIndex, totalTraits, 'tool_result', {\n tool: 'validate_trait',\n result: validation,\n success: validation.valid,\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze trait requirements', status: 'completed' },\n { id: 'generate', task: 'Generate state machine', status: 'completed' },\n { id: 'validate', task: 'Validate trait', status: 'completed' },\n ],\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'message', {\n content: `Generated trait: ${generatedTrait.name} with ${generatedTrait.stateMachine?.states?.length ?? 0} states`,\n role: 'assistant',\n isComplete: true,\n });\n\n if (completeCallback) {\n try {\n await completeCallback(generatedTrait, spec.name, traitIndex, totalTraits);\n } catch (persistError) {\n console.error(`[TraitSubagent] Failed to persist ${spec.name}:`, persistError);\n }\n }\n\n return JSON.stringify({\n success: true,\n trait: generatedTrait,\n validation,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n emitEvent(spec.name, traitIndex, totalTraits, 'error', {\n error: errorMessage,\n code: 'TRAIT_GENERATION_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessage,\n traitName: spec.name,\n });\n }\n },\n {\n name: 'generate_custom_trait',\n description: `Generate a custom trait definition for the orbital schema.\n\nUse this when the decomposition identifies custom traits that don't exist in the\ntrait library.`,\n schema: TraitInputSchema,\n }\n );\n\n return {\n tool: traitTool,\n setEventCallback,\n setTraitCompleteCallback,\n };\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction buildTraitUserPrompt(spec: TraitSpec): string {\n const parts: string[] = [\n `Generate a Trait definition for: **${spec.name}**`,\n '',\n `## Description`,\n spec.description,\n ];\n\n if (spec.category) {\n parts.push('', `## Category`, spec.category);\n }\n if (spec.states && spec.states.length > 0) {\n parts.push('', `## Required States`, spec.states.map(s => `- ${s}`).join('\\n'));\n }\n if (spec.events && spec.events.length > 0) {\n parts.push('', `## Events to Handle`, spec.events.map(e => `- ${e}`).join('\\n'));\n }\n if (spec.requiredFields && spec.requiredFields.length > 0) {\n parts.push(\n '', `## Required Fields from Linked Entity`,\n spec.requiredFields.map(f => `- ${f.name}: ${f.type}${f.description ? ` (${f.description})` : ''}`).join('\\n')\n );\n }\n if (spec.needsTicks) {\n parts.push('', '## Temporal Behavior', 'This trait needs tick-based updates.');\n }\n if (spec.needsEmit) {\n parts.push('', '## Event Emission', 'This trait should emit events for other traits.');\n }\n if (spec.needsListens) {\n parts.push('', '## Event Listening', 'This trait should listen for events from other traits.');\n }\n\n parts.push('', '## Output', 'Return the complete Trait definition as valid JSON.');\n\n return parts.join('\\n');\n}\n\nfunction validateGeneratedTrait(trait: Trait, spec: TraitSpec): {\n valid: boolean;\n errors: string[];\n warnings: string[];\n} {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (trait.name !== spec.name) {\n errors.push(`Trait name mismatch: expected \"${spec.name}\", got \"${trait.name}\"`);\n }\n\n if (spec.states && spec.states.length > 0) {\n if (!trait.stateMachine) {\n errors.push('State machine is required but not generated');\n } else {\n const hasInitial = trait.stateMachine.states?.some(s => s.isInitial);\n if (!hasInitial) {\n warnings.push('No initial state marked');\n }\n const stateNames = new Set(trait.stateMachine.states?.map(s => s.name) ?? []);\n for (const requiredState of spec.states) {\n if (!stateNames.has(requiredState)) {\n warnings.push(`Specified state \"${requiredState}\" not found in generated trait`);\n }\n }\n }\n }\n\n if (spec.needsTicks && (!trait.ticks || trait.ticks.length === 0)) {\n warnings.push('Temporal behavior requested but no ticks defined');\n }\n if (spec.needsListens && (!trait.listens || trait.listens.length === 0)) {\n warnings.push('Event listening requested but no listeners defined');\n }\n\n return { valid: errors.length === 0, errors, warnings };\n}\n\n/**\n * Create a helper to wrap trait events into SSE format.\n */\nexport function createTraitEventWrapper(\n writeEvent: (event: { type: string; timestamp: number; data: unknown }) => void\n): TraitEventCallback {\n return (traitName, traitIndex, totalTraits, event) => {\n writeEvent({\n type: 'subagent_event',\n timestamp: Date.now(),\n data: { traitName, traitIndex, totalTraits, event },\n });\n };\n}\n","/**\n * Construct Combined Schema Tool\n *\n * Deterministically combines generated orbitals into a single OrbitalSchema\n * without LLM involvement.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { FullOrbitalUnit } from '@almadar/core/types';\nimport { combineOrbitals } from '../orbitals/combiner/index.js';\n\n// ============================================================================\n// Tool Schema\n// ============================================================================\n\nconst FullOrbitalUnitInputSchema = z.object({\n name: z.string(),\n description: z.string().optional(),\n entity: z.object({\n name: z.string(),\n collection: z.string().optional(),\n fields: z.array(z.any()),\n timestamps: z.boolean().optional(),\n }),\n traits: z.array(z.any()),\n pages: z.array(z.any()),\n emits: z.array(z.string()).optional(),\n listens: z.array(z.any()).optional(),\n});\n\nconst CombineSchemaInputSchema = z.object({\n orbitals: z.array(FullOrbitalUnitInputSchema).optional(),\n name: z.string().optional(),\n description: z.string().optional(),\n version: z.string().optional(),\n theme: z.string().optional(),\n defaultRoute: z.string().optional(),\n validate: z.boolean().optional().default(true),\n});\n\n// ============================================================================\n// Auto-Collection Helper\n// ============================================================================\n\nasync function autoCollectOrbitals(workDir: string): Promise<FullOrbitalUnit[]> {\n const fs = await import('fs');\n const path = await import('path');\n\n const orbitalsDir = path.join(workDir, '.orbitals');\n\n if (!fs.existsSync(orbitalsDir)) {\n const files = fs.readdirSync(workDir).filter((f: string) =>\n f.endsWith('.json') && (f.startsWith('orbital-') || f.includes('orbital'))\n );\n\n if (files.length === 0) {\n throw new Error('No orbitals found. Generate orbitals first using generate_orbital, or provide them directly.');\n }\n\n return files.map((f: string) => {\n const content = fs.readFileSync(path.join(workDir, f), 'utf-8');\n return JSON.parse(content);\n });\n }\n\n const files = fs.readdirSync(orbitalsDir).filter((f: string) => f.endsWith('.json'));\n\n if (files.length === 0) {\n throw new Error('No orbitals found in .orbitals/ directory.');\n }\n\n return files.map((f: string) => {\n const content = fs.readFileSync(path.join(orbitalsDir, f), 'utf-8');\n return JSON.parse(content);\n });\n}\n\n// ============================================================================\n// Validation Cap\n// ============================================================================\n\nconst MAX_COMBINE_VALIDATION_ATTEMPTS = 3;\nlet combineValidationAttempts = 0;\n\n// ============================================================================\n// Tool Implementation\n// ============================================================================\n\n/**\n * Create the construct_combined_schema tool.\n */\nexport function createCombineSchemasTool(workDir?: string) {\n combineValidationAttempts = 0;\n\n return tool(\n async (input) => {\n let orbitals: FullOrbitalUnit[];\n\n if (input.orbitals && input.orbitals.length > 0) {\n orbitals = input.orbitals as FullOrbitalUnit[];\n } else if (workDir) {\n orbitals = await autoCollectOrbitals(workDir);\n } else {\n orbitals = await autoCollectOrbitals(process.cwd());\n }\n\n const appName = input.name ||\n (orbitals.length > 0 ? `${orbitals[0].name} Application` : 'Application');\n\n const result = combineOrbitals(orbitals, {\n name: appName,\n description: input.description,\n version: input.version,\n theme: input.theme,\n defaultRoute: input.defaultRoute,\n validate: input.validate ?? true,\n });\n\n if (result.success) {\n combineValidationAttempts = 0;\n\n return JSON.stringify({\n success: true,\n schema: result.schema,\n stats: result.stats,\n validation: result.validation ? {\n valid: result.validation.valid,\n errorCount: result.validation.errors.length,\n warningCount: result.validation.warnings.length,\n } : undefined,\n __TASK_COMPLETE__: true,\n __STOP_SIGNAL__: 'WORKFLOW_FINISHED',\n message: `✅ SCHEMA GENERATION COMPLETE. Generated ${result.stats?.totalOrbitals || orbitals.length} orbitals. ` +\n `DO NOT call any more tools.`,\n }, null, 2);\n } else {\n combineValidationAttempts++;\n\n if (combineValidationAttempts >= MAX_COMBINE_VALIDATION_ATTEMPTS) {\n return JSON.stringify({\n success: false,\n cappedValidation: true,\n validationAttempt: combineValidationAttempts,\n error: result.error,\n stats: result.stats,\n validation: result.validation ? {\n valid: result.validation.valid,\n errors: result.validation.errors.slice(0, 3),\n errorCount: result.validation.errors.length,\n } : undefined,\n __STOP_FIXING__: true,\n message: `⚠️ VALIDATION CAP REACHED (${MAX_COMBINE_VALIDATION_ATTEMPTS} attempts). STOP editing orbitals.`,\n recommendation: 'STOP_FIXING',\n }, null, 2);\n }\n\n return JSON.stringify({\n success: false,\n validationAttempt: combineValidationAttempts,\n remainingAttempts: MAX_COMBINE_VALIDATION_ATTEMPTS - combineValidationAttempts,\n error: result.error,\n stats: result.stats,\n validation: result.validation ? {\n valid: result.validation.valid,\n errors: result.validation.errors.slice(0, 5),\n errorCount: result.validation.errors.length,\n } : undefined,\n partialSchema: result.schema,\n }, null, 2);\n }\n },\n {\n name: 'construct_combined_schema',\n description: `Deterministically combine generated orbitals into a single OrbitalSchema.\n\n⚠️ IMPORTANT: This is the FINAL STEP. When this tool returns success,\nyour task is COMPLETE. Do NOT call any other tools after this succeeds.\n\nSIMPLE USAGE (RECOMMENDED):\n construct_combined_schema({})\n\nOrbitals are auto-collected from .orbitals/ directory.`,\n schema: CombineSchemaInputSchema,\n }\n );\n}\n","/**\n * Schema Chunking Tools\n *\n * Tools for extracting and merging chunks of large orbital schemas.\n * Enables LLM-driven schema updates without hitting token limits.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { randomUUID } from 'crypto';\nimport * as fs from 'fs/promises';\nimport * as fss from 'fs';\nimport * as path from 'path';\nimport type { OrbitalSchema, Trait, TraitRef, Orbital, OrbitalDefinition, EntityRef } from '@almadar/core/types';\nimport { isOrbitalDefinition, isEntityReference } from '@almadar/core/types';\n\n/**\n * Get entity name safely from EntityRef.\n */\nfunction getEntityName(entity: EntityRef | undefined): string {\n if (!entity) return 'Unknown';\n if (isEntityReference(entity)) {\n return entity.replace('.entity', '');\n }\n return entity.name;\n}\n\nconst CHUNKS_DIR = '.chunks';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface OrbitalSummary {\n name: string;\n entity: string;\n traits: string[];\n inlineTraits: string[];\n}\n\ninterface SchemaStructure {\n name: string;\n orbitals: OrbitalSummary[];\n traits: string[];\n totalSize: string;\n}\n\ninterface ChunkMeta {\n sourceFile: string;\n type: 'orbital' | 'trait' | 'inline-trait';\n orbitalIndex?: number;\n traitIndex?: number;\n inlineTraitIndex?: number;\n parentOrbitalName?: string;\n extractedAt: string;\n}\n\ninterface ChunkFile {\n meta: ChunkMeta;\n orbital?: unknown;\n referencedTraits?: unknown[];\n trait?: unknown;\n inlineTrait?: unknown;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nasync function ensureChunksDir(workspaceDir: string): Promise<string> {\n const chunksPath = path.join(workspaceDir, CHUNKS_DIR);\n try {\n await fs.mkdir(chunksPath, { recursive: true });\n } catch {\n // Directory may already exist\n }\n return chunksPath;\n}\n\nfunction getTraitInfo(traits: unknown[]): { refs: string[]; inlines: string[] } {\n const refs: string[] = [];\n const inlines: string[] = [];\n\n for (const t of traits || []) {\n if (typeof t === 'object' && t !== null) {\n if ('ref' in t && typeof (t as { ref: unknown }).ref === 'string') {\n refs.push((t as { ref: string }).ref);\n } else if ('name' in t && typeof (t as { name: unknown }).name === 'string') {\n inlines.push((t as { name: string }).name);\n }\n }\n }\n\n return { refs, inlines };\n}\n\n// ============================================================================\n// Tool: query_schema_structure\n// ============================================================================\n\nexport function createQuerySchemaStructureTool(workDir: string) {\n return tool(\n async ({ file }) => {\n const filePath = path.isAbsolute(file) ? file : path.join(workDir, file);\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const schema = JSON.parse(content) as OrbitalSchema;\n const stats = fss.statSync(filePath);\n\n const structure: SchemaStructure = {\n name: schema.name,\n orbitals: (schema.orbitals || [])\n .filter((o): o is OrbitalDefinition => isOrbitalDefinition(o))\n .map(o => {\n const { refs, inlines } = getTraitInfo(o.traits || []);\n return {\n name: o.name,\n entity: getEntityName(o.entity),\n traits: refs,\n inlineTraits: inlines,\n };\n }),\n traits: [],\n totalSize: `${Math.round(stats.size / 1024)}KB`,\n };\n\n return JSON.stringify(structure, null, 2);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return JSON.stringify({ error: `Failed to query schema structure: ${msg}` });\n }\n },\n {\n name: 'query_schema_structure',\n description: `Get a lightweight map of schema structure (names only, not content).\n\nUSE THIS FIRST before extracting chunks to understand what orbitals and traits exist.`,\n schema: z.object({\n file: z.string().describe('Path to schema file (e.g., \"schema.json\")'),\n }),\n }\n );\n}\n\n// ============================================================================\n// Tool: extract_chunk\n// ============================================================================\n\nexport function createExtractChunkTool(workDir: string) {\n return tool(\n async ({ file, type, name, parentOrbital, includeTraits = true }) => {\n const filePath = path.isAbsolute(file) ? file : path.join(workDir, file);\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const schema = JSON.parse(content) as OrbitalSchema;\n const chunkId = randomUUID().slice(0, 8);\n const chunksDir = await ensureChunksDir(workDir);\n const chunkFile = path.join(chunksDir, `chunk-${chunkId}.json`);\n\n const chunkData: ChunkFile = {\n meta: {\n sourceFile: filePath,\n type,\n extractedAt: new Date().toISOString(),\n },\n };\n\n if (type === 'orbital') {\n const orbitalIndex = schema.orbitals.findIndex(o => o.name === name);\n if (orbitalIndex === -1) {\n return JSON.stringify({ error: `Orbital \"${name}\" not found in schema` });\n }\n\n const orbital = schema.orbitals[orbitalIndex];\n chunkData.meta.orbitalIndex = orbitalIndex;\n chunkData.orbital = orbital;\n\n if (includeTraits) {\n const { refs } = getTraitInfo(orbital.traits || []);\n chunkData.referencedTraits = (orbital.traits || []).filter(t =>\n typeof t === 'object' && t !== null && 'name' in t &&\n refs.includes((t as { name: string }).name)\n );\n }\n } else if (type === 'trait') {\n return JSON.stringify({\n error: `Schema-level traits no longer exist. Use type \"inline-trait\" with parentOrbital.`,\n });\n } else if (type === 'inline-trait') {\n if (!parentOrbital) {\n return JSON.stringify({ error: 'parentOrbital is required for inline-trait extraction' });\n }\n\n const orbitalIndex = schema.orbitals.findIndex(o => o.name === parentOrbital);\n if (orbitalIndex === -1) {\n return JSON.stringify({ error: `Parent orbital \"${parentOrbital}\" not found` });\n }\n\n const orbital = schema.orbitals[orbitalIndex];\n const inlineTraitIndex = (orbital.traits || []).findIndex(t =>\n typeof t === 'object' && t !== null && 'name' in t &&\n (t as { name: string }).name === name\n );\n\n if (inlineTraitIndex === -1) {\n return JSON.stringify({ error: `Inline trait \"${name}\" not found in orbital \"${parentOrbital}\"` });\n }\n\n chunkData.meta.parentOrbitalName = parentOrbital;\n chunkData.meta.orbitalIndex = orbitalIndex;\n chunkData.meta.inlineTraitIndex = inlineTraitIndex;\n chunkData.inlineTrait = orbital.traits![inlineTraitIndex];\n }\n\n const chunkContent = JSON.stringify(chunkData, null, 2);\n await fs.writeFile(chunkFile, chunkContent);\n\n const relativeChunkFile = path.relative(workDir, chunkFile);\n\n return JSON.stringify({\n success: true,\n chunkId,\n chunkFile: relativeChunkFile,\n size: `${Math.round(chunkContent.length / 1024)}KB`,\n message: `Chunk extracted to ${relativeChunkFile}. Use edit_file then apply_chunk with chunkId \"${chunkId}\".`,\n });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return JSON.stringify({ error: `Failed to extract chunk: ${msg}` });\n }\n },\n {\n name: 'extract_chunk',\n description: `Extract a specific orbital or trait to a chunk file for editing.\n\nAfter extracting, use edit_file on the returned chunkFile path, then call apply_chunk.\n\nTypes: \"orbital\", \"inline-trait\" (requires parentOrbital).`,\n schema: z.object({\n file: z.string().describe('Path to schema file'),\n type: z.enum(['orbital', 'trait', 'inline-trait']).describe('Type of chunk to extract'),\n name: z.string().describe('Name of orbital or trait to extract'),\n parentOrbital: z.string().optional().describe('Required for inline-trait'),\n includeTraits: z.boolean().default(true).describe('For orbital: also extract referenced traits'),\n }),\n }\n );\n}\n\n// ============================================================================\n// Tool: apply_chunk\n// ============================================================================\n\nexport function createApplyChunkTool(workDir: string) {\n return tool(\n async ({ chunkId }) => {\n const chunkFileName = `chunk-${chunkId}.json`;\n const chunkFilePath = path.join(workDir, CHUNKS_DIR, chunkFileName);\n\n try {\n try {\n await fs.access(chunkFilePath);\n } catch {\n return JSON.stringify({ error: `Chunk file not found: ${chunkFileName}.` });\n }\n\n const chunkContent = await fs.readFile(chunkFilePath, 'utf-8');\n const chunkData = JSON.parse(chunkContent) as ChunkFile;\n const { meta } = chunkData;\n\n const schemaContent = await fs.readFile(meta.sourceFile, 'utf-8');\n const schema = JSON.parse(schemaContent) as OrbitalSchema;\n\n if (meta.type === 'orbital' && chunkData.orbital) {\n schema.orbitals[meta.orbitalIndex!] = chunkData.orbital as Orbital;\n\n if (chunkData.referencedTraits && Array.isArray(chunkData.referencedTraits)) {\n const orbital = schema.orbitals[meta.orbitalIndex!];\n if (orbital && isOrbitalDefinition(orbital) && orbital.traits) {\n for (const editedTrait of chunkData.referencedTraits) {\n if (typeof editedTrait === 'object' && editedTrait !== null && 'name' in editedTrait) {\n const traitName = (editedTrait as { name: string }).name;\n const idx = orbital.traits.findIndex(t =>\n typeof t === 'object' && t !== null && 'name' in t &&\n (t as { name: string }).name === traitName\n );\n if (idx !== -1) {\n orbital.traits[idx] = editedTrait as TraitRef;\n }\n }\n }\n }\n }\n }\n\n if (meta.type === 'trait' && chunkData.trait) {\n console.warn('Schema-level traits are deprecated. Trait was not applied.');\n }\n\n if (meta.type === 'inline-trait' && chunkData.inlineTrait) {\n const orbital = schema.orbitals[meta.orbitalIndex!];\n if (orbital && isOrbitalDefinition(orbital) && orbital.traits && meta.inlineTraitIndex !== undefined) {\n orbital.traits[meta.inlineTraitIndex] = chunkData.inlineTrait as TraitRef;\n }\n }\n\n const output = JSON.stringify(schema, null, 2);\n await fs.writeFile(meta.sourceFile, output);\n await fs.unlink(chunkFilePath);\n\n return JSON.stringify({\n success: true,\n message: `Changes merged into ${path.basename(meta.sourceFile)}`,\n updatedSize: `${Math.round(output.length / 1024)}KB`,\n });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return JSON.stringify({ error: `Failed to apply chunk: ${msg}` });\n }\n },\n {\n name: 'apply_chunk',\n description: `Merge an edited chunk file back into the schema.\n\nCall this AFTER editing the chunk file with edit_file.`,\n schema: z.object({\n chunkId: z.string().describe('Chunk ID from extract_chunk'),\n }),\n }\n );\n}\n\n// ============================================================================\n// Factory function\n// ============================================================================\n\nexport function createSchemaChunkingTools(workDir: string) {\n return {\n querySchemaStructure: createQuerySchemaStructureTool(workDir),\n extractChunk: createExtractChunkTool(workDir),\n applyChunk: createApplyChunkTool(workDir),\n };\n}\n","/**\n * Design Transition Tool\n *\n * Takes a single transition context (state, event, entity, design hints)\n * and produces rich render-ui effects using a focused design skill.\n *\n * Uses @almadar/llm for LLM access and @almadar/skills for the design skill.\n * Results are cached by fingerprint to avoid regenerating identical transitions.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport crypto from 'crypto';\nimport { LLMClient } from '@almadar/llm';\nimport { generateKflowDesignSkill } from '@almadar/skills';\nimport {\n buildRecommendationContext,\n recommendPatterns,\n formatRecommendationsForPrompt,\n} from '@almadar/patterns';\nimport { AgentDomainCategorySchema } from '@almadar/core/types';\nimport type { SSEEventType } from '../api-types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type DesignEventCallback = (\n transitionId: string,\n event: {\n type: Exclude<SSEEventType, 'subagent_event'>;\n data: Record<string, unknown>;\n timestamp: number;\n }\n) => void;\n\nexport interface DesignTransitionToolOptions {\n onEvent?: DesignEventCallback;\n}\n\n// ============================================================================\n// Cache\n// ============================================================================\n\ninterface DesignCacheEntry {\n effects: unknown[];\n timestamp: number;\n usage: { inputTokens: number; outputTokens: number; totalTokens: number };\n}\n\nconst designCache = new Map<string, DesignCacheEntry>();\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000;\nconst CACHE_VERSION = 1;\n\nfunction generateFingerprint(input: Record<string, unknown>): string {\n const normalized = JSON.stringify({\n version: CACHE_VERSION,\n ...input,\n });\n return crypto.createHash('sha256').update(normalized).digest('hex').slice(0, 16);\n}\n\nfunction getCached(fingerprint: string): DesignCacheEntry | null {\n const entry = designCache.get(fingerprint);\n if (!entry) return null;\n if (Date.now() - entry.timestamp > CACHE_TTL_MS) {\n designCache.delete(fingerprint);\n return null;\n }\n return entry;\n}\n\n// ============================================================================\n// Static Prompt (built once, cached by Anthropic)\n// ============================================================================\n\nlet STATIC_DESIGN_PROMPT: string | null = null;\n\nfunction getDesignSystemPrompt(): string {\n if (!STATIC_DESIGN_PROMPT) {\n const skill = generateKflowDesignSkill();\n STATIC_DESIGN_PROMPT = skill.content;\n }\n return STATIC_DESIGN_PROMPT;\n}\n\n// ============================================================================\n// User Prompt Builder\n// ============================================================================\n\n/**\n * Get pattern recommendations for a transition context.\n */\nfunction getPatternRecommendations(input: {\n from: string;\n event: string;\n slot: string;\n domainCategory?: string;\n entityFields: Array<{ name: string; type: string; values?: string[] }>;\n}) {\n const recContext = buildRecommendationContext({\n state: input.from,\n event: input.event,\n slot: input.slot as 'main' | 'modal' | 'drawer' | 'sidebar' | 'overlay',\n domainCategory: input.domainCategory,\n entityFields: input.entityFields,\n });\n return recommendPatterns(recContext, 8);\n}\n\nfunction buildDesignUserPrompt(input: {\n from: string;\n to: string;\n event: string;\n slot: string;\n entityName: string;\n entityFields: Array<{ name: string; type: string; values?: string[] }>;\n domainCategory?: string;\n vocabulary?: Record<string, string>;\n designStyle?: string;\n flowPattern?: string;\n listPattern?: string;\n formPattern?: string;\n detailPattern?: string;\n existingEffects?: unknown[];\n recommendationsSection?: string;\n}): string {\n const fieldList = input.entityFields\n .map(f => {\n let desc = ` - ${f.name}: ${f.type}`;\n if (f.values) desc += ` (values: ${f.values.join(', ')})`;\n return desc;\n })\n .join('\\n');\n\n const hints: string[] = [];\n if (input.designStyle) hints.push(`Style: ${input.designStyle}`);\n if (input.flowPattern) hints.push(`Flow: ${input.flowPattern}`);\n if (input.listPattern) hints.push(`List: ${input.listPattern}`);\n if (input.formPattern) hints.push(`Form: ${input.formPattern}`);\n if (input.detailPattern) hints.push(`Detail: ${input.detailPattern}`);\n\n const vocab = input.vocabulary\n ? Object.entries(input.vocabulary).map(([k, v]) => ` ${k} → \"${v}\"`).join('\\n')\n : '';\n\n return `Design render-ui effects for this transition:\n\n## Transition\n- **From**: ${input.from}\n- **To**: ${input.to}\n- **Event**: ${input.event}\n- **Slot**: ${input.slot}\n\n## Entity: ${input.entityName}\n${fieldList}\n\n## Domain\n- **Category**: ${input.domainCategory || 'business'}\n${vocab ? `- **Vocabulary**:\\n${vocab}` : ''}\n${hints.length > 0 ? `- **Design Hints**: ${hints.join(', ')}` : ''}\n\n${input.recommendationsSection || ''}\n\n${input.existingEffects ? `## Existing Effects (enhance these)\\n\\`\\`\\`json\\n${JSON.stringify(input.existingEffects, null, 2)}\\n\\`\\`\\`` : ''}\n\nReturn ONLY the JSON array of render-ui effect tuples.`;\n}\n\n// ============================================================================\n// Zod Schema\n// ============================================================================\n\nconst DesignTransitionSchema = z.object({\n from: z.string().describe('Source state name (e.g., \"Browsing\")'),\n to: z.string().describe('Target state name (e.g., \"Browsing\" for self-loop, \"Creating\" for transition)'),\n event: z.string().describe('Event name (e.g., \"INIT\", \"CREATE\", \"VIEW\", \"EDIT\", \"DELETE\", \"SAVE\", \"CANCEL\")'),\n slot: z.string().describe('UI slot to render into: \"main\", \"modal\", \"drawer\", \"sidebar\", \"overlay\"'),\n entityName: z.string().describe('Entity name (e.g., \"Task\", \"Order\")'),\n entityFields: z.array(z.object({\n name: z.string(),\n type: z.string(),\n values: z.array(z.string()).optional(),\n })).describe('Entity fields with types and optional enum values'),\n domainCategory: AgentDomainCategorySchema.optional()\n .describe('Domain category for pattern selection'),\n vocabulary: z.record(z.string(), z.string()).optional()\n .describe('Domain vocabulary mapping (e.g., { \"create\": \"Place Order\", \"item\": \"Order\" })'),\n designStyle: z.enum(['minimal', 'modern', 'playful', 'data-driven', 'immersive']).optional()\n .describe('Visual style hint'),\n flowPattern: z.enum(['hub-spoke', 'master-detail', 'crud-cycle', 'linear', 'role-based']).optional()\n .describe('Application flow pattern'),\n listPattern: z.enum(['entity-table', 'entity-cards', 'entity-list']).optional()\n .describe('Preferred list pattern'),\n formPattern: z.enum(['modal', 'drawer', 'page']).optional()\n .describe('Preferred form pattern'),\n detailPattern: z.enum(['drawer', 'page', 'split']).optional()\n .describe('Preferred detail view pattern'),\n existingEffects: z.array(z.any()).optional()\n .describe('Existing render-ui effects to enhance (for refinement passes)'),\n});\n\n// ============================================================================\n// Tool Factory\n// ============================================================================\n\n/**\n * Create the design_transition tool.\n *\n * Takes a transition context and returns polished render-ui effects.\n * Uses the kflow-design skill as system prompt with Anthropic cache control.\n */\nexport function createDesignTransitionTool(\n options: DesignTransitionToolOptions = {},\n) {\n let eventCallback: DesignEventCallback | undefined = options.onEvent;\n\n const setEventCallback = (callback: DesignEventCallback) => {\n eventCallback = callback;\n };\n\n const emitEvent = (\n transitionId: string,\n type: Exclude<SSEEventType, 'subagent_event'>,\n data: Record<string, unknown>\n ) => {\n if (eventCallback) {\n eventCallback(transitionId, {\n type,\n data,\n timestamp: Date.now(),\n });\n }\n };\n\n const designTransitionTool = tool(\n async (input) => {\n const transitionId = `${input.entityName}:${input.from}->${input.to}:${input.event}`;\n const fingerprint = generateFingerprint({\n from: input.from,\n to: input.to,\n event: input.event,\n slot: input.slot,\n entityName: input.entityName,\n entityFields: input.entityFields,\n domainCategory: input.domainCategory,\n designStyle: input.designStyle,\n flowPattern: input.flowPattern,\n listPattern: input.listPattern,\n });\n\n try {\n emitEvent(transitionId, 'message', {\n content: `Designing UI for ${transitionId}`,\n role: 'assistant',\n isComplete: false,\n });\n\n // Check cache\n const cached = getCached(fingerprint);\n if (cached) {\n emitEvent(transitionId, 'generation_log', {\n level: 'info',\n message: `Design cache HIT for ${transitionId}`,\n data: { fingerprint },\n });\n\n return JSON.stringify({\n success: true,\n transitionId,\n effects: cached.effects,\n cached: true,\n usage: cached.usage,\n });\n }\n\n // Get pattern recommendations and build prompts\n const recommendations = getPatternRecommendations(input);\n const recommendationsSection = formatRecommendationsForPrompt(recommendations);\n const systemPrompt = getDesignSystemPrompt();\n const userPrompt = buildDesignUserPrompt({\n ...input,\n recommendationsSection,\n });\n\n emitEvent(transitionId, 'tool_call', {\n tool: 'llm_design_transition',\n args: {\n transition: transitionId,\n slot: input.slot,\n domain: input.domainCategory,\n },\n });\n\n // Call LLM with cache control\n const client = new LLMClient({\n provider: 'anthropic',\n model: 'claude-sonnet-4-20250514',\n temperature: 0.1, // Slight creativity for design\n });\n\n const response = await client.callWithCache<string>({\n systemPrompt: '',\n systemBlocks: [{\n type: 'text',\n text: systemPrompt,\n cache_control: { type: 'ephemeral' },\n }],\n userPrompt,\n maxTokens: 4096,\n rawText: true,\n });\n\n const rawText = (response.raw || String(response.data) || '').trim();\n\n // Parse the JSON array from the response\n let effects: unknown[];\n try {\n // Strip markdown code fences if present\n const jsonText = rawText.replace(/^```(?:json)?\\n?/m, '').replace(/\\n?```$/m, '').trim();\n effects = JSON.parse(jsonText);\n if (!Array.isArray(effects)) {\n effects = [effects];\n }\n } catch {\n // If parsing fails, return the raw text for the agent to handle\n return JSON.stringify({\n success: false,\n transitionId,\n error: 'Failed to parse design output as JSON',\n rawOutput: rawText,\n });\n }\n\n const usage = {\n inputTokens: response.usage?.promptTokens || 0,\n outputTokens: response.usage?.completionTokens || 0,\n totalTokens: response.usage?.totalTokens || 0,\n };\n\n // Cache the result\n designCache.set(fingerprint, {\n effects,\n timestamp: Date.now(),\n usage,\n });\n\n emitEvent(transitionId, 'tool_result', {\n tool: 'llm_design_transition',\n result: { fingerprint, effectCount: effects.length, usage },\n success: true,\n });\n\n emitEvent(transitionId, 'message', {\n content: `Designed ${effects.length} effect(s) for ${transitionId} (${usage.totalTokens} tokens)`,\n role: 'assistant',\n isComplete: true,\n });\n\n return JSON.stringify({\n success: true,\n transitionId,\n effects,\n cached: false,\n usage,\n recommendedPatterns: recommendations.map(r => r.pattern),\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n emitEvent(transitionId, 'error', {\n error: errorMessage,\n code: 'DESIGN_TRANSITION_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n transitionId,\n error: errorMessage,\n });\n }\n },\n {\n name: 'design_transition',\n description: `Design rich render-ui effects for a single orbital transition.\n\nTakes the transition context (from/to state, event, entity, domain) and produces\npolished render-ui effects using the full pattern catalog.\n\nUSE THIS TOOL WHEN:\n- Generating INIT transitions (always compose header + stats + content)\n- Generating CREATE/EDIT transitions (form with proper fields)\n- Generating VIEW transitions (detail with tabs for related entities)\n- Enhancing existing render-ui effects that are too basic\n\nThe tool uses a specialized design skill with pattern catalog, layout composition,\nand domain-aware pattern selection to produce rich UI.\n\nRETURNS: { success, effects: [[\"render-ui\", slot, config], ...], transitionId, usage }\n\nThe effects array contains ONLY render-ui tuples. Non-UI effects (persist, emit, set)\nare NOT included — you must preserve those from the original transition.\n\nINTEGRATION: After calling this tool, use extract_chunk to get the orbital,\nreplace the render-ui effects in the target transition (keep persist/emit/set effects),\nthen apply_chunk to merge back into schema.json.`,\n schema: DesignTransitionSchema,\n }\n );\n\n return {\n tool: designTransitionTool,\n setEventCallback,\n };\n}\n\n/**\n * Create a helper to wrap design events into SSE format.\n */\nexport function createDesignEventWrapper(\n writeEvent: (event: { type: string; timestamp: number; data: unknown }) => void\n): DesignEventCallback {\n return (transitionId, event) => {\n writeEvent({\n type: 'subagent_event',\n timestamp: Date.now(),\n data: { transitionId, event },\n });\n };\n}\n","/**\n * GitHub Tools for DeepAgent\n *\n * LangChain tools that wrap GitHubIntegration operations.\n * These tools enable the agent to clone repos, create branches, commit, push, and create PRs.\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { GitHubIntegration } from '@almadar/integrations';\nimport type { IntegrationConfig } from '@almadar/integrations';\n\n/**\n * GitHub tools configuration\n */\nexport interface GitHubToolsConfig {\n /** GitHub personal access token */\n token: string;\n /** Repository owner (e.g., 'octocat') */\n owner?: string;\n /** Repository name (e.g., 'hello-world') */\n repo?: string;\n /** Working directory for git operations */\n workDir: string;\n}\n\n/**\n * Create GitHub tools for the agent\n */\nexport function createGitHubTools(config: GitHubToolsConfig) {\n const { token, owner = '', repo = '', workDir } = config;\n\n // Create GitHub integration instance\n const integrationConfig: IntegrationConfig = {\n name: 'github',\n env: {\n GITHUB_TOKEN: token,\n GITHUB_OWNER: owner,\n GITHUB_REPO: repo,\n GITHUB_WORK_DIR: workDir,\n },\n };\n\n const github = new GitHubIntegration(integrationConfig);\n\n // =========================================================================\n // Git Operations\n // =========================================================================\n\n /**\n * Clone a GitHub repository\n */\n const github_clone = tool(\n async ({ repoUrl, branch, depth }) => {\n try {\n const result = await github.execute('cloneRepo', {\n repoUrl,\n targetDir: workDir,\n branch,\n depth: depth || 1,\n });\n\n if (!result.success) {\n return `Failed to clone repository: ${result.error?.message}`;\n }\n\n return `Successfully cloned ${repoUrl} to ${workDir}${branch ? ` (branch: ${branch})` : ''}`;\n } catch (error) {\n return `Error cloning repository: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_clone',\n description: `Clone a GitHub repository into the workspace.\n\nUsage:\n- Clones the repository into the current workspace directory\n- Defaults to shallow clone (depth: 1) for faster cloning\n- Can optionally specify a branch to checkout\n\nExample:\ngithub_clone({ repoUrl: \"https://github.com/owner/repo\", branch: \"main\" })`,\n schema: z.object({\n repoUrl: z.string().describe('GitHub repository URL (e.g., https://github.com/owner/repo)'),\n branch: z.string().optional().describe('Branch to checkout (defaults to repo default branch)'),\n depth: z.number().optional().describe('Clone depth (default: 1 for shallow clone)'),\n }),\n }\n );\n\n /**\n * Create a new git branch\n */\n const github_create_branch = tool(\n async ({ branchName, baseBranch }) => {\n try {\n const result = await github.execute('createBranch', {\n branchName,\n baseBranch,\n workDir,\n });\n\n if (!result.success) {\n return `Failed to create branch: ${result.error?.message}`;\n }\n\n return `Successfully created and checked out branch: ${branchName}`;\n } catch (error) {\n return `Error creating branch: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_create_branch',\n description: `Create and checkout a new git branch.\n\nUsage:\n- Creates a new branch from the current branch or specified base branch\n- Automatically checks out the new branch\n- Branch name should follow format: feature/name, fix/name, etc.\n\nExample:\ngithub_create_branch({ branchName: \"fix/issue-42-null-pointer\" })`,\n schema: z.object({\n branchName: z.string().describe('Name of the branch to create (e.g., fix/issue-42)'),\n baseBranch: z.string().optional().describe('Base branch to create from (defaults to current branch)'),\n }),\n }\n );\n\n /**\n * Commit changes\n */\n const github_commit = tool(\n async ({ message, files }) => {\n try {\n const result = await github.execute('commit', {\n message,\n files,\n workDir,\n });\n\n if (!result.success) {\n return `Failed to commit: ${result.error?.message}`;\n }\n\n return `Successfully committed: ${message}`;\n } catch (error) {\n return `Error committing changes: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_commit',\n description: `Stage and commit changes to git.\n\nUsage:\n- Stages files (or all changes if files not specified)\n- Creates a commit with the provided message\n- Commit message should be clear and descriptive\n\nExample:\ngithub_commit({ message: \"Fix null pointer in UserService\\\\n\\\\nCloses #42\" })`,\n schema: z.object({\n message: z.string().describe('Commit message (can include multiple lines)'),\n files: z.array(z.string()).optional().describe('Specific files to commit (defaults to all changes)'),\n }),\n }\n );\n\n /**\n * Push branch to remote\n */\n const github_push = tool(\n async ({ branchName }) => {\n try {\n const result = await github.execute('push', {\n branchName,\n force: false, // Never allow force push\n workDir,\n });\n\n if (!result.success) {\n return `Failed to push: ${result.error?.message}`;\n }\n\n return `Successfully pushed branch: ${branchName}`;\n } catch (error) {\n return `Error pushing branch: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_push',\n description: `Push a branch to GitHub.\n\nUsage:\n- Pushes the specified branch to origin\n- Sets upstream tracking (-u flag)\n- Force push is NEVER allowed for safety\n\nExample:\ngithub_push({ branchName: \"fix/issue-42\" })`,\n schema: z.object({\n branchName: z.string().describe('Name of the branch to push'),\n }),\n }\n );\n\n // =========================================================================\n // GitHub API Operations\n // =========================================================================\n\n /**\n * Create a pull request\n */\n const github_create_pr = tool(\n async ({ title, body, baseBranch, headBranch, draft }) => {\n try {\n const result = await github.execute('createPR', {\n title,\n body,\n baseBranch,\n headBranch,\n draft: draft || false,\n });\n\n if (!result.success) {\n return `Failed to create pull request: ${result.error?.message}`;\n }\n\n const pr = result.data as { number: number; url: string };\n return `Successfully created PR #${pr.number}: ${pr.url}`;\n } catch (error) {\n return `Error creating pull request: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_create_pr',\n description: `Create a pull request on GitHub.\n\nUsage:\n- Creates a PR from headBranch to baseBranch\n- Title should be concise (under 70 chars)\n- Body should include:\n - Summary of changes\n - Test plan or verification steps\n - References to issues (e.g., \"Closes #42\")\n\nExample:\ngithub_create_pr({\n title: \"Fix null pointer in UserService\",\n body: \"## Summary\\\\n- Fixed null check...\\\\n\\\\nCloses #42\",\n baseBranch: \"main\",\n headBranch: \"fix/issue-42\"\n})`,\n schema: z.object({\n title: z.string().describe('PR title (concise, under 70 chars)'),\n body: z.string().describe('PR description/body (markdown supported)'),\n baseBranch: z.string().describe('Base branch (usually \"main\" or \"master\")'),\n headBranch: z.string().describe('Head branch (your feature/fix branch)'),\n draft: z.boolean().optional().describe('Create as draft PR (default: false)'),\n }),\n }\n );\n\n /**\n * List repository issues\n */\n const github_list_issues = tool(\n async ({ state, labels, limit }) => {\n try {\n const result = await github.execute('listIssues', {\n state: state || 'open',\n labels: labels || [],\n limit: limit || 30,\n });\n\n if (!result.success) {\n return `Failed to list issues: ${result.error?.message}`;\n }\n\n const data = result.data as { issues: Array<{ number: number; title: string; state: string; labels: Array<{ name: string }> }> };\n const issues = data.issues;\n\n if (issues.length === 0) {\n return 'No issues found matching the criteria.';\n }\n\n const issueList = issues\n .map((issue) => {\n const labelsStr = issue.labels.map((l) => l.name).join(', ');\n return `#${issue.number}: ${issue.title} [${issue.state}]${labelsStr ? ` (${labelsStr})` : ''}`;\n })\n .join('\\n');\n\n return `Found ${issues.length} issue(s):\\n${issueList}`;\n } catch (error) {\n return `Error listing issues: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_list_issues',\n description: `List repository issues from GitHub.\n\nUsage:\n- Lists issues with optional filters\n- Returns issue number, title, state, and labels\n- Useful for finding issues to work on\n\nExample:\ngithub_list_issues({ state: \"open\", labels: [\"bug\"], limit: 10 })`,\n schema: z.object({\n state: z.enum(['open', 'closed', 'all']).optional().describe('Issue state filter (default: \"open\")'),\n labels: z.array(z.string()).optional().describe('Filter by labels'),\n limit: z.number().optional().describe('Maximum number of issues to return (default: 30)'),\n }),\n }\n );\n\n /**\n * Get issue details\n */\n const github_get_issue = tool(\n async ({ issueNumber }) => {\n try {\n const result = await github.execute('getIssue', {\n issueNumber,\n });\n\n if (!result.success) {\n return `Failed to get issue: ${result.error?.message}`;\n }\n\n const data = result.data as {\n issue: {\n number: number;\n title: string;\n body: string | null;\n state: string;\n labels: Array<{ name: string }>;\n };\n comments: Array<{\n body: string;\n user: { login: string };\n created_at: string;\n }>;\n };\n\n const { issue, comments } = data;\n const labelsStr = issue.labels.map((l) => l.name).join(', ');\n\n let output = `Issue #${issue.number}: ${issue.title}\\n`;\n output += `State: ${issue.state}\\n`;\n if (labelsStr) {\n output += `Labels: ${labelsStr}\\n`;\n }\n output += `\\nDescription:\\n${issue.body || '(No description)'}\\n`;\n\n if (comments.length > 0) {\n output += `\\n${comments.length} Comment(s):\\n`;\n comments.forEach((comment) => {\n output += `\\n@${comment.user.login} (${comment.created_at}):\\n${comment.body}\\n`;\n });\n }\n\n return output;\n } catch (error) {\n return `Error getting issue: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_get_issue',\n description: `Get detailed information about a specific issue.\n\nUsage:\n- Retrieves issue details including description and comments\n- Useful for understanding what needs to be fixed\n- Use this before working on an issue\n\nExample:\ngithub_get_issue({ issueNumber: 42 })`,\n schema: z.object({\n issueNumber: z.number().describe('Issue number to retrieve'),\n }),\n }\n );\n\n /**\n * Get PR review comments\n */\n const github_get_pr_comments = tool(\n async ({ prNumber }) => {\n try {\n const result = await github.execute('getPRComments', {\n prNumber,\n });\n\n if (!result.success) {\n return `Failed to get PR comments: ${result.error?.message}`;\n }\n\n const data = result.data as {\n comments: Array<{\n body: string;\n user: { login: string };\n created_at: string;\n }>;\n };\n\n const comments = data.comments;\n\n if (comments.length === 0) {\n return `No comments on PR #${prNumber}`;\n }\n\n let output = `${comments.length} Comment(s) on PR #${prNumber}:\\n`;\n comments.forEach((comment) => {\n output += `\\n@${comment.user.login} (${comment.created_at}):\\n${comment.body}\\n`;\n });\n\n return output;\n } catch (error) {\n return `Error getting PR comments: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_get_pr_comments',\n description: `Get review comments on a pull request.\n\nUsage:\n- Retrieves all comments on a PR\n- Useful for addressing review feedback\n- Shows commenter and timestamp\n\nExample:\ngithub_get_pr_comments({ prNumber: 87 })`,\n schema: z.object({\n prNumber: z.number().describe('Pull request number'),\n }),\n }\n );\n\n return {\n github_clone,\n github_create_branch,\n github_commit,\n github_push,\n github_create_pr,\n github_list_issues,\n github_get_issue,\n github_get_pr_comments,\n };\n}\n\n/**\n * Create GitHub tools as array (for easy spreading into agent tools)\n */\nexport function createGitHubToolsArray(config: GitHubToolsConfig) {\n const tools = createGitHubTools(config);\n return Object.values(tools);\n}\n","/**\n * In-Memory Persistence Backend\n *\n * Provides in-memory session metadata storage for development.\n * Data is lost on process restart.\n */\n\nimport type { SessionMetadata, SessionRecord } from './types.js';\n\n// ============================================================================\n// MemorySessionBackend\n// ============================================================================\n\n/**\n * In-memory session metadata store.\n */\nexport class MemorySessionBackend {\n private sessions = new Map<string, SessionMetadata>();\n\n /**\n * Store session metadata.\n */\n store(threadId: string, metadata: SessionMetadata): void {\n this.sessions.set(threadId, metadata);\n }\n\n /**\n * Get session metadata.\n */\n get(threadId: string): SessionMetadata | undefined {\n return this.sessions.get(threadId);\n }\n\n /**\n * Delete session metadata.\n */\n delete(threadId: string): boolean {\n return this.sessions.delete(threadId);\n }\n\n /**\n * List all sessions.\n */\n list(): SessionRecord[] {\n return Array.from(this.sessions.entries()).map(([threadId, meta]) => ({\n threadId,\n ...meta,\n }));\n }\n\n /**\n * Check if a session exists.\n */\n has(threadId: string): boolean {\n return this.sessions.has(threadId);\n }\n}\n","/**\n * Firestore Checkpointer for LangGraph\n *\n * Custom implementation of BaseCheckpointSaver using Firebase Firestore.\n * This is required because LangGraph only provides Postgres/Redis savers.\n *\n * IMPORTANT: This module does NOT import firebase-admin directly.\n * The Firestore `db` instance must be injected via constructor options.\n * This keeps the @almadar/agent package free of firebase-admin as a direct dependency.\n */\n\nimport {\n BaseCheckpointSaver,\n type Checkpoint,\n type CheckpointTuple,\n type CheckpointMetadata,\n type CheckpointListOptions,\n type PendingWrite,\n} from '@langchain/langgraph-checkpoint';\nimport type { RunnableConfig } from '@langchain/core/runnables';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Minimal Firestore interface to avoid importing firebase-admin.\n * Consumers pass their own Firestore instance.\n */\nexport interface FirestoreDb {\n collection(path: string): FirestoreCollectionRef;\n batch(): FirestoreBatch;\n}\n\nexport interface FirestoreCollectionRef {\n doc(id: string): FirestoreDocRef;\n where(field: string, op: string, value: unknown): FirestoreQuery;\n orderBy(field: string, direction?: string): FirestoreQuery;\n limit(n: number): FirestoreQuery;\n}\n\nexport interface FirestoreDocRef {\n set(data: unknown): Promise<unknown>;\n get(): Promise<FirestoreDocSnapshot>;\n update(data: unknown): Promise<unknown>;\n delete(): Promise<unknown>;\n readonly ref: unknown;\n}\n\nexport interface FirestoreDocSnapshot {\n exists: boolean;\n data(): Record<string, unknown> | undefined;\n readonly ref: unknown;\n}\n\nexport interface FirestoreQuery {\n where(field: string, op: string, value: unknown): FirestoreQuery;\n orderBy(field: string, direction?: string): FirestoreQuery;\n limit(n: number): FirestoreQuery;\n startAfter(doc: unknown): FirestoreQuery;\n get(): Promise<FirestoreQuerySnapshot>;\n}\n\nexport interface FirestoreQuerySnapshot {\n empty: boolean;\n docs: FirestoreQueryDocSnapshot[];\n size: number;\n}\n\nexport interface FirestoreQueryDocSnapshot {\n data(): Record<string, unknown>;\n readonly ref: unknown;\n}\n\nexport interface FirestoreBatch {\n set(ref: unknown, data: unknown): void;\n delete(ref: unknown): void;\n commit(): Promise<unknown>;\n}\n\n/**\n * Firestore Timestamp-like interface.\n */\nexport interface FirestoreTimestamp {\n toDate(): Date;\n}\n\n/**\n * Options for FirestoreCheckpointer.\n */\nexport interface FirestoreCheckpointerOptions {\n /**\n * Firestore instance. Required — injected by consumer.\n */\n db: FirestoreDb;\n\n /**\n * Collection name for checkpoints.\n * @default 'agent_checkpoints'\n */\n checkpointsCollection?: string;\n\n /**\n * Collection name for pending writes.\n * @default 'agent_writes'\n */\n writesCollection?: string;\n}\n\n/**\n * Document structure for checkpoint storage.\n */\ninterface CheckpointDocument {\n threadId: string;\n checkpointId: string;\n parentCheckpointId?: string;\n checkpoint: Checkpoint;\n metadata: CheckpointMetadata;\n createdAt: unknown;\n updatedAt: unknown;\n}\n\n/**\n * Document structure for pending writes.\n */\ninterface WriteDocument {\n threadId: string;\n checkpointId: string;\n taskId: string;\n channel: string;\n value: unknown;\n createdAt: unknown;\n}\n\n// ============================================================================\n// FirestoreCheckpointer\n// ============================================================================\n\n/**\n * Firestore-backed checkpointer for LangGraph agents.\n *\n * Provides persistent checkpoint storage across server restarts.\n * Thread checkpoints are stored as Firestore documents.\n *\n * @example\n * ```typescript\n * import { getFirestore } from 'firebase-admin/firestore';\n *\n * const checkpointer = new FirestoreCheckpointer({\n * db: getFirestore(),\n * checkpointsCollection: 'agent_checkpoints',\n * });\n *\n * const agent = createDeepAgent({\n * // ...\n * checkpointer,\n * });\n * ```\n */\nexport class FirestoreCheckpointer extends BaseCheckpointSaver {\n private db: FirestoreDb;\n private checkpointsCollection: string;\n private writesCollection: string;\n\n constructor(options: FirestoreCheckpointerOptions) {\n super();\n this.db = options.db;\n this.checkpointsCollection = options.checkpointsCollection ?? 'agent_checkpoints';\n this.writesCollection = options.writesCollection ?? 'agent_writes';\n }\n\n /**\n * Get thread ID from config.\n */\n private getThreadId(config: RunnableConfig): string {\n const threadId = config.configurable?.thread_id;\n if (!threadId || typeof threadId !== 'string') {\n throw new Error('thread_id is required in config.configurable');\n }\n return threadId;\n }\n\n /**\n * Get checkpoint ID from config, or undefined for latest.\n */\n private getCheckpointId(config: RunnableConfig): string | undefined {\n return config.configurable?.checkpoint_id as string | undefined;\n }\n\n /**\n * Get checkpoint by config.\n */\n async getTuple(config: RunnableConfig): Promise<CheckpointTuple | undefined> {\n const threadId = this.getThreadId(config);\n const checkpointId = this.getCheckpointId(config);\n\n let query = this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId);\n\n if (checkpointId) {\n query = query.where('checkpointId', '==', checkpointId);\n } else {\n query = query.orderBy('createdAt', 'desc').limit(1);\n }\n\n const snapshot = await query.get();\n if (snapshot.empty) {\n return undefined;\n }\n\n const doc = snapshot.docs[0];\n const data = doc.data() as unknown as CheckpointDocument;\n\n // Get pending writes for this checkpoint\n const writesSnapshot = await this.db\n .collection(this.writesCollection)\n .where('threadId', '==', threadId)\n .where('checkpointId', '==', data.checkpointId)\n .get();\n\n const pendingWrites = writesSnapshot.docs.map((writeDoc) => {\n const writeData = writeDoc.data() as unknown as WriteDocument;\n return [writeData.taskId, writeData.channel, writeData.value] as [string, string, unknown];\n });\n\n // Build parent config if available\n const parentConfig = data.parentCheckpointId\n ? {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.parentCheckpointId,\n },\n }\n : undefined;\n\n return {\n config: {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.checkpointId,\n },\n },\n checkpoint: data.checkpoint,\n metadata: data.metadata,\n parentConfig,\n pendingWrites,\n };\n }\n\n /**\n * List checkpoints for a thread.\n */\n async *list(\n config: RunnableConfig,\n options?: CheckpointListOptions\n ): AsyncGenerator<CheckpointTuple> {\n const threadId = this.getThreadId(config);\n const limit = options?.limit ?? 10;\n\n let query = this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId)\n .orderBy('createdAt', 'desc')\n .limit(limit);\n\n // Apply filter if provided\n if (options?.filter) {\n for (const [key, value] of Object.entries(options.filter)) {\n query = query.where(`metadata.${key}`, '==', value);\n }\n }\n\n // Apply before cursor if provided\n if (options?.before?.configurable?.checkpoint_id) {\n const beforeDoc = await this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId)\n .where('checkpointId', '==', options.before.configurable.checkpoint_id)\n .get();\n\n if (!beforeDoc.empty) {\n query = query.startAfter(beforeDoc.docs[0]);\n }\n }\n\n const snapshot = await query.get();\n\n for (const doc of snapshot.docs) {\n const data = doc.data() as unknown as CheckpointDocument;\n\n const parentConfig = data.parentCheckpointId\n ? {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.parentCheckpointId,\n },\n }\n : undefined;\n\n yield {\n config: {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.checkpointId,\n },\n },\n checkpoint: data.checkpoint,\n metadata: data.metadata,\n parentConfig,\n };\n }\n }\n\n /**\n * Save a checkpoint.\n */\n async put(\n config: RunnableConfig,\n checkpoint: Checkpoint,\n metadata: CheckpointMetadata,\n _newVersions: Record<string, number | string>\n ): Promise<RunnableConfig> {\n const threadId = this.getThreadId(config);\n const checkpointId = checkpoint.id;\n const parentCheckpointId = this.getCheckpointId(config);\n\n const now = new Date();\n\n const docData: CheckpointDocument = {\n threadId,\n checkpointId,\n parentCheckpointId,\n checkpoint,\n metadata,\n createdAt: now,\n updatedAt: now,\n };\n\n // Use checkpointId as document ID for easy lookup\n const docId = `${threadId}_${checkpointId}`;\n await this.db.collection(this.checkpointsCollection).doc(docId).set(docData);\n\n return {\n configurable: {\n thread_id: threadId,\n checkpoint_id: checkpointId,\n },\n };\n }\n\n /**\n * Store pending writes for a checkpoint.\n */\n async putWrites(\n config: RunnableConfig,\n writes: PendingWrite[],\n taskId: string\n ): Promise<void> {\n const threadId = this.getThreadId(config);\n const checkpointId = this.getCheckpointId(config);\n\n if (!checkpointId) {\n throw new Error('checkpoint_id is required for putWrites');\n }\n\n const batch = this.db.batch();\n const now = new Date();\n\n for (const [idx, [channel, value]] of writes.entries()) {\n const docId = `${threadId}_${checkpointId}_${taskId}_${idx}`;\n const docRef = this.db.collection(this.writesCollection).doc(docId);\n\n const writeData: WriteDocument = {\n threadId,\n checkpointId,\n taskId,\n channel,\n value,\n createdAt: now,\n };\n\n batch.set(docRef, writeData);\n }\n\n await batch.commit();\n }\n\n /**\n * Delete all checkpoints and writes for a thread.\n */\n async deleteThread(threadId: string): Promise<void> {\n // Delete checkpoints\n const checkpointsSnapshot = await this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId)\n .get();\n\n const checkpointBatch = this.db.batch();\n for (const doc of checkpointsSnapshot.docs) {\n checkpointBatch.delete(doc.ref);\n }\n await checkpointBatch.commit();\n\n // Delete writes\n const writesSnapshot = await this.db\n .collection(this.writesCollection)\n .where('threadId', '==', threadId)\n .get();\n\n const writesBatch = this.db.batch();\n for (const doc of writesSnapshot.docs) {\n writesBatch.delete(doc.ref);\n }\n await writesBatch.commit();\n }\n}\n","/**\n * Firestore Session Store for DeepAgent\n *\n * Provides persistent session storage for skill-based agents.\n * Sessions are stored in Firestore and persist across server restarts.\n *\n * IMPORTANT: This module does NOT import firebase-admin directly.\n * The Firestore `db` instance must be injected via constructor options.\n */\n\nimport type { Session } from './types.js';\nimport type { FirestoreDb, FirestoreTimestamp } from './firestore-checkpointer.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for FirestoreSessionStore.\n */\nexport interface FirestoreSessionStoreOptions {\n /**\n * Firestore instance. Required — injected by consumer.\n */\n db: FirestoreDb;\n\n /**\n * Collection name for sessions.\n * @default 'agent_sessions'\n */\n collection?: string;\n}\n\n/**\n * Document structure for session storage.\n */\ninterface SessionDocument {\n threadId: string;\n skill: string;\n workDir: string;\n userId?: string;\n createdAt: FirestoreTimestamp;\n lastActivityAt: FirestoreTimestamp;\n}\n\n// ============================================================================\n// FirestoreSessionStore\n// ============================================================================\n\n/**\n * Firestore-backed session store for skill agents.\n *\n * @example\n * ```typescript\n * const sessionStore = new FirestoreSessionStore({ db: getFirestore() });\n *\n * await sessionStore.save({\n * threadId: 'abc-123',\n * skill: 'kflow-generating-m',\n * workDir: '/tmp/workspace',\n * createdAt: new Date(),\n * lastActivityAt: new Date(),\n * });\n *\n * const session = await sessionStore.get('abc-123');\n * ```\n */\nexport class FirestoreSessionStore {\n private db: FirestoreDb;\n private collection: string;\n\n constructor(options: FirestoreSessionStoreOptions) {\n this.db = options.db;\n this.collection = options.collection ?? 'agent_sessions';\n }\n\n /**\n * Save a session.\n */\n async save(session: Session): Promise<void> {\n const now = new Date();\n\n const docData = {\n threadId: session.threadId,\n skill: session.skill,\n workDir: session.workDir,\n userId: session.userId,\n createdAt: session.createdAt,\n lastActivityAt: now,\n };\n\n await this.db.collection(this.collection).doc(session.threadId).set(docData);\n }\n\n /**\n * Get a session by thread ID.\n */\n async get(threadId: string): Promise<Session | null> {\n const doc = await this.db.collection(this.collection).doc(threadId).get();\n\n if (!doc.exists) {\n return null;\n }\n\n const data = doc.data() as unknown as SessionDocument;\n return {\n threadId: data.threadId,\n skill: data.skill,\n workDir: data.workDir,\n userId: data.userId,\n createdAt: data.createdAt?.toDate?.() ?? new Date(data.createdAt as unknown as string),\n lastActivityAt: data.lastActivityAt?.toDate?.() ?? new Date(data.lastActivityAt as unknown as string),\n };\n }\n\n /**\n * Update session's last activity timestamp.\n */\n async touch(threadId: string): Promise<void> {\n await this.db.collection(this.collection).doc(threadId).update({\n lastActivityAt: new Date(),\n });\n }\n\n /**\n * Delete a session.\n */\n async delete(threadId: string): Promise<void> {\n await this.db.collection(this.collection).doc(threadId).delete();\n }\n\n /**\n * List sessions, optionally filtered by user ID.\n */\n async list(options?: { userId?: string; limit?: number }): Promise<Session[]> {\n let query = this.db\n .collection(this.collection)\n .orderBy('lastActivityAt', 'desc');\n\n if (options?.userId) {\n query = query.where('userId', '==', options.userId);\n }\n\n const limit = options?.limit ?? 100;\n query = query.limit(limit);\n\n const snapshot = await query.get();\n\n return snapshot.docs.map((doc) => {\n const data = doc.data() as unknown as SessionDocument;\n return {\n threadId: data.threadId,\n skill: data.skill,\n workDir: data.workDir,\n userId: data.userId,\n createdAt: data.createdAt?.toDate?.() ?? new Date(data.createdAt as unknown as string),\n lastActivityAt: data.lastActivityAt?.toDate?.() ?? new Date(data.lastActivityAt as unknown as string),\n };\n });\n }\n\n /**\n * Delete expired sessions (older than specified hours).\n */\n async deleteExpired(maxAgeHours: number = 24): Promise<number> {\n const cutoff = new Date(Date.now() - maxAgeHours * 60 * 60 * 1000);\n\n const snapshot = await this.db\n .collection(this.collection)\n .where('lastActivityAt', '<', cutoff)\n .get();\n\n const batch = this.db.batch();\n for (const doc of snapshot.docs) {\n batch.delete(doc.ref);\n }\n\n await batch.commit();\n return snapshot.size;\n }\n}\n","/**\n * Session Manager\n *\n * Unified session management API with pluggable persistence backends.\n * Supports in-memory (development) and Firestore (production) backends.\n */\n\nimport { MemorySaver } from '@langchain/langgraph';\nimport type { BaseCheckpointSaver } from '@langchain/langgraph-checkpoint';\n\nimport type { SessionMetadata, SessionRecord, PersistenceMode, Session } from '../persistence/types.js';\nimport { MemorySessionBackend } from '../persistence/memory-backend.js';\nimport { FirestoreCheckpointer, type FirestoreDb } from '../persistence/firestore-checkpointer.js';\nimport { FirestoreSessionStore } from '../persistence/firestore-session-store.js';\n\n// Re-export for convenience\nexport type { SessionMetadata, SessionRecord, PersistenceMode };\n\n// ============================================================================\n// Session Manager\n// ============================================================================\n\nexport interface SessionManagerOptions {\n /**\n * Persistence mode.\n * @default 'memory'\n */\n mode?: PersistenceMode;\n\n /**\n * Firestore database instance. Required when mode is 'firestore'.\n */\n firestoreDb?: FirestoreDb;\n}\n\n/**\n * Unified session management for agent sessions.\n *\n * Handles both session metadata and LangGraph checkpointers.\n */\nexport class SessionManager {\n private mode: PersistenceMode;\n private memoryBackend: MemorySessionBackend;\n private memoryCheckpointers: Map<string, MemorySaver>;\n private firestoreCheckpointer: FirestoreCheckpointer | null = null;\n private firestoreSessionStore: FirestoreSessionStore | null = null;\n\n constructor(options: SessionManagerOptions = {}) {\n this.mode = options.mode ?? 'memory';\n this.memoryBackend = new MemorySessionBackend();\n this.memoryCheckpointers = new Map();\n\n if (this.mode === 'firestore' && options.firestoreDb) {\n this.firestoreCheckpointer = new FirestoreCheckpointer({ db: options.firestoreDb });\n this.firestoreSessionStore = new FirestoreSessionStore({ db: options.firestoreDb });\n }\n }\n\n /**\n * Get the persistence mode.\n */\n getMode(): PersistenceMode {\n return this.mode;\n }\n\n /**\n * Get or create a checkpointer for a session.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getCheckpointer(threadId: string): BaseCheckpointSaver<any> {\n if (this.mode === 'firestore' && this.firestoreCheckpointer) {\n return this.firestoreCheckpointer;\n }\n\n let checkpointer = this.memoryCheckpointers.get(threadId);\n if (!checkpointer) {\n checkpointer = new MemorySaver();\n this.memoryCheckpointers.set(threadId, checkpointer);\n }\n // Cast to BaseCheckpointSaver - MemorySaver may not implement all methods (e.g., deleteThread)\n return checkpointer as unknown as BaseCheckpointSaver<any>;\n }\n\n /**\n * Store session metadata.\n */\n store(threadId: string, metadata: SessionMetadata): void {\n // Always store in memory for sync access\n this.memoryBackend.store(threadId, metadata);\n\n // Also store in Firestore if that mode is active\n if (this.mode === 'firestore' && this.firestoreSessionStore) {\n const session: Session = {\n threadId,\n skill: metadata.skill,\n workDir: metadata.workDir,\n createdAt: new Date(metadata.createdAt),\n lastActivityAt: new Date(metadata.lastActivityAt),\n };\n this.firestoreSessionStore.save(session).catch(console.error);\n }\n }\n\n /**\n * Get session metadata (sync, memory only).\n */\n get(threadId: string): SessionMetadata | undefined {\n return this.memoryBackend.get(threadId);\n }\n\n /**\n * Get session metadata (async, supports Firestore).\n */\n async getAsync(threadId: string): Promise<SessionMetadata | undefined> {\n if (this.mode === 'firestore' && this.firestoreSessionStore) {\n const session = await this.firestoreSessionStore.get(threadId);\n if (!session) return undefined;\n return {\n skill: session.skill,\n workDir: session.workDir,\n createdAt: session.createdAt.getTime(),\n lastActivityAt: session.lastActivityAt.getTime(),\n };\n }\n return this.memoryBackend.get(threadId);\n }\n\n /**\n * Clear a session's checkpointer and metadata.\n */\n clear(threadId: string): boolean {\n if (this.mode === 'firestore') {\n this.firestoreCheckpointer?.deleteThread(threadId).catch(console.error);\n this.firestoreSessionStore?.delete(threadId).catch(console.error);\n this.memoryBackend.delete(threadId);\n return true;\n }\n this.memoryBackend.delete(threadId);\n return this.memoryCheckpointers.delete(threadId);\n }\n\n /**\n * List all sessions (sync, memory only).\n */\n list(): SessionRecord[] {\n return this.memoryBackend.list();\n }\n\n /**\n * List all sessions (async, supports Firestore).\n */\n async listAsync(): Promise<SessionRecord[]> {\n if (this.mode === 'firestore' && this.firestoreSessionStore) {\n const sessions = await this.firestoreSessionStore.list();\n return sessions.map((s) => ({\n threadId: s.threadId,\n skill: s.skill,\n workDir: s.workDir,\n createdAt: s.createdAt.getTime(),\n lastActivityAt: s.lastActivityAt.getTime(),\n }));\n }\n return this.memoryBackend.list();\n }\n}\n","/**\n * Interrupt Configuration\n *\n * Human-in-the-loop configuration for agent tools.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Skill metadata (minimal interface for interrupt config).\n */\nexport interface SkillMeta {\n name: string;\n allowedTools?: string[];\n}\n\n// ============================================================================\n// Interrupt Configuration\n// ============================================================================\n\n/**\n * Default interrupt configuration for tools requiring human approval.\n * Using `true` means the tool requires approval with default options.\n */\nconst DEFAULT_INTERRUPT_CONFIG: Record<string, boolean> = {\n // Shell commands always require approval\n execute: true,\n};\n\n/**\n * Get interrupt configuration for a skill.\n *\n * Default: require approval for execute tool.\n * Skills can override via frontmatter (future enhancement).\n */\nexport function getInterruptConfig(_skill: SkillMeta): Record<string, boolean> {\n const config = { ...DEFAULT_INTERRUPT_CONFIG };\n return config;\n}\n","/**\n * Skill-Based DeepAgent Factory\n *\n * Creates DeepAgent instances that use skills as the primary prompt source.\n * No custom system prompts - all agent behavior is defined through skills.\n *\n * Uses deepagents library primitives:\n * - createDeepAgent() for agent creation\n * - FilesystemBackend for file operations\n *\n * Skill loading is injected via SkillLoader functions, keeping this package\n * independent of any specific skill registry location.\n */\n\nimport { createDeepAgent, FilesystemBackend } from 'deepagents';\nimport { Command } from '@langchain/langgraph';\nimport { v4 as uuid } from 'uuid';\n\nimport {\n createAnthropicClient,\n createDeepSeekClient,\n createOpenAIClient,\n ANTHROPIC_MODELS,\n DEEPSEEK_MODELS,\n OPENAI_MODELS,\n type LLMProvider,\n} from '@almadar/llm';\n\nimport {\n createExecuteTool,\n createFinishTaskTool,\n createValidateSchemaTool,\n createOrbitalSubagentTool,\n createSchemaChunkingTools,\n createDomainOrbitalTools,\n createDesignTransitionTool,\n createGitHubToolsArray,\n type SubagentEventCallback,\n type OrbitalCompleteCallback,\n type DomainOrbitalCompleteCallback,\n} from '../tools/index.js';\n\nimport { SessionManager, type SessionMetadata } from './session-manager.js';\nimport { getInterruptConfig, type SkillMeta } from './interrupt-config.js';\nimport { MemoryManager, type UserPreference, type ProjectContext } from '../memory/index.js';\n\n// Re-export Command for resume operations\nexport { Command };\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Skill definition loaded by the consumer.\n */\nexport interface Skill {\n name: string;\n description: string;\n content: string;\n allowedTools?: string[];\n version?: string;\n references: string[];\n path?: string;\n}\n\n/**\n * Function to load a skill by name.\n */\nexport type SkillLoader = (name: string) => Skill | null;\n\n/**\n * Function to load a skill reference by skill name and ref name.\n */\nexport type SkillRefLoader = (skillName: string, refName: string) => string | null;\n\n/**\n * Options for creating a skill agent.\n */\nexport interface SkillAgentOptions {\n /** Required: The skill(s) to use. Can be a single skill or array of skills. */\n skill: string | string[];\n /** Required: Working directory for the agent */\n workDir: string;\n /** Required: Function to load skills */\n skillLoader: SkillLoader;\n /** Optional: Function to load skill references */\n skillRefLoader?: SkillRefLoader;\n /** Optional: Thread ID for session continuity */\n threadId?: string;\n /** Optional: LLM provider */\n provider?: LLMProvider;\n /** Optional: Model name */\n model?: string;\n /** Optional: Enable verbose logging */\n verbose?: boolean;\n /** Optional: Disable human-in-the-loop interrupts (for eval/testing) */\n noInterrupt?: boolean;\n /** Optional: Callback for subagent events (orbital generation) */\n onSubagentEvent?: SubagentEventCallback;\n /** Optional: Session manager instance (shared across requests) */\n sessionManager?: SessionManager;\n /** Optional: Extracted requirements from analysis phase (for orbital skill) */\n requirements?: {\n entities?: string[];\n states?: string[];\n events?: string[];\n guards?: string[];\n pages?: string[];\n effects?: string[];\n rawRequirements?: string[];\n };\n /** Optional: GitHub integration configuration */\n githubConfig?: {\n /** GitHub personal access token */\n token: string;\n /** Repository owner (e.g., 'octocat') */\n owner?: string;\n /** Repository name (e.g., 'hello-world') */\n repo?: string;\n };\n /** Optional: Memory manager for user/project memory (GAP-001) */\n memoryManager?: MemoryManager;\n /** Optional: User ID for memory lookup */\n userId?: string;\n /** Optional: App ID for project context */\n appId?: string;\n}\n\n/**\n * Result from creating a skill agent.\n */\nexport interface SkillAgentResult {\n /** The agent instance (from deepagents library) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n agent: any;\n /** Thread ID for session resumption */\n threadId: string;\n /** The loaded skill(s) - primary skill when single, all skills when multiple */\n skill: Skill;\n /** All loaded skills (same as skill when single) */\n skills: Skill[];\n /** Working directory */\n workDir: string;\n /** Orbital tool setter for wiring SSE callback (if orbital tool enabled) */\n setOrbitalEventCallback?: (callback: SubagentEventCallback) => void;\n /** Orbital tool setter for wiring persistence callback */\n setOrbitalCompleteCallback?: (callback: OrbitalCompleteCallback) => void;\n /** Domain orbital callback for lean skill Firestore persistence */\n setDomainCompleteCallback?: (callback: DomainOrbitalCompleteCallback) => void;\n /** User preferences loaded from memory (GAP-001) */\n userPreferences?: UserPreference | null;\n /** Project context loaded from memory (GAP-001) */\n projectContext?: ProjectContext | null;\n /** Memory manager instance (GAP-001) */\n memoryManager?: MemoryManager;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Base system prompt that provides core agent behavior.\n * Skill-specific instructions are appended to this.\n */\nconst BASE_SYSTEM_PROMPT = `You are a KFlow agent that helps users create and manage application schemas.\n\nYou have access to:\n- File operations (ls, read_file, write_file, edit_file) for managing files\n- Execute tool for running shell commands in your workspace\n\n## Guidelines\n\n1. **Plan First**: Think through the steps needed before executing\n2. **Work Incrementally**: Complete one step at a time, verify before moving on\n3. **Stay in Workspace**: All file operations are restricted to your workspace directory\n4. **Validate Often**: After generating schemas, validate them with orbital validate\n\n## Batch Repair Strategy (CRITICAL)\n\nWhen fixing validation errors:\n1. **Fix ALL errors at once**: Do not fix one by one. Read the validation report, identify all issues, and apply a single comprehensive fix.\n2. **Avoid Loops**: If you fix an error and it persists, STOP and rethink. Do not try the same fix twice.\n\n## ⛔ JSON FILE OPERATIONS (MANDATORY)\n\n**NEVER use \\`edit_file\\` on JSON files (schema.json, *.json).**\n\n\\`edit_file\\` on JSON causes:\n- Trailing comma errors\n- Missing bracket errors\n- Whitespace/newline corruption\n- Endless fix loops\n\n**ALWAYS use \\`write_file\\` to overwrite the ENTIRE JSON file.**\n\nWorkflow for JSON changes:\n1. Read the current file content\n2. Modify in memory (add/remove/change)\n3. Write the COMPLETE updated JSON with \\`write_file\\`\n\nThis applies to ALL JSON modifications - initial creation, adding pages, fixing errors.\n\n## Workspace\n\nYour workspace is a sandboxed directory. Use relative paths like:\n- ./schema.json (for the KFlow schema)\n- ./app (for the compiled application)\n\nAll paths are relative to your workspace root.`;\n\n// ============================================================================\n// LLM Client Factory\n// ============================================================================\n\n/**\n * Create LLM client based on provider.\n */\nfunction createLLMClient(\n provider: LLMProvider,\n model?: string,\n verbose?: boolean,\n) {\n const temperature = 0; // Deterministic for schema generation\n\n switch (provider) {\n case 'deepseek':\n if (verbose)\n console.log(`[SkillAgent] Using DeepSeek: ${model || DEEPSEEK_MODELS.CHAT}`);\n return createDeepSeekClient({\n model: model || DEEPSEEK_MODELS.CHAT,\n temperature,\n });\n\n case 'openai':\n if (verbose)\n console.log(`[SkillAgent] Using OpenAI: ${model || OPENAI_MODELS.GPT4O}`);\n return createOpenAIClient({\n model: model || OPENAI_MODELS.GPT4O,\n temperature,\n });\n\n case 'anthropic':\n default:\n if (verbose)\n console.log(`[SkillAgent] Using Anthropic: ${model || ANTHROPIC_MODELS.CLAUDE_SONNET_4_5}`);\n return createAnthropicClient({\n model: model || ANTHROPIC_MODELS.CLAUDE_SONNET_4_5,\n temperature,\n });\n }\n}\n\n// ============================================================================\n// Default Session Manager (singleton for backward compatibility)\n// ============================================================================\n\nlet defaultSessionManager: SessionManager | null = null;\n\nfunction getDefaultSessionManager(): SessionManager {\n if (!defaultSessionManager) {\n defaultSessionManager = new SessionManager();\n }\n return defaultSessionManager;\n}\n\n// ============================================================================\n// Skill Agent Factory\n// ============================================================================\n\n/**\n * Create a skill-based DeepAgent.\n *\n * Uses the specified skill's content as the system prompt.\n * When multiple skills are provided, the agent sees all skill descriptions\n * and can choose the appropriate one based on the user's request.\n *\n * @throws Error if any skill is not found\n */\nexport async function createSkillAgent(\n options: SkillAgentOptions,\n): Promise<SkillAgentResult> {\n const {\n skill: skillInput,\n workDir,\n threadId: providedThreadId,\n provider = 'anthropic',\n model,\n verbose = false,\n skillLoader,\n skillRefLoader,\n } = options;\n\n const sessions = options.sessionManager ?? getDefaultSessionManager();\n\n // 1. Normalize skill input to array\n const skillNames = Array.isArray(skillInput) ? skillInput : [skillInput];\n\n // 2. Load all skills (throws if any not found)\n const skills: Skill[] = [];\n for (const skillName of skillNames) {\n const skill = skillLoader(skillName);\n if (!skill) {\n throw new Error(\n `Skill not found: '${skillName}'. ` +\n `Run 'npm run skills:install ${skillName}' to install it, ` +\n `or 'npm run skills:list' to see available skills.`,\n );\n }\n skills.push(skill);\n\n if (verbose) {\n console.log(`[SkillAgent] Loading skill: ${skillName}`);\n console.log(`[SkillAgent] Description: ${skill.description}`);\n if (skill.allowedTools?.length) {\n console.log(`[SkillAgent] Allowed tools: ${skill.allowedTools.join(', ')}`);\n }\n }\n }\n\n // Primary skill is the first one (for backward compatibility)\n const primarySkill = skills[0];\n\n // 3. Load references for all skills\n const allReferences: string[] = [];\n if (skillRefLoader) {\n for (const skill of skills) {\n const refs = skill.references\n .map((ref) => {\n const content = skillRefLoader(skill.name, ref);\n if (content && verbose) {\n console.log(`[SkillAgent] Loaded reference: ${skill.name}/${ref}`);\n }\n return content;\n })\n .filter((ref): ref is string => ref !== null);\n allReferences.push(...refs);\n }\n }\n const references = allReferences.join('\\n\\n---\\n\\n');\n\n // 4. Assemble system prompt from skill(s)\n let skillInstructions: string;\n\n if (skills.length === 1) {\n skillInstructions = skills[0].content;\n } else {\n const skillSummaries = skills\n .map((s) => `- **${s.name}**: ${s.description}`)\n .join('\\n');\n\n const skillContents = skills\n .map((s) => `### Skill: ${s.name}\\n\\n${s.content}`)\n .join('\\n\\n---\\n\\n');\n\n skillInstructions = `## Available Skills\n\nYou have access to multiple skills. Choose the most appropriate one based on the user's request:\n\n${skillSummaries}\n\n**Selection Guidelines:**\n- Read the user's request carefully\n- Match the request to the skill that best fits (based on the descriptions above)\n- Follow that skill's instructions completely\n\n---\n\n${skillContents}`;\n }\n\n // 4.5 Load user memory and project context (GAP-001)\n let userPreferences: UserPreference | null = null;\n let projectContext: ProjectContext | null = null;\n \n if (options.memoryManager && options.userId) {\n try {\n userPreferences = await options.memoryManager.getUserPreferences(options.userId);\n \n if (userPreferences && verbose) {\n console.log(`[SkillAgent] Loaded user preferences: ${userPreferences.namingConvention} naming, ${userPreferences.preferredPatterns.length} patterns`);\n }\n \n if (options.appId) {\n projectContext = await options.memoryManager.getProjectContext(options.appId);\n \n if (projectContext && verbose) {\n console.log(`[SkillAgent] Loaded project context: ${projectContext.existingEntities.length} entities`);\n }\n }\n } catch (error) {\n console.warn('[SkillAgent] Failed to load memory:', error);\n }\n }\n \n // Build memory context section\n const memoryContext = buildMemoryContext(userPreferences, projectContext);\n\n const systemPrompt = [\n BASE_SYSTEM_PROMPT,\n '\\n## Skill Instructions\\n\\n' + skillInstructions,\n references ? '\\n## Reference Documentation\\n\\n' + references : '',\n memoryContext ? '\\n## User Context\\n\\n' + memoryContext : '',\n ]\n .filter(Boolean)\n .join('\\n');\n\n // 5. Generate or use provided thread ID\n const threadId = providedThreadId || uuid();\n\n // 6. Create LLM client\n const llmClient = createLLMClient(provider, model, verbose);\n\n // 7. Create filesystem backend with sandbox mode\n const backend = new FilesystemBackend({\n rootDir: workDir,\n virtualMode: true,\n });\n\n // 8. Create base tools\n const executeTool = createExecuteTool(workDir);\n const finishTaskTool = createFinishTaskTool(workDir);\n const validateSchemaTool = createValidateSchemaTool(workDir);\n\n // 9. Create optional orbital-specific tools\n const ORBITAL_SKILLS = ['kflow-orbitals', 'kflow-orbital-games', 'kflow-orbital-fixing'];\n const LEAN_SKILLS = ['kflow-lean-orbitals', 'kflow-lean-fixing'];\n const DESIGN_SKILLS = ['kflow-design', 'kflow-lean-design'];\n const isOrbitalSkill = primarySkill.name === 'kflow-orbitals';\n const isLeanSkill = LEAN_SKILLS.includes(primarySkill.name);\n const isDesignSkill = DESIGN_SKILLS.includes(primarySkill.name);\n const needsChunkingTools = ORBITAL_SKILLS.includes(primarySkill.name) || isDesignSkill;\n\n let orbitalTool: ReturnType<typeof createOrbitalSubagentTool>['tool'] | undefined;\n let setOrbitalEventCallback: ReturnType<typeof createOrbitalSubagentTool>['setEventCallback'] | undefined;\n let setOrbitalCompleteCallback: ReturnType<typeof createOrbitalSubagentTool>['setOrbitalCompleteCallback'] | undefined;\n\n let domainOrbitalTools: ReturnType<typeof createDomainOrbitalTools> | undefined;\n\n const chunkingTools = needsChunkingTools ? createSchemaChunkingTools(workDir) : null;\n\n if (isOrbitalSkill) {\n const orbitalResult = createOrbitalSubagentTool({\n requirements: options.requirements,\n });\n orbitalTool = orbitalResult.tool;\n setOrbitalEventCallback = orbitalResult.setEventCallback;\n setOrbitalCompleteCallback = orbitalResult.setOrbitalCompleteCallback;\n\n if (options.onSubagentEvent) {\n setOrbitalEventCallback(options.onSubagentEvent);\n }\n\n if (verbose) {\n console.log(`[SkillAgent] Orbital tools enabled for kflow-orbitals skill`);\n }\n }\n\n if (isLeanSkill) {\n domainOrbitalTools = createDomainOrbitalTools({ workDir });\n if (verbose) {\n console.log(`[SkillAgent] Domain orbital tools enabled for ${primarySkill.name} skill`);\n }\n }\n\n // Create design transition tool for design skills and all orbital skills\n const needsDesignTool = isDesignSkill || ORBITAL_SKILLS.includes(primarySkill.name);\n const designTool = needsDesignTool ? createDesignTransitionTool() : null;\n\n if (designTool && verbose) {\n console.log(`[SkillAgent] Design transition tool enabled for ${primarySkill.name} skill`);\n }\n\n // Create GitHub tools if configuration is provided\n const githubTools = options.githubConfig\n ? createGitHubToolsArray({\n token: options.githubConfig.token,\n owner: options.githubConfig.owner,\n repo: options.githubConfig.repo,\n workDir,\n })\n : null;\n\n if (githubTools && verbose) {\n console.log(`[SkillAgent] GitHub tools enabled`);\n }\n\n // 10. Build tools array based on skill type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tools: any[] = [\n executeTool,\n finishTaskTool,\n ...(isOrbitalSkill ? [] : [validateSchemaTool]),\n ...(orbitalTool ? [orbitalTool] : []),\n ...(domainOrbitalTools\n ? [\n domainOrbitalTools.generateOrbitalDomain,\n domainOrbitalTools.constructCombinedDomain,\n ]\n : []),\n ...(chunkingTools\n ? [\n chunkingTools.querySchemaStructure,\n chunkingTools.extractChunk,\n chunkingTools.applyChunk,\n ]\n : []),\n ...(designTool ? [designTool.tool] : []),\n ...(githubTools || []),\n ];\n\n // 11. Get or create checkpointer\n const checkpointer = sessions.getCheckpointer(threadId);\n\n // 12. Get interrupt configuration\n const interruptConfig = options.noInterrupt\n ? undefined\n : getInterruptConfig(primarySkill as SkillMeta);\n\n // 13. Create agent with deepagents primitives\n const agent = createDeepAgent({\n model: llmClient.getModel(),\n systemPrompt,\n backend,\n tools,\n checkpointer,\n ...(interruptConfig && { interruptOn: interruptConfig }),\n });\n\n // 14. Store session metadata\n sessions.store(threadId, {\n skill: primarySkill.name,\n workDir,\n createdAt: Date.now(),\n lastActivityAt: Date.now(),\n });\n\n if (verbose) {\n const skillNamesStr = skillNames.join(', ');\n console.log(`[SkillAgent] Created agent with skill(s): ${skillNamesStr}, threadId: ${threadId}`);\n }\n\n const setDomainCompleteCallback = domainOrbitalTools?.setCompleteCallback;\n\n return {\n agent,\n threadId,\n skill: primarySkill,\n skills,\n workDir,\n setOrbitalEventCallback,\n setOrbitalCompleteCallback,\n setDomainCompleteCallback,\n userPreferences,\n projectContext,\n memoryManager: options.memoryManager,\n };\n}\n\n// ============================================================================\n// Memory Context Helper (GAP-001)\n// ============================================================================\n\n/**\n * Build memory context string for system prompt\n */\nfunction buildMemoryContext(\n userPreferences: UserPreference | null,\n projectContext: ProjectContext | null,\n): string | null {\n const sections: string[] = [];\n\n if (userPreferences) {\n const prefs: string[] = [];\n \n if (userPreferences.namingConvention) {\n prefs.push(`- Preferred naming: ${userPreferences.namingConvention}`);\n }\n if (userPreferences.validationStyle) {\n prefs.push(`- Validation style: ${userPreferences.validationStyle}`);\n }\n if (userPreferences.preferredPatterns.length > 0) {\n prefs.push(`- Preferred patterns: ${userPreferences.preferredPatterns.join(', ')}`);\n }\n if (userPreferences.commonEntities.length > 0) {\n prefs.push(`- Commonly used entities: ${userPreferences.commonEntities.join(', ')}`);\n }\n \n if (prefs.length > 0) {\n sections.push(`### User Preferences\\n${prefs.join('\\n')}`);\n }\n }\n\n if (projectContext) {\n const ctx: string[] = [];\n \n if (projectContext.projectName) {\n ctx.push(`- Project: ${projectContext.projectName}`);\n }\n if (projectContext.domain) {\n ctx.push(`- Domain: ${projectContext.domain}`);\n }\n if (projectContext.existingEntities.length > 0) {\n ctx.push(`- Existing entities: ${projectContext.existingEntities.join(', ')}`);\n }\n if (projectContext.conventions.length > 0) {\n ctx.push(`- Project conventions: ${projectContext.conventions.join(', ')}`);\n }\n \n if (ctx.length > 0) {\n sections.push(`### Project Context\\n${ctx.join('\\n')}`);\n }\n }\n\n return sections.length > 0 ? sections.join('\\n\\n') : null;\n}\n\n/**\n * Resume a skill agent session.\n *\n * Loads the skill from session metadata and creates agent with same threadId.\n *\n * @throws Error if session not found\n */\nexport async function resumeSkillAgent(\n threadId: string,\n options: {\n verbose?: boolean;\n noInterrupt?: boolean;\n skillLoader: SkillLoader;\n skillRefLoader?: SkillRefLoader;\n sessionManager?: SessionManager;\n },\n): Promise<SkillAgentResult> {\n const sessions = options.sessionManager ?? getDefaultSessionManager();\n const metadata = sessions.get(threadId);\n if (!metadata) {\n throw new Error(\n `Session not found: '${threadId}'. ` +\n `The session may have expired or been cleared.`,\n );\n }\n\n // Update last activity\n metadata.lastActivityAt = Date.now();\n sessions.store(threadId, metadata);\n\n return createSkillAgent({\n skill: metadata.skill,\n workDir: metadata.workDir,\n threadId,\n verbose: options.verbose,\n noInterrupt: options.noInterrupt,\n skillLoader: options.skillLoader,\n skillRefLoader: options.skillRefLoader,\n sessionManager: sessions,\n });\n}\n","/**\n * Event Budget Configuration\n *\n * Prevents runaway agent loops with soft/hard event limits per skill.\n */\n\n// ============================================================================\n// Event Budget Configuration\n// ============================================================================\n\n/**\n * Event budget limits for different skills.\n * - soft: Warning threshold (agent reminded to finish up)\n * - hard: Maximum events before forced completion\n */\nexport const EVENT_BUDGETS: Record<string, { soft: number; hard: number }> = {\n // Generation skills - complex tasks\n 'kflow-generating-m': { soft: 40, hard: 60 },\n 'kflow-domain-generating': { soft: 40, hard: 60 },\n 'kflow-game-designer': { soft: 50, hard: 80 },\n\n // Editing skills - medium complexity\n 'kflow-editing-m': { soft: 30, hard: 50 },\n 'kflow-domain-editing': { soft: 30, hard: 50 },\n\n // Fixing skills - should be fast\n 'kflow-domain-fixing': { soft: 25, hard: 40 },\n 'kflow-validating': { soft: 15, hard: 25 },\n\n // Default for unknown skills\n default: { soft: 50, hard: 80 },\n};\n\n/**\n * Get event budget for a skill.\n */\nexport function getEventBudget(skillName: string): { soft: number; hard: number } {\n return EVENT_BUDGETS[skillName] || EVENT_BUDGETS['default'];\n}\n\n/**\n * Generate a budget warning message to inject into the agent.\n */\nexport function getBudgetWarningMessage(\n eventCount: number,\n budget: { soft: number; hard: number },\n): string | null {\n if (eventCount >= budget.hard) {\n return `⚠️ CRITICAL: You have reached your event budget (${budget.hard} events). You MUST complete now. Mark remaining todos complete and stop immediately.`;\n }\n if (eventCount >= budget.soft) {\n return `📊 Note: You are at ${eventCount}/${budget.hard} events. Please finish your current task efficiently. Avoid re-reading files or redundant validation.`;\n }\n return null;\n}\n"]}
1
+ {"version":3,"sources":["../../src/orbitals/cache/orbital-fingerprint.ts","../../src/orbitals/cache/structural-templates.ts","../../src/orbitals/cache/prompt-assembler.ts","../../src/orbitals/cache/index.ts","../../src/tools/execute.ts","../../src/tools/validate-schema.ts","../../src/tools/generate-schema.ts","../../src/orbitals/combiner/index.ts","../../src/orbitals/domain-language/index.ts","../../src/orbitals/domain-language/prompts/odl-syntax.ts","../../src/orbitals/domain-language/prompts/odl-examples.ts","../../src/orbitals/domain-language/prompts/odl-patterns.ts","../../src/orbitals/domain-language/prompts/odl-to-schema.ts","../../src/tools/finish-task.ts","../../src/tools/domain-orbital.ts","../../src/orbitals/generation/orbital-generator.ts","../../src/tools/orbital-subagent.ts","../../src/tools/trait-subagent.ts","../../src/tools/combine-schemas.ts","../../src/tools/schema-chunking.ts","../../src/tools/design-transition.ts","../../src/tools/github.ts","../../src/persistence/memory-backend.ts","../../src/persistence/firestore-checkpointer.ts","../../src/persistence/firestore-session-store.ts","../../src/agent/session-manager.ts","../../src/agent/interrupt-config.ts","../../src/agent/skill-agent.ts","../../src/agent/event-budget.ts"],"names":["isEntityReference","getInlineEntity","getTraitName","resolve","path2","tool","fs","z","execAsync","promisify","exec","path3","fs2","path4","getEntityName","AgentDomainCategorySchema","LLMClient","path5","fss","isOrbitalDefinition","CACHE_TTL_MS","CACHE_VERSION","generateFingerprint","crypto","getCached","uuid"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Orbital Fingerprinting for Caching\n *\n * Computes structural fingerprints for Orbital Units to enable\n * prompt caching based on similar structures.\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalUnit, OrbitalEntity, EntityField, OrbitalDefinition, EntityRef } from '@almadar/core/types';\nimport { isOrbitalDefinition, getTraitName, isEntityReference } from '@almadar/core/types';\n\n/**\n * Get entity from EntityRef for signature computation.\n * Returns null if entity is a reference string.\n */\nfunction getInlineEntity(entity: EntityRef): OrbitalEntity | null {\n if (isEntityReference(entity)) {\n return null;\n }\n return entity;\n}\n\n// ============================================================================\n// Fingerprint Computation\n// ============================================================================\n\n/**\n * Compute a structural fingerprint for an Orbital Unit.\n * Units with the same fingerprint can share cached prompts.\n * Only works with full orbital definitions (not references).\n */\nexport function computeOrbitalFingerprint(orbital: OrbitalUnit): string {\n // Note: Orbital is now always OrbitalDefinition (no more OrbitalReference type)\n // The isOrbitalDefinition check is kept for backwards compatibility but always true\n\n // Get inline entity or use fallback for references\n const inlineEntity = getInlineEntity(orbital.entity);\n\n // 1. Entity structure signature\n const entitySig = inlineEntity ? computeEntitySignature(inlineEntity) : 'ref';\n\n // 2. Trait categories (sorted)\n const traitSig = orbital.traits\n .map(getTraitName)\n .sort()\n .join(',');\n\n // 3. Persistence type\n const persistSig = inlineEntity?.persistence || 'persistent';\n\n return `${persistSig}:e[${entitySig}]_t[${traitSig}]`;\n}\n\n/**\n * Compute entity structure signature based on field types.\n */\nexport function computeEntitySignature(entity: OrbitalEntity): string {\n const typeCounts: Record<string, number> = {};\n\n for (const field of entity.fields) {\n const baseType = getFieldTypeKey(field);\n typeCounts[baseType] = (typeCounts[baseType] || 0) + 1;\n }\n\n return Object.entries(typeCounts)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([type, count]) => `${type}:${count}`)\n .join('-');\n}\n\n/**\n * Get field type key for fingerprinting.\n */\nfunction getFieldTypeKey(field: EntityField): string {\n if (field.type === 'relation') {\n const cardinality = field.relation?.cardinality || 'one';\n return `rel:${cardinality}`;\n }\n if (field.type === 'enum') {\n return 'enum';\n }\n return field.type;\n}\n\n// ============================================================================\n// Fingerprint Matching\n// ============================================================================\n\n/**\n * Check if two fingerprints are structurally similar.\n * Similar fingerprints can share template guidance.\n */\nexport function fingerprintsMatch(fp1: string, fp2: string): boolean {\n return fp1 === fp2;\n}\n\n/**\n * Extract fingerprint components.\n */\nexport function parseFingerprint(fingerprint: string): {\n persistence: string;\n entity: string;\n traits: string[];\n patterns: string[];\n} {\n const match = fingerprint.match(/^(\\w+):e\\[([^\\]]*)\\]_t\\[([^\\]]*)\\]_p\\[([^\\]]*)\\]$/);\n if (!match) {\n return { persistence: 'unknown', entity: '', traits: [], patterns: [] };\n }\n\n return {\n persistence: match[1],\n entity: match[2],\n traits: match[3] ? match[3].split(',') : [],\n patterns: match[4] ? match[4].split(',') : [],\n };\n}\n\n/**\n * Compute similarity score between two fingerprints (0-1).\n */\nexport function fingerprintSimilarity(fp1: string, fp2: string): number {\n if (fp1 === fp2) return 1.0;\n\n const p1 = parseFingerprint(fp1);\n const p2 = parseFingerprint(fp2);\n\n let score = 0;\n let total = 4;\n\n // Persistence match\n if (p1.persistence === p2.persistence) score += 1;\n\n // Entity structure match\n if (p1.entity === p2.entity) score += 1;\n\n // Trait overlap\n const traitOverlap = p1.traits.filter((t) => p2.traits.includes(t)).length;\n const traitUnion = new Set([...p1.traits, ...p2.traits]).size;\n if (traitUnion > 0) {\n score += traitOverlap / traitUnion;\n } else {\n score += 1;\n }\n\n // Pattern overlap\n const patternOverlap = p1.patterns.filter((p) => p2.patterns.includes(p)).length;\n const patternUnion = new Set([...p1.patterns, ...p2.patterns]).size;\n if (patternUnion > 0) {\n score += patternOverlap / patternUnion;\n } else {\n score += 1;\n }\n\n return score / total;\n}\n","/**\n * Structural Templates for Cached Generation\n *\n * Pre-defined templates for common structural patterns.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Template Types\n// ============================================================================\n\nexport interface StructuralTemplate {\n /** Fingerprint pattern this template matches */\n fingerprintPattern: string;\n /** Human-readable name */\n name: string;\n /** Template guidance for generation */\n guidance: string;\n /** Example sections */\n exampleSections: string[];\n}\n\n// ============================================================================\n// Common Templates\n// ============================================================================\n\n/**\n * Templates for common structural patterns.\n */\nexport const STRUCTURAL_TEMPLATES: StructuralTemplate[] = [\n {\n fingerprintPattern: 'persistent:e[*]_t[FormSubmission*]_p[*form*]',\n name: 'CRUD Form Entity',\n guidance: `\nThis is a standard CRUD entity with form submission.\nGenerate pages for:\n- List view with search/filter\n- Create form with validation\n- Edit form with existing data\n- Detail view with actions\n`,\n exampleSections: ['page-header', 'search-filters', 'entity-list', 'form-section', 'form-actions'],\n },\n {\n fingerprintPattern: 'persistent:e[*]_t[*Workflow*]_p[*]',\n name: 'Workflow Entity',\n guidance: `\nThis entity has workflow/state machine behavior.\nInclude:\n- Status indicators in list view\n- Transition actions in detail view\n- Workflow history display\n`,\n exampleSections: ['page-header', 'entity-table', 'entity-detail', 'form-actions'],\n },\n {\n fingerprintPattern: 'runtime:e[*]_t[*]_p[dashboard*]',\n name: 'Dashboard View',\n guidance: `\nThis is a runtime dashboard entity.\nFocus on:\n- Statistics and metrics display\n- Charts and visualizations\n- Recent activity lists\n`,\n exampleSections: ['page-header', 'dashboard-stats', 'chart', 'entity-cards'],\n },\n {\n fingerprintPattern: '*:e[*]_t[Platformer*]_p[game*]',\n name: 'Game Entity',\n guidance: `\nThis is a game entity with platformer mechanics.\nInclude:\n- Game canvas for rendering\n- HUD for score/health display\n- Controls panel for input\n`,\n exampleSections: ['game-canvas', 'game-hud', 'game-controls'],\n },\n];\n\n// ============================================================================\n// Template Matching\n// ============================================================================\n\n/**\n * Find matching templates for a fingerprint.\n */\nexport function findMatchingTemplates(fingerprint: string): StructuralTemplate[] {\n return STRUCTURAL_TEMPLATES.filter((template) =>\n matchesPattern(fingerprint, template.fingerprintPattern)\n );\n}\n\n/**\n * Get the best matching template for a fingerprint.\n */\nexport function getBestTemplate(fingerprint: string): StructuralTemplate | null {\n const matches = findMatchingTemplates(fingerprint);\n return matches.length > 0 ? matches[0] : null;\n}\n\n/**\n * Check if fingerprint matches a pattern.\n * Patterns support * as wildcard.\n */\nfunction matchesPattern(fingerprint: string, pattern: string): boolean {\n // Convert pattern to regex\n const regexStr = pattern\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&') // Escape special chars\n .replace(/\\*/g, '.*'); // Replace * with .*\n\n const regex = new RegExp(`^${regexStr}$`);\n return regex.test(fingerprint);\n}\n\n/**\n * Get guidance for a fingerprint.\n */\nexport function getTemplateGuidance(fingerprint: string): string {\n const template = getBestTemplate(fingerprint);\n if (template) {\n return template.guidance;\n }\n\n return `\nNo specific template matched. Use standard patterns:\n- page-header for page titles\n- entity-list or entity-table for list views\n- form-section for input forms\n- entity-detail for detail views\n`;\n}\n","/**\n * Prompt Assembler for Cache-Aware Prompt Construction\n *\n * Assembles prompts with cache markers for efficient LLM caching.\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalUnit, OrbitalDefinition, EntityRef, Entity } from '@almadar/core/types';\nimport { isOrbitalDefinition, getTraitName, isEntityReference } from '@almadar/core/types';\n\n/**\n * Get entity name safely from EntityRef\n */\nfunction getEntityName(entity: EntityRef): string {\n if (isEntityReference(entity)) {\n return entity.replace('.entity', '');\n }\n return entity.name;\n}\n\n/**\n * Get inline entity for detailed access, or null for references\n */\nfunction getInlineEntity(entity: EntityRef): Entity | null {\n if (isEntityReference(entity)) {\n return null;\n }\n return entity;\n}\nimport { computeOrbitalFingerprint } from './orbital-fingerprint.js';\nimport { getTemplateGuidance, getBestTemplate } from './structural-templates.js';\nimport type { CacheableBlock } from '@almadar/llm';\n\n// ============================================================================\n// Cache Markers\n// ============================================================================\n\n/** Anthropic cache control marker (deprecated - use CacheableBlock instead) */\nconst CACHE_BREAK = '<!-- cache_break -->';\n\n// ============================================================================\n// Context Helpers\n// ============================================================================\n\n/**\n * Build context section from orbital's domainContext and design fields.\n * Passes through existing context to the subagent.\n */\nfunction buildContextSection(orbital: OrbitalDefinition): string {\n const parts: string[] = [];\n\n if (orbital.domainContext) {\n const ctx = orbital.domainContext;\n parts.push(`DomainContext: category=${ctx.category || 'business'}`);\n if (ctx.vocabulary) {\n parts.push(`Vocabulary: ${JSON.stringify(ctx.vocabulary)}`);\n }\n if (ctx.requestFragment) {\n parts.push(`RequestFragment: \"${ctx.requestFragment}\"`);\n }\n }\n\n if (orbital.design) {\n const d = orbital.design;\n if (d.style) parts.push(`Style: ${d.style}`);\n if (d.uxHints) {\n const hints = d.uxHints;\n if (hints.flowPattern) parts.push(`FlowPattern: ${hints.flowPattern}`);\n if (hints.listPattern) parts.push(`ListPattern: ${hints.listPattern}`);\n if (hints.formPattern) parts.push(`FormPattern: ${hints.formPattern}`);\n }\n }\n\n return parts.length > 0 ? `Context: ${parts.join(', ')}\\n` : '';\n}\n\n// ============================================================================\n// Prompt Assembly\n// ============================================================================\n\nexport interface AssembledPrompt {\n /** The full prompt text */\n prompt: string;\n /** Fingerprint for this orbital */\n fingerprint: string;\n /** Whether a cached template was used */\n usedCachedTemplate: boolean;\n /** Template name if used */\n templateName?: string;\n}\n\n/**\n * Cache-aware assembled prompt with separate blocks.\n */\nexport interface CacheableAssembledPrompt {\n /** System blocks (cacheable) */\n systemBlocks: CacheableBlock[];\n /** User blocks (usually not cacheable) */\n userBlocks: CacheableBlock[];\n /** Fingerprint for this orbital */\n fingerprint: string;\n /** Whether a cached template was used */\n usedCachedTemplate: boolean;\n /** Template name if used */\n templateName?: string;\n}\n\n/**\n * Assemble a prompt for orbital unit generation.\n * Organizes content to maximize cache hits.\n * Only works with full orbital definitions (not references).\n */\nexport function assembleOrbitalPrompt(\n orbital: OrbitalUnit,\n baseSystemPrompt: string\n): AssembledPrompt {\n const fingerprint = computeOrbitalFingerprint(orbital);\n const template = getBestTemplate(fingerprint);\n const guidance = getTemplateGuidance(fingerprint);\n\n // Note: Orbital is now always OrbitalDefinition (no more OrbitalReference type)\n // This check is kept for backwards compatibility but always passes\n\n // Structure prompt for optimal caching:\n // 1. Static system prompt (cacheable across all calls)\n // 2. Template guidance (cacheable for similar structures)\n // 3. Specific orbital details (unique per call)\n\n const contextSection = buildContextSection(orbital);\n\n // Get entity details safely\n const entityName = getEntityName(orbital.entity);\n const inlineEntity = getInlineEntity(orbital.entity);\n const persistence = inlineEntity?.persistence || 'persistent';\n const fieldNames = inlineEntity?.fields.map((f: { name: string }) => f.name).join(', ') || 'N/A';\n\n const prompt = `${baseSystemPrompt}\n\n${CACHE_BREAK}\n\n## Structural Template\n${guidance}\n\n${CACHE_BREAK}\n\n## Current Orbital Unit\nName: ${orbital.name}\nEntity: ${entityName}\nPersistence: ${persistence}\nFields: ${fieldNames}\nTraits: ${orbital.traits.map(getTraitName).join(', ')}\n${contextSection}\nGenerate a complete FullOrbitalUnit with:\n- Full field definitions with types and validation\n- Trait state machines with transitions and effects\n- Business rule validation using \"guard\" (singular, NOT \"guards\") S-expression on SAVE transitions\n- Pages with trait references\n- domainContext with category, vocabulary, and requestFragment\n- design with style and uxHints (flowPattern, listPattern, formPattern)\n`;\n\n return {\n prompt,\n fingerprint,\n usedCachedTemplate: template !== null,\n templateName: template?.name,\n };\n}\n\n/**\n * Assemble cacheable blocks for Anthropic prompt caching.\n *\n * Structure:\n * - System block 1: Base system prompt (highly cacheable, rarely changes)\n * - System block 2: Template guidance (cacheable per fingerprint)\n * - User block: Specific orbital details (not cached)\n *\n * Only works with full orbital definitions (not references).\n */\nexport function assembleCacheableOrbitalPrompt(\n orbital: OrbitalUnit,\n baseSystemPrompt: string\n): CacheableAssembledPrompt {\n const fingerprint = computeOrbitalFingerprint(orbital);\n const template = getBestTemplate(fingerprint);\n const guidance = getTemplateGuidance(fingerprint);\n\n // Note: Orbital is now always OrbitalDefinition (no more OrbitalReference type)\n // This check is kept for backwards compatibility but always passes\n\n // System blocks - mark as cacheable\n const systemBlocks: CacheableBlock[] = [\n // Block 1: Base system prompt (very stable, max cache benefit)\n {\n type: 'text',\n text: baseSystemPrompt,\n cache_control: { type: 'ephemeral' },\n },\n // Block 2: Template guidance (stable per fingerprint)\n {\n type: 'text',\n text: `\\n## Structural Template\\n${guidance}`,\n cache_control: { type: 'ephemeral' },\n },\n ];\n\n // Build context section if available\n const contextSection = buildContextSection(orbital);\n\n // Build cross-orbital connectivity section\n const emitsSection = orbital.emits?.length ? `Emits: ${orbital.emits.join(', ')}` : '';\n const listensSection = orbital.listens?.length\n ? `Listens: ${orbital.listens.map((l) => `${l.event}→${l.triggers}`).join(', ')}`\n : '';\n const connectivitySection = [emitsSection, listensSection].filter(Boolean).join('\\n');\n\n // Get entity details safely\n const entityName = getEntityName(orbital.entity);\n const inlineEntity = getInlineEntity(orbital.entity);\n const persistence = inlineEntity?.persistence || 'persistent';\n const fieldNames = inlineEntity?.fields.map((f: { name: string }) => f.name).join(', ') || 'N/A';\n\n // User block - unique per request (not cached)\n const userBlocks: CacheableBlock[] = [\n {\n type: 'text',\n text: `## Current Orbital Unit\nName: ${orbital.name}\nEntity: ${entityName}\nPersistence: ${persistence}\nFields: ${fieldNames}\nTraits: ${orbital.traits.map(getTraitName).join(', ')}\n${contextSection}${connectivitySection ? `\\n${connectivitySection}` : ''}\nGenerate a complete FullOrbitalUnit with:\n- Full field definitions with types and validation\n- Trait state machines with transitions and effects\n- Business rule validation using \"guard\" (singular, NOT \"guards\") S-expression on SAVE transitions\n- Pages with trait references\n- domainContext with category, vocabulary, and requestFragment\n- design with style and uxHints (flowPattern, listPattern, formPattern)\n- PRESERVE emits and listens from input if provided`,\n },\n ];\n\n return {\n systemBlocks,\n userBlocks,\n fingerprint,\n usedCachedTemplate: template !== null,\n templateName: template?.name,\n };\n}\n\n/**\n * Assemble prompts for multiple orbitals.\n * Groups by fingerprint for batch efficiency.\n */\nexport function assembleMultiOrbitalPrompts(\n orbitals: OrbitalUnit[],\n baseSystemPrompt: string\n): Map<string, AssembledPrompt[]> {\n const grouped = new Map<string, AssembledPrompt[]>();\n\n for (const orbital of orbitals) {\n const assembled = assembleOrbitalPrompt(orbital, baseSystemPrompt);\n const existing = grouped.get(assembled.fingerprint) || [];\n existing.push(assembled);\n grouped.set(assembled.fingerprint, existing);\n }\n\n return grouped;\n}\n\n/**\n * Get cache statistics for a set of orbitals.\n */\nexport function getCacheStats(orbitals: OrbitalUnit[]): {\n totalOrbitals: number;\n uniqueFingerprints: number;\n potentialCacheHits: number;\n templateMatches: number;\n} {\n const fingerprints = orbitals.map(computeOrbitalFingerprint);\n const unique = new Set(fingerprints);\n\n let templateMatches = 0;\n for (const orbital of orbitals) {\n const fp = computeOrbitalFingerprint(orbital);\n if (getBestTemplate(fp)) {\n templateMatches++;\n }\n }\n\n return {\n totalOrbitals: orbitals.length,\n uniqueFingerprints: unique.size,\n potentialCacheHits: orbitals.length - unique.size,\n templateMatches,\n };\n}\n\n","/**\n * Orbital Cache Module\n *\n * Exports fingerprinting, templates, and prompt assembly utilities\n * for efficient LLM prompt caching.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Fingerprinting\n// ============================================================================\n\nexport {\n computeOrbitalFingerprint,\n computeEntitySignature,\n fingerprintsMatch,\n parseFingerprint,\n fingerprintSimilarity,\n} from './orbital-fingerprint.js';\n\n// ============================================================================\n// Structural Templates\n// ============================================================================\n\nexport {\n type StructuralTemplate,\n STRUCTURAL_TEMPLATES,\n findMatchingTemplates,\n getBestTemplate,\n getTemplateGuidance,\n} from './structural-templates.js';\n\n// ============================================================================\n// Prompt Assembly\n// ============================================================================\n\nexport {\n type AssembledPrompt,\n type CacheableAssembledPrompt,\n assembleOrbitalPrompt,\n assembleCacheableOrbitalPrompt,\n assembleMultiOrbitalPrompts,\n getCacheStats,\n} from './prompt-assembler.js';\n","/**\n * Execute Tool\n *\n * Sandboxed shell command execution within a workspace directory.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { spawn } from 'child_process';\nimport * as path from 'path';\n\n/**\n * Dangerous commands that should be blocked when targeting outside workspace.\n */\nconst DANGEROUS_COMMANDS = [\n 'rm', 'rmdir', 'mv', 'cp', 'ln', 'chmod', 'chown', 'touch', 'mkdir',\n];\n\n/**\n * Commands that should be blocked entirely for security.\n */\nconst BLOCKED_COMMANDS = [\n 'curl', 'wget', 'nc', 'netcat', 'ssh', 'scp', 'rsync', 'ftp', 'sftp',\n 'sudo', 'su', 'doas', 'pkexec', 'eval', 'exec', 'source',\n 'crontab', 'at', 'systemctl', 'service',\n 'dd', 'mkfs', 'fdisk', 'mount', 'umount',\n 'iptables', 'firewall-cmd',\n 'useradd', 'userdel', 'usermod', 'groupadd', 'passwd',\n];\n\n/**\n * Check if a command contains paths outside the workspace.\n * Returns an error message if unsafe, null if safe.\n */\nexport function validateCommandPaths(command: string, workDir: string): string | null {\n const normalizedWorkDir = path.resolve(workDir);\n\n const firstWord = command.trim().split(/[\\s;|&]/)[0];\n if (BLOCKED_COMMANDS.includes(firstWord)) {\n return `Command blocked: \"${firstWord}\" is not allowed for security reasons.`;\n }\n\n // Block shell output/append redirections to absolute paths outside workspace\n const redirectPattern = /(?:>>?|[12&]>>?)\\s*(\\/([\\w.-]+\\/)*[\\w.-]+)/g;\n let redirectMatch;\n while ((redirectMatch = redirectPattern.exec(command)) !== null) {\n const targetPath = redirectMatch[1];\n if (targetPath !== '/dev/null') {\n const resolvedPath = path.resolve(targetPath);\n if (!resolvedPath.startsWith(normalizedWorkDir)) {\n return `Command blocked: output redirection to \"${targetPath}\" is outside workspace.`;\n }\n }\n }\n\n // Block tee command writing outside workspace\n const teePattern = /\\btee\\s+(?:-a\\s+)?(\\/([\\w.-]+\\/)*[\\w.-]+)/g;\n let teeMatch;\n while ((teeMatch = teePattern.exec(command)) !== null) {\n const targetPath = teeMatch[1];\n const resolvedPath = path.resolve(targetPath);\n if (!resolvedPath.startsWith(normalizedWorkDir)) {\n return `Command blocked: tee to \"${targetPath}\" is outside workspace.`;\n }\n }\n\n // Check dangerous commands for path arguments\n for (const cmd of DANGEROUS_COMMANDS) {\n const cmdPattern = new RegExp(`\\\\b${cmd}\\\\s+[^|;&]*`, 'g');\n let cmdMatch;\n while ((cmdMatch = cmdPattern.exec(command)) !== null) {\n const cmdWithArgs = cmdMatch[0];\n const pathsInCmd = cmdWithArgs.match(/\\/([\\w.-]+\\/)*[\\w.-]+/g) || [];\n for (const foundPath of pathsInCmd) {\n if (foundPath === '/dev/null' || foundPath.startsWith('/tmp/')) continue;\n const resolvedPath = path.resolve(foundPath);\n if (!resolvedPath.startsWith(normalizedWorkDir)) {\n return `Command blocked: \"${cmd}\" with path \"${foundPath}\" is outside workspace.`;\n }\n }\n }\n }\n\n // Check absolute paths\n const absolutePathPattern = /(?:^|[\\s'\"=])(\\/([\\w.-]+\\/)+[\\w.-]*)/g;\n let match;\n while ((match = absolutePathPattern.exec(command)) !== null) {\n const foundPath = match[1];\n if (foundPath.startsWith('/dev/') || foundPath.startsWith('/tmp/') || foundPath === '/dev/null') {\n continue;\n }\n const resolvedPath = path.resolve(foundPath);\n if (!resolvedPath.startsWith(normalizedWorkDir)) {\n return `Command blocked: path \"${foundPath}\" is outside workspace.`;\n }\n }\n\n // Block cd to outside workspace\n if (command.includes('cd /') && !command.includes(`cd ${normalizedWorkDir}`)) {\n const cdMatch = command.match(/cd\\s+(\\/[^\\s;|&]+)/);\n if (cdMatch) {\n const cdTarget = path.resolve(cdMatch[1]);\n if (!cdTarget.startsWith(normalizedWorkDir)) {\n return `Command blocked: \"cd ${cdMatch[1]}\" would navigate outside workspace.`;\n }\n }\n }\n\n // Block complex command substitution\n if (command.includes('`') || /\\$\\([^)]+\\)/.test(command)) {\n const simpleSubstitutions = /\\$\\((pwd|echo|date|whoami)\\)/g;\n const strippedCommand = command.replace(simpleSubstitutions, '');\n if (strippedCommand.includes('`') || /\\$\\([^)]+\\)/.test(strippedCommand)) {\n return `Command blocked: complex command substitution detected.`;\n }\n }\n\n return null;\n}\n\n/**\n * Create an execute tool that runs shell commands in the workspace directory.\n */\nexport function createExecuteTool(workDir: string) {\n const normalizedWorkDir = path.resolve(workDir);\n\n return tool(\n async ({ command, timeout = 60000 }) => {\n const validationError = validateCommandPaths(command, workDir);\n if (validationError) {\n return validationError;\n }\n\n return new Promise<string>((resolve) => {\n const parts = command.split(' ');\n const cmd = parts[0];\n const args = parts.slice(1);\n\n const proc = spawn(cmd, args, {\n cwd: workDir,\n shell: true,\n timeout,\n env: {\n PATH: process.env.PATH,\n NODE_PATH: process.env.NODE_PATH,\n NVM_DIR: process.env.NVM_DIR,\n NVM_BIN: process.env.NVM_BIN,\n SHELL: '/bin/sh',\n TERM: 'dumb',\n LANG: process.env.LANG || 'en_US.UTF-8',\n CI: 'true',\n HOME: normalizedWorkDir,\n TMPDIR: path.join(normalizedWorkDir, '.tmp'),\n TEMP: path.join(normalizedWorkDir, '.tmp'),\n TMP: path.join(normalizedWorkDir, '.tmp'),\n HISTFILE: '/dev/null',\n npm_config_cache: path.join(normalizedWorkDir, '.npm-cache'),\n npm_config_prefix: normalizedWorkDir,\n },\n });\n\n let stdout = '';\n let stderr = '';\n\n proc.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n\n proc.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n proc.on('error', (error) => {\n resolve(`Error executing command: ${error.message}`);\n });\n\n proc.on('close', (code) => {\n const output = stdout + (stderr ? `\\n\\nStderr:\\n${stderr}` : '');\n if (code === 0) {\n resolve(output || 'Command completed successfully (no output)');\n } else {\n resolve(`Command exited with code ${code}\\n\\n${output}`);\n }\n });\n\n setTimeout(() => {\n proc.kill('SIGTERM');\n resolve(`Command timed out after ${timeout}ms`);\n }, timeout);\n });\n },\n {\n name: 'execute',\n description: `Execute a shell command in the workspace directory.\n\nIMPORTANT: You are restricted to your workspace directory. Use RELATIVE paths only:\n- ./schema.json (NOT /schema.json or absolute paths)\n- ./app (NOT /app or absolute paths)\n\nExamples:\n- orbital validate ./schema.json --json\n- npx kflow compile ./schema.json -o ./app --verify\n- cd ./app && npm install\n\nCommands using absolute paths outside your workspace will be blocked.`,\n schema: z.object({\n command: z.string().describe('The shell command to execute'),\n timeout: z.number().optional().describe('Timeout in milliseconds (default: 60000)'),\n }),\n },\n );\n}\n","/**\n * Schema Validation Tool\n *\n * Validates orbital schemas using the @almadar/cli npm package.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\n\nconst execAsync = promisify(exec);\n\n/**\n * Maximum number of validation attempts before forcing stop.\n */\nconst MAX_VALIDATION_ATTEMPTS = 5;\n\n/**\n * Create a validate_schema tool that validates schema.json in the workspace.\n *\n * Uses `npx @almadar/cli validate --json` for comprehensive Rust-based validation.\n *\n * Has a built-in cap of MAX_VALIDATION_ATTEMPTS to prevent\n * infinite validation-fix loops.\n */\nexport function createValidateSchemaTool(workDir: string) {\n const schemaPath = path.join(workDir, 'schema.json');\n let validationAttempts = 0;\n\n return tool(\n async () => {\n validationAttempts++;\n\n if (validationAttempts > MAX_VALIDATION_ATTEMPTS) {\n return JSON.stringify({\n success: true,\n valid: false,\n cappedValidation: true,\n message:\n `⚠️ VALIDATION CAP REACHED (${MAX_VALIDATION_ATTEMPTS} attempts). ` +\n `You've tried to fix this schema ${validationAttempts} times. ` +\n `STOP fixing validation errors and proceed with what you have.`,\n recommendation: 'STOP_FIXING',\n });\n }\n\n try {\n try {\n await fs.access(schemaPath);\n } catch {\n return JSON.stringify({\n success: false,\n valid: false,\n validationAttempt: validationAttempts,\n errors: [{\n code: 'FILE_NOT_FOUND',\n path: '',\n message: 'File not found: schema.json. Create it first with write_file.',\n }],\n });\n }\n\n const { stdout, stderr } = await execAsync(\n `npx @almadar/cli validate \"${schemaPath}\" --json`,\n { timeout: 30000 },\n );\n\n let cliResult: {\n success: boolean;\n valid: boolean;\n errors?: Array<{\n code: string;\n path: string;\n message: string;\n suggestion?: string;\n fixGuidance?: string;\n expectedShape?: string;\n validValues?: string[];\n }>;\n warnings?: Array<{\n code: string;\n path: string;\n message: string;\n suggestion?: string;\n }>;\n stats?: {\n orbitals: number;\n entities: number;\n traits: number;\n pages: number;\n };\n };\n\n try {\n cliResult = JSON.parse(stdout);\n } catch {\n return JSON.stringify({\n success: false,\n valid: false,\n validationAttempt: validationAttempts,\n errors: [{\n code: 'CLI_OUTPUT_ERROR',\n path: '',\n message: `Failed to parse orbital CLI output: ${stdout || stderr}`,\n }],\n });\n }\n\n const response = {\n ...cliResult,\n validationAttempt: validationAttempts,\n remainingAttempts: MAX_VALIDATION_ATTEMPTS - validationAttempts,\n ...(validationAttempts >= MAX_VALIDATION_ATTEMPTS - 1 && !cliResult.valid\n ? {\n warning:\n `⚠️ Only ${MAX_VALIDATION_ATTEMPTS - validationAttempts} validation attempt(s) remaining.`,\n }\n : {}),\n };\n\n return JSON.stringify(response);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n if (errorMessage.includes('ENOENT') || errorMessage.includes('not found')) {\n return JSON.stringify({\n success: false,\n valid: false,\n validationAttempt: validationAttempts,\n errors: [{\n code: 'CLI_NOT_FOUND',\n path: '',\n message: '@almadar/cli not found. Ensure it is installed or accessible via npx.',\n suggestion: 'Install with: npm install -g @almadar/cli or ensure npx can access it.',\n }],\n });\n }\n\n return JSON.stringify({\n success: false,\n valid: false,\n validationAttempt: validationAttempts,\n errors: [{\n code: 'VALIDATION_ERROR',\n path: '',\n message: `Validation error: ${errorMessage}`,\n }],\n });\n }\n },\n {\n name: 'validate_schema',\n description: `Validate the schema.json file in the workspace.\n\nRuns validation using \\`npx @almadar/cli validate --json\\`.\n\nReturns detailed errors with code, path, message, suggestion, and expectedShape.\n\n⚠️ VALIDATION CAP: You have a maximum of 5 validation attempts.`,\n schema: z.object({}),\n },\n );\n}\n","/**\n * Schema Generation Tool (via Structured Output LLM)\n *\n * Generates KFlow schemas using OpenAI's structured output mode.\n * Uses @almadar/llm StructuredOutputClient directly.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { OrbitalSchema } from '@almadar/core/types';\nimport {\n getStructuredOutputClient,\n isStructuredOutputAvailable,\n} from '@almadar/llm';\n\nconst GenerateSchemaInputSchema = z.object({\n userRequest: z.string().describe('The user\\'s natural language description'),\n suggestedTraits: z.array(z.string()).optional().describe('Suggested traits'),\n suggestedEntities: z.array(z.string()).optional().describe('Suggested entity names'),\n suggestedPages: z.array(z.string()).optional().describe('Suggested page types/names'),\n suggestedPatterns: z.array(z.string()).optional().describe('Suggested section patterns'),\n additionalInstructions: z.string().optional().describe('Additional instructions'),\n existingSchema: z.string().optional().describe('Existing schema JSON to update'),\n});\n\n/**\n * Create a tool that generates KFlow schemas using structured output.\n */\nexport function createGenerateSchemaTool() {\n return tool(\n async (input) => {\n if (!isStructuredOutputAvailable()) {\n return JSON.stringify({\n success: false,\n error: 'Structured output generation is not available. Set OPENAI_API_KEY.',\n });\n }\n\n try {\n let enhancedRequest = input.userRequest;\n\n if (input.suggestedEntities?.length) {\n enhancedRequest += `\\n\\nSuggested entities: ${input.suggestedEntities.join(', ')}`;\n }\n if (input.suggestedTraits?.length) {\n enhancedRequest += `\\n\\nSuggested traits: ${input.suggestedTraits.join(', ')}`;\n }\n if (input.suggestedPages?.length) {\n enhancedRequest += `\\n\\nSuggested pages: ${input.suggestedPages.join(', ')}`;\n }\n if (input.suggestedPatterns?.length) {\n enhancedRequest += `\\n\\nSuggested section patterns: ${input.suggestedPatterns.join(', ')}`;\n }\n\n const client = getStructuredOutputClient();\n\n const result = await client.generate<OrbitalSchema>({\n userRequest: enhancedRequest,\n schemaName: 'kflow_schema',\n additionalInstructions: input.additionalInstructions,\n existingContext: input.existingSchema,\n });\n\n return JSON.stringify({\n success: true,\n schema: result.data,\n usage: result.usage,\n latencyMs: result.latencyMs,\n model: result.model,\n zodValidation: result.zodValidation,\n }, null, 2);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return JSON.stringify({\n success: false,\n error: errorMessage,\n suggestion: 'Check the error message and try again with adjusted guidance.',\n });\n }\n },\n {\n name: 'generate_schema',\n description: `Generate a KFlow schema using structured output LLM.\n\nUse this to generate the BULK of the schema quickly, then surgically edit as needed.\n\nGUIDANCE YOU CAN PROVIDE:\n- suggestedTraits, suggestedEntities, suggestedPages, suggestedPatterns\n- additionalInstructions\n- existingSchema (for updates)`,\n schema: GenerateSchemaInputSchema,\n },\n );\n}\n","/**\n * Orbital Combiner\n *\n * Deterministically combines multiple Orbitals into a single OrbitalSchema.\n * This removes the need for LLM involvement in the combining step.\n *\n * All UI is rendered via render_ui effects from traits (no static sections).\n *\n * NOTE: Validation is handled externally via `orbital validate` CLI.\n * The combiner only assembles schemas - it does not validate them.\n *\n * @packageDocumentation\n */\n\nimport type {\n Orbital,\n OrbitalSchema,\n DomainContext,\n OrbitalDefinition,\n PageRef,\n Page,\n} from \"@almadar/core/types\";\nimport { isOrbitalDefinition, isPageReferenceString, isPageReferenceObject } from \"@almadar/core/types\";\n\n/**\n * Check if page is an inline definition (not a reference)\n */\nfunction isInlinePage(page: PageRef): page is Page {\n return !isPageReferenceString(page) && !isPageReferenceObject(page);\n}\n\n// Validation result type for API compatibility (actual validation done via Rust CLI)\nexport interface OrbitalSchemaValidationResult {\n valid: boolean;\n errors: Array<{ code: string; message: string; path?: string }>;\n warnings: Array<{ code: string; message: string; path?: string }>;\n}\n\n// Backward compatibility alias\ntype FullOrbitalUnit = Orbital;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CombinerOptions {\n /** Application name */\n name: string;\n /** Optional description */\n description?: string;\n /** Schema version */\n version?: string;\n /** Domain context */\n domain?: DomainContext;\n /** Whether to run validation (default: true) */\n validate?: boolean;\n /** Global theme */\n theme?: string;\n /** Default route (first page if not specified) */\n defaultRoute?: string;\n}\n\nexport interface CombinerResult {\n /** Whether combining succeeded */\n success: boolean;\n /** The combined OrbitalSchema (if successful) */\n schema?: OrbitalSchema;\n /** Validation result (if validation was run) */\n validation?: OrbitalSchemaValidationResult;\n /** Error message (if failed) */\n error?: string;\n /** Statistics about the combining */\n stats: {\n totalOrbitals: number;\n totalEntities: number;\n totalPages: number;\n totalTraits: number;\n };\n}\n\n// ============================================================================\n// Combiner Implementation\n// ============================================================================\n\n/**\n * Combine multiple Orbitals into a single OrbitalSchema.\n *\n * This function performs deterministic merging:\n * 1. Builds an OrbitalSchema from the Orbitals\n * 2. Optionally runs validation\n *\n * Note: All UI is rendered via render_ui effects from traits.\n *\n * @example\n * ```typescript\n * const result = combineOrbitals([taskOrbital, userOrbital], {\n * name: 'My App',\n * validate: true,\n * });\n *\n * if (result.success) {\n * // Write schema to file\n * await fs.writeFile('schema.json', JSON.stringify(result.schema, null, 2));\n * } else {\n * console.error(result.error);\n * console.error(result.validation?.errors);\n * }\n * ```\n */\nexport function combineOrbitals(\n orbitals: FullOrbitalUnit[],\n options: CombinerOptions,\n): CombinerResult {\n const {\n name,\n description,\n version = \"1.0.0\",\n domain,\n validate = true,\n theme,\n } = options;\n\n // Filter to only full orbital definitions for stats\n const orbitalDefs = orbitals.filter(isOrbitalDefinition);\n\n // Stats\n const stats = {\n totalOrbitals: orbitals.length,\n totalEntities: orbitalDefs.length, // 1 entity per orbital definition\n totalPages: orbitalDefs.reduce((sum, o) => sum + o.pages.length, 0),\n totalTraits: orbitalDefs.reduce((sum, o) => sum + o.traits.length, 0),\n };\n\n // Handle empty input\n if (orbitals.length === 0) {\n return {\n success: false,\n error: \"No orbitals provided. At least one Orbital is required.\",\n stats,\n };\n }\n\n try {\n // Build OrbitalSchema from Orbitals\n const orbitalSchema: OrbitalSchema = {\n name,\n description,\n version,\n domainContext: domain,\n orbitals,\n config: theme\n ? {\n theme: { primary: theme },\n }\n : undefined,\n };\n\n // NOTE: Validation is deprecated in combiner - use `orbital validate` CLI instead\n // The validate option is kept for API compatibility but does not run validation\n const validation: OrbitalSchemaValidationResult | undefined = validate\n ? { valid: true, errors: [], warnings: [] }\n : undefined;\n\n return {\n success: true,\n schema: orbitalSchema,\n validation,\n stats,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n stats,\n };\n }\n}\n\n// Legacy alias removed - use combineOrbitals() directly\n\n/**\n * Combine orbitals and return only the schema (throws on error).\n * Use this when you want a simple API and will handle errors upstream.\n */\nexport function combineOrbitalsToSchema(\n orbitals: FullOrbitalUnit[],\n options: CombinerOptions,\n): OrbitalSchema {\n const result = combineOrbitals(orbitals, options);\n if (!result.success || !result.schema) {\n throw new Error(result.error || \"Failed to combine orbitals\");\n }\n return result.schema;\n}\n\n/**\n * Estimate the combination complexity (for progress indication).\n */\nexport function estimateCombineComplexity(orbitals: FullOrbitalUnit[]): {\n entities: number;\n pages: number;\n traits: number;\n totalSections: number;\n} {\n // Filter to only full orbital definitions\n const orbitalDefs = orbitals.filter(isOrbitalDefinition);\n return {\n entities: orbitalDefs.length,\n pages: orbitalDefs.reduce((sum, o) => sum + o.pages.length, 0),\n traits: orbitalDefs.reduce((sum, o) => sum + o.traits.length, 0),\n // Note: sections are no longer supported in trait-driven pages\n // Only count traits from inline page definitions (not references)\n totalSections: orbitalDefs.reduce(\n (sum, o) =>\n sum +\n o.pages.filter(isInlinePage).reduce((pSum: number, p) => pSum + (p.traits?.length ?? 0), 0),\n 0,\n ),\n };\n}\n","/**\n * Domain Language Module\n *\n * MIGRATED: The core domain language engine has been moved to @almadar/core.\n * This file re-exports everything from the core package for backward compatibility.\n * Only agent-specific modules (prompts) remain here.\n */\n\n// Core domain language engine (types, lexer, parsers, formatters, sync, registry)\nexport * from '@almadar/core/domain-language';\n\n// Agent-specific: LLM prompt templates for domain language generation\nexport * from './prompts/index.js';\n","/**\n * Domain Language Syntax Reference\n *\n * Complete syntax reference for the Orbital Domain Language.\n *\n * @packageDocumentation\n */\n\nexport const ODL_SYNTAX_REFERENCE = `\n## Domain Language Syntax\n\n### Entity Definition\n\n\\`\\`\\`\nA [EntityName] is a [persistence] entity that:\n - has [fieldName] as [type] (required|optional)\n - has [fieldName] as [type] with default [value]\n - belongs to [RelatedEntity]\n - belongs to [RelatedEntity] as [alias]\n - has many [RelatedEntity]s\n\\`\\`\\`\n\n**Persistence types:**\n- \\`persistent\\` - Stored in database (default)\n- \\`runtime\\` - Memory only, for games/UI state\n- \\`singleton\\` - Single instance, for config\n\n**Field types:**\n- \\`text\\` / \\`long text\\` - String fields\n- \\`number\\` / \\`currency\\` - Numeric fields\n- \\`yes/no\\` - Boolean fields\n- \\`date\\` / \\`timestamp\\` / \\`datetime\\` - Date fields\n- \\`enum [val1, val2]\\` - Enumeration\n- \\`list\\` / \\`object\\` - Complex types\n\n### Page Definition\n\n\\`\\`\\`\n[PageName] at /[path]:\n - shows [Entity] using [TraitName]\n - view type: [list|detail|create|edit|dashboard]\n - is initial page\n\\`\\`\\`\n\n### Behavior Definition\n\n\\`\\`\\`\n[BehaviorName] behavior:\n States: [State1], [State2], [State3]\n Initial: [State1]\n\n Transitions:\n - From [State1] to [State2] on [EVENT_NAME]\n if [guard condition]\n then [effect1]\n then [effect2]\n\\`\\`\\`\n\n### Section Headers\n\nDomain Language text is organized into sections:\n\n\\`\\`\\`\n# Entities\n[entity definitions]\n\n# Pages\n[page definitions]\n\n# Behaviors\n[behavior/trait definitions]\n\\`\\`\\`\n`;\n","/**\n * Domain Language Examples\n *\n * Complete examples of Domain Language for common patterns.\n *\n * @packageDocumentation\n */\n\nexport const ODL_EXAMPLES = `\n## Complete Example\n\n### Entity\n\n\\`\\`\\`\nA Task is a persistent entity that:\n - has title as text (required)\n - has description as long text\n - has status as enum [todo, in_progress, done] with default \"todo\"\n - has dueDate as date\n - belongs to User as assignee\n - belongs to Project\n\\`\\`\\`\n\n### Page\n\n\\`\\`\\`\nTasksPage at /tasks:\n - shows Task using TaskManagement\n - view type: list\n - is initial page\n\\`\\`\\`\n\n### Behavior\n\n\\`\\`\\`\nTaskManagement behavior:\n States: Viewing, Editing, Creating\n Initial: Viewing\n\n Transitions:\n - From Viewing to Viewing on INIT\n then render page-header to main with title 'Tasks'\n then render entity-table to center for Task\n\n - From Viewing to Editing on EDIT_TASK\n then render form-section to modal for Task\n\n - From Editing to Viewing on SAVE_TASK\n then persist update Task\n then render null to modal\n then emit TASK_UPDATED\n\\`\\`\\`\n\n## Multi-Entity Example\n\n\\`\\`\\`\n# Entities\n\nA User is a persistent entity that:\n - has name as text (required)\n - has email as text (required)\n - has role as enum [admin, user, guest] with default \"user\"\n\nA Project is a persistent entity that:\n - has name as text (required)\n - has description as long text\n - has status as enum [active, archived] with default \"active\"\n - belongs to User as owner\n\nA Task is a persistent entity that:\n - has title as text (required)\n - has status as enum [todo, in_progress, done] with default \"todo\"\n - has priority as number with default 0\n - belongs to Project\n - belongs to User as assignee\n\n# Pages\n\nProjectsPage at /projects:\n - shows Project using ProjectManagement\n - view type: list\n - is initial page\n\nTasksPage at /projects/:projectId/tasks:\n - shows Task using TaskManagement\n - view type: list\n\n# Behaviors\n\nProjectManagement behavior:\n States: List, Detail\n Initial: List\n\n Transitions:\n - From List to List on INIT\n then render entity-table to main for Project\n\n - From List to Detail on VIEW_PROJECT\n then render entity-detail to drawer for Project\n\nTaskManagement behavior:\n States: Viewing, Editing\n Initial: Viewing\n\n Transitions:\n - From Viewing to Viewing on INIT\n then [\"render-ui\", \"main\", {\"type\": \"entity-table\", \"entity\": \"Task\", \"itemActions\": [{\"label\": \"Edit\", \"event\": \"EDIT_TASK\"}, {\"label\": \"Delete\", \"event\": \"DELETE_TASK\", \"variant\": \"danger\"}]}]\n\n - From Viewing to Editing on EDIT_TASK\n then render form-section to modal for Task\n\n - From Editing to Viewing on SAVE_TASK\n then persist update Task\n then render null to modal\n\\`\\`\\`\n\n## Dashboard Example (Complex Patterns)\n\n\\`\\`\\`\nDashboard behavior:\n States: Viewing\n Initial: Viewing\n\n Transitions:\n - From Viewing to Viewing on INIT\n then render page-header to main with title 'Dashboard'\n then [\"render-ui\", \"center\", {\"type\": \"stats\", \"metrics\": [{\"field\": \"totalTasks\", \"label\": \"Total Tasks\"}, {\"field\": \"completedTasks\", \"label\": \"Completed\"}, {\"field\": \"overdueTasks\", \"label\": \"Overdue\"}]}]\n then [\"render-ui\", \"bottom\", {\"type\": \"tabs\", \"tabs\": [{\"id\": \"overview\", \"label\": \"Overview\", \"event\": \"VIEW_OVERVIEW\"}, {\"id\": \"recent\", \"label\": \"Recent Activity\", \"event\": \"VIEW_RECENT\"}]}]\n\\`\\`\\`\n\n**Note**: Use inline JSON for \\`render-ui\\` effects with complex props (metrics, tabs, itemActions, cells).\n`;\n","/**\n * Domain Language Common Patterns\n *\n * Reusable patterns for common application types.\n *\n * @packageDocumentation\n */\n\nexport const ODL_PATTERNS = `\n## Common Patterns\n\n### CRUD Pattern\n\n\\`\\`\\`\n[Entity]Management behavior:\n States: List, Detail, Create, Edit\n Initial: List\n\n Transitions:\n - From List to List on INIT\n then render entity-table to main for [Entity]\n\n - From List to Create on CREATE_[ENTITY]\n then render form-section to modal for [Entity]\n\n - From Create to List on SUBMIT_CREATE\n then persist create [Entity]\n then render null to modal\n\n - From List to Detail on VIEW_[ENTITY]\n then render entity-detail to drawer for [Entity]\n\n - From Detail to Edit on EDIT_[ENTITY]\n then render form-section to modal for [Entity]\n\n - From Edit to Detail on SUBMIT_EDIT\n then persist update [Entity]\n then render null to modal\n\n - From Detail to List on DELETE_[ENTITY]\n then persist delete [Entity]\n then render null to drawer\n\\`\\`\\`\n\n### Game Health Pattern\n\n\\`\\`\\`\nHealth behavior:\n States: Healthy, Wounded, Critical, Dead\n Initial: Healthy\n\n Transitions:\n - From Healthy to Wounded on TAKE_DAMAGE\n if health >= 30 and health < 70\n then update status to 'wounded'\n\n - From Wounded to Critical on TAKE_DAMAGE\n if health < 30\n then update status to 'critical'\n\n - From Critical to Dead on TAKE_DAMAGE\n if health <= 0\n then update isAlive to false\n then emit ENTITY_DIED\n\\`\\`\\`\n\n### Approval Workflow Pattern\n\n\\`\\`\\`\nApprovalWorkflow behavior:\n States: Draft, Pending, Approved, Rejected\n Initial: Draft\n\n Transitions:\n - From Draft to Pending on SUBMIT\n then update status to 'pending'\n then emit APPROVAL_REQUESTED\n\n - From Pending to Approved on APPROVE\n then update status to 'approved'\n then update approvedAt to now\n then emit APPROVAL_GRANTED\n\n - From Pending to Rejected on REJECT\n then update status to 'rejected'\n then emit APPROVAL_DENIED\n\n - From Rejected to Draft on REVISE\n then update status to 'draft'\n\\`\\`\\`\n\n### Form Validation Pattern\n\n\\`\\`\\`\nFormValidation behavior:\n States: Idle, Validating, Valid, Invalid\n Initial: Idle\n\n Transitions:\n - From Idle to Validating on VALIDATE\n then update isValidating to true\n\n - From Validating to Valid on VALIDATION_SUCCESS\n then update isValidating to false\n then update errors to null\n\n - From Validating to Invalid on VALIDATION_FAILED\n then update isValidating to false\n\n - From Invalid to Validating on VALIDATE\n then update isValidating to true\n\n - From Valid to Idle on RESET\n then update errors to null\n\\`\\`\\`\n\n### Dashboard Pattern\n\n\\`\\`\\`\nDashboardView behavior:\n States: Loading, Ready\n Initial: Loading\n\n Transitions:\n - From Loading to Ready on DATA_LOADED\n then render stats to main\n then render entity-cards to center\n\n - From Ready to Loading on REFRESH\n then emit FETCH_DASHBOARD_DATA\n\\`\\`\\`\n`;\n","/**\n * Domain Language to OrbitalSchema Mapping\n *\n * Reference for how Domain Language maps to OrbitalSchema JSON.\n *\n * @packageDocumentation\n */\n\nexport const ODL_TO_SCHEMA_MAPPING = `\n## Domain Language -> OrbitalSchema Mapping\n\n| Domain Language | OrbitalSchema |\n|-----------------|---------------|\n| \"A Task is...\" | \\`{ \"entity\": { \"name\": \"Task\", ... } }\\` |\n| \"persistent entity\" | \\`\"persistence\": \"persistent\"\\` |\n| \"runtime entity\" | \\`\"persistence\": \"runtime\"\\` |\n| \"singleton entity\" | \\`\"persistence\": \"singleton\"\\` |\n| \"has X as text\" | \\`{ \"name\": \"X\", \"type\": \"string\" }\\` |\n| \"has X as number\" | \\`{ \"name\": \"X\", \"type\": \"number\" }\\` |\n| \"has X as yes/no\" | \\`{ \"name\": \"X\", \"type\": \"boolean\" }\\` |\n| \"has X as enum [a, b]\" | \\`{ \"name\": \"X\", \"type\": \"enum\", \"values\": [\"a\", \"b\"] }\\` |\n| \"belongs to Y\" | \\`{ \"type\": \"relation\", \"relation\": { \"entity\": \"Y\" } }\\` |\n| \"belongs to Y as alias\" | \\`{ \"name\": \"alias\", \"type\": \"relation\", \"relation\": { \"entity\": \"Y\" } }\\` |\n| \"States: A, B\" | \\`\"states\": [{ \"name\": \"A\" }, { \"name\": \"B\" }]\\` |\n| \"Initial: A\" | \\`{ \"name\": \"A\", \"isInitial\": true }\\` |\n| \"From X to Y on Z\" | \\`{ \"from\": \"X\", \"to\": \"Y\", \"event\": \"Z\" }\\` |\n| \"if health >= 0\" | \\`\"guard\": [\">=\", \"@entity.health\", 0]\\` |\n| \"then update status to 'done'\" | \\`\"effects\": [[\"set\", \"@entity.status\", \"done\"]]\\` |\n| \"then emit EVENT\" | \\`\"effects\": [[\"emit\", \"EVENT\"]]\\` |\n| \"then render X to slot\" | \\`\"effects\": [[\"render-ui\", \"slot\", { \"type\": \"X\" }]]\\` |\n| \"then persist create Task\" | \\`\"effects\": [[\"persist\", \"create\", \"Task\"]]\\` |\n| \"then navigate to /path\" | \\`\"effects\": [[\"navigate\", \"/path\"]]\\` |\n\n## Conversion Process\n\n1. **Parse Domain Language** - Split into sections (Entities, Pages, Behaviors)\n2. **Extract entities** - Parse \"A X is...\" definitions\n3. **Extract pages** - Parse \"[Name] at /path\" definitions\n4. **Extract behaviors** - Parse \"[Name] behavior:\" definitions\n5. **Parse guards** - Convert human-readable conditions to S-expressions\n6. **Parse effects** - Convert human-readable effects to S-expressions\n7. **Assemble schema** - Build OrbitalSchema JSON structure\n\n## CLI Commands\n\n\\`\\`\\`bash\n# Convert Domain Language to OrbitalSchema\nnpx kflow domain:to-schema input.txt -o output.orb\n\n# Convert OrbitalSchema to Domain Language\nnpx kflow domain:to-text input.orb -o output.txt\n\n# Validate round-trip conversion\nnpx kflow domain:validate input.orb --verbose\n\\`\\`\\`\n`;\n","/**\n * Finish Task Tool\n *\n * Signals the agent has completed the workflow. Automatically combines\n * orbitals and validates the result.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport type { FullOrbitalUnit } from '@almadar/core/types';\nimport { combineOrbitals } from '../orbitals/combiner/index.js';\nimport { convertDomainToSchema } from '../orbitals/domain-language/index.js';\n\nconst execAsync = promisify(exec);\n\n/**\n * Auto-collect orbitals from the .orbitals/ directory in the workspace.\n */\nasync function collectOrbitalsFromDir(workDir: string): Promise<FullOrbitalUnit[]> {\n const orbitalsDir = path.join(workDir, '.orbitals');\n\n try {\n const dirStat = await fs.stat(orbitalsDir);\n if (!dirStat.isDirectory()) {\n return [];\n }\n } catch {\n return [];\n }\n\n const files = await fs.readdir(orbitalsDir);\n const jsonFiles = files.filter((f) => f.endsWith('.json'));\n\n if (jsonFiles.length === 0) {\n return [];\n }\n\n const orbitals: FullOrbitalUnit[] = [];\n for (const file of jsonFiles) {\n try {\n const content = await fs.readFile(path.join(orbitalsDir, file), 'utf-8');\n orbitals.push(JSON.parse(content));\n } catch {\n // Skip invalid files\n }\n }\n\n return orbitals;\n}\n\n/**\n * Validate schema using orbital CLI.\n */\nasync function validateSchemaWithCLI(schemaPath: string): Promise<{\n valid: boolean;\n errors: Array<{ code: string; path: string; message: string; suggestion?: string }>;\n warnings: Array<{ code: string; path: string; message: string }>;\n stats?: { orbitals: number; entities: number; traits: number; pages: number };\n}> {\n try {\n const { stdout } = await execAsync(\n `orbital validate \"${schemaPath}\" --json`,\n { timeout: 30000 },\n );\n const result = JSON.parse(stdout);\n return {\n valid: result.valid,\n errors: result.errors || [],\n warnings: result.warnings || [],\n stats: result.stats,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return {\n valid: false,\n errors: [{ code: 'CLI_ERROR', path: '', message: `Validation CLI error: ${errorMessage}` }],\n warnings: [],\n };\n }\n}\n\n/**\n * Create a finish_task tool that signals the agent has completed the workflow.\n *\n * Automatically combines orbitals from:\n * 1. .orbitals/ directory (for kflow-orbitals skill)\n * 2. domain.txt (for lean skills) - converted to schema via convertDomainToSchema\n */\nexport function createFinishTaskTool(workDir: string | undefined) {\n return tool(\n async (input) => {\n let combinedSchema = null;\n let stats = null;\n let validationResult: {\n valid: boolean;\n errors: Array<{ code: string; path: string; message: string }>;\n warnings: Array<{ code: string; path: string; message: string }>;\n } | null = null;\n let source: 'orbitals' | 'domain' | null = null;\n\n if (workDir) {\n // Strategy 1: Try .orbitals/ directory\n const orbitals = await collectOrbitalsFromDir(workDir);\n\n if (orbitals.length > 0) {\n source = 'orbitals';\n const appName =\n input.summary?.match(/Generated \\d+ orbitals?:?\\s*(.+)/)?.[1] ||\n orbitals[0]?.name ||\n 'Application';\n\n const result = combineOrbitals(orbitals, {\n name: appName,\n validate: false,\n });\n\n if (result.success && result.schema) {\n combinedSchema = result.schema;\n stats = result.stats;\n }\n } else {\n // Strategy 2: Try domain.txt\n const domainPath = path.join(workDir, 'domain.txt');\n try {\n const domainText = await fs.readFile(domainPath, 'utf-8');\n if (domainText.trim()) {\n source = 'domain';\n const appName =\n input.summary?.match(/Generated \\d+ orbitals?:?\\s*(.+)/)?.[1] ||\n 'Application';\n\n const domainResult = convertDomainToSchema(domainText, {\n name: appName,\n orbitals: [],\n });\n\n if (domainResult.success && domainResult.schema) {\n combinedSchema = domainResult.schema;\n const traitCount = (domainResult.schema.orbitals || []).reduce(\n (count, o) => count + ('traits' in o ? (o as { traits?: unknown[] }).traits?.length || 0 : 0),\n 0,\n );\n stats = {\n totalOrbitals: domainResult.schema.orbitals?.length || 0,\n totalEntities: domainResult.schema.orbitals?.length || 0,\n totalTraits: traitCount,\n totalPages:\n domainResult.schema.orbitals?.reduce(\n (sum, o) => sum + ('pages' in o ? (o as { pages?: unknown[] }).pages?.length || 0 : 0),\n 0,\n ) || 0,\n };\n }\n }\n } catch {\n // No domain.txt found\n }\n }\n\n // Write combined schema if we got one\n if (combinedSchema) {\n const schemaPath = path.join(workDir, 'schema.json');\n await fs.writeFile(schemaPath, JSON.stringify(combinedSchema, null, 2));\n validationResult = await validateSchemaWithCLI(schemaPath);\n }\n }\n\n return {\n success: true,\n status: 'TASK_COMPLETE',\n message: '✅ Task completed successfully. STOP HERE - do not make any more tool calls.',\n summary: input.summary,\n autoCombined: combinedSchema ? true : false,\n source: source || undefined,\n stats: stats || undefined,\n validation: validationResult\n ? {\n valid: validationResult.valid,\n errorCount: validationResult.errors?.length || 0,\n warningCount: validationResult.warnings?.length || 0,\n }\n : undefined,\n schemaPath: combinedSchema\n ? path.join(workDir!, 'schema.json')\n : input.schemaPath,\n nextAction: 'NONE - Task is complete. Output a brief success message to the user.',\n };\n },\n {\n name: 'finish_task',\n description: `Signal that the orbital generation workflow is COMPLETE.\n\n⚠️ IMPORTANT: After calling this tool, STOP. Do not make any more tool calls.\n\nWHAT IT DOES:\n1. Automatically collects orbitals from .orbitals/ directory\n2. Combines them into a single OrbitalSchema\n3. Validates the combined schema\n4. Writes schema.json to workspace\n5. Returns success with stats`,\n schema: z.object({\n summary: z.string().describe('Brief summary of what was accomplished'),\n schemaPath: z.string().optional().describe('Path to the combined schema file if already written'),\n }),\n },\n );\n}\n","/**\n * Domain Orbital Tool\n *\n * Generates domain language orbitals incrementally using LLM.\n * Uses @almadar/llm for LLM access and @almadar/skills for prompt sections.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport crypto from 'crypto';\nimport { LLMClient } from '@almadar/llm';\nimport {\n getSExprQuickRef,\n getKeyBehaviorsReference,\n getCommonErrorsSection,\n getArchitectureSection,\n} from '@almadar/skills';\nimport type { SSEEventType } from '../api-types.js';\nimport { AgentDomainCategorySchema } from '@almadar/core/types';\nimport type { AgentDomainCategory } from '@almadar/core/types';\nimport { convertDomainToSchema } from '../orbitals/domain-language/index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type DomainOrbitalEventCallback = (\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number,\n event: {\n type: Exclude<SSEEventType, 'subagent_event'>;\n data: Record<string, unknown>;\n timestamp: number;\n }\n) => void;\n\nexport type DomainOrbitalCompleteCallback = (\n domainText: string,\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number\n) => void | Promise<void>;\n\nexport interface DomainOrbitalToolOptions {\n onEvent?: DomainOrbitalEventCallback;\n onOrbitalComplete?: DomainOrbitalCompleteCallback;\n workDir?: string;\n}\n\nexport interface DomainOrbitalSpec {\n name: string;\n entity: {\n name: string;\n persistence: 'persistent' | 'runtime' | 'singleton';\n fields: Array<{\n name: string;\n type: string;\n required?: boolean;\n default?: unknown;\n }>;\n relations?: Array<{\n entity: string;\n alias?: string;\n type: 'belongs_to' | 'has_many';\n }>;\n };\n pages: Array<{\n name: string;\n path: string;\n viewType: string;\n isInitial?: boolean;\n }>;\n traits: string[];\n patterns: string[];\n domainContext?: {\n request: string;\n requestFragment?: string;\n category: AgentDomainCategory;\n vocabulary?: Record<string, string>;\n };\n design?: {\n style?: 'minimal' | 'modern' | 'playful' | 'data-driven' | 'immersive';\n uxHints?: {\n flowPattern?: 'hub-spoke' | 'master-detail' | 'crud-cycle' | 'linear' | 'role-based';\n listPattern?: 'entity-table' | 'entity-cards' | 'entity-list';\n formPattern?: 'modal' | 'drawer' | 'page';\n detailPattern?: 'drawer' | 'page' | 'split';\n };\n };\n emits?: string[];\n listens?: Array<{\n event: string;\n triggers: string;\n }>;\n}\n\n// ============================================================================\n// Cache\n// ============================================================================\n\ninterface CacheEntry {\n domainText: string;\n timestamp: number;\n usage: { inputTokens: number; outputTokens: number; totalTokens: number };\n}\n\nconst domainOrbitalCache = new Map<string, CacheEntry>();\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000;\nconst CACHE_VERSION = 5;\n\nfunction generateFingerprint(spec: DomainOrbitalSpec): string {\n const normalized = JSON.stringify({\n version: CACHE_VERSION,\n entity: spec.entity,\n pages: spec.pages,\n traits: spec.traits.sort(),\n patterns: spec.patterns.sort(),\n emits: spec.emits?.sort() || [],\n listens: spec.listens?.map(l => `${l.event}:${l.triggers}`).sort() || [],\n });\n return crypto.createHash('sha256').update(normalized).digest('hex').slice(0, 16);\n}\n\nfunction getCached(fingerprint: string): CacheEntry | null {\n const entry = domainOrbitalCache.get(fingerprint);\n if (!entry) return null;\n if (Date.now() - entry.timestamp > CACHE_TTL_MS) {\n domainOrbitalCache.delete(fingerprint);\n return null;\n }\n return entry;\n}\n\nfunction setCache(fingerprint: string, entry: CacheEntry): void {\n domainOrbitalCache.set(fingerprint, entry);\n}\n\n// ============================================================================\n// File-based domain accumulation\n// ============================================================================\n\nfunction appendToDomainFile(workDir: string, domainText: string, _orbitalName: string): void {\n const domainPath = path.join(workDir, 'domain.txt');\n const separator = `\\n\\n---\\n`;\n let existingContent = '';\n if (fs.existsSync(domainPath)) {\n existingContent = fs.readFileSync(domainPath, 'utf-8');\n }\n const newContent = existingContent + separator + domainText;\n fs.writeFileSync(domainPath, newContent, 'utf-8');\n}\n\nfunction readDomainFile(workDir: string): string | null {\n const domainPath = path.join(workDir, 'domain.txt');\n if (!fs.existsSync(domainPath)) {\n return null;\n }\n return fs.readFileSync(domainPath, 'utf-8');\n}\n\n// ============================================================================\n// LLM Generation Prompt (uses @almadar/skills)\n// ============================================================================\n\nfunction buildStaticSystemPrompt(): string {\n const behaviorsRef = getKeyBehaviorsReference();\n const sExprRef = getSExprQuickRef();\n const errorsRef = getCommonErrorsSection();\n const architectureRef = getArchitectureSection();\n\n return `You are a domain language expert. Generate clean, complete domain language for OrbitalSchema applications.\n\n${behaviorsRef}\n\n---\n\n${sExprRef}\n\n---\n\n${architectureRef}\n\n---\n\n${errorsRef}\n\n---\n\n## Output Requirements\n\nGenerate ONLY the domain language text with these EXACT formats:\n\n### Entity Format (CRITICAL)\n\\`\\`\\`\n# Entities\n\nA [EntityName] is a [persistent|runtime|singleton] entity that:\n - has [fieldName] as [type] (required)\n - has [fieldName] as [type] with default [value]\n - belongs to [RelatedEntity]\n - has many [RelatedEntity]s\n\\`\\`\\`\n\n### Page Format (CRITICAL)\n\\`\\`\\`\n# Pages\n\n[PageName] at /[path]:\n - shows [Entity] using [TraitName]\n - view type: list\n - is initial page\n\\`\\`\\`\n\n### Behavior Format (CRITICAL)\n\\`\\`\\`\n# Behaviors\n\n[TraitName] behavior:\n Entity: [EntityName]\n States: [State1], [State2], ...\n Initial: [State1]\n\n Transitions:\n - From [State1] to [State2] on [EVENT]\n then [S-Expression effect]\n\\`\\`\\`\n\n**CRITICAL RULES:**\n1. Entities MUST start with \"A\" or \"An\"\n2. Behaviors MUST have \"Entity: [EntityName]\" line after the behavior name\n3. Pages MUST use \"shows [Entity] using [TraitName]\" format\n\nGenerate ONLY the domain language text, no explanations or markdown code blocks.`;\n}\n\nfunction buildDynamicUserPrompt(spec: DomainOrbitalSpec): string {\n const entityFields = spec.entity.fields\n .map(f => {\n let fieldDef = ` - ${f.name}: ${f.type}`;\n if (f.required) fieldDef += ', required';\n if (f.default !== undefined) fieldDef += `, default ${JSON.stringify(f.default)}`;\n return fieldDef;\n })\n .join('\\n');\n\n const relations = spec.entity.relations\n ?.map(r => {\n if (r.type === 'belongs_to') {\n return r.alias\n ? ` - belongs to ${r.entity} as ${r.alias}`\n : ` - belongs to ${r.entity}`;\n }\n return ` - has many ${r.entity}s`;\n })\n .join('\\n') || '';\n\n const pagesInfo = spec.pages\n .map(p => `- ${p.name} at ${p.path} (${p.viewType}${p.isInitial ? ', initial' : ''})`)\n .join('\\n');\n\n const emitsInfo = spec.emits?.length\n ? `**Emits Events**: ${spec.emits.join(', ')}`\n : '';\n const listensInfo = spec.listens?.length\n ? `**Listens**: ${spec.listens.map(l => `${l.event} → ${l.triggers}`).join(', ')}`\n : '';\n\n return `Generate domain language for the following orbital.\n\n## Orbital Specification\n\n**Entity**: ${spec.entity.name} (${spec.entity.persistence})\n**Fields**:\n${entityFields}\n${relations ? `**Relations**:\\n${relations}` : ''}\n\n**Pages**:\n${pagesInfo}\n\n**Behaviors**: ${spec.traits.join(', ')}\n**UI Patterns**: ${spec.patterns.join(', ')}\n${emitsInfo}\n${listensInfo}\n\nReplace [Entity] placeholders with \"${spec.entity.name}\" in all patterns.`;\n}\n\n// ============================================================================\n// Zod Schema\n// ============================================================================\n\nconst GenerateOrbitalDomainSchema = z.object({\n sessionId: z.string().describe('Unique session ID for this generation batch'),\n orbital: z.object({\n name: z.string(),\n entity: z.object({\n name: z.string(),\n persistence: z.enum(['persistent', 'runtime', 'singleton']),\n fields: z.array(z.object({\n name: z.string(),\n type: z.string(),\n required: z.boolean().optional(),\n default: z.any().optional(),\n })),\n relations: z.array(z.object({\n entity: z.string(),\n alias: z.string().optional(),\n type: z.enum(['belongs_to', 'has_many']),\n })).optional(),\n }),\n pages: z.array(z.object({\n name: z.string(),\n path: z.string(),\n viewType: z.string(),\n isInitial: z.boolean().optional(),\n })),\n traits: z.array(z.string()),\n patterns: z.array(z.string()),\n domainContext: z.object({\n request: z.string(),\n requestFragment: z.string().optional(),\n category: AgentDomainCategorySchema,\n vocabulary: z.record(z.string(), z.string()).optional(),\n }).optional(),\n design: z.object({\n style: z.enum(['minimal', 'modern', 'playful', 'data-driven', 'immersive']).optional(),\n uxHints: z.object({\n flowPattern: z.enum(['hub-spoke', 'master-detail', 'crud-cycle', 'linear', 'role-based']).optional(),\n listPattern: z.enum(['entity-table', 'entity-cards', 'entity-list']).optional(),\n formPattern: z.enum(['modal', 'drawer', 'page']).optional(),\n detailPattern: z.enum(['drawer', 'page', 'split']).optional(),\n }).optional(),\n }).optional(),\n emits: z.array(z.string()).optional(),\n listens: z.array(z.object({\n event: z.string(),\n triggers: z.string(),\n })).optional(),\n }).describe('The orbital specification'),\n orbitalIndex: z.number().describe('Index in the batch (0-based)'),\n totalOrbitals: z.number().describe('Total orbitals in the batch'),\n});\n\nconst ConstructCombinedDomainSchema = z.object({\n appName: z.string().describe('Name of the application'),\n});\n\n// ============================================================================\n// Tool Factories\n// ============================================================================\n\n/**\n * Create the generate_orbital_domain tool.\n * Uses @almadar/llm LLMClient directly for Anthropic calls.\n */\nexport function createGenerateOrbitalDomainTool(\n \n options: DomainOrbitalToolOptions = {},\n) {\n let eventCallback: DomainOrbitalEventCallback | undefined = options.onEvent;\n let completeCallback: DomainOrbitalCompleteCallback | undefined = options.onOrbitalComplete;\n const workDir = options.workDir || process.cwd();\n\n const STATIC_SYSTEM_PROMPT = buildStaticSystemPrompt();\n\n const setEventCallback = (callback: DomainOrbitalEventCallback) => {\n eventCallback = callback;\n };\n\n const setCompleteCallback = (callback: DomainOrbitalCompleteCallback) => {\n completeCallback = callback;\n };\n\n const emitEvent = (\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number,\n type: Exclude<SSEEventType, 'subagent_event'>,\n data: Record<string, unknown>\n ) => {\n if (eventCallback) {\n eventCallback(orbitalName, orbitalIndex, totalOrbitals, {\n type,\n data,\n timestamp: Date.now(),\n });\n }\n };\n\n const generateOrbitalDomainTool = tool(\n async ({ sessionId, orbital, orbitalIndex, totalOrbitals }) => {\n const spec = orbital as DomainOrbitalSpec;\n const fingerprint = generateFingerprint(spec);\n\n try {\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'message', {\n content: `Generating domain orbital: ${spec.name} (${orbitalIndex + 1}/${totalOrbitals})`,\n role: 'assistant',\n isComplete: false,\n });\n\n // Check cache\n const cached = getCached(fingerprint);\n if (cached) {\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: 'info',\n message: `Cache HIT for ${spec.name}`,\n data: { fingerprint, cachedAt: new Date(cached.timestamp).toISOString() },\n orbitalName: spec.name,\n });\n\n appendToDomainFile(workDir, cached.domainText, spec.name);\n\n if (completeCallback) {\n await completeCallback(cached.domainText, spec.name, orbitalIndex, totalOrbitals);\n }\n\n return JSON.stringify({\n success: true,\n orbitalName: spec.name,\n fingerprint,\n cached: true,\n domainWritten: true,\n usage: cached.usage,\n });\n }\n\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: 'info',\n message: `Cache MISS for ${spec.name}, generating with LLM`,\n data: { fingerprint },\n orbitalName: spec.name,\n });\n\n // Use @almadar/llm directly\n const client = new LLMClient({\n provider: 'anthropic',\n model: 'claude-sonnet-4-20250514',\n temperature: 0,\n });\n\n const userPrompt = buildDynamicUserPrompt(spec);\n\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'tool_call', {\n tool: 'llm_generate_domain',\n args: {\n orbital: spec.name,\n entity: spec.entity.name,\n traits: spec.traits,\n },\n });\n\n const response = await client.callWithCache<string>({\n systemPrompt: '',\n systemBlocks: [{\n type: 'text',\n text: STATIC_SYSTEM_PROMPT,\n cache_control: { type: 'ephemeral' },\n }],\n userPrompt,\n maxTokens: 8192,\n rawText: true,\n });\n\n const domainText = (response.raw || String(response.data) || '').trim();\n\n const usage = {\n inputTokens: response.usage?.promptTokens || 0,\n outputTokens: response.usage?.completionTokens || 0,\n totalTokens: response.usage?.totalTokens || 0,\n };\n\n setCache(fingerprint, {\n domainText,\n timestamp: Date.now(),\n usage,\n });\n\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'tool_result', {\n tool: 'llm_generate_domain',\n result: { fingerprint, textLength: domainText.length, usage },\n success: true,\n });\n\n appendToDomainFile(workDir, domainText, spec.name);\n\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'message', {\n content: `Generated domain for ${spec.name} (${usage.totalTokens} tokens) - written to domain.txt`,\n role: 'assistant',\n isComplete: true,\n });\n\n if (completeCallback) {\n try {\n await completeCallback(domainText, spec.name, orbitalIndex, totalOrbitals);\n } catch (error) {\n console.error(`[DomainOrbitalTool] Callback error for ${spec.name}:`, error);\n }\n }\n\n return JSON.stringify({\n success: true,\n orbitalName: spec.name,\n fingerprint,\n cached: false,\n domainWritten: true,\n usage,\n domainText,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'error', {\n error: errorMessage,\n code: 'DOMAIN_ORBITAL_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessage,\n orbitalName: spec.name,\n });\n }\n },\n {\n name: 'generate_orbital_domain',\n description: `Generate domain language for a single orbital using LLM.\n\nTakes a lightweight orbital specification and generates complete domain language text.\nResults are cached by fingerprint to avoid regenerating identical orbitals.\n\nUSAGE:\n1. Decompose app into orbital specs\n2. For each orbital, call generate_orbital_domain\n3. After all orbitals, call construct_combined_domain`,\n schema: GenerateOrbitalDomainSchema,\n }\n );\n\n return {\n tool: generateOrbitalDomainTool,\n setEventCallback,\n setCompleteCallback,\n };\n}\n\n/**\n * Create the construct_combined_domain tool.\n */\nexport function createConstructCombinedDomainTool(\n \n options: { onEvent?: DomainOrbitalEventCallback; workDir?: string } = {},\n) {\n let eventCallback = options.onEvent;\n const workDir = options.workDir || process.cwd();\n\n const setEventCallback = (callback: DomainOrbitalEventCallback) => {\n eventCallback = callback;\n };\n\n const emitEvent = (\n type: Exclude<SSEEventType, 'subagent_event'>,\n data: Record<string, unknown>\n ) => {\n if (eventCallback) {\n eventCallback('combined', 0, 1, {\n type,\n data,\n timestamp: Date.now(),\n });\n }\n };\n\n const constructCombinedDomainTool = tool(\n async ({ appName }) => {\n try {\n const domainText = readDomainFile(workDir);\n if (!domainText) {\n return JSON.stringify({\n success: false,\n error: 'No domain.txt found. Call generate_orbital_domain first.',\n });\n }\n\n emitEvent('message', {\n content: `Converting domain.txt to OrbitalSchema for ${appName}`,\n role: 'assistant',\n isComplete: false,\n });\n\n const schemaResult = convertDomainToSchema(domainText, {\n name: appName,\n orbitals: [],\n });\n\n if (!schemaResult.success) {\n const errorMessages = schemaResult.errors?.map(e => e.message).join('; ') || 'Unknown conversion error';\n\n emitEvent('error', {\n error: errorMessages,\n code: 'DOMAIN_CONVERSION_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessages,\n domainText,\n });\n }\n\n emitEvent('message', {\n content: `Successfully converted domain.txt to OrbitalSchema for ${appName}`,\n role: 'assistant',\n isComplete: true,\n });\n\n const traitCount = (schemaResult.schema?.orbitals || []).reduce((count, o) => {\n if (typeof o === 'object' && o !== null && 'traits' in o) {\n return count + ((o as { traits?: unknown[] }).traits?.length || 0);\n }\n return count;\n }, 0);\n\n return JSON.stringify({\n success: true,\n appName,\n domainText,\n schema: schemaResult.schema,\n stats: {\n orbitalCount: schemaResult.schema?.orbitals?.length || 0,\n traitCount,\n },\n domainPath: path.join(workDir, 'domain.txt'),\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n emitEvent('error', {\n error: errorMessage,\n code: 'CONSTRUCT_COMBINED_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessage,\n });\n }\n },\n {\n name: 'construct_combined_domain',\n description: `Convert accumulated domain.txt to OrbitalSchema.\n\nCall this after all orbitals have been generated via generate_orbital_domain.`,\n schema: ConstructCombinedDomainSchema,\n }\n );\n\n return {\n tool: constructCombinedDomainTool,\n setEventCallback,\n };\n}\n\n/**\n * Create both domain orbital tools together.\n */\nexport function createDomainOrbitalTools(\n options: DomainOrbitalToolOptions = {},\n) {\n const generateTool = createGenerateOrbitalDomainTool(options);\n const constructTool = createConstructCombinedDomainTool({\n onEvent: options.onEvent,\n workDir: options.workDir,\n });\n\n return {\n generateOrbitalDomain: generateTool.tool,\n constructCombinedDomain: constructTool.tool,\n setEventCallback: (callback: DomainOrbitalEventCallback) => {\n generateTool.setEventCallback(callback);\n constructTool.setEventCallback(callback);\n },\n setCompleteCallback: generateTool.setCompleteCallback,\n };\n}\n","/**\n * Orbital Generator\n *\n * Provides utilities for generating FullOrbitalUnit definitions from\n * lightweight OrbitalUnit inputs. Designed for SUBAGENT use where each\n * orbital is generated separately for better caching.\n *\n * ## Subagent Caching Pattern\n *\n * When generating multiple orbitals in a subagent pattern:\n * 1. Main agent decomposes request → OrbitalUnit[]\n * 2. For each orbital, subagent calls generateFullOrbital()\n * 3. Each subagent call uses the SAME cached system prompt blocks\n * 4. Anthropic caches at request level → subsequent calls get 90% discount\n *\n * This is MORE efficient than batch generation because:\n * - System prompt is cached and reused across subagent calls\n * - Template guidance is cached per fingerprint\n * - Only the orbital-specific content varies\n *\n * @packageDocumentation\n */\n\nimport type { LLMClient, LLMProvider } from '@almadar/llm';\nimport { assembleCacheableOrbitalPrompt, assembleOrbitalPrompt } from '../cache/index.js';\nimport { getOrbitalDecompositionPrompt, getFullOrbitalPrompt, getRequirementsDecomposePrompt, getRequirementsTraitPrompt } from '@almadar/skills';\nimport type { OrbitalDefinition, FullOrbitalUnit, EntityRef } from '@almadar/core/types';\nimport { isEntityReference } from '@almadar/core/types';\n// DEPRECATED: Validation removed - use orbital-rust validator instead\n// import { validateFullOrbitalUnit } from '../../validation/index.js';\n\n/**\n * Get entity name safely from EntityRef\n */\nfunction getEntityName(entity: EntityRef): string {\n if (isEntityReference(entity)) {\n return entity.replace('.entity', '');\n }\n return entity.name;\n}\n\n// ============================================================================\n// Requirements Types (imported structure from analysis)\n// ============================================================================\n\n/**\n * Extracted requirements from the analysis phase.\n * Matches ExtractedRequirements from agents/orchestrator/shared/requirements.ts\n */\nexport interface ExtractedRequirements {\n /** Entity names to create */\n entities: string[];\n /** State names that should exist */\n states: string[];\n /** Event/action names */\n events: string[];\n /** Business rules (become guards) */\n guards: string[];\n /** Page types needed */\n pages: string[];\n /** Notifications/side-effects */\n effects: string[];\n /** Raw requirement statements */\n rawRequirements: string[];\n}\n\n// Type alias - OrbitalUnit in generator context is always a full definition\ntype OrbitalUnit = OrbitalDefinition;\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * A structured log entry from the generation process.\n * Used for debugging and observability of subagent reasoning.\n */\nexport interface GenerationLog {\n /** Timestamp of the log entry */\n timestamp: number;\n /** Log level */\n level: 'info' | 'warn' | 'error' | 'debug';\n /** Log message */\n message: string;\n /** Optional structured data */\n data?: Record<string, unknown>;\n}\n\nexport interface OrbitalGenerationOptions {\n /** Maximum tokens for generation */\n maxTokens?: number;\n /** Enable validation after generation */\n validate?: boolean;\n /** Callback for real-time log streaming (SSE integration) */\n onLog?: (log: GenerationLog, orbitalName?: string) => void;\n /** Optional requirements relevant to this orbital (from analysis) */\n requirements?: Partial<ExtractedRequirements>;\n}\n\nexport interface OrbitalGenerationResult {\n /** Generated full orbital unit */\n orbital: FullOrbitalUnit;\n /** Fingerprint used for caching */\n fingerprint: string;\n /** Whether template guidance was used */\n usedTemplate: boolean;\n /** Token usage */\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n /** Validation result */\n validation?: {\n valid: boolean;\n errorCount: number;\n warningCount: number;\n };\n /** Structured logs from the generation process */\n logs: GenerationLog[];\n}\n\n// ============================================================================\n// Provider Concurrency Limits\n// ============================================================================\n\n/**\n * Default concurrency limits per LLM provider.\n * These are conservative defaults to avoid rate limiting.\n */\nexport const PROVIDER_CONCURRENCY_LIMITS: Record<LLMProvider, number> = {\n anthropic: 3,\n openai: 5,\n deepseek: 3,\n kimi: 3,\n};\n\nexport interface ParallelGenerationOptions extends OrbitalGenerationOptions {\n /** Maximum concurrent generations (default: provider-specific) */\n concurrency?: number;\n}\n\nexport interface ParallelGenerationResult {\n /** Results for each orbital (same order as input) */\n results: OrbitalGenerationResult[];\n /** Total duration in milliseconds */\n totalDurationMs: number;\n /** Aggregate logs from all generations */\n aggregateLogs: GenerationLog[];\n /** Summary statistics */\n summary: {\n total: number;\n successful: number;\n failed: number;\n totalTokens: number;\n };\n}\n\n// ============================================================================\n// Logging Utility\n// ============================================================================\n\nfunction createLog(level: GenerationLog['level'], message: string, data?: Record<string, unknown>): GenerationLog {\n return {\n timestamp: Date.now(),\n level,\n message,\n data,\n };\n}\n\n// ============================================================================\n// Single Orbital Generation (For Subagent Use)\n// ============================================================================\n\n/**\n * Generate a full orbital unit from a lightweight orbital input.\n *\n * DESIGNED FOR SUBAGENT USE: Call this once per orbital in separate\n * subagent invocations. Caching works across calls because:\n * - System prompt blocks are marked as cacheable\n * - Anthropic caches at the request level\n * - Subsequent calls with same system prompt get cache hits\n *\n * @example\n * ```typescript\n * // In subagent for each orbital:\n * const result = await generateFullOrbital(client, orbitalUnit, { validate: true });\n * // First call: Cache WRITE: 3500 tokens\n * // Second call: Cache HIT: 3500 tokens (90% discount!)\n * ```\n */\nexport async function generateFullOrbital(\n client: LLMClient,\n orbital: OrbitalUnit,\n options: OrbitalGenerationOptions = {}\n): Promise<OrbitalGenerationResult> {\n const {\n maxTokens = 8192,\n validate = true,\n requirements,\n } = options;\n\n const logs: GenerationLog[] = [];\n const startTime = Date.now();\n\n logs.push(createLog('info', `Starting generation for orbital: ${orbital.name}`, {\n entityName: getEntityName(orbital.entity),\n traitCount: orbital.traits.length,\n hasRequirements: !!requirements,\n }));\n\n // Use requirements-aware prompt if requirements provided\n const systemPrompt = requirements\n ? getRequirementsAwareFullOrbitalPrompt(requirements)\n : getFullOrbitalPrompt();\n\n // Check if using Anthropic for cache support\n const useCache = client.getProvider() === 'anthropic';\n\n let result;\n let fingerprint: string;\n let usedTemplate = false;\n\n if (useCache) {\n // Use cache-aware call - this is where the magic happens\n const cacheablePrompt = assembleCacheableOrbitalPrompt(orbital, systemPrompt);\n fingerprint = cacheablePrompt.fingerprint;\n usedTemplate = cacheablePrompt.usedCachedTemplate;\n\n logs.push(createLog('info', `Using Anthropic caching`, { fingerprint, usedTemplate }));\n console.log(`[OrbitalGenerator] Using Anthropic caching (fingerprint: ${fingerprint})`);\n\n result = await client.callWithCache({\n systemBlocks: cacheablePrompt.systemBlocks,\n userBlocks: cacheablePrompt.userBlocks,\n systemPrompt: '', // Overridden by blocks\n userPrompt: '', // Overridden by blocks\n maxTokens,\n skipSchemaValidation: true, // Parse JSON only\n });\n\n logs.push(createLog('info', `LLM call completed`, {\n promptTokens: result.usage?.promptTokens,\n completionTokens: result.usage?.completionTokens,\n }));\n } else {\n // Standard call for non-Anthropic providers\n const assembledPrompt = assembleOrbitalPrompt(orbital, systemPrompt);\n fingerprint = assembledPrompt.fingerprint;\n usedTemplate = assembledPrompt.usedCachedTemplate;\n\n logs.push(createLog('info', `Using standard generation (${client.getProvider()})`, { fingerprint, usedTemplate }));\n\n const userPrompt = `Generate a complete FullOrbitalUnit for this orbital:\n\n${JSON.stringify(orbital, null, 2)}\n\nReturn valid JSON matching the FullOrbitalUnit schema.`;\n\n result = await client.callWithMetadata({\n systemPrompt: assembledPrompt.prompt,\n userPrompt,\n maxTokens,\n skipSchemaValidation: true,\n });\n\n logs.push(createLog('info', `LLM call completed`, {\n promptTokens: result.usage?.promptTokens,\n completionTokens: result.usage?.completionTokens,\n }));\n }\n\n const generatedOrbital = result.data as OrbitalDefinition;\n\n // Validate if requested\n let validation;\n if (validate) {\n // Use direct per-unit validation\n // DEPRECATED: Validation removed - use orbital-rust validator instead\n // const validationResult = validateFullOrbitalUnit(generatedOrbital);\n const validationResult: any = { valid: true, errors: [], warnings: [] };\n validation = {\n valid: validationResult.valid,\n errorCount: validationResult.errors.length,\n warningCount: (validationResult.warnings || []).length,\n };\n\n if (validationResult.valid) {\n logs.push(createLog('info', `Validation passed`));\n } else {\n logs.push(createLog('warn', `Validation failed`, {\n errorCount: validationResult.errors.length,\n warningCount: (validationResult.warnings || []).length,\n errors: validationResult.errors.slice(0, 3).map((e: any) => e.message || e),\n }));\n }\n }\n\n const durationMs = Date.now() - startTime;\n logs.push(createLog('info', `Generation completed`, { durationMs }));\n\n return {\n orbital: generatedOrbital,\n fingerprint,\n usedTemplate,\n usage: result.usage ?? undefined,\n validation,\n logs,\n };\n}\n\n// ============================================================================\n// Parallel Orbital Generation\n// ============================================================================\n\n/**\n * Generate multiple orbitals in parallel with concurrency control.\n *\n * Uses provider-specific concurrency limits to avoid rate limiting.\n * All orbital units are independent, so parallel execution is safe.\n *\n * @example\n * ```typescript\n * // Generate all orbitals in parallel (max 3 concurrent for Anthropic)\n * const result = await generateFullOrbitalsParallel(client, orbitals, { validate: true });\n * console.log(`Generated ${result.summary.successful}/${result.summary.total} orbitals`);\n * ```\n */\nexport async function generateFullOrbitalsParallel(\n client: LLMClient,\n orbitals: OrbitalUnit[],\n options: ParallelGenerationOptions = {}\n): Promise<ParallelGenerationResult> {\n const provider = client.getProvider();\n const defaultConcurrency = PROVIDER_CONCURRENCY_LIMITS[provider] ?? 3;\n const concurrency = options.concurrency ?? defaultConcurrency;\n\n const aggregateLogs: GenerationLog[] = [];\n const startTime = Date.now();\n\n aggregateLogs.push(createLog('info', `Starting parallel generation`, {\n totalOrbitals: orbitals.length,\n concurrency,\n provider,\n }));\n\n console.log(`[OrbitalGenerator] Parallel generation: ${orbitals.length} orbitals, concurrency=${concurrency}`);\n\n // Simple concurrency limiter using a semaphore pattern\n let activeCount = 0;\n const queue: Array<() => void> = [];\n\n const acquire = (): Promise<void> => {\n return new Promise((resolve) => {\n if (activeCount < concurrency) {\n activeCount++;\n resolve();\n } else {\n queue.push(resolve);\n }\n });\n };\n\n const release = () => {\n activeCount--;\n const next = queue.shift();\n if (next) {\n activeCount++;\n next();\n }\n };\n\n // Generate all orbitals in parallel with concurrency control\n const results = await Promise.all(\n orbitals.map(async (orbital, index) => {\n await acquire();\n try {\n aggregateLogs.push(createLog('debug', `Starting orbital ${index + 1}/${orbitals.length}: ${orbital.name}`));\n const result = await generateFullOrbital(client, orbital, options);\n aggregateLogs.push(createLog('info', `Completed orbital ${index + 1}/${orbitals.length}: ${orbital.name}`, {\n valid: result.validation?.valid,\n tokens: result.usage?.totalTokens,\n }));\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n aggregateLogs.push(createLog('error', `Failed orbital ${index + 1}/${orbitals.length}: ${orbital.name}`, {\n error: errorMessage,\n }));\n // Return a failed result instead of throwing\n return {\n orbital: null as unknown as FullOrbitalUnit,\n fingerprint: '',\n usedTemplate: false,\n logs: [createLog('error', errorMessage)],\n validation: { valid: false, errorCount: 1, warningCount: 0 },\n } as OrbitalGenerationResult;\n } finally {\n release();\n }\n })\n );\n\n const totalDurationMs = Date.now() - startTime;\n const successful = results.filter(r => r.validation?.valid !== false && r.orbital !== null).length;\n const failed = results.length - successful;\n const totalTokens = results.reduce((sum, r) => sum + (r.usage?.totalTokens ?? 0), 0);\n\n aggregateLogs.push(createLog('info', `Parallel generation completed`, {\n totalDurationMs,\n successful,\n failed,\n totalTokens,\n }));\n\n console.log(`[OrbitalGenerator] Parallel generation complete: ${successful}/${results.length} successful in ${totalDurationMs}ms`);\n\n return {\n results,\n totalDurationMs,\n aggregateLogs,\n summary: {\n total: results.length,\n successful,\n failed,\n totalTokens,\n },\n };\n}\n\n// ============================================================================\n// Decomposition (For Main Agent Use)\n// ============================================================================\n\n/**\n * Options for decomposing requests into orbitals.\n */\nexport interface DecomposeOptions {\n /** Maximum tokens for generation */\n maxTokens?: number;\n /** Optional extracted requirements from analysis phase */\n requirements?: ExtractedRequirements;\n}\n\n/**\n * Decompose a user request into OrbitalUnits using LLM.\n *\n * This is typically called by the MAIN AGENT before delegating\n * to subagents for full orbital generation.\n *\n * @example\n * ```typescript\n * // Without requirements (existing behavior):\n * const orbitals = await decomposeToOrbitals(client, \"Build a task manager\");\n *\n * // With requirements (from analysis phase):\n * const orbitals = await decomposeToOrbitals(client, \"Build a task manager\", {\n * requirements: { entities: [\"Task\"], guards: [\"only admins can delete\"], ... }\n * });\n *\n * // Then generate all orbitals in parallel:\n * const result = await generateFullOrbitalsParallel(client, orbitals);\n * ```\n */\nexport async function decomposeToOrbitals(\n client: LLMClient,\n userRequest: string,\n options: DecomposeOptions = {}\n): Promise<OrbitalUnit[]> {\n const { maxTokens = 4096, requirements } = options;\n\n // Use requirements-aware prompt if requirements provided\n const systemPrompt = requirements\n ? getRequirementsAwareDecompositionPrompt(requirements)\n : getOrbitalDecompositionPrompt();\n\n const userPrompt = `Decompose this application request into Orbital Units:\n\n${userRequest}\n\nReturn a JSON array of OrbitalUnit objects.`;\n\n const result = await client.call({\n systemPrompt,\n userPrompt,\n maxTokens,\n skipSchemaValidation: true,\n });\n\n return result as OrbitalUnit[];\n}\n\n/**\n * Build a requirements-aware decomposition prompt.\n */\nfunction getRequirementsAwareDecompositionPrompt(requirements: ExtractedRequirements): string {\n const basePrompt = getOrbitalDecompositionPrompt();\n const requirementsGuidance = getRequirementsDecomposePrompt();\n\n const requirementsList = `\n## Extracted Requirements (Use These!)\n\n### Entities to Create\n${requirements.entities.length > 0 ? requirements.entities.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### States (Map to State Machines)\n${requirements.states.length > 0 ? requirements.states.map(s => `- ${s}`).join('\\n') : '- (none specified)'}\n\n### Events (Map to Transitions)\n${requirements.events.length > 0 ? requirements.events.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### Guards (Map to Transition Guards)\n${requirements.guards.length > 0 ? requirements.guards.map(g => `- ${g}`).join('\\n') : '- (none specified)'}\n\n### Effects (Map to Transition Effects)\n${requirements.effects.length > 0 ? requirements.effects.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### Pages (Map to Page Definitions)\n${requirements.pages.length > 0 ? requirements.pages.map(p => `- ${p}`).join('\\n') : '- (none specified)'}\n\nUse these requirements to:\n1. Create one OrbitalUnit per primary entity in the list\n2. Distribute guards to relevant orbitals\n3. Distribute effects to relevant orbitals\n4. Ensure state machines cover the required states\n`;\n\n return `${basePrompt}\n\n---\n\n${requirementsGuidance}\n\n---\n\n${requirementsList}`;\n}\n\n/**\n * Build a requirements-aware full orbital generation prompt.\n */\nfunction getRequirementsAwareFullOrbitalPrompt(requirements: Partial<ExtractedRequirements>): string {\n const basePrompt = getFullOrbitalPrompt();\n const requirementsGuidance = getRequirementsTraitPrompt();\n\n const sections: string[] = [];\n\n if (requirements.guards && requirements.guards.length > 0) {\n sections.push(`### Guards to Implement\n${requirements.guards.map(g => `- ${g}`).join('\\n')}\n\nConvert these to \\`guard\\` expressions on transitions with \\`guardError\\` messages.`);\n }\n\n if (requirements.effects && requirements.effects.length > 0) {\n sections.push(`### Effects to Implement\n${requirements.effects.map(e => `- ${e}`).join('\\n')}\n\nConvert these to \\`effects\\` arrays on transitions (emit_event or call_service).`);\n }\n\n if (requirements.states && requirements.states.length > 0) {\n sections.push(`### States to Include\n${requirements.states.map(s => `- ${s}`).join('\\n')}\n\nUse these exact states in the state machine. First is initial, identify final states.`);\n }\n\n if (requirements.events && requirements.events.length > 0) {\n sections.push(`### Events to Include\n${requirements.events.map(e => `- ${e}`).join('\\n')}\n\nUse these event names in transitions.`);\n }\n\n if (sections.length === 0) {\n return basePrompt;\n }\n\n return `${basePrompt}\n\n---\n\n${requirementsGuidance}\n\n---\n\n## Requirements for This Orbital\n\n${sections.join('\\n\\n')}\n`;\n}\n\n// ============================================================================\n// Cache Statistics\n// ============================================================================\n\n/**\n * Estimate cache savings for a set of orbitals.\n *\n * Use this to predict how much caching will help for a decomposition.\n */\nexport function estimateCacheSavings(orbitals: OrbitalUnit[]): {\n totalOrbitals: number;\n uniqueFingerprints: number;\n estimatedCacheHits: number;\n estimatedSavingsPercent: number;\n} {\n const { getCacheStats } = require('../cache/index.js');\n const stats = getCacheStats(orbitals);\n\n // Each call after the first with same fingerprint is a cache hit\n const cacheHits = stats.potentialCacheHits;\n const savingsPercent = orbitals.length > 0\n ? Math.round((cacheHits / orbitals.length) * 90) // 90% discount on cache hits\n : 0;\n\n return {\n totalOrbitals: stats.totalOrbitals,\n uniqueFingerprints: stats.uniqueFingerprints,\n estimatedCacheHits: cacheHits,\n estimatedSavingsPercent: savingsPercent,\n };\n}\n","/**\n * Orbital Subagent Tool\n *\n * Spawns nested DeepAgents for orbital generation and forwards\n * their events to the parent stream.\n * Uses @almadar/llm LLMClient directly.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { OrbitalDefinition, EntityRef } from '@almadar/core/types';\nimport { isEntityReference, AgentDomainCategorySchema } from '@almadar/core/types';\nimport { LLMClient } from '@almadar/llm';\nimport type { SSEEvent, SSEEventType } from '../api-types.js';\nimport { generateFullOrbital } from '../orbitals/generation/index.js';\n\n/**\n * Get entity name safely from EntityRef.\n */\nfunction getEntityName(entity: EntityRef): string {\n if (isEntityReference(entity)) {\n return entity.replace('.entity', '');\n }\n return entity.name;\n}\n\n// Type alias for backward compatibility\ntype OrbitalUnit = OrbitalDefinition;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type SubagentEventCallback = (\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number,\n event: {\n type: Exclude<SSEEventType, 'subagent_event'>;\n data: Record<string, unknown>;\n timestamp: number;\n },\n) => void;\n\nexport type OrbitalCompleteCallback = (\n orbital: unknown,\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number,\n) => void | Promise<void>;\n\nexport interface OrbitalRequirements {\n entities?: string[];\n states?: string[];\n events?: string[];\n guards?: string[];\n pages?: string[];\n effects?: string[];\n rawRequirements?: string[];\n}\n\nexport interface OrbitalSubagentToolOptions {\n onSubagentEvent?: SubagentEventCallback;\n onOrbitalComplete?: OrbitalCompleteCallback;\n requirements?: OrbitalRequirements;\n}\n\n// ============================================================================\n// Zod Schema\n// ============================================================================\n\nconst OrbitalInputSchema = z.object({\n orbital: z\n .object({\n name: z.string(),\n entity: z.object({\n name: z.string(),\n persistence: z.enum(['persistent', 'runtime', 'singleton', 'instance']),\n fields: z.array(\n z.object({\n name: z.string(),\n type: z.string(),\n required: z.boolean().optional(),\n }),\n ),\n }),\n traits: z.array(z.string()),\n patterns: z.array(z.string()),\n pages: z.array(\n z.object({\n name: z.string(),\n path: z.string(),\n viewType: z.string(),\n }),\n ).optional(),\n domainContext: z.object({\n request: z.string(),\n requestFragment: z.string().optional(),\n category: AgentDomainCategorySchema,\n vocabulary: z.record(z.string(), z.string()).optional(),\n }).optional(),\n design: z.object({\n style: z.enum(['minimal', 'modern', 'playful', 'data-driven', 'immersive']).optional(),\n uxHints: z.object({\n flowPattern: z.string().optional(),\n listPattern: z.string().optional(),\n formPattern: z.string().optional(),\n detailPattern: z.string().optional(),\n }).optional(),\n }).optional(),\n emits: z.array(z.string()).optional(),\n listens: z.array(\n z.object({\n event: z.string(),\n triggers: z.string(),\n }),\n ).optional(),\n relations: z.array(\n z.object({\n entity: z.string(),\n alias: z.string().optional(),\n cardinality: z.enum(['one', 'many']),\n }),\n ).optional(),\n })\n .describe('The OrbitalUnit to generate'),\n orbitalIndex: z.number().optional().describe('Index in the batch (0-based)'),\n totalOrbitals: z.number().optional().describe('Total orbitals in the batch'),\n});\n\n// ============================================================================\n// Tool Factory\n// ============================================================================\n\n/**\n * Create a tool for generating orbitals with subagent event streaming.\n * Uses @almadar/llm LLMClient directly.\n */\nexport function createOrbitalSubagentTool(\n options: OrbitalSubagentToolOptions = {},\n) {\n let eventCallback: SubagentEventCallback | undefined = options.onSubagentEvent;\n let completeCallback: OrbitalCompleteCallback | undefined = options.onOrbitalComplete;\n const requirements = options.requirements;\n\n const setEventCallback = (callback: SubagentEventCallback) => {\n eventCallback = callback;\n };\n\n const setOrbitalCompleteCallback = (callback: OrbitalCompleteCallback) => {\n completeCallback = callback;\n };\n\n const emitEvent = (\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number,\n type: Exclude<SSEEventType, 'subagent_event'>,\n data: Record<string, unknown>,\n ) => {\n if (eventCallback) {\n eventCallback(orbitalName, orbitalIndex, totalOrbitals, {\n type,\n data,\n timestamp: Date.now(),\n });\n }\n };\n\n const orbitalTool = tool(\n async ({ orbital, orbitalIndex = 0, totalOrbitals = 1 }) => {\n if (!orbital) {\n const errorMsg = 'Missing required parameter: orbital.';\n return JSON.stringify({ success: false, error: errorMsg, orbital: null });\n }\n\n const orbitalUnit = orbital as OrbitalUnit;\n\n if (!orbitalUnit.entity || !orbitalUnit.name) {\n const errorMsg = `Invalid orbital: missing required fields (name: ${orbitalUnit.name}, entity: ${orbitalUnit.entity}).`;\n return JSON.stringify({ success: false, error: errorMsg, orbital: orbitalUnit.name || 'unknown' });\n }\n\n try {\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'message', {\n content: `Starting generation for orbital: ${orbitalUnit.name}${requirements ? ' (with requirements from analysis)' : ''}`,\n role: 'assistant',\n isComplete: false,\n });\n\n if (requirements) {\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: 'info',\n message: 'Using requirements from analysis phase',\n data: {\n guards: requirements.guards?.length ?? 0,\n effects: requirements.effects?.length ?? 0,\n states: requirements.states?.length ?? 0,\n },\n orbitalName: orbitalUnit.name,\n });\n }\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze orbital structure', status: 'in_progress' },\n { id: 'generate', task: 'Generate full schema', status: 'pending' },\n { id: 'validate', task: 'Validate output', status: 'pending' },\n ],\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'message', {\n content: `Analyzing entity: ${getEntityName(orbitalUnit.entity)} with ${orbitalUnit.traits.length} traits`,\n role: 'assistant',\n isComplete: false,\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze orbital structure', status: 'completed' },\n { id: 'generate', task: 'Generate full schema', status: 'in_progress' },\n { id: 'validate', task: 'Validate output', status: 'pending' },\n ],\n });\n\n // Use @almadar/llm directly\n const client = new LLMClient({\n provider: 'anthropic',\n model: 'claude-sonnet-4-20250514',\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'tool_call', {\n tool: 'llm_generate',\n args: {\n orbital: orbitalUnit.name,\n entity: getEntityName(orbitalUnit.entity),\n traits: orbitalUnit.traits,\n },\n });\n\n const result = await generateFullOrbital(client, orbitalUnit, {\n validate: true,\n requirements,\n onLog: (log) => {\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: log.level,\n message: log.message,\n data: log.data,\n orbitalName: orbitalUnit.name,\n });\n },\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'tool_result', {\n tool: 'llm_generate',\n result: {\n fingerprint: result.fingerprint,\n usedTemplate: result.usedTemplate,\n usage: result.usage,\n },\n success: true,\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze orbital structure', status: 'completed' },\n { id: 'generate', task: 'Generate full schema', status: 'completed' },\n { id: 'validate', task: 'Validate output', status: 'in_progress' },\n ],\n });\n\n const finalOrbital = result.orbital;\n const finalValidation = result.validation;\n\n if (finalValidation) {\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'tool_result', {\n tool: 'validate_orbital',\n result: finalValidation,\n success: finalValidation.valid,\n });\n }\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze orbital structure', status: 'completed' },\n { id: 'generate', task: 'Generate full schema', status: 'completed' },\n { id: 'validate', task: 'Validate output', status: 'completed' },\n ],\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'message', {\n content: `Generated orbital: ${orbitalUnit.name} (${result.usage?.totalTokens ?? 0} tokens)`,\n role: 'assistant',\n isComplete: true,\n });\n\n if (completeCallback && finalOrbital) {\n try {\n await completeCallback(finalOrbital, orbitalUnit.name, orbitalIndex, totalOrbitals);\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: 'info',\n message: `Persisted orbital: ${orbitalUnit.name}`,\n orbitalName: orbitalUnit.name,\n });\n } catch (persistError) {\n console.error(`[OrbitalSubagent] Failed to persist ${orbitalUnit.name}:`, persistError);\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: 'warn',\n message: `Failed to persist orbital: ${orbitalUnit.name}`,\n data: { error: String(persistError) },\n orbitalName: orbitalUnit.name,\n });\n }\n }\n\n return JSON.stringify({\n success: true,\n orbital: finalOrbital,\n fingerprint: result.fingerprint,\n usage: result.usage,\n validation: result.validation,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'error', {\n error: errorMessage,\n code: 'ORBITAL_GENERATION_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessage,\n orbital: orbitalUnit.name,\n });\n }\n },\n {\n name: 'generate_orbital',\n description: `Generate a full orbital schema from an OrbitalUnit.\n\nSpawns a subagent to expand a lightweight OrbitalUnit into a complete\nFullOrbitalUnit with all sections, layouts, and configurations.\n\nUSAGE:\n1. Decompose user request into OrbitalUnits\n2. For each orbital, call generate_orbital with embedded context\n3. Collect results and merge into final schema`,\n schema: OrbitalInputSchema,\n },\n );\n\n return {\n tool: orbitalTool,\n setEventCallback,\n setOrbitalCompleteCallback,\n };\n}\n\n/**\n * Create a helper to wrap subagent events into SSE format.\n */\nexport function createSubagentEventWrapper(\n writeEvent: (event: SSEEvent) => void,\n): SubagentEventCallback {\n return (orbitalName, orbitalIndex, totalOrbitals, event) => {\n const sseEvent: SSEEvent = {\n type: 'subagent_event',\n timestamp: Date.now(),\n data: {\n orbitalName,\n orbitalIndex,\n totalOrbitals,\n event,\n },\n };\n writeEvent(sseEvent);\n };\n}\n","/**\n * Trait Subagent Tool\n *\n * Generates custom trait definitions for orbital schemas.\n * Uses @almadar/llm LLMClient directly.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { Trait } from '@almadar/core/types';\nimport { LLMClient } from '@almadar/llm';\nimport type { SSEEventType } from '../api-types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type TraitEventCallback = (\n traitName: string,\n traitIndex: number,\n totalTraits: number,\n event: {\n type: Exclude<SSEEventType, 'subagent_event'>;\n data: Record<string, unknown>;\n timestamp: number;\n }\n) => void;\n\nexport type TraitCompleteCallback = (\n trait: Trait,\n traitName: string,\n traitIndex: number,\n totalTraits: number\n) => void | Promise<void>;\n\nexport interface TraitSubagentToolOptions {\n onTraitEvent?: TraitEventCallback;\n onTraitComplete?: TraitCompleteCallback;\n}\n\nexport interface TraitSpec {\n name: string;\n description: string;\n category?: string;\n states?: string[];\n events?: string[];\n requiredFields?: Array<{\n name: string;\n type: string;\n description?: string;\n }>;\n needsTicks?: boolean;\n needsEmit?: boolean;\n needsListens?: boolean;\n}\n\n// ============================================================================\n// Trait Generation Prompt\n// ============================================================================\n\nfunction getTraitGenerationPrompt(): string {\n return `You are a Trait Generator for KFlow orbital schemas.\n\n## Your Task\n\nGenerate a complete, valid Trait definition that implements the requested behavior.\n\n## Trait Structure\n\n\\`\\`\\`typescript\ninterface Trait {\n name: string;\n description?: string;\n category?: TraitCategory;\n requiredFields?: RequiredField[];\n dataEntities?: TraitDataEntity[];\n stateMachine?: StateMachine;\n initialEffects?: Effect[];\n ticks?: TraitTick[];\n listens?: TraitEventListener[];\n}\n\\`\\`\\`\n\n## State Machine Structure\n\n\\`\\`\\`typescript\ninterface StateMachine {\n states: State[];\n events: Event[];\n transitions: Transition[];\n guards?: Guard[];\n}\n\\`\\`\\`\n\n## Best Practices\n\n1. **State Names**: Use PascalCase (e.g., \"Idle\", \"Loading\", \"Playing\")\n2. **Event Keys**: Use UPPER_SNAKE_CASE (e.g., \"START_GAME\", \"PLAYER_HIT\")\n3. **Initial State**: Always mark exactly one state as \\`isInitial: true\\`\n4. **Terminal States**: Mark end states as \\`isFinal: true\\`\n\n## Output Format\n\nReturn ONLY valid JSON matching the Trait interface. No markdown, no explanation.`;\n}\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\nconst TraitSpecSchema = z.object({\n name: z.string().describe('Name of the trait'),\n description: z.string().describe('Description of what this trait does'),\n category: z.string().optional().describe('Category'),\n states: z.array(z.string()).optional().describe('States the trait should have'),\n events: z.array(z.string()).optional().describe('Events the trait should handle'),\n requiredFields: z.array(z.object({\n name: z.string(),\n type: z.string(),\n description: z.string().optional(),\n })).optional().describe('Fields required from the linked entity'),\n needsTicks: z.boolean().optional().describe('Whether this trait needs temporal behavior'),\n needsEmit: z.boolean().optional().describe('Whether this trait emits events'),\n needsListens: z.boolean().optional().describe('Whether this trait listens for events'),\n});\n\nconst TraitInputSchema = z.object({\n traitSpec: TraitSpecSchema.describe('Specification for the trait to generate'),\n traitIndex: z.number().optional().describe('Index in the batch (0-based)'),\n totalTraits: z.number().optional().describe('Total traits in the batch'),\n});\n\n// ============================================================================\n// Tool Factory\n// ============================================================================\n\n/**\n * Create a tool for generating custom traits.\n * Uses @almadar/llm LLMClient directly.\n */\nexport function createTraitSubagentTool(\n options: TraitSubagentToolOptions = {},\n) {\n let eventCallback: TraitEventCallback | undefined = options.onTraitEvent;\n let completeCallback: TraitCompleteCallback | undefined = options.onTraitComplete;\n\n const setEventCallback = (callback: TraitEventCallback) => {\n eventCallback = callback;\n };\n\n const setTraitCompleteCallback = (callback: TraitCompleteCallback) => {\n completeCallback = callback;\n };\n\n const emitEvent = (\n traitName: string,\n traitIndex: number,\n totalTraits: number,\n type: Exclude<SSEEventType, 'subagent_event'>,\n data: Record<string, unknown>\n ) => {\n if (eventCallback) {\n eventCallback(traitName, traitIndex, totalTraits, {\n type,\n data,\n timestamp: Date.now(),\n });\n }\n };\n\n const traitTool = tool(\n async ({ traitSpec, traitIndex = 0, totalTraits = 1 }) => {\n const spec = traitSpec as TraitSpec;\n\n try {\n emitEvent(spec.name, traitIndex, totalTraits, 'message', {\n content: `Starting generation for custom trait: ${spec.name}`,\n role: 'assistant',\n isComplete: false,\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze trait requirements', status: 'in_progress' },\n { id: 'generate', task: 'Generate state machine', status: 'pending' },\n { id: 'validate', task: 'Validate trait', status: 'pending' },\n ],\n });\n\n const userPrompt = buildTraitUserPrompt(spec);\n\n emitEvent(spec.name, traitIndex, totalTraits, 'message', {\n content: `Analyzing: ${spec.description}`,\n role: 'assistant',\n isComplete: false,\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze trait requirements', status: 'completed' },\n { id: 'generate', task: 'Generate state machine', status: 'in_progress' },\n { id: 'validate', task: 'Validate trait', status: 'pending' },\n ],\n });\n\n // Use @almadar/llm directly\n const client = new LLMClient({\n provider: 'anthropic',\n model: 'claude-sonnet-4-20250514',\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'tool_call', {\n tool: 'llm_generate_trait',\n args: {\n traitName: spec.name,\n states: spec.states,\n events: spec.events,\n },\n });\n\n const result = await client.call({\n systemPrompt: getTraitGenerationPrompt(),\n userPrompt,\n maxTokens: 4096,\n skipSchemaValidation: true,\n });\n\n const generatedTrait = result as Trait;\n\n emitEvent(spec.name, traitIndex, totalTraits, 'tool_result', {\n tool: 'llm_generate_trait',\n result: {\n traitName: generatedTrait.name,\n stateCount: generatedTrait.stateMachine?.states?.length ?? 0,\n transitionCount: generatedTrait.stateMachine?.transitions?.length ?? 0,\n },\n success: true,\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze trait requirements', status: 'completed' },\n { id: 'generate', task: 'Generate state machine', status: 'completed' },\n { id: 'validate', task: 'Validate trait', status: 'in_progress' },\n ],\n });\n\n const validation = validateGeneratedTrait(generatedTrait, spec);\n\n emitEvent(spec.name, traitIndex, totalTraits, 'tool_result', {\n tool: 'validate_trait',\n result: validation,\n success: validation.valid,\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze trait requirements', status: 'completed' },\n { id: 'generate', task: 'Generate state machine', status: 'completed' },\n { id: 'validate', task: 'Validate trait', status: 'completed' },\n ],\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'message', {\n content: `Generated trait: ${generatedTrait.name} with ${generatedTrait.stateMachine?.states?.length ?? 0} states`,\n role: 'assistant',\n isComplete: true,\n });\n\n if (completeCallback) {\n try {\n await completeCallback(generatedTrait, spec.name, traitIndex, totalTraits);\n } catch (persistError) {\n console.error(`[TraitSubagent] Failed to persist ${spec.name}:`, persistError);\n }\n }\n\n return JSON.stringify({\n success: true,\n trait: generatedTrait,\n validation,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n emitEvent(spec.name, traitIndex, totalTraits, 'error', {\n error: errorMessage,\n code: 'TRAIT_GENERATION_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessage,\n traitName: spec.name,\n });\n }\n },\n {\n name: 'generate_custom_trait',\n description: `Generate a custom trait definition for the orbital schema.\n\nUse this when the decomposition identifies custom traits that don't exist in the\ntrait library.`,\n schema: TraitInputSchema,\n }\n );\n\n return {\n tool: traitTool,\n setEventCallback,\n setTraitCompleteCallback,\n };\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction buildTraitUserPrompt(spec: TraitSpec): string {\n const parts: string[] = [\n `Generate a Trait definition for: **${spec.name}**`,\n '',\n `## Description`,\n spec.description,\n ];\n\n if (spec.category) {\n parts.push('', `## Category`, spec.category);\n }\n if (spec.states && spec.states.length > 0) {\n parts.push('', `## Required States`, spec.states.map(s => `- ${s}`).join('\\n'));\n }\n if (spec.events && spec.events.length > 0) {\n parts.push('', `## Events to Handle`, spec.events.map(e => `- ${e}`).join('\\n'));\n }\n if (spec.requiredFields && spec.requiredFields.length > 0) {\n parts.push(\n '', `## Required Fields from Linked Entity`,\n spec.requiredFields.map(f => `- ${f.name}: ${f.type}${f.description ? ` (${f.description})` : ''}`).join('\\n')\n );\n }\n if (spec.needsTicks) {\n parts.push('', '## Temporal Behavior', 'This trait needs tick-based updates.');\n }\n if (spec.needsEmit) {\n parts.push('', '## Event Emission', 'This trait should emit events for other traits.');\n }\n if (spec.needsListens) {\n parts.push('', '## Event Listening', 'This trait should listen for events from other traits.');\n }\n\n parts.push('', '## Output', 'Return the complete Trait definition as valid JSON.');\n\n return parts.join('\\n');\n}\n\nfunction validateGeneratedTrait(trait: Trait, spec: TraitSpec): {\n valid: boolean;\n errors: string[];\n warnings: string[];\n} {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (trait.name !== spec.name) {\n errors.push(`Trait name mismatch: expected \"${spec.name}\", got \"${trait.name}\"`);\n }\n\n if (spec.states && spec.states.length > 0) {\n if (!trait.stateMachine) {\n errors.push('State machine is required but not generated');\n } else {\n const hasInitial = trait.stateMachine.states?.some(s => s.isInitial);\n if (!hasInitial) {\n warnings.push('No initial state marked');\n }\n const stateNames = new Set(trait.stateMachine.states?.map(s => s.name) ?? []);\n for (const requiredState of spec.states) {\n if (!stateNames.has(requiredState)) {\n warnings.push(`Specified state \"${requiredState}\" not found in generated trait`);\n }\n }\n }\n }\n\n if (spec.needsTicks && (!trait.ticks || trait.ticks.length === 0)) {\n warnings.push('Temporal behavior requested but no ticks defined');\n }\n if (spec.needsListens && (!trait.listens || trait.listens.length === 0)) {\n warnings.push('Event listening requested but no listeners defined');\n }\n\n return { valid: errors.length === 0, errors, warnings };\n}\n\n/**\n * Create a helper to wrap trait events into SSE format.\n */\nexport function createTraitEventWrapper(\n writeEvent: (event: { type: string; timestamp: number; data: unknown }) => void\n): TraitEventCallback {\n return (traitName, traitIndex, totalTraits, event) => {\n writeEvent({\n type: 'subagent_event',\n timestamp: Date.now(),\n data: { traitName, traitIndex, totalTraits, event },\n });\n };\n}\n","/**\n * Construct Combined Schema Tool\n *\n * Deterministically combines generated orbitals into a single OrbitalSchema\n * without LLM involvement.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { FullOrbitalUnit } from '@almadar/core/types';\nimport { combineOrbitals } from '../orbitals/combiner/index.js';\n\n// ============================================================================\n// Tool Schema\n// ============================================================================\n\nconst FullOrbitalUnitInputSchema = z.object({\n name: z.string(),\n description: z.string().optional(),\n entity: z.object({\n name: z.string(),\n collection: z.string().optional(),\n fields: z.array(z.any()),\n timestamps: z.boolean().optional(),\n }),\n traits: z.array(z.any()),\n pages: z.array(z.any()),\n emits: z.array(z.string()).optional(),\n listens: z.array(z.any()).optional(),\n});\n\nconst CombineSchemaInputSchema = z.object({\n orbitals: z.array(FullOrbitalUnitInputSchema).optional(),\n name: z.string().optional(),\n description: z.string().optional(),\n version: z.string().optional(),\n theme: z.string().optional(),\n defaultRoute: z.string().optional(),\n validate: z.boolean().optional().default(true),\n});\n\n// ============================================================================\n// Auto-Collection Helper\n// ============================================================================\n\nasync function autoCollectOrbitals(workDir: string): Promise<FullOrbitalUnit[]> {\n const fs = await import('fs');\n const path = await import('path');\n\n const orbitalsDir = path.join(workDir, '.orbitals');\n\n if (!fs.existsSync(orbitalsDir)) {\n const files = fs.readdirSync(workDir).filter((f: string) =>\n f.endsWith('.json') && (f.startsWith('orbital-') || f.includes('orbital'))\n );\n\n if (files.length === 0) {\n throw new Error('No orbitals found. Generate orbitals first using generate_orbital, or provide them directly.');\n }\n\n return files.map((f: string) => {\n const content = fs.readFileSync(path.join(workDir, f), 'utf-8');\n return JSON.parse(content);\n });\n }\n\n const files = fs.readdirSync(orbitalsDir).filter((f: string) => f.endsWith('.json'));\n\n if (files.length === 0) {\n throw new Error('No orbitals found in .orbitals/ directory.');\n }\n\n return files.map((f: string) => {\n const content = fs.readFileSync(path.join(orbitalsDir, f), 'utf-8');\n return JSON.parse(content);\n });\n}\n\n// ============================================================================\n// Validation Cap\n// ============================================================================\n\nconst MAX_COMBINE_VALIDATION_ATTEMPTS = 3;\nlet combineValidationAttempts = 0;\n\n// ============================================================================\n// Tool Implementation\n// ============================================================================\n\n/**\n * Create the construct_combined_schema tool.\n */\nexport function createCombineSchemasTool(workDir?: string) {\n combineValidationAttempts = 0;\n\n return tool(\n async (input) => {\n let orbitals: FullOrbitalUnit[];\n\n if (input.orbitals && input.orbitals.length > 0) {\n orbitals = input.orbitals as FullOrbitalUnit[];\n } else if (workDir) {\n orbitals = await autoCollectOrbitals(workDir);\n } else {\n orbitals = await autoCollectOrbitals(process.cwd());\n }\n\n const appName = input.name ||\n (orbitals.length > 0 ? `${orbitals[0].name} Application` : 'Application');\n\n const result = combineOrbitals(orbitals, {\n name: appName,\n description: input.description,\n version: input.version,\n theme: input.theme,\n defaultRoute: input.defaultRoute,\n validate: input.validate ?? true,\n });\n\n if (result.success) {\n combineValidationAttempts = 0;\n\n return JSON.stringify({\n success: true,\n schema: result.schema,\n stats: result.stats,\n validation: result.validation ? {\n valid: result.validation.valid,\n errorCount: result.validation.errors.length,\n warningCount: result.validation.warnings.length,\n } : undefined,\n __TASK_COMPLETE__: true,\n __STOP_SIGNAL__: 'WORKFLOW_FINISHED',\n message: `✅ SCHEMA GENERATION COMPLETE. Generated ${result.stats?.totalOrbitals || orbitals.length} orbitals. ` +\n `DO NOT call any more tools.`,\n }, null, 2);\n } else {\n combineValidationAttempts++;\n\n if (combineValidationAttempts >= MAX_COMBINE_VALIDATION_ATTEMPTS) {\n return JSON.stringify({\n success: false,\n cappedValidation: true,\n validationAttempt: combineValidationAttempts,\n error: result.error,\n stats: result.stats,\n validation: result.validation ? {\n valid: result.validation.valid,\n errors: result.validation.errors.slice(0, 3),\n errorCount: result.validation.errors.length,\n } : undefined,\n __STOP_FIXING__: true,\n message: `⚠️ VALIDATION CAP REACHED (${MAX_COMBINE_VALIDATION_ATTEMPTS} attempts). STOP editing orbitals.`,\n recommendation: 'STOP_FIXING',\n }, null, 2);\n }\n\n return JSON.stringify({\n success: false,\n validationAttempt: combineValidationAttempts,\n remainingAttempts: MAX_COMBINE_VALIDATION_ATTEMPTS - combineValidationAttempts,\n error: result.error,\n stats: result.stats,\n validation: result.validation ? {\n valid: result.validation.valid,\n errors: result.validation.errors.slice(0, 5),\n errorCount: result.validation.errors.length,\n } : undefined,\n partialSchema: result.schema,\n }, null, 2);\n }\n },\n {\n name: 'construct_combined_schema',\n description: `Deterministically combine generated orbitals into a single OrbitalSchema.\n\n⚠️ IMPORTANT: This is the FINAL STEP. When this tool returns success,\nyour task is COMPLETE. Do NOT call any other tools after this succeeds.\n\nSIMPLE USAGE (RECOMMENDED):\n construct_combined_schema({})\n\nOrbitals are auto-collected from .orbitals/ directory.`,\n schema: CombineSchemaInputSchema,\n }\n );\n}\n","/**\n * Schema Chunking Tools\n *\n * Tools for extracting and merging chunks of large orbital schemas.\n * Enables LLM-driven schema updates without hitting token limits.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { randomUUID } from 'crypto';\nimport * as fs from 'fs/promises';\nimport * as fss from 'fs';\nimport * as path from 'path';\nimport type { OrbitalSchema, Trait, TraitRef, Orbital, OrbitalDefinition, EntityRef } from '@almadar/core/types';\nimport { isOrbitalDefinition, isEntityReference } from '@almadar/core/types';\n\n/**\n * Get entity name safely from EntityRef.\n */\nfunction getEntityName(entity: EntityRef | undefined): string {\n if (!entity) return 'Unknown';\n if (isEntityReference(entity)) {\n return entity.replace('.entity', '');\n }\n return entity.name;\n}\n\nconst CHUNKS_DIR = '.chunks';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface OrbitalSummary {\n name: string;\n entity: string;\n traits: string[];\n inlineTraits: string[];\n}\n\ninterface SchemaStructure {\n name: string;\n orbitals: OrbitalSummary[];\n traits: string[];\n totalSize: string;\n}\n\ninterface ChunkMeta {\n sourceFile: string;\n type: 'orbital' | 'trait' | 'inline-trait';\n orbitalIndex?: number;\n traitIndex?: number;\n inlineTraitIndex?: number;\n parentOrbitalName?: string;\n extractedAt: string;\n}\n\ninterface ChunkFile {\n meta: ChunkMeta;\n orbital?: unknown;\n referencedTraits?: unknown[];\n trait?: unknown;\n inlineTrait?: unknown;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nasync function ensureChunksDir(workspaceDir: string): Promise<string> {\n const chunksPath = path.join(workspaceDir, CHUNKS_DIR);\n try {\n await fs.mkdir(chunksPath, { recursive: true });\n } catch {\n // Directory may already exist\n }\n return chunksPath;\n}\n\nfunction getTraitInfo(traits: unknown[]): { refs: string[]; inlines: string[] } {\n const refs: string[] = [];\n const inlines: string[] = [];\n\n for (const t of traits || []) {\n if (typeof t === 'object' && t !== null) {\n if ('ref' in t && typeof (t as { ref: unknown }).ref === 'string') {\n refs.push((t as { ref: string }).ref);\n } else if ('name' in t && typeof (t as { name: unknown }).name === 'string') {\n inlines.push((t as { name: string }).name);\n }\n }\n }\n\n return { refs, inlines };\n}\n\n// ============================================================================\n// Tool: query_schema_structure\n// ============================================================================\n\nexport function createQuerySchemaStructureTool(workDir: string) {\n return tool(\n async ({ file }) => {\n const filePath = path.isAbsolute(file) ? file : path.join(workDir, file);\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const schema = JSON.parse(content) as OrbitalSchema;\n const stats = fss.statSync(filePath);\n\n const structure: SchemaStructure = {\n name: schema.name,\n orbitals: (schema.orbitals || [])\n .filter((o): o is OrbitalDefinition => isOrbitalDefinition(o))\n .map(o => {\n const { refs, inlines } = getTraitInfo(o.traits || []);\n return {\n name: o.name,\n entity: getEntityName(o.entity),\n traits: refs,\n inlineTraits: inlines,\n };\n }),\n traits: [],\n totalSize: `${Math.round(stats.size / 1024)}KB`,\n };\n\n return JSON.stringify(structure, null, 2);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return JSON.stringify({ error: `Failed to query schema structure: ${msg}` });\n }\n },\n {\n name: 'query_schema_structure',\n description: `Get a lightweight map of schema structure (names only, not content).\n\nUSE THIS FIRST before extracting chunks to understand what orbitals and traits exist.`,\n schema: z.object({\n file: z.string().describe('Path to schema file (e.g., \"schema.json\")'),\n }),\n }\n );\n}\n\n// ============================================================================\n// Tool: extract_chunk\n// ============================================================================\n\nexport function createExtractChunkTool(workDir: string) {\n return tool(\n async ({ file, type, name, parentOrbital, includeTraits = true }) => {\n const filePath = path.isAbsolute(file) ? file : path.join(workDir, file);\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const schema = JSON.parse(content) as OrbitalSchema;\n const chunkId = randomUUID().slice(0, 8);\n const chunksDir = await ensureChunksDir(workDir);\n const chunkFile = path.join(chunksDir, `chunk-${chunkId}.json`);\n\n const chunkData: ChunkFile = {\n meta: {\n sourceFile: filePath,\n type,\n extractedAt: new Date().toISOString(),\n },\n };\n\n if (type === 'orbital') {\n const orbitalIndex = schema.orbitals.findIndex(o => o.name === name);\n if (orbitalIndex === -1) {\n return JSON.stringify({ error: `Orbital \"${name}\" not found in schema` });\n }\n\n const orbital = schema.orbitals[orbitalIndex];\n chunkData.meta.orbitalIndex = orbitalIndex;\n chunkData.orbital = orbital;\n\n if (includeTraits) {\n const { refs } = getTraitInfo(orbital.traits || []);\n chunkData.referencedTraits = (orbital.traits || []).filter(t =>\n typeof t === 'object' && t !== null && 'name' in t &&\n refs.includes((t as { name: string }).name)\n );\n }\n } else if (type === 'trait') {\n return JSON.stringify({\n error: `Schema-level traits no longer exist. Use type \"inline-trait\" with parentOrbital.`,\n });\n } else if (type === 'inline-trait') {\n if (!parentOrbital) {\n return JSON.stringify({ error: 'parentOrbital is required for inline-trait extraction' });\n }\n\n const orbitalIndex = schema.orbitals.findIndex(o => o.name === parentOrbital);\n if (orbitalIndex === -1) {\n return JSON.stringify({ error: `Parent orbital \"${parentOrbital}\" not found` });\n }\n\n const orbital = schema.orbitals[orbitalIndex];\n const inlineTraitIndex = (orbital.traits || []).findIndex(t =>\n typeof t === 'object' && t !== null && 'name' in t &&\n (t as { name: string }).name === name\n );\n\n if (inlineTraitIndex === -1) {\n return JSON.stringify({ error: `Inline trait \"${name}\" not found in orbital \"${parentOrbital}\"` });\n }\n\n chunkData.meta.parentOrbitalName = parentOrbital;\n chunkData.meta.orbitalIndex = orbitalIndex;\n chunkData.meta.inlineTraitIndex = inlineTraitIndex;\n chunkData.inlineTrait = orbital.traits![inlineTraitIndex];\n }\n\n const chunkContent = JSON.stringify(chunkData, null, 2);\n await fs.writeFile(chunkFile, chunkContent);\n\n const relativeChunkFile = path.relative(workDir, chunkFile);\n\n return JSON.stringify({\n success: true,\n chunkId,\n chunkFile: relativeChunkFile,\n size: `${Math.round(chunkContent.length / 1024)}KB`,\n message: `Chunk extracted to ${relativeChunkFile}. Use edit_file then apply_chunk with chunkId \"${chunkId}\".`,\n });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return JSON.stringify({ error: `Failed to extract chunk: ${msg}` });\n }\n },\n {\n name: 'extract_chunk',\n description: `Extract a specific orbital or trait to a chunk file for editing.\n\nAfter extracting, use edit_file on the returned chunkFile path, then call apply_chunk.\n\nTypes: \"orbital\", \"inline-trait\" (requires parentOrbital).`,\n schema: z.object({\n file: z.string().describe('Path to schema file'),\n type: z.enum(['orbital', 'trait', 'inline-trait']).describe('Type of chunk to extract'),\n name: z.string().describe('Name of orbital or trait to extract'),\n parentOrbital: z.string().optional().describe('Required for inline-trait'),\n includeTraits: z.boolean().default(true).describe('For orbital: also extract referenced traits'),\n }),\n }\n );\n}\n\n// ============================================================================\n// Tool: apply_chunk\n// ============================================================================\n\nexport function createApplyChunkTool(workDir: string) {\n return tool(\n async ({ chunkId }) => {\n const chunkFileName = `chunk-${chunkId}.json`;\n const chunkFilePath = path.join(workDir, CHUNKS_DIR, chunkFileName);\n\n try {\n try {\n await fs.access(chunkFilePath);\n } catch {\n return JSON.stringify({ error: `Chunk file not found: ${chunkFileName}.` });\n }\n\n const chunkContent = await fs.readFile(chunkFilePath, 'utf-8');\n const chunkData = JSON.parse(chunkContent) as ChunkFile;\n const { meta } = chunkData;\n\n const schemaContent = await fs.readFile(meta.sourceFile, 'utf-8');\n const schema = JSON.parse(schemaContent) as OrbitalSchema;\n\n if (meta.type === 'orbital' && chunkData.orbital) {\n schema.orbitals[meta.orbitalIndex!] = chunkData.orbital as Orbital;\n\n if (chunkData.referencedTraits && Array.isArray(chunkData.referencedTraits)) {\n const orbital = schema.orbitals[meta.orbitalIndex!];\n if (orbital && isOrbitalDefinition(orbital) && orbital.traits) {\n for (const editedTrait of chunkData.referencedTraits) {\n if (typeof editedTrait === 'object' && editedTrait !== null && 'name' in editedTrait) {\n const traitName = (editedTrait as { name: string }).name;\n const idx = orbital.traits.findIndex(t =>\n typeof t === 'object' && t !== null && 'name' in t &&\n (t as { name: string }).name === traitName\n );\n if (idx !== -1) {\n orbital.traits[idx] = editedTrait as TraitRef;\n }\n }\n }\n }\n }\n }\n\n if (meta.type === 'trait' && chunkData.trait) {\n console.warn('Schema-level traits are deprecated. Trait was not applied.');\n }\n\n if (meta.type === 'inline-trait' && chunkData.inlineTrait) {\n const orbital = schema.orbitals[meta.orbitalIndex!];\n if (orbital && isOrbitalDefinition(orbital) && orbital.traits && meta.inlineTraitIndex !== undefined) {\n orbital.traits[meta.inlineTraitIndex] = chunkData.inlineTrait as TraitRef;\n }\n }\n\n const output = JSON.stringify(schema, null, 2);\n await fs.writeFile(meta.sourceFile, output);\n await fs.unlink(chunkFilePath);\n\n return JSON.stringify({\n success: true,\n message: `Changes merged into ${path.basename(meta.sourceFile)}`,\n updatedSize: `${Math.round(output.length / 1024)}KB`,\n });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return JSON.stringify({ error: `Failed to apply chunk: ${msg}` });\n }\n },\n {\n name: 'apply_chunk',\n description: `Merge an edited chunk file back into the schema.\n\nCall this AFTER editing the chunk file with edit_file.`,\n schema: z.object({\n chunkId: z.string().describe('Chunk ID from extract_chunk'),\n }),\n }\n );\n}\n\n// ============================================================================\n// Factory function\n// ============================================================================\n\nexport function createSchemaChunkingTools(workDir: string) {\n return {\n querySchemaStructure: createQuerySchemaStructureTool(workDir),\n extractChunk: createExtractChunkTool(workDir),\n applyChunk: createApplyChunkTool(workDir),\n };\n}\n","/**\n * Design Transition Tool\n *\n * Takes a single transition context (state, event, entity, design hints)\n * and produces rich render-ui effects using a focused design skill.\n *\n * Uses @almadar/llm for LLM access and @almadar/skills for the design skill.\n * Results are cached by fingerprint to avoid regenerating identical transitions.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport crypto from 'crypto';\nimport { LLMClient } from '@almadar/llm';\nimport { generateKflowDesignSkill } from '@almadar/skills';\nimport {\n buildRecommendationContext,\n recommendPatterns,\n formatRecommendationsForPrompt,\n} from '@almadar/patterns';\nimport { AgentDomainCategorySchema } from '@almadar/core/types';\nimport type { SSEEventType } from '../api-types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type DesignEventCallback = (\n transitionId: string,\n event: {\n type: Exclude<SSEEventType, 'subagent_event'>;\n data: Record<string, unknown>;\n timestamp: number;\n }\n) => void;\n\nexport interface DesignTransitionToolOptions {\n onEvent?: DesignEventCallback;\n}\n\n// ============================================================================\n// Cache\n// ============================================================================\n\ninterface DesignCacheEntry {\n effects: unknown[];\n timestamp: number;\n usage: { inputTokens: number; outputTokens: number; totalTokens: number };\n}\n\nconst designCache = new Map<string, DesignCacheEntry>();\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000;\nconst CACHE_VERSION = 1;\n\nfunction generateFingerprint(input: Record<string, unknown>): string {\n const normalized = JSON.stringify({\n version: CACHE_VERSION,\n ...input,\n });\n return crypto.createHash('sha256').update(normalized).digest('hex').slice(0, 16);\n}\n\nfunction getCached(fingerprint: string): DesignCacheEntry | null {\n const entry = designCache.get(fingerprint);\n if (!entry) return null;\n if (Date.now() - entry.timestamp > CACHE_TTL_MS) {\n designCache.delete(fingerprint);\n return null;\n }\n return entry;\n}\n\n// ============================================================================\n// Static Prompt (built once, cached by Anthropic)\n// ============================================================================\n\nlet STATIC_DESIGN_PROMPT: string | null = null;\n\nfunction getDesignSystemPrompt(): string {\n if (!STATIC_DESIGN_PROMPT) {\n const skill = generateKflowDesignSkill();\n STATIC_DESIGN_PROMPT = skill.content;\n }\n return STATIC_DESIGN_PROMPT;\n}\n\n// ============================================================================\n// User Prompt Builder\n// ============================================================================\n\n/**\n * Get pattern recommendations for a transition context.\n */\nfunction getPatternRecommendations(input: {\n from: string;\n event: string;\n slot: string;\n domainCategory?: string;\n entityFields: Array<{ name: string; type: string; values?: string[] }>;\n}) {\n const recContext = buildRecommendationContext({\n state: input.from,\n event: input.event,\n slot: input.slot as 'main' | 'modal' | 'drawer' | 'sidebar' | 'overlay',\n domainCategory: input.domainCategory,\n entityFields: input.entityFields,\n });\n return recommendPatterns(recContext, 8);\n}\n\nfunction buildDesignUserPrompt(input: {\n from: string;\n to: string;\n event: string;\n slot: string;\n entityName: string;\n entityFields: Array<{ name: string; type: string; values?: string[] }>;\n domainCategory?: string;\n vocabulary?: Record<string, string>;\n designStyle?: string;\n flowPattern?: string;\n listPattern?: string;\n formPattern?: string;\n detailPattern?: string;\n existingEffects?: unknown[];\n recommendationsSection?: string;\n}): string {\n const fieldList = input.entityFields\n .map(f => {\n let desc = ` - ${f.name}: ${f.type}`;\n if (f.values) desc += ` (values: ${f.values.join(', ')})`;\n return desc;\n })\n .join('\\n');\n\n const hints: string[] = [];\n if (input.designStyle) hints.push(`Style: ${input.designStyle}`);\n if (input.flowPattern) hints.push(`Flow: ${input.flowPattern}`);\n if (input.listPattern) hints.push(`List: ${input.listPattern}`);\n if (input.formPattern) hints.push(`Form: ${input.formPattern}`);\n if (input.detailPattern) hints.push(`Detail: ${input.detailPattern}`);\n\n const vocab = input.vocabulary\n ? Object.entries(input.vocabulary).map(([k, v]) => ` ${k} → \"${v}\"`).join('\\n')\n : '';\n\n return `Design render-ui effects for this transition:\n\n## Transition\n- **From**: ${input.from}\n- **To**: ${input.to}\n- **Event**: ${input.event}\n- **Slot**: ${input.slot}\n\n## Entity: ${input.entityName}\n${fieldList}\n\n## Domain\n- **Category**: ${input.domainCategory || 'business'}\n${vocab ? `- **Vocabulary**:\\n${vocab}` : ''}\n${hints.length > 0 ? `- **Design Hints**: ${hints.join(', ')}` : ''}\n\n${input.recommendationsSection || ''}\n\n${input.existingEffects ? `## Existing Effects (enhance these)\\n\\`\\`\\`json\\n${JSON.stringify(input.existingEffects, null, 2)}\\n\\`\\`\\`` : ''}\n\nReturn ONLY the JSON array of render-ui effect tuples.`;\n}\n\n// ============================================================================\n// Zod Schema\n// ============================================================================\n\nconst DesignTransitionSchema = z.object({\n from: z.string().describe('Source state name (e.g., \"Browsing\")'),\n to: z.string().describe('Target state name (e.g., \"Browsing\" for self-loop, \"Creating\" for transition)'),\n event: z.string().describe('Event name (e.g., \"INIT\", \"CREATE\", \"VIEW\", \"EDIT\", \"DELETE\", \"SAVE\", \"CANCEL\")'),\n slot: z.string().describe('UI slot to render into: \"main\", \"modal\", \"drawer\", \"sidebar\", \"overlay\"'),\n entityName: z.string().describe('Entity name (e.g., \"Task\", \"Order\")'),\n entityFields: z.array(z.object({\n name: z.string(),\n type: z.string(),\n values: z.array(z.string()).optional(),\n })).describe('Entity fields with types and optional enum values'),\n domainCategory: AgentDomainCategorySchema.optional()\n .describe('Domain category for pattern selection'),\n vocabulary: z.record(z.string(), z.string()).optional()\n .describe('Domain vocabulary mapping (e.g., { \"create\": \"Place Order\", \"item\": \"Order\" })'),\n designStyle: z.enum(['minimal', 'modern', 'playful', 'data-driven', 'immersive']).optional()\n .describe('Visual style hint'),\n flowPattern: z.enum(['hub-spoke', 'master-detail', 'crud-cycle', 'linear', 'role-based']).optional()\n .describe('Application flow pattern'),\n listPattern: z.enum(['entity-table', 'entity-cards', 'entity-list']).optional()\n .describe('Preferred list pattern'),\n formPattern: z.enum(['modal', 'drawer', 'page']).optional()\n .describe('Preferred form pattern'),\n detailPattern: z.enum(['drawer', 'page', 'split']).optional()\n .describe('Preferred detail view pattern'),\n existingEffects: z.array(z.any()).optional()\n .describe('Existing render-ui effects to enhance (for refinement passes)'),\n});\n\n// ============================================================================\n// Tool Factory\n// ============================================================================\n\n/**\n * Create the design_transition tool.\n *\n * Takes a transition context and returns polished render-ui effects.\n * Uses the kflow-design skill as system prompt with Anthropic cache control.\n */\nexport function createDesignTransitionTool(\n options: DesignTransitionToolOptions = {},\n) {\n let eventCallback: DesignEventCallback | undefined = options.onEvent;\n\n const setEventCallback = (callback: DesignEventCallback) => {\n eventCallback = callback;\n };\n\n const emitEvent = (\n transitionId: string,\n type: Exclude<SSEEventType, 'subagent_event'>,\n data: Record<string, unknown>\n ) => {\n if (eventCallback) {\n eventCallback(transitionId, {\n type,\n data,\n timestamp: Date.now(),\n });\n }\n };\n\n const designTransitionTool = tool(\n async (input) => {\n const transitionId = `${input.entityName}:${input.from}->${input.to}:${input.event}`;\n const fingerprint = generateFingerprint({\n from: input.from,\n to: input.to,\n event: input.event,\n slot: input.slot,\n entityName: input.entityName,\n entityFields: input.entityFields,\n domainCategory: input.domainCategory,\n designStyle: input.designStyle,\n flowPattern: input.flowPattern,\n listPattern: input.listPattern,\n });\n\n try {\n emitEvent(transitionId, 'message', {\n content: `Designing UI for ${transitionId}`,\n role: 'assistant',\n isComplete: false,\n });\n\n // Check cache\n const cached = getCached(fingerprint);\n if (cached) {\n emitEvent(transitionId, 'generation_log', {\n level: 'info',\n message: `Design cache HIT for ${transitionId}`,\n data: { fingerprint },\n });\n\n return JSON.stringify({\n success: true,\n transitionId,\n effects: cached.effects,\n cached: true,\n usage: cached.usage,\n });\n }\n\n // Get pattern recommendations and build prompts\n const recommendations = getPatternRecommendations(input);\n const recommendationsSection = formatRecommendationsForPrompt(recommendations);\n const systemPrompt = getDesignSystemPrompt();\n const userPrompt = buildDesignUserPrompt({\n ...input,\n recommendationsSection,\n });\n\n emitEvent(transitionId, 'tool_call', {\n tool: 'llm_design_transition',\n args: {\n transition: transitionId,\n slot: input.slot,\n domain: input.domainCategory,\n },\n });\n\n // Call LLM with cache control\n const client = new LLMClient({\n provider: 'anthropic',\n model: 'claude-sonnet-4-20250514',\n temperature: 0.1, // Slight creativity for design\n });\n\n const response = await client.callWithCache<string>({\n systemPrompt: '',\n systemBlocks: [{\n type: 'text',\n text: systemPrompt,\n cache_control: { type: 'ephemeral' },\n }],\n userPrompt,\n maxTokens: 4096,\n rawText: true,\n });\n\n const rawText = (response.raw || String(response.data) || '').trim();\n\n // Parse the JSON array from the response\n let effects: unknown[];\n try {\n // Strip markdown code fences if present\n const jsonText = rawText.replace(/^```(?:json)?\\n?/m, '').replace(/\\n?```$/m, '').trim();\n effects = JSON.parse(jsonText);\n if (!Array.isArray(effects)) {\n effects = [effects];\n }\n } catch {\n // If parsing fails, return the raw text for the agent to handle\n return JSON.stringify({\n success: false,\n transitionId,\n error: 'Failed to parse design output as JSON',\n rawOutput: rawText,\n });\n }\n\n const usage = {\n inputTokens: response.usage?.promptTokens || 0,\n outputTokens: response.usage?.completionTokens || 0,\n totalTokens: response.usage?.totalTokens || 0,\n };\n\n // Cache the result\n designCache.set(fingerprint, {\n effects,\n timestamp: Date.now(),\n usage,\n });\n\n emitEvent(transitionId, 'tool_result', {\n tool: 'llm_design_transition',\n result: { fingerprint, effectCount: effects.length, usage },\n success: true,\n });\n\n emitEvent(transitionId, 'message', {\n content: `Designed ${effects.length} effect(s) for ${transitionId} (${usage.totalTokens} tokens)`,\n role: 'assistant',\n isComplete: true,\n });\n\n return JSON.stringify({\n success: true,\n transitionId,\n effects,\n cached: false,\n usage,\n recommendedPatterns: recommendations.map(r => r.pattern),\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n emitEvent(transitionId, 'error', {\n error: errorMessage,\n code: 'DESIGN_TRANSITION_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n transitionId,\n error: errorMessage,\n });\n }\n },\n {\n name: 'design_transition',\n description: `Design rich render-ui effects for a single orbital transition.\n\nTakes the transition context (from/to state, event, entity, domain) and produces\npolished render-ui effects using the full pattern catalog.\n\nUSE THIS TOOL WHEN:\n- Generating INIT transitions (always compose header + stats + content)\n- Generating CREATE/EDIT transitions (form with proper fields)\n- Generating VIEW transitions (detail with tabs for related entities)\n- Enhancing existing render-ui effects that are too basic\n\nThe tool uses a specialized design skill with pattern catalog, layout composition,\nand domain-aware pattern selection to produce rich UI.\n\nRETURNS: { success, effects: [[\"render-ui\", slot, config], ...], transitionId, usage }\n\nThe effects array contains ONLY render-ui tuples. Non-UI effects (persist, emit, set)\nare NOT included — you must preserve those from the original transition.\n\nINTEGRATION: After calling this tool, use extract_chunk to get the orbital,\nreplace the render-ui effects in the target transition (keep persist/emit/set effects),\nthen apply_chunk to merge back into schema.json.`,\n schema: DesignTransitionSchema,\n }\n );\n\n return {\n tool: designTransitionTool,\n setEventCallback,\n };\n}\n\n/**\n * Create a helper to wrap design events into SSE format.\n */\nexport function createDesignEventWrapper(\n writeEvent: (event: { type: string; timestamp: number; data: unknown }) => void\n): DesignEventCallback {\n return (transitionId, event) => {\n writeEvent({\n type: 'subagent_event',\n timestamp: Date.now(),\n data: { transitionId, event },\n });\n };\n}\n","/**\n * GitHub Tools for DeepAgent\n *\n * LangChain tools that wrap GitHubIntegration operations.\n * These tools enable the agent to clone repos, create branches, commit, push, and create PRs.\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { GitHubIntegration } from '@almadar/integrations';\nimport type { IntegrationConfig } from '@almadar/integrations';\n\n/**\n * GitHub tools configuration\n */\nexport interface GitHubToolsConfig {\n /** GitHub personal access token */\n token: string;\n /** Repository owner (e.g., 'octocat') */\n owner?: string;\n /** Repository name (e.g., 'hello-world') */\n repo?: string;\n /** Working directory for git operations */\n workDir: string;\n}\n\n/**\n * Create GitHub tools for the agent\n */\nexport function createGitHubTools(config: GitHubToolsConfig) {\n const { token, owner = '', repo = '', workDir } = config;\n\n // Create GitHub integration instance\n const integrationConfig: IntegrationConfig = {\n name: 'github',\n env: {\n GITHUB_TOKEN: token,\n GITHUB_OWNER: owner,\n GITHUB_REPO: repo,\n GITHUB_WORK_DIR: workDir,\n },\n };\n\n const github = new GitHubIntegration(integrationConfig);\n\n // =========================================================================\n // Git Operations\n // =========================================================================\n\n /**\n * Clone a GitHub repository\n */\n const github_clone = tool(\n async ({ repoUrl, branch, depth }) => {\n try {\n const result = await github.execute('cloneRepo', {\n repoUrl,\n targetDir: workDir,\n branch,\n depth: depth || 1,\n });\n\n if (!result.success) {\n return `Failed to clone repository: ${result.error?.message}`;\n }\n\n return `Successfully cloned ${repoUrl} to ${workDir}${branch ? ` (branch: ${branch})` : ''}`;\n } catch (error) {\n return `Error cloning repository: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_clone',\n description: `Clone a GitHub repository into the workspace.\n\nUsage:\n- Clones the repository into the current workspace directory\n- Defaults to shallow clone (depth: 1) for faster cloning\n- Can optionally specify a branch to checkout\n\nExample:\ngithub_clone({ repoUrl: \"https://github.com/owner/repo\", branch: \"main\" })`,\n schema: z.object({\n repoUrl: z.string().describe('GitHub repository URL (e.g., https://github.com/owner/repo)'),\n branch: z.string().optional().describe('Branch to checkout (defaults to repo default branch)'),\n depth: z.number().optional().describe('Clone depth (default: 1 for shallow clone)'),\n }),\n }\n );\n\n /**\n * Create a new git branch\n */\n const github_create_branch = tool(\n async ({ branchName, baseBranch }) => {\n try {\n const result = await github.execute('createBranch', {\n branchName,\n baseBranch,\n workDir,\n });\n\n if (!result.success) {\n return `Failed to create branch: ${result.error?.message}`;\n }\n\n return `Successfully created and checked out branch: ${branchName}`;\n } catch (error) {\n return `Error creating branch: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_create_branch',\n description: `Create and checkout a new git branch.\n\nUsage:\n- Creates a new branch from the current branch or specified base branch\n- Automatically checks out the new branch\n- Branch name should follow format: feature/name, fix/name, etc.\n\nExample:\ngithub_create_branch({ branchName: \"fix/issue-42-null-pointer\" })`,\n schema: z.object({\n branchName: z.string().describe('Name of the branch to create (e.g., fix/issue-42)'),\n baseBranch: z.string().optional().describe('Base branch to create from (defaults to current branch)'),\n }),\n }\n );\n\n /**\n * Commit changes\n */\n const github_commit = tool(\n async ({ message, files }) => {\n try {\n const result = await github.execute('commit', {\n message,\n files,\n workDir,\n });\n\n if (!result.success) {\n return `Failed to commit: ${result.error?.message}`;\n }\n\n return `Successfully committed: ${message}`;\n } catch (error) {\n return `Error committing changes: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_commit',\n description: `Stage and commit changes to git.\n\nUsage:\n- Stages files (or all changes if files not specified)\n- Creates a commit with the provided message\n- Commit message should be clear and descriptive\n\nExample:\ngithub_commit({ message: \"Fix null pointer in UserService\\\\n\\\\nCloses #42\" })`,\n schema: z.object({\n message: z.string().describe('Commit message (can include multiple lines)'),\n files: z.array(z.string()).optional().describe('Specific files to commit (defaults to all changes)'),\n }),\n }\n );\n\n /**\n * Push branch to remote\n */\n const github_push = tool(\n async ({ branchName }) => {\n try {\n const result = await github.execute('push', {\n branchName,\n force: false, // Never allow force push\n workDir,\n });\n\n if (!result.success) {\n return `Failed to push: ${result.error?.message}`;\n }\n\n return `Successfully pushed branch: ${branchName}`;\n } catch (error) {\n return `Error pushing branch: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_push',\n description: `Push a branch to GitHub.\n\nUsage:\n- Pushes the specified branch to origin\n- Sets upstream tracking (-u flag)\n- Force push is NEVER allowed for safety\n\nExample:\ngithub_push({ branchName: \"fix/issue-42\" })`,\n schema: z.object({\n branchName: z.string().describe('Name of the branch to push'),\n }),\n }\n );\n\n // =========================================================================\n // GitHub API Operations\n // =========================================================================\n\n /**\n * Create a pull request\n */\n const github_create_pr = tool(\n async ({ title, body, baseBranch, headBranch, draft }) => {\n try {\n const result = await github.execute('createPR', {\n title,\n body,\n baseBranch,\n headBranch,\n draft: draft || false,\n });\n\n if (!result.success) {\n return `Failed to create pull request: ${result.error?.message}`;\n }\n\n const pr = result.data as { number: number; url: string };\n return `Successfully created PR #${pr.number}: ${pr.url}`;\n } catch (error) {\n return `Error creating pull request: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_create_pr',\n description: `Create a pull request on GitHub.\n\nUsage:\n- Creates a PR from headBranch to baseBranch\n- Title should be concise (under 70 chars)\n- Body should include:\n - Summary of changes\n - Test plan or verification steps\n - References to issues (e.g., \"Closes #42\")\n\nExample:\ngithub_create_pr({\n title: \"Fix null pointer in UserService\",\n body: \"## Summary\\\\n- Fixed null check...\\\\n\\\\nCloses #42\",\n baseBranch: \"main\",\n headBranch: \"fix/issue-42\"\n})`,\n schema: z.object({\n title: z.string().describe('PR title (concise, under 70 chars)'),\n body: z.string().describe('PR description/body (markdown supported)'),\n baseBranch: z.string().describe('Base branch (usually \"main\" or \"master\")'),\n headBranch: z.string().describe('Head branch (your feature/fix branch)'),\n draft: z.boolean().optional().describe('Create as draft PR (default: false)'),\n }),\n }\n );\n\n /**\n * List repository issues\n */\n const github_list_issues = tool(\n async ({ state, labels, limit }) => {\n try {\n const result = await github.execute('listIssues', {\n state: state || 'open',\n labels: labels || [],\n limit: limit || 30,\n });\n\n if (!result.success) {\n return `Failed to list issues: ${result.error?.message}`;\n }\n\n const data = result.data as { issues: Array<{ number: number; title: string; state: string; labels: Array<{ name: string }> }> };\n const issues = data.issues;\n\n if (issues.length === 0) {\n return 'No issues found matching the criteria.';\n }\n\n const issueList = issues\n .map((issue) => {\n const labelsStr = issue.labels.map((l) => l.name).join(', ');\n return `#${issue.number}: ${issue.title} [${issue.state}]${labelsStr ? ` (${labelsStr})` : ''}`;\n })\n .join('\\n');\n\n return `Found ${issues.length} issue(s):\\n${issueList}`;\n } catch (error) {\n return `Error listing issues: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_list_issues',\n description: `List repository issues from GitHub.\n\nUsage:\n- Lists issues with optional filters\n- Returns issue number, title, state, and labels\n- Useful for finding issues to work on\n\nExample:\ngithub_list_issues({ state: \"open\", labels: [\"bug\"], limit: 10 })`,\n schema: z.object({\n state: z.enum(['open', 'closed', 'all']).optional().describe('Issue state filter (default: \"open\")'),\n labels: z.array(z.string()).optional().describe('Filter by labels'),\n limit: z.number().optional().describe('Maximum number of issues to return (default: 30)'),\n }),\n }\n );\n\n /**\n * Get issue details\n */\n const github_get_issue = tool(\n async ({ issueNumber }) => {\n try {\n const result = await github.execute('getIssue', {\n issueNumber,\n });\n\n if (!result.success) {\n return `Failed to get issue: ${result.error?.message}`;\n }\n\n const data = result.data as {\n issue: {\n number: number;\n title: string;\n body: string | null;\n state: string;\n labels: Array<{ name: string }>;\n };\n comments: Array<{\n body: string;\n user: { login: string };\n created_at: string;\n }>;\n };\n\n const { issue, comments } = data;\n const labelsStr = issue.labels.map((l) => l.name).join(', ');\n\n let output = `Issue #${issue.number}: ${issue.title}\\n`;\n output += `State: ${issue.state}\\n`;\n if (labelsStr) {\n output += `Labels: ${labelsStr}\\n`;\n }\n output += `\\nDescription:\\n${issue.body || '(No description)'}\\n`;\n\n if (comments.length > 0) {\n output += `\\n${comments.length} Comment(s):\\n`;\n comments.forEach((comment) => {\n output += `\\n@${comment.user.login} (${comment.created_at}):\\n${comment.body}\\n`;\n });\n }\n\n return output;\n } catch (error) {\n return `Error getting issue: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_get_issue',\n description: `Get detailed information about a specific issue.\n\nUsage:\n- Retrieves issue details including description and comments\n- Useful for understanding what needs to be fixed\n- Use this before working on an issue\n\nExample:\ngithub_get_issue({ issueNumber: 42 })`,\n schema: z.object({\n issueNumber: z.number().describe('Issue number to retrieve'),\n }),\n }\n );\n\n /**\n * Get PR review comments\n */\n const github_get_pr_comments = tool(\n async ({ prNumber }) => {\n try {\n const result = await github.execute('getPRComments', {\n prNumber,\n });\n\n if (!result.success) {\n return `Failed to get PR comments: ${result.error?.message}`;\n }\n\n const data = result.data as {\n comments: Array<{\n body: string;\n user: { login: string };\n created_at: string;\n }>;\n };\n\n const comments = data.comments;\n\n if (comments.length === 0) {\n return `No comments on PR #${prNumber}`;\n }\n\n let output = `${comments.length} Comment(s) on PR #${prNumber}:\\n`;\n comments.forEach((comment) => {\n output += `\\n@${comment.user.login} (${comment.created_at}):\\n${comment.body}\\n`;\n });\n\n return output;\n } catch (error) {\n return `Error getting PR comments: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_get_pr_comments',\n description: `Get review comments on a pull request.\n\nUsage:\n- Retrieves all comments on a PR\n- Useful for addressing review feedback\n- Shows commenter and timestamp\n\nExample:\ngithub_get_pr_comments({ prNumber: 87 })`,\n schema: z.object({\n prNumber: z.number().describe('Pull request number'),\n }),\n }\n );\n\n return {\n github_clone,\n github_create_branch,\n github_commit,\n github_push,\n github_create_pr,\n github_list_issues,\n github_get_issue,\n github_get_pr_comments,\n };\n}\n\n/**\n * Create GitHub tools as array (for easy spreading into agent tools)\n */\nexport function createGitHubToolsArray(config: GitHubToolsConfig) {\n const tools = createGitHubTools(config);\n return Object.values(tools);\n}\n","/**\n * In-Memory Persistence Backend\n *\n * Provides in-memory session metadata storage for development.\n * Data is lost on process restart.\n */\n\nimport type { SessionMetadata, SessionRecord } from './types.js';\n\n// ============================================================================\n// MemorySessionBackend\n// ============================================================================\n\n/**\n * In-memory session metadata store.\n */\nexport class MemorySessionBackend {\n private sessions = new Map<string, SessionMetadata>();\n\n /**\n * Store session metadata.\n */\n store(threadId: string, metadata: SessionMetadata): void {\n this.sessions.set(threadId, metadata);\n }\n\n /**\n * Get session metadata.\n */\n get(threadId: string): SessionMetadata | undefined {\n return this.sessions.get(threadId);\n }\n\n /**\n * Delete session metadata.\n */\n delete(threadId: string): boolean {\n return this.sessions.delete(threadId);\n }\n\n /**\n * List all sessions.\n */\n list(): SessionRecord[] {\n return Array.from(this.sessions.entries()).map(([threadId, meta]) => ({\n threadId,\n ...meta,\n }));\n }\n\n /**\n * Check if a session exists.\n */\n has(threadId: string): boolean {\n return this.sessions.has(threadId);\n }\n}\n","/**\n * Firestore Checkpointer for LangGraph\n *\n * Custom implementation of BaseCheckpointSaver using Firebase Firestore.\n * This is required because LangGraph only provides Postgres/Redis savers.\n *\n * IMPORTANT: This module does NOT import firebase-admin directly.\n * The Firestore `db` instance must be injected via constructor options.\n * This keeps the @almadar/agent package free of firebase-admin as a direct dependency.\n */\n\nimport {\n BaseCheckpointSaver,\n type Checkpoint,\n type CheckpointTuple,\n type CheckpointMetadata,\n type CheckpointListOptions,\n type PendingWrite,\n} from '@langchain/langgraph-checkpoint';\nimport type { RunnableConfig } from '@langchain/core/runnables';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Minimal Firestore interface to avoid importing firebase-admin.\n * Consumers pass their own Firestore instance.\n */\nexport interface FirestoreDb {\n collection(path: string): FirestoreCollectionRef;\n batch(): FirestoreBatch;\n}\n\nexport interface FirestoreCollectionRef {\n doc(id: string): FirestoreDocRef;\n where(field: string, op: string, value: unknown): FirestoreQuery;\n orderBy(field: string, direction?: string): FirestoreQuery;\n limit(n: number): FirestoreQuery;\n}\n\nexport interface FirestoreDocRef {\n set(data: unknown): Promise<unknown>;\n get(): Promise<FirestoreDocSnapshot>;\n update(data: unknown): Promise<unknown>;\n delete(): Promise<unknown>;\n readonly ref: unknown;\n}\n\nexport interface FirestoreDocSnapshot {\n exists: boolean;\n data(): Record<string, unknown> | undefined;\n readonly ref: unknown;\n}\n\nexport interface FirestoreQuery {\n where(field: string, op: string, value: unknown): FirestoreQuery;\n orderBy(field: string, direction?: string): FirestoreQuery;\n limit(n: number): FirestoreQuery;\n startAfter(doc: unknown): FirestoreQuery;\n get(): Promise<FirestoreQuerySnapshot>;\n}\n\nexport interface FirestoreQuerySnapshot {\n empty: boolean;\n docs: FirestoreQueryDocSnapshot[];\n size: number;\n}\n\nexport interface FirestoreQueryDocSnapshot {\n data(): Record<string, unknown>;\n readonly ref: unknown;\n}\n\nexport interface FirestoreBatch {\n set(ref: unknown, data: unknown): void;\n delete(ref: unknown): void;\n commit(): Promise<unknown>;\n}\n\n/**\n * Firestore Timestamp-like interface.\n */\nexport interface FirestoreTimestamp {\n toDate(): Date;\n}\n\n/**\n * Options for FirestoreCheckpointer.\n */\nexport interface FirestoreCheckpointerOptions {\n /**\n * Firestore instance. Required — injected by consumer.\n */\n db: FirestoreDb;\n\n /**\n * Collection name for checkpoints.\n * @default 'agent_checkpoints'\n */\n checkpointsCollection?: string;\n\n /**\n * Collection name for pending writes.\n * @default 'agent_writes'\n */\n writesCollection?: string;\n}\n\n/**\n * Document structure for checkpoint storage.\n */\ninterface CheckpointDocument {\n threadId: string;\n checkpointId: string;\n parentCheckpointId?: string;\n checkpoint: Checkpoint;\n metadata: CheckpointMetadata;\n createdAt: unknown;\n updatedAt: unknown;\n}\n\n/**\n * Document structure for pending writes.\n */\ninterface WriteDocument {\n threadId: string;\n checkpointId: string;\n taskId: string;\n channel: string;\n value: unknown;\n createdAt: unknown;\n}\n\n// ============================================================================\n// FirestoreCheckpointer\n// ============================================================================\n\n/**\n * Firestore-backed checkpointer for LangGraph agents.\n *\n * Provides persistent checkpoint storage across server restarts.\n * Thread checkpoints are stored as Firestore documents.\n *\n * @example\n * ```typescript\n * import { getFirestore } from 'firebase-admin/firestore';\n *\n * const checkpointer = new FirestoreCheckpointer({\n * db: getFirestore(),\n * checkpointsCollection: 'agent_checkpoints',\n * });\n *\n * const agent = createDeepAgent({\n * // ...\n * checkpointer,\n * });\n * ```\n */\nexport class FirestoreCheckpointer extends BaseCheckpointSaver {\n private db: FirestoreDb;\n private checkpointsCollection: string;\n private writesCollection: string;\n\n constructor(options: FirestoreCheckpointerOptions) {\n super();\n this.db = options.db;\n this.checkpointsCollection = options.checkpointsCollection ?? 'agent_checkpoints';\n this.writesCollection = options.writesCollection ?? 'agent_writes';\n }\n\n /**\n * Get thread ID from config.\n */\n private getThreadId(config: RunnableConfig): string {\n const threadId = config.configurable?.thread_id;\n if (!threadId || typeof threadId !== 'string') {\n throw new Error('thread_id is required in config.configurable');\n }\n return threadId;\n }\n\n /**\n * Get checkpoint ID from config, or undefined for latest.\n */\n private getCheckpointId(config: RunnableConfig): string | undefined {\n return config.configurable?.checkpoint_id as string | undefined;\n }\n\n /**\n * Get checkpoint by config.\n */\n async getTuple(config: RunnableConfig): Promise<CheckpointTuple | undefined> {\n const threadId = this.getThreadId(config);\n const checkpointId = this.getCheckpointId(config);\n\n let query = this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId);\n\n if (checkpointId) {\n query = query.where('checkpointId', '==', checkpointId);\n } else {\n query = query.orderBy('createdAt', 'desc').limit(1);\n }\n\n const snapshot = await query.get();\n if (snapshot.empty) {\n return undefined;\n }\n\n const doc = snapshot.docs[0];\n const data = doc.data() as unknown as CheckpointDocument;\n\n // Get pending writes for this checkpoint\n const writesSnapshot = await this.db\n .collection(this.writesCollection)\n .where('threadId', '==', threadId)\n .where('checkpointId', '==', data.checkpointId)\n .get();\n\n const pendingWrites = writesSnapshot.docs.map((writeDoc) => {\n const writeData = writeDoc.data() as unknown as WriteDocument;\n return [writeData.taskId, writeData.channel, writeData.value] as [string, string, unknown];\n });\n\n // Build parent config if available\n const parentConfig = data.parentCheckpointId\n ? {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.parentCheckpointId,\n },\n }\n : undefined;\n\n return {\n config: {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.checkpointId,\n },\n },\n checkpoint: data.checkpoint,\n metadata: data.metadata,\n parentConfig,\n pendingWrites,\n };\n }\n\n /**\n * List checkpoints for a thread.\n */\n async *list(\n config: RunnableConfig,\n options?: CheckpointListOptions\n ): AsyncGenerator<CheckpointTuple> {\n const threadId = this.getThreadId(config);\n const limit = options?.limit ?? 10;\n\n let query = this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId)\n .orderBy('createdAt', 'desc')\n .limit(limit);\n\n // Apply filter if provided\n if (options?.filter) {\n for (const [key, value] of Object.entries(options.filter)) {\n query = query.where(`metadata.${key}`, '==', value);\n }\n }\n\n // Apply before cursor if provided\n if (options?.before?.configurable?.checkpoint_id) {\n const beforeDoc = await this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId)\n .where('checkpointId', '==', options.before.configurable.checkpoint_id)\n .get();\n\n if (!beforeDoc.empty) {\n query = query.startAfter(beforeDoc.docs[0]);\n }\n }\n\n const snapshot = await query.get();\n\n for (const doc of snapshot.docs) {\n const data = doc.data() as unknown as CheckpointDocument;\n\n const parentConfig = data.parentCheckpointId\n ? {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.parentCheckpointId,\n },\n }\n : undefined;\n\n yield {\n config: {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.checkpointId,\n },\n },\n checkpoint: data.checkpoint,\n metadata: data.metadata,\n parentConfig,\n };\n }\n }\n\n /**\n * Save a checkpoint.\n */\n async put(\n config: RunnableConfig,\n checkpoint: Checkpoint,\n metadata: CheckpointMetadata,\n _newVersions: Record<string, number | string>\n ): Promise<RunnableConfig> {\n const threadId = this.getThreadId(config);\n const checkpointId = checkpoint.id;\n const parentCheckpointId = this.getCheckpointId(config);\n\n const now = new Date();\n\n const docData: CheckpointDocument = {\n threadId,\n checkpointId,\n parentCheckpointId,\n checkpoint,\n metadata,\n createdAt: now,\n updatedAt: now,\n };\n\n // Use checkpointId as document ID for easy lookup\n const docId = `${threadId}_${checkpointId}`;\n await this.db.collection(this.checkpointsCollection).doc(docId).set(docData);\n\n return {\n configurable: {\n thread_id: threadId,\n checkpoint_id: checkpointId,\n },\n };\n }\n\n /**\n * Store pending writes for a checkpoint.\n */\n async putWrites(\n config: RunnableConfig,\n writes: PendingWrite[],\n taskId: string\n ): Promise<void> {\n const threadId = this.getThreadId(config);\n const checkpointId = this.getCheckpointId(config);\n\n if (!checkpointId) {\n throw new Error('checkpoint_id is required for putWrites');\n }\n\n const batch = this.db.batch();\n const now = new Date();\n\n for (const [idx, [channel, value]] of writes.entries()) {\n const docId = `${threadId}_${checkpointId}_${taskId}_${idx}`;\n const docRef = this.db.collection(this.writesCollection).doc(docId);\n\n const writeData: WriteDocument = {\n threadId,\n checkpointId,\n taskId,\n channel,\n value,\n createdAt: now,\n };\n\n batch.set(docRef, writeData);\n }\n\n await batch.commit();\n }\n\n /**\n * Delete all checkpoints and writes for a thread.\n */\n async deleteThread(threadId: string): Promise<void> {\n // Delete checkpoints\n const checkpointsSnapshot = await this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId)\n .get();\n\n const checkpointBatch = this.db.batch();\n for (const doc of checkpointsSnapshot.docs) {\n checkpointBatch.delete(doc.ref);\n }\n await checkpointBatch.commit();\n\n // Delete writes\n const writesSnapshot = await this.db\n .collection(this.writesCollection)\n .where('threadId', '==', threadId)\n .get();\n\n const writesBatch = this.db.batch();\n for (const doc of writesSnapshot.docs) {\n writesBatch.delete(doc.ref);\n }\n await writesBatch.commit();\n }\n}\n","/**\n * Firestore Session Store for DeepAgent\n *\n * Provides persistent session storage for skill-based agents.\n * Sessions are stored in Firestore and persist across server restarts.\n *\n * IMPORTANT: This module does NOT import firebase-admin directly.\n * The Firestore `db` instance must be injected via constructor options.\n */\n\nimport type { Session } from './types.js';\nimport type { FirestoreDb, FirestoreTimestamp } from './firestore-checkpointer.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for FirestoreSessionStore.\n */\nexport interface FirestoreSessionStoreOptions {\n /**\n * Firestore instance. Required — injected by consumer.\n */\n db: FirestoreDb;\n\n /**\n * Collection name for sessions.\n * @default 'agent_sessions'\n */\n collection?: string;\n}\n\n/**\n * Document structure for session storage.\n */\ninterface SessionDocument {\n threadId: string;\n skill: string;\n workDir: string;\n userId?: string;\n createdAt: FirestoreTimestamp;\n lastActivityAt: FirestoreTimestamp;\n}\n\n// ============================================================================\n// FirestoreSessionStore\n// ============================================================================\n\n/**\n * Firestore-backed session store for skill agents.\n *\n * @example\n * ```typescript\n * const sessionStore = new FirestoreSessionStore({ db: getFirestore() });\n *\n * await sessionStore.save({\n * threadId: 'abc-123',\n * skill: 'kflow-generating-m',\n * workDir: '/tmp/workspace',\n * createdAt: new Date(),\n * lastActivityAt: new Date(),\n * });\n *\n * const session = await sessionStore.get('abc-123');\n * ```\n */\nexport class FirestoreSessionStore {\n private db: FirestoreDb;\n private collection: string;\n\n constructor(options: FirestoreSessionStoreOptions) {\n this.db = options.db;\n this.collection = options.collection ?? 'agent_sessions';\n }\n\n /**\n * Save a session.\n */\n async save(session: Session): Promise<void> {\n const now = new Date();\n\n const docData = {\n threadId: session.threadId,\n skill: session.skill,\n workDir: session.workDir,\n userId: session.userId,\n createdAt: session.createdAt,\n lastActivityAt: now,\n };\n\n await this.db.collection(this.collection).doc(session.threadId).set(docData);\n }\n\n /**\n * Get a session by thread ID.\n */\n async get(threadId: string): Promise<Session | null> {\n const doc = await this.db.collection(this.collection).doc(threadId).get();\n\n if (!doc.exists) {\n return null;\n }\n\n const data = doc.data() as unknown as SessionDocument;\n return {\n threadId: data.threadId,\n skill: data.skill,\n workDir: data.workDir,\n userId: data.userId,\n createdAt: data.createdAt?.toDate?.() ?? new Date(data.createdAt as unknown as string),\n lastActivityAt: data.lastActivityAt?.toDate?.() ?? new Date(data.lastActivityAt as unknown as string),\n };\n }\n\n /**\n * Update session's last activity timestamp.\n */\n async touch(threadId: string): Promise<void> {\n await this.db.collection(this.collection).doc(threadId).update({\n lastActivityAt: new Date(),\n });\n }\n\n /**\n * Delete a session.\n */\n async delete(threadId: string): Promise<void> {\n await this.db.collection(this.collection).doc(threadId).delete();\n }\n\n /**\n * List sessions, optionally filtered by user ID.\n */\n async list(options?: { userId?: string; limit?: number }): Promise<Session[]> {\n let query = this.db\n .collection(this.collection)\n .orderBy('lastActivityAt', 'desc');\n\n if (options?.userId) {\n query = query.where('userId', '==', options.userId);\n }\n\n const limit = options?.limit ?? 100;\n query = query.limit(limit);\n\n const snapshot = await query.get();\n\n return snapshot.docs.map((doc) => {\n const data = doc.data() as unknown as SessionDocument;\n return {\n threadId: data.threadId,\n skill: data.skill,\n workDir: data.workDir,\n userId: data.userId,\n createdAt: data.createdAt?.toDate?.() ?? new Date(data.createdAt as unknown as string),\n lastActivityAt: data.lastActivityAt?.toDate?.() ?? new Date(data.lastActivityAt as unknown as string),\n };\n });\n }\n\n /**\n * Delete expired sessions (older than specified hours).\n */\n async deleteExpired(maxAgeHours: number = 24): Promise<number> {\n const cutoff = new Date(Date.now() - maxAgeHours * 60 * 60 * 1000);\n\n const snapshot = await this.db\n .collection(this.collection)\n .where('lastActivityAt', '<', cutoff)\n .get();\n\n const batch = this.db.batch();\n for (const doc of snapshot.docs) {\n batch.delete(doc.ref);\n }\n\n await batch.commit();\n return snapshot.size;\n }\n}\n","/**\n * Session Manager\n *\n * Unified session management API with pluggable persistence backends.\n * Supports in-memory (development) and Firestore (production) backends.\n */\n\nimport { MemorySaver } from '@langchain/langgraph';\nimport type { BaseCheckpointSaver } from '@langchain/langgraph-checkpoint';\n\nimport type { SessionMetadata, SessionRecord, PersistenceMode, Session } from '../persistence/types.js';\nimport { MemorySessionBackend } from '../persistence/memory-backend.js';\nimport { FirestoreCheckpointer, type FirestoreDb } from '../persistence/firestore-checkpointer.js';\nimport { FirestoreSessionStore } from '../persistence/firestore-session-store.js';\nimport type { MemoryManager } from '../memory/index.js';\nimport { needsCompaction, type ContextCompactionConfig } from '../context-compaction.js';\n\n// Re-export for convenience\nexport type { SessionMetadata, SessionRecord, PersistenceMode };\n\n// ============================================================================\n// Session Manager\n// ============================================================================\n\nexport interface SessionManagerOptions {\n /**\n * Persistence mode.\n * @default 'memory'\n */\n mode?: PersistenceMode;\n\n /**\n * Firestore database instance. Required when mode is 'firestore'.\n */\n firestoreDb?: FirestoreDb;\n\n /**\n * Memory manager for session-to-memory sync (GAP-002D).\n * When provided, completed sessions are recorded to orbital memory.\n */\n memoryManager?: MemoryManager;\n\n /**\n * Context compaction configuration (GAP-005).\n * When provided, enables automatic context length management.\n */\n compactionConfig?: ContextCompactionConfig;\n}\n\n/**\n * Unified session management for agent sessions.\n *\n * Handles both session metadata and LangGraph checkpointers.\n */\nexport class SessionManager {\n private mode: PersistenceMode;\n private memoryBackend: MemorySessionBackend;\n private memoryCheckpointers: Map<string, MemorySaver>;\n private firestoreCheckpointer: FirestoreCheckpointer | null = null;\n private firestoreSessionStore: FirestoreSessionStore | null = null;\n private memoryManager: MemoryManager | null = null;\n private compactionConfig: ContextCompactionConfig | null = null;\n\n constructor(options: SessionManagerOptions = {}) {\n this.mode = options.mode ?? 'memory';\n this.memoryBackend = new MemorySessionBackend();\n this.memoryCheckpointers = new Map();\n this.memoryManager = options.memoryManager ?? null;\n this.compactionConfig = options.compactionConfig ?? null;\n\n if (this.mode === 'firestore' && options.firestoreDb) {\n this.firestoreCheckpointer = new FirestoreCheckpointer({ db: options.firestoreDb });\n this.firestoreSessionStore = new FirestoreSessionStore({ db: options.firestoreDb });\n }\n }\n\n /**\n * Get the persistence mode.\n */\n getMode(): PersistenceMode {\n return this.mode;\n }\n\n /**\n * Get or create a checkpointer for a session.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getCheckpointer(threadId: string): BaseCheckpointSaver<any> {\n if (this.mode === 'firestore' && this.firestoreCheckpointer) {\n return this.firestoreCheckpointer;\n }\n\n let checkpointer = this.memoryCheckpointers.get(threadId);\n if (!checkpointer) {\n checkpointer = new MemorySaver();\n this.memoryCheckpointers.set(threadId, checkpointer);\n }\n // Cast to BaseCheckpointSaver - MemorySaver may not implement all methods (e.g., deleteThread)\n return checkpointer as unknown as BaseCheckpointSaver<any>;\n }\n\n /**\n * Store session metadata.\n */\n store(threadId: string, metadata: SessionMetadata): void {\n // Always store in memory for sync access\n this.memoryBackend.store(threadId, metadata);\n\n // Also store in Firestore if that mode is active\n if (this.mode === 'firestore' && this.firestoreSessionStore) {\n const session: Session = {\n threadId,\n skill: metadata.skill,\n workDir: metadata.workDir,\n createdAt: new Date(metadata.createdAt),\n lastActivityAt: new Date(metadata.lastActivityAt),\n };\n this.firestoreSessionStore.save(session).catch(console.error);\n }\n }\n\n /**\n * Get session metadata (sync, memory only).\n */\n get(threadId: string): SessionMetadata | undefined {\n return this.memoryBackend.get(threadId);\n }\n\n /**\n * Get session metadata (async, supports Firestore).\n */\n async getAsync(threadId: string): Promise<SessionMetadata | undefined> {\n if (this.mode === 'firestore' && this.firestoreSessionStore) {\n const session = await this.firestoreSessionStore.get(threadId);\n if (!session) return undefined;\n return {\n skill: session.skill,\n workDir: session.workDir,\n createdAt: session.createdAt.getTime(),\n lastActivityAt: session.lastActivityAt.getTime(),\n };\n }\n return this.memoryBackend.get(threadId);\n }\n\n /**\n * Clear a session's checkpointer and metadata.\n */\n clear(threadId: string): boolean {\n if (this.mode === 'firestore') {\n this.firestoreCheckpointer?.deleteThread(threadId).catch(console.error);\n this.firestoreSessionStore?.delete(threadId).catch(console.error);\n this.memoryBackend.delete(threadId);\n return true;\n }\n this.memoryBackend.delete(threadId);\n return this.memoryCheckpointers.delete(threadId);\n }\n\n /**\n * List all sessions (sync, memory only).\n */\n list(): SessionRecord[] {\n return this.memoryBackend.list();\n }\n\n /**\n * List all sessions (async, supports Firestore).\n */\n async listAsync(): Promise<SessionRecord[]> {\n if (this.mode === 'firestore' && this.firestoreSessionStore) {\n const sessions = await this.firestoreSessionStore.list();\n return sessions.map((s) => ({\n threadId: s.threadId,\n skill: s.skill,\n workDir: s.workDir,\n createdAt: s.createdAt.getTime(),\n lastActivityAt: s.lastActivityAt.getTime(),\n }));\n }\n return this.memoryBackend.list();\n }\n\n // ============================================================================\n // Session → Memory Sync (GAP-002D)\n // ============================================================================\n\n /**\n * Sync a completed session to orbital memory.\n * This enables the agent to learn from past sessions.\n *\n * @param threadId - The session thread ID\n * @param userId - The user ID for memory association\n * @param sessionData - Additional session data to record\n * @returns Promise that resolves when sync is complete\n */\n async syncSessionToMemory(\n threadId: string,\n userId: string,\n sessionData: {\n appId: string;\n inputDescription: string;\n generatedOrbital?: string;\n patternsUsed?: string[];\n entities?: string[];\n success: boolean;\n errorMessage?: string;\n },\n ): Promise<void> {\n if (!this.memoryManager) {\n console.warn('[SessionManager] No memory manager configured, skipping session sync');\n return;\n }\n\n const metadata = this.get(threadId);\n if (!metadata) {\n console.warn(`[SessionManager] Session ${threadId} not found, skipping sync`);\n return;\n }\n\n try {\n await this.memoryManager.recordGeneration(userId, {\n threadId,\n prompt: sessionData.inputDescription,\n skill: metadata.skill,\n generatedSchema: sessionData.generatedOrbital ? { name: sessionData.generatedOrbital } : undefined,\n patterns: sessionData.patternsUsed ?? [],\n entities: sessionData.entities ?? [],\n success: sessionData.success,\n completedAt: new Date(),\n });\n\n // Also update user preferences based on patterns used\n if (sessionData.patternsUsed && sessionData.patternsUsed.length > 0) {\n await this.memoryManager.updateUserPreferences(userId, {\n preferredPatterns: sessionData.patternsUsed,\n commonEntities: sessionData.entities,\n });\n }\n\n // Update project context if entities were generated\n if (sessionData.entities && sessionData.entities.length > 0) {\n await this.memoryManager.updateProjectContext(sessionData.appId, {\n userId,\n existingEntities: sessionData.entities,\n });\n }\n\n console.log(`[SessionManager] Session ${threadId} synced to memory for user ${userId}`);\n } catch (error) {\n console.error('[SessionManager] Failed to sync session to memory:', error);\n }\n }\n\n // ============================================================================\n // Interrupt → Memory Sync (GAP-003: Interrupt Memory)\n // ============================================================================\n\n /**\n * Record an interrupt decision to memory.\n * This enables learning from HITL (Human-in-the-Loop) decisions.\n *\n * @param sessionId - The session thread ID\n * @param userId - The user who made the decision\n * @param interruptData - The interrupt decision data\n * @returns Promise that resolves when sync is complete\n */\n async recordInterruptDecision(\n sessionId: string,\n userId: string,\n interruptData: {\n toolName: string;\n toolArgs: Record<string, unknown>;\n decision: 'approved' | 'rejected' | 'modified';\n modifiedArgs?: Record<string, unknown>;\n reason?: string;\n },\n ): Promise<void> {\n if (!this.memoryManager) {\n console.warn('[SessionManager] No memory manager configured, skipping interrupt sync');\n return;\n }\n\n try {\n await this.memoryManager.recordInterruptDecision(sessionId, userId, interruptData);\n console.log(`[SessionManager] Interrupt recorded for user ${userId}: ${interruptData.toolName} ${interruptData.decision}`);\n } catch (error) {\n console.error('[SessionManager] Failed to record interrupt:', error);\n }\n }\n\n /**\n * Get interrupt history for a session.\n */\n async getSessionInterrupts(sessionId: string): Promise<import('../memory/types.js').InterruptRecord[]> {\n if (!this.memoryManager) {\n return [];\n }\n return this.memoryManager.getSessionInterrupts(sessionId);\n }\n\n /**\n * Check if a tool should be auto-approved for a user.\n */\n async shouldAutoApproveTool(userId: string, toolName: string): Promise<boolean> {\n if (!this.memoryManager) {\n return false;\n }\n return this.memoryManager.shouldAutoApproveTool(userId, toolName);\n }\n\n // ============================================================================\n // Checkpoint Management (GAP-004: Checkpoint → Memory)\n // ============================================================================\n\n /**\n * Record a checkpoint to memory for learning.\n *\n * @param userId - The user who owns this checkpoint\n * @param checkpointData - Checkpoint information\n * @returns Promise that resolves when checkpoint is recorded\n */\n async recordCheckpoint(\n userId: string,\n checkpointData: {\n checkpointId: string;\n threadId: string;\n parentCheckpointId?: string;\n metadata?: Record<string, unknown>;\n },\n ): Promise<void> {\n if (!this.memoryManager) {\n console.warn('[SessionManager] No memory manager configured, skipping checkpoint record');\n return;\n }\n\n try {\n await this.memoryManager.recordCheckpoint(userId, checkpointData);\n console.log(`[SessionManager] Checkpoint ${checkpointData.checkpointId} recorded for user ${userId}`);\n } catch (error) {\n console.error('[SessionManager] Failed to record checkpoint:', error);\n }\n }\n\n /**\n * Record a rollback to a checkpoint.\n *\n * @param userId - The user who performed the rollback\n * @param checkpointId - The checkpoint rolled back to\n * @param reason - Optional reason for rollback\n * @returns Promise that resolves when rollback is recorded\n */\n async recordRollback(\n userId: string,\n checkpointId: string,\n reason?: string,\n ): Promise<void> {\n if (!this.memoryManager) {\n console.warn('[SessionManager] No memory manager configured, skipping rollback record');\n return;\n }\n\n try {\n await this.memoryManager.recordRollback(userId, checkpointId, reason);\n console.log(`[SessionManager] Rollback to ${checkpointId} recorded for user ${userId}`);\n } catch (error) {\n console.error('[SessionManager] Failed to record rollback:', error);\n }\n }\n\n /**\n * Mark a checkpoint as successful (terminal state).\n *\n * @param userId - The user who owns this checkpoint\n * @param checkpointId - The checkpoint that was successful\n * @returns Promise that resolves when success is recorded\n */\n async markCheckpointSuccessful(userId: string, checkpointId: string): Promise<void> {\n if (!this.memoryManager) {\n console.warn('[SessionManager] No memory manager configured, skipping success mark');\n return;\n }\n\n try {\n await this.memoryManager.markCheckpointSuccessful(userId, checkpointId);\n console.log(`[SessionManager] Checkpoint ${checkpointId} marked as successful for user ${userId}`);\n } catch (error) {\n console.error('[SessionManager] Failed to mark checkpoint as successful:', error);\n }\n }\n\n /**\n * Get checkpoint history for a thread.\n *\n * @param threadId - The thread to get checkpoints for\n * @returns Array of checkpoint records\n */\n async getThreadCheckpoints(threadId: string): Promise<import('../memory/types.js').CheckpointRecord[]> {\n if (!this.memoryManager) {\n return [];\n }\n return this.memoryManager.getThreadCheckpoints(threadId);\n }\n\n /**\n * Get frequently rolled-back checkpoints (problem areas).\n *\n * @param userId - The user to get problem checkpoints for\n * @param minRollbackCount - Minimum rollback count (default: 2)\n * @returns Array of checkpoint records with rollback issues\n */\n async getProblemCheckpoints(\n userId: string,\n minRollbackCount: number = 2,\n ): Promise<import('../memory/types.js').CheckpointRecord[]> {\n if (!this.memoryManager) {\n return [];\n }\n return this.memoryManager.getProblemCheckpoints(userId, minRollbackCount);\n }\n\n // ============================================================================\n // Context Compaction (GAP-005)\n // ============================================================================\n\n /**\n * Get the context compaction configuration.\n * @returns The compaction configuration or null if not configured.\n */\n getCompactionConfig(): ContextCompactionConfig | null {\n return this.compactionConfig;\n }\n\n /**\n * Check if a session's messages need compaction based on token count.\n * Uses character-based estimation for quick checks.\n *\n * @param messages - Array of messages to check\n * @returns True if compaction is recommended\n */\n shouldCompactMessages(messages: { content: string | unknown }[]): boolean {\n if (!this.compactionConfig) {\n return false;\n }\n\n const totalChars = messages.reduce((sum, msg) => {\n const content = typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content);\n return sum + content.length;\n }, 0);\n\n const estimatedTokens = totalChars / 4;\n const threshold = this.compactionConfig.maxTokens ?? 150000;\n return estimatedTokens > threshold * 0.8;\n }\n\n /**\n * Record a compaction event for a session.\n * This helps track when and why compaction occurs.\n *\n * @param threadId - The session thread ID\n * @param originalMessageCount - Number of messages before compaction\n * @param compactedMessageCount - Number of messages after compaction\n * @param reason - Reason for compaction\n */\n async recordCompaction(\n threadId: string,\n originalMessageCount: number,\n compactedMessageCount: number,\n reason?: string,\n ): Promise<void> {\n if (!this.memoryManager) {\n console.warn('[SessionManager] No memory manager configured, skipping compaction record');\n return;\n }\n\n try {\n const metadata = this.get(threadId);\n if (metadata) {\n // Store compaction info in session metadata\n const compactionInfo = {\n timestamp: Date.now(),\n originalMessageCount,\n compactedMessageCount,\n reason: reason ?? 'token_limit',\n };\n // Update metadata with compaction history\n const meta = metadata as unknown as Record<string, unknown>;\n const existingCompactions = (meta.compactions as unknown[] | undefined) ?? [];\n meta.compactions = [...existingCompactions, compactionInfo];\n this.store(threadId, metadata);\n }\n console.log(`[SessionManager] Compaction recorded for ${threadId}: ${originalMessageCount} → ${compactedMessageCount} messages`);\n } catch (error) {\n console.error('[SessionManager] Failed to record compaction:', error);\n }\n }\n\n /**\n * Get compaction history for a session.\n *\n * @param threadId - The session thread ID\n * @returns Array of compaction events\n */\n getCompactionHistory(threadId: string): Array<{\n timestamp: number;\n originalMessageCount: number;\n compactedMessageCount: number;\n reason: string;\n }> {\n const metadata = this.get(threadId);\n if (!metadata) {\n return [];\n }\n const meta = metadata as unknown as Record<string, unknown>;\n return (meta.compactions as Array<{\n timestamp: number;\n originalMessageCount: number;\n compactedMessageCount: number;\n reason: string;\n }>) ?? [];\n }\n}\n","/**\n * Interrupt Configuration\n *\n * Human-in-the-loop configuration for agent tools.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Skill metadata (minimal interface for interrupt config).\n */\nexport interface SkillMeta {\n name: string;\n allowedTools?: string[];\n}\n\n// ============================================================================\n// Interrupt Configuration\n// ============================================================================\n\n/**\n * Default interrupt configuration for tools requiring human approval.\n * Using `true` means the tool requires approval with default options.\n */\nconst DEFAULT_INTERRUPT_CONFIG: Record<string, boolean> = {\n // Shell commands always require approval\n execute: true,\n};\n\n/**\n * Get interrupt configuration for a skill.\n *\n * Default: require approval for execute tool.\n * Skills can override via frontmatter (future enhancement).\n */\nexport function getInterruptConfig(_skill: SkillMeta): Record<string, boolean> {\n const config = { ...DEFAULT_INTERRUPT_CONFIG };\n return config;\n}\n","/**\n * Skill-Based DeepAgent Factory\n *\n * Creates DeepAgent instances that use skills as the primary prompt source.\n * No custom system prompts - all agent behavior is defined through skills.\n *\n * Uses deepagents library primitives:\n * - createDeepAgent() for agent creation\n * - FilesystemBackend for file operations\n *\n * Skill loading is injected via SkillLoader functions, keeping this package\n * independent of any specific skill registry location.\n */\n\nimport { createDeepAgent, FilesystemBackend } from 'deepagents';\nimport { Command } from '@langchain/langgraph';\nimport { v4 as uuid } from 'uuid';\n\nimport {\n createAnthropicClient,\n createDeepSeekClient,\n createOpenAIClient,\n ANTHROPIC_MODELS,\n DEEPSEEK_MODELS,\n OPENAI_MODELS,\n type LLMProvider,\n} from '@almadar/llm';\n\nimport {\n createExecuteTool,\n createFinishTaskTool,\n createValidateSchemaTool,\n createOrbitalSubagentTool,\n createSchemaChunkingTools,\n createDomainOrbitalTools,\n createDesignTransitionTool,\n createGitHubToolsArray,\n type SubagentEventCallback,\n type OrbitalCompleteCallback,\n type DomainOrbitalCompleteCallback,\n} from '../tools/index.js';\n\nimport { SessionManager, type SessionMetadata } from './session-manager.js';\nimport { getInterruptConfig, type SkillMeta } from './interrupt-config.js';\nimport { MemoryManager, type UserPreference, type ProjectContext } from '../memory/index.js';\n\n// Re-export Command for resume operations\nexport { Command };\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Skill definition loaded by the consumer.\n */\nexport interface Skill {\n name: string;\n description: string;\n content: string;\n allowedTools?: string[];\n version?: string;\n references: string[];\n path?: string;\n}\n\n/**\n * Function to load a skill by name.\n */\nexport type SkillLoader = (name: string) => Skill | null;\n\n/**\n * Function to load a skill reference by skill name and ref name.\n */\nexport type SkillRefLoader = (skillName: string, refName: string) => string | null;\n\n/**\n * Options for creating a skill agent.\n */\nexport interface SkillAgentOptions {\n /** Required: The skill(s) to use. Can be a single skill or array of skills. */\n skill: string | string[];\n /** Required: Working directory for the agent */\n workDir: string;\n /** Required: Function to load skills */\n skillLoader: SkillLoader;\n /** Optional: Function to load skill references */\n skillRefLoader?: SkillRefLoader;\n /** Optional: Thread ID for session continuity */\n threadId?: string;\n /** Optional: LLM provider */\n provider?: LLMProvider;\n /** Optional: Model name */\n model?: string;\n /** Optional: Enable verbose logging */\n verbose?: boolean;\n /** Optional: Disable human-in-the-loop interrupts (for eval/testing) */\n noInterrupt?: boolean;\n /** Optional: Callback for subagent events (orbital generation) */\n onSubagentEvent?: SubagentEventCallback;\n /** Optional: Session manager instance (shared across requests) */\n sessionManager?: SessionManager;\n /** Optional: Extracted requirements from analysis phase (for orbital skill) */\n requirements?: {\n entities?: string[];\n states?: string[];\n events?: string[];\n guards?: string[];\n pages?: string[];\n effects?: string[];\n rawRequirements?: string[];\n };\n /** Optional: GitHub integration configuration */\n githubConfig?: {\n /** GitHub personal access token */\n token: string;\n /** Repository owner (e.g., 'octocat') */\n owner?: string;\n /** Repository name (e.g., 'hello-world') */\n repo?: string;\n };\n /** Optional: Memory manager for user/project memory (GAP-001) */\n memoryManager?: MemoryManager;\n /** Optional: User ID for memory lookup */\n userId?: string;\n /** Optional: App ID for project context */\n appId?: string;\n}\n\n/**\n * Result from creating a skill agent.\n */\nexport interface SkillAgentResult {\n /** The agent instance (from deepagents library) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n agent: any;\n /** Thread ID for session resumption */\n threadId: string;\n /** The loaded skill(s) - primary skill when single, all skills when multiple */\n skill: Skill;\n /** All loaded skills (same as skill when single) */\n skills: Skill[];\n /** Working directory */\n workDir: string;\n /** Orbital tool setter for wiring SSE callback (if orbital tool enabled) */\n setOrbitalEventCallback?: (callback: SubagentEventCallback) => void;\n /** Orbital tool setter for wiring persistence callback */\n setOrbitalCompleteCallback?: (callback: OrbitalCompleteCallback) => void;\n /** Domain orbital callback for lean skill Firestore persistence */\n setDomainCompleteCallback?: (callback: DomainOrbitalCompleteCallback) => void;\n /** User preferences loaded from memory (GAP-001) */\n userPreferences?: UserPreference | null;\n /** Project context loaded from memory (GAP-001) */\n projectContext?: ProjectContext | null;\n /** Memory manager instance (GAP-001) */\n memoryManager?: MemoryManager;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Base system prompt that provides core agent behavior.\n * Skill-specific instructions are appended to this.\n */\nconst BASE_SYSTEM_PROMPT = `You are a KFlow agent that helps users create and manage application schemas.\n\nYou have access to:\n- File operations (ls, read_file, write_file, edit_file) for managing files\n- Execute tool for running shell commands in your workspace\n\n## Guidelines\n\n1. **Plan First**: Think through the steps needed before executing\n2. **Work Incrementally**: Complete one step at a time, verify before moving on\n3. **Stay in Workspace**: All file operations are restricted to your workspace directory\n4. **Validate Often**: After generating schemas, validate them with orbital validate\n\n## Batch Repair Strategy (CRITICAL)\n\nWhen fixing validation errors:\n1. **Fix ALL errors at once**: Do not fix one by one. Read the validation report, identify all issues, and apply a single comprehensive fix.\n2. **Avoid Loops**: If you fix an error and it persists, STOP and rethink. Do not try the same fix twice.\n\n## ⛔ JSON FILE OPERATIONS (MANDATORY)\n\n**NEVER use \\`edit_file\\` on JSON files (schema.json, *.json).**\n\n\\`edit_file\\` on JSON causes:\n- Trailing comma errors\n- Missing bracket errors\n- Whitespace/newline corruption\n- Endless fix loops\n\n**ALWAYS use \\`write_file\\` to overwrite the ENTIRE JSON file.**\n\nWorkflow for JSON changes:\n1. Read the current file content\n2. Modify in memory (add/remove/change)\n3. Write the COMPLETE updated JSON with \\`write_file\\`\n\nThis applies to ALL JSON modifications - initial creation, adding pages, fixing errors.\n\n## Workspace\n\nYour workspace is a sandboxed directory. Use relative paths like:\n- ./schema.json (for the KFlow schema)\n- ./app (for the compiled application)\n\nAll paths are relative to your workspace root.`;\n\n// ============================================================================\n// LLM Client Factory\n// ============================================================================\n\n/**\n * Create LLM client based on provider.\n */\nfunction createLLMClient(\n provider: LLMProvider,\n model?: string,\n verbose?: boolean,\n) {\n const temperature = 0; // Deterministic for schema generation\n\n switch (provider) {\n case 'deepseek':\n if (verbose)\n console.log(`[SkillAgent] Using DeepSeek: ${model || DEEPSEEK_MODELS.CHAT}`);\n return createDeepSeekClient({\n model: model || DEEPSEEK_MODELS.CHAT,\n temperature,\n });\n\n case 'openai':\n if (verbose)\n console.log(`[SkillAgent] Using OpenAI: ${model || OPENAI_MODELS.GPT4O}`);\n return createOpenAIClient({\n model: model || OPENAI_MODELS.GPT4O,\n temperature,\n });\n\n case 'anthropic':\n default:\n if (verbose)\n console.log(`[SkillAgent] Using Anthropic: ${model || ANTHROPIC_MODELS.CLAUDE_SONNET_4_5}`);\n return createAnthropicClient({\n model: model || ANTHROPIC_MODELS.CLAUDE_SONNET_4_5,\n temperature,\n });\n }\n}\n\n// ============================================================================\n// Default Session Manager (singleton for backward compatibility)\n// ============================================================================\n\nlet defaultSessionManager: SessionManager | null = null;\n\nfunction getDefaultSessionManager(): SessionManager {\n if (!defaultSessionManager) {\n defaultSessionManager = new SessionManager();\n }\n return defaultSessionManager;\n}\n\n// ============================================================================\n// Skill Agent Factory\n// ============================================================================\n\n/**\n * Create a skill-based DeepAgent.\n *\n * Uses the specified skill's content as the system prompt.\n * When multiple skills are provided, the agent sees all skill descriptions\n * and can choose the appropriate one based on the user's request.\n *\n * @throws Error if any skill is not found\n */\nexport async function createSkillAgent(\n options: SkillAgentOptions,\n): Promise<SkillAgentResult> {\n const {\n skill: skillInput,\n workDir,\n threadId: providedThreadId,\n provider = 'anthropic',\n model,\n verbose = false,\n skillLoader,\n skillRefLoader,\n } = options;\n\n const sessions = options.sessionManager ?? getDefaultSessionManager();\n\n // 1. Normalize skill input to array\n const skillNames = Array.isArray(skillInput) ? skillInput : [skillInput];\n\n // 2. Load all skills (throws if any not found)\n const skills: Skill[] = [];\n for (const skillName of skillNames) {\n const skill = skillLoader(skillName);\n if (!skill) {\n throw new Error(\n `Skill not found: '${skillName}'. ` +\n `Run 'npm run skills:install ${skillName}' to install it, ` +\n `or 'npm run skills:list' to see available skills.`,\n );\n }\n skills.push(skill);\n\n if (verbose) {\n console.log(`[SkillAgent] Loading skill: ${skillName}`);\n console.log(`[SkillAgent] Description: ${skill.description}`);\n if (skill.allowedTools?.length) {\n console.log(`[SkillAgent] Allowed tools: ${skill.allowedTools.join(', ')}`);\n }\n }\n }\n\n // Primary skill is the first one (for backward compatibility)\n const primarySkill = skills[0];\n\n // 3. Load references for all skills\n const allReferences: string[] = [];\n if (skillRefLoader) {\n for (const skill of skills) {\n const refs = skill.references\n .map((ref) => {\n const content = skillRefLoader(skill.name, ref);\n if (content && verbose) {\n console.log(`[SkillAgent] Loaded reference: ${skill.name}/${ref}`);\n }\n return content;\n })\n .filter((ref): ref is string => ref !== null);\n allReferences.push(...refs);\n }\n }\n const references = allReferences.join('\\n\\n---\\n\\n');\n\n // 4. Assemble system prompt from skill(s)\n let skillInstructions: string;\n\n if (skills.length === 1) {\n skillInstructions = skills[0].content;\n } else {\n const skillSummaries = skills\n .map((s) => `- **${s.name}**: ${s.description}`)\n .join('\\n');\n\n const skillContents = skills\n .map((s) => `### Skill: ${s.name}\\n\\n${s.content}`)\n .join('\\n\\n---\\n\\n');\n\n skillInstructions = `## Available Skills\n\nYou have access to multiple skills. Choose the most appropriate one based on the user's request:\n\n${skillSummaries}\n\n**Selection Guidelines:**\n- Read the user's request carefully\n- Match the request to the skill that best fits (based on the descriptions above)\n- Follow that skill's instructions completely\n\n---\n\n${skillContents}`;\n }\n\n // 4.5 Load user memory and project context (GAP-001)\n let userPreferences: UserPreference | null = null;\n let projectContext: ProjectContext | null = null;\n \n if (options.memoryManager && options.userId) {\n try {\n userPreferences = await options.memoryManager.getUserPreferences(options.userId);\n \n if (userPreferences && verbose) {\n console.log(`[SkillAgent] Loaded user preferences: ${userPreferences.namingConvention} naming, ${userPreferences.preferredPatterns.length} patterns`);\n }\n \n if (options.appId) {\n projectContext = await options.memoryManager.getProjectContext(options.appId);\n \n if (projectContext && verbose) {\n console.log(`[SkillAgent] Loaded project context: ${projectContext.existingEntities.length} entities`);\n }\n }\n } catch (error) {\n console.warn('[SkillAgent] Failed to load memory:', error);\n }\n }\n \n // Build memory context section\n const memoryContext = buildMemoryContext(userPreferences, projectContext);\n\n const systemPrompt = [\n BASE_SYSTEM_PROMPT,\n '\\n## Skill Instructions\\n\\n' + skillInstructions,\n references ? '\\n## Reference Documentation\\n\\n' + references : '',\n memoryContext ? '\\n## User Context\\n\\n' + memoryContext : '',\n ]\n .filter(Boolean)\n .join('\\n');\n\n // 5. Generate or use provided thread ID\n const threadId = providedThreadId || uuid();\n\n // 6. Create LLM client\n const llmClient = createLLMClient(provider, model, verbose);\n\n // 7. Create filesystem backend with sandbox mode\n const backend = new FilesystemBackend({\n rootDir: workDir,\n virtualMode: true,\n });\n\n // 8. Create base tools\n const executeTool = createExecuteTool(workDir);\n const finishTaskTool = createFinishTaskTool(workDir);\n const validateSchemaTool = createValidateSchemaTool(workDir);\n\n // 9. Create optional orbital-specific tools\n const ORBITAL_SKILLS = ['kflow-orbitals', 'kflow-orbital-games', 'kflow-orbital-fixing'];\n const LEAN_SKILLS = ['kflow-lean-orbitals', 'kflow-lean-fixing'];\n const DESIGN_SKILLS = ['kflow-design', 'kflow-lean-design'];\n const isOrbitalSkill = primarySkill.name === 'kflow-orbitals';\n const isLeanSkill = LEAN_SKILLS.includes(primarySkill.name);\n const isDesignSkill = DESIGN_SKILLS.includes(primarySkill.name);\n const needsChunkingTools = ORBITAL_SKILLS.includes(primarySkill.name) || isDesignSkill;\n\n let orbitalTool: ReturnType<typeof createOrbitalSubagentTool>['tool'] | undefined;\n let setOrbitalEventCallback: ReturnType<typeof createOrbitalSubagentTool>['setEventCallback'] | undefined;\n let setOrbitalCompleteCallback: ReturnType<typeof createOrbitalSubagentTool>['setOrbitalCompleteCallback'] | undefined;\n\n let domainOrbitalTools: ReturnType<typeof createDomainOrbitalTools> | undefined;\n\n const chunkingTools = needsChunkingTools ? createSchemaChunkingTools(workDir) : null;\n\n if (isOrbitalSkill) {\n const orbitalResult = createOrbitalSubagentTool({\n requirements: options.requirements,\n });\n orbitalTool = orbitalResult.tool;\n setOrbitalEventCallback = orbitalResult.setEventCallback;\n setOrbitalCompleteCallback = orbitalResult.setOrbitalCompleteCallback;\n\n if (options.onSubagentEvent) {\n setOrbitalEventCallback(options.onSubagentEvent);\n }\n\n if (verbose) {\n console.log(`[SkillAgent] Orbital tools enabled for kflow-orbitals skill`);\n }\n }\n\n if (isLeanSkill) {\n domainOrbitalTools = createDomainOrbitalTools({ workDir });\n if (verbose) {\n console.log(`[SkillAgent] Domain orbital tools enabled for ${primarySkill.name} skill`);\n }\n }\n\n // Create design transition tool for design skills and all orbital skills\n const needsDesignTool = isDesignSkill || ORBITAL_SKILLS.includes(primarySkill.name);\n const designTool = needsDesignTool ? createDesignTransitionTool() : null;\n\n if (designTool && verbose) {\n console.log(`[SkillAgent] Design transition tool enabled for ${primarySkill.name} skill`);\n }\n\n // Create GitHub tools if configuration is provided\n const githubTools = options.githubConfig\n ? createGitHubToolsArray({\n token: options.githubConfig.token,\n owner: options.githubConfig.owner,\n repo: options.githubConfig.repo,\n workDir,\n })\n : null;\n\n if (githubTools && verbose) {\n console.log(`[SkillAgent] GitHub tools enabled`);\n }\n\n // 10. Build tools array based on skill type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tools: any[] = [\n executeTool,\n finishTaskTool,\n ...(isOrbitalSkill ? [] : [validateSchemaTool]),\n ...(orbitalTool ? [orbitalTool] : []),\n ...(domainOrbitalTools\n ? [\n domainOrbitalTools.generateOrbitalDomain,\n domainOrbitalTools.constructCombinedDomain,\n ]\n : []),\n ...(chunkingTools\n ? [\n chunkingTools.querySchemaStructure,\n chunkingTools.extractChunk,\n chunkingTools.applyChunk,\n ]\n : []),\n ...(designTool ? [designTool.tool] : []),\n ...(githubTools || []),\n ];\n\n // 11. Get or create checkpointer\n const checkpointer = sessions.getCheckpointer(threadId);\n\n // 12. Get interrupt configuration\n const interruptConfig = options.noInterrupt\n ? undefined\n : getInterruptConfig(primarySkill as SkillMeta);\n\n // 13. Create agent with deepagents primitives\n const agent = createDeepAgent({\n model: llmClient.getModel(),\n systemPrompt,\n backend,\n tools,\n checkpointer,\n ...(interruptConfig && { interruptOn: interruptConfig }),\n });\n\n // 14. Store session metadata\n sessions.store(threadId, {\n skill: primarySkill.name,\n workDir,\n createdAt: Date.now(),\n lastActivityAt: Date.now(),\n });\n\n if (verbose) {\n const skillNamesStr = skillNames.join(', ');\n console.log(`[SkillAgent] Created agent with skill(s): ${skillNamesStr}, threadId: ${threadId}`);\n }\n\n const setDomainCompleteCallback = domainOrbitalTools?.setCompleteCallback;\n\n return {\n agent,\n threadId,\n skill: primarySkill,\n skills,\n workDir,\n setOrbitalEventCallback,\n setOrbitalCompleteCallback,\n setDomainCompleteCallback,\n userPreferences,\n projectContext,\n memoryManager: options.memoryManager,\n };\n}\n\n// ============================================================================\n// Memory Context Helper (GAP-001)\n// ============================================================================\n\n/**\n * Build memory context string for system prompt\n */\nfunction buildMemoryContext(\n userPreferences: UserPreference | null,\n projectContext: ProjectContext | null,\n): string | null {\n const sections: string[] = [];\n\n if (userPreferences) {\n const prefs: string[] = [];\n \n if (userPreferences.namingConvention) {\n prefs.push(`- Preferred naming: ${userPreferences.namingConvention}`);\n }\n if (userPreferences.validationStyle) {\n prefs.push(`- Validation style: ${userPreferences.validationStyle}`);\n }\n if (userPreferences.preferredPatterns.length > 0) {\n prefs.push(`- Preferred patterns: ${userPreferences.preferredPatterns.join(', ')}`);\n }\n if (userPreferences.commonEntities.length > 0) {\n prefs.push(`- Commonly used entities: ${userPreferences.commonEntities.join(', ')}`);\n }\n \n if (prefs.length > 0) {\n sections.push(`### User Preferences\\n${prefs.join('\\n')}`);\n }\n }\n\n if (projectContext) {\n const ctx: string[] = [];\n \n if (projectContext.projectName) {\n ctx.push(`- Project: ${projectContext.projectName}`);\n }\n if (projectContext.domain) {\n ctx.push(`- Domain: ${projectContext.domain}`);\n }\n if (projectContext.existingEntities.length > 0) {\n ctx.push(`- Existing entities: ${projectContext.existingEntities.join(', ')}`);\n }\n if (projectContext.conventions.length > 0) {\n ctx.push(`- Project conventions: ${projectContext.conventions.join(', ')}`);\n }\n \n if (ctx.length > 0) {\n sections.push(`### Project Context\\n${ctx.join('\\n')}`);\n }\n }\n\n return sections.length > 0 ? sections.join('\\n\\n') : null;\n}\n\n/**\n * Resume a skill agent session.\n *\n * Loads the skill from session metadata and creates agent with same threadId.\n *\n * @throws Error if session not found\n */\nexport async function resumeSkillAgent(\n threadId: string,\n options: {\n verbose?: boolean;\n noInterrupt?: boolean;\n skillLoader: SkillLoader;\n skillRefLoader?: SkillRefLoader;\n sessionManager?: SessionManager;\n },\n): Promise<SkillAgentResult> {\n const sessions = options.sessionManager ?? getDefaultSessionManager();\n const metadata = sessions.get(threadId);\n if (!metadata) {\n throw new Error(\n `Session not found: '${threadId}'. ` +\n `The session may have expired or been cleared.`,\n );\n }\n\n // Update last activity\n metadata.lastActivityAt = Date.now();\n sessions.store(threadId, metadata);\n\n return createSkillAgent({\n skill: metadata.skill,\n workDir: metadata.workDir,\n threadId,\n verbose: options.verbose,\n noInterrupt: options.noInterrupt,\n skillLoader: options.skillLoader,\n skillRefLoader: options.skillRefLoader,\n sessionManager: sessions,\n });\n}\n","/**\n * Event Budget Configuration\n *\n * Prevents runaway agent loops with soft/hard event limits per skill.\n */\n\n// ============================================================================\n// Event Budget Configuration\n// ============================================================================\n\n/**\n * Event budget limits for different skills.\n * - soft: Warning threshold (agent reminded to finish up)\n * - hard: Maximum events before forced completion\n */\nexport const EVENT_BUDGETS: Record<string, { soft: number; hard: number }> = {\n // Generation skills - complex tasks\n 'kflow-generating-m': { soft: 40, hard: 60 },\n 'kflow-domain-generating': { soft: 40, hard: 60 },\n 'kflow-game-designer': { soft: 50, hard: 80 },\n\n // Editing skills - medium complexity\n 'kflow-editing-m': { soft: 30, hard: 50 },\n 'kflow-domain-editing': { soft: 30, hard: 50 },\n\n // Fixing skills - should be fast\n 'kflow-domain-fixing': { soft: 25, hard: 40 },\n 'kflow-validating': { soft: 15, hard: 25 },\n\n // Default for unknown skills\n default: { soft: 50, hard: 80 },\n};\n\n/**\n * Get event budget for a skill.\n */\nexport function getEventBudget(skillName: string): { soft: number; hard: number } {\n return EVENT_BUDGETS[skillName] || EVENT_BUDGETS['default'];\n}\n\n/**\n * Generate a budget warning message to inject into the agent.\n */\nexport function getBudgetWarningMessage(\n eventCount: number,\n budget: { soft: number; hard: number },\n): string | null {\n if (eventCount >= budget.hard) {\n return `⚠️ CRITICAL: You have reached your event budget (${budget.hard} events). You MUST complete now. Mark remaining todos complete and stop immediately.`;\n }\n if (eventCount >= budget.soft) {\n return `📊 Note: You are at ${eventCount}/${budget.hard} events. Please finish your current task efficiently. Avoid re-reading files or redundant validation.`;\n }\n return null;\n}\n"]}