@almadar/agent 1.3.1 → 1.3.3

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/orbitals/shared/constants.ts","../../src/orbitals/shared/utils.ts","../../src/orbitals/shared/index.ts","../../src/orbitals/batch/prompt-assembler.ts","../../src/orbitals/batch/concurrency.ts","../../src/orbitals/batch/batch-generator.ts","../../src/orbitals/batch/index.ts","../../src/tools/orbital-batch-subagent.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/index.ts","../../src/tools/trait-subagent.ts","../../src/tools/combine-schemas.ts","../../src/tools/schema-chunking.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","getEntityName","buildContextSection","getFullOrbitalPrompt","init_prompt_assembler","resolve","asyncMapWithConcurrency","tool","LLMClient","z","path2","fs","execAsync","promisify","exec","path3","fs2","path4","AgentDomainCategorySchema","path5","fss","isOrbitalDefinition","uuid","createOrbitalBatchSubagentTool"],"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 * Shared Constants for Orbital Generation\n *\n * Provider limits, defaults, and configuration constants.\n *\n * @packageDocumentation\n */\n\nimport type { LLMProvider } from '@almadar/llm';\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 openrouter: 5,\n};\n\n/**\n * Default batch sizes per provider (max orbitals per LLM call).\n */\nexport const PROVIDER_BATCH_SIZES: Record<LLMProvider, number> = {\n anthropic: 3, // Anthropic works well with 3 orbitals per call\n openai: 5, // OpenAI can handle more\n deepseek: 3, // Conservative for DeepSeek\n kimi: 3, // Conservative for Kimi\n openrouter: 5, // OpenRouter proxies multiple providers\n};\n\n// ============================================================================\n// Token Limits\n// ============================================================================\n\n/**\n * Maximum tokens for generation (across all providers).\n */\nexport const DEFAULT_MAX_TOKENS = 8192;\n\n/**\n * Maximum tokens for batch generation (higher for multi-orbital).\n */\nexport const BATCH_MAX_TOKENS = 12000;\n\n/**\n * Token buffer for prompt overhead.\n */\nexport const TOKEN_BUFFER = 1000;\n\n// ============================================================================\n// Retry Configuration\n// ============================================================================\n\n/**\n * Maximum retries for failed generation attempts.\n */\nexport const MAX_RETRIES = 2;\n\n/**\n * Delay between retries (ms).\n */\nexport const RETRY_DELAY_MS = 1000;\n\n// ============================================================================\n// Timing Configuration\n// ============================================================================\n\n/**\n * Timeout for single orbital generation (ms).\n */\nexport const SINGLE_GENERATION_TIMEOUT_MS = 120000; // 2 minutes\n\n/**\n * Timeout for batch generation (ms).\n */\nexport const BATCH_GENERATION_TIMEOUT_MS = 300000; // 5 minutes\n\n// ============================================================================\n// Default Values\n// ============================================================================\n\n/**\n * Default LLM provider.\n */\nexport const DEFAULT_PROVIDER: LLMProvider = 'anthropic';\n\n/**\n * Default model for generation.\n */\nexport const DEFAULT_MODEL = 'claude-sonnet-4-20250514';\n\n/**\n * Default model for batch generation.\n */\nexport const DEFAULT_BATCH_MODEL = 'claude-sonnet-4-20250514';\n\n// ============================================================================\n// Cache Configuration\n// ============================================================================\n\n/**\n * Whether to enable prompt caching by default.\n */\nexport const DEFAULT_CACHE_ENABLED = true;\n\n/**\n * Cache TTL in milliseconds (1 hour).\n */\nexport const CACHE_TTL_MS = 60 * 60 * 1000;\n","/**\n * Shared Utilities for Orbital Generation\n *\n * Common utility functions used by both sequential and batch generation.\n *\n * @packageDocumentation\n */\n\nimport type { EntityRef, Entity } from '@almadar/core/types';\nimport { isEntityReference, getTraitName } from '@almadar/core/types';\nimport type { GenerationLog } from './types.js';\n\n// ============================================================================\n// Entity Helpers\n// ============================================================================\n\n/**\n * Get entity name safely from EntityRef.\n */\nexport function 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 */\nexport function getInlineEntity(entity: EntityRef): Entity | null {\n if (isEntityReference(entity)) {\n return null;\n }\n return entity;\n}\n\n/**\n * Get persistence type for an entity.\n */\nexport function getEntityPersistence(entity: EntityRef): string {\n const inlineEntity = getInlineEntity(entity);\n return inlineEntity?.persistence || 'persistent';\n}\n\n/**\n * Get field names as comma-separated string.\n */\nexport function getFieldNames(entity: EntityRef): string {\n const inlineEntity = getInlineEntity(entity);\n if (!inlineEntity?.fields?.length) {\n return 'N/A';\n }\n return inlineEntity.fields.map((f: { name: string }) => f.name).join(', ');\n}\n\n// ============================================================================\n// Trait Helpers\n// ============================================================================\n\n/**\n * Get trait names from orbital traits array.\n */\nexport function getTraitNames(traits: Array<{ name: string } | string>): string {\n return traits.map(t => typeof t === 'string' ? t : getTraitName(t)).join(', ');\n}\n\n// ============================================================================\n// Logging Utilities\n// ============================================================================\n\n/**\n * Create a generation log entry.\n */\nexport function createLog(\n level: GenerationLog['level'],\n message: string,\n data?: Record<string, unknown>\n): GenerationLog {\n return {\n timestamp: Date.now(),\n level,\n message,\n data,\n };\n}\n\n/**\n * Log with orbital context.\n */\nexport function createOrbitalLog(\n level: GenerationLog['level'],\n orbitalName: string,\n message: string,\n data?: Record<string, unknown>\n): GenerationLog {\n return {\n timestamp: Date.now(),\n level,\n message: `[${orbitalName}] ${message}`,\n data: { orbitalName, ...data },\n };\n}\n\n// ============================================================================\n// Context Builders\n// ============================================================================\n\nimport type { OrbitalDefinition } from '@almadar/core/types';\n\n/**\n * Build context section from orbital's domainContext and design fields.\n */\nexport function 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 * Build cross-orbital connectivity section.\n */\nexport function buildConnectivitySection(orbital: OrbitalDefinition): string {\n const parts: string[] = [];\n\n if (orbital.emits?.length) {\n parts.push(`Emits: ${orbital.emits.join(', ')}`);\n }\n\n if (orbital.listens?.length) {\n parts.push(`Listens: ${orbital.listens.map(l => `${l.event}→${l.triggers}`).join(', ')}`);\n }\n\n return parts.join('\\n');\n}\n\n// ============================================================================\n// Validation Utilities\n// ============================================================================\n\n/**\n * Check if an orbital has all required fields.\n */\nexport function isValidOrbital(orbital: unknown): orbital is OrbitalDefinition {\n if (!orbital || typeof orbital !== 'object') {\n return false;\n }\n\n const o = orbital as Record<string, unknown>;\n\n // Required fields\n if (!o.name || typeof o.name !== 'string') {\n return false;\n }\n\n if (!o.entity) {\n return false;\n }\n\n // Entity must have name\n const entity = o.entity as Record<string, unknown>;\n if (!entity.name || typeof entity.name !== 'string') {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validate a batch of orbitals.\n */\nexport function validateOrbitals(orbitals: unknown[]): {\n valid: OrbitalDefinition[];\n invalid: { index: number; reason: string }[];\n} {\n const valid: OrbitalDefinition[] = [];\n const invalid: { index: number; reason: string }[] = [];\n\n for (let i = 0; i < orbitals.length; i++) {\n const orbital = orbitals[i];\n if (isValidOrbital(orbital)) {\n valid.push(orbital);\n } else {\n invalid.push({\n index: i,\n reason: 'Missing required fields (name or entity.name)',\n });\n }\n }\n\n return { valid, invalid };\n}\n\n// ============================================================================\n// Array/Collection Utilities\n// ============================================================================\n\n/**\n * Chunk an array into smaller arrays.\n */\nexport function chunkArray<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n}\n\n/**\n * Group array items by a key function.\n */\nexport function groupBy<T, K>(array: T[], keyFn: (item: T) => K): Map<K, T[]> {\n const groups = new Map<K, T[]>();\n for (const item of array) {\n const key = keyFn(item);\n const existing = groups.get(key) || [];\n existing.push(item);\n groups.set(key, existing);\n }\n return groups;\n}\n\n/**\n * Async map with concurrency limit.\n */\nexport async function asyncMapWithConcurrency<T, R>(\n items: T[],\n mapper: (item: T, index: number) => Promise<R>,\n concurrency: number\n): Promise<R[]> {\n const results: R[] = [];\n const executing: Promise<void>[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const promise = mapper(items[i], i).then(result => {\n results[i] = result;\n });\n executing.push(promise);\n\n if (executing.length >= concurrency) {\n await Promise.race(executing);\n executing.splice(executing.findIndex(p => p === promise), 1);\n }\n }\n\n await Promise.all(executing);\n return results;\n}\n\n// ============================================================================\n// Timing Utilities\n// ============================================================================\n\n/**\n * Measure execution time of an async function.\n */\nexport async function measureTime<T>(\n fn: () => Promise<T>\n): Promise<{ result: T; durationMs: number }> {\n const start = Date.now();\n const result = await fn();\n const durationMs = Date.now() - start;\n return { result, durationMs };\n}\n\n/**\n * Sleep for a specified duration.\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n// ============================================================================\n// Error Handling\n// ============================================================================\n\n/**\n * Get error message from unknown error.\n */\nexport function getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\n/**\n * Check if error is a rate limit error.\n */\nexport function isRateLimitError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n const message = error.message.toLowerCase();\n return (\n message.includes('rate limit') ||\n message.includes('too many requests') ||\n message.includes('429')\n );\n}\n\n/**\n * Check if error is a timeout error.\n */\nexport function isTimeoutError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n const message = error.message.toLowerCase();\n return (\n message.includes('timeout') ||\n message.includes('timed out') ||\n message.includes('etimedout')\n );\n}\n","/**\n * Shared Utilities for Orbital Generation\n *\n * Common types, constants, and utilities used by both sequential\n * and batch generation modules.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport {\n // Core types\n type OrbitalUnit,\n type GenerationLog,\n type ExtractedRequirements,\n // Options\n type BaseGenerationOptions,\n type OrbitalGenerationOptions,\n type ParallelGenerationOptions,\n type BatchGenerationOptions,\n // Results\n type TokenUsage,\n type ValidationResult,\n type OrbitalGenerationResult,\n type ParallelGenerationResult,\n type BatchGenerationResult,\n // Decomposition\n type DecomposeOptions,\n type DecomposeResult,\n // Batch-specific\n type OrbitalBatch,\n type BatchProgressEvent,\n} from './types.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nexport {\n PROVIDER_CONCURRENCY_LIMITS,\n PROVIDER_BATCH_SIZES,\n DEFAULT_MAX_TOKENS,\n BATCH_MAX_TOKENS,\n TOKEN_BUFFER,\n MAX_RETRIES,\n RETRY_DELAY_MS,\n SINGLE_GENERATION_TIMEOUT_MS,\n BATCH_GENERATION_TIMEOUT_MS,\n DEFAULT_PROVIDER,\n DEFAULT_MODEL,\n DEFAULT_BATCH_MODEL,\n DEFAULT_CACHE_ENABLED,\n CACHE_TTL_MS,\n} from './constants.js';\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\nexport {\n // Entity helpers\n getEntityName,\n getInlineEntity,\n getEntityPersistence,\n getFieldNames,\n // Trait helpers\n getTraitNames,\n // Logging\n createLog,\n createOrbitalLog,\n // Context builders\n buildContextSection,\n buildConnectivitySection,\n // Validation\n isValidOrbital,\n validateOrbitals,\n // Array utilities\n chunkArray,\n groupBy,\n asyncMapWithConcurrency,\n // Timing\n measureTime,\n sleep,\n // Error handling\n getErrorMessage,\n isRateLimitError,\n isTimeoutError,\n} from './utils.js';\n","/**\n * Batch Prompt Assembler\n *\n * Assembles prompts for generating multiple orbitals in a single LLM call.\n * Optimized for:\n * - Context sharing (domain vocabulary, design style)\n * - Cross-orbital references (emits/listens wiring)\n * - Token efficiency (shared system context)\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalDefinition } from '@almadar/core/types';\nimport type { AssembledPrompt } from '../cache/index.js';\nimport { computeOrbitalFingerprint } from '../cache/index.js';\nimport { getFullOrbitalPrompt } from '@almadar/skills';\nimport {\n getEntityName,\n getFieldNames,\n buildContextSection,\n buildConnectivitySection,\n chunkArray,\n} from '../shared/index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Assembled prompt for batch generation.\n */\nexport interface BatchAssembledPrompt extends AssembledPrompt {\n /** Number of orbitals in this batch */\n orbitalCount: number;\n /** Names of orbitals in this batch */\n orbitalNames: string[];\n}\n\n/**\n * Shared context extracted from a batch of orbitals.\n */\nexport interface SharedBatchContext {\n /** Domain vocabulary shared across orbitals */\n domainVocabulary?: Record<string, string>;\n /** Design style (minimal, modern, etc.) */\n designStyle?: string;\n /** Common patterns used */\n commonPatterns?: string[];\n /** Cross-orbital event relationships */\n eventRelationships?: Array<{\n emitter: string;\n event: string;\n listener: string;\n handler: string;\n }>;\n}\n\n// ============================================================================\n// Context Extraction\n// ============================================================================\n\n/**\n * Extract shared context from a batch of orbitals.\n */\nexport function extractSharedContext(orbitals: OrbitalDefinition[]): SharedBatchContext {\n const vocabulary: Record<string, string> = {};\n const styles = new Set<string>();\n const patterns = new Set<string>();\n const relationships: SharedBatchContext['eventRelationships'] = [];\n\n // Build vocabulary from all orbitals\n for (const orbital of orbitals) {\n if (orbital.domainContext?.vocabulary) {\n Object.assign(vocabulary, orbital.domainContext.vocabulary);\n }\n if (orbital.design?.style) {\n styles.add(orbital.design.style);\n }\n // Note: patterns are defined in traits, not at orbital level\n // This would need to be extracted from trait render-ui effects\n }\n\n // Build event relationships\n const orbitalMap = new Map(orbitals.map(o => [o.name, o]));\n \n for (const orbital of orbitals) {\n if (orbital.emits) {\n for (const event of orbital.emits) {\n // Find listeners for this event\n for (const other of orbitals) {\n if (other === orbital) continue;\n if (other.listens) {\n const listener = other.listens.find(l => l.event === event.event);\n if (listener) {\n relationships.push({\n emitter: orbital.name,\n event: event.event,\n listener: other.name,\n handler: listener.triggers,\n });\n }\n }\n }\n }\n }\n }\n\n return {\n domainVocabulary: Object.keys(vocabulary).length > 0 ? vocabulary : undefined,\n designStyle: styles.size === 1 ? Array.from(styles)[0] : undefined,\n commonPatterns: patterns.size > 0 ? Array.from(patterns) : undefined,\n eventRelationships: relationships.length > 0 ? relationships : undefined,\n };\n}\n\n// ============================================================================\n// Batch Prompt Assembly\n// ============================================================================\n\n/**\n * Assemble a batch prompt for generating multiple orbitals in one call.\n *\n * @example\n * ```typescript\n * const batchPrompt = assembleBatchPrompt([\n * { name: \"Products\", entity: {...}, traits: [...] },\n * { name: \"Orders\", entity: {...}, traits: [...] },\n * { name: \"Customers\", entity: {...}, traits: [...] },\n * ]);\n * // Returns a single prompt that generates all 3 orbitals\n * ```\n */\nexport function assembleBatchPrompt(\n orbitals: OrbitalDefinition[],\n options: {\n baseSystemPrompt?: string;\n includeConnectivity?: boolean;\n } = {}\n): BatchAssembledPrompt {\n const {\n baseSystemPrompt = getFullOrbitalPrompt(),\n includeConnectivity = true,\n } = options;\n\n if (orbitals.length === 0) {\n throw new Error('Cannot assemble batch prompt for empty orbitals array');\n }\n\n // Extract shared context\n const sharedContext = extractSharedContext(orbitals);\n\n // Build batch header\n const batchHeader = buildBatchHeader(orbitals, sharedContext);\n\n // Build individual orbital sections\n const orbitalSections = orbitals.map((orbital, index) =>\n buildOrbitalSection(orbital, index + 1, orbitals.length, includeConnectivity)\n );\n\n // Build output format section\n const outputSection = buildOutputSection(orbitals);\n\n // Combine all sections\n const prompt = `${baseSystemPrompt}\n\n${'='.repeat(60)}\nBATCH GENERATION: ${orbitals.length} ORBITALS\n${'='.repeat(60)}\n\n${batchHeader}\n\n${orbitalSections.join('\\n\\n')}\n\n${outputSection}`;\n\n // Generate composite fingerprint\n const fingerprint = generateBatchFingerprint(orbitals);\n\n return {\n prompt,\n fingerprint,\n usedCachedTemplate: false, // Batch doesn't use templates yet\n orbitalCount: orbitals.length,\n orbitalNames: orbitals.map(o => o.name),\n };\n}\n\n/**\n * Build the batch header with shared context.\n */\nfunction buildBatchHeader(\n orbitals: OrbitalDefinition[],\n sharedContext: SharedBatchContext\n): string {\n const lines: string[] = [\n `## Batch Overview`,\n `- Total Orbitals: ${orbitals.length}`,\n `- Orbitals: ${orbitals.map(o => o.name).join(', ')}`,\n ];\n\n if (sharedContext.designStyle) {\n lines.push(`- Design Style: ${sharedContext.designStyle}`);\n }\n\n if (sharedContext.commonPatterns?.length) {\n lines.push(`- Common Patterns: ${sharedContext.commonPatterns.join(', ')}`);\n }\n\n if (sharedContext.domainVocabulary && Object.keys(sharedContext.domainVocabulary).length > 0) {\n lines.push(`\\n## Shared Domain Vocabulary`);\n for (const [term, definition] of Object.entries(sharedContext.domainVocabulary)) {\n lines.push(`- ${term}: ${definition}`);\n }\n }\n\n if (sharedContext.eventRelationships?.length) {\n lines.push(`\\n## Cross-Orbital Event Relationships`);\n for (const rel of sharedContext.eventRelationships) {\n lines.push(`- ${rel.emitter} emits \"${rel.event}\" → ${rel.listener} handles with \"${rel.handler}\"`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Build a section for a single orbital within the batch.\n */\nfunction buildOrbitalSection(\n orbital: OrbitalDefinition,\n index: number,\n total: number,\n includeConnectivity: boolean\n): string {\n const entityName = getEntityName(orbital.entity);\n const fieldNames = getFieldNames(orbital.entity);\n const contextSection = buildContextSection(orbital);\n const connectivitySection = includeConnectivity ? buildConnectivitySection(orbital) : '';\n\n return `---\n## ORBITAL ${index}/${total}: ${orbital.name}\n\n**Entity**: ${entityName}\n**Persistence**: ${(orbital.entity as { persistence?: string }).persistence || 'persistent'}\n**Fields**: ${fieldNames}\n**Traits**: ${orbital.traits.map(t => typeof t === 'string' ? t : 'ref' in t ? t.ref : t.name).join(', ')}\n${contextSection}${connectivitySection ? `**Connectivity**:\\n${connectivitySection}\\n` : ''}\nGenerate a complete FullOrbitalUnit for ${orbital.name} with:\n- Full field definitions with types and validation\n- Trait state machines with transitions and effects\n- Business rule validation using \"guard\" 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${orbital.emits?.length ? '- PRESERVE emits: ' + orbital.emits.map(e => e.event).join(', ') : ''}\n${orbital.listens?.length ? '- PRESERVE listens: ' + orbital.listens.map(l => l.event).join(', ') : ''}`;\n}\n\n/**\n * Build the output format section.\n */\nfunction buildOutputSection(orbitals: OrbitalDefinition[]): string {\n return `---\n## OUTPUT FORMAT\n\nReturn a JSON object with this exact structure:\n\n\\`\\`\\`json\n{\n \"orbitals\": [\n${orbitals.map((o, i) => ` {\n \"name\": \"${o.name}\",\n // ... complete FullOrbitalUnit for ${o.name}\n }${i < orbitals.length - 1 ? ',' : ''}`).join('\\n')}\n ]\n}\n\\`\\`\\`\n\n**CRITICAL RULES:**\n1. Return a SINGLE JSON object with an \"orbitals\" array\n2. Each element in the array is a complete FullOrbitalUnit\n3. Maintain the order: ${orbitals.map(o => o.name).join(', ')}\n4. PRESERVE all emits/listens as specified in each orbital section\n5. Use shared domain vocabulary consistently across all orbitals\n6. Ensure cross-orbital event wiring is maintained\n`;\n}\n\n/**\n * Generate a composite fingerprint for the batch.\n */\nfunction generateBatchFingerprint(orbitals: OrbitalDefinition[]): string {\n const fingerprints = orbitals.map(o => computeOrbitalFingerprint(o));\n const combined = fingerprints.sort().join('|');\n \n // Simple hash of combined fingerprints\n let hash = 0;\n for (let i = 0; i < combined.length; i++) {\n const char = combined.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n \n return `batch:${orbitals.length}:${Math.abs(hash).toString(16).slice(0, 8)}`;\n}\n\n// ============================================================================\n// Batch Splitting\n// ============================================================================\n\n/**\n * Split orbitals into optimally-sized batches.\n *\n * Considers:\n * - Provider token limits\n * - Cross-orbital relationships (keeps related orbitals together)\n * - Batch size limits\n *\n * @example\n * ```typescript\n * const batches = splitIntoBatches(orbitals, {\n * maxBatchSize: 3,\n * provider: 'anthropic'\n * });\n * // Returns: [[orb1, orb2, orb3], [orb4, orb5], [orb6]]\n * ```\n */\nexport function splitIntoBatches(\n orbitals: OrbitalDefinition[],\n options: {\n maxBatchSize?: number;\n provider?: 'anthropic' | 'openai' | 'deepseek' | 'kimi' | 'openrouter';\n preserveRelationships?: boolean;\n } = {}\n): OrbitalDefinition[][] {\n const {\n maxBatchSize = 3,\n preserveRelationships = true,\n } = options;\n\n if (!preserveRelationships) {\n // Simple chunking without relationship preservation\n return chunkArray(orbitals, maxBatchSize);\n }\n\n // Group orbitals by relationship clusters\n const clusters = groupByRelationships(orbitals);\n \n // Split clusters into batches respecting maxBatchSize\n const batches: OrbitalDefinition[][] = [];\n \n for (const cluster of clusters) {\n if (cluster.length <= maxBatchSize) {\n // Cluster fits in one batch\n batches.push(cluster);\n } else {\n // Split large cluster\n batches.push(...chunkArray(cluster, maxBatchSize));\n }\n }\n\n return batches;\n}\n\n/**\n * Group orbitals into relationship clusters.\n * Orbitals that emit/listen to each other are grouped together.\n */\nfunction groupByRelationships(orbitals: OrbitalDefinition[]): OrbitalDefinition[][] {\n const visited = new Set<string>();\n const clusters: OrbitalDefinition[][] = [];\n\n // Build adjacency map\n const adjacency = new Map<string, Set<string>>();\n \n for (const orbital of orbitals) {\n if (!adjacency.has(orbital.name)) {\n adjacency.set(orbital.name, new Set());\n }\n\n // Add connections based on emits/listens\n if (orbital.emits) {\n for (const event of orbital.emits) {\n // Find listeners for this event\n for (const other of orbitals) {\n if (other === orbital) continue;\n if (other.listens?.some(l => l.event === event.event)) {\n adjacency.get(orbital.name)?.add(other.name);\n if (!adjacency.has(other.name)) {\n adjacency.set(other.name, new Set());\n }\n adjacency.get(other.name)?.add(orbital.name);\n }\n }\n }\n }\n }\n\n // Find connected components using DFS\n function dfs(orbital: OrbitalDefinition, cluster: OrbitalDefinition[]) {\n visited.add(orbital.name);\n cluster.push(orbital);\n\n const neighbors = adjacency.get(orbital.name) || new Set();\n for (const neighborName of neighbors) {\n if (!visited.has(neighborName)) {\n const neighbor = orbitals.find(o => o.name === neighborName);\n if (neighbor) {\n dfs(neighbor, cluster);\n }\n }\n }\n }\n\n // Find all clusters\n for (const orbital of orbitals) {\n if (!visited.has(orbital.name)) {\n const cluster: OrbitalDefinition[] = [];\n dfs(orbital, cluster);\n clusters.push(cluster);\n }\n }\n\n return clusters;\n}\n\n// ============================================================================\n// Token Estimation\n// ============================================================================\n\n/**\n * Estimate token count for a batch prompt.\n * Rough estimate: ~4 characters per token.\n */\nexport function estimateBatchTokens(orbitals: OrbitalDefinition[]): number {\n const baseTokens = 2000; // System prompt overhead\n const perOrbitalTokens = 800; // Average orbital description\n \n return baseTokens + (orbitals.length * perOrbitalTokens);\n}\n\n/**\n * Check if a batch will fit within token limits.\n */\nexport function willBatchFit(\n orbitals: OrbitalDefinition[],\n maxTokens: number = 12000\n): boolean {\n const estimated = estimateBatchTokens(orbitals);\n // Leave 50% buffer for response\n return estimated < (maxTokens * 0.5);\n}\n","/**\n * Concurrency Controller\n *\n * Semaphore-based concurrency control for parallel operations.\n *\n * @packageDocumentation\n */\n\nimport type { ConcurrencyController } from './types.js';\n\n/**\n * Create a semaphore-based concurrency controller.\n *\n * @example\n * ```typescript\n * const controller = createConcurrencyController(3); // Max 3 concurrent\n *\n * await controller.acquire(); // Acquire slot\n * try {\n * await doWork();\n * } finally {\n * controller.release(); // Release slot\n * }\n * ```\n */\nexport function createConcurrencyController(maxConcurrency: number): ConcurrencyController {\n let activeCount = 0;\n const queue: Array<() => void> = [];\n\n return {\n async acquire(): Promise<void> {\n if (activeCount < maxConcurrency) {\n activeCount++;\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n queue.push(() => {\n activeCount++;\n resolve();\n });\n });\n },\n\n release(): void {\n activeCount = Math.max(0, activeCount - 1);\n const next = queue.shift();\n if (next) {\n next();\n }\n },\n\n get activeCount(): number {\n return activeCount;\n },\n\n get waitingCount(): number {\n return queue.length;\n },\n };\n}\n\n/**\n * Execute an array of async functions with concurrency control.\n *\n * @example\n * ```typescript\n * const results = await runWithConcurrency(\n * items.map(item => () => processItem(item)),\n * { concurrency: 3 }\n * );\n * ```\n */\nexport async function runWithConcurrency<T>(\n tasks: Array<() => Promise<T>>,\n options: { concurrency: number; onProgress?: (completed: number, total: number) => void }\n): Promise<T[]> {\n const { concurrency, onProgress } = options;\n const controller = createConcurrencyController(concurrency);\n const results: T[] = [];\n let completed = 0;\n\n await Promise.all(\n tasks.map(async (task, index) => {\n await controller.acquire();\n try {\n results[index] = await task();\n completed++;\n onProgress?.(completed, tasks.length);\n } finally {\n controller.release();\n }\n })\n );\n\n return results;\n}\n\n/**\n * Async map with concurrency limit.\n *\n * Similar to Promise.all() but with max concurrency.\n *\n * @example\n * ```typescript\n * const results = await asyncMapWithConcurrency(\n * items,\n * async (item, index) => process(item),\n * 3 // max 3 concurrent\n * );\n * ```\n */\nexport async function asyncMapWithConcurrency<T, R>(\n items: T[],\n mapper: (item: T, index: number) => Promise<R>,\n concurrency: number\n): Promise<R[]> {\n return runWithConcurrency(\n items.map((item, index) => () => mapper(item, index)),\n { concurrency }\n );\n}\n","/**\n * Batch Generator\n *\n * Core batch generation logic for generating multiple orbitals efficiently.\n * Supports multiple modes: single-call, parallel-individual, adaptive.\n *\n * @packageDocumentation\n */\n\nimport type { LLMClient } from '@almadar/llm';\nimport type { OrbitalDefinition } from '@almadar/core/types';\nimport {\n createLog,\n getErrorMessage,\n PROVIDER_CONCURRENCY_LIMITS,\n PROVIDER_BATCH_SIZES,\n BATCH_MAX_TOKENS,\n} from '../shared/index.js';\nimport type {\n GenerationLog,\n BatchGenerationOptions,\n BatchGenerationResult,\n BatchProgressEvent,\n SingleBatchResult,\n} from './types.js';\nimport { assembleBatchPrompt, splitIntoBatches, willBatchFit } from './prompt-assembler.js';\nimport { asyncMapWithConcurrency } from './concurrency.js';\n\n// ============================================================================\n// Main Batch Generation Function\n// ============================================================================\n\n/**\n * Generate multiple orbitals in optimized batches.\n *\n * This is the main entry point for batch generation. It:\n * 1. Splits orbitals into optimal batches\n * 2. Generates each batch (parallel or sequential)\n * 3. Combines results into final schema\n *\n * @example\n * ```typescript\n * const result = await generateOrbitalsBatch(client, [\n * { name: \"Products\", ... },\n * { name: \"Orders\", ... },\n * { name: \"Customers\", ... },\n * ], { mode: 'single-call', batchSize: 3 });\n *\n * console.log(`Generated ${result.summary.successful}/${result.summary.total} orbitals`);\n * console.log(`Total time: ${result.totalDurationMs}ms`);\n * ```\n */\nexport async function generateOrbitalsBatch(\n client: LLMClient,\n orbitals: OrbitalDefinition[],\n options: BatchGenerationOptions = {}\n): Promise<BatchGenerationResult> {\n const startTime = Date.now();\n const aggregateLogs: GenerationLog[] = [];\n \n const provider = client.getProvider();\n const mode = options.mode || 'single-call';\n const maxConcurrency = options.concurrency ?? PROVIDER_CONCURRENCY_LIMITS[provider];\n const maxBatchSize = options.batchSize ?? PROVIDER_BATCH_SIZES[provider];\n\n console.log(`[BatchGenerator] Starting batch generation: ${orbitals.length} orbitals, mode=${mode}, concurrency=${maxConcurrency}`);\n\n aggregateLogs.push(createLog('info', `Starting batch generation`, {\n totalOrbitals: orbitals.length,\n mode,\n provider,\n maxConcurrency,\n maxBatchSize,\n }));\n\n // Split into batches\n const batches = splitIntoBatches(orbitals, {\n maxBatchSize,\n provider,\n preserveRelationships: options.preserveRelationships ?? true,\n });\n\n console.log(`[BatchGenerator] Split into ${batches.length} batches: [${batches.map(b => b.length).join(', ')}]`);\n\n aggregateLogs.push(createLog('info', `Split into ${batches.length} batches`, {\n batchSizes: batches.map(b => b.length),\n }));\n\n // Emit batch start event\n options.onBatchProgress?.({\n type: 'batch_start',\n batchIndex: 0,\n totalBatches: batches.length,\n completedOrbitals: 0,\n totalOrbitals: orbitals.length,\n });\n\n // Generate batches based on mode\n let batchResults: SingleBatchResult[];\n \n if (mode === 'parallel-individual') {\n // Each orbital gets its own LLM call, but calls are parallel\n batchResults = await generateParallelIndividual(client, orbitals, {\n ...options,\n concurrency: maxConcurrency,\n onBatchProgress: options.onBatchProgress,\n });\n } else if (mode === 'single-call') {\n // Multiple orbitals per LLM call\n batchResults = await generateSingleCallBatches(client, batches, {\n ...options,\n concurrency: maxConcurrency,\n onBatchProgress: options.onBatchProgress,\n });\n } else {\n // Adaptive: use single-call if fits, otherwise parallel-individual\n batchResults = await generateAdaptive(client, orbitals, batches, {\n ...options,\n concurrency: maxConcurrency,\n maxBatchSize,\n onBatchProgress: options.onBatchProgress,\n });\n }\n\n const totalDurationMs = Date.now() - startTime;\n \n // Aggregate results\n const allResults = batchResults.flatMap(b => b.results);\n const successful = allResults.filter(r => r.success).length;\n const failed = allResults.length - successful;\n const totalTokens = batchResults.reduce(\n (sum, b) => sum + (b.usage?.totalTokens ?? 0),\n 0\n );\n\n console.log(`[BatchGenerator] Complete: ${successful}/${allResults.length} successful, ${totalTokens} tokens, ${totalDurationMs}ms`);\n\n aggregateLogs.push(createLog('info', `Batch generation completed`, {\n totalDurationMs,\n successful,\n failed,\n totalTokens,\n totalBatches: batches.length,\n }));\n\n // Emit completion event\n options.onBatchProgress?.({\n type: 'batch_complete',\n batchIndex: batches.length - 1,\n totalBatches: batches.length,\n completedOrbitals: successful,\n totalOrbitals: orbitals.length,\n });\n\n return {\n results: allResults.map(r => ({\n orbital: r.orbital,\n fingerprint: '', // TODO: compute from orbital\n usedTemplate: false,\n usage: undefined,\n validation: r.success\n ? { valid: true, errorCount: 0, warningCount: 0 }\n : { valid: false, errorCount: 1, warningCount: 0 },\n logs: [],\n })),\n totalDurationMs,\n aggregateLogs,\n summary: {\n total: allResults.length,\n successful,\n failed,\n totalTokens,\n },\n batchResults,\n totalBatches: batches.length,\n };\n}\n\n// ============================================================================\n// Generation Modes\n// ============================================================================\n\n/**\n * Generate using single-call batches (multiple orbitals per LLM call).\n */\nasync function generateSingleCallBatches(\n client: LLMClient,\n batches: OrbitalDefinition[][],\n options: BatchGenerationOptions & { concurrency: number }\n): Promise<SingleBatchResult[]> {\n let completedOrbitals = 0;\n const totalOrbitals = batches.reduce((sum, b) => sum + b.length, 0);\n\n return asyncMapWithConcurrency(\n batches,\n async (batch, batchIndex) => {\n return generateSingleBatch(client, batch, batchIndex, {\n ...options,\n onProgress: (completedInBatch) => {\n const newCompleted = completedOrbitals + completedInBatch;\n options.onBatchProgress?.({\n type: 'orbital_complete',\n batchIndex,\n totalBatches: batches.length,\n completedOrbitals: newCompleted,\n totalOrbitals,\n });\n completedOrbitals = newCompleted;\n },\n });\n },\n options.concurrency\n );\n}\n\n/**\n * Generate using parallel individual calls (one orbital per LLM call).\n */\nasync function generateParallelIndividual(\n client: LLMClient,\n orbitals: OrbitalDefinition[],\n options: BatchGenerationOptions & { concurrency: number }\n): Promise<SingleBatchResult[]> {\n // Create single-orbital batches\n const batches = orbitals.map(o => [o]);\n \n return generateSingleCallBatches(client, batches, {\n ...options,\n concurrency: options.concurrency,\n });\n}\n\n/**\n * Adaptive mode: choose best strategy based on orbitals.\n * \n * Strategy:\n * - If we can fit multiple orbitals per batch, use single-call batches\n * - This provides true speedup (one LLM call for 2-3 orbitals)\n */\nasync function generateAdaptive(\n client: LLMClient,\n orbitals: OrbitalDefinition[],\n batches: OrbitalDefinition[][],\n options: BatchGenerationOptions & { concurrency: number; maxBatchSize: number }\n): Promise<SingleBatchResult[]> {\n // Check if all batches can fit in single LLM calls\n const allFit = batches.every(batch => willBatchFit(batch, BATCH_MAX_TOKENS));\n \n // Use single-call batches if they fit and we have a reasonable number\n // This provides 2x+ speedup by generating multiple orbitals per LLM call\n if (allFit) {\n console.log(`[BatchGenerator] Adaptive: Using single-call batches (${batches.length} batches)`);\n return generateSingleCallBatches(client, batches, options);\n }\n \n // Fall back to parallel individual if batches are too large\n console.log(`[BatchGenerator] Adaptive: Using parallel-individual (batches too large)`);\n return generateParallelIndividual(client, orbitals, options);\n}\n\n// ============================================================================\n// Single Batch Generation\n// ============================================================================\n\n/**\n * Generate a single batch of orbitals.\n */\nasync function generateSingleBatch(\n client: LLMClient,\n orbitals: OrbitalDefinition[],\n batchIndex: number,\n options: BatchGenerationOptions & { onProgress?: (completed: number) => void }\n): Promise<SingleBatchResult> {\n const batchStartTime = Date.now();\n const logs: GenerationLog[] = [];\n\n console.log(`[BatchGenerator] Starting batch ${batchIndex + 1}: ${orbitals.map(o => o.name).join(', ')}`);\n\n logs.push(createLog('info', `Starting batch ${batchIndex + 1}`, {\n orbitalCount: orbitals.length,\n orbitals: orbitals.map(o => o.name),\n }));\n\n try {\n // Assemble batch prompt\n const batchPrompt = assembleBatchPrompt(orbitals);\n console.log(`[BatchGenerator] Batch ${batchIndex + 1} prompt assembled: ${batchPrompt.prompt.length} chars`);\n \n logs.push(createLog('info', `Batch prompt assembled`, {\n promptLength: batchPrompt.prompt.length,\n estimatedTokens: Math.ceil(batchPrompt.prompt.length / 4),\n }));\n\n // Make LLM call\n const llmResult = await client.callWithMetadata({\n systemPrompt: batchPrompt.prompt,\n userPrompt: 'Generate all orbitals in the batch. Return valid JSON matching the output format specified.',\n maxTokens: BATCH_MAX_TOKENS,\n skipSchemaValidation: true,\n });\n\n logs.push(createLog('info', `LLM call completed`, {\n promptTokens: llmResult.usage?.promptTokens,\n completionTokens: llmResult.usage?.completionTokens,\n }));\n\n // Parse result\n const parsed = parseBatchResult(llmResult.data, orbitals);\n console.log(`[BatchGenerator] Batch ${batchIndex + 1} parsed: ${parsed.filter(p => p.success).length}/${parsed.length} successful`);\n \n // Report progress\n for (let i = 0; i < parsed.length; i++) {\n options.onProgress?.(i + 1);\n }\n\n const durationMs = Date.now() - batchStartTime;\n\n logs.push(createLog('info', `Batch ${batchIndex + 1} completed`, {\n durationMs,\n successful: parsed.filter(r => r.success).length,\n }));\n\n return {\n orbitals,\n results: parsed,\n usage: llmResult.usage ?? undefined,\n durationMs,\n logs,\n };\n\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n console.error(`[BatchGenerator] Batch ${batchIndex + 1} FAILED: ${errorMessage}`);\n \n logs.push(createLog('error', `Batch ${batchIndex + 1} failed`, {\n error: errorMessage,\n }));\n\n // Return failed results for all orbitals in batch\n return {\n orbitals,\n results: orbitals.map(o => ({\n orbital: o,\n success: false,\n error: errorMessage,\n })),\n durationMs: Date.now() - batchStartTime,\n logs,\n };\n }\n}\n\n// ============================================================================\n// Result Parsing\n// ============================================================================\n\n/**\n * Parse batch generation result.\n */\nfunction parseBatchResult(\n data: unknown,\n expectedOrbitals: OrbitalDefinition[]\n): Array<{ orbital: OrbitalDefinition; success: boolean; error?: string }> {\n if (!data || typeof data !== 'object') {\n return expectedOrbitals.map(o => ({\n orbital: o,\n success: false,\n error: 'Invalid response: expected object',\n }));\n }\n\n const obj = data as Record<string, unknown>;\n \n // Check for orbitals array\n if (!obj.orbitals || !Array.isArray(obj.orbitals)) {\n return expectedOrbitals.map(o => ({\n orbital: o,\n success: false,\n error: 'Invalid response: missing orbitals array',\n }));\n }\n\n const results = obj.orbitals as OrbitalDefinition[];\n \n // Match results to expected orbitals\n return expectedOrbitals.map((expected, index) => {\n const result = results[index];\n \n if (!result) {\n return {\n orbital: expected,\n success: false,\n error: `Missing result for orbital ${index + 1}`,\n };\n }\n\n // Basic validation\n if (!result.name) {\n return {\n orbital: expected,\n success: false,\n error: 'Generated orbital missing name',\n };\n }\n\n return {\n orbital: result,\n success: true,\n };\n });\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Estimate optimal batch configuration for a set of orbitals.\n */\nexport function estimateOptimalBatchConfig(\n orbitals: OrbitalDefinition[],\n provider: 'anthropic' | 'openai' | 'deepseek' | 'kimi' | 'openrouter'\n): {\n recommendedMode: 'single-call' | 'parallel-individual';\n optimalBatchSize: number;\n estimatedBatches: number;\n estimatedTimeSeconds: number;\n} {\n const defaultBatchSize = PROVIDER_BATCH_SIZES[provider];\n const concurrency = PROVIDER_CONCURRENCY_LIMITS[provider];\n \n // Check if single-call is feasible\n const canSingleCall = willBatchFit(orbitals, BATCH_MAX_TOKENS);\n \n if (canSingleCall && orbitals.length <= defaultBatchSize) {\n return {\n recommendedMode: 'single-call',\n optimalBatchSize: orbitals.length,\n estimatedBatches: 1,\n estimatedTimeSeconds: 60, // ~60s for single batch\n };\n }\n \n // Multiple batches needed\n const batchSize = defaultBatchSize;\n const numBatches = Math.ceil(orbitals.length / batchSize);\n const parallelBatches = Math.ceil(numBatches / concurrency);\n \n return {\n recommendedMode: 'single-call',\n optimalBatchSize: batchSize,\n estimatedBatches: numBatches,\n estimatedTimeSeconds: parallelBatches * 60,\n };\n}\n","/**\n * Batch Orbital Generation\n *\n * Efficient batch generation of multiple orbitals using:\n * - Single-call batch mode (multiple orbitals per LLM call)\n * - Parallel individual mode (concurrent single-orbital calls)\n * - Adaptive mode (automatically chooses best strategy)\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Core Generation\n// ============================================================================\n\nexport {\n generateOrbitalsBatch,\n estimateOptimalBatchConfig,\n} from './batch-generator.js';\n\n// ============================================================================\n// Prompt Assembly\n// ============================================================================\n\nexport {\n assembleBatchPrompt,\n splitIntoBatches,\n extractSharedContext,\n estimateBatchTokens,\n willBatchFit,\n type BatchAssembledPrompt,\n type SharedBatchContext,\n} from './prompt-assembler.js';\n\n// ============================================================================\n// Concurrency\n// ============================================================================\n\nexport {\n createConcurrencyController,\n runWithConcurrency,\n asyncMapWithConcurrency,\n} from './concurrency.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport {\n type BatchGenerationOptions,\n type BatchGenerationResult,\n type BatchProgressEvent,\n type SingleBatchResult,\n type ConcurrencyController,\n type BatchMode,\n type SingleCallBatchOptions,\n type ParallelIndividualOptions,\n type AdaptiveBatchOptions,\n} from './types.js';\n","/**\n * Orbital Batch Subagent Tool\n *\n * Tool for generating multiple orbitals in optimized batches.\n * Provides significant speedup (2x-3x) for multi-orbital generation.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { OrbitalDefinition } from '@almadar/core/types';\nimport { LLMClient, type LLMProvider } from '@almadar/llm';\nimport type { SSEEventType } from '../api-types.js';\nimport {\n type ExtractedRequirements,\n createLog,\n PROVIDER_CONCURRENCY_LIMITS,\n} from '../orbitals/shared/index.js';\nimport {\n generateOrbitalsBatch,\n type BatchGenerationOptions,\n type BatchProgressEvent,\n} from '../orbitals/batch/index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n// Note: This matches the signature from orbital-subagent.ts for compatibility\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 BatchCompleteCallback = (\n orbitals: OrbitalDefinition[],\n batchIndex: number,\n totalBatches: number,\n) => Promise<void> | void;\n\nexport interface OrbitalBatchSubagentToolOptions {\n onSubagentEvent?: SubagentEventCallback;\n onBatchComplete?: BatchCompleteCallback;\n requirements?: Partial<ExtractedRequirements>;\n provider?: LLMProvider;\n model?: string;\n workDir?: string;\n}\n\n// ============================================================================\n// Zod Schema\n// ============================================================================\n\nconst OrbitalBatchInputSchema = z.object({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n orbitals: z.array(z.any()).describe('Array of OrbitalUnits to generate'),\n options: z\n .object({\n mode: z.enum(['single-call', 'parallel-individual', 'adaptive']).optional().default('adaptive'),\n batchSize: z.number().optional(),\n maxConcurrency: z.number().optional(),\n preserveRelationships: z.boolean().optional().default(true),\n })\n .optional()\n .describe('Batch generation options'),\n});\n\n// ============================================================================\n// Tool Factory\n// ============================================================================\n\n/**\n * Create a tool for batch orbital generation with event streaming.\n */\nexport function createOrbitalBatchSubagentTool(options: OrbitalBatchSubagentToolOptions = {}) {\n let eventCallback: SubagentEventCallback | undefined = options.onSubagentEvent;\n let completeCallback: BatchCompleteCallback | undefined = options.onBatchComplete;\n const requirements = options.requirements;\n const workDir = options.workDir;\n\n const setEventCallback = (callback: SubagentEventCallback) => {\n eventCallback = callback;\n };\n\n const setBatchCompleteCallback = (callback: BatchCompleteCallback) => {\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 batchTool = tool(\n async ({ orbitals, options: batchOptions }) => {\n if (!orbitals || orbitals.length === 0) {\n return JSON.stringify({\n success: false,\n error: 'No orbitals provided for batch generation.',\n orbitals: [],\n });\n }\n\n console.log(`[OrbitalBatchSubagent] Starting batch generation for ${orbitals.length} orbitals`);\n\n try {\n emitEvent('batch', 0, 1, 'message', {\n content: `Starting batch generation for ${orbitals.length} orbitals`,\n role: 'assistant',\n isComplete: false,\n });\n\n emitEvent('batch', 0, 1, 'todo_update', {\n todos: orbitals.map((o, i) => ({\n id: `orbital-${i}`,\n task: `Generate ${o.name}`,\n status: 'pending' as const,\n })),\n });\n\n // Create LLM client\n const client = new LLMClient({\n provider: options.provider || 'anthropic',\n model: options.model || 'claude-sonnet-4-20250514',\n });\n\n // Prepare batch generation options\n const generationOptions: BatchGenerationOptions = {\n mode: batchOptions?.mode || 'adaptive',\n batchSize: batchOptions?.batchSize,\n concurrency: batchOptions?.maxConcurrency ?? PROVIDER_CONCURRENCY_LIMITS[client.getProvider()],\n preserveRelationships: batchOptions?.preserveRelationships ?? true,\n requirements,\n onBatchProgress: (event: BatchProgressEvent) => {\n // Update todo for orbital completion\n if (event.type === 'orbital_complete' && event.orbitalName) {\n emitEvent(event.orbitalName || 'batch', event.batchIndex, event.totalBatches, 'todo_update', {\n todos: orbitals.map((o, i) => ({\n id: `orbital-${i}`,\n task: `Generate ${o.name}`,\n status:\n o.name === event.orbitalName\n ? 'completed'\n : event.completedOrbitals > i\n ? 'completed'\n : 'pending',\n })),\n });\n }\n\n // Log progress\n emitEvent(event.orbitalName || 'batch', event.batchIndex, event.totalBatches, 'generation_log', {\n level: 'info',\n message: `Progress: ${event.completedOrbitals}/${event.totalOrbitals} orbitals complete`,\n data: {\n batchIndex: event.batchIndex,\n completedOrbitals: event.completedOrbitals,\n totalOrbitals: event.totalOrbitals,\n },\n });\n },\n };\n\n emitEvent('batch', 0, 1, 'tool_call', {\n tool: 'generateOrbitalsBatch',\n args: {\n orbitalCount: orbitals.length,\n mode: generationOptions.mode,\n concurrency: generationOptions.concurrency,\n },\n });\n\n // Execute batch generation\n const result = await generateOrbitalsBatch(client, orbitals, generationOptions);\n\n // Report completion\n emitEvent('batch', result.totalBatches - 1, result.totalBatches, 'todo_update', {\n todos: orbitals.map((o, i) => ({\n id: `orbital-${i}`,\n task: `Generate ${o.name}`,\n status: result.batchResults.some(\n b => b.results.some(r => r.orbital.name === o.name && r.success)\n )\n ? 'completed'\n : 'failed',\n })),\n });\n\n // Extract generated orbitals\n const generatedOrbitals = result.results\n .filter(r => r.orbital)\n .map(r => r.orbital);\n\n const successCount = generatedOrbitals.length;\n const failedCount = orbitals.length - successCount;\n\n emitEvent('batch', result.totalBatches - 1, result.totalBatches, 'message', {\n content: `Batch generation complete: ${successCount}/${orbitals.length} orbitals generated successfully`,\n role: 'assistant',\n isComplete: true,\n });\n\n // Persist orbitals if workDir provided\n if (workDir && completeCallback && generatedOrbitals.length > 0) {\n try {\n await completeCallback(generatedOrbitals, 0, 1);\n emitEvent('batch', result.totalBatches - 1, result.totalBatches, 'generation_log', {\n level: 'info',\n message: `Persisted ${generatedOrbitals.length} orbitals`,\n });\n } catch (persistError) {\n console.error(`[OrbitalBatchSubagent] Failed to persist orbitals:`, persistError);\n emitEvent('batch', result.totalBatches - 1, result.totalBatches, 'generation_log', {\n level: 'warn',\n message: 'Failed to persist some orbitals',\n data: { error: String(persistError) },\n });\n }\n }\n\n return JSON.stringify({\n success: successCount === orbitals.length,\n generated: successCount,\n failed: failedCount,\n total: orbitals.length,\n orbitals: generatedOrbitals,\n duration: result.totalDurationMs,\n totalTokens: result.summary.totalTokens,\n batches: result.totalBatches,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`[OrbitalBatchSubagent] Batch generation failed:`, errorMessage);\n\n emitEvent('batch', 0, 1, 'error', {\n error: errorMessage,\n code: 'BATCH_GENERATION_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessage,\n orbitals: [],\n });\n }\n },\n {\n name: 'generate_orbitals_batch',\n description:\n 'Generate multiple orbitals in optimized batches. MUCH FASTER than calling generate_orbital multiple times. Use this when generating 3+ orbitals. Supports parallel generation with automatic concurrency control.',\n schema: OrbitalBatchInputSchema,\n },\n );\n\n return {\n tool: batchTool,\n setEventCallback,\n setBatchCompleteCallback,\n };\n}\n\n// ============================================================================\n// Re-export Types (avoid duplicates - use explicit renames if needed)\n// ============================================================================\n\n// Types already exported above, no need to re-export\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// Design Quality Checks\n// ============================================================================\n\n/** Prop corrections: wrong name → correct name */\nconst PROP_CORRECTIONS: Record<string, string> = {\n onSubmit: 'submitEvent',\n onCancel: 'cancelEvent',\n headerActions: 'actions',\n loading: 'isLoading',\n fieldNames: 'fields',\n};\n\n/**\n * Auto-correct known prop misnaming in render-ui effects.\n * Returns the number of corrections made.\n */\nfunction autoCorrectProps(schema: Record<string, unknown>): number {\n let corrections = 0;\n const schemaStr = JSON.stringify(schema);\n\n // Walk through all render-ui effects and fix prop names\n function walkAndFix(obj: unknown): unknown {\n if (Array.isArray(obj)) {\n return obj.map(walkAndFix);\n }\n if (obj && typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n if (key in PROP_CORRECTIONS) {\n result[PROP_CORRECTIONS[key]] = walkAndFix(value);\n corrections++;\n } else {\n result[key] = walkAndFix(value);\n }\n }\n return result;\n }\n return obj;\n }\n\n const fixed = walkAndFix(schema);\n Object.assign(schema, fixed);\n return corrections;\n}\n\n/**\n * Check INIT transitions for atomic composition quality.\n * Returns warnings for flat/low-quality INIT transitions.\n */\nfunction checkCompositionQuality(schema: Record<string, unknown>): string[] {\n const warnings: string[] = [];\n const orbitals = (schema as { orbitals?: unknown[] }).orbitals;\n if (!Array.isArray(orbitals)) return warnings;\n\n for (const orbital of orbitals) {\n const orbObj = orbital as { name?: string; traits?: unknown[] };\n const traits = orbObj.traits;\n if (!Array.isArray(traits)) continue;\n\n for (const trait of traits) {\n const traitObj = trait as { name?: string; stateMachine?: { transitions?: unknown[] } };\n const transitions = traitObj.stateMachine?.transitions;\n if (!Array.isArray(transitions)) continue;\n\n for (const transition of transitions) {\n const trans = transition as { event?: string; effects?: unknown[] };\n if (trans.event !== 'INIT') continue;\n\n const effects = trans.effects;\n if (!Array.isArray(effects)) continue;\n\n // Count render-ui effects targeting 'main'\n const mainRenderUIs = effects.filter(\n (e) => Array.isArray(e) && e[0] === 'render-ui' && e[1] === 'main',\n );\n\n if (mainRenderUIs.length > 1) {\n warnings.push(\n `⚠️ ${orbObj.name}/${traitObj.name} INIT has ${mainRenderUIs.length} flat render-ui calls to main. Should be a single composed stack with children.`,\n );\n }\n\n if (mainRenderUIs.length === 1) {\n const renderPayload = mainRenderUIs[0] as unknown[];\n const payload = renderPayload[2] as Record<string, unknown> | undefined;\n if (payload && payload.type !== 'stack' && !payload.children) {\n warnings.push(\n `⚠️ ${orbObj.name}/${traitObj.name} INIT renders a single flat ${payload.type} to main. Should be a composed stack with header, metrics, and data sections.`,\n );\n }\n }\n }\n }\n }\n\n return warnings;\n}\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 let propCorrections = 0;\n let compositionWarnings: string[] = [];\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 // Auto-correct props and check composition quality\n if (combinedSchema) {\n propCorrections = autoCorrectProps(combinedSchema as unknown as Record<string, unknown>);\n compositionWarnings = checkCompositionQuality(combinedSchema as unknown as Record<string, unknown>);\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 designQuality: {\n propCorrections: propCorrections || 0,\n compositionWarnings: compositionWarnings || [],\n },\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, type LLMProvider } 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 /** LLM provider for domain orbital generation. Defaults to 'anthropic' */\n provider?: LLMProvider;\n /** Model name for domain orbital generation. Defaults to 'claude-sonnet-4-20250514' */\n model?: 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 with configurable provider\n const client = new LLMClient({\n provider: options.provider ?? 'anthropic',\n model: options.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 } from '@almadar/core/types';\n\n// ============================================================================\n// Shared Module Imports (SK-007 Phase 1)\n// ============================================================================\n\nimport {\n // Types (re-export for backward compatibility)\n type OrbitalUnit,\n type GenerationLog,\n type ExtractedRequirements,\n type OrbitalGenerationOptions as SharedOrbitalGenerationOptions,\n type OrbitalGenerationResult as SharedOrbitalGenerationResult,\n type ParallelGenerationOptions as SharedParallelGenerationOptions,\n type ParallelGenerationResult as SharedParallelGenerationResult,\n type DecomposeOptions as SharedDecomposeOptions,\n // Constants\n PROVIDER_CONCURRENCY_LIMITS,\n // Utilities\n getEntityName,\n createLog,\n} from '../shared/index.js';\n\n// Re-export types for backward compatibility\nexport {\n type OrbitalUnit,\n type GenerationLog,\n type ExtractedRequirements,\n} from '../shared/index.js';\n\n// Re-export constants\nexport { PROVIDER_CONCURRENCY_LIMITS } from '../shared/index.js';\n\n// ============================================================================\n// Local Type Definitions (Extended from shared)\n// ============================================================================\n\n/**\n * Extended options for single orbital generation.\n * @deprecated Use shared OrbitalGenerationOptions instead\n */\nexport interface OrbitalGenerationOptions extends SharedOrbitalGenerationOptions {}\n\n/**\n * Extended result for single orbital generation.\n * @deprecated Use shared OrbitalGenerationResult instead\n */\nexport interface OrbitalGenerationResult extends SharedOrbitalGenerationResult {}\n\n/**\n * Extended options for parallel generation.\n * @deprecated Use shared ParallelGenerationOptions instead\n */\nexport interface ParallelGenerationOptions extends SharedParallelGenerationOptions {}\n\n/**\n * Extended result for parallel generation.\n * @deprecated Use shared ParallelGenerationResult instead\n */\nexport interface ParallelGenerationResult extends SharedParallelGenerationResult {}\n\n/**\n * Extended options for decomposition.\n * @deprecated Use shared DecomposeOptions instead\n */\nexport interface DecomposeOptions extends SharedDecomposeOptions {}\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: { valid: boolean; errors: unknown[]; warnings?: unknown[] } = { 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: unknown) => {\n if (typeof e === 'object' && e !== null) {\n return (e as { message?: string }).message || String(e);\n }\n return String(e);\n }),\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 * 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: Partial<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 ? requirements.entities.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### States (Map to State Machines)\n${requirements.states?.length ? requirements.states.map(s => `- ${s}`).join('\\n') : '- (none specified)'}\n\n### Events (Map to Transitions)\n${requirements.events?.length ? requirements.events.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### Guards (Map to Transition Guards)\n${requirements.guards?.length ? requirements.guards.map(g => `- ${g}`).join('\\n') : '- (none specified)'}\n\n### Effects (Map to Transition Effects)\n${requirements.effects?.length ? requirements.effects.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### Pages (Map to Page Definitions)\n${requirements.pages?.length ? 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, type LLMProvider } 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 /** LLM provider for orbital generation subagent. Defaults to 'anthropic' */\n provider?: LLMProvider;\n /** Model name for orbital generation subagent. Defaults to 'claude-sonnet-4-20250514' */\n model?: string;\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 with configurable provider\n const client = new LLMClient({\n provider: options.provider ?? 'anthropic',\n model: options.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 * @almadar/agent Tools\n *\n * All agent tools for schema generation, validation, and management.\n *\n * @packageDocumentation\n */\n\n// Execute tool (no deps needed)\nexport { createExecuteTool, validateCommandPaths } from './execute.js';\n\n// Validate tool (no deps needed - shells to CLI)\nexport { createValidateSchemaTool } from './validate-schema.js';\n\n// Generate schema tool (uses @almadar/llm structured output directly)\nexport { createGenerateSchemaTool } from './generate-schema.js';\n\n// Finish task tool (uses internal combiner and domain converter)\nexport { createFinishTaskTool } from './finish-task.js';\n\n// Domain orbital tools (uses internal domain language converter)\nexport {\n createGenerateOrbitalDomainTool,\n createConstructCombinedDomainTool,\n createDomainOrbitalTools,\n type DomainOrbitalEventCallback,\n type DomainOrbitalCompleteCallback,\n type DomainOrbitalToolOptions,\n type DomainOrbitalSpec,\n} from './domain-orbital.js';\n\n// Orbital subagent tool (uses internal orbital generator)\nexport {\n createOrbitalSubagentTool,\n createSubagentEventWrapper,\n type SubagentEventCallback,\n type OrbitalCompleteCallback,\n type OrbitalRequirements,\n type OrbitalSubagentToolOptions,\n} from './orbital-subagent.js';\n\n// Orbital batch subagent tool (uses batch generation for 2x+ speedup)\nexport {\n createOrbitalBatchSubagentTool,\n type SubagentEventCallback as BatchSubagentEventCallback,\n type BatchCompleteCallback,\n type OrbitalBatchSubagentToolOptions,\n} from './orbital-batch-subagent.js';\n\n// Trait subagent tool (uses @almadar/llm directly)\nexport {\n createTraitSubagentTool,\n createTraitEventWrapper,\n type TraitEventCallback,\n type TraitCompleteCallback,\n type TraitSubagentToolOptions,\n type TraitSpec,\n} from './trait-subagent.js';\n\n// Combine schemas tool (uses internal combiner)\nexport { createCombineSchemasTool } from './combine-schemas.js';\n\n// Schema chunking tools (no deps needed - uses @almadar/core)\nexport {\n createQuerySchemaStructureTool,\n createExtractChunkTool,\n createApplyChunkTool,\n createSchemaChunkingTools,\n} from './schema-chunking.js';\n\n// GitHub tools (uses @almadar/integrations)\nexport {\n createGitHubTools,\n createGitHubToolsArray,\n type GitHubToolsConfig,\n} from './github.js';\n\n// ============================================================================\n// Convenience Factory\n// ============================================================================\n\n// Import functions for use in createAgentTools\nimport { createExecuteTool } from './execute.js';\nimport { createValidateSchemaTool } from './validate-schema.js';\nimport { createGenerateSchemaTool } from './generate-schema.js';\nimport { createFinishTaskTool } from './finish-task.js';\nimport { createCombineSchemasTool } from './combine-schemas.js';\nimport { createOrbitalSubagentTool } from './orbital-subagent.js';\nimport { createTraitSubagentTool } from './trait-subagent.js';\nimport { createDomainOrbitalTools } from './domain-orbital.js';\nimport { createSchemaChunkingTools } from './schema-chunking.js';\n/**\n * Create all agent tools for a workspace.\n *\n * All dependencies are now internal to @almadar/agent - no dependency injection needed.\n *\n * @param workDir - Workspace directory\n * @returns All tools ready for use\n */\nexport function createAgentTools(workDir: string) {\n return {\n // Core tools\n execute: createExecuteTool(workDir),\n validateSchema: createValidateSchemaTool(workDir),\n\n // Schema generation (uses @almadar/llm structured output directly)\n generateSchema: createGenerateSchemaTool(),\n\n // Orbital tools (now use internal functions)\n finishTask: createFinishTaskTool(workDir),\n combineSchemas: createCombineSchemasTool(workDir),\n\n // Subagent tools (now use internal functions)\n orbitalSubagent: createOrbitalSubagentTool(),\n traitSubagent: createTraitSubagentTool(),\n\n // Domain tools (now use internal functions)\n domainOrbitalTools: createDomainOrbitalTools({ workDir }),\n\n // Chunking tools\n schemaChunking: createSchemaChunkingTools(workDir),\n\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 * 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 createKimiClient,\n createOpenRouterClient,\n ANTHROPIC_MODELS,\n DEEPSEEK_MODELS,\n OPENAI_MODELS,\n KIMI_MODELS,\n OPENROUTER_MODELS,\n type LLMProvider,\n} from '@almadar/llm';\n\nimport {\n createExecuteTool,\n createFinishTaskTool,\n createValidateSchemaTool,\n createOrbitalSubagentTool,\n createSchemaChunkingTools,\n createDomainOrbitalTools,\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 for main agent */\n provider?: LLMProvider;\n /** Optional: Model name for main agent */\n model?: string;\n /** Optional: LLM provider for subagents (orbital, trait, domain generation). Defaults to 'anthropic' */\n subagentProvider?: LLMProvider;\n /** Optional: Model name for subagents. Defaults to 'claude-sonnet-4-20250514' */\n subagentModel?: 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 'kimi':\n if (verbose)\n console.log(`[SkillAgent] Using Kimi: ${model || KIMI_MODELS.K2_5}`);\n return createKimiClient({\n model: model || KIMI_MODELS.K2_5,\n temperature: 0.6, // Kimi with thinking disabled requires 0.6\n });\n\n case 'openrouter':\n if (verbose)\n console.log(`[SkillAgent] Using OpenRouter: ${model || OPENROUTER_MODELS.QWEN_2_5_72B}`);\n return createOpenRouterClient({\n model: model || OPENROUTER_MODELS.QWEN_2_5_72B,\n temperature: 0.3,\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 subagentProvider = 'anthropic',\n subagentModel = 'claude-sonnet-4-20250514',\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 ORBITAL_BATCH_SKILLS = ['kflow-orbitals-batch'];\n const LEAN_SKILLS = ['kflow-lean-orbitals', 'kflow-lean-fixing'];\n const isOrbitalSkill = primarySkill.name === 'kflow-orbitals';\n const isOrbitalBatchSkill = ORBITAL_BATCH_SKILLS.includes(primarySkill.name);\n const isLeanSkill = LEAN_SKILLS.includes(primarySkill.name);\n const needsChunkingTools = ORBITAL_SKILLS.includes(primarySkill.name);\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 orbitalBatchTool: ReturnType<typeof import('../tools/orbital-batch-subagent.js').createOrbitalBatchSubagentTool>['tool'] | undefined;\n let setBatchEventCallback: ReturnType<typeof import('../tools/orbital-batch-subagent.js').createOrbitalBatchSubagentTool>['setEventCallback'] | 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 provider: subagentProvider,\n model: subagentModel,\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 (isOrbitalBatchSkill) {\n const { createOrbitalBatchSubagentTool } = await import('../tools/orbital-batch-subagent.js');\n const batchResult = createOrbitalBatchSubagentTool({\n requirements: options.requirements,\n provider: subagentProvider,\n model: subagentModel,\n workDir,\n });\n orbitalBatchTool = batchResult.tool;\n setBatchEventCallback = batchResult.setEventCallback;\n\n if (options.onSubagentEvent) {\n setBatchEventCallback(options.onSubagentEvent);\n }\n\n if (verbose) {\n console.log(`[SkillAgent] Batch orbital tools enabled for kflow-orbitals-batch skill`);\n }\n }\n\n if (isLeanSkill) {\n domainOrbitalTools = createDomainOrbitalTools({ \n workDir,\n provider: subagentProvider,\n model: subagentModel,\n });\n if (verbose) {\n console.log(`[SkillAgent] Domain orbital tools enabled for ${primarySkill.name} skill (provider: ${subagentProvider})`);\n }\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 || isOrbitalBatchSkill ? [] : [validateSchemaTool]),\n ...(orbitalTool ? [orbitalTool] : []),\n ...(orbitalBatchTool ? [orbitalBatchTool] : []),\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 ...(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/orbitals/shared/constants.ts","../../src/orbitals/shared/utils.ts","../../src/orbitals/shared/index.ts","../../src/orbitals/batch/prompt-assembler.ts","../../src/orbitals/batch/concurrency.ts","../../src/orbitals/batch/batch-generator.ts","../../src/orbitals/batch/index.ts","../../src/tools/orbital-batch-subagent.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/index.ts","../../src/tools/trait-subagent.ts","../../src/tools/combine-schemas.ts","../../src/tools/schema-chunking.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","../../src/agent/react-reflection.ts","../../src/agent/hitl-v2.ts","../../src/memory/agentic-search.ts","../../src/memory/PreferenceLearner.ts","../../src/agent/memory-integration.ts","../../src/tools/composition.ts","../../src/agent/react-workflow-integration.ts","../../src/agent/hitl-workflow-integration.ts"],"names":["isEntityReference","getInlineEntity","getTraitName","getEntityName","buildContextSection","getFullOrbitalPrompt","init_prompt_assembler","resolve","asyncMapWithConcurrency","tool","LLMClient","z","path2","fs","execAsync","promisify","exec","path3","fs2","path4","AgentDomainCategorySchema","path5","fss","isOrbitalDefinition","uuid","createOrbitalBatchSubagentTool","step","path"],"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 * Shared Constants for Orbital Generation\n *\n * Provider limits, defaults, and configuration constants.\n *\n * @packageDocumentation\n */\n\nimport type { LLMProvider } from '@almadar/llm';\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 openrouter: 5,\n};\n\n/**\n * Default batch sizes per provider (max orbitals per LLM call).\n */\nexport const PROVIDER_BATCH_SIZES: Record<LLMProvider, number> = {\n anthropic: 3, // Anthropic works well with 3 orbitals per call\n openai: 5, // OpenAI can handle more\n deepseek: 3, // Conservative for DeepSeek\n kimi: 3, // Conservative for Kimi\n openrouter: 5, // OpenRouter proxies multiple providers\n};\n\n// ============================================================================\n// Token Limits\n// ============================================================================\n\n/**\n * Maximum tokens for generation (across all providers).\n */\nexport const DEFAULT_MAX_TOKENS = 8192;\n\n/**\n * Maximum tokens for batch generation (higher for multi-orbital).\n */\nexport const BATCH_MAX_TOKENS = 12000;\n\n/**\n * Token buffer for prompt overhead.\n */\nexport const TOKEN_BUFFER = 1000;\n\n// ============================================================================\n// Retry Configuration\n// ============================================================================\n\n/**\n * Maximum retries for failed generation attempts.\n */\nexport const MAX_RETRIES = 2;\n\n/**\n * Delay between retries (ms).\n */\nexport const RETRY_DELAY_MS = 1000;\n\n// ============================================================================\n// Timing Configuration\n// ============================================================================\n\n/**\n * Timeout for single orbital generation (ms).\n */\nexport const SINGLE_GENERATION_TIMEOUT_MS = 120000; // 2 minutes\n\n/**\n * Timeout for batch generation (ms).\n */\nexport const BATCH_GENERATION_TIMEOUT_MS = 300000; // 5 minutes\n\n// ============================================================================\n// Default Values\n// ============================================================================\n\n/**\n * Default LLM provider.\n */\nexport const DEFAULT_PROVIDER: LLMProvider = 'anthropic';\n\n/**\n * Default model for generation.\n */\nexport const DEFAULT_MODEL = 'claude-sonnet-4-20250514';\n\n/**\n * Default model for batch generation.\n */\nexport const DEFAULT_BATCH_MODEL = 'claude-sonnet-4-20250514';\n\n// ============================================================================\n// Cache Configuration\n// ============================================================================\n\n/**\n * Whether to enable prompt caching by default.\n */\nexport const DEFAULT_CACHE_ENABLED = true;\n\n/**\n * Cache TTL in milliseconds (1 hour).\n */\nexport const CACHE_TTL_MS = 60 * 60 * 1000;\n","/**\n * Shared Utilities for Orbital Generation\n *\n * Common utility functions used by both sequential and batch generation.\n *\n * @packageDocumentation\n */\n\nimport type { EntityRef, Entity } from '@almadar/core/types';\nimport { isEntityReference, getTraitName } from '@almadar/core/types';\nimport type { GenerationLog } from './types.js';\n\n// ============================================================================\n// Entity Helpers\n// ============================================================================\n\n/**\n * Get entity name safely from EntityRef.\n */\nexport function 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 */\nexport function getInlineEntity(entity: EntityRef): Entity | null {\n if (isEntityReference(entity)) {\n return null;\n }\n return entity;\n}\n\n/**\n * Get persistence type for an entity.\n */\nexport function getEntityPersistence(entity: EntityRef): string {\n const inlineEntity = getInlineEntity(entity);\n return inlineEntity?.persistence || 'persistent';\n}\n\n/**\n * Get field names as comma-separated string.\n */\nexport function getFieldNames(entity: EntityRef): string {\n const inlineEntity = getInlineEntity(entity);\n if (!inlineEntity?.fields?.length) {\n return 'N/A';\n }\n return inlineEntity.fields.map((f: { name: string }) => f.name).join(', ');\n}\n\n// ============================================================================\n// Trait Helpers\n// ============================================================================\n\n/**\n * Get trait names from orbital traits array.\n */\nexport function getTraitNames(traits: Array<{ name: string } | string>): string {\n return traits.map(t => typeof t === 'string' ? t : getTraitName(t)).join(', ');\n}\n\n// ============================================================================\n// Logging Utilities\n// ============================================================================\n\n/**\n * Create a generation log entry.\n */\nexport function createLog(\n level: GenerationLog['level'],\n message: string,\n data?: Record<string, unknown>\n): GenerationLog {\n return {\n timestamp: Date.now(),\n level,\n message,\n data,\n };\n}\n\n/**\n * Log with orbital context.\n */\nexport function createOrbitalLog(\n level: GenerationLog['level'],\n orbitalName: string,\n message: string,\n data?: Record<string, unknown>\n): GenerationLog {\n return {\n timestamp: Date.now(),\n level,\n message: `[${orbitalName}] ${message}`,\n data: { orbitalName, ...data },\n };\n}\n\n// ============================================================================\n// Context Builders\n// ============================================================================\n\nimport type { OrbitalDefinition } from '@almadar/core/types';\n\n/**\n * Build context section from orbital's domainContext and design fields.\n */\nexport function 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 * Build cross-orbital connectivity section.\n */\nexport function buildConnectivitySection(orbital: OrbitalDefinition): string {\n const parts: string[] = [];\n\n if (orbital.emits?.length) {\n parts.push(`Emits: ${orbital.emits.join(', ')}`);\n }\n\n if (orbital.listens?.length) {\n parts.push(`Listens: ${orbital.listens.map(l => `${l.event}→${l.triggers}`).join(', ')}`);\n }\n\n return parts.join('\\n');\n}\n\n// ============================================================================\n// Validation Utilities\n// ============================================================================\n\n/**\n * Check if an orbital has all required fields.\n */\nexport function isValidOrbital(orbital: unknown): orbital is OrbitalDefinition {\n if (!orbital || typeof orbital !== 'object') {\n return false;\n }\n\n const o = orbital as Record<string, unknown>;\n\n // Required fields\n if (!o.name || typeof o.name !== 'string') {\n return false;\n }\n\n if (!o.entity) {\n return false;\n }\n\n // Entity must have name\n const entity = o.entity as Record<string, unknown>;\n if (!entity.name || typeof entity.name !== 'string') {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validate a batch of orbitals.\n */\nexport function validateOrbitals(orbitals: unknown[]): {\n valid: OrbitalDefinition[];\n invalid: { index: number; reason: string }[];\n} {\n const valid: OrbitalDefinition[] = [];\n const invalid: { index: number; reason: string }[] = [];\n\n for (let i = 0; i < orbitals.length; i++) {\n const orbital = orbitals[i];\n if (isValidOrbital(orbital)) {\n valid.push(orbital);\n } else {\n invalid.push({\n index: i,\n reason: 'Missing required fields (name or entity.name)',\n });\n }\n }\n\n return { valid, invalid };\n}\n\n// ============================================================================\n// Array/Collection Utilities\n// ============================================================================\n\n/**\n * Chunk an array into smaller arrays.\n */\nexport function chunkArray<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n}\n\n/**\n * Group array items by a key function.\n */\nexport function groupBy<T, K>(array: T[], keyFn: (item: T) => K): Map<K, T[]> {\n const groups = new Map<K, T[]>();\n for (const item of array) {\n const key = keyFn(item);\n const existing = groups.get(key) || [];\n existing.push(item);\n groups.set(key, existing);\n }\n return groups;\n}\n\n/**\n * Async map with concurrency limit.\n */\nexport async function asyncMapWithConcurrency<T, R>(\n items: T[],\n mapper: (item: T, index: number) => Promise<R>,\n concurrency: number\n): Promise<R[]> {\n const results: R[] = [];\n const executing: Promise<void>[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const promise = mapper(items[i], i).then(result => {\n results[i] = result;\n });\n executing.push(promise);\n\n if (executing.length >= concurrency) {\n await Promise.race(executing);\n executing.splice(executing.findIndex(p => p === promise), 1);\n }\n }\n\n await Promise.all(executing);\n return results;\n}\n\n// ============================================================================\n// Timing Utilities\n// ============================================================================\n\n/**\n * Measure execution time of an async function.\n */\nexport async function measureTime<T>(\n fn: () => Promise<T>\n): Promise<{ result: T; durationMs: number }> {\n const start = Date.now();\n const result = await fn();\n const durationMs = Date.now() - start;\n return { result, durationMs };\n}\n\n/**\n * Sleep for a specified duration.\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n// ============================================================================\n// Error Handling\n// ============================================================================\n\n/**\n * Get error message from unknown error.\n */\nexport function getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\n/**\n * Check if error is a rate limit error.\n */\nexport function isRateLimitError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n const message = error.message.toLowerCase();\n return (\n message.includes('rate limit') ||\n message.includes('too many requests') ||\n message.includes('429')\n );\n}\n\n/**\n * Check if error is a timeout error.\n */\nexport function isTimeoutError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n const message = error.message.toLowerCase();\n return (\n message.includes('timeout') ||\n message.includes('timed out') ||\n message.includes('etimedout')\n );\n}\n","/**\n * Shared Utilities for Orbital Generation\n *\n * Common types, constants, and utilities used by both sequential\n * and batch generation modules.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport {\n // Core types\n type OrbitalUnit,\n type GenerationLog,\n type ExtractedRequirements,\n // Options\n type BaseGenerationOptions,\n type OrbitalGenerationOptions,\n type ParallelGenerationOptions,\n type BatchGenerationOptions,\n // Results\n type TokenUsage,\n type ValidationResult,\n type OrbitalGenerationResult,\n type ParallelGenerationResult,\n type BatchGenerationResult,\n // Decomposition\n type DecomposeOptions,\n type DecomposeResult,\n // Batch-specific\n type OrbitalBatch,\n type BatchProgressEvent,\n} from './types.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nexport {\n PROVIDER_CONCURRENCY_LIMITS,\n PROVIDER_BATCH_SIZES,\n DEFAULT_MAX_TOKENS,\n BATCH_MAX_TOKENS,\n TOKEN_BUFFER,\n MAX_RETRIES,\n RETRY_DELAY_MS,\n SINGLE_GENERATION_TIMEOUT_MS,\n BATCH_GENERATION_TIMEOUT_MS,\n DEFAULT_PROVIDER,\n DEFAULT_MODEL,\n DEFAULT_BATCH_MODEL,\n DEFAULT_CACHE_ENABLED,\n CACHE_TTL_MS,\n} from './constants.js';\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\nexport {\n // Entity helpers\n getEntityName,\n getInlineEntity,\n getEntityPersistence,\n getFieldNames,\n // Trait helpers\n getTraitNames,\n // Logging\n createLog,\n createOrbitalLog,\n // Context builders\n buildContextSection,\n buildConnectivitySection,\n // Validation\n isValidOrbital,\n validateOrbitals,\n // Array utilities\n chunkArray,\n groupBy,\n asyncMapWithConcurrency,\n // Timing\n measureTime,\n sleep,\n // Error handling\n getErrorMessage,\n isRateLimitError,\n isTimeoutError,\n} from './utils.js';\n","/**\n * Batch Prompt Assembler\n *\n * Assembles prompts for generating multiple orbitals in a single LLM call.\n * Optimized for:\n * - Context sharing (domain vocabulary, design style)\n * - Cross-orbital references (emits/listens wiring)\n * - Token efficiency (shared system context)\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalDefinition } from '@almadar/core/types';\nimport type { AssembledPrompt } from '../cache/index.js';\nimport { computeOrbitalFingerprint } from '../cache/index.js';\nimport { getFullOrbitalPrompt } from '@almadar/skills';\nimport {\n getEntityName,\n getFieldNames,\n buildContextSection,\n buildConnectivitySection,\n chunkArray,\n} from '../shared/index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Assembled prompt for batch generation.\n */\nexport interface BatchAssembledPrompt extends AssembledPrompt {\n /** Number of orbitals in this batch */\n orbitalCount: number;\n /** Names of orbitals in this batch */\n orbitalNames: string[];\n}\n\n/**\n * Shared context extracted from a batch of orbitals.\n */\nexport interface SharedBatchContext {\n /** Domain vocabulary shared across orbitals */\n domainVocabulary?: Record<string, string>;\n /** Design style (minimal, modern, etc.) */\n designStyle?: string;\n /** Common patterns used */\n commonPatterns?: string[];\n /** Cross-orbital event relationships */\n eventRelationships?: Array<{\n emitter: string;\n event: string;\n listener: string;\n handler: string;\n }>;\n}\n\n// ============================================================================\n// Context Extraction\n// ============================================================================\n\n/**\n * Extract shared context from a batch of orbitals.\n */\nexport function extractSharedContext(orbitals: OrbitalDefinition[]): SharedBatchContext {\n const vocabulary: Record<string, string> = {};\n const styles = new Set<string>();\n const patterns = new Set<string>();\n const relationships: SharedBatchContext['eventRelationships'] = [];\n\n // Build vocabulary from all orbitals\n for (const orbital of orbitals) {\n if (orbital.domainContext?.vocabulary) {\n Object.assign(vocabulary, orbital.domainContext.vocabulary);\n }\n if (orbital.design?.style) {\n styles.add(orbital.design.style);\n }\n // Note: patterns are defined in traits, not at orbital level\n // This would need to be extracted from trait render-ui effects\n }\n\n // Build event relationships\n const orbitalMap = new Map(orbitals.map(o => [o.name, o]));\n \n for (const orbital of orbitals) {\n if (orbital.emits) {\n for (const event of orbital.emits) {\n // Find listeners for this event\n for (const other of orbitals) {\n if (other === orbital) continue;\n if (other.listens) {\n const listener = other.listens.find(l => l.event === event.event);\n if (listener) {\n relationships.push({\n emitter: orbital.name,\n event: event.event,\n listener: other.name,\n handler: listener.triggers,\n });\n }\n }\n }\n }\n }\n }\n\n return {\n domainVocabulary: Object.keys(vocabulary).length > 0 ? vocabulary : undefined,\n designStyle: styles.size === 1 ? Array.from(styles)[0] : undefined,\n commonPatterns: patterns.size > 0 ? Array.from(patterns) : undefined,\n eventRelationships: relationships.length > 0 ? relationships : undefined,\n };\n}\n\n// ============================================================================\n// Batch Prompt Assembly\n// ============================================================================\n\n/**\n * Assemble a batch prompt for generating multiple orbitals in one call.\n *\n * @example\n * ```typescript\n * const batchPrompt = assembleBatchPrompt([\n * { name: \"Products\", entity: {...}, traits: [...] },\n * { name: \"Orders\", entity: {...}, traits: [...] },\n * { name: \"Customers\", entity: {...}, traits: [...] },\n * ]);\n * // Returns a single prompt that generates all 3 orbitals\n * ```\n */\nexport function assembleBatchPrompt(\n orbitals: OrbitalDefinition[],\n options: {\n baseSystemPrompt?: string;\n includeConnectivity?: boolean;\n } = {}\n): BatchAssembledPrompt {\n const {\n baseSystemPrompt = getFullOrbitalPrompt(),\n includeConnectivity = true,\n } = options;\n\n if (orbitals.length === 0) {\n throw new Error('Cannot assemble batch prompt for empty orbitals array');\n }\n\n // Extract shared context\n const sharedContext = extractSharedContext(orbitals);\n\n // Build batch header\n const batchHeader = buildBatchHeader(orbitals, sharedContext);\n\n // Build individual orbital sections\n const orbitalSections = orbitals.map((orbital, index) =>\n buildOrbitalSection(orbital, index + 1, orbitals.length, includeConnectivity)\n );\n\n // Build output format section\n const outputSection = buildOutputSection(orbitals);\n\n // Combine all sections\n const prompt = `${baseSystemPrompt}\n\n${'='.repeat(60)}\nBATCH GENERATION: ${orbitals.length} ORBITALS\n${'='.repeat(60)}\n\n${batchHeader}\n\n${orbitalSections.join('\\n\\n')}\n\n${outputSection}`;\n\n // Generate composite fingerprint\n const fingerprint = generateBatchFingerprint(orbitals);\n\n return {\n prompt,\n fingerprint,\n usedCachedTemplate: false, // Batch doesn't use templates yet\n orbitalCount: orbitals.length,\n orbitalNames: orbitals.map(o => o.name),\n };\n}\n\n/**\n * Build the batch header with shared context.\n */\nfunction buildBatchHeader(\n orbitals: OrbitalDefinition[],\n sharedContext: SharedBatchContext\n): string {\n const lines: string[] = [\n `## Batch Overview`,\n `- Total Orbitals: ${orbitals.length}`,\n `- Orbitals: ${orbitals.map(o => o.name).join(', ')}`,\n ];\n\n if (sharedContext.designStyle) {\n lines.push(`- Design Style: ${sharedContext.designStyle}`);\n }\n\n if (sharedContext.commonPatterns?.length) {\n lines.push(`- Common Patterns: ${sharedContext.commonPatterns.join(', ')}`);\n }\n\n if (sharedContext.domainVocabulary && Object.keys(sharedContext.domainVocabulary).length > 0) {\n lines.push(`\\n## Shared Domain Vocabulary`);\n for (const [term, definition] of Object.entries(sharedContext.domainVocabulary)) {\n lines.push(`- ${term}: ${definition}`);\n }\n }\n\n if (sharedContext.eventRelationships?.length) {\n lines.push(`\\n## Cross-Orbital Event Relationships`);\n for (const rel of sharedContext.eventRelationships) {\n lines.push(`- ${rel.emitter} emits \"${rel.event}\" → ${rel.listener} handles with \"${rel.handler}\"`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Build a section for a single orbital within the batch.\n */\nfunction buildOrbitalSection(\n orbital: OrbitalDefinition,\n index: number,\n total: number,\n includeConnectivity: boolean\n): string {\n const entityName = getEntityName(orbital.entity);\n const fieldNames = getFieldNames(orbital.entity);\n const contextSection = buildContextSection(orbital);\n const connectivitySection = includeConnectivity ? buildConnectivitySection(orbital) : '';\n\n return `---\n## ORBITAL ${index}/${total}: ${orbital.name}\n\n**Entity**: ${entityName}\n**Persistence**: ${(orbital.entity as { persistence?: string }).persistence || 'persistent'}\n**Fields**: ${fieldNames}\n**Traits**: ${orbital.traits.map(t => typeof t === 'string' ? t : 'ref' in t ? t.ref : t.name).join(', ')}\n${contextSection}${connectivitySection ? `**Connectivity**:\\n${connectivitySection}\\n` : ''}\nGenerate a complete FullOrbitalUnit for ${orbital.name} with:\n- Full field definitions with types and validation\n- Trait state machines with transitions and effects\n- Business rule validation using \"guard\" 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${orbital.emits?.length ? '- PRESERVE emits: ' + orbital.emits.map(e => e.event).join(', ') : ''}\n${orbital.listens?.length ? '- PRESERVE listens: ' + orbital.listens.map(l => l.event).join(', ') : ''}`;\n}\n\n/**\n * Build the output format section.\n */\nfunction buildOutputSection(orbitals: OrbitalDefinition[]): string {\n return `---\n## OUTPUT FORMAT\n\nReturn a JSON object with this exact structure:\n\n\\`\\`\\`json\n{\n \"orbitals\": [\n${orbitals.map((o, i) => ` {\n \"name\": \"${o.name}\",\n // ... complete FullOrbitalUnit for ${o.name}\n }${i < orbitals.length - 1 ? ',' : ''}`).join('\\n')}\n ]\n}\n\\`\\`\\`\n\n**CRITICAL RULES:**\n1. Return a SINGLE JSON object with an \"orbitals\" array\n2. Each element in the array is a complete FullOrbitalUnit\n3. Maintain the order: ${orbitals.map(o => o.name).join(', ')}\n4. PRESERVE all emits/listens as specified in each orbital section\n5. Use shared domain vocabulary consistently across all orbitals\n6. Ensure cross-orbital event wiring is maintained\n`;\n}\n\n/**\n * Generate a composite fingerprint for the batch.\n */\nfunction generateBatchFingerprint(orbitals: OrbitalDefinition[]): string {\n const fingerprints = orbitals.map(o => computeOrbitalFingerprint(o));\n const combined = fingerprints.sort().join('|');\n \n // Simple hash of combined fingerprints\n let hash = 0;\n for (let i = 0; i < combined.length; i++) {\n const char = combined.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n \n return `batch:${orbitals.length}:${Math.abs(hash).toString(16).slice(0, 8)}`;\n}\n\n// ============================================================================\n// Batch Splitting\n// ============================================================================\n\n/**\n * Split orbitals into optimally-sized batches.\n *\n * Considers:\n * - Provider token limits\n * - Cross-orbital relationships (keeps related orbitals together)\n * - Batch size limits\n *\n * @example\n * ```typescript\n * const batches = splitIntoBatches(orbitals, {\n * maxBatchSize: 3,\n * provider: 'anthropic'\n * });\n * // Returns: [[orb1, orb2, orb3], [orb4, orb5], [orb6]]\n * ```\n */\nexport function splitIntoBatches(\n orbitals: OrbitalDefinition[],\n options: {\n maxBatchSize?: number;\n provider?: 'anthropic' | 'openai' | 'deepseek' | 'kimi' | 'openrouter';\n preserveRelationships?: boolean;\n } = {}\n): OrbitalDefinition[][] {\n const {\n maxBatchSize = 3,\n preserveRelationships = true,\n } = options;\n\n if (!preserveRelationships) {\n // Simple chunking without relationship preservation\n return chunkArray(orbitals, maxBatchSize);\n }\n\n // Group orbitals by relationship clusters\n const clusters = groupByRelationships(orbitals);\n \n // Split clusters into batches respecting maxBatchSize\n const batches: OrbitalDefinition[][] = [];\n \n for (const cluster of clusters) {\n if (cluster.length <= maxBatchSize) {\n // Cluster fits in one batch\n batches.push(cluster);\n } else {\n // Split large cluster\n batches.push(...chunkArray(cluster, maxBatchSize));\n }\n }\n\n return batches;\n}\n\n/**\n * Group orbitals into relationship clusters.\n * Orbitals that emit/listen to each other are grouped together.\n */\nfunction groupByRelationships(orbitals: OrbitalDefinition[]): OrbitalDefinition[][] {\n const visited = new Set<string>();\n const clusters: OrbitalDefinition[][] = [];\n\n // Build adjacency map\n const adjacency = new Map<string, Set<string>>();\n \n for (const orbital of orbitals) {\n if (!adjacency.has(orbital.name)) {\n adjacency.set(orbital.name, new Set());\n }\n\n // Add connections based on emits/listens\n if (orbital.emits) {\n for (const event of orbital.emits) {\n // Find listeners for this event\n for (const other of orbitals) {\n if (other === orbital) continue;\n if (other.listens?.some(l => l.event === event.event)) {\n adjacency.get(orbital.name)?.add(other.name);\n if (!adjacency.has(other.name)) {\n adjacency.set(other.name, new Set());\n }\n adjacency.get(other.name)?.add(orbital.name);\n }\n }\n }\n }\n }\n\n // Find connected components using DFS\n function dfs(orbital: OrbitalDefinition, cluster: OrbitalDefinition[]) {\n visited.add(orbital.name);\n cluster.push(orbital);\n\n const neighbors = adjacency.get(orbital.name) || new Set();\n for (const neighborName of neighbors) {\n if (!visited.has(neighborName)) {\n const neighbor = orbitals.find(o => o.name === neighborName);\n if (neighbor) {\n dfs(neighbor, cluster);\n }\n }\n }\n }\n\n // Find all clusters\n for (const orbital of orbitals) {\n if (!visited.has(orbital.name)) {\n const cluster: OrbitalDefinition[] = [];\n dfs(orbital, cluster);\n clusters.push(cluster);\n }\n }\n\n return clusters;\n}\n\n// ============================================================================\n// Token Estimation\n// ============================================================================\n\n/**\n * Estimate token count for a batch prompt.\n * Rough estimate: ~4 characters per token.\n */\nexport function estimateBatchTokens(orbitals: OrbitalDefinition[]): number {\n const baseTokens = 2000; // System prompt overhead\n const perOrbitalTokens = 800; // Average orbital description\n \n return baseTokens + (orbitals.length * perOrbitalTokens);\n}\n\n/**\n * Check if a batch will fit within token limits.\n */\nexport function willBatchFit(\n orbitals: OrbitalDefinition[],\n maxTokens: number = 12000\n): boolean {\n const estimated = estimateBatchTokens(orbitals);\n // Leave 50% buffer for response\n return estimated < (maxTokens * 0.5);\n}\n","/**\n * Concurrency Controller\n *\n * Semaphore-based concurrency control for parallel operations.\n *\n * @packageDocumentation\n */\n\nimport type { ConcurrencyController } from './types.js';\n\n/**\n * Create a semaphore-based concurrency controller.\n *\n * @example\n * ```typescript\n * const controller = createConcurrencyController(3); // Max 3 concurrent\n *\n * await controller.acquire(); // Acquire slot\n * try {\n * await doWork();\n * } finally {\n * controller.release(); // Release slot\n * }\n * ```\n */\nexport function createConcurrencyController(maxConcurrency: number): ConcurrencyController {\n let activeCount = 0;\n const queue: Array<() => void> = [];\n\n return {\n async acquire(): Promise<void> {\n if (activeCount < maxConcurrency) {\n activeCount++;\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n queue.push(() => {\n activeCount++;\n resolve();\n });\n });\n },\n\n release(): void {\n activeCount = Math.max(0, activeCount - 1);\n const next = queue.shift();\n if (next) {\n next();\n }\n },\n\n get activeCount(): number {\n return activeCount;\n },\n\n get waitingCount(): number {\n return queue.length;\n },\n };\n}\n\n/**\n * Execute an array of async functions with concurrency control.\n *\n * @example\n * ```typescript\n * const results = await runWithConcurrency(\n * items.map(item => () => processItem(item)),\n * { concurrency: 3 }\n * );\n * ```\n */\nexport async function runWithConcurrency<T>(\n tasks: Array<() => Promise<T>>,\n options: { concurrency: number; onProgress?: (completed: number, total: number) => void }\n): Promise<T[]> {\n const { concurrency, onProgress } = options;\n const controller = createConcurrencyController(concurrency);\n const results: T[] = [];\n let completed = 0;\n\n await Promise.all(\n tasks.map(async (task, index) => {\n await controller.acquire();\n try {\n results[index] = await task();\n completed++;\n onProgress?.(completed, tasks.length);\n } finally {\n controller.release();\n }\n })\n );\n\n return results;\n}\n\n/**\n * Async map with concurrency limit.\n *\n * Similar to Promise.all() but with max concurrency.\n *\n * @example\n * ```typescript\n * const results = await asyncMapWithConcurrency(\n * items,\n * async (item, index) => process(item),\n * 3 // max 3 concurrent\n * );\n * ```\n */\nexport async function asyncMapWithConcurrency<T, R>(\n items: T[],\n mapper: (item: T, index: number) => Promise<R>,\n concurrency: number\n): Promise<R[]> {\n return runWithConcurrency(\n items.map((item, index) => () => mapper(item, index)),\n { concurrency }\n );\n}\n","/**\n * Batch Generator\n *\n * Core batch generation logic for generating multiple orbitals efficiently.\n * Supports multiple modes: single-call, parallel-individual, adaptive.\n *\n * @packageDocumentation\n */\n\nimport type { LLMClient } from '@almadar/llm';\nimport type { OrbitalDefinition } from '@almadar/core/types';\nimport {\n createLog,\n getErrorMessage,\n PROVIDER_CONCURRENCY_LIMITS,\n PROVIDER_BATCH_SIZES,\n BATCH_MAX_TOKENS,\n} from '../shared/index.js';\nimport type {\n GenerationLog,\n BatchGenerationOptions,\n BatchGenerationResult,\n BatchProgressEvent,\n SingleBatchResult,\n} from './types.js';\nimport { assembleBatchPrompt, splitIntoBatches, willBatchFit } from './prompt-assembler.js';\nimport { asyncMapWithConcurrency } from './concurrency.js';\n\n// ============================================================================\n// Main Batch Generation Function\n// ============================================================================\n\n/**\n * Generate multiple orbitals in optimized batches.\n *\n * This is the main entry point for batch generation. It:\n * 1. Splits orbitals into optimal batches\n * 2. Generates each batch (parallel or sequential)\n * 3. Combines results into final schema\n *\n * @example\n * ```typescript\n * const result = await generateOrbitalsBatch(client, [\n * { name: \"Products\", ... },\n * { name: \"Orders\", ... },\n * { name: \"Customers\", ... },\n * ], { mode: 'single-call', batchSize: 3 });\n *\n * console.log(`Generated ${result.summary.successful}/${result.summary.total} orbitals`);\n * console.log(`Total time: ${result.totalDurationMs}ms`);\n * ```\n */\nexport async function generateOrbitalsBatch(\n client: LLMClient,\n orbitals: OrbitalDefinition[],\n options: BatchGenerationOptions = {}\n): Promise<BatchGenerationResult> {\n const startTime = Date.now();\n const aggregateLogs: GenerationLog[] = [];\n \n const provider = client.getProvider();\n const mode = options.mode || 'single-call';\n const maxConcurrency = options.concurrency ?? PROVIDER_CONCURRENCY_LIMITS[provider];\n const maxBatchSize = options.batchSize ?? PROVIDER_BATCH_SIZES[provider];\n\n console.log(`[BatchGenerator] Starting batch generation: ${orbitals.length} orbitals, mode=${mode}, concurrency=${maxConcurrency}`);\n\n aggregateLogs.push(createLog('info', `Starting batch generation`, {\n totalOrbitals: orbitals.length,\n mode,\n provider,\n maxConcurrency,\n maxBatchSize,\n }));\n\n // Split into batches\n const batches = splitIntoBatches(orbitals, {\n maxBatchSize,\n provider,\n preserveRelationships: options.preserveRelationships ?? true,\n });\n\n console.log(`[BatchGenerator] Split into ${batches.length} batches: [${batches.map(b => b.length).join(', ')}]`);\n\n aggregateLogs.push(createLog('info', `Split into ${batches.length} batches`, {\n batchSizes: batches.map(b => b.length),\n }));\n\n // Emit batch start event\n options.onBatchProgress?.({\n type: 'batch_start',\n batchIndex: 0,\n totalBatches: batches.length,\n completedOrbitals: 0,\n totalOrbitals: orbitals.length,\n });\n\n // Generate batches based on mode\n let batchResults: SingleBatchResult[];\n \n if (mode === 'parallel-individual') {\n // Each orbital gets its own LLM call, but calls are parallel\n batchResults = await generateParallelIndividual(client, orbitals, {\n ...options,\n concurrency: maxConcurrency,\n onBatchProgress: options.onBatchProgress,\n });\n } else if (mode === 'single-call') {\n // Multiple orbitals per LLM call\n batchResults = await generateSingleCallBatches(client, batches, {\n ...options,\n concurrency: maxConcurrency,\n onBatchProgress: options.onBatchProgress,\n });\n } else {\n // Adaptive: use single-call if fits, otherwise parallel-individual\n batchResults = await generateAdaptive(client, orbitals, batches, {\n ...options,\n concurrency: maxConcurrency,\n maxBatchSize,\n onBatchProgress: options.onBatchProgress,\n });\n }\n\n const totalDurationMs = Date.now() - startTime;\n \n // Aggregate results\n const allResults = batchResults.flatMap(b => b.results);\n const successful = allResults.filter(r => r.success).length;\n const failed = allResults.length - successful;\n const totalTokens = batchResults.reduce(\n (sum, b) => sum + (b.usage?.totalTokens ?? 0),\n 0\n );\n\n console.log(`[BatchGenerator] Complete: ${successful}/${allResults.length} successful, ${totalTokens} tokens, ${totalDurationMs}ms`);\n\n aggregateLogs.push(createLog('info', `Batch generation completed`, {\n totalDurationMs,\n successful,\n failed,\n totalTokens,\n totalBatches: batches.length,\n }));\n\n // Emit completion event\n options.onBatchProgress?.({\n type: 'batch_complete',\n batchIndex: batches.length - 1,\n totalBatches: batches.length,\n completedOrbitals: successful,\n totalOrbitals: orbitals.length,\n });\n\n return {\n results: allResults.map(r => ({\n orbital: r.orbital,\n fingerprint: '', // TODO: compute from orbital\n usedTemplate: false,\n usage: undefined,\n validation: r.success\n ? { valid: true, errorCount: 0, warningCount: 0 }\n : { valid: false, errorCount: 1, warningCount: 0 },\n logs: [],\n })),\n totalDurationMs,\n aggregateLogs,\n summary: {\n total: allResults.length,\n successful,\n failed,\n totalTokens,\n },\n batchResults,\n totalBatches: batches.length,\n };\n}\n\n// ============================================================================\n// Generation Modes\n// ============================================================================\n\n/**\n * Generate using single-call batches (multiple orbitals per LLM call).\n */\nasync function generateSingleCallBatches(\n client: LLMClient,\n batches: OrbitalDefinition[][],\n options: BatchGenerationOptions & { concurrency: number }\n): Promise<SingleBatchResult[]> {\n let completedOrbitals = 0;\n const totalOrbitals = batches.reduce((sum, b) => sum + b.length, 0);\n\n return asyncMapWithConcurrency(\n batches,\n async (batch, batchIndex) => {\n return generateSingleBatch(client, batch, batchIndex, {\n ...options,\n onProgress: (completedInBatch) => {\n const newCompleted = completedOrbitals + completedInBatch;\n options.onBatchProgress?.({\n type: 'orbital_complete',\n batchIndex,\n totalBatches: batches.length,\n completedOrbitals: newCompleted,\n totalOrbitals,\n });\n completedOrbitals = newCompleted;\n },\n });\n },\n options.concurrency\n );\n}\n\n/**\n * Generate using parallel individual calls (one orbital per LLM call).\n */\nasync function generateParallelIndividual(\n client: LLMClient,\n orbitals: OrbitalDefinition[],\n options: BatchGenerationOptions & { concurrency: number }\n): Promise<SingleBatchResult[]> {\n // Create single-orbital batches\n const batches = orbitals.map(o => [o]);\n \n return generateSingleCallBatches(client, batches, {\n ...options,\n concurrency: options.concurrency,\n });\n}\n\n/**\n * Adaptive mode: choose best strategy based on orbitals.\n * \n * Strategy:\n * - If we can fit multiple orbitals per batch, use single-call batches\n * - This provides true speedup (one LLM call for 2-3 orbitals)\n */\nasync function generateAdaptive(\n client: LLMClient,\n orbitals: OrbitalDefinition[],\n batches: OrbitalDefinition[][],\n options: BatchGenerationOptions & { concurrency: number; maxBatchSize: number }\n): Promise<SingleBatchResult[]> {\n // Check if all batches can fit in single LLM calls\n const allFit = batches.every(batch => willBatchFit(batch, BATCH_MAX_TOKENS));\n \n // Use single-call batches if they fit and we have a reasonable number\n // This provides 2x+ speedup by generating multiple orbitals per LLM call\n if (allFit) {\n console.log(`[BatchGenerator] Adaptive: Using single-call batches (${batches.length} batches)`);\n return generateSingleCallBatches(client, batches, options);\n }\n \n // Fall back to parallel individual if batches are too large\n console.log(`[BatchGenerator] Adaptive: Using parallel-individual (batches too large)`);\n return generateParallelIndividual(client, orbitals, options);\n}\n\n// ============================================================================\n// Single Batch Generation\n// ============================================================================\n\n/**\n * Generate a single batch of orbitals.\n */\nasync function generateSingleBatch(\n client: LLMClient,\n orbitals: OrbitalDefinition[],\n batchIndex: number,\n options: BatchGenerationOptions & { onProgress?: (completed: number) => void }\n): Promise<SingleBatchResult> {\n const batchStartTime = Date.now();\n const logs: GenerationLog[] = [];\n\n console.log(`[BatchGenerator] Starting batch ${batchIndex + 1}: ${orbitals.map(o => o.name).join(', ')}`);\n\n logs.push(createLog('info', `Starting batch ${batchIndex + 1}`, {\n orbitalCount: orbitals.length,\n orbitals: orbitals.map(o => o.name),\n }));\n\n try {\n // Assemble batch prompt\n const batchPrompt = assembleBatchPrompt(orbitals);\n console.log(`[BatchGenerator] Batch ${batchIndex + 1} prompt assembled: ${batchPrompt.prompt.length} chars`);\n \n logs.push(createLog('info', `Batch prompt assembled`, {\n promptLength: batchPrompt.prompt.length,\n estimatedTokens: Math.ceil(batchPrompt.prompt.length / 4),\n }));\n\n // Make LLM call\n const llmResult = await client.callWithMetadata({\n systemPrompt: batchPrompt.prompt,\n userPrompt: 'Generate all orbitals in the batch. Return valid JSON matching the output format specified.',\n maxTokens: BATCH_MAX_TOKENS,\n skipSchemaValidation: true,\n });\n\n logs.push(createLog('info', `LLM call completed`, {\n promptTokens: llmResult.usage?.promptTokens,\n completionTokens: llmResult.usage?.completionTokens,\n }));\n\n // Parse result\n const parsed = parseBatchResult(llmResult.data, orbitals);\n console.log(`[BatchGenerator] Batch ${batchIndex + 1} parsed: ${parsed.filter(p => p.success).length}/${parsed.length} successful`);\n \n // Report progress\n for (let i = 0; i < parsed.length; i++) {\n options.onProgress?.(i + 1);\n }\n\n const durationMs = Date.now() - batchStartTime;\n\n logs.push(createLog('info', `Batch ${batchIndex + 1} completed`, {\n durationMs,\n successful: parsed.filter(r => r.success).length,\n }));\n\n return {\n orbitals,\n results: parsed,\n usage: llmResult.usage ?? undefined,\n durationMs,\n logs,\n };\n\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n console.error(`[BatchGenerator] Batch ${batchIndex + 1} FAILED: ${errorMessage}`);\n \n logs.push(createLog('error', `Batch ${batchIndex + 1} failed`, {\n error: errorMessage,\n }));\n\n // Return failed results for all orbitals in batch\n return {\n orbitals,\n results: orbitals.map(o => ({\n orbital: o,\n success: false,\n error: errorMessage,\n })),\n durationMs: Date.now() - batchStartTime,\n logs,\n };\n }\n}\n\n// ============================================================================\n// Result Parsing\n// ============================================================================\n\n/**\n * Parse batch generation result.\n */\nfunction parseBatchResult(\n data: unknown,\n expectedOrbitals: OrbitalDefinition[]\n): Array<{ orbital: OrbitalDefinition; success: boolean; error?: string }> {\n if (!data || typeof data !== 'object') {\n return expectedOrbitals.map(o => ({\n orbital: o,\n success: false,\n error: 'Invalid response: expected object',\n }));\n }\n\n const obj = data as Record<string, unknown>;\n \n // Check for orbitals array\n if (!obj.orbitals || !Array.isArray(obj.orbitals)) {\n return expectedOrbitals.map(o => ({\n orbital: o,\n success: false,\n error: 'Invalid response: missing orbitals array',\n }));\n }\n\n const results = obj.orbitals as OrbitalDefinition[];\n \n // Match results to expected orbitals\n return expectedOrbitals.map((expected, index) => {\n const result = results[index];\n \n if (!result) {\n return {\n orbital: expected,\n success: false,\n error: `Missing result for orbital ${index + 1}`,\n };\n }\n\n // Basic validation\n if (!result.name) {\n return {\n orbital: expected,\n success: false,\n error: 'Generated orbital missing name',\n };\n }\n\n return {\n orbital: result,\n success: true,\n };\n });\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Estimate optimal batch configuration for a set of orbitals.\n */\nexport function estimateOptimalBatchConfig(\n orbitals: OrbitalDefinition[],\n provider: 'anthropic' | 'openai' | 'deepseek' | 'kimi' | 'openrouter'\n): {\n recommendedMode: 'single-call' | 'parallel-individual';\n optimalBatchSize: number;\n estimatedBatches: number;\n estimatedTimeSeconds: number;\n} {\n const defaultBatchSize = PROVIDER_BATCH_SIZES[provider];\n const concurrency = PROVIDER_CONCURRENCY_LIMITS[provider];\n \n // Check if single-call is feasible\n const canSingleCall = willBatchFit(orbitals, BATCH_MAX_TOKENS);\n \n if (canSingleCall && orbitals.length <= defaultBatchSize) {\n return {\n recommendedMode: 'single-call',\n optimalBatchSize: orbitals.length,\n estimatedBatches: 1,\n estimatedTimeSeconds: 60, // ~60s for single batch\n };\n }\n \n // Multiple batches needed\n const batchSize = defaultBatchSize;\n const numBatches = Math.ceil(orbitals.length / batchSize);\n const parallelBatches = Math.ceil(numBatches / concurrency);\n \n return {\n recommendedMode: 'single-call',\n optimalBatchSize: batchSize,\n estimatedBatches: numBatches,\n estimatedTimeSeconds: parallelBatches * 60,\n };\n}\n","/**\n * Batch Orbital Generation\n *\n * Efficient batch generation of multiple orbitals using:\n * - Single-call batch mode (multiple orbitals per LLM call)\n * - Parallel individual mode (concurrent single-orbital calls)\n * - Adaptive mode (automatically chooses best strategy)\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Core Generation\n// ============================================================================\n\nexport {\n generateOrbitalsBatch,\n estimateOptimalBatchConfig,\n} from './batch-generator.js';\n\n// ============================================================================\n// Prompt Assembly\n// ============================================================================\n\nexport {\n assembleBatchPrompt,\n splitIntoBatches,\n extractSharedContext,\n estimateBatchTokens,\n willBatchFit,\n type BatchAssembledPrompt,\n type SharedBatchContext,\n} from './prompt-assembler.js';\n\n// ============================================================================\n// Concurrency\n// ============================================================================\n\nexport {\n createConcurrencyController,\n runWithConcurrency,\n asyncMapWithConcurrency,\n} from './concurrency.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport {\n type BatchGenerationOptions,\n type BatchGenerationResult,\n type BatchProgressEvent,\n type SingleBatchResult,\n type ConcurrencyController,\n type BatchMode,\n type SingleCallBatchOptions,\n type ParallelIndividualOptions,\n type AdaptiveBatchOptions,\n} from './types.js';\n","/**\n * Orbital Batch Subagent Tool\n *\n * Tool for generating multiple orbitals in optimized batches.\n * Provides significant speedup (2x-3x) for multi-orbital generation.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { OrbitalDefinition } from '@almadar/core/types';\nimport { LLMClient, type LLMProvider } from '@almadar/llm';\nimport type { SSEEventType } from '../api-types.js';\nimport {\n type ExtractedRequirements,\n createLog,\n PROVIDER_CONCURRENCY_LIMITS,\n} from '../orbitals/shared/index.js';\nimport {\n generateOrbitalsBatch,\n type BatchGenerationOptions,\n type BatchProgressEvent,\n} from '../orbitals/batch/index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n// Note: This matches the signature from orbital-subagent.ts for compatibility\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 BatchCompleteCallback = (\n orbitals: OrbitalDefinition[],\n batchIndex: number,\n totalBatches: number,\n) => Promise<void> | void;\n\nexport interface OrbitalBatchSubagentToolOptions {\n onSubagentEvent?: SubagentEventCallback;\n onBatchComplete?: BatchCompleteCallback;\n requirements?: Partial<ExtractedRequirements>;\n provider?: LLMProvider;\n model?: string;\n workDir?: string;\n}\n\n// ============================================================================\n// Zod Schema\n// ============================================================================\n\nconst OrbitalBatchInputSchema = z.object({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n orbitals: z.array(z.any()).describe('Array of OrbitalUnits to generate'),\n options: z\n .object({\n mode: z.enum(['single-call', 'parallel-individual', 'adaptive']).optional().default('adaptive'),\n batchSize: z.number().optional(),\n maxConcurrency: z.number().optional(),\n preserveRelationships: z.boolean().optional().default(true),\n })\n .optional()\n .describe('Batch generation options'),\n});\n\n// ============================================================================\n// Tool Factory\n// ============================================================================\n\n/**\n * Create a tool for batch orbital generation with event streaming.\n */\nexport function createOrbitalBatchSubagentTool(options: OrbitalBatchSubagentToolOptions = {}) {\n let eventCallback: SubagentEventCallback | undefined = options.onSubagentEvent;\n let completeCallback: BatchCompleteCallback | undefined = options.onBatchComplete;\n const requirements = options.requirements;\n const workDir = options.workDir;\n\n const setEventCallback = (callback: SubagentEventCallback) => {\n eventCallback = callback;\n };\n\n const setBatchCompleteCallback = (callback: BatchCompleteCallback) => {\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 batchTool = tool(\n async ({ orbitals, options: batchOptions }) => {\n if (!orbitals || orbitals.length === 0) {\n return JSON.stringify({\n success: false,\n error: 'No orbitals provided for batch generation.',\n orbitals: [],\n });\n }\n\n console.log(`[OrbitalBatchSubagent] Starting batch generation for ${orbitals.length} orbitals`);\n\n try {\n emitEvent('batch', 0, 1, 'message', {\n content: `Starting batch generation for ${orbitals.length} orbitals`,\n role: 'assistant',\n isComplete: false,\n });\n\n emitEvent('batch', 0, 1, 'todo_update', {\n todos: orbitals.map((o, i) => ({\n id: `orbital-${i}`,\n task: `Generate ${o.name}`,\n status: 'pending' as const,\n })),\n });\n\n // Create LLM client\n const client = new LLMClient({\n provider: options.provider || 'anthropic',\n model: options.model || 'claude-sonnet-4-20250514',\n });\n\n // Prepare batch generation options\n const generationOptions: BatchGenerationOptions = {\n mode: batchOptions?.mode || 'adaptive',\n batchSize: batchOptions?.batchSize,\n concurrency: batchOptions?.maxConcurrency ?? PROVIDER_CONCURRENCY_LIMITS[client.getProvider()],\n preserveRelationships: batchOptions?.preserveRelationships ?? true,\n requirements,\n onBatchProgress: (event: BatchProgressEvent) => {\n // Update todo for orbital completion\n if (event.type === 'orbital_complete' && event.orbitalName) {\n emitEvent(event.orbitalName || 'batch', event.batchIndex, event.totalBatches, 'todo_update', {\n todos: orbitals.map((o, i) => ({\n id: `orbital-${i}`,\n task: `Generate ${o.name}`,\n status:\n o.name === event.orbitalName\n ? 'completed'\n : event.completedOrbitals > i\n ? 'completed'\n : 'pending',\n })),\n });\n }\n\n // Log progress\n emitEvent(event.orbitalName || 'batch', event.batchIndex, event.totalBatches, 'generation_log', {\n level: 'info',\n message: `Progress: ${event.completedOrbitals}/${event.totalOrbitals} orbitals complete`,\n data: {\n batchIndex: event.batchIndex,\n completedOrbitals: event.completedOrbitals,\n totalOrbitals: event.totalOrbitals,\n },\n });\n },\n };\n\n emitEvent('batch', 0, 1, 'tool_call', {\n tool: 'generateOrbitalsBatch',\n args: {\n orbitalCount: orbitals.length,\n mode: generationOptions.mode,\n concurrency: generationOptions.concurrency,\n },\n });\n\n // Execute batch generation\n const result = await generateOrbitalsBatch(client, orbitals, generationOptions);\n\n // Report completion\n emitEvent('batch', result.totalBatches - 1, result.totalBatches, 'todo_update', {\n todos: orbitals.map((o, i) => ({\n id: `orbital-${i}`,\n task: `Generate ${o.name}`,\n status: result.batchResults.some(\n b => b.results.some(r => r.orbital.name === o.name && r.success)\n )\n ? 'completed'\n : 'failed',\n })),\n });\n\n // Extract generated orbitals\n const generatedOrbitals = result.results\n .filter(r => r.orbital)\n .map(r => r.orbital);\n\n const successCount = generatedOrbitals.length;\n const failedCount = orbitals.length - successCount;\n\n emitEvent('batch', result.totalBatches - 1, result.totalBatches, 'message', {\n content: `Batch generation complete: ${successCount}/${orbitals.length} orbitals generated successfully`,\n role: 'assistant',\n isComplete: true,\n });\n\n // Persist orbitals if workDir provided\n if (workDir && completeCallback && generatedOrbitals.length > 0) {\n try {\n await completeCallback(generatedOrbitals, 0, 1);\n emitEvent('batch', result.totalBatches - 1, result.totalBatches, 'generation_log', {\n level: 'info',\n message: `Persisted ${generatedOrbitals.length} orbitals`,\n });\n } catch (persistError) {\n console.error(`[OrbitalBatchSubagent] Failed to persist orbitals:`, persistError);\n emitEvent('batch', result.totalBatches - 1, result.totalBatches, 'generation_log', {\n level: 'warn',\n message: 'Failed to persist some orbitals',\n data: { error: String(persistError) },\n });\n }\n }\n\n return JSON.stringify({\n success: successCount === orbitals.length,\n generated: successCount,\n failed: failedCount,\n total: orbitals.length,\n orbitals: generatedOrbitals,\n duration: result.totalDurationMs,\n totalTokens: result.summary.totalTokens,\n batches: result.totalBatches,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`[OrbitalBatchSubagent] Batch generation failed:`, errorMessage);\n\n emitEvent('batch', 0, 1, 'error', {\n error: errorMessage,\n code: 'BATCH_GENERATION_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessage,\n orbitals: [],\n });\n }\n },\n {\n name: 'generate_orbitals_batch',\n description:\n 'Generate multiple orbitals in optimized batches. MUCH FASTER than calling generate_orbital multiple times. Use this when generating 3+ orbitals. Supports parallel generation with automatic concurrency control.',\n schema: OrbitalBatchInputSchema,\n },\n );\n\n return {\n tool: batchTool,\n setEventCallback,\n setBatchCompleteCallback,\n };\n}\n\n// ============================================================================\n// Re-export Types (avoid duplicates - use explicit renames if needed)\n// ============================================================================\n\n// Types already exported above, no need to re-export\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// Design Quality Checks\n// ============================================================================\n\n/** Prop corrections: wrong name → correct name */\nconst PROP_CORRECTIONS: Record<string, string> = {\n onSubmit: 'submitEvent',\n onCancel: 'cancelEvent',\n headerActions: 'actions',\n loading: 'isLoading',\n fieldNames: 'fields',\n};\n\n/**\n * Auto-correct known prop misnaming in render-ui effects.\n * Returns the number of corrections made.\n */\nfunction autoCorrectProps(schema: Record<string, unknown>): number {\n let corrections = 0;\n const schemaStr = JSON.stringify(schema);\n\n // Walk through all render-ui effects and fix prop names\n function walkAndFix(obj: unknown): unknown {\n if (Array.isArray(obj)) {\n return obj.map(walkAndFix);\n }\n if (obj && typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n if (key in PROP_CORRECTIONS) {\n result[PROP_CORRECTIONS[key]] = walkAndFix(value);\n corrections++;\n } else {\n result[key] = walkAndFix(value);\n }\n }\n return result;\n }\n return obj;\n }\n\n const fixed = walkAndFix(schema);\n Object.assign(schema, fixed);\n return corrections;\n}\n\n/**\n * Check INIT transitions for atomic composition quality.\n * Returns warnings for flat/low-quality INIT transitions.\n */\nfunction checkCompositionQuality(schema: Record<string, unknown>): string[] {\n const warnings: string[] = [];\n const orbitals = (schema as { orbitals?: unknown[] }).orbitals;\n if (!Array.isArray(orbitals)) return warnings;\n\n for (const orbital of orbitals) {\n const orbObj = orbital as { name?: string; traits?: unknown[] };\n const traits = orbObj.traits;\n if (!Array.isArray(traits)) continue;\n\n for (const trait of traits) {\n const traitObj = trait as { name?: string; stateMachine?: { transitions?: unknown[] } };\n const transitions = traitObj.stateMachine?.transitions;\n if (!Array.isArray(transitions)) continue;\n\n for (const transition of transitions) {\n const trans = transition as { event?: string; effects?: unknown[] };\n if (trans.event !== 'INIT') continue;\n\n const effects = trans.effects;\n if (!Array.isArray(effects)) continue;\n\n // Count render-ui effects targeting 'main'\n const mainRenderUIs = effects.filter(\n (e) => Array.isArray(e) && e[0] === 'render-ui' && e[1] === 'main',\n );\n\n if (mainRenderUIs.length > 1) {\n warnings.push(\n `⚠️ ${orbObj.name}/${traitObj.name} INIT has ${mainRenderUIs.length} flat render-ui calls to main. Should be a single composed stack with children.`,\n );\n }\n\n if (mainRenderUIs.length === 1) {\n const renderPayload = mainRenderUIs[0] as unknown[];\n const payload = renderPayload[2] as Record<string, unknown> | undefined;\n if (payload && payload.type !== 'stack' && !payload.children) {\n warnings.push(\n `⚠️ ${orbObj.name}/${traitObj.name} INIT renders a single flat ${payload.type} to main. Should be a composed stack with header, metrics, and data sections.`,\n );\n }\n }\n }\n }\n }\n\n return warnings;\n}\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 let propCorrections = 0;\n let compositionWarnings: string[] = [];\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 // Auto-correct props and check composition quality\n if (combinedSchema) {\n propCorrections = autoCorrectProps(combinedSchema as unknown as Record<string, unknown>);\n compositionWarnings = checkCompositionQuality(combinedSchema as unknown as Record<string, unknown>);\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 designQuality: {\n propCorrections: propCorrections || 0,\n compositionWarnings: compositionWarnings || [],\n },\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, type LLMProvider } 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 /** LLM provider for domain orbital generation. Defaults to 'anthropic' */\n provider?: LLMProvider;\n /** Model name for domain orbital generation. Defaults to 'claude-sonnet-4-20250514' */\n model?: 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 with configurable provider\n const client = new LLMClient({\n provider: options.provider ?? 'anthropic',\n model: options.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 } from '@almadar/core/types';\n\n// ============================================================================\n// Shared Module Imports (SK-007 Phase 1)\n// ============================================================================\n\nimport {\n // Types (re-export for backward compatibility)\n type OrbitalUnit,\n type GenerationLog,\n type ExtractedRequirements,\n type OrbitalGenerationOptions as SharedOrbitalGenerationOptions,\n type OrbitalGenerationResult as SharedOrbitalGenerationResult,\n type ParallelGenerationOptions as SharedParallelGenerationOptions,\n type ParallelGenerationResult as SharedParallelGenerationResult,\n type DecomposeOptions as SharedDecomposeOptions,\n // Constants\n PROVIDER_CONCURRENCY_LIMITS,\n // Utilities\n getEntityName,\n createLog,\n} from '../shared/index.js';\n\n// Re-export types for backward compatibility\nexport {\n type OrbitalUnit,\n type GenerationLog,\n type ExtractedRequirements,\n} from '../shared/index.js';\n\n// Re-export constants\nexport { PROVIDER_CONCURRENCY_LIMITS } from '../shared/index.js';\n\n// ============================================================================\n// Local Type Definitions (Extended from shared)\n// ============================================================================\n\n/**\n * Extended options for single orbital generation.\n * @deprecated Use shared OrbitalGenerationOptions instead\n */\nexport interface OrbitalGenerationOptions extends SharedOrbitalGenerationOptions {}\n\n/**\n * Extended result for single orbital generation.\n * @deprecated Use shared OrbitalGenerationResult instead\n */\nexport interface OrbitalGenerationResult extends SharedOrbitalGenerationResult {}\n\n/**\n * Extended options for parallel generation.\n * @deprecated Use shared ParallelGenerationOptions instead\n */\nexport interface ParallelGenerationOptions extends SharedParallelGenerationOptions {}\n\n/**\n * Extended result for parallel generation.\n * @deprecated Use shared ParallelGenerationResult instead\n */\nexport interface ParallelGenerationResult extends SharedParallelGenerationResult {}\n\n/**\n * Extended options for decomposition.\n * @deprecated Use shared DecomposeOptions instead\n */\nexport interface DecomposeOptions extends SharedDecomposeOptions {}\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: { valid: boolean; errors: unknown[]; warnings?: unknown[] } = { 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: unknown) => {\n if (typeof e === 'object' && e !== null) {\n return (e as { message?: string }).message || String(e);\n }\n return String(e);\n }),\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 * 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: Partial<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 ? requirements.entities.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### States (Map to State Machines)\n${requirements.states?.length ? requirements.states.map(s => `- ${s}`).join('\\n') : '- (none specified)'}\n\n### Events (Map to Transitions)\n${requirements.events?.length ? requirements.events.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### Guards (Map to Transition Guards)\n${requirements.guards?.length ? requirements.guards.map(g => `- ${g}`).join('\\n') : '- (none specified)'}\n\n### Effects (Map to Transition Effects)\n${requirements.effects?.length ? requirements.effects.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### Pages (Map to Page Definitions)\n${requirements.pages?.length ? 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, type LLMProvider } 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 /** LLM provider for orbital generation subagent. Defaults to 'anthropic' */\n provider?: LLMProvider;\n /** Model name for orbital generation subagent. Defaults to 'claude-sonnet-4-20250514' */\n model?: string;\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 with configurable provider\n const client = new LLMClient({\n provider: options.provider ?? 'anthropic',\n model: options.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 * @almadar/agent Tools\n *\n * All agent tools for schema generation, validation, and management.\n *\n * @packageDocumentation\n */\n\n// Execute tool (no deps needed)\nexport { createExecuteTool, validateCommandPaths } from './execute.js';\n\n// Validate tool (no deps needed - shells to CLI)\nexport { createValidateSchemaTool } from './validate-schema.js';\n\n// Generate schema tool (uses @almadar/llm structured output directly)\nexport { createGenerateSchemaTool } from './generate-schema.js';\n\n// Finish task tool (uses internal combiner and domain converter)\nexport { createFinishTaskTool } from './finish-task.js';\n\n// Domain orbital tools (uses internal domain language converter)\nexport {\n createGenerateOrbitalDomainTool,\n createConstructCombinedDomainTool,\n createDomainOrbitalTools,\n type DomainOrbitalEventCallback,\n type DomainOrbitalCompleteCallback,\n type DomainOrbitalToolOptions,\n type DomainOrbitalSpec,\n} from './domain-orbital.js';\n\n// Orbital subagent tool (uses internal orbital generator)\nexport {\n createOrbitalSubagentTool,\n createSubagentEventWrapper,\n type SubagentEventCallback,\n type OrbitalCompleteCallback,\n type OrbitalRequirements,\n type OrbitalSubagentToolOptions,\n} from './orbital-subagent.js';\n\n// Orbital batch subagent tool (uses batch generation for 2x+ speedup)\nexport {\n createOrbitalBatchSubagentTool,\n type SubagentEventCallback as BatchSubagentEventCallback,\n type BatchCompleteCallback,\n type OrbitalBatchSubagentToolOptions,\n} from './orbital-batch-subagent.js';\n\n// Trait subagent tool (uses @almadar/llm directly)\nexport {\n createTraitSubagentTool,\n createTraitEventWrapper,\n type TraitEventCallback,\n type TraitCompleteCallback,\n type TraitSubagentToolOptions,\n type TraitSpec,\n} from './trait-subagent.js';\n\n// Combine schemas tool (uses internal combiner)\nexport { createCombineSchemasTool } from './combine-schemas.js';\n\n// Schema chunking tools (no deps needed - uses @almadar/core)\nexport {\n createQuerySchemaStructureTool,\n createExtractChunkTool,\n createApplyChunkTool,\n createSchemaChunkingTools,\n} from './schema-chunking.js';\n\n// GitHub tools (uses @almadar/integrations)\nexport {\n createGitHubTools,\n createGitHubToolsArray,\n type GitHubToolsConfig,\n} from './github.js';\n\n// ============================================================================\n// Convenience Factory\n// ============================================================================\n\n// Import functions for use in createAgentTools\nimport { createExecuteTool } from './execute.js';\nimport { createValidateSchemaTool } from './validate-schema.js';\nimport { createGenerateSchemaTool } from './generate-schema.js';\nimport { createFinishTaskTool } from './finish-task.js';\nimport { createCombineSchemasTool } from './combine-schemas.js';\nimport { createOrbitalSubagentTool } from './orbital-subagent.js';\nimport { createTraitSubagentTool } from './trait-subagent.js';\nimport { createDomainOrbitalTools } from './domain-orbital.js';\nimport { createSchemaChunkingTools } from './schema-chunking.js';\n/**\n * Create all agent tools for a workspace.\n *\n * All dependencies are now internal to @almadar/agent - no dependency injection needed.\n *\n * @param workDir - Workspace directory\n * @returns All tools ready for use\n */\nexport function createAgentTools(workDir: string) {\n return {\n // Core tools\n execute: createExecuteTool(workDir),\n validateSchema: createValidateSchemaTool(workDir),\n\n // Schema generation (uses @almadar/llm structured output directly)\n generateSchema: createGenerateSchemaTool(),\n\n // Orbital tools (now use internal functions)\n finishTask: createFinishTaskTool(workDir),\n combineSchemas: createCombineSchemasTool(workDir),\n\n // Subagent tools (now use internal functions)\n orbitalSubagent: createOrbitalSubagentTool(),\n traitSubagent: createTraitSubagentTool(),\n\n // Domain tools (now use internal functions)\n domainOrbitalTools: createDomainOrbitalTools({ workDir }),\n\n // Chunking tools\n schemaChunking: createSchemaChunkingTools(workDir),\n\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 * 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 createKimiClient,\n createOpenRouterClient,\n ANTHROPIC_MODELS,\n DEEPSEEK_MODELS,\n OPENAI_MODELS,\n KIMI_MODELS,\n OPENROUTER_MODELS,\n type LLMProvider,\n} from '@almadar/llm';\n\nimport {\n createExecuteTool,\n createFinishTaskTool,\n createValidateSchemaTool,\n createOrbitalSubagentTool,\n createSchemaChunkingTools,\n createDomainOrbitalTools,\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 for main agent */\n provider?: LLMProvider;\n /** Optional: Model name for main agent */\n model?: string;\n /** Optional: LLM provider for subagents (orbital, trait, domain generation). Defaults to 'anthropic' */\n subagentProvider?: LLMProvider;\n /** Optional: Model name for subagents. Defaults to 'claude-sonnet-4-20250514' */\n subagentModel?: 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 'kimi':\n if (verbose)\n console.log(`[SkillAgent] Using Kimi: ${model || KIMI_MODELS.K2_5}`);\n return createKimiClient({\n model: model || KIMI_MODELS.K2_5,\n temperature: 0.6, // Kimi with thinking disabled requires 0.6\n });\n\n case 'openrouter':\n if (verbose)\n console.log(`[SkillAgent] Using OpenRouter: ${model || OPENROUTER_MODELS.QWEN_2_5_72B}`);\n return createOpenRouterClient({\n model: model || OPENROUTER_MODELS.QWEN_2_5_72B,\n temperature: 0.3,\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 subagentProvider = 'anthropic',\n subagentModel = 'claude-sonnet-4-20250514',\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 ORBITAL_BATCH_SKILLS = ['kflow-orbitals-batch'];\n const LEAN_SKILLS = ['kflow-lean-orbitals', 'kflow-lean-fixing'];\n const isOrbitalSkill = primarySkill.name === 'kflow-orbitals';\n const isOrbitalBatchSkill = ORBITAL_BATCH_SKILLS.includes(primarySkill.name);\n const isLeanSkill = LEAN_SKILLS.includes(primarySkill.name);\n const needsChunkingTools = ORBITAL_SKILLS.includes(primarySkill.name);\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 orbitalBatchTool: ReturnType<typeof import('../tools/orbital-batch-subagent.js').createOrbitalBatchSubagentTool>['tool'] | undefined;\n let setBatchEventCallback: ReturnType<typeof import('../tools/orbital-batch-subagent.js').createOrbitalBatchSubagentTool>['setEventCallback'] | 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 provider: subagentProvider,\n model: subagentModel,\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 (isOrbitalBatchSkill) {\n const { createOrbitalBatchSubagentTool } = await import('../tools/orbital-batch-subagent.js');\n const batchResult = createOrbitalBatchSubagentTool({\n requirements: options.requirements,\n provider: subagentProvider,\n model: subagentModel,\n workDir,\n });\n orbitalBatchTool = batchResult.tool;\n setBatchEventCallback = batchResult.setEventCallback;\n\n if (options.onSubagentEvent) {\n setBatchEventCallback(options.onSubagentEvent);\n }\n\n if (verbose) {\n console.log(`[SkillAgent] Batch orbital tools enabled for kflow-orbitals-batch skill`);\n }\n }\n\n if (isLeanSkill) {\n domainOrbitalTools = createDomainOrbitalTools({ \n workDir,\n provider: subagentProvider,\n model: subagentModel,\n });\n if (verbose) {\n console.log(`[SkillAgent] Domain orbital tools enabled for ${primarySkill.name} skill (provider: ${subagentProvider})`);\n }\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 || isOrbitalBatchSkill ? [] : [validateSchemaTool]),\n ...(orbitalTool ? [orbitalTool] : []),\n ...(orbitalBatchTool ? [orbitalBatchTool] : []),\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 ...(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","/**\n * ReAct + Reflection Pattern - Phase 2.2\n *\n * Self-correcting agent loops with explicit reasoning states.\n * Implements: REASON → ACT → REFLECT → OBSERVE\n *\n * @packageDocumentation\n */\n\nimport type { MemoryManager } from '../memory/MemoryManager.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ReActState = \n | 'REASONING' // Understanding the problem\n | 'ACTING' // Taking action (calling tools)\n | 'REFLECTING' // Evaluating result\n | 'OBSERVING' // Checking state\n | 'CORRECTING' // Fixing errors\n | 'COMPLETE'; // Task done\n\nexport interface ReActStep {\n stepNumber: number;\n state: ReActState;\n thought: string;\n action?: string;\n actionInput?: Record<string, unknown>;\n observation?: string;\n reflection?: string;\n timestamp: Date;\n error?: string;\n}\n\nexport interface ReflectionResult {\n shouldCorrect: boolean;\n correctionStrategy?: string;\n confidence: number;\n notes: string;\n}\n\nexport interface ReActSession {\n sessionId: string;\n userRequest: string;\n currentStep: number;\n steps: ReActStep[];\n maxIterations: number;\n state: ReActState;\n}\n\nexport interface ReActOptions {\n maxIterations?: number;\n enableReflection?: boolean;\n enableAutoCorrect?: boolean;\n memoryManager?: MemoryManager;\n onStep?: (step: ReActStep) => void;\n onError?: (error: Error, step: ReActStep) => void;\n}\n\n// ============================================================================\n// ReAct Engine\n// ============================================================================\n\nexport class ReActEngine {\n private options: Required<ReActOptions>;\n private sessions: Map<string, ReActSession> = new Map();\n\n constructor(options: ReActOptions = {}) {\n this.options = {\n maxIterations: options.maxIterations ?? 10,\n enableReflection: options.enableReflection ?? true,\n enableAutoCorrect: options.enableAutoCorrect ?? true,\n memoryManager: options.memoryManager!,\n onStep: options.onStep ?? (() => {}),\n onError: options.onError ?? (() => {}),\n };\n }\n\n /**\n * Start a new ReAct session\n */\n startSession(userRequest: string): ReActSession {\n const sessionId = `react_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n const session: ReActSession = {\n sessionId,\n userRequest,\n currentStep: 0,\n steps: [],\n maxIterations: this.options.maxIterations,\n state: 'REASONING',\n };\n this.sessions.set(sessionId, session);\n return session;\n }\n\n /**\n * Execute REASON step\n */\n async reason(\n sessionId: string,\n context: { request: string; previousSteps?: ReActStep[] }\n ): Promise<ReActStep> {\n const session = this.getSession(sessionId);\n \n const thought = await this.generateThought(context);\n \n const step: ReActStep = {\n stepNumber: ++session.currentStep,\n state: 'REASONING',\n thought,\n timestamp: new Date(),\n };\n \n session.steps.push(step);\n session.state = 'ACTING';\n this.options.onStep(step);\n \n return step;\n }\n\n /**\n * Execute ACT step\n */\n async act(\n sessionId: string,\n action: string,\n actionInput: Record<string, unknown>\n ): Promise<ReActStep> {\n const session = this.getSession(sessionId);\n const previousStep = session.steps[session.steps.length - 1];\n \n const step: ReActStep = {\n stepNumber: ++session.currentStep,\n state: 'ACTING',\n thought: previousStep?.thought ?? '',\n action,\n actionInput,\n timestamp: new Date(),\n };\n \n session.steps.push(step);\n session.state = 'OBSERVING';\n this.options.onStep(step);\n \n return step;\n }\n\n /**\n * Execute OBSERVE step\n */\n async observe(\n sessionId: string,\n observation: string\n ): Promise<ReActStep> {\n const session = this.getSession(sessionId);\n const previousStep = session.steps[session.steps.length - 1];\n \n const step: ReActStep = {\n stepNumber: ++session.currentStep,\n state: 'OBSERVING',\n thought: previousStep?.thought ?? '',\n action: previousStep?.action,\n actionInput: previousStep?.actionInput,\n observation,\n timestamp: new Date(),\n };\n \n session.steps.push(step);\n session.state = this.options.enableReflection ? 'REFLECTING' : 'COMPLETE';\n this.options.onStep(step);\n \n return step;\n }\n\n /**\n * Execute REFLECT step\n */\n async reflect(\n sessionId: string,\n result: unknown\n ): Promise<{ step: ReActStep; reflection: ReflectionResult }> {\n const session = this.getSession(sessionId);\n const previousStep = session.steps[session.steps.length - 1];\n \n const reflection = await this.performReflection(session, result);\n \n const step: ReActStep = {\n stepNumber: ++session.currentStep,\n state: 'REFLECTING',\n thought: previousStep?.thought ?? '',\n action: previousStep?.action,\n actionInput: previousStep?.actionInput,\n observation: previousStep?.observation,\n reflection: reflection.notes,\n timestamp: new Date(),\n };\n \n session.steps.push(step);\n \n if (reflection.shouldCorrect && this.options.enableAutoCorrect) {\n session.state = 'CORRECTING';\n } else {\n session.state = 'COMPLETE';\n }\n \n this.options.onStep(step);\n \n return { step, reflection };\n }\n\n /**\n * Execute CORRECT step (auto-correction)\n */\n async correct(\n sessionId: string,\n correctionAction: string,\n correctionInput: Record<string, unknown>\n ): Promise<ReActStep> {\n const session = this.getSession(sessionId);\n const previousStep = session.steps[session.steps.length - 1];\n \n const step: ReActStep = {\n stepNumber: ++session.currentStep,\n state: 'CORRECTING',\n thought: `Correcting: ${previousStep?.reflection}`,\n action: correctionAction,\n actionInput: correctionInput,\n timestamp: new Date(),\n };\n \n session.steps.push(step);\n session.state = 'OBSERVING';\n this.options.onStep(step);\n \n // Store correction in memory\n if (this.options.memoryManager) {\n await this.storeCorrection(session, step);\n }\n \n return step;\n }\n\n /**\n * Handle errors with context preservation\n */\n async handleError(\n sessionId: string,\n error: Error,\n context: Record<string, unknown>\n ): Promise<ReActStep> {\n const session = this.getSession(sessionId);\n \n const step: ReActStep = {\n stepNumber: ++session.currentStep,\n state: 'REFLECTING',\n thought: '',\n error: error.message,\n timestamp: new Date(),\n };\n \n session.steps.push(step);\n this.options.onError(error, step);\n \n // Store error in memory for learning\n if (this.options.memoryManager) {\n await this.storeError(session, error, context);\n }\n \n return step;\n }\n\n /**\n * Get session by ID\n */\n getSession(sessionId: string): ReActSession {\n const session = this.sessions.get(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n return session;\n }\n\n /**\n * Get reflection metrics\n */\n getReflectionMetrics(sessionId: string): {\n totalSteps: number;\n corrections: number;\n errors: number;\n averageConfidence: number;\n } {\n const session = this.getSession(sessionId);\n const reflections = session.steps.filter(s => s.state === 'REFLECTING');\n const corrections = session.steps.filter(s => s.state === 'CORRECTING').length;\n const errors = session.steps.filter(s => s.error).length;\n \n return {\n totalSteps: session.currentStep,\n corrections,\n errors,\n averageConfidence: reflections.length > 0 ? 0.8 : 0, // Simplified\n };\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n private async generateThought(context: { \n request: string; \n previousSteps?: ReActStep[] \n }): Promise<string> {\n // In production, this would call an LLM\n // For now, return a structured thought\n return `I need to analyze the request: \"${context.request}\". ` +\n `Previous attempts: ${context.previousSteps?.length ?? 0}.`;\n }\n\n private async performReflection(\n session: ReActSession,\n result: unknown\n ): Promise<ReflectionResult> {\n // Check if result meets expectations\n const hasErrors = result === null || \n (typeof result === 'object' && result !== null && 'error' in result);\n \n if (hasErrors) {\n return {\n shouldCorrect: true,\n correctionStrategy: 'retry_with_validation',\n confidence: 0.3,\n notes: 'Result contains errors, correction needed',\n };\n }\n\n // Check iteration limit\n if (session.currentStep >= session.maxIterations) {\n return {\n shouldCorrect: false,\n confidence: 0.9,\n notes: 'Max iterations reached, completing task',\n };\n }\n\n return {\n shouldCorrect: false,\n confidence: 0.9,\n notes: 'Result looks good',\n };\n }\n\n private async storeCorrection(\n session: ReActSession,\n step: ReActStep\n ): Promise<void> {\n if (!this.options.memoryManager) return;\n \n // Store correction pattern for learning\n // This would be implemented with the memory system\n console.log(`[ReAct] Storing correction for session ${session.sessionId}`);\n }\n\n private async storeError(\n session: ReActSession,\n error: Error,\n context: Record<string, unknown>\n ): Promise<void> {\n if (!this.options.memoryManager) return;\n \n // Store error for future learning\n console.log(`[ReAct] Storing error for session ${session.sessionId}: ${error.message}`);\n }\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createReActEngine(options?: ReActOptions): ReActEngine {\n return new ReActEngine(options);\n}\n","/**\n * Human-in-the-Loop v2 - Phase 2.3\n *\n * Structured interrupts with memory and time-travel debugging.\n * Interrupt types: confirm, edit, select, text\n *\n * @packageDocumentation\n */\n\nimport type { MemoryManager } from '../memory/MemoryManager.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type InterruptType = 'confirm' | 'edit' | 'select' | 'text';\n\nexport interface InterruptRequest<T = unknown> {\n interruptId: string;\n sessionId: string;\n type: InterruptType;\n title: string;\n description: string;\n context: InterruptContext;\n payload: T;\n timeoutMs?: number;\n createdAt: Date;\n}\n\nexport interface InterruptContext {\n checkpointId: string;\n currentState: string;\n previousActions: string[];\n relevantMemory?: string[];\n}\n\nexport interface InterruptResponse<T = unknown> {\n interruptId: string;\n response: T;\n respondedAt: Date;\n userId?: string;\n}\n\n// Specific interrupt payloads\nexport interface ConfirmPayload {\n question: string;\n defaultValue?: boolean;\n severity: 'info' | 'warning' | 'critical';\n}\n\nexport interface EditPayload {\n content: string;\n format: 'json' | 'text' | 'code';\n schema?: Record<string, unknown>;\n validationRules?: string[];\n}\n\nexport interface SelectPayload {\n options: Array<{\n id: string;\n label: string;\n description?: string;\n disabled?: boolean;\n }>;\n multiple?: boolean;\n maxSelections?: number;\n}\n\nexport interface TextPayload {\n placeholder?: string;\n multiline?: boolean;\n maxLength?: number;\n validation?: 'email' | 'url' | 'regex';\n validationRegex?: string;\n}\n\n// ============================================================================\n// HITL v2 Manager\n// ============================================================================\n\nexport interface HITLv2Options {\n memoryManager?: MemoryManager;\n defaultTimeoutMs?: number;\n onInterrupt?: (request: InterruptRequest) => void;\n onResponse?: (request: InterruptRequest, response: InterruptResponse) => void;\n}\n\nexport class HITLv2Manager {\n private options: Required<Pick<HITLv2Options, 'defaultTimeoutMs'>> & \n Pick<HITLv2Options, 'memoryManager' | 'onInterrupt' | 'onResponse'>;\n private pendingInterrupts: Map<string, InterruptRequest> = new Map();\n private responses: Map<string, InterruptResponse> = new Map();\n private checkpoints: Map<string, unknown> = new Map();\n\n constructor(options: HITLv2Options = {}) {\n this.options = {\n defaultTimeoutMs: options.defaultTimeoutMs ?? 300000, // 5 minutes\n memoryManager: options.memoryManager,\n onInterrupt: options.onInterrupt,\n onResponse: options.onResponse,\n };\n }\n\n // ============================================================================\n // Interrupt Creation\n // ============================================================================\n\n /**\n * Create a confirmation interrupt\n */\n async confirm(\n sessionId: string,\n question: string,\n options: {\n severity?: 'info' | 'warning' | 'critical';\n defaultValue?: boolean;\n timeoutMs?: number;\n context?: Partial<InterruptContext>;\n } = {}\n ): Promise<boolean> {\n const payload: ConfirmPayload = {\n question,\n severity: options.severity ?? 'info',\n defaultValue: options.defaultValue,\n };\n\n const request = await this.createInterrupt<ConfirmPayload>(\n sessionId,\n 'confirm',\n 'Confirmation Required',\n question,\n payload,\n options.timeoutMs,\n options.context\n );\n\n return this.waitForResponse<boolean>(request);\n }\n\n /**\n * Create an edit interrupt\n */\n async edit(\n sessionId: string,\n content: string,\n options: {\n format?: 'json' | 'text' | 'code';\n title?: string;\n description?: string;\n schema?: Record<string, unknown>;\n timeoutMs?: number;\n context?: Partial<InterruptContext>;\n } = {}\n ): Promise<string> {\n const payload: EditPayload = {\n content,\n format: options.format ?? 'text',\n schema: options.schema,\n };\n\n const request = await this.createInterrupt<EditPayload>(\n sessionId,\n 'edit',\n options.title ?? 'Edit Content',\n options.description ?? 'Please review and edit the content',\n payload,\n options.timeoutMs,\n options.context\n );\n\n return this.waitForResponse<string>(request);\n }\n\n /**\n * Create a selection interrupt\n */\n async select<T extends string>(\n sessionId: string,\n options: Array<{ id: T; label: string; description?: string }>,\n config: {\n title?: string;\n description?: string;\n multiple?: boolean;\n timeoutMs?: number;\n context?: Partial<InterruptContext>;\n } = {}\n ): Promise<T | T[]> {\n const payload: SelectPayload = {\n options,\n multiple: config.multiple,\n };\n\n const request = await this.createInterrupt<SelectPayload>(\n sessionId,\n 'select',\n config.title ?? 'Make a Selection',\n config.description ?? 'Please select an option',\n payload,\n config.timeoutMs,\n config.context\n );\n\n return this.waitForResponse<T | T[]>(request);\n }\n\n /**\n * Create a text input interrupt\n */\n async text(\n sessionId: string,\n options: {\n title?: string;\n description?: string;\n placeholder?: string;\n multiline?: boolean;\n maxLength?: number;\n timeoutMs?: number;\n context?: Partial<InterruptContext>;\n } = {}\n ): Promise<string> {\n const payload: TextPayload = {\n placeholder: options.placeholder,\n multiline: options.multiline,\n maxLength: options.maxLength,\n };\n\n const request = await this.createInterrupt<TextPayload>(\n sessionId,\n 'text',\n options.title ?? 'Input Required',\n options.description ?? 'Please provide input',\n payload,\n options.timeoutMs,\n options.context\n );\n\n return this.waitForResponse<string>(request);\n }\n\n // ============================================================================\n // Response Handling\n // ============================================================================\n\n /**\n * Submit a response to an interrupt\n */\n async submitResponse<T>(\n interruptId: string,\n response: T,\n userId?: string\n ): Promise<void> {\n const request = this.pendingInterrupts.get(interruptId);\n if (!request) {\n throw new Error(`Interrupt not found or expired: ${interruptId}`);\n }\n\n const responseRecord: InterruptResponse<T> = {\n interruptId,\n response,\n respondedAt: new Date(),\n userId,\n };\n\n this.responses.set(interruptId, responseRecord);\n this.pendingInterrupts.delete(interruptId);\n\n // Store in memory for learning\n if (this.options.memoryManager) {\n await this.storeInteraction(request, responseRecord);\n }\n\n this.options.onResponse?.(request, responseRecord);\n }\n\n /**\n * Cancel an interrupt\n */\n cancelInterrupt(interruptId: string, reason?: string): void {\n const request = this.pendingInterrupts.get(interruptId);\n if (!request) return;\n\n this.pendingInterrupts.delete(interruptId);\n console.log(`[HITLv2] Interrupt ${interruptId} cancelled: ${reason ?? 'No reason'}`);\n }\n\n // ============================================================================\n // Time-Travel Debugging\n // ============================================================================\n\n /**\n * Save a checkpoint for time-travel\n */\n saveCheckpoint(checkpointId: string, state: unknown): void {\n this.checkpoints.set(checkpointId, JSON.parse(JSON.stringify(state)));\n }\n\n /**\n * Restore a checkpoint\n */\n restoreCheckpoint<T>(checkpointId: string): T | null {\n const checkpoint = this.checkpoints.get(checkpointId);\n if (!checkpoint) return null;\n return JSON.parse(JSON.stringify(checkpoint)) as T;\n }\n\n /**\n * List available checkpoints\n */\n listCheckpoints(): string[] {\n return Array.from(this.checkpoints.keys());\n }\n\n /**\n * Rewind to checkpoint and continue\n */\n async rewindToCheckpoint<T>(\n checkpointId: string,\n sessionId: string,\n modifyFn?: (state: T) => T\n ): Promise<T | null> {\n let state = this.restoreCheckpoint<T>(checkpointId);\n if (!state) return null;\n\n // Allow modification before resuming\n if (modifyFn) {\n state = modifyFn(state);\n }\n\n // Log the rewind\n console.log(`[HITLv2] Session ${sessionId} rewound to checkpoint ${checkpointId}`);\n\n return state;\n }\n\n // ============================================================================\n // Analytics\n // ============================================================================\n\n /**\n * Get interrupt statistics\n */\n getStats(): {\n pendingCount: number;\n totalHandled: number;\n checkpointsCount: number;\n averageResponseTimeMs: number;\n } {\n const responses = Array.from(this.responses.values());\n const totalResponseTime = responses.reduce((sum, r) => {\n const request = this.pendingInterrupts.get(r.interruptId);\n if (!request) return sum;\n return sum + (r.respondedAt.getTime() - request.createdAt.getTime());\n }, 0);\n\n return {\n pendingCount: this.pendingInterrupts.size,\n totalHandled: this.responses.size,\n checkpointsCount: this.checkpoints.size,\n averageResponseTimeMs: responses.length > 0 ? totalResponseTime / responses.length : 0,\n };\n }\n\n /**\n * Get pending interrupts for a session\n */\n getPendingForSession(sessionId: string): InterruptRequest[] {\n return Array.from(this.pendingInterrupts.values())\n .filter(req => req.sessionId === sessionId);\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n private async createInterrupt<T>(\n sessionId: string,\n type: InterruptType,\n title: string,\n description: string,\n payload: T,\n timeoutMs?: number,\n partialContext?: Partial<InterruptContext>\n ): Promise<InterruptRequest<T>> {\n const interruptId = `int_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n \n // Generate checkpoint for time-travel\n const checkpointId = `chk_${interruptId}`;\n \n const request: InterruptRequest<T> = {\n interruptId,\n sessionId,\n type,\n title,\n description,\n context: {\n checkpointId,\n currentState: partialContext?.currentState ?? 'unknown',\n previousActions: partialContext?.previousActions ?? [],\n relevantMemory: partialContext?.relevantMemory,\n },\n payload,\n timeoutMs: timeoutMs ?? this.options.defaultTimeoutMs,\n createdAt: new Date(),\n };\n\n this.pendingInterrupts.set(interruptId, request as InterruptRequest);\n \n // Set timeout\n setTimeout(() => {\n if (this.pendingInterrupts.has(interruptId)) {\n this.cancelInterrupt(interruptId, 'Timeout');\n }\n }, request.timeoutMs);\n\n this.options.onInterrupt?.(request as InterruptRequest);\n \n return request;\n }\n\n private async waitForResponse<T>(request: InterruptRequest): Promise<T> {\n return new Promise((resolve, reject) => {\n const checkInterval = setInterval(() => {\n const response = this.responses.get(request.interruptId);\n \n if (response) {\n clearInterval(checkInterval);\n resolve(response.response as T);\n this.responses.delete(request.interruptId); // Cleanup\n }\n \n if (!this.pendingInterrupts.has(request.interruptId)) {\n clearInterval(checkInterval);\n reject(new Error('Interrupt cancelled or expired'));\n }\n }, 100);\n });\n }\n\n private async storeInteraction(\n request: InterruptRequest,\n response: InterruptResponse\n ): Promise<void> {\n if (!this.options.memoryManager) return;\n\n // Store in memory for learning user preferences\n console.log(`[HITLv2] Storing interaction: ${request.type} → ${JSON.stringify(response.response).slice(0, 50)}`);\n }\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createHITLv2Manager(options?: HITLv2Options): HITLv2Manager {\n return new HITLv2Manager(options);\n}\n","/**\n * Agentic Search - GAP-006\n *\n * Reasoning-based search through memory orbitals.\n * Unlike RAG (vector similarity), this uses agent traversal with understanding\n * of state transitions, patterns, and temporal relationships.\n *\n * @packageDocumentation\n */\n\nimport type {\n UserPreference,\n GenerationSession,\n ProjectContext,\n} from './memory-orbital.js';\nimport type {\n InterruptRecord,\n ToolApprovalPreference,\n CheckpointRecord,\n} from './types.js';\nimport type { MemoryManager } from './MemoryManager.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Search strategy for agentic search\n */\nexport type SearchStrategy = 'temporal' | 'semantic' | 'pattern' | 'hybrid';\n\n/**\n * Search parameters\n */\nexport interface AgenticSearchParams {\n /** User to search memory for */\n userId: string;\n /** Natural language query */\n query: string;\n /** Search strategy */\n strategy?: SearchStrategy;\n /** Maximum search depth (levels of traversal) */\n depth?: number;\n /** App/project context to filter by */\n appId?: string;\n /** Maximum results to return */\n limit?: number;\n}\n\n/**\n * Search result with relevance score\n */\nexport interface SearchResult {\n /** Type of memory found */\n type: 'preference' | 'session' | 'project' | 'interrupt' | 'checkpoint' | 'pattern';\n /** The actual data */\n data: unknown;\n /** Relevance score (0-1) */\n relevance: number;\n /** Why this result matched */\n reasoning: string;\n /** Source collection */\n source: string;\n /** Timestamp for temporal sorting */\n timestamp?: Date;\n}\n\n/**\n * Search result with aggregated insights\n */\nexport interface AgenticSearchResponse {\n /** Individual search results */\n results: SearchResult[];\n /** Aggregated insights from results */\n insights: {\n /** Summary of what was found */\n summary: string;\n /** Common patterns identified */\n patterns: string[];\n /** Temporal trends */\n trends: string[];\n /** Suggested next actions */\n suggestions: string[];\n };\n /** Search metadata */\n metadata: {\n strategy: SearchStrategy;\n depth: number;\n duration: number;\n totalResults: number;\n };\n}\n\n// ============================================================================\n// Agentic Search Engine\n// ============================================================================\n\nexport class AgenticSearchEngine {\n private memoryManager: MemoryManager;\n\n constructor(memoryManager: MemoryManager) {\n this.memoryManager = memoryManager;\n }\n\n /**\n * Perform agentic search through memory\n */\n async search(params: AgenticSearchParams): Promise<AgenticSearchResponse> {\n const startTime = Date.now();\n const strategy = params.strategy ?? 'hybrid';\n const depth = params.depth ?? 3;\n const limit = params.limit ?? 10;\n\n let results: SearchResult[] = [];\n\n // Execute search based on strategy\n switch (strategy) {\n case 'temporal':\n results = await this.temporalSearch(params, depth, limit);\n break;\n case 'semantic':\n results = await this.semanticSearch(params, depth, limit);\n break;\n case 'pattern':\n results = await this.patternSearch(params, depth, limit);\n break;\n case 'hybrid':\n default:\n results = await this.hybridSearch(params, depth, limit);\n break;\n }\n\n // Sort by relevance\n results.sort((a, b) => b.relevance - a.relevance);\n\n // Generate insights\n const insights = this.generateInsights(results, params.query);\n\n const duration = Date.now() - startTime;\n\n return {\n results: results.slice(0, limit),\n insights,\n metadata: {\n strategy,\n depth,\n duration,\n totalResults: results.length,\n },\n };\n }\n\n // ============================================================================\n // Search Strategies\n // ============================================================================\n\n /**\n * Temporal search - \"What did I do last week?\"\n * Navigates memory by time relationships\n */\n private async temporalSearch(\n params: AgenticSearchParams,\n _depth: number,\n limit: number,\n ): Promise<SearchResult[]> {\n const results: SearchResult[] = [];\n\n // Parse temporal query patterns\n const isRecentQuery = /recent|last|latest|newest/i.test(params.query);\n const isTimeRangeQuery = /week|month|day|ago/i.test(params.query);\n\n // Get generation sessions (most temporal data)\n const sessions = await this.memoryManager.getUserGenerationHistory(params.userId, limit * 2);\n\n for (const session of sessions) {\n let relevance = 0.5;\n let reasoning = 'Recent generation session';\n\n // Boost recent items for \"recent\" queries\n if (isRecentQuery) {\n const daysAgo = (Date.now() - session.createdAt.getTime()) / (1000 * 60 * 60 * 24);\n relevance = Math.max(0.1, 1 - daysAgo / 30); // Decay over 30 days\n reasoning = `Created ${Math.round(daysAgo)} days ago`;\n }\n\n // Check for query matches in session data\n const sessionText = `${session.prompt} ${session.entities.join(' ')} ${session.patterns.join(' ')}`.toLowerCase();\n const queryTerms = params.query.toLowerCase().split(/\\s+/);\n const termMatches = queryTerms.filter(term => sessionText.includes(term)).length;\n relevance += termMatches * 0.1;\n\n if (relevance > 0.3) {\n results.push({\n type: 'session',\n data: session,\n relevance: Math.min(1, relevance),\n reasoning,\n source: 'generation_history',\n timestamp: session.createdAt,\n });\n }\n }\n\n return results;\n }\n\n /**\n * Semantic search - \"How did I handle user roles?\"\n * Reasoning-based understanding of structure\n */\n private async semanticSearch(\n params: AgenticSearchParams,\n _depth: number,\n limit: number,\n ): Promise<SearchResult[]> {\n const results: SearchResult[] = [];\n\n // Extract semantic concepts from query\n const concepts = this.extractConcepts(params.query);\n\n // Search user preferences\n const prefs = await this.memoryManager.getUserPreferences(params.userId);\n if (prefs) {\n let relevance = 0.3;\n const matchedConcepts: string[] = [];\n\n // Check for naming convention matches\n if (concepts.naming && prefs.namingConvention) {\n relevance += 0.2;\n matchedConcepts.push(`uses ${prefs.namingConvention}`);\n }\n\n // Check for pattern matches\n if (concepts.patterns && prefs.preferredPatterns.length > 0) {\n const matched = prefs.preferredPatterns.filter(p =>\n concepts.patterns?.some((cp: string) => p.toLowerCase().includes(cp.toLowerCase()))\n );\n relevance += matched.length * 0.1;\n matchedConcepts.push(`patterns: ${matched.join(', ')}`);\n }\n\n // Check for entity matches\n if (concepts.entities && prefs.commonEntities.length > 0) {\n const matched = prefs.commonEntities.filter(e =>\n concepts.entities?.some((ce: string) => e.toLowerCase().includes(ce.toLowerCase()))\n );\n relevance += matched.length * 0.1;\n matchedConcepts.push(`entities: ${matched.join(', ')}`);\n }\n\n if (relevance > 0.4) {\n results.push({\n type: 'preference',\n data: prefs,\n relevance: Math.min(1, relevance),\n reasoning: `User preferences match query concepts: ${matchedConcepts.join('; ')}`,\n source: 'user_preferences',\n timestamp: prefs.learnedAt,\n });\n }\n }\n\n // Search project contexts\n if (params.appId) {\n const project = await this.memoryManager.getProjectContext(params.appId);\n if (project) {\n let relevance = 0.3;\n const projectText = `${project.projectName ?? ''} ${project.description ?? ''} ${project.existingEntities.join(' ')}`.toLowerCase();\n\n const queryTerms = params.query.toLowerCase().split(/\\s+/);\n const termMatches = queryTerms.filter(term => projectText.includes(term)).length;\n relevance += termMatches * 0.15;\n\n if (relevance > 0.4) {\n results.push({\n type: 'project',\n data: project,\n relevance: Math.min(1, relevance),\n reasoning: `Project context contains ${termMatches} matching terms`,\n source: 'project_context',\n timestamp: project.lastUpdatedAt,\n });\n }\n }\n }\n\n // Search generation sessions for semantic matches\n const sessions = await this.memoryManager.getUserGenerationHistory(params.userId, limit);\n for (const session of sessions) {\n const sessionText = `${session.prompt} ${session.entities.join(' ')}`.toLowerCase();\n let relevance = 0.3;\n\n // Entity matches\n if (concepts.entities) {\n const entityMatches = session.entities.filter(e =>\n concepts.entities?.some((ce: string) => e.toLowerCase().includes(ce.toLowerCase()))\n );\n relevance += entityMatches.length * 0.15;\n }\n\n // Pattern matches\n if (concepts.patterns) {\n const patternMatches = session.patterns.filter(p =>\n concepts.patterns?.some((cp: string) => p.toLowerCase().includes(cp.toLowerCase()))\n );\n relevance += patternMatches.length * 0.1;\n }\n\n // Direct text match\n const queryTerms = params.query.toLowerCase().split(/\\s+/);\n const termMatches = queryTerms.filter(term => sessionText.includes(term)).length;\n relevance += termMatches * 0.05;\n\n if (relevance > 0.4) {\n results.push({\n type: 'session',\n data: session,\n relevance: Math.min(1, relevance),\n reasoning: `Session contains relevant entities, patterns, or keywords`,\n source: 'generation_history',\n timestamp: session.createdAt,\n });\n }\n }\n\n return results;\n }\n\n /**\n * Pattern search - \"Show me all list views I've built\"\n * Searches for specific patterns and effects\n */\n private async patternSearch(\n params: AgenticSearchParams,\n _depth: number,\n limit: number,\n ): Promise<SearchResult[]> {\n const results: SearchResult[] = [];\n\n // Extract pattern terms from query\n const patternTerms = ['list', 'form', 'detail', 'card', 'table', 'chart', 'map', 'calendar'];\n const matchedTerms = patternTerms.filter(term =>\n params.query.toLowerCase().includes(term)\n );\n\n // Search pattern affinity\n const patterns = await this.memoryManager.getUserPatterns(params.userId);\n\n for (const pattern of patterns) {\n let relevance = 0.3;\n let reasoning = `Pattern usage: ${pattern.usageCount} times`;\n\n // Boost for matching pattern terms\n if (matchedTerms.some(term => pattern.patternId.toLowerCase().includes(term))) {\n relevance += 0.3;\n reasoning += ', matches query pattern type';\n }\n\n // Boost for high success rate\n const successRate = pattern.usageCount > 0\n ? pattern.successCount / pattern.usageCount\n : 0;\n relevance += successRate * 0.2;\n\n if (relevance > 0.4) {\n results.push({\n type: 'pattern',\n data: pattern,\n relevance: Math.min(1, relevance),\n reasoning: `${reasoning}, ${Math.round(successRate * 100)}% success rate`,\n source: 'pattern_affinity',\n timestamp: pattern.lastUsedAt,\n });\n }\n }\n\n // Search sessions for patterns\n const sessions = await this.memoryManager.getUserGenerationHistory(params.userId, limit);\n for (const session of sessions) {\n const matchingPatterns = session.patterns.filter(p =>\n matchedTerms.some(term => p.toLowerCase().includes(term))\n );\n\n if (matchingPatterns.length > 0) {\n results.push({\n type: 'session',\n data: session,\n relevance: 0.5 + matchingPatterns.length * 0.1,\n reasoning: `Session uses patterns: ${matchingPatterns.join(', ')}`,\n source: 'generation_history',\n timestamp: session.createdAt,\n });\n }\n }\n\n return results;\n }\n\n /**\n * Hybrid search - combines all strategies\n */\n private async hybridSearch(\n params: AgenticSearchParams,\n depth: number,\n limit: number,\n ): Promise<SearchResult[]> {\n const [temporal, semantic, pattern] = await Promise.all([\n this.temporalSearch(params, depth, Math.ceil(limit / 2)),\n this.semanticSearch(params, depth, Math.ceil(limit / 2)),\n this.patternSearch(params, depth, Math.ceil(limit / 2)),\n ]);\n\n // Combine and deduplicate results\n const seen = new Set<string>();\n const combined: SearchResult[] = [];\n\n for (const result of [...temporal, ...semantic, ...pattern]) {\n // Create unique key for deduplication\n const key = `${result.type}-${JSON.stringify(result.data)}`;\n if (!seen.has(key)) {\n seen.add(key);\n combined.push(result);\n }\n }\n\n return combined;\n }\n\n // ============================================================================\n // Helpers\n // ============================================================================\n\n /**\n * Extract semantic concepts from query\n */\n private extractConcepts(query: string): {\n naming?: boolean;\n validation?: boolean;\n patterns?: string[];\n entities?: string[];\n actions?: string[];\n } {\n const lower = query.toLowerCase();\n return {\n naming: /naming|case|pascal|camel|snake/i.test(lower),\n validation: /validat|schema|required|optional/i.test(lower),\n patterns: ['entity', 'list', 'form', 'detail', 'card'].filter(p => lower.includes(p)),\n entities: this.extractEntityNames(lower),\n actions: ['create', 'update', 'delete', 'list', 'view'].filter(a => lower.includes(a)),\n };\n }\n\n /**\n * Extract potential entity names from query\n */\n private extractEntityNames(query: string): string[] {\n // Look for capitalized words that could be entity names\n const words = query.split(/\\s+/);\n const entities: string[] = [];\n\n for (const word of words) {\n // Clean up punctuation\n const clean = word.replace(/[^a-zA-Z]/g, '');\n // Capitalized words are likely entities\n if (clean.length > 2 && clean[0] === clean[0].toUpperCase()) {\n entities.push(clean);\n }\n }\n\n return entities;\n }\n\n /**\n * Generate insights from search results\n */\n private generateInsights(results: SearchResult[], query: string): {\n summary: string;\n patterns: string[];\n trends: string[];\n suggestions: string[];\n } {\n const summary = `Found ${results.length} relevant memory items for \"${query}\"`;\n\n // Extract patterns\n const patternResults = results.filter(r => r.type === 'pattern');\n const patterns = patternResults.length > 0\n ? patternResults.slice(0, 3).map(r => (r.data as { patternId: string }).patternId)\n : ['No dominant patterns identified'];\n\n // Analyze trends\n const sessions = results.filter(r => r.type === 'session');\n const trends: string[] = [];\n\n if (sessions.length > 0) {\n const timestamps = sessions\n .filter(s => s.timestamp)\n .map(s => s.timestamp!.getTime())\n .sort((a, b) => b - a);\n\n if (timestamps.length >= 2) {\n const avgGap = (timestamps[0] - timestamps[timestamps.length - 1]) / (timestamps.length - 1);\n const daysGap = avgGap / (1000 * 60 * 60 * 24);\n\n if (daysGap < 7) {\n trends.push('High activity - multiple sessions per week');\n } else if (daysGap > 30) {\n trends.push('Sporadic usage - sessions spread out over time');\n }\n }\n }\n\n // Generate suggestions\n const suggestions: string[] = [];\n\n if (patterns.length > 0 && !patterns[0].includes('No dominant')) {\n suggestions.push(`Consider reusing pattern: ${patterns[0]}`);\n }\n\n const projectResults = results.filter(r => r.type === 'project');\n if (projectResults.length > 0) {\n suggestions.push('Review existing project conventions for consistency');\n }\n\n const interruptResults = results.filter(r => r.type === 'interrupt');\n if (interruptResults.length > 3) {\n suggestions.push('High interrupt frequency - consider adjusting auto-approval settings');\n }\n\n if (suggestions.length === 0) {\n suggestions.push('No specific suggestions based on current memory');\n }\n\n return { summary, patterns, trends, suggestions };\n }\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create an agentic search engine\n */\nexport function createAgenticSearchEngine(memoryManager: MemoryManager): AgenticSearchEngine {\n return new AgenticSearchEngine(memoryManager);\n}\n","/**\n * Preference Learner\n *\n * Uses LLM to infer user preferences from generation sessions.\n * Leverages @almadar/llm for structured output.\n *\n * @packageDocumentation\n */\n\nimport { LLMClient, createRequirementsClient } from '@almadar/llm';\nimport type { GenerationSession, UserPreference } from './memory-orbital.js';\nimport { MemoryManager } from './MemoryManager.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PreferenceLearnerOptions {\n /** LLM client for inference */\n llmClient?: LLMClient;\n /** Memory manager for persistence */\n memoryManager: MemoryManager;\n /** Confidence threshold for auto-accepting preferences */\n confidenceThreshold?: number;\n}\n\nexport interface InferredPreference {\n /** The preference field being inferred */\n field: keyof Omit<UserPreference, 'id' | 'userId' | 'learnedAt'>;\n /** The inferred value */\n value: unknown;\n /** Confidence level (0-1) */\n confidence: number;\n /** Explanation of why this was inferred */\n reasoning: string;\n}\n\nexport interface PreferenceAnalysis {\n /** List of inferred preferences */\n inferences: InferredPreference[];\n /** Whether the inference is high confidence */\n isHighConfidence: boolean;\n}\n\n// ============================================================================\n// Preference Learner\n// ============================================================================\n\nexport class PreferenceLearner {\n private llmClient: LLMClient;\n private memoryManager: MemoryManager;\n private confidenceThreshold: number;\n\n constructor(options: PreferenceLearnerOptions) {\n this.llmClient = options.llmClient ?? createRequirementsClient();\n this.memoryManager = options.memoryManager;\n this.confidenceThreshold = options.confidenceThreshold ?? 0.7;\n }\n\n /**\n * Analyze a session and infer user preferences\n */\n async analyzeSession(session: GenerationSession): Promise<PreferenceAnalysis> {\n const prompt = this.buildAnalysisPrompt(session);\n \n const content = await this.llmClient.call<string>({\n systemPrompt: 'You analyze generation sessions and infer user preferences. Respond with JSON.',\n userPrompt: prompt,\n });\n\n return this.parseAnalysisResponse(content);\n }\n\n /**\n * Learn from a session and update preferences if confidence is high\n */\n async learnFromSession(session: GenerationSession): Promise<UserPreference | null> {\n // Get existing preferences\n let preferences = await this.memoryManager.getUserPreferences(session.userId);\n \n if (!preferences) {\n preferences = {\n id: session.userId,\n userId: session.userId,\n namingConvention: 'PascalCase',\n validationStyle: 'strict',\n preferredPatterns: [],\n commonEntities: [],\n commonTraits: [],\n learnedAt: new Date(),\n confidence: 0.5,\n };\n }\n\n // Analyze session\n const analysis = await this.analyzeSession(session);\n\n // Update preferences with high-confidence inferences\n let updated = false;\n for (const inference of analysis.inferences) {\n if (inference.confidence >= this.confidenceThreshold) {\n switch (inference.field) {\n case 'namingConvention':\n if (this.isValidNamingConvention(inference.value)) {\n preferences.namingConvention = inference.value;\n updated = true;\n }\n break;\n case 'validationStyle':\n if (this.isValidValidationStyle(inference.value)) {\n preferences.validationStyle = inference.value;\n updated = true;\n }\n break;\n case 'preferredPatterns':\n if (Array.isArray(inference.value)) {\n preferences.preferredPatterns = [\n ...new Set([...preferences.preferredPatterns, ...inference.value]),\n ].slice(0, 10);\n updated = true;\n }\n break;\n case 'commonEntities':\n if (Array.isArray(inference.value)) {\n preferences.commonEntities = [\n ...new Set([...preferences.commonEntities, ...inference.value]),\n ].slice(0, 20);\n updated = true;\n }\n break;\n }\n }\n }\n\n // Update confidence based on number of sessions\n if (updated) {\n preferences.confidence = Math.min(1.0, preferences.confidence + 0.05);\n await this.memoryManager.updateUserPreferences(session.userId, preferences);\n }\n\n return updated ? preferences : null;\n }\n\n /**\n * Batch learn from multiple sessions\n */\n async batchLearn(sessions: GenerationSession[]): Promise<UserPreference | null> {\n if (sessions.length === 0) return null;\n\n const userId = sessions[0].userId;\n let preferences = await this.memoryManager.getUserPreferences(userId);\n \n if (!preferences) {\n preferences = {\n id: userId,\n userId,\n namingConvention: 'PascalCase',\n validationStyle: 'strict',\n preferredPatterns: [],\n commonEntities: [],\n commonTraits: [],\n learnedAt: new Date(),\n confidence: 0.5,\n };\n }\n\n // Aggregate patterns and entities across all sessions\n const allPatterns = new Set<string>();\n const allEntities = new Set<string>();\n \n for (const session of sessions) {\n session.patterns.forEach(p => allPatterns.add(p));\n session.entities.forEach(e => allEntities.add(e));\n }\n\n // Update preferences\n preferences.preferredPatterns = [...allPatterns].slice(0, 10);\n preferences.commonEntities = [...allEntities].slice(0, 20);\n preferences.confidence = Math.min(1.0, 0.5 + (sessions.length * 0.05));\n\n // Use LLM to infer naming convention and validation style from aggregate\n const aggregatePrompt = this.buildAggregatePrompt(sessions);\n const content = await this.llmClient.call<string>({\n systemPrompt: 'You analyze generation sessions and infer user preferences. Respond with JSON.',\n userPrompt: aggregatePrompt,\n });\n\n const analysis = this.parseAnalysisResponse(content);\n for (const inference of analysis.inferences) {\n if (inference.confidence >= this.confidenceThreshold) {\n if (inference.field === 'namingConvention' && this.isValidNamingConvention(inference.value)) {\n preferences.namingConvention = inference.value;\n }\n if (inference.field === 'validationStyle' && this.isValidValidationStyle(inference.value)) {\n preferences.validationStyle = inference.value;\n }\n }\n }\n\n await this.memoryManager.updateUserPreferences(userId, preferences);\n return preferences;\n }\n\n // ==========================================================================\n // Prompt Building\n // ==========================================================================\n\n private buildAnalysisPrompt(session: GenerationSession): string {\n return `Analyze this generation session and infer the user's preferences.\n\nSession Details:\n- Prompt: \"${session.prompt}\"\n- Generated Entities: ${session.entities.join(', ')}\n- Used Patterns: ${session.patterns.join(', ')}\n- Skill: ${session.skill}\n\nSchema Excerpt:\n${JSON.stringify(session.generatedSchema, null, 2).slice(0, 2000)}\n\nAnalyze and infer:\n1. Naming convention preference (PascalCase, camelCase, snake_case)\n2. Validation style (strict, minimal, none)\n3. Preferred UI patterns\n4. Common entity types\n\nRespond in JSON format:\n{\n \"inferences\": [\n {\n \"field\": \"namingConvention\",\n \"value\": \"PascalCase\",\n \"confidence\": 0.85,\n \"reasoning\": \"User consistently uses PascalCase for entity names\"\n }\n ],\n \"isHighConfidence\": true\n}`;\n }\n\n private buildAggregatePrompt(sessions: GenerationSession[]): string {\n const summaries = sessions.slice(0, 10).map(s => ({\n prompt: s.prompt.slice(0, 100),\n entities: s.entities,\n patterns: s.patterns,\n }));\n\n return `Analyze these ${sessions.length} generation sessions and infer the user's aggregate preferences.\n\nSession Summaries:\n${JSON.stringify(summaries, null, 2)}\n\nInfer the user's overall:\n1. Naming convention preference (PascalCase, camelCase, snake_case)\n2. Validation style (strict, minimal, none)\n\nRespond in JSON format:\n{\n \"inferences\": [\n {\n \"field\": \"namingConvention\",\n \"value\": \"PascalCase\",\n \"confidence\": 0.9,\n \"reasoning\": \"Used PascalCase in 8 out of 10 sessions\"\n }\n ],\n \"isHighConfidence\": true\n}`;\n }\n\n // ==========================================================================\n // Response Parsing\n // ==========================================================================\n\n private parseAnalysisResponse(content: string): PreferenceAnalysis {\n try {\n const jsonMatch = content.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n return { inferences: [], isHighConfidence: false };\n }\n\n const parsed = JSON.parse(jsonMatch[0]);\n \n if (Array.isArray(parsed.inferences)) {\n return {\n inferences: parsed.inferences.filter((inf: InferredPreference) => \n inf.field && inf.value !== undefined && typeof inf.confidence === 'number'\n ),\n isHighConfidence: parsed.isHighConfidence ?? false,\n };\n }\n\n return { inferences: [], isHighConfidence: false };\n } catch {\n return { inferences: [], isHighConfidence: false };\n }\n }\n\n // ==========================================================================\n // Validation Helpers\n // ==========================================================================\n\n private isValidNamingConvention(value: unknown): value is UserPreference['namingConvention'] {\n return typeof value === 'string' && ['PascalCase', 'camelCase', 'snake_case'].includes(value);\n }\n\n private isValidValidationStyle(value: unknown): value is UserPreference['validationStyle'] {\n return typeof value === 'string' && ['strict', 'minimal', 'none'].includes(value);\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createPreferenceLearner(options: PreferenceLearnerOptions): PreferenceLearner {\n return new PreferenceLearner(options);\n}\n","/**\n * Memory System Integration - Phase 2.1\n *\n * Integrates episodic, semantic, and procedural memory with agent operations.\n * Provides memory-aware agent capabilities.\n *\n * @packageDocumentation\n */\n\nimport { MemoryManager } from '../memory/MemoryManager.js';\nimport { AgenticSearchEngine, createAgenticSearchEngine } from '../memory/agentic-search.js';\nimport { PreferenceLearner, createPreferenceLearner } from '../memory/PreferenceLearner.js';\nimport { ReActEngine, createReActEngine } from './react-reflection.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface MemoryIntegrationOptions {\n memoryManager: MemoryManager;\n userId: string;\n projectId?: string;\n enableEpisodic?: boolean;\n enableSemantic?: boolean;\n enableProcedural?: boolean;\n}\n\nexport interface SimilarSession {\n sessionId: string;\n request: string;\n schema: unknown;\n success: boolean;\n similarity: number;\n}\n\nexport interface MemoryContext {\n userPreferences: {\n namingConvention: string;\n preferredPatterns: string[];\n commonEntities: string[];\n };\n similarSessions: SimilarSession[];\n projectContext?: {\n domain: 'business' | 'ecommerce' | 'cms' | 'dashboard' | 'workflow';\n existingEntities: string[];\n conventions: string[];\n };\n learnedPatterns: Array<{\n pattern: string;\n confidence: number;\n useCount: number;\n }>;\n}\n\nexport interface MemoryQualityMetrics {\n recallAccuracy: number;\n precision: number;\n latencyMs: number;\n cacheHitRate: number;\n}\n\n// ============================================================================\n// Memory Integration Engine\n// ============================================================================\n\nexport class MemoryIntegrationEngine {\n private options: Required<MemoryIntegrationOptions>;\n private searchEngine: AgenticSearchEngine;\n private preferenceLearner: PreferenceLearner;\n private metrics: {\n queries: number;\n hits: number;\n totalLatencyMs: number;\n } = { queries: 0, hits: 0, totalLatencyMs: 0 };\n\n constructor(options: MemoryIntegrationOptions) {\n this.options = {\n enableEpisodic: true,\n enableSemantic: true,\n enableProcedural: true,\n ...options,\n } as Required<MemoryIntegrationOptions>;\n\n this.searchEngine = createAgenticSearchEngine(options.memoryManager);\n\n this.preferenceLearner = createPreferenceLearner({\n memoryManager: options.memoryManager,\n } as any);\n \n // Validate required options\n if (!options.memoryManager) {\n throw new Error('MemoryManager is required for MemoryIntegrationEngine');\n }\n }\n\n // ============================================================================\n // Episodic Memory: Past Sessions\n // ============================================================================\n\n /**\n * Retrieve similar past generation sessions\n */\n async retrieveSimilarSessions(\n request: string,\n limit: number = 5\n ): Promise<SimilarSession[]> {\n if (!this.options.enableEpisodic) return [];\n\n const start = Date.now();\n \n try {\n // Search for similar requests\n const results = await this.searchEngine.search({\n userId: this.options.userId,\n query: request,\n strategy: 'semantic',\n limit,\n });\n\n const sessions: SimilarSession[] = results.results\n .filter(r => r.type === 'session')\n .map(r => {\n const session = r.data as { id?: string; request?: string; schemaSnapshot?: string; success?: boolean };\n return {\n sessionId: session.id ?? 'unknown',\n request: session.request ?? '',\n schema: session.schemaSnapshot ? JSON.parse(session.schemaSnapshot) : null,\n success: session.success ?? false,\n similarity: r.relevance,\n };\n });\n\n this.recordMetrics(true, Date.now() - start);\n return sessions;\n } catch (error) {\n this.recordMetrics(false, Date.now() - start);\n console.warn('[Memory] Failed to retrieve similar sessions:', error);\n return [];\n }\n }\n\n /**\n * Record a new generation session to episodic memory\n */\n async recordSession(\n request: string,\n result: {\n schema: unknown;\n success: boolean;\n validationResult?: { valid: boolean; errors: string[] };\n }\n ): Promise<void> {\n if (!this.options.enableEpisodic) return;\n\n await this.options.memoryManager.recordGeneration(\n this.options.userId,\n {\n threadId: `thread_${Date.now()}`,\n prompt: request,\n skill: 'kflow-orbitals',\n generatedSchema: result.schema as Record<string, unknown>,\n entities: [],\n patterns: [],\n success: result.success,\n validationResult: result.validationResult,\n }\n );\n }\n\n // ============================================================================\n // Semantic Memory: Patterns & Preferences\n // ============================================================================\n\n /**\n * Get learned user preferences\n */\n async getUserPreferences(): Promise<MemoryContext['userPreferences']> {\n if (!this.options.enableSemantic) {\n return {\n namingConvention: 'PascalCase',\n preferredPatterns: [],\n commonEntities: [],\n };\n }\n\n try {\n const prefs = await this.options.memoryManager.getUserPreferences(\n this.options.userId\n );\n\n if (!prefs) {\n return {\n namingConvention: 'PascalCase',\n preferredPatterns: [],\n commonEntities: [],\n };\n }\n\n return {\n namingConvention: prefs.namingConvention ?? 'PascalCase',\n preferredPatterns: prefs.preferredPatterns ?? [],\n commonEntities: prefs.commonEntities ?? [],\n };\n } catch (error) {\n console.warn('[Memory] Failed to get user preferences:', error);\n return {\n namingConvention: 'PascalCase',\n preferredPatterns: [],\n commonEntities: [],\n };\n }\n }\n\n /**\n * Learn from user feedback\n */\n async learnFromFeedback(\n feedback: {\n pattern: string;\n outcome: 'success' | 'failure';\n entityType?: string;\n }\n ): Promise<void> {\n if (!this.options.enableSemantic) return;\n\n await this.options.memoryManager.updatePatternAffinity(\n this.options.userId,\n feedback.pattern,\n feedback.outcome,\n { entityType: feedback.entityType }\n );\n }\n\n /**\n * Infer preferences from usage patterns\n */\n async inferPreferences(): Promise<{\n namingConvention?: string;\n validationStyle?: string;\n confidence: number;\n }> {\n if (!this.options.enableSemantic) {\n return { confidence: 0 };\n }\n\n try {\n // Get recent sessions for analysis\n const sessions = await this.options.memoryManager.getUserGenerationHistory(\n this.options.userId,\n 5\n );\n \n if (sessions.length === 0) {\n return { confidence: 0 };\n }\n \n // Analyze the most recent session\n const analysis = await this.preferenceLearner.analyzeSession(sessions[0]);\n \n // Extract naming convention inference\n const namingInference = analysis.inferences.find(i => i.field === 'namingConvention');\n const validationInference = analysis.inferences.find(i => i.field === 'validationStyle');\n \n return {\n namingConvention: namingInference?.value as string,\n validationStyle: validationInference?.value as string,\n confidence: analysis.isHighConfidence ? 0.8 : 0.5,\n };\n } catch (error) {\n console.warn('[Memory] Failed to infer preferences:', error);\n return { confidence: 0 };\n }\n }\n\n // ============================================================================\n // Procedural Memory: Domain Workflows\n // ============================================================================\n\n /**\n * Get project context (domain-specific knowledge)\n */\n async getProjectContext(): Promise<MemoryContext['projectContext'] | undefined> {\n if (!this.options.enableProcedural || !this.options.projectId) {\n return undefined;\n }\n\n try {\n const context = await this.options.memoryManager.getProjectContext(\n this.options.projectId\n );\n\n if (!context) return undefined;\n\n return {\n domain: (context.domain as 'business' | 'ecommerce' | 'cms' | 'dashboard' | 'workflow') ?? 'business',\n existingEntities: context.existingEntities ?? [],\n conventions: context.conventions ?? [],\n };\n } catch (error) {\n console.warn('[Memory] Failed to get project context:', error);\n return undefined;\n }\n }\n\n /**\n * Update project context with new conventions\n */\n async updateProjectContext(\n update: {\n domain?: 'business' | 'ecommerce' | 'cms' | 'dashboard' | 'workflow';\n conventions?: string[];\n existingEntities?: string[];\n }\n ): Promise<void> {\n if (!this.options.enableProcedural || !this.options.projectId) return;\n\n await this.options.memoryManager.updateProjectContext(\n this.options.projectId,\n {\n userId: this.options.userId,\n domain: update.domain,\n conventions: update.conventions,\n existingEntities: update.existingEntities,\n }\n );\n }\n\n // ============================================================================\n // Combined Memory Context\n // ============================================================================\n\n /**\n * Build complete memory context for a generation request\n */\n async buildContext(request: string): Promise<MemoryContext> {\n const start = Date.now();\n\n const [\n userPreferences,\n similarSessions,\n projectContext,\n inferredPrefs,\n ] = await Promise.all([\n this.getUserPreferences(),\n this.retrieveSimilarSessions(request, 3),\n this.getProjectContext(),\n this.inferPreferences(),\n ]);\n\n // Merge inferred preferences if confidence is high\n if (inferredPrefs.confidence > 0.7) {\n if (inferredPrefs.namingConvention) {\n userPreferences.namingConvention = inferredPrefs.namingConvention;\n }\n }\n\n const latencyMs = Date.now() - start;\n\n console.log(`[Memory] Context built in ${latencyMs}ms:`, {\n similarSessions: similarSessions.length,\n hasProjectContext: !!projectContext,\n userPreferences: Object.keys(userPreferences).length,\n });\n\n return {\n userPreferences,\n similarSessions,\n projectContext,\n learnedPatterns: [], // Would be populated from pattern affinity\n };\n }\n\n // ============================================================================\n // Metrics\n // ============================================================================\n\n /**\n * Get memory quality metrics\n */\n getMetrics(): MemoryQualityMetrics {\n const totalQueries = this.metrics.queries;\n const hits = this.metrics.hits;\n \n return {\n recallAccuracy: totalQueries > 0 ? hits / totalQueries : 0,\n precision: 0.85, // Simplified metric\n latencyMs: totalQueries > 0 ? this.metrics.totalLatencyMs / totalQueries : 0,\n cacheHitRate: 0.3, // Simplified metric\n };\n }\n\n private recordMetrics(hit: boolean, latencyMs: number): void {\n this.metrics.queries++;\n if (hit) this.metrics.hits++;\n this.metrics.totalLatencyMs += latencyMs;\n }\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createMemoryIntegration(\n options: MemoryIntegrationOptions\n): MemoryIntegrationEngine {\n return new MemoryIntegrationEngine(options);\n}\n","/**\n * Tool Composition & Chaining - Phase 3.3\n *\n * Composable tool workflows with parallel execution, error handling,\n * and conditional branching.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ToolStepStatus = 'pending' | 'running' | 'success' | 'error' | 'skipped';\n\nexport interface ToolStep {\n id: string;\n name: string;\n tool: string;\n input: Record<string, unknown> | ((context: WorkflowContext) => Record<string, unknown>);\n condition?: (context: WorkflowContext) => boolean;\n dependsOn?: string[];\n status: ToolStepStatus;\n output?: unknown;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\nexport interface WorkflowContext {\n workflowId: string;\n inputs: Record<string, unknown>;\n outputs: Record<string, unknown>;\n stepResults: Map<string, { success: boolean; output?: unknown; error?: string }>;\n metadata: {\n startTime: number;\n stepsCompleted: number;\n stepsFailed: number;\n };\n}\n\nexport interface WorkflowDefinition {\n name: string;\n description: string;\n inputs: Record<string, { type: string; required: boolean; default?: unknown }>;\n steps: ToolStep[];\n onError?: 'stop' | 'continue' | 'retry';\n maxRetries?: number;\n}\n\nexport interface WorkflowExecutionResult {\n success: boolean;\n workflowId: string;\n context: WorkflowContext;\n steps: ToolStep[];\n durationMs: number;\n error?: string;\n}\n\nexport interface ParallelExecutionResult {\n stepId: string;\n success: boolean;\n output?: unknown;\n error?: string;\n durationMs: number;\n}\n\n// ============================================================================\n// Tool Executor Interface\n// ============================================================================\n\nexport interface ToolExecutor {\n execute(tool: string, input: Record<string, unknown>): Promise<unknown>;\n}\n\n// ============================================================================\n// Workflow Engine\n// ============================================================================\n\nexport class WorkflowEngine {\n private executor: ToolExecutor;\n private workflows: Map<string, WorkflowDefinition> = new Map();\n\n constructor(executor: ToolExecutor) {\n this.executor = executor;\n }\n\n /**\n * Register a workflow definition\n */\n registerWorkflow(definition: WorkflowDefinition): void {\n this.workflows.set(definition.name, definition);\n }\n\n /**\n * Execute a workflow by name\n */\n async executeWorkflow(\n workflowName: string,\n inputs: Record<string, unknown>\n ): Promise<WorkflowExecutionResult> {\n const definition = this.workflows.get(workflowName);\n if (!definition) {\n throw new Error(`Workflow not found: ${workflowName}`);\n }\n\n return this.runWorkflow(definition, inputs);\n }\n\n /**\n * Execute a workflow definition directly\n */\n async runWorkflow(\n definition: WorkflowDefinition,\n inputs: Record<string, unknown>\n ): Promise<WorkflowExecutionResult> {\n const workflowId = `wf_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n const startTime = Date.now();\n\n const context: WorkflowContext = {\n workflowId,\n inputs,\n outputs: {},\n stepResults: new Map(),\n metadata: {\n startTime,\n stepsCompleted: 0,\n stepsFailed: 0,\n },\n };\n\n const steps = definition.steps.map(s => ({ ...s, status: 'pending' as ToolStepStatus }));\n\n try {\n // Topological sort for dependency resolution\n const executionOrder = this.resolveDependencies(steps);\n\n for (const stepId of executionOrder) {\n const step = steps.find(s => s.id === stepId)!;\n \n // Check condition\n if (step.condition && !step.condition(context)) {\n step.status = 'skipped';\n continue;\n }\n\n // Execute step\n await this.executeStep(step, context, definition);\n\n if (step.status === 'error' && definition.onError === 'stop') {\n break;\n }\n }\n\n const durationMs = Date.now() - startTime;\n\n return {\n success: context.metadata.stepsFailed === 0,\n workflowId,\n context,\n steps,\n durationMs,\n };\n } catch (error) {\n return {\n success: false,\n workflowId,\n context,\n steps,\n durationMs: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Execute independent steps in parallel\n */\n async executeParallel(\n steps: Array<{ id: string; tool: string; input: Record<string, unknown> }>,\n context: WorkflowContext\n ): Promise<ParallelExecutionResult[]> {\n const promises = steps.map(async (step) => {\n const startTime = Date.now();\n \n try {\n // Resolve input if it's a function\n const input = typeof step.input === 'function' \n ? (step.input as Function)(context)\n : step.input;\n\n const output = await this.executor.execute(step.tool, input);\n \n return {\n stepId: step.id,\n success: true,\n output,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return {\n stepId: step.id,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n };\n }\n });\n\n return Promise.all(promises);\n }\n\n /**\n * Create a workflow builder for fluent API\n */\n createWorkflow(name: string, description: string): WorkflowBuilder {\n return new WorkflowBuilder(this, name, description);\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n private async executeStep(\n step: ToolStep,\n context: WorkflowContext,\n definition: WorkflowDefinition\n ): Promise<void> {\n step.status = 'running';\n step.startTime = Date.now();\n\n const maxRetries = definition.maxRetries ?? 0;\n let attempt = 0;\n\n while (attempt <= maxRetries) {\n try {\n // Resolve input\n const input = typeof step.input === 'function'\n ? (step.input as (context: WorkflowContext) => Record<string, unknown>)(context)\n : step.input;\n\n const output = await this.executor.execute(step.tool, input);\n\n step.output = output;\n step.status = 'success';\n step.endTime = Date.now();\n \n context.stepResults.set(step.id, { success: true, output });\n context.outputs[step.id] = output;\n context.metadata.stepsCompleted++;\n\n return;\n } catch (error) {\n attempt++;\n \n if (attempt > maxRetries) {\n step.error = error instanceof Error ? error.message : String(error);\n step.status = 'error';\n step.endTime = Date.now();\n \n context.stepResults.set(step.id, { success: false, error: step.error });\n context.metadata.stepsFailed++;\n \n return;\n }\n\n // Retry delay\n await new Promise(r => setTimeout(r, 1000 * attempt));\n }\n }\n }\n\n private resolveDependencies(steps: ToolStep[]): string[] {\n const visited = new Set<string>();\n const result: string[] = [];\n\n const visit = (stepId: string) => {\n if (visited.has(stepId)) return;\n visited.add(stepId);\n\n const step = steps.find(s => s.id === stepId);\n if (!step) return;\n\n // Visit dependencies first\n if (step.dependsOn) {\n for (const dep of step.dependsOn) {\n visit(dep);\n }\n }\n\n result.push(stepId);\n };\n\n for (const step of steps) {\n visit(step.id);\n }\n\n return result;\n }\n}\n\n// ============================================================================\n// Workflow Builder (Fluent API)\n// ============================================================================\n\nexport class WorkflowBuilder {\n private engine: WorkflowEngine;\n private definition: WorkflowDefinition;\n\n constructor(engine: WorkflowEngine, name: string, description: string) {\n this.engine = engine;\n this.definition = {\n name,\n description,\n inputs: {},\n steps: [],\n onError: 'stop',\n maxRetries: 0,\n };\n }\n\n input(name: string, type: string, required: boolean = true, defaultValue?: unknown): this {\n this.definition.inputs[name] = { type, required, default: defaultValue };\n return this;\n }\n\n step(\n id: string,\n tool: string,\n input: Record<string, unknown> | ((context: WorkflowContext) => Record<string, unknown>),\n options: {\n dependsOn?: string[];\n condition?: (context: WorkflowContext) => boolean;\n } = {}\n ): this {\n this.definition.steps.push({\n id,\n name: id,\n tool,\n input,\n dependsOn: options.dependsOn,\n condition: options.condition,\n status: 'pending',\n });\n return this;\n }\n\n parallel(steps: Array<{\n id: string;\n tool: string;\n input: Record<string, unknown>;\n }>): this {\n // Add all steps with no dependencies between them\n for (const step of steps) {\n this.definition.steps.push({\n id: step.id,\n name: step.id,\n tool: step.tool,\n input: step.input,\n status: 'pending',\n });\n }\n return this;\n }\n\n onError(policy: 'stop' | 'continue' | 'retry'): this {\n this.definition.onError = policy;\n return this;\n }\n\n retry(maxRetries: number): this {\n this.definition.maxRetries = maxRetries;\n return this;\n }\n\n build(): WorkflowDefinition {\n return this.definition;\n }\n\n async execute(inputs: Record<string, unknown>): Promise<WorkflowExecutionResult> {\n return this.engine.runWorkflow(this.definition, inputs);\n }\n}\n\n// ============================================================================\n// Common Workflows\n// ============================================================================\n\nexport function createSchemaGenerationWorkflow(engine: WorkflowEngine): WorkflowDefinition {\n return engine.createWorkflow(\n 'schema-generation',\n 'Generate and validate orbital schema'\n )\n .input('request', 'string', true)\n .input('domain', 'string', false, 'business')\n .step(\n 'decompose',\n 'decompose_requirements',\n { request: (ctx: WorkflowContext) => ctx.inputs.request as string },\n )\n .step(\n 'generate',\n 'generate_orbital',\n { requirements: (ctx: WorkflowContext) => ctx.outputs.decompose },\n { dependsOn: ['decompose'] }\n )\n .step(\n 'validate',\n 'validate_schema',\n { schema: (ctx: WorkflowContext) => ctx.outputs.generate },\n { dependsOn: ['generate'] }\n )\n .step(\n 'fix',\n 'fix_schema_errors',\n { \n schema: (ctx: WorkflowContext) => ctx.outputs.generate, \n errors: (ctx: WorkflowContext) => ctx.outputs.validate \n },\n { \n dependsOn: ['validate'],\n condition: (ctx: WorkflowContext) => !ctx.stepResults.get('validate')?.success\n }\n )\n .retry(2)\n .build();\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createWorkflowEngine(executor: ToolExecutor): WorkflowEngine {\n return new WorkflowEngine(executor);\n}\n","/**\n * ReAct Workflow Integration - Phase 3.4\n *\n * Wires workflow engine into ReAct act() phase for complex multi-tool actions.\n * Enables: retry, parallel execution, conditional branching in ReAct loops.\n *\n * @packageDocumentation\n */\n\nimport { WorkflowEngine, type WorkflowExecutionResult } from '../tools/composition.js';\nimport { ReActEngine, type ReActSession, type ReActStep } from './react-reflection.js';\nimport type { MemoryManager } from '../memory/MemoryManager.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Workflow action definition for ReAct\n */\nexport interface WorkflowAction {\n /** Action name */\n name: string;\n /** Workflow definition */\n workflow: {\n steps: Array<{\n id: string;\n tool: string;\n input: Record<string, unknown>;\n dependsOn?: string[];\n }>;\n parallel?: string[][];\n condition?: {\n stepId: string;\n predicate: (context: unknown) => boolean;\n then: string;\n else: string;\n };\n retry?: {\n stepId: string;\n maxAttempts: number;\n backoffMs: number;\n };\n };\n /** Expected output schema */\n outputSchema?: Record<string, unknown>;\n}\n\n/**\n * Workflow action result\n */\nexport interface WorkflowActionResult {\n success: boolean;\n output: unknown;\n stepsExecuted: number;\n durationMs: number;\n retries: number;\n errors: string[];\n}\n\n/**\n * ReAct workflow executor options\n */\nexport interface ReActWorkflowOptions {\n /** Tool executor */\n toolExecutor: {\n execute(tool: string, input: Record<string, unknown>): Promise<unknown>;\n };\n /** Memory manager for storing workflow results */\n memoryManager?: MemoryManager;\n /** Enable workflow telemetry */\n enableTelemetry?: boolean;\n /** Max workflow execution time */\n maxExecutionMs?: number;\n}\n\n/**\n * Workflow telemetry event\n */\nexport interface WorkflowTelemetryEvent {\n sessionId: string;\n actionName: string;\n stepId: string;\n tool: string;\n durationMs: number;\n success: boolean;\n retryCount: number;\n timestamp: number;\n}\n\n// ============================================================================\n// ReAct Workflow Executor\n// ============================================================================\n\nexport class ReActWorkflowExecutor {\n private workflowEngine: WorkflowEngine;\n private options: ReActWorkflowOptions & {\n enableTelemetry: boolean;\n maxExecutionMs: number;\n };\n private telemetry: WorkflowTelemetryEvent[] = [];\n\n constructor(options: ReActWorkflowOptions) {\n this.options = {\n ...options,\n enableTelemetry: options.enableTelemetry ?? true,\n maxExecutionMs: options.maxExecutionMs ?? 60000,\n };\n\n this.workflowEngine = new WorkflowEngine(options.toolExecutor);\n }\n\n /**\n * Execute a workflow action within a ReAct session\n * This replaces simple tool calls with full workflows\n */\n async executeWorkflowAction(\n session: ReActSession,\n action: WorkflowAction,\n context: Record<string, unknown>\n ): Promise<WorkflowActionResult> {\n const startTime = Date.now();\n const errors: string[] = [];\n let totalRetries = 0;\n\n // Register workflow definition\n this.workflowEngine.registerWorkflow({\n name: action.name,\n description: `Workflow for ${action.name}`,\n inputs: Object.keys(context).reduce((acc, key) => {\n acc[key] = { type: 'unknown', required: false };\n return acc;\n }, {} as Record<string, { type: string; required: boolean }>),\n steps: action.workflow.steps.map(step => ({\n id: step.id,\n name: step.id,\n tool: step.tool,\n input: step.input,\n dependsOn: step.dependsOn,\n status: 'pending' as const,\n })),\n onError: 'retry',\n maxRetries: 3,\n });\n\n try {\n // Execute workflow with timeout\n const result = await this.executeWithTimeout(\n action.name,\n context,\n this.options.maxExecutionMs\n );\n\n // Calculate metrics\n const stepsExecuted = result.steps.filter(s => \n s.status === 'success' || s.status === 'error'\n ).length;\n\n // Count retries from telemetry\n totalRetries = this.telemetry.filter(\n t => t.sessionId === session.sessionId && t.actionName === action.name\n ).reduce((sum, t) => sum + t.retryCount, 0);\n\n // Store successful result in memory\n if (result.success && this.options.memoryManager) {\n await this.storeWorkflowResult(session, action.name, result);\n }\n\n return {\n success: result.success,\n output: result.context.outputs,\n stepsExecuted,\n durationMs: result.durationMs || Date.now() - startTime,\n retries: totalRetries,\n errors: result.error ? [result.error] : errors,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n errors.push(errorMessage);\n\n return {\n success: false,\n output: null,\n stepsExecuted: 0,\n durationMs: Date.now() - startTime,\n retries: totalRetries,\n errors,\n };\n }\n }\n\n /**\n * Execute workflow with timeout\n */\n private async executeWithTimeout(\n workflowName: string,\n inputs: Record<string, unknown>,\n timeoutMs: number\n ): Promise<WorkflowExecutionResult> {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Workflow execution timeout')), timeoutMs);\n });\n\n const executionPromise = this.workflowEngine.executeWorkflow(workflowName, inputs);\n\n return Promise.race([executionPromise, timeoutPromise]);\n }\n\n /**\n * Store workflow result in memory for learning\n */\n private async storeWorkflowResult(\n session: ReActSession,\n actionName: string,\n result: WorkflowExecutionResult\n ): Promise<void> {\n if (!this.options.memoryManager) return;\n\n // Store as generation history\n await this.options.memoryManager.recordGeneration(\n session.sessionId, // Use session ID as user ID proxy\n {\n threadId: session.sessionId,\n prompt: `Workflow: ${actionName}`,\n skill: 'react-workflow',\n generatedSchema: result.context.outputs as Record<string, unknown>,\n entities: [],\n patterns: [],\n success: result.success,\n }\n );\n }\n\n /**\n * Record telemetry for a workflow step\n */\n recordTelemetry(event: WorkflowTelemetryEvent): void {\n if (!this.options.enableTelemetry) return;\n\n this.telemetry.push(event);\n\n // Prune old telemetry\n if (this.telemetry.length > 1000) {\n this.telemetry = this.telemetry.slice(-500);\n }\n }\n\n /**\n * Get telemetry for analysis\n */\n getTelemetry(sessionId?: string): WorkflowTelemetryEvent[] {\n if (sessionId) {\n return this.telemetry.filter(t => t.sessionId === sessionId);\n }\n return [...this.telemetry];\n }\n\n /**\n * Get workflow performance metrics\n */\n getMetrics(): {\n totalWorkflows: number;\n successRate: number;\n avgDurationMs: number;\n avgRetries: number;\n toolUsage: Record<string, number>;\n } {\n const events = this.telemetry;\n const uniqueWorkflows = new Set(events.map(e => e.actionName)).size;\n \n const successCount = events.filter(e => e.success).length;\n const successRate = events.length > 0 ? successCount / events.length : 0;\n \n const avgDuration = events.length > 0 \n ? events.reduce((sum, e) => sum + e.durationMs, 0) / events.length \n : 0;\n \n const avgRetries = events.length > 0\n ? events.reduce((sum, e) => sum + e.retryCount, 0) / events.length\n : 0;\n\n const toolUsage = events.reduce((acc, e) => {\n acc[e.tool] = (acc[e.tool] || 0) + 1;\n return acc;\n }, {} as Record<string, number>);\n\n return {\n totalWorkflows: uniqueWorkflows,\n successRate,\n avgDurationMs: avgDuration,\n avgRetries,\n toolUsage,\n };\n }\n}\n\n// ============================================================================\n// Extended ReAct Engine with Workflow Support\n// ============================================================================\n\nexport interface ExtendedReActOptions {\n /** Base ReAct options */\n reactOptions: ConstructorParameters<typeof ReActEngine>[0];\n /** Workflow executor options */\n workflowOptions: ReActWorkflowOptions;\n}\n\n/**\n * Extended ReAct engine with workflow integration\n */\nexport class ReActWorkflowEngine {\n private reactEngine: ReActEngine;\n private workflowExecutor: ReActWorkflowExecutor;\n\n constructor(options: ExtendedReActOptions) {\n this.reactEngine = new ReActEngine(options.reactOptions);\n this.workflowExecutor = new ReActWorkflowExecutor(options.workflowOptions);\n }\n\n /**\n * Start a new session\n */\n startSession(userRequest: string): ReActSession {\n return this.reactEngine.startSession(userRequest);\n }\n\n /**\n * Execute REASON step\n */\n async reason(\n sessionId: string,\n context: { request: string; previousSteps?: ReActStep[] }\n ): Promise<ReActStep> {\n return this.reactEngine.reason(sessionId, context);\n }\n\n /**\n * Execute ACT step with workflow support\n * \n * This is the key integration point - replaces simple tool calls\n * with full workflows that have retry, parallel execution, etc.\n */\n async act(\n sessionId: string,\n action: string,\n actionInput: Record<string, unknown>,\n workflowAction?: WorkflowAction\n ): Promise<{ step: ReActStep; workflowResult?: WorkflowActionResult }> {\n const session = this.reactEngine.getSession(sessionId);\n\n // If no workflow defined, fall back to simple action\n if (!workflowAction) {\n const step = await this.reactEngine.act(sessionId, action, actionInput);\n return { step };\n }\n\n // Execute workflow action\n const workflowResult = await this.workflowExecutor.executeWorkflowAction(\n session,\n workflowAction,\n actionInput\n );\n\n // Create step with workflow results\n const step: ReActStep = {\n stepNumber: ++session.currentStep,\n state: 'ACTING',\n thought: `Executing workflow: ${workflowAction.name}`,\n action: workflowAction.name,\n actionInput,\n observation: workflowResult.success \n ? `Workflow completed successfully (${workflowResult.stepsExecuted} steps)`\n : `Workflow failed: ${workflowResult.errors.join(', ')}`,\n timestamp: new Date(),\n };\n\n // Store in session\n session.steps.push(step);\n session.state = workflowResult.success ? 'OBSERVING' : 'REFLECTING';\n\n return { step, workflowResult };\n }\n\n /**\n * Execute OBSERVE step\n */\n async observe(sessionId: string, observation: string): Promise<ReActStep> {\n return this.reactEngine.observe(sessionId, observation);\n }\n\n /**\n * Execute REFLECT step\n */\n async reflect(\n sessionId: string,\n result: unknown\n ): Promise<{ step: ReActStep; reflection: import('./react-reflection.js').ReflectionResult }> {\n return this.reactEngine.reflect(sessionId, result);\n }\n\n /**\n * Execute CORRECT step\n */\n async correct(\n sessionId: string,\n correctionAction: string,\n correctionInput: Record<string, unknown>\n ): Promise<ReActStep> {\n return this.reactEngine.correct(sessionId, correctionAction, correctionInput);\n }\n\n /**\n * Get session\n */\n getSession(sessionId: string): ReActSession {\n return this.reactEngine.getSession(sessionId);\n }\n\n /**\n * Get workflow metrics\n */\n getWorkflowMetrics(): ReturnType<ReActWorkflowExecutor['getMetrics']> {\n return this.workflowExecutor.getMetrics();\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\nexport function createReActWorkflowExecutor(\n options: ReActWorkflowOptions\n): ReActWorkflowExecutor {\n return new ReActWorkflowExecutor(options);\n}\n\nexport function createReActWorkflowEngine(\n options: ExtendedReActOptions\n): ReActWorkflowEngine {\n return new ReActWorkflowEngine(options);\n}\n","/**\n * HITL Workflow Integration - Phase 3.4\n *\n * Human-in-the-Loop with workflow-based conditional branching.\n * Enables complex approval flows with human gates.\n *\n * @packageDocumentation\n */\n\nimport { WorkflowEngine, type WorkflowBuilder } from '../tools/composition.js';\nimport { HITLv2Manager, type InterruptRequest, type InterruptResponse } from './hitl-v2.js';\nimport type { MemoryManager } from '../memory/MemoryManager.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Human gate types\n */\nexport type HumanGateType = 'approval' | 'edit' | 'select' | 'custom';\n\n/**\n * Human gate configuration\n */\nexport interface HumanGate {\n /** Gate ID */\n id: string;\n /** Gate type */\n type: HumanGateType;\n /** Display title */\n title: string;\n /** Description */\n description: string;\n /** Gate condition - when to show */\n condition?: (context: unknown) => boolean;\n /** Timeout in ms */\n timeoutMs?: number;\n /** Auto-approve if condition met */\n autoApprove?: {\n condition: (context: unknown) => boolean;\n reason: string;\n };\n /** Gate-specific payload */\n payload?: Record<string, unknown>;\n}\n\n/**\n * Human gate result\n */\nexport interface HumanGateResult {\n gateId: string;\n approved: boolean;\n response: unknown;\n respondedAt: number;\n userId?: string;\n autoApproved: boolean;\n}\n\n/**\n * Workflow branch definition\n */\nexport interface WorkflowBranch {\n /** Branch ID */\n id: string;\n /** Branch condition */\n condition: (context: unknown) => boolean;\n /** Steps to execute */\n steps: Array<{\n tool: string;\n input: Record<string, unknown>;\n }>;\n /** Human gate before branch */\n gate?: HumanGate;\n}\n\n/**\n * HITL workflow definition\n */\nexport interface HITLWorkflowDefinition {\n /** Workflow name */\n name: string;\n /** Initial steps (before any gates) */\n initialSteps: Array<{\n tool: string;\n input: Record<string, unknown>;\n }>;\n /** Human gates with conditional branches */\n gates: HumanGate[];\n /** Branches based on gate outcomes */\n branches: WorkflowBranch[];\n /** Fallback if no branches match */\n fallbackBranch?: WorkflowBranch;\n}\n\n/**\n * HITL workflow result\n */\nexport interface HITLWorkflowResult {\n success: boolean;\n output: unknown;\n gatesPassed: HumanGateResult[];\n branchesTaken: string[];\n durationMs: number;\n wasInterrupted: boolean;\n}\n\n/**\n * HITL workflow options\n */\nexport interface HITLWorkflowOptions {\n /** HITL manager */\n hitlManager: HITLv2Manager;\n /** Tool executor */\n toolExecutor: {\n execute(tool: string, input: Record<string, unknown>): Promise<unknown>;\n };\n /** Memory manager */\n memoryManager?: MemoryManager;\n /** Default gate timeout */\n defaultTimeoutMs?: number;\n /** Enable auto-approval learning */\n enableAutoApprove?: boolean;\n}\n\n// ============================================================================\n// HITL Workflow Engine\n// ============================================================================\n\nexport class HITLWorkflowEngine {\n private workflowEngine: WorkflowEngine;\n private hitlManager: HITLv2Manager;\n private options: HITLWorkflowOptions & {\n defaultTimeoutMs: number;\n enableAutoApprove: boolean;\n };\n private gateHistory: Map<string, HumanGateResult[]> = new Map();\n\n constructor(options: HITLWorkflowOptions) {\n this.options = {\n ...options,\n defaultTimeoutMs: options.defaultTimeoutMs ?? 300000, // 5 minutes\n enableAutoApprove: options.enableAutoApprove ?? true,\n };\n\n this.hitlManager = options.hitlManager;\n this.workflowEngine = new WorkflowEngine(options.toolExecutor);\n }\n\n /**\n * Execute a workflow with human gates\n */\n async executeWorkflow(\n sessionId: string,\n workflow: HITLWorkflowDefinition,\n initialContext: Record<string, unknown>\n ): Promise<HITLWorkflowResult> {\n const startTime = Date.now();\n const gatesPassed: HumanGateResult[] = [];\n const branchesTaken: string[] = [];\n let wasInterrupted = false;\n\n try {\n // Execute initial steps\n let context = await this.executeInitialSteps(\n workflow.initialSteps,\n initialContext\n );\n\n // Process each gate\n for (const gate of workflow.gates) {\n // Check if gate condition is met\n if (gate.condition && !gate.condition(context)) {\n continue; // Skip this gate\n }\n\n // Check for auto-approval\n if (this.options.enableAutoApprove && gate.autoApprove) {\n if (gate.autoApprove.condition(context)) {\n const autoResult: HumanGateResult = {\n gateId: gate.id,\n approved: true,\n response: { autoApproved: true, reason: gate.autoApprove.reason },\n respondedAt: Date.now(),\n autoApproved: true,\n };\n gatesPassed.push(autoResult);\n continue;\n }\n }\n\n // Show human gate\n wasInterrupted = true;\n const gateResult = await this.executeHumanGate(sessionId, gate);\n gatesPassed.push(gateResult);\n\n if (!gateResult.approved) {\n return {\n success: false,\n output: null,\n gatesPassed,\n branchesTaken,\n durationMs: Date.now() - startTime,\n wasInterrupted,\n };\n }\n\n // Update context with gate response\n context = {\n ...context,\n [`gate_${gate.id}`]: gateResult.response,\n };\n }\n\n // Find and execute matching branch\n let branchExecuted = false;\n for (const branch of workflow.branches) {\n if (branch.condition(context)) {\n branchesTaken.push(branch.id);\n \n // Check for branch-level gate\n if (branch.gate) {\n wasInterrupted = true;\n const branchGateResult = await this.executeHumanGate(\n sessionId,\n branch.gate\n );\n gatesPassed.push(branchGateResult);\n\n if (!branchGateResult.approved) {\n continue; // Try next branch\n }\n }\n\n // Execute branch steps\n context = await this.executeBranchSteps(branch.steps, context);\n branchExecuted = true;\n break;\n }\n }\n\n // Execute fallback if no branch matched\n if (!branchExecuted && workflow.fallbackBranch) {\n branchesTaken.push(workflow.fallbackBranch.id);\n context = await this.executeBranchSteps(\n workflow.fallbackBranch.steps,\n context\n );\n }\n\n // Store gate history\n this.gateHistory.set(sessionId, gatesPassed);\n\n return {\n success: true,\n output: context,\n gatesPassed,\n branchesTaken,\n durationMs: Date.now() - startTime,\n wasInterrupted,\n };\n } catch (error) {\n return {\n success: false,\n output: error instanceof Error ? error.message : String(error),\n gatesPassed,\n branchesTaken,\n durationMs: Date.now() - startTime,\n wasInterrupted,\n };\n }\n }\n\n /**\n * Execute initial workflow steps\n */\n private async executeInitialSteps(\n steps: Array<{ tool: string; input: Record<string, unknown> }>,\n context: Record<string, unknown>\n ): Promise<Record<string, unknown>> {\n let result = { ...context };\n\n for (const step of steps) {\n const output = await this.options.toolExecutor.execute(\n step.tool,\n this.interpolateInput(step.input, result)\n );\n result = { ...result, [step.tool]: output };\n }\n\n return result;\n }\n\n /**\n * Execute a human gate\n */\n private async executeHumanGate(\n sessionId: string,\n gate: HumanGate\n ): Promise<HumanGateResult> {\n const timeoutMs = gate.timeoutMs ?? this.options.defaultTimeoutMs;\n\n switch (gate.type) {\n case 'approval':\n return this.executeApprovalGate(sessionId, gate, timeoutMs);\n case 'edit':\n return this.executeEditGate(sessionId, gate, timeoutMs);\n case 'select':\n return this.executeSelectGate(sessionId, gate, timeoutMs);\n case 'custom':\n return this.executeCustomGate(sessionId, gate, timeoutMs);\n default:\n throw new Error(`Unknown gate type: ${gate.type}`);\n }\n }\n\n /**\n * Execute approval gate\n */\n private async executeApprovalGate(\n sessionId: string,\n gate: HumanGate,\n timeoutMs: number\n ): Promise<HumanGateResult> {\n const approved = await this.hitlManager.confirm(sessionId, gate.description, {\n severity: 'info',\n timeoutMs,\n context: {\n checkpointId: `gate_${gate.id}`,\n currentState: 'awaiting_approval',\n previousActions: [],\n },\n });\n\n return {\n gateId: gate.id,\n approved,\n response: { approved },\n respondedAt: Date.now(),\n autoApproved: false,\n };\n }\n\n /**\n * Execute edit gate\n */\n private async executeEditGate(\n sessionId: string,\n gate: HumanGate,\n timeoutMs: number\n ): Promise<HumanGateResult> {\n const content = gate.payload?.content as string || '';\n \n const edited = await this.hitlManager.edit(sessionId, content, {\n format: (gate.payload?.format as 'json' | 'text' | 'code') || 'text',\n title: gate.title,\n description: gate.description,\n timeoutMs,\n });\n\n return {\n gateId: gate.id,\n approved: true,\n response: { edited, content: edited },\n respondedAt: Date.now(),\n autoApproved: false,\n };\n }\n\n /**\n * Execute select gate\n */\n private async executeSelectGate(\n sessionId: string,\n gate: HumanGate,\n timeoutMs: number\n ): Promise<HumanGateResult> {\n const options = (gate.payload?.options as Array<{\n id: string;\n label: string;\n description?: string;\n }>) || [];\n\n const selected = await this.hitlManager.select(sessionId, options, {\n multiple: (gate.payload?.multiple as boolean) || false,\n timeoutMs,\n });\n\n return {\n gateId: gate.id,\n approved: true,\n response: { selected },\n respondedAt: Date.now(),\n autoApproved: false,\n };\n }\n\n /**\n * Execute custom gate\n */\n private async executeCustomGate(\n sessionId: string,\n gate: HumanGate,\n timeoutMs: number\n ): Promise<HumanGateResult> {\n // Create custom interrupt request\n const request: InterruptRequest = {\n interruptId: `custom_${gate.id}_${Date.now()}`,\n sessionId,\n type: 'text',\n title: gate.title,\n description: gate.description,\n context: {\n checkpointId: `gate_${gate.id}`,\n currentState: 'custom_gate',\n previousActions: [],\n },\n payload: gate.payload || {},\n timeoutMs,\n createdAt: new Date(),\n };\n\n // Wait for response (simplified - in real impl would use HITLv2Manager)\n const response = await this.waitForResponse(request);\n\n return {\n gateId: gate.id,\n approved: true,\n response,\n respondedAt: Date.now(),\n autoApproved: false,\n };\n }\n\n /**\n * Execute branch steps\n */\n private async executeBranchSteps(\n steps: Array<{ tool: string; input: Record<string, unknown> }>,\n context: Record<string, unknown>\n ): Promise<Record<string, unknown>> {\n return this.executeInitialSteps(steps, context);\n }\n\n /**\n * Wait for interrupt response\n */\n private async waitForResponse(\n request: InterruptRequest\n ): Promise<unknown> {\n // Simplified - real implementation would use event-based waiting\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve({ timeout: true });\n }, request.timeoutMs || 300000);\n });\n }\n\n /**\n * Interpolate input with context\n */\n private interpolateInput(\n input: Record<string, unknown>,\n context: Record<string, unknown>\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(input)) {\n if (typeof value === 'string' && value.startsWith('{{') && value.endsWith('}}')) {\n const path = value.slice(2, -2).trim();\n result[key] = this.getValueFromPath(context, path);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n }\n\n /**\n * Get value from path\n */\n private getValueFromPath(obj: unknown, path: string): unknown {\n const parts = path.split('.');\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current && typeof current === 'object') {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n\n return current;\n }\n\n /**\n * Get gate history for a session\n */\n getGateHistory(sessionId: string): HumanGateResult[] {\n return this.gateHistory.get(sessionId) || [];\n }\n\n /**\n * Clear gate history\n */\n clearGateHistory(sessionId?: string): void {\n if (sessionId) {\n this.gateHistory.delete(sessionId);\n } else {\n this.gateHistory.clear();\n }\n }\n}\n\n// ============================================================================\n// Pre-built HITL Workflows\n// ============================================================================\n\n/**\n * Schema generation with human review\n */\nexport function createSchemaGenerationHITLWorkflow(\n complexity: 'simple' | 'medium' | 'complex'\n): HITLWorkflowDefinition {\n const needsReview = complexity === 'complex';\n\n return {\n name: 'schema-generation-with-review',\n initialSteps: [\n { tool: 'analyzeRequirements', input: { text: '{{requirements}}' } },\n { tool: 'extractEntities', input: { from: '{{analyzeRequirements}}' } },\n ],\n gates: [\n {\n id: 'complexity-check',\n type: 'approval',\n title: 'Complex Schema Detected',\n description: `This appears to be a ${complexity} schema. Review before proceeding?`,\n condition: () => needsReview,\n autoApprove: {\n condition: () => !needsReview,\n reason: 'Simple schema, auto-approved',\n },\n },\n ],\n branches: [\n {\n id: 'generate-full',\n condition: () => true,\n steps: [\n { tool: 'generateOrbital', input: { entities: '{{extractEntities}}' } },\n { tool: 'validateSchema', input: { schema: '{{generateOrbital}}' } },\n ],\n gate: needsReview ? {\n id: 'schema-review',\n type: 'edit',\n title: 'Review Generated Schema',\n description: 'Please review and edit the generated schema if needed.',\n payload: { format: 'json' },\n } : undefined,\n },\n ],\n };\n}\n\n/**\n * Multi-stage approval workflow\n */\nexport function createMultiStageApprovalWorkflow(\n stages: Array<{ name: string; approver: string }>\n): HITLWorkflowDefinition {\n return {\n name: 'multi-stage-approval',\n initialSteps: [],\n gates: stages.map((stage, index) => ({\n id: `approval-${index}`,\n type: 'approval',\n title: `${stage.name} Approval Required`,\n description: `Waiting for approval from ${stage.approver}`,\n })),\n branches: [\n {\n id: 'approved',\n condition: () => true,\n steps: [{ tool: 'finalize', input: {} }],\n },\n ],\n };\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\nexport function createHITLWorkflowEngine(\n options: HITLWorkflowOptions\n): HITLWorkflowEngine {\n return new HITLWorkflowEngine(options);\n}\n"]}