@wrongstack/core 0.5.7 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{agent-bridge-BKNiE1VH.d.ts → agent-bridge-DaCvA_uK.d.ts} +1 -1
- package/dist/coordination/index.d.ts +5 -5
- package/dist/coordination/index.js +218 -78
- package/dist/coordination/index.js.map +1 -1
- package/dist/defaults/index.d.ts +10 -9
- package/dist/defaults/index.js +1127 -180
- package/dist/defaults/index.js.map +1 -1
- package/dist/{events-DPQKFX7W.d.ts → events-CzkeaVVl.d.ts} +8 -2
- package/dist/execution/index.d.ts +281 -5
- package/dist/execution/index.js +785 -3
- package/dist/execution/index.js.map +1 -1
- package/dist/extension/index.d.ts +2 -2
- package/dist/extension/index.js +2 -1
- package/dist/extension/index.js.map +1 -1
- package/dist/goal-store-DVCfj7Ff.d.ts +95 -0
- package/dist/{index-j2WyAyML.d.ts → index-BkKLQjea.d.ts} +34 -2
- package/dist/{index-Bf9Bpkdc.d.ts → index-i9rPR53g.d.ts} +11 -4
- package/dist/index.d.ts +51 -16
- package/dist/index.js +1506 -247
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/index.d.ts +2 -2
- package/dist/kernel/index.d.ts +2 -2
- package/dist/kernel/index.js.map +1 -1
- package/dist/models/index.js +2 -3
- package/dist/models/index.js.map +1 -1
- package/dist/{multi-agent-Cpp7FXUl.d.ts → multi-agent-MfI6dmv-.d.ts} +30 -5
- package/dist/observability/index.d.ts +1 -1
- package/dist/{path-resolver--g_hKJ7V.d.ts → path-resolver-CWINz5XR.d.ts} +1 -1
- package/dist/{plan-templates-Bveo2W8n.d.ts → plan-templates-Bne1pB4d.d.ts} +6 -5
- package/dist/{provider-runner-hl4Il3xS.d.ts → provider-runner-CZYIzeBp.d.ts} +1 -1
- package/dist/sdd/index.d.ts +5 -3
- package/dist/sdd/index.js +102 -68
- package/dist/sdd/index.js.map +1 -1
- package/dist/security/index.js +82 -82
- package/dist/security/index.js.map +1 -1
- package/dist/skills/index.js +102 -38
- package/dist/skills/index.js.map +1 -1
- package/dist/storage/index.d.ts +3 -2
- package/dist/storage/index.js +134 -22
- package/dist/storage/index.js.map +1 -1
- package/dist/{tool-executor-DbAFkHdP.d.ts → tool-executor-40Q6shR-.d.ts} +1 -1
- package/dist/types/index.d.ts +7 -7
- package/dist/types/index.js +116 -103
- package/dist/types/index.js.map +1 -1
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.js.map +1 -1
- package/package.json +5 -1
package/dist/sdd/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/sdd/spec-parser.ts","../../src/sdd/task-generator.ts","../../src/types/task-graph.ts","../../src/sdd/task-tracker.ts","../../src/sdd/task-flow.ts","../../src/utils/atomic-write.ts","../../src/sdd/spec-store.ts","../../src/sdd/task-graph-store.ts","../../src/sdd/spec-builder.ts","../../src/sdd/spec-templates.ts","../../src/sdd/task-visualizer.ts","../../src/sdd/critical-path.ts","../../src/sdd/spec-versioning.ts","../../src/sdd/auto-executor.ts"],"names":["stat","path2","fsp","path3","fsp2","path"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n SpecAnalysis,\n SpecRequirement,\n SpecSection,\n SpecValidationResult,\n Specification,\n} from '../types/spec.js';\n\nexport class SpecParser {\n parse(content: string): Specification {\n const lines = content.split('\\n');\n const sections = this.extractSections(lines);\n const requirements = this.extractRequirements(lines);\n const now = Date.now();\n\n return {\n id: crypto.randomUUID(),\n title: this.extractTitle(lines),\n version: this.extractVersion(lines),\n status: 'draft',\n overview: this.extractOverview(lines),\n sections,\n requirements,\n createdAt: now,\n updatedAt: now,\n };\n }\n\n private extractTitle(lines: string[]): string {\n for (const line of lines) {\n const m = /^#\\s+(.+)/.exec(line.trim());\n if (m?.[1]) return m[1];\n }\n return 'Untitled Specification';\n }\n\n private extractVersion(lines: string[]): string {\n for (const line of lines) {\n const m = /version[:\\s]+(\\d+\\.\\d+\\.\\d+)/i.exec(line.trim());\n if (m?.[1]) return m[1];\n }\n return '0.0.1';\n }\n\n private extractOverview(lines: string[]): string {\n const overviewLines: string[] = [];\n let inOverview = false;\n let foundHeading = false;\n\n for (const line of lines) {\n if (/^##\\s+Overview/i.test(line.trim())) {\n inOverview = true;\n foundHeading = true;\n continue;\n }\n if (foundHeading && /^##\\s+/.test(line.trim())) break;\n if (inOverview) overviewLines.push(line);\n }\n\n return overviewLines.join('\\n').trim() || 'No overview provided';\n }\n\n private extractSections(lines: string[]): SpecSection[] {\n const sections: SpecSection[] = [];\n let currentSection: Partial<SpecSection> | null = null;\n let currentLines: string[] = [];\n let depth = 1;\n\n for (const line of lines) {\n const h2 = /^##\\s+(.+)/.exec(line.trim());\n const h3 = /^###\\s+(.+)/.exec(line.trim());\n\n if (h2) {\n if (currentSection && currentLines.length > 0) {\n sections.push({\n type: this.mapSectionType(currentSection.title ?? 'unknown'),\n title: currentSection.title ?? 'Unknown',\n level: depth,\n content: currentLines.join('\\n').trim(),\n });\n }\n currentSection = { title: h2[1] ?? 'Unknown' };\n currentLines = [];\n depth = 2;\n continue;\n }\n\n if (h3) {\n currentLines.push(line);\n continue;\n }\n\n if (currentSection) {\n currentLines.push(line);\n }\n }\n\n if (currentSection && currentLines.length > 0) {\n sections.push({\n type: this.mapSectionType(currentSection.title ?? 'unknown'),\n title: currentSection.title ?? 'Unknown',\n level: depth,\n content: currentLines.join('\\n').trim(),\n });\n }\n\n return sections;\n }\n\n private extractRequirements(lines: string[]): SpecRequirement[] {\n const requirements: SpecRequirement[] = [];\n let inRequirements = false;\n let idCounter = 0;\n\n for (const line of lines) {\n if (/^##\\s+Requirements/i.test(line.trim())) {\n inRequirements = true;\n continue;\n }\n if (inRequirements && /^##\\s+/.test(line.trim())) break;\n\n if (inRequirements) {\n const req = this.parseRequirementLine(line, `REQ-${++idCounter}`);\n if (req) requirements.push(req);\n }\n }\n\n return requirements;\n }\n\n private parseRequirementLine(line: string, id: string): SpecRequirement | null {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) return null;\n\n const lower = trimmed.toLowerCase();\n const types: SpecRequirement['type'][] = [\n 'functional',\n 'non-functional',\n 'security',\n 'performance',\n 'ux',\n ];\n let type: SpecRequirement['type'] = 'functional';\n for (const t of types) {\n if (lower.includes(`[${t}]`)) type = t;\n }\n\n let priority: SpecRequirement['priority'] = 'medium';\n if (trimmed.includes('[critical]') || trimmed.includes('[prio:high]')) {\n priority = 'critical';\n } else if (trimmed.includes('[high]')) {\n priority = 'high';\n } else if (trimmed.includes('[low]')) {\n priority = 'low';\n }\n\n return {\n id,\n type,\n priority,\n description: trimmed.replace(/\\[[^\\]]+\\]/g, '').trim(),\n acceptanceCriteria: [],\n };\n }\n\n private mapSectionType(title: string): SpecSection['type'] {\n const t = title.toLowerCase();\n if (t.includes('overview')) return 'overview';\n if (t.includes('requirement')) return 'requirements';\n if (t.includes('architect')) return 'architecture';\n if (t.includes('api')) return 'api';\n if (t.includes('data')) return 'data';\n if (t.includes('security')) return 'security';\n if (t.includes('acceptance')) return 'acceptance';\n return 'overview';\n }\n\n analyze(spec: Specification): SpecAnalysis {\n const gaps: string[] = [];\n const suggestions: string[] = [];\n const risks: SpecAnalysis['risks'] = [];\n\n // Check completeness\n const hasOverview = spec.sections.some((s) => s.type === 'overview');\n const hasRequirements = spec.sections.some((s) => s.type === 'requirements');\n const hasAcceptance = spec.sections.some((s) => s.type === 'acceptance');\n\n if (!hasOverview) gaps.push('Missing Overview section');\n if (!hasRequirements) gaps.push('Missing Requirements section');\n if (!hasAcceptance) gaps.push('Missing Acceptance Criteria section');\n\n if (spec.requirements.length === 0) {\n gaps.push('No requirements defined');\n suggestions.push('Add specific functional and non-functional requirements');\n }\n\n const unverifiedReqs = spec.requirements.filter((r) => r.acceptanceCriteria.length === 0);\n if (unverifiedReqs.length > 0) {\n gaps.push(`${unverifiedReqs.length} requirements without acceptance criteria`);\n suggestions.push('Define clear acceptance criteria for each requirement');\n }\n\n const criticalUnresolved = spec.requirements.filter(\n (r) => r.priority === 'critical' && r.blockedBy && r.blockedBy.length > 0,\n );\n for (const req of criticalUnresolved) {\n risks.push({\n requirement: req.id,\n risk: `Critical requirement blocked by ${req.blockedBy?.length} other requirements`,\n severity: 'high',\n });\n }\n\n const completeness = Math.round(\n (((hasOverview ? 1 : 0) +\n (hasRequirements ? 1 : 0) +\n (hasAcceptance ? 1 : 0) +\n (spec.requirements.length > 0 ? 1 : 0) +\n (spec.sections.length > 3 ? 1 : 0)) /\n 5) *\n 100,\n );\n\n return {\n specId: spec.id,\n completeness,\n coverage: {\n requirements: spec.requirements.length,\n apiEndpoints: spec.apiEndpoints?.length ?? 0,\n edgeCases: 0,\n errorHandling: 0,\n },\n gaps,\n risks,\n suggestions,\n };\n }\n\n validate(spec: Specification): SpecValidationResult {\n const errors: SpecValidationResult['errors'] = [];\n const warnings: SpecValidationResult['warnings'] = [];\n\n if (!spec.title.trim()) {\n errors.push({ path: 'title', message: 'Title is required' });\n }\n\n if (!spec.version.trim()) {\n errors.push({ path: 'version', message: 'Version is required' });\n }\n\n for (const req of spec.requirements) {\n if (!req.description.trim()) {\n errors.push({ path: `requirement.${req.id}`, message: 'Requirement description is empty' });\n }\n if (req.acceptanceCriteria.length === 0) {\n warnings.push({ path: `requirement.${req.id}`, message: 'No acceptance criteria defined' });\n }\n }\n\n const reqIds = new Set(spec.requirements.map((r) => r.id));\n const blockedByIds = new Set(spec.requirements.flatMap((r) => r.blockedBy ?? []));\n for (const id of blockedByIds) {\n if (!reqIds.has(id)) {\n errors.push({\n path: 'requirements',\n message: `BlockedBy references non-existent requirement: ${id}`,\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n }\n}\n","import type { SpecRequirement, Specification } from '../types/spec.js';\nimport type { TaskGraph, TaskNode, TaskPriority, TaskType } from '../types/task-graph.js';\nimport type { TaskStore, TaskTracker } from './task-tracker.js';\n\nexport interface TaskGeneratorOptions {\n taskTracker: TaskTracker;\n}\n\nexport interface GeneratedTask {\n specRequirementId?: string;\n title: string;\n description: string;\n type: TaskType;\n priority: TaskPriority;\n estimateHours?: number;\n tags?: string[];\n}\n\nexport class TaskGenerator {\n constructor(private readonly opts: TaskGeneratorOptions) {}\n\n async generateFromSpec(spec: Specification): Promise<TaskGraph> {\n const graph = await this.opts.taskTracker.createGraph(spec.id, spec.title);\n\n const overview = spec.sections.find((s) => s.type === 'overview');\n if (overview) {\n this.opts.taskTracker.addNode({\n title: `Implement ${spec.title}`,\n description: overview.content,\n type: 'feature',\n priority: 'high',\n status: 'pending',\n });\n }\n\n // Group requirements by priority in a single pass, then emit in priority order.\n const byPriority: Record<TaskPriority, SpecRequirement[]> = {\n critical: [],\n high: [],\n medium: [],\n low: [],\n };\n for (const req of spec.requirements) {\n const bucket = byPriority[req.priority] ?? byPriority.medium;\n bucket.push(req);\n }\n\n const order: TaskPriority[] = ['critical', 'high', 'medium', 'low'];\n for (const p of order) {\n for (const req of byPriority[p]) {\n this.opts.taskTracker.addNode(this.createTaskFromRequirement(req));\n }\n }\n\n // API tasks\n if (spec.apiEndpoints && spec.apiEndpoints.length > 0) {\n const apiParent = this.opts.taskTracker.addNode({\n title: 'API Implementation',\n description: `Implement ${spec.apiEndpoints.length} API endpoints`,\n type: 'feature',\n priority: 'high',\n status: 'pending',\n });\n\n for (const endpoint of spec.apiEndpoints) {\n const task = this.createTaskFromEndpoint(endpoint);\n this.opts.taskTracker.addNode({\n ...task,\n parentId: apiParent.id,\n });\n }\n }\n\n // Test tasks\n this.opts.taskTracker.addNode({\n title: 'Write Tests',\n description: 'Comprehensive test coverage for all features',\n type: 'test',\n priority: 'high',\n status: 'pending',\n });\n\n // Documentation tasks\n this.opts.taskTracker.addNode({\n title: 'Update Documentation',\n description: 'Update docs for new features',\n type: 'docs',\n priority: 'medium',\n status: 'pending',\n });\n\n return graph;\n }\n\n private createTaskFromRequirement(\n req: SpecRequirement,\n ): Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'> {\n return {\n title: req.description,\n description: this.buildDescription(req),\n type: this.mapRequirementType(req.type),\n priority: req.priority,\n status: 'pending',\n specRequirementId: req.id,\n tags: [req.type, req.priority],\n estimateHours: this.estimateHours(req),\n };\n }\n\n private createTaskFromEndpoint(\n endpoint: NonNullable<Specification['apiEndpoints']>[number],\n ): Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'> {\n return {\n title: `${endpoint.method} ${endpoint.path}`,\n description: endpoint.description,\n type: 'feature',\n priority: 'high',\n status: 'pending',\n tags: [endpoint.method],\n estimateHours: this.estimateForEndpoint(endpoint),\n };\n }\n\n private buildDescription(req: SpecRequirement): string {\n const lines = [req.description, '', '**Type:** ' + req.type, '**Priority:** ' + req.priority];\n\n if (req.acceptanceCriteria.length > 0) {\n lines.push('', '**Acceptance Criteria:**');\n for (const criterion of req.acceptanceCriteria) {\n lines.push(`- ${criterion}`);\n }\n }\n\n if (req.blockedBy && req.blockedBy.length > 0) {\n lines.push('', `**Blocked by:** ${req.blockedBy.join(', ')}`);\n }\n\n return lines.join('\\n');\n }\n\n private mapRequirementType(type: SpecRequirement['type']): TaskType {\n switch (type) {\n case 'functional':\n return 'feature';\n case 'non-functional':\n return 'feature';\n case 'security':\n return 'feature';\n case 'performance':\n return 'feature';\n case 'ux':\n return 'feature';\n default:\n return 'feature';\n }\n }\n\n private estimateHours(req: SpecRequirement): number {\n switch (req.priority) {\n case 'critical':\n return 8;\n case 'high':\n return 4;\n case 'medium':\n return 2;\n case 'low':\n return 1;\n default:\n return 2;\n }\n }\n\n private estimateForEndpoint(\n endpoint: NonNullable<Specification['apiEndpoints']>[number],\n ): number {\n let hours = 2;\n if (endpoint.auth) hours += 1;\n if (endpoint.request) hours += 1;\n return hours;\n }\n\n async generateSubtasks(parentTaskId: string, spec: Specification): Promise<void> {\n const reqId = this.opts.taskTracker.getNode(parentTaskId)?.specRequirementId;\n if (!reqId) return;\n\n const req = spec.requirements.find((r) => r.id === reqId);\n if (!req) return;\n\n if (req.acceptanceCriteria.length > 0) {\n for (const criterion of req.acceptanceCriteria) {\n this.opts.taskTracker.addNode({\n title: criterion,\n description: `Verify: ${criterion}`,\n type: 'test',\n priority: 'medium',\n status: 'pending',\n parentId: parentTaskId,\n });\n }\n }\n }\n}\n\nexport class DefaultTaskStore implements TaskStore {\n private graphs = new Map<string, TaskGraph>();\n\n async saveGraph(graph: TaskGraph): Promise<void> {\n this.graphs.set(graph.id, this.cloneGraph(graph));\n }\n\n async loadGraph(id: string): Promise<TaskGraph | null> {\n const g = this.graphs.get(id);\n return g ? this.cloneGraph(g) : null;\n }\n\n async listGraphs(): Promise<{ id: string; title: string; updatedAt: number }[]> {\n return Array.from(this.graphs.values()).map((g) => ({\n id: g.id,\n title: g.title,\n updatedAt: g.updatedAt,\n }));\n }\n\n async deleteGraph(id: string): Promise<void> {\n this.graphs.delete(id);\n }\n\n private cloneGraph(g: TaskGraph): TaskGraph {\n return {\n ...g,\n nodes: new Map(g.nodes),\n edges: [...g.edges],\n rootNodes: [...g.rootNodes],\n };\n }\n}\n","export type TaskStatus = 'pending' | 'in_progress' | 'blocked' | 'failed' | 'review' | 'completed';\nexport type TaskPriority = 'critical' | 'high' | 'medium' | 'low';\nexport type TaskType = 'feature' | 'bugfix' | 'refactor' | 'docs' | 'test' | 'chore';\n\nexport interface TaskNode {\n id: string;\n title: string;\n description: string;\n type: TaskType;\n priority: TaskPriority;\n status: TaskStatus;\n assignee?: string;\n estimateHours?: number;\n actualHours?: number;\n tags?: string[];\n specRequirementId?: string;\n parentId?: string;\n children?: string[];\n createdAt: number;\n updatedAt: number;\n completedAt?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface TaskEdge {\n id: string;\n from: string;\n to: string;\n type: 'blocks' | 'depends_on' | 'relates_to' | 'implements';\n weight?: number;\n}\n\nexport interface TaskGraph {\n id: string;\n specId: string;\n title: string;\n nodes: Map<string, TaskNode>;\n edges: TaskEdge[];\n rootNodes: string[];\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface TaskDependency {\n taskId: string;\n blockedBy: string[];\n blocking: string[];\n}\n\nexport interface TaskAssignment {\n taskId: string;\n assignee: string;\n assignedAt: number;\n}\n\nexport interface TaskProgress {\n total: number;\n pending: number;\n inProgress: number;\n blocked: number;\n failed: number;\n review: number;\n completed: number;\n percentComplete: number;\n estimatedHours: number;\n actualHours: number;\n}\n\nexport interface TaskFilter {\n status?: TaskStatus[];\n priority?: TaskPriority[];\n type?: TaskType[];\n assignee?: string[];\n tags?: string[];\n specRequirementId?: string;\n}\n\nexport interface TaskSort {\n field: 'priority' | 'createdAt' | 'updatedAt' | 'status';\n direction: 'asc' | 'desc';\n}\n\nexport interface CriticalPathResult {\n taskIds: string[];\n totalEstimateHours: number;\n bottleneckTasks: string[];\n}\n\nexport function computeTaskProgress(graph: TaskGraph): TaskProgress {\n let completed = 0;\n let pending = 0;\n let inProgress = 0;\n let blocked = 0;\n let failed = 0;\n let review = 0;\n let estimatedHours = 0;\n let actualHours = 0;\n for (const n of graph.nodes.values()) {\n switch (n.status) {\n case 'completed':\n completed++;\n break;\n case 'pending':\n pending++;\n break;\n case 'in_progress':\n inProgress++;\n break;\n case 'blocked':\n blocked++;\n break;\n case 'failed':\n failed++;\n break;\n case 'review':\n review++;\n break;\n }\n estimatedHours += n.estimateHours ?? 0;\n actualHours += n.actualHours ?? 0;\n }\n const total = graph.nodes.size;\n\n return {\n total,\n pending,\n inProgress,\n blocked,\n failed,\n review,\n completed,\n percentComplete: total > 0 ? Math.round((completed / total) * 100) : 0,\n estimatedHours,\n actualHours,\n };\n}\n\nexport function findCriticalPath(graph: TaskGraph): CriticalPathResult {\n const nodes = Array.from(graph.nodes.values());\n const criticalNodes = nodes.filter((n) => n.priority === 'critical');\n const bottleneckTasks = criticalNodes\n .filter((n) => graph.edges.some((e) => e.to === n.id && e.type === 'depends_on'))\n .map((n) => n.id);\n\n const totalEstimateHours = criticalNodes.reduce((sum, n) => sum + (n.estimateHours ?? 0), 0);\n\n return {\n taskIds: criticalNodes.map((n) => n.id),\n totalEstimateHours,\n bottleneckTasks,\n };\n}\n\nexport function topologicalSort(graph: TaskGraph): string[] {\n const visited = new Set<string>();\n const inStack = new Set<string>();\n const result: string[] = [];\n\n function visit(id: string): void {\n // Cycle: callers must detect cycles up-front if they care; we just stop recursing.\n if (inStack.has(id)) return;\n if (visited.has(id)) return;\n if (!graph.nodes.has(id)) return;\n\n visited.add(id);\n inStack.add(id);\n\n for (const edge of graph.edges) {\n if (edge.from === id) visit(edge.to);\n }\n\n inStack.delete(id);\n result.push(id);\n }\n\n for (const rootId of graph.rootNodes) {\n visit(rootId);\n }\n\n return result;\n}\n","import type {\n TaskFilter,\n TaskGraph,\n TaskNode,\n TaskProgress,\n TaskSort,\n} from '../types/task-graph.js';\nimport { computeTaskProgress } from '../types/task-graph.js';\n\nexport interface TaskStore {\n saveGraph(graph: TaskGraph): Promise<void>;\n loadGraph(id: string): Promise<TaskGraph | null>;\n listGraphs(): Promise<{ id: string; title: string; updatedAt: number }[]>;\n deleteGraph(id: string): Promise<void>;\n}\n\nexport interface TaskTrackerOptions {\n store: TaskStore;\n /**\n * Called when an in-the-background persistence (`saveGraph`) rejects.\n * The synchronous TaskTracker methods (addNode/addEdge/updateNodeStatus)\n * fire-and-forget their writes; without this, a failing store silently\n * loses graph mutations. Defaults to a console.warn.\n */\n onPersistError?: (err: unknown) => void;\n}\n\nexport interface TaskTransition {\n from: TaskNode['status'];\n to: TaskNode['status'];\n timestamp: number;\n reason?: string;\n}\n\nexport class TaskTracker {\n private graph: TaskGraph | null = null;\n private transitions: TaskTransition[] = [];\n\n constructor(private readonly opts: TaskTrackerOptions) {}\n\n async createGraph(specId: string, title: string): Promise<TaskGraph> {\n this.graph = {\n id: crypto.randomUUID(),\n specId,\n title,\n nodes: new Map(),\n edges: [],\n rootNodes: [],\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n await this.opts.store.saveGraph(this.graph);\n return this.graph;\n }\n\n async loadGraph(id: string): Promise<TaskGraph | null> {\n this.graph = await this.opts.store.loadGraph(id);\n return this.graph;\n }\n\n addNode(node: Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'>): TaskNode {\n if (!this.graph) throw new Error('No graph loaded');\n\n const now = Date.now();\n const newNode: TaskNode = {\n ...node,\n id: crypto.randomUUID(),\n status: node.status ?? 'pending',\n createdAt: now,\n updatedAt: now,\n };\n\n this.graph.nodes.set(newNode.id, newNode);\n\n if (!node.parentId) {\n this.graph.rootNodes.push(newNode.id);\n }\n\n this.graph.updatedAt = now;\n this.persist();\n\n return newNode;\n }\n\n addEdge(from: string, to: string, type: TaskGraph['edges'][0]['type'] = 'depends_on'): void {\n if (!this.graph) throw new Error('No graph loaded');\n\n this.graph.edges.push({\n id: crypto.randomUUID(),\n from,\n to,\n type,\n });\n this.graph.updatedAt = Date.now();\n this.persist();\n }\n\n updateNodeStatus(id: string, status: TaskNode['status'], reason?: string): void {\n if (!this.graph) throw new Error('No graph loaded');\n\n const node = this.graph.nodes.get(id);\n if (!node) throw new Error(`Node ${id} not found`);\n\n const from = node.status;\n const now = Date.now();\n node.status = status;\n node.updatedAt = now;\n\n if (status === 'completed') {\n node.completedAt = now;\n }\n\n this.transitions.push({ from, to: status, timestamp: now, reason });\n\n // Auto-unblock dependents\n if (status === 'completed') {\n this.unblockDependents(id);\n }\n\n // Auto-block blockers\n if (status === 'in_progress') {\n this.checkAndBlockIfNeeded(id);\n }\n\n this.graph.updatedAt = now;\n this.persist();\n }\n\n getNode(id: string): TaskNode | undefined {\n return this.graph?.nodes.get(id);\n }\n\n getAllNodes(filter?: TaskFilter, sort?: TaskSort): TaskNode[] {\n if (!this.graph) return [];\n\n let nodes = Array.from(this.graph.nodes.values());\n\n if (filter) {\n nodes = nodes.filter((n) => {\n if (filter.status?.length && !filter.status.includes(n.status)) return false;\n if (filter.priority?.length && !filter.priority.includes(n.priority)) return false;\n if (filter.type?.length && !filter.type.includes(n.type)) return false;\n if (filter.assignee?.length && n.assignee && !filter.assignee.includes(n.assignee))\n return false;\n if (filter.tags?.length && n.tags && !n.tags.some((t) => filter.tags!.includes(t)))\n return false;\n if (filter.specRequirementId && n.specRequirementId !== filter.specRequirementId)\n return false;\n return true;\n });\n }\n\n if (sort) {\n nodes.sort((a, b) => {\n const cmp = compareByField(a, b, sort.field);\n return sort.direction === 'asc' ? cmp : -cmp;\n });\n }\n\n return nodes;\n }\n\n getChildren(parentId: string): TaskNode[] {\n if (!this.graph) return [];\n return Array.from(this.graph.nodes.values()).filter((n) => n.parentId === parentId);\n }\n\n getDependents(taskId: string): string[] {\n if (!this.graph) return [];\n return this.graph.edges\n .filter((e) => e.from === taskId && e.type === 'depends_on')\n .map((e) => e.to);\n }\n\n getBlockers(taskId: string): string[] {\n if (!this.graph) return [];\n return this.graph.edges\n .filter((e) => e.to === taskId && e.type === 'depends_on')\n .map((e) => e.from);\n }\n\n canStart(taskId: string): boolean {\n const blockers = this.getBlockers(taskId);\n return blockers.every((id) => {\n const node = this.graph?.nodes.get(id);\n return node?.status === 'completed';\n });\n }\n\n getProgress(): TaskProgress {\n if (!this.graph) {\n return {\n total: 0,\n pending: 0,\n inProgress: 0,\n blocked: 0,\n failed: 0,\n review: 0,\n completed: 0,\n percentComplete: 0,\n estimatedHours: 0,\n actualHours: 0,\n };\n }\n return computeTaskProgress(this.graph);\n }\n\n getTransitions(taskId?: string): TaskTransition[] {\n if (!taskId) return [...this.transitions];\n // Would need taskId tracking per transition\n return [...this.transitions];\n }\n\n private unblockDependents(completedId: string): void {\n if (!this.graph) return;\n const dependents = this.getDependents(completedId);\n for (const depId of dependents) {\n const dep = this.graph.nodes.get(depId);\n if (dep?.status === 'blocked') {\n const remainingBlockers = this.getBlockers(depId);\n const allUnblocked = remainingBlockers.every((id) => {\n const blocker = this.graph?.nodes.get(id);\n return blocker?.status === 'completed';\n });\n if (allUnblocked) {\n dep.status = 'pending';\n dep.updatedAt = Date.now();\n }\n }\n }\n }\n\n private checkAndBlockIfNeeded(taskId: string): void {\n if (!this.graph) return;\n const blockers = this.getBlockers(taskId);\n const someBlocked = blockers.some((id) => {\n const blocker = this.graph?.nodes.get(id);\n return blocker?.status !== 'completed';\n });\n if (someBlocked) {\n const node = this.graph.nodes.get(taskId);\n if (node) {\n node.status = 'blocked';\n node.updatedAt = Date.now();\n }\n }\n }\n\n /**\n * Fire-and-forget persistence with attached error handler.\n * Synchronous mutators (addNode/addEdge/updateNodeStatus) use this to\n * avoid forcing an async cascade through every caller; if the store\n * rejects, the configured `onPersistError` is invoked so failures are\n * surfaced instead of swallowed by an unhandled promise rejection.\n */\n private persist(): void {\n if (!this.graph) return;\n this.opts.store.saveGraph(this.graph).catch((err) => {\n if (this.opts.onPersistError) this.opts.onPersistError(err);\n else\n console.warn(\n '[task-tracker] saveGraph failed:',\n err instanceof Error ? err.message : String(err),\n );\n });\n }\n}\n\nconst PRIORITY_RANK: Record<TaskNode['priority'], number> = {\n critical: 0,\n high: 1,\n medium: 2,\n low: 3,\n};\nconst STATUS_RANK: Record<TaskNode['status'], number> = {\n in_progress: 0,\n pending: 1,\n review: 2,\n blocked: 3,\n failed: 4,\n completed: 5,\n};\n\nfunction compareByField(a: TaskNode, b: TaskNode, field: TaskSort['field']): number {\n switch (field) {\n case 'priority':\n return PRIORITY_RANK[a.priority] - PRIORITY_RANK[b.priority];\n case 'status':\n return STATUS_RANK[a.status] - STATUS_RANK[b.status];\n case 'createdAt':\n return a.createdAt - b.createdAt;\n case 'updatedAt':\n return a.updatedAt - b.updatedAt;\n }\n}\n","import type { EventBus } from '../kernel/events.js';\nimport type { DoneCondition } from '../types/multi-agent.js';\nimport type { SpecAnalysis, Specification } from '../types/spec.js';\nimport type { TaskGraph, TaskNode } from '../types/task-graph.js';\nimport { SpecParser } from './spec-parser.js';\nimport { DefaultTaskStore, TaskGenerator } from './task-generator.js';\nimport { TaskTracker } from './task-tracker.js';\n\n/**\n * Extended event map used internally by TaskFlow and multi-agent components.\n * These events are emitted on the injected EventBus and are a subset of\n * the full EventMap — they do not require a separate registration.\n */\nexport interface TaskFlowEventMap {\n 'phase.change': { from: TaskFlowPhase; to: TaskFlowPhase };\n 'task.started': { taskId: string };\n 'task.completed': { taskId: string; result?: unknown };\n 'task.failed': { taskId: string; error: string };\n 'task.review': { taskId: string };\n 'spec.analyzed': { analysis: SpecAnalysis };\n progress: { percent: number; message: string };\n done: { graph: TaskGraph };\n error: { phase: TaskFlowPhase; error: Error };\n}\n\nexport type TaskFlowPhase =\n | 'idle'\n | 'parsing'\n | 'analyzing'\n | 'generating'\n | 'executing'\n | 'reviewing'\n | 'completing'\n | 'done'\n | 'failed';\n\nexport type TaskFlowEventName = keyof TaskFlowEventMap;\n\nexport interface TaskFlowOptions {\n tracker: TaskTracker;\n events: EventBus;\n doneCondition?: DoneCondition;\n maxConcurrent?: number;\n}\n\nexport interface TaskFlowExecutionContext {\n executeTask: (task: TaskNode) => Promise<unknown>;\n onTaskComplete?: (task: TaskNode, result: unknown) => void;\n onTaskFail?: (task: TaskNode, error: Error) => void;\n}\n\nexport class TaskFlow {\n private phase: TaskFlowPhase = 'idle';\n private spec: Specification | null = null;\n private graph: TaskGraph | null = null;\n private stopped = false;\n\n constructor(private readonly opts: TaskFlowOptions) {\n this.setPhase('idle');\n }\n\n private emit<K extends TaskFlowEventName>(event: K, payload: TaskFlowEventMap[K]): void {\n (this.opts.events.emit as (event: string, payload: unknown) => void)(event, payload);\n }\n\n async fromSpec(specContent: string): Promise<TaskGraph> {\n this.setPhase('parsing');\n\n const parser = new SpecParser();\n this.spec = parser.parse(specContent);\n\n this.setPhase('analyzing');\n const analysis = parser.analyze(this.spec);\n this.emit('spec.analyzed', { analysis });\n\n if (analysis.completeness < 50) {\n this.emit('error', {\n phase: 'analyzing',\n error: new Error(`Spec completeness too low: ${analysis.completeness}%`),\n });\n this.setPhase('failed');\n throw new Error('Spec too incomplete');\n }\n\n this.setPhase('generating');\n const generator = new TaskGenerator({ taskTracker: this.opts.tracker });\n this.graph = await generator.generateFromSpec(this.spec);\n\n return this.graph;\n }\n\n async execute(ctx: TaskFlowExecutionContext): Promise<TaskGraph> {\n if (!this.graph) throw new Error('No graph loaded. Call fromSpec first.');\n\n this.setPhase('executing');\n this.stopped = false;\n\n const pendingTasks = this.getExecutableTasks();\n const maxConcurrent = this.opts.maxConcurrent ?? 2;\n\n while (pendingTasks.length > 0 && !this.stopped) {\n const batch = pendingTasks.splice(0, maxConcurrent);\n const results = await Promise.allSettled(\n batch.map((task) => this.executeSingleTask(task, ctx)),\n );\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const task = batch[i];\n\n if (!result || !task) continue;\n\n if (result.status === 'rejected') {\n const reason = result.reason as Error | undefined;\n this.opts.tracker.updateNodeStatus(task.id, 'failed', reason?.message);\n this.emit('task.failed', { taskId: task.id, error: reason?.message ?? 'unknown' });\n ctx.onTaskFail?.(task, reason as Error);\n } else {\n this.opts.tracker.updateNodeStatus(task.id, 'completed');\n this.emit('task.completed', { taskId: task.id, result: result.value });\n ctx.onTaskComplete?.(task, result.value);\n }\n\n this.emitProgress();\n }\n\n // Re-evaluate pending tasks (some may have become unblocked)\n const stillPending = this.getExecutableTasks();\n pendingTasks.length = 0;\n pendingTasks.push(...stillPending);\n\n // Check done condition\n if (this.checkDoneCondition()) {\n break;\n }\n }\n\n this.setPhase('completing');\n this.emit('done', { graph: this.graph });\n this.setPhase('done');\n\n return this.graph;\n }\n\n async reviewTask(taskId: string, approved: boolean, comment?: string): Promise<void> {\n const task = this.opts.tracker.getNode(taskId);\n if (!task) throw new Error(`Task ${taskId} not found`);\n\n if (approved) {\n this.opts.tracker.updateNodeStatus(taskId, 'completed', comment);\n this.emit('task.completed', { taskId });\n } else {\n this.opts.tracker.updateNodeStatus(taskId, 'in_progress', comment ?? 'Needs revision');\n this.emit('task.review', { taskId });\n }\n }\n\n stop(): void {\n this.stopped = true;\n }\n\n getPhase(): TaskFlowPhase {\n return this.phase;\n }\n\n getGraph(): TaskGraph | null {\n return this.graph;\n }\n\n getSpec(): Specification | null {\n return this.spec;\n }\n\n private setPhase(phase: TaskFlowPhase): void {\n const from = this.phase;\n this.phase = phase;\n this.emit('phase.change', { from, to: phase });\n }\n\n private getExecutableTasks(): TaskNode[] {\n return this.opts.tracker\n .getAllNodes({ status: ['pending', 'blocked'] })\n .filter((n) => n.status === 'pending' && this.opts.tracker.canStart(n.id))\n .sort((a, b) => {\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n return (priorityOrder[a.priority] ?? 4) - (priorityOrder[b.priority] ?? 4);\n });\n }\n\n private async executeSingleTask(task: TaskNode, ctx: TaskFlowExecutionContext): Promise<unknown> {\n this.opts.tracker.updateNodeStatus(task.id, 'in_progress');\n this.emit('task.started', { taskId: task.id });\n return ctx.executeTask(task);\n }\n\n private checkDoneCondition(): boolean {\n const condition = this.opts.doneCondition;\n if (!condition) {\n const progress = this.opts.tracker.getProgress();\n return progress.percentComplete === 100;\n }\n\n switch (condition.type) {\n case 'all_tasks_done': {\n const progress = this.opts.tracker.getProgress();\n return progress.pending === 0 && progress.inProgress === 0;\n }\n case 'iterations':\n return false; // Not tracked here\n case 'tool_calls':\n return false;\n default:\n return false;\n }\n }\n\n private emitProgress(): void {\n const progress = this.opts.tracker.getProgress();\n this.emit('progress', {\n percent: progress.percentComplete,\n message: `${progress.completed}/${progress.total} tasks completed`,\n });\n }\n}\n\nexport interface SpecDrivenDevOptions {\n workingDirectory: string;\n events: EventBus;\n doneCondition?: DoneCondition;\n}\n\nexport class SpecDrivenDev {\n private store: DefaultTaskStore;\n private tracker: TaskTracker;\n private readonly events: EventBus;\n private flows = new Map<string, TaskFlow>();\n\n constructor(opts: SpecDrivenDevOptions) {\n this.store = new DefaultTaskStore();\n this.tracker = new TaskTracker({ store: this.store });\n this.events = opts.events;\n }\n\n async createFlow(specContent: string, options?: Partial<TaskFlowOptions>): Promise<TaskFlow> {\n const flow = new TaskFlow({\n tracker: this.tracker,\n events: this.events,\n ...options,\n });\n\n const graph = await flow.fromSpec(specContent);\n this.flows.set(graph.id, flow);\n\n return flow;\n }\n\n getTracker(): TaskTracker {\n return this.tracker;\n }\n\n getFlow(graphId: string): TaskFlow | undefined {\n return this.flows.get(graphId);\n }\n\n listFlows(): { id: string; title: string; phase: TaskFlowPhase }[] {\n return Array.from(this.flows.entries()).map(([id, flow]) => ({\n id,\n title: flow.getGraph()?.title ?? 'Untitled',\n phase: flow.getPhase(),\n }));\n }\n}\n","import { randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport interface AtomicWriteOptions {\n mode?: number;\n encoding?: BufferEncoding;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array,\n opts: AtomicWriteOptions = {},\n): Promise<void> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const tmp = path.join(dir, `.${path.basename(targetPath)}.${randomBytes(6).toString('hex')}.tmp`);\n\n // Write content to tmp first; 'wx' ensures exclusive creation (fails if\n // tmp already exists — extremely unlikely with 6-byte random suffix).\n try {\n if (typeof content === 'string') {\n await fs.writeFile(tmp, content, { flag: 'wx', encoding: opts.encoding ?? 'utf8' });\n } else {\n await fs.writeFile(tmp, content, { flag: 'wx' });\n }\n try {\n const fh = await fs.open(tmp, 'r+');\n try {\n await fh.sync();\n } finally {\n await fh.close();\n }\n } catch {\n // fsync best-effort\n }\n // Now safely read mode from target (if it exists) and apply to tmp before rename.\n // Prefer opts.mode for new files; for existing files preserve their mode.\n let mode: number | undefined;\n try {\n const stat = await fs.stat(targetPath);\n mode = stat.mode & 0o777;\n } catch {\n mode = opts.mode;\n }\n if (mode !== undefined) {\n await fs.chmod(tmp, mode);\n }\n await renameWithRetry(tmp, targetPath);\n } catch (err) {\n try {\n await fs.unlink(tmp);\n } catch {\n // ignore cleanup error\n }\n throw err;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\n// On Windows, fs.rename over an existing file can fail with EPERM/EBUSY/EACCES\n// when antivirus, file indexers, editor file watchers, or a concurrent writer\n// briefly hold a handle on the destination. These are transient — retry with a\n// short backoff before giving up. POSIX renames are atomic and won't hit this.\nconst TRANSIENT_RENAME_CODES = new Set(['EPERM', 'EBUSY', 'EACCES', 'ENOTEMPTY']);\n\nasync function renameWithRetry(from: string, to: string): Promise<void> {\n if (process.platform !== 'win32') {\n await fs.rename(from, to);\n return;\n }\n const delays = [10, 25, 60, 120, 250];\n let lastErr: unknown;\n for (let i = 0; i <= delays.length; i++) {\n try {\n await fs.rename(from, to);\n return;\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException)?.code;\n if (!code || !TRANSIENT_RENAME_CODES.has(code) || i === delays.length) {\n throw err;\n }\n await new Promise((resolve) => setTimeout(resolve, delays[i]));\n }\n }\n throw lastErr;\n}\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { atomicWrite, ensureDir } from '../utils/atomic-write.js';\nimport type { Specification, SpecStatus } from '../types/spec.js';\n\nexport interface SpecStoreOptions {\n /** Directory where spec files are stored. Defaults to `.wrongstack/specs`. */\n baseDir: string;\n}\n\nexport interface SpecIndexEntry {\n id: string;\n title: string;\n version: string;\n status: SpecStatus;\n updatedAt: number;\n filePath: string;\n}\n\ninterface SpecIndex {\n version: 1;\n entries: SpecIndexEntry[];\n}\n\n/**\n * File-backed spec storage. Each spec is a JSON file under `baseDir/`.\n * An index file (`_index.json`) tracks all specs for fast listing.\n */\nexport class SpecStore {\n private readonly baseDir: string;\n private readonly indexPath: string;\n\n constructor(opts: SpecStoreOptions) {\n this.baseDir = opts.baseDir;\n this.indexPath = path.join(this.baseDir, '_index.json');\n }\n\n async save(spec: Specification): Promise<void> {\n await ensureDir(this.baseDir);\n const filePath = this.filePath(spec.id);\n await atomicWrite(filePath, JSON.stringify(spec, null, 2), { mode: 0o600 });\n await this.updateIndex(spec);\n }\n\n async load(id: string): Promise<Specification | null> {\n try {\n const raw = await fsp.readFile(this.filePath(id), 'utf8');\n return JSON.parse(raw) as Specification;\n } catch {\n return null;\n }\n }\n\n async list(): Promise<SpecIndexEntry[]> {\n const index = await this.readIndex();\n return index.entries.sort((a, b) => b.updatedAt - a.updatedAt);\n }\n\n async delete(id: string): Promise<boolean> {\n try {\n await fsp.unlink(this.filePath(id));\n await this.removeFromIndex(id);\n return true;\n } catch {\n return false;\n }\n }\n\n async exists(id: string): Promise<boolean> {\n try {\n await fsp.access(this.filePath(id));\n return true;\n } catch {\n return false;\n }\n }\n\n /** Create a new spec with defaults, assign ID, and persist. */\n async createDraft(title: string, overview?: string): Promise<Specification> {\n const now = Date.now();\n const spec: Specification = {\n id: randomUUID(),\n title,\n version: '0.1.0',\n status: 'draft',\n overview: overview ?? '',\n sections: [],\n requirements: [],\n createdAt: now,\n updatedAt: now,\n };\n await this.save(spec);\n return spec;\n }\n\n /** Update spec fields and persist. */\n async update(id: string, patch: Partial<Omit<Specification, 'id' | 'createdAt'>>): Promise<Specification | null> {\n const spec = await this.load(id);\n if (!spec) return null;\n const updated: Specification = {\n ...spec,\n ...patch,\n id: spec.id,\n createdAt: spec.createdAt,\n updatedAt: Date.now(),\n };\n await this.save(updated);\n return updated;\n }\n\n private filePath(id: string): string {\n return path.join(this.baseDir, `${id}.json`);\n }\n\n private async readIndex(): Promise<SpecIndex> {\n try {\n const raw = await fsp.readFile(this.indexPath, 'utf8');\n const parsed = JSON.parse(raw) as SpecIndex;\n if (parsed?.version === 1) return parsed;\n } catch {\n /* no index yet */\n }\n return { version: 1, entries: [] };\n }\n\n private async updateIndex(spec: Specification): Promise<void> {\n const index = await this.readIndex();\n const entry: SpecIndexEntry = {\n id: spec.id,\n title: spec.title,\n version: spec.version,\n status: spec.status,\n updatedAt: spec.updatedAt,\n filePath: this.filePath(spec.id),\n };\n const idx = index.entries.findIndex((e) => e.id === spec.id);\n if (idx >= 0) {\n index.entries[idx] = entry;\n } else {\n index.entries.push(entry);\n }\n await atomicWrite(this.indexPath, JSON.stringify(index, null, 2), { mode: 0o600 });\n }\n\n private async removeFromIndex(id: string): Promise<void> {\n const index = await this.readIndex();\n index.entries = index.entries.filter((e) => e.id !== id);\n await atomicWrite(this.indexPath, JSON.stringify(index, null, 2), { mode: 0o600 });\n }\n}\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { atomicWrite, ensureDir } from '../utils/atomic-write.js';\nimport type { TaskGraph, TaskNode, TaskEdge } from '../types/task-graph.js';\n\nexport interface TaskGraphStoreOptions {\n /** Directory where task graph files are stored. Defaults to `.wrongstack/task-graphs`. */\n baseDir: string;\n}\n\nexport interface TaskGraphIndexEntry {\n id: string;\n specId: string;\n title: string;\n nodeCount: number;\n completedCount: number;\n updatedAt: number;\n filePath: string;\n}\n\ninterface TaskGraphIndex {\n version: 1;\n entries: TaskGraphIndexEntry[];\n}\n\n/**\n * JSON serialisation helpers for TaskGraph (Map → Array round-trip).\n */\nfunction graphToJSON(graph: TaskGraph): string {\n const serialisable = {\n ...graph,\n nodes: Array.from(graph.nodes.entries()),\n };\n return JSON.stringify(serialisable, null, 2);\n}\n\nfunction graphFromJSON(raw: string): TaskGraph {\n const parsed = JSON.parse(raw) as Omit<TaskGraph, 'nodes'> & { nodes: [string, TaskNode][] };\n return {\n ...parsed,\n nodes: new Map(parsed.nodes),\n };\n}\n\n/**\n * File-backed task graph storage. Each graph is a JSON file under `baseDir/`.\n * An index file (`_index.json`) tracks all graphs for fast listing.\n */\nexport class TaskGraphStore {\n private readonly baseDir: string;\n private readonly indexPath: string;\n\n constructor(opts: TaskGraphStoreOptions) {\n this.baseDir = opts.baseDir;\n this.indexPath = path.join(this.baseDir, '_index.json');\n }\n\n async save(graph: TaskGraph): Promise<void> {\n await ensureDir(this.baseDir);\n const filePath = this.filePath(graph.id);\n await atomicWrite(filePath, graphToJSON(graph), { mode: 0o600 });\n await this.updateIndex(graph);\n }\n\n async load(id: string): Promise<TaskGraph | null> {\n try {\n const raw = await fsp.readFile(this.filePath(id), 'utf8');\n return graphFromJSON(raw);\n } catch {\n return null;\n }\n }\n\n async list(): Promise<TaskGraphIndexEntry[]> {\n const index = await this.readIndex();\n return index.entries.sort((a, b) => b.updatedAt - a.updatedAt);\n }\n\n async delete(id: string): Promise<boolean> {\n try {\n await fsp.unlink(this.filePath(id));\n await this.removeFromIndex(id);\n return true;\n } catch {\n return false;\n }\n }\n\n async exists(id: string): Promise<boolean> {\n try {\n await fsp.access(this.filePath(id));\n return true;\n } catch {\n return false;\n }\n }\n\n private filePath(id: string): string {\n return path.join(this.baseDir, `${id}.json`);\n }\n\n private async readIndex(): Promise<TaskGraphIndex> {\n try {\n const raw = await fsp.readFile(this.indexPath, 'utf8');\n const parsed = JSON.parse(raw) as TaskGraphIndex;\n if (parsed?.version === 1) return parsed;\n } catch {\n /* no index yet */\n }\n return { version: 1, entries: [] };\n }\n\n private async updateIndex(graph: TaskGraph): Promise<void> {\n const index = await this.readIndex();\n const completedCount = Array.from(graph.nodes.values()).filter(\n (n) => n.status === 'completed',\n ).length;\n const entry: TaskGraphIndexEntry = {\n id: graph.id,\n specId: graph.specId,\n title: graph.title,\n nodeCount: graph.nodes.size,\n completedCount,\n updatedAt: graph.updatedAt,\n filePath: this.filePath(graph.id),\n };\n const idx = index.entries.findIndex((e) => e.id === graph.id);\n if (idx >= 0) {\n index.entries[idx] = entry;\n } else {\n index.entries.push(entry);\n }\n await atomicWrite(this.indexPath, JSON.stringify(index, null, 2), { mode: 0o600 });\n }\n\n private async removeFromIndex(id: string): Promise<void> {\n const index = await this.readIndex();\n index.entries = index.entries.filter((e) => e.id !== id);\n await atomicWrite(this.indexPath, JSON.stringify(index, null, 2), { mode: 0o600 });\n }\n}\n","import type { Specification, SpecRequirement, SpecSection } from '../types/spec.js';\nimport type { SpecStore } from './spec-store.js';\n\n// ─── Session Types ────────────────────────────────────────────────────────────\n\nexport type AISpecPhase =\n | 'questioning' // AI is asking questions\n | 'spec_review' // Spec generated, waiting for user approval\n | 'implementation' // Implementation plan phase\n | 'task_review' // Tasks generated, waiting for execution\n | 'executing' // Running tasks\n | 'done'; // Everything complete\n\nexport interface CollectedAnswer {\n question: string;\n answer: string;\n timestamp: number;\n}\n\nexport interface AISpecSession {\n id: string;\n phase: AISpecPhase;\n title: string;\n userIntent: string;\n projectContext: string;\n answers: CollectedAnswer[];\n questionCount: number;\n spec?: Specification;\n implementation?: string;\n taskGraphId?: string;\n approved: boolean;\n createdAt: number;\n updatedAt: number;\n}\n\n// ─── Builder Options ──────────────────────────────────────────────────────────\n\nexport interface AISpecBuilderOptions {\n store: SpecStore;\n /** Minimum questions the AI should ask. Default: 2 */\n minQuestions?: number;\n /** Maximum questions before forcing spec generation. Default: 10 */\n maxQuestions?: number;\n /** Project context string (package.json, file structure, etc.) */\n projectContext?: string;\n /** Path to persist session state. If set, session survives process restarts. */\n sessionPath?: string;\n}\n\n// ─── AI Prompts ───────────────────────────────────────────────────────────────\n\nfunction buildQuestioningPrompt(session: AISpecSession, min: number, max: number): string {\n const answered = session.answers.length;\n const remaining = Math.max(0, min - answered);\n const budget = max - answered;\n\n const lines: string[] = [\n `═══ SDD Spec Builder ═══`,\n `Feature: \"${session.title}\"`,\n session.userIntent ? `Intent: ${session.userIntent}` : '',\n `Phase: Questioning (${answered} answered, ${budget} remaining budget)`,\n '',\n '**Instructions for AI:**',\n '',\n 'You are conducting a specification interview. Your job is to ask the user',\n 'intelligent, contextual questions to understand what they want to build.',\n '',\n `You have asked ${answered} questions so far.`,\n ];\n\n if (remaining > 0) {\n lines.push(`You MUST ask at least ${remaining} more question(s) before generating the spec.`);\n } else if (budget <= 0) {\n lines.push('You have reached the maximum question budget. Generate the spec NOW.');\n } else {\n lines.push(\n 'You may ask more questions if needed, or generate the spec if you have enough information.',\n 'Ask a question ONLY if it reveals something you genuinely need to know.',\n );\n }\n\n lines.push(\n '',\n '**Rules:**',\n '- Ask ONE question at a time',\n '- Questions must be specific and contextual — never generic',\n '- Adapt based on previous answers',\n '- Cover: scope, constraints, edge cases, integrations, security, performance as relevant',\n '- When you have enough info, respond with the full specification in JSON format',\n '',\n `**Question budget:** ${budget}/${max} remaining`,\n `**Minimum required:** ${remaining > 0 ? remaining : 'met'}`,\n );\n\n if (session.projectContext) {\n lines.push('', '**Project Context:**', '```', session.projectContext, '```');\n }\n\n if (answered > 0) {\n lines.push('', '**Conversation so far:**');\n for (let i = 0; i < answered; i++) {\n const a = session.answers[i]!;\n lines.push(``, `Q${i + 1}: ${a.question}`, `A${i + 1}: ${a.answer}`);\n }\n }\n\n lines.push(\n '',\n '---',\n 'Now either:',\n `1. Ask your next question (if you need more info)`,\n `2. Generate the complete specification as JSON (if ready)`,\n '',\n 'If generating spec, output JSON inside ```json code block with this structure:',\n '```json',\n '{',\n ' \"title\": \"...\",',\n ' \"overview\": \"...\",',\n ' \"sections\": [{ \"type\": \"overview|requirements|architecture|api|data|security|acceptance\", \"title\": \"...\", \"content\": \"...\", \"level\": 1 }],',\n ' \"requirements\": [{ \"id\": \"REQ-1\", \"type\": \"functional|non-functional|security|performance|ux\", \"priority\": \"critical|high|medium|low\", \"description\": \"...\", \"acceptanceCriteria\": [\"...\"] }]',\n '}',\n '```',\n );\n\n return lines.filter(Boolean).join('\\n');\n}\n\nfunction buildSpecReviewPrompt(session: AISpecSession): string {\n const spec = session.spec;\n if (!spec) return 'No spec generated yet.';\n\n const reqSummary = spec.requirements\n .map((r) => ` [${r.priority}] ${r.description}`)\n .join('\\n');\n\n return [\n `═══ Spec Review ═══`,\n `Feature: \"${spec.title}\"`,\n `Requirements: ${spec.requirements.length}`,\n '',\n '**Specification:**',\n spec.overview,\n '',\n '**Requirements:**',\n reqSummary,\n '',\n '---',\n 'Approve this spec? The AI will then generate an implementation plan and tasks.',\n 'Say \"approve\" to proceed, or describe what needs to change.',\n ].join('\\n');\n}\n\nfunction buildImplementationPrompt(session: AISpecSession): string {\n const spec = session.spec;\n if (!spec) return 'No spec to implement.';\n\n const reqList = spec.requirements\n .map((r) => ` - [${r.priority}] ${r.description}`)\n .join('\\n');\n\n return [\n `═══ Implementation Planning ═══`,\n `Feature: \"${spec.title}\"`,\n `Requirements: ${spec.requirements.length}`,\n '',\n '**Requirements to implement:**',\n reqList,\n '',\n '**Instructions for AI:**',\n 'Generate a detailed implementation plan for this specification.',\n 'Include:',\n '1. Architecture decisions',\n '2. File structure changes',\n '3. Key implementation details',\n '4. Dependency requirements',\n '5. Testing strategy',\n '',\n '**IMPORTANT:** After the plan, you MUST generate executable tasks as a JSON array.',\n 'Each task should be a concrete, actionable step. Output the JSON inside a ```json code block:',\n '```json',\n '[',\n ' {',\n ' \"title\": \"Create auth middleware\",',\n ' \"description\": \"Implement JWT verification middleware for protected routes\",',\n ' \"type\": \"feature\",',\n ' \"priority\": \"critical\",',\n ' \"estimateHours\": 3,',\n ' \"tags\": [\"auth\", \"middleware\"]',\n ' },',\n ' {',\n ' \"title\": \"Write auth tests\",',\n ' \"description\": \"Unit and integration tests for authentication flow\",',\n ' \"type\": \"test\",',\n ' \"priority\": \"high\",',\n ' \"estimateHours\": 2,',\n ' \"tags\": [\"test\", \"auth\"]',\n ' }',\n ']',\n '```',\n '',\n 'Rules:',\n '- Each task must be independently executable',\n '- Order tasks by dependency (things that block others come first)',\n '- Use type: \"feature\" for code, \"test\" for tests, \"docs\" for documentation, \"chore\" for config',\n '- Use priority: \"critical\" for blockers, \"high\" for core features, \"medium\" for nice-to-haves, \"low\" for polish',\n ].join('\\n');\n}\n\nfunction buildTaskReviewPrompt(session: AISpecSession): string {\n return [\n `═══ Task Review ═══`,\n `Feature: \"${session.spec?.title ?? session.title}\"`,\n '',\n session.implementation ?? 'No implementation plan yet.',\n '',\n '---',\n 'Ready to execute these tasks? Say \"execute\" to begin, or describe changes needed.',\n ].join('\\n');\n}\n\nfunction buildExecutingPrompt(session: AISpecSession): string {\n return [\n `═══ Task Execution ═══`,\n `Feature: \"${session.spec?.title ?? session.title}\"`,\n '',\n '**Instructions for AI:**',\n 'Execute the tasks one by one in the order shown in the task list above.',\n '',\n 'For each task:',\n '1. Implement the code (create/modify files)',\n '2. Write tests if applicable',\n '3. After completing a task, tell the user to run: /sdd done <task number or title>',\n '4. Then move to the next task',\n '',\n '**Important:**',\n '- Focus on ONE task at a time',\n '- After completing each task, explicitly state what you did',\n '- Tell the user: \"Run /sdd done <N> to mark this task complete\"',\n '- Then proceed to the next task automatically',\n '- When ALL tasks are done, provide a summary of everything implemented',\n '',\n 'Start executing the first pending task now.',\n ].join('\\n');\n}\n\n// ─── Spec Builder Class ───────────────────────────────────────────────────────\n\n/**\n * AI-driven specification builder. Instead of static questions, this builder\n * tracks conversation state and generates prompts that instruct the AI agent\n * to ask contextual questions and build specifications interactively.\n */\nexport class AISpecBuilder {\n private session: AISpecSession;\n private readonly store: SpecStore;\n private readonly minQuestions: number;\n private readonly maxQuestions: number;\n private readonly sessionPath?: string;\n\n constructor(opts: AISpecBuilderOptions) {\n this.store = opts.store;\n this.minQuestions = opts.minQuestions ?? 2;\n this.maxQuestions = opts.maxQuestions ?? 10;\n this.sessionPath = opts.sessionPath;\n this.session = {\n id: crypto.randomUUID(),\n phase: 'questioning',\n title: '',\n userIntent: '',\n projectContext: opts.projectContext ?? '',\n answers: [],\n questionCount: 0,\n approved: false,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n }\n\n // ── Session Persistence ──────────────────────────────────────────────────\n\n /** Save session state to disk. */\n async saveSession(): Promise<void> {\n if (!this.sessionPath) return;\n try {\n const fsp = await import('node:fs/promises');\n const path = await import('node:path');\n await fsp.mkdir(path.dirname(this.sessionPath), { recursive: true });\n await fsp.writeFile(this.sessionPath, JSON.stringify(this.session, null, 2), 'utf8');\n } catch {\n // Best-effort persistence — don't crash if save fails\n }\n }\n\n /** Load session state from disk. Returns true if a session was loaded. */\n async loadSession(): Promise<boolean> {\n if (!this.sessionPath) return false;\n try {\n const fsp = await import('node:fs/promises');\n const raw = await fsp.readFile(this.sessionPath, 'utf8');\n const loaded = JSON.parse(raw) as AISpecSession;\n // Validate basic structure\n if (loaded?.id && loaded?.phase && loaded?.title) {\n this.session = loaded;\n return true;\n }\n } catch {\n // No saved session or invalid file\n }\n return false;\n }\n\n /** Delete saved session from disk. */\n async deleteSession(): Promise<void> {\n if (!this.sessionPath) return;\n try {\n const fsp = await import('node:fs/promises');\n await fsp.unlink(this.sessionPath);\n } catch {\n // File might not exist\n }\n }\n\n /** Auto-save helper — calls saveSession() but never throws. */\n private autoSave(): void {\n this.saveSession().catch(() => {});\n }\n\n // ── Session Lifecycle ─────────────────────────────────────────────────────\n\n /** Start a new session with a title and optional intent. */\n startSession(title: string, intent?: string): void {\n this.session.title = title;\n this.session.userIntent = intent ?? '';\n this.session.phase = 'questioning';\n this.session.updatedAt = Date.now();\n this.autoSave();\n }\n\n /** Get current session state (readonly). */\n getSession(): Readonly<AISpecSession> {\n return { ...this.session };\n }\n\n /** Get the current phase. */\n getPhase(): AISpecPhase {\n return this.session.phase;\n }\n\n // ── AI Prompt Generation ──────────────────────────────────────────────────\n\n /**\n * Get the AI prompt for the current phase.\n * This prompt is injected into the conversation so the AI agent knows\n * what to do next (ask a question, generate a spec, etc.).\n */\n getAIPrompt(): string {\n switch (this.session.phase) {\n case 'questioning':\n return buildQuestioningPrompt(this.session, this.minQuestions, this.maxQuestions);\n case 'spec_review':\n return buildSpecReviewPrompt(this.session);\n case 'implementation':\n return buildImplementationPrompt(this.session);\n case 'task_review':\n return buildTaskReviewPrompt(this.session);\n case 'executing':\n return buildExecutingPrompt(this.session);\n case 'done':\n return 'All tasks completed. Specification is fully implemented.';\n }\n }\n\n // ── Answer Processing ─────────────────────────────────────────────────────\n\n /**\n * Record a question/answer pair from the AI conversation.\n * Call this when the AI asks a question and the user responds.\n */\n addAnswer(question: string, answer: string): void {\n this.session.answers.push({ question, answer, timestamp: Date.now() });\n this.session.questionCount++;\n this.session.updatedAt = Date.now();\n this.autoSave();\n }\n\n /**\n * Check if more questions should be asked.\n * Returns false if max reached or if the AI has signaled it has enough info.\n */\n shouldContinueQuestioning(): boolean {\n return this.session.questionCount < this.maxQuestions;\n }\n\n /**\n * Check if minimum questions have been asked.\n */\n hasMetMinimumQuestions(): boolean {\n return this.session.questionCount >= this.minQuestions;\n }\n\n // ── Phase Transitions ─────────────────────────────────────────────────────\n\n /**\n * Set the generated specification and move to spec_review phase.\n */\n setSpec(spec: Specification): void {\n this.session.spec = spec;\n this.session.phase = 'spec_review';\n this.session.updatedAt = Date.now();\n this.autoSave();\n }\n\n /**\n * Approve the current phase and advance to the next.\n * questioning → spec_review (requires spec to be set)\n * spec_review → implementation\n * implementation → task_review (requires implementation to be set)\n * task_review → executing\n * executing → done\n */\n approve(): AISpecPhase {\n switch (this.session.phase) {\n case 'questioning':\n if (!this.session.spec) {\n throw new Error('Cannot approve: no spec generated yet.');\n }\n this.session.phase = 'spec_review';\n break;\n case 'spec_review':\n this.session.phase = 'implementation';\n break;\n case 'implementation':\n this.session.phase = 'task_review';\n break;\n case 'task_review':\n this.session.phase = 'executing';\n break;\n case 'executing':\n this.session.phase = 'done';\n break;\n case 'done':\n break;\n }\n this.session.approved = true;\n this.session.updatedAt = Date.now();\n this.autoSave();\n return this.session.phase;\n }\n\n /**\n * Set the implementation plan text.\n */\n setImplementation(plan: string): void {\n this.session.implementation = plan;\n this.session.phase = 'task_review';\n this.session.updatedAt = Date.now();\n this.autoSave();\n }\n\n /**\n * Mark session as done.\n */\n markDone(): void {\n this.session.phase = 'done';\n this.session.updatedAt = Date.now();\n this.autoSave();\n }\n\n /**\n * Set the task graph ID for this session.\n */\n setTaskGraphId(graphId: string): void {\n this.session.taskGraphId = graphId;\n this.autoSave();\n }\n\n /**\n * Get the task graph ID for this session.\n */\n getTaskGraphId(): string | undefined {\n return this.session.taskGraphId;\n }\n\n // ── Spec Persistence ──────────────────────────────────────────────────────\n\n /**\n * Save the current spec to the store.\n */\n async saveSpec(): Promise<Specification> {\n if (!this.session.spec) {\n throw new Error('No spec to save.');\n }\n await this.store.save(this.session.spec);\n return this.session.spec;\n }\n\n // ── Spec Generation Helpers ───────────────────────────────────────────────\n\n /**\n * Parse a spec from a JSON string (from AI output).\n * Validates and normalizes the structure.\n */\n parseSpecFromJSON(jsonStr: string): Specification {\n let parsed: unknown;\n try {\n parsed = JSON.parse(jsonStr);\n } catch (e) {\n throw new Error(`Invalid JSON for spec: ${e instanceof Error ? e.message : 'parse error'}`);\n }\n\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('Spec JSON must be an object.');\n }\n\n const raw = parsed as Record<string, unknown>;\n const now = Date.now();\n\n const title = String(raw.title ?? this.session.title ?? 'Untitled');\n const overview = String(raw.overview ?? '');\n\n // Validate overview is not empty\n if (!overview || overview === 'undefined') {\n throw new Error('Spec must have an overview.');\n }\n\n const rawSections = Array.isArray(raw.sections) ? raw.sections : [];\n const sections: SpecSection[] = rawSections\n .filter((s: unknown) => s && typeof s === 'object')\n .map((s: Record<string, unknown>) => ({\n type: (['overview', 'requirements', 'architecture', 'api', 'data', 'security', 'acceptance']\n .includes(String(s.type)) ? String(s.type) : 'overview') as SpecSection['type'],\n title: String(s.title ?? ''),\n content: String(s.content ?? ''),\n level: Number(s.level) || 1,\n }));\n\n const rawReqs = Array.isArray(raw.requirements) ? raw.requirements : [];\n const requirements: SpecRequirement[] = rawReqs\n .filter((r: unknown) => r && typeof r === 'object')\n .map((r: Record<string, unknown>, i: number) => ({\n id: String(r.id ?? `REQ-${i + 1}`),\n type: (['functional', 'non-functional', 'security', 'performance', 'ux']\n .includes(String(r.type)) ? String(r.type) : 'functional') as SpecRequirement['type'],\n priority: (['critical', 'high', 'medium', 'low']\n .includes(String(r.priority)) ? String(r.priority) : 'medium') as SpecRequirement['priority'],\n description: String(r.description ?? ''),\n acceptanceCriteria: Array.isArray(r.acceptanceCriteria)\n ? r.acceptanceCriteria.map(String)\n : [],\n }));\n\n const spec: Specification = {\n id: crypto.randomUUID(),\n title,\n version: '0.1.0',\n status: 'draft',\n overview,\n sections,\n requirements,\n createdAt: now,\n updatedAt: now,\n metadata: {\n generatedBy: 'AISpecBuilder',\n sessionId: this.session.id,\n },\n };\n\n return spec;\n }\n\n /**\n * Extract JSON from AI output (handles ```json blocks and raw JSON).\n */\n extractJSON(text: string): string | null {\n // Try ```json ... ``` first\n const codeBlockMatch = text.match(/```json\\s*([\\s\\S]*?)```/);\n if (codeBlockMatch?.[1]) {\n return codeBlockMatch[1].trim();\n }\n\n // Try ``` ... ``` without language tag\n const genericBlockMatch = text.match(/```\\s*([\\s\\S]*?)```/);\n if (genericBlockMatch?.[1]) {\n const trimmed = genericBlockMatch[1].trim();\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n return trimmed;\n }\n }\n\n // Try raw JSON object\n const jsonMatch = text.match(/(\\{[\\s\\S]*\\})/);\n if (jsonMatch?.[1]) {\n try {\n JSON.parse(jsonMatch[1]);\n return jsonMatch[1];\n } catch {\n // not valid JSON\n }\n }\n\n return null;\n }\n\n /**\n * Detect if AI output contains a spec (JSON block).\n */\n hasSpecInOutput(text: string): boolean {\n return this.extractJSON(text) !== null;\n }\n\n /**\n * Try to parse a spec from AI output text.\n * Returns null if no valid spec found.\n */\n tryParseSpecFromOutput(text: string): Specification | null {\n const json = this.extractJSON(text);\n if (!json) return null;\n\n try {\n return this.parseSpecFromJSON(json);\n } catch {\n return null;\n }\n }\n\n // ── JSON Array Extraction (for tasks) ─────────────────────────────────────\n\n /**\n * Extract a JSON array from AI output (for task lists).\n */\n extractJSONArray(text: string): string | null {\n const codeBlockMatch = text.match(/```json\\s*([\\s\\S]*?)```/);\n if (codeBlockMatch?.[1]) {\n const trimmed = codeBlockMatch[1].trim();\n if (trimmed.startsWith('[')) return trimmed;\n }\n\n const arrayMatch = text.match(/(\\[[\\s\\S]*\\])/);\n if (arrayMatch?.[1]) {\n try {\n const parsed = JSON.parse(arrayMatch[1]);\n if (Array.isArray(parsed)) return arrayMatch[1];\n } catch {\n // not valid\n }\n }\n\n return null;\n }\n}\n","import type { SpecTemplate } from '../types/spec.js';\n\n/**\n * Built-in spec templates for common development scenarios.\n */\nexport const SPEC_TEMPLATES: SpecTemplate[] = [\n {\n id: 'feature',\n name: 'New Feature',\n description: 'Template for new feature development',\n sections: [\n { type: 'overview', title: 'Overview', level: 2 },\n { type: 'requirements', title: 'Requirements', level: 2 },\n { type: 'architecture', title: 'Architecture', level: 2 },\n { type: 'api', title: 'API Design', level: 2 },\n { type: 'data', title: 'Data Model', level: 2 },\n { type: 'security', title: 'Security', level: 2 },\n { type: 'acceptance', title: 'Acceptance Criteria', level: 2 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'non-functional', priority: 'medium', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n {\n id: 'bugfix',\n name: 'Bug Fix',\n description: 'Template for bug fix specifications',\n sections: [\n { type: 'overview', title: 'Bug Description', level: 2 },\n { type: 'requirements', title: 'Root Cause Analysis', level: 2 },\n { type: 'acceptance', title: 'Fix Verification', level: 2 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'critical', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n {\n id: 'refactor',\n name: 'Refactor',\n description: 'Template for code refactoring',\n sections: [\n { type: 'overview', title: 'Current State', level: 2 },\n { type: 'requirements', title: 'Refactoring Goals', level: 2 },\n { type: 'architecture', title: 'Target Architecture', level: 2 },\n { type: 'acceptance', title: 'Verification', level: 2 },\n ],\n defaultRequirements: [\n { type: 'non-functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n {\n id: 'infra',\n name: 'Infrastructure',\n description: 'Template for infrastructure/tooling changes',\n sections: [\n { type: 'overview', title: 'What and Why', level: 2 },\n { type: 'requirements', title: 'Requirements', level: 2 },\n { type: 'architecture', title: 'Design', level: 2 },\n { type: 'security', title: 'Security Impact', level: 2 },\n { type: 'acceptance', title: 'Rollout Plan', level: 2 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'security', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n {\n id: 'integration',\n name: 'Integration',\n description: 'Template for integrating external services or APIs',\n sections: [\n { type: 'overview', title: 'Integration Overview', level: 2 },\n { type: 'requirements', title: 'Integration Requirements', level: 2 },\n { type: 'api', title: 'API Contract', level: 2 },\n { type: 'architecture', title: 'Architecture', level: 2 },\n { type: 'security', title: 'Auth & Security', level: 2 },\n { type: 'acceptance', title: 'Testing Strategy', level: 2 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'security', priority: 'critical', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'performance', priority: 'medium', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n {\n id: 'cli-command',\n name: 'CLI Command',\n description: 'Template for new CLI commands/slash commands',\n sections: [\n { type: 'overview', title: 'Command Overview', level: 2 },\n { type: 'requirements', title: 'Command Requirements', level: 2 },\n { type: 'api', title: 'Command Interface', level: 2 },\n { type: 'acceptance', title: 'Usage Examples', level: 2 },\n ],\n defaultRequirements: [\n { type: 'ux', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n];\n\n/**\n * Get a template by ID.\n */\nexport function getTemplate(id: string): SpecTemplate | undefined {\n return SPEC_TEMPLATES.find((t) => t.id === id);\n}\n\n/**\n * List all available templates.\n */\nexport function listTemplates(): Array<{ id: string; name: string; description: string }> {\n return SPEC_TEMPLATES.map((t) => ({ id: t.id, name: t.name, description: t.description }));\n}\n\n/**\n * Generate a markdown skeleton from a template.\n */\nexport function templateToMarkdown(template: SpecTemplate, title?: string): string {\n const lines: string[] = [];\n lines.push(`# ${title ?? 'Untitled Specification'}`);\n lines.push('Version: 0.1.0');\n lines.push('');\n\n for (const section of template.sections) {\n lines.push(`${'#'.repeat(section.level + 1)} ${section.title}`);\n lines.push(`_<!-- ${section.type} section content -->_`);\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","import type { TaskGraph, TaskNode, TaskProgress } from '../types/task-graph.js';\nimport { computeTaskProgress } from '../types/task-graph.js';\nimport type { Specification } from '../types/spec.js';\n\nconst STATUS_ICON: Record<TaskNode['status'], string> = {\n pending: '○',\n in_progress: '◐',\n blocked: '⊘',\n failed: '✗',\n review: '◑',\n completed: '●',\n};\n\nconst PRIORITY_ICON: Record<TaskNode['priority'], string> = {\n critical: '🔴',\n high: '🟠',\n medium: '🟡',\n low: '🟢',\n};\n\nconst TYPE_ICON: Record<TaskNode['type'], string> = {\n feature: '⚡',\n bugfix: '🐛',\n refactor: '♻️',\n docs: '📝',\n test: '🧪',\n chore: '🔧',\n};\n\n/**\n * Render a task graph as ASCII art for terminal display.\n */\nexport function renderTaskGraph(graph: TaskGraph, opts?: { compact?: boolean }): string {\n const lines: string[] = [];\n const compact = opts?.compact ?? false;\n\n // Header\n lines.push(`╭─ Task Graph: ${graph.title} ─╮`);\n lines.push(`│ Spec: ${graph.specId.slice(0, 8)}... │ Nodes: ${graph.nodes.size} │ Edges: ${graph.edges.length} │`);\n lines.push('╰' + '─'.repeat(Math.max(50, graph.title.length + 30)) + '╯');\n lines.push('');\n\n // Progress bar\n const progress = computeTaskProgress(graph);\n lines.push(renderProgress(progress));\n lines.push('');\n\n // Build adjacency for display\n const childrenMap = new Map<string, string[]>();\n for (const edge of graph.edges) {\n if (edge.type === 'depends_on') {\n // edge.from depends on edge.to → edge.to is a blocker\n const deps = childrenMap.get(edge.from) ?? [];\n deps.push(edge.to);\n childrenMap.set(edge.from, deps);\n }\n }\n\n // Render root nodes and their dependents\n const rendered = new Set<string>();\n const rootNodes = graph.rootNodes.filter((id) => graph.nodes.has(id));\n\n // If no root nodes, use all nodes\n const startNodes = rootNodes.length > 0\n ? rootNodes\n : Array.from(graph.nodes.keys()).filter((id) => {\n const deps = childrenMap.get(id);\n return !deps || deps.length === 0;\n });\n\n for (const rootId of startNodes) {\n renderNode(graph, rootId, lines, rendered, childrenMap, compact, '');\n }\n\n // Render any orphan nodes\n for (const [id] of graph.nodes) {\n if (!rendered.has(id)) {\n renderNode(graph, id, lines, rendered, childrenMap, compact, '');\n }\n }\n\n // Legend\n lines.push('');\n lines.push('Legend: ● done ◐ in-progress ○ pending ⊗ blocked ✗ failed ◒ review');\n\n return lines.join('\\n');\n}\n\nfunction renderNode(\n graph: TaskGraph,\n nodeId: string,\n lines: string[],\n rendered: Set<string>,\n childrenMap: Map<string, string[]>,\n compact: boolean,\n prefix: string,\n): void {\n if (rendered.has(nodeId)) return;\n rendered.add(nodeId);\n\n const node = graph.nodes.get(nodeId);\n if (!node) return;\n\n const icon = STATUS_ICON[node.status];\n const prioIcon = PRIORITY_ICON[node.priority];\n const typeIcon = TYPE_ICON[node.type];\n const title = compact ? truncate(node.title, 40) : node.title;\n\n const blockedBy = childrenMap.get(nodeId) ?? [];\n const depsStr = blockedBy.length > 0\n ? ` ← [${blockedBy.map((d) => graph.nodes.get(d)?.title?.slice(0, 12) ?? '?').join(', ')}]`\n : '';\n\n lines.push(`${prefix}${icon} ${typeIcon} ${prioIcon} ${title}${depsStr}`);\n\n if (!compact && node.description) {\n const descLines = node.description.split('\\n').slice(0, 3);\n for (const dl of descLines) {\n lines.push(`${prefix} └ ${truncate(dl, 60)}`);\n }\n }\n\n // Render nodes that depend on this one\n const dependents = graph.edges\n .filter((e) => e.type === 'depends_on' && e.to === nodeId)\n .map((e) => e.from)\n .filter((id) => graph.nodes.has(id));\n\n for (const depId of dependents) {\n renderNode(graph, depId, lines, rendered, childrenMap, compact, prefix + ' ');\n }\n}\n\n/**\n * Render a progress bar.\n */\nexport function renderProgress(progress: TaskProgress): string {\n const barWidth = 30;\n const filled = Math.round((progress.percentComplete / 100) * barWidth);\n const empty = barWidth - filled;\n const bar = '█'.repeat(filled) + '░'.repeat(empty);\n\n return [\n `Progress: [${bar}] ${progress.percentComplete}%`,\n ` ${progress.completed} done │ ${progress.inProgress} active │ ${progress.pending} pending │ ${progress.blocked} blocked │ ${progress.failed} failed`,\n ].join('\\n');\n}\n\n/**\n * Render a compact task list (for quick status checks).\n */\nexport function renderTaskList(graph: TaskGraph): string {\n const lines: string[] = [];\n const nodes = Array.from(graph.nodes.values());\n\n // Group by status\n const groups: Record<string, TaskNode[]> = {\n in_progress: [],\n pending: [],\n blocked: [],\n review: [],\n failed: [],\n completed: [],\n };\n\n for (const node of nodes) {\n groups[node.status]?.push(node);\n }\n\n for (const [status, group] of Object.entries(groups)) {\n if (group.length === 0) continue;\n const icon = STATUS_ICON[status as TaskNode['status']];\n lines.push(`${icon} ${status.toUpperCase()} (${group.length})`);\n for (const node of group) {\n const prio = PRIORITY_ICON[node.priority];\n const type = TYPE_ICON[node.type];\n lines.push(` ${type} ${prio} ${node.title}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Render spec analysis summary.\n */\nexport function renderSpecAnalysis(\n spec: Specification,\n analysis: { completeness: number; gaps: string[]; risks: string[]; suggestions: string[] },\n): string {\n const lines: string[] = [];\n\n lines.push(`╭─ Spec Analysis: ${spec.title} ─╮`);\n lines.push('');\n\n // Completeness\n const barWidth = 20;\n const filled = Math.round((analysis.completeness / 100) * barWidth);\n const bar = '█'.repeat(filled) + '░'.repeat(barWidth - filled);\n lines.push(`Completeness: [${bar}] ${analysis.completeness}%`);\n lines.push('');\n\n if (analysis.gaps.length > 0) {\n lines.push('⚠ Gaps:');\n for (const gap of analysis.gaps) {\n lines.push(` • ${gap}`);\n }\n lines.push('');\n }\n\n if (analysis.risks.length > 0) {\n lines.push('🔴 Risks:');\n for (const risk of analysis.risks) {\n lines.push(` • ${risk}`);\n }\n lines.push('');\n }\n\n if (analysis.suggestions.length > 0) {\n lines.push('💡 Suggestions:');\n for (const sug of analysis.suggestions) {\n lines.push(` • ${sug}`);\n }\n }\n\n return lines.join('\\n');\n}\n\nfunction truncate(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n return str.slice(0, maxLen - 1) + '…';\n}\n","import type { TaskGraph, TaskNode, CriticalPathResult } from '../types/task-graph.js';\nimport { topologicalSort } from '../types/task-graph.js';\n\n/**\n * Enhanced critical path analysis with bottleneck detection,\n * parallel execution groups, and time estimation.\n */\nexport interface CriticalPathAnalysis {\n /** Ordered list of critical path task IDs. */\n criticalPath: string[];\n /** Total estimated hours for the critical path. */\n totalHours: number;\n /** Tasks that block the most downstream work. */\n bottlenecks: BottleneckTask[];\n /** Groups of tasks that can run in parallel. */\n parallelGroups: string[][];\n /** Recommended execution order respecting dependencies. */\n executionOrder: string[];\n /** Tasks with no blockers (can start immediately). */\n readyTasks: string[];\n /** Tasks that are blocked and cannot start. */\n blockedTasks: string[];\n}\n\nexport interface BottleneckTask {\n taskId: string;\n title: string;\n /** Number of tasks directly or transitively blocked by this task. */\n blockedCount: number;\n /** Total estimated hours of blocked downstream work. */\n blockedHours: number;\n /** Severity score (0-100). */\n severity: number;\n}\n\n/**\n * Analyze a task graph and return critical path analysis.\n */\nexport function analyzeCriticalPath(graph: TaskGraph): CriticalPathAnalysis {\n const nodes = Array.from(graph.nodes.values());\n const topoOrder = topologicalSort(graph);\n\n // Build adjacency: blocker → blocked tasks\n const blockedByMap = new Map<string, Set<string>>();\n const blocksMap = new Map<string, Set<string>>();\n\n for (const edge of graph.edges) {\n if (edge.type === 'depends_on') {\n // edge.from depends on edge.to\n if (!blockedByMap.has(edge.from)) blockedByMap.set(edge.from, new Set());\n blockedByMap.get(edge.from)!.add(edge.to);\n\n if (!blocksMap.has(edge.to)) blocksMap.set(edge.to, new Set());\n blocksMap.get(edge.to)!.add(edge.from);\n }\n }\n\n // Find ready tasks (no blockers or all blockers completed)\n const readyTasks: string[] = [];\n const blockedTasks: string[] = [];\n\n for (const node of nodes) {\n if (node.status === 'completed') continue;\n const blockers = blockedByMap.get(node.id);\n if (!blockers || blockers.size === 0) {\n readyTasks.push(node.id);\n } else {\n const allCompleted = Array.from(blockers).every((id) => {\n const n = graph.nodes.get(id);\n return n?.status === 'completed';\n });\n if (allCompleted) {\n readyTasks.push(node.id);\n } else {\n blockedTasks.push(node.id);\n }\n }\n }\n\n // Compute bottleneck scores\n const bottlenecks: BottleneckTask[] = [];\n for (const node of nodes) {\n if (node.status === 'completed') continue;\n const downstream = getTransitiveBlocked(graph, node.id, blocksMap);\n if (downstream.size > 0) {\n const blockedHours = Array.from(downstream).reduce((sum, id) => {\n const n = graph.nodes.get(id);\n return sum + (n?.estimateHours ?? 0);\n }, 0);\n bottlenecks.push({\n taskId: node.id,\n title: node.title,\n blockedCount: downstream.size,\n blockedHours,\n severity: Math.min(100, Math.round((downstream.size / nodes.length) * 100)),\n });\n }\n }\n\n bottlenecks.sort((a, b) => b.severity - a.severity);\n\n // Compute critical path (longest path by estimated hours)\n const criticalPath = computeCriticalPath(graph, topoOrder, blockedByMap);\n\n // Total hours on critical path\n const totalHours = criticalPath.reduce((sum, id) => {\n const n = graph.nodes.get(id);\n return sum + (n?.estimateHours ?? 0);\n }, 0);\n\n // Parallel execution groups\n const parallelGroups = computeParallelGroups(graph, blockedByMap);\n\n // Execution order: topo sort filtered to non-completed tasks\n const executionOrder = topoOrder.filter((id) => {\n const n = graph.nodes.get(id);\n return n && n.status !== 'completed';\n });\n\n return {\n criticalPath,\n totalHours,\n bottlenecks,\n parallelGroups,\n executionOrder,\n readyTasks,\n blockedTasks,\n };\n}\n\n/**\n * Get all tasks transitively blocked by a given task.\n */\nfunction getTransitiveBlocked(\n graph: TaskGraph,\n taskId: string,\n blocksMap: Map<string, Set<string>>,\n): Set<string> {\n const visited = new Set<string>();\n const queue = [taskId];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const blocked = blocksMap.get(current);\n if (!blocked) continue;\n for (const id of blocked) {\n if (!visited.has(id) && id !== taskId) {\n visited.add(id);\n queue.push(id);\n }\n }\n }\n\n return visited;\n}\n\n/**\n * Compute the critical path (longest path by estimated hours).\n */\nfunction computeCriticalPath(\n graph: TaskGraph,\n topoOrder: string[],\n blockedByMap: Map<string, Set<string>>,\n): string[] {\n // Use all nodes in the graph, not just topo-reachable ones\n const allIds = Array.from(graph.nodes.keys());\n if (allIds.length === 0) return [];\n\n const dist = new Map<string, number>();\n const prev = new Map<string, string | null>();\n\n // Initialize each node's distance to its own estimate\n for (const id of allIds) {\n dist.set(id, graph.nodes.get(id)?.estimateHours ?? 1);\n prev.set(id, null);\n }\n\n // Build reverse map: blocker → tasks it blocks\n const blocksMap = new Map<string, Set<string>>();\n for (const [taskId, blockers] of blockedByMap) {\n for (const blockerId of blockers) {\n if (!blocksMap.has(blockerId)) blocksMap.set(blockerId, new Set());\n blocksMap.get(blockerId)!.add(taskId);\n }\n }\n\n // Relax edges repeatedly (Bellman-Ford style) since topoOrder may be incomplete.\n // Run N-1 iterations to handle longest path in DAG.\n const n = allIds.length;\n for (let i = 0; i < n - 1; i++) {\n let changed = false;\n for (const id of allIds) {\n const blocked = blocksMap.get(id);\n if (!blocked) continue;\n for (const blockedId of blocked) {\n const candidateDist = (dist.get(id) ?? 0) + (graph.nodes.get(blockedId)?.estimateHours ?? 1);\n if (candidateDist > (dist.get(blockedId) ?? 0)) {\n dist.set(blockedId, candidateDist);\n prev.set(blockedId, id);\n changed = true;\n }\n }\n }\n if (!changed) break;\n }\n\n // Find the node with maximum distance (end of critical path)\n let maxDist = 0;\n let maxId = allIds[0]!;\n for (const id of allIds) {\n const d = dist.get(id) ?? 0;\n if (d > maxDist) {\n maxDist = d;\n maxId = id;\n }\n }\n\n // Trace back the critical path\n const path: string[] = [];\n let current: string | null = maxId;\n const visited = new Set<string>();\n while (current && !visited.has(current)) {\n visited.add(current);\n path.unshift(current);\n current = prev.get(current) ?? null;\n }\n\n return path;\n}\n\n/**\n * Compute groups of tasks that can run in parallel.\n * Tasks in the same group have no dependencies on each other.\n */\nfunction computeParallelGroups(\n graph: TaskGraph,\n blockedByMap: Map<string, Set<string>>,\n): string[][] {\n const groups: string[][] = [];\n const assigned = new Set<string>();\n const nodes = Array.from(graph.nodes.values()).filter((n) => n.status !== 'completed');\n\n // Topological levels\n const remaining = new Set(nodes.map((n) => n.id));\n\n while (remaining.size > 0) {\n const group: string[] = [];\n for (const id of remaining) {\n const blockers = blockedByMap.get(id);\n if (!blockers || blockers.size === 0) {\n group.push(id);\n } else {\n const allAssigned = Array.from(blockers).every((b) => assigned.has(b));\n if (allAssigned) {\n group.push(id);\n }\n }\n }\n\n if (group.length === 0) {\n // Circular dependency or all remaining are blocked by non-completed\n // Just take the first remaining\n const first = Array.from(remaining)[0];\n if (first) group.push(first);\n }\n\n for (const id of group) {\n assigned.add(id);\n remaining.delete(id);\n }\n groups.push(group);\n }\n\n return groups;\n}\n","import type { Specification, SpecRequirement } from '../types/spec.js';\nimport type { TaskGraph, TaskNode } from '../types/task-graph.js';\nimport { SpecParser } from './spec-parser.js';\n\nexport interface SpecVersion {\n version: string;\n spec: Specification;\n timestamp: number;\n changeDescription?: string;\n}\n\nexport interface SpecDiff {\n added: SpecRequirement[];\n removed: SpecRequirement[];\n modified: Array<{\n requirement: SpecRequirement;\n previousVersion: SpecRequirement;\n changes: string[];\n }>;\n summary: string;\n}\n\n/**\n * Track spec versions and compute diffs between versions.\n */\nexport class SpecVersioning {\n private versions = new Map<string, SpecVersion[]>();\n\n /** Record a new version of a spec. */\n recordVersion(spec: Specification, changeDescription?: string): SpecVersion {\n const version: SpecVersion = {\n version: spec.version,\n spec: { ...spec },\n timestamp: Date.now(),\n changeDescription,\n };\n\n const history = this.versions.get(spec.id) ?? [];\n history.push(version);\n this.versions.set(spec.id, history);\n\n return version;\n }\n\n /** Get version history for a spec. */\n getHistory(specId: string): SpecVersion[] {\n return this.versions.get(specId) ?? [];\n }\n\n /** Get a specific version of a spec. */\n getVersion(specId: string, version: string): SpecVersion | undefined {\n const history = this.versions.get(specId) ?? [];\n return history.find((v) => v.version === version);\n }\n\n /** Get the latest version of a spec. */\n getLatest(specId: string): SpecVersion | undefined {\n const history = this.versions.get(specId) ?? [];\n return history[history.length - 1];\n }\n\n /** Compute diff between two versions of a spec. */\n diff(oldSpec: Specification, newSpec: Specification): SpecDiff {\n const oldReqs = new Map(oldSpec.requirements.map((r) => [r.id, r]));\n const newReqs = new Map(newSpec.requirements.map((r) => [r.id, r]));\n\n const added: SpecRequirement[] = [];\n const removed: SpecRequirement[] = [];\n const modified: SpecDiff['modified'] = [];\n\n // Find added and modified\n for (const [id, newReq] of newReqs) {\n const oldReq = oldReqs.get(id);\n if (!oldReq) {\n added.push(newReq);\n } else {\n const changes = this.compareRequirements(oldReq, newReq);\n if (changes.length > 0) {\n modified.push({\n requirement: newReq,\n previousVersion: oldReq,\n changes,\n });\n }\n }\n }\n\n // Find removed\n for (const [id, oldReq] of oldReqs) {\n if (!newReqs.has(id)) {\n removed.push(oldReq);\n }\n }\n\n const parts: string[] = [];\n if (added.length > 0) parts.push(`${added.length} added`);\n if (removed.length > 0) parts.push(`${removed.length} removed`);\n if (modified.length > 0) parts.push(`${modified.length} modified`);\n\n return {\n added,\n removed,\n modified,\n summary: parts.length > 0 ? parts.join(', ') : 'No changes',\n };\n }\n\n /**\n * Update a task graph incrementally based on spec changes.\n * - Added requirements → new tasks\n * - Removed requirements → remove tasks\n * - Modified requirements → update task descriptions\n * Returns the updated graph and list of changes made.\n */\n updateTaskGraph(\n graph: TaskGraph,\n oldSpec: Specification,\n newSpec: Specification,\n ): { graph: TaskGraph; changes: string[] } {\n const specDiff = this.diff(oldSpec, newSpec);\n const changes: string[] = [];\n\n // Map requirement IDs to task nodes\n const reqToTask = new Map<string, TaskNode>();\n for (const node of graph.nodes.values()) {\n if (node.specRequirementId) {\n reqToTask.set(node.specRequirementId, node);\n }\n }\n\n // Remove tasks for removed requirements\n for (const req of specDiff.removed) {\n const task = reqToTask.get(req.id);\n if (task) {\n graph.nodes.delete(task.id);\n graph.edges = graph.edges.filter((e) => e.from !== task.id && e.to !== task.id);\n changes.push(`Removed task: ${task.title}`);\n }\n }\n\n // Update tasks for modified requirements\n for (const mod of specDiff.modified) {\n const task = reqToTask.get(mod.requirement.id);\n if (task) {\n task.title = mod.requirement.description;\n task.description = this.buildTaskDescription(mod.requirement);\n task.priority = mod.requirement.priority;\n task.updatedAt = Date.now();\n changes.push(`Updated task: ${task.title} (${mod.changes.join(', ')})`);\n }\n }\n\n // Add tasks for new requirements\n for (const req of specDiff.added) {\n const now = Date.now();\n const newTask: TaskNode = {\n id: crypto.randomUUID(),\n title: req.description,\n description: this.buildTaskDescription(req),\n type: this.mapReqType(req.type),\n priority: req.priority,\n status: 'pending',\n specRequirementId: req.id,\n tags: [req.type, req.priority],\n createdAt: now,\n updatedAt: now,\n };\n graph.nodes.set(newTask.id, newTask);\n graph.rootNodes.push(newTask.id);\n changes.push(`Added task: ${newTask.title}`);\n }\n\n graph.updatedAt = Date.now();\n return { graph, changes };\n }\n\n private compareRequirements(old: SpecRequirement, current: SpecRequirement): string[] {\n const changes: string[] = [];\n if (old.description !== current.description) changes.push('description');\n if (old.priority !== current.priority) changes.push('priority');\n if (old.type !== current.type) changes.push('type');\n if (JSON.stringify(old.acceptanceCriteria) !== JSON.stringify(current.acceptanceCriteria)) {\n changes.push('acceptance criteria');\n }\n if (JSON.stringify(old.blockedBy) !== JSON.stringify(current.blockedBy)) {\n changes.push('dependencies');\n }\n return changes;\n }\n\n private buildTaskDescription(req: SpecRequirement): string {\n const lines = [req.description, '', `**Type:** ${req.type}`, `**Priority:** ${req.priority}`];\n if (req.acceptanceCriteria.length > 0) {\n lines.push('', '**Acceptance Criteria:**');\n for (const ac of req.acceptanceCriteria) {\n lines.push(`- ${ac}`);\n }\n }\n return lines.join('\\n');\n }\n\n private mapReqType(type: SpecRequirement['type']): TaskNode['type'] {\n switch (type) {\n case 'functional':\n return 'feature';\n case 'security':\n return 'feature';\n case 'performance':\n return 'feature';\n case 'ux':\n return 'feature';\n default:\n return 'feature';\n }\n }\n}\n","import type { TaskGraph, TaskNode } from '../types/task-graph.js';\nimport type { Specification } from '../types/spec.js';\nimport type { EventBus } from '../kernel/events.js';\nimport type { TaskTracker } from './task-tracker.js';\nimport { TaskFlow } from './task-flow.js';\nimport { analyzeCriticalPath } from './critical-path.js';\n\nexport interface AutoExecutorOptions {\n tracker: TaskTracker;\n events: EventBus;\n /** Maximum concurrent tasks. Defaults to 1 (sequential). */\n maxConcurrent?: number;\n /** Maximum retry attempts for failed tasks. */\n maxRetries?: number;\n /** Custom task executor function. */\n executeTask: (task: TaskNode, context: TaskExecutionContext) => Promise<TaskExecutionResult>;\n /** Called before each task starts. */\n onTaskStart?: (task: TaskNode) => void;\n /** Called after each task completes. */\n onTaskComplete?: (task: TaskNode, result: TaskExecutionResult) => void;\n /** Called when a task fails. */\n onTaskFail?: (task: TaskNode, error: Error, retryCount: number) => void;\n /** Called when all tasks are done or no more can execute. */\n onDone?: (summary: ExecutionSummary) => void;\n}\n\nexport interface TaskExecutionContext {\n /** The spec being implemented. */\n spec: Specification;\n /** The full task graph. */\n graph: TaskGraph;\n /** The current task being executed. */\n task: TaskNode;\n /** Tasks that this task depends on. */\n dependencies: TaskNode[];\n /** Tasks that depend on this task. */\n dependents: TaskNode[];\n /** Retry count for this task (0 = first attempt). */\n retryCount: number;\n}\n\nexport interface TaskExecutionResult {\n success: boolean;\n output?: string;\n error?: string;\n /** If true, the task will be retried. */\n retry?: boolean;\n}\n\nexport interface ExecutionSummary {\n total: number;\n completed: number;\n failed: number;\n skipped: number;\n retried: number;\n duration: number;\n criticalPath: string[];\n}\n\n/**\n * Auto-executor that drives task execution with dependency resolution,\n * retry logic, and critical path awareness.\n */\nexport class AutoExecutor {\n private readonly opts: AutoExecutorOptions;\n private stopped = false;\n private retryMap = new Map<string, number>();\n\n constructor(opts: AutoExecutorOptions) {\n this.opts = opts;\n }\n\n /**\n * Execute all tasks in the graph, respecting dependencies.\n */\n async execute(graph: TaskGraph, spec: Specification): Promise<ExecutionSummary> {\n this.stopped = false;\n this.retryMap.clear();\n const startTime = Date.now();\n\n const critical = analyzeCriticalPath(graph);\n let completed = 0;\n let failed = 0;\n const skipped = 0;\n let retried = 0;\n\n while (!this.stopped) {\n const readyTasks = this.getReadyTasks(graph);\n\n if (readyTasks.length === 0) {\n // Check if all tasks are done\n const allDone = Array.from(graph.nodes.values()).every(\n (n) => n.status === 'completed' || n.status === 'failed',\n );\n if (allDone) break;\n\n // Check for deadlock (all remaining tasks are blocked by failed tasks)\n const hasDeadlock = this.detectDeadlock(graph);\n if (hasDeadlock) break;\n\n break;\n }\n\n // Execute batch\n const batch = readyTasks.slice(0, this.opts.maxConcurrent ?? 1);\n\n const results = await Promise.allSettled(\n batch.map((task) => this.executeTaskWithRetry(task, graph, spec)),\n );\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const task = batch[i];\n if (!result || !task) continue;\n\n if (result.status === 'fulfilled') {\n const { result: execResult, retries } = result.value;\n if (execResult.success) {\n this.opts.tracker.updateNodeStatus(task.id, 'completed');\n completed++;\n if (retries > 0) retried++;\n this.opts.onTaskComplete?.(task, execResult);\n } else if (execResult.retry) {\n retried++;\n // Task will be retried on next iteration\n } else {\n this.opts.tracker.updateNodeStatus(task.id, 'failed', execResult.error);\n failed++;\n }\n } else {\n this.opts.tracker.updateNodeStatus(task.id, 'failed', String(result.reason));\n failed++;\n this.opts.onTaskFail?.(task, result.reason as Error, 0);\n }\n }\n }\n\n const duration = Date.now() - startTime;\n const summary: ExecutionSummary = {\n total: graph.nodes.size,\n completed,\n failed,\n skipped,\n retried,\n duration,\n criticalPath: critical.criticalPath,\n };\n\n this.opts.onDone?.(summary);\n return summary;\n }\n\n /** Stop execution. */\n stop(): void {\n this.stopped = true;\n }\n\n /** Get tasks that are ready to execute (all dependencies completed). */\n private getReadyTasks(graph: TaskGraph): TaskNode[] {\n const ready: TaskNode[] = [];\n\n for (const node of graph.nodes.values()) {\n if (node.status !== 'pending') continue;\n\n // Check if all blockers are completed\n const blockers = graph.edges\n .filter((e) => e.type === 'depends_on' && e.from === node.id)\n .map((e) => graph.nodes.get(e.to))\n .filter(Boolean) as TaskNode[];\n\n const allBlockersDone = blockers.every((b) => b.status === 'completed');\n if (allBlockersDone) {\n ready.push(node);\n }\n }\n\n // Sort by priority\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n ready.sort((a, b) => (priorityOrder[a.priority] ?? 4) - (priorityOrder[b.priority] ?? 4));\n\n return ready;\n }\n\n /** Execute a single task with retry logic. */\n private async executeTaskWithRetry(\n task: TaskNode,\n graph: TaskGraph,\n spec: Specification,\n ): Promise<{ result: TaskExecutionResult; retries: number }> {\n const maxRetries = this.opts.maxRetries ?? 2;\n let retryCount = this.retryMap.get(task.id) ?? 0;\n\n while (retryCount <= maxRetries) {\n this.opts.tracker.updateNodeStatus(task.id, 'in_progress');\n this.opts.onTaskStart?.(task);\n\n const dependencies = this.getTaskDependencies(task.id, graph);\n const dependents = this.getTaskDependents(task.id, graph);\n\n const context: TaskExecutionContext = {\n spec,\n graph,\n task,\n dependencies,\n dependents,\n retryCount,\n };\n\n try {\n const result = await this.opts.executeTask(task, context);\n\n if (result.success) {\n const retriesForTask = this.retryMap.get(task.id) ?? 0;\n this.retryMap.delete(task.id);\n return { result, retries: retriesForTask };\n }\n\n if (result.retry && retryCount < maxRetries) {\n retryCount++;\n this.retryMap.set(task.id, retryCount);\n this.opts.tracker.updateNodeStatus(task.id, 'pending');\n continue;\n }\n\n return { result, retries: retryCount };\n } catch (error) {\n if (retryCount < maxRetries) {\n retryCount++;\n this.retryMap.set(task.id, retryCount);\n this.opts.tracker.updateNodeStatus(task.id, 'pending');\n this.opts.onTaskFail?.(task, error as Error, retryCount);\n continue;\n }\n\n return {\n result: {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n },\n retries: retryCount,\n };\n }\n }\n\n return { result: { success: false, error: 'Max retries exceeded' }, retries: retryCount };\n }\n\n /** Get tasks that this task depends on. */\n private getTaskDependencies(taskId: string, graph: TaskGraph): TaskNode[] {\n return graph.edges\n .filter((e) => e.type === 'depends_on' && e.from === taskId)\n .map((e) => graph.nodes.get(e.to))\n .filter(Boolean) as TaskNode[];\n }\n\n /** Get tasks that depend on this task. */\n private getTaskDependents(taskId: string, graph: TaskGraph): TaskNode[] {\n return graph.edges\n .filter((e) => e.type === 'depends_on' && e.to === taskId)\n .map((e) => graph.nodes.get(e.from))\n .filter(Boolean) as TaskNode[];\n }\n\n /** Detect deadlock: all remaining tasks are blocked by failed tasks. */\n private detectDeadlock(graph: TaskGraph): boolean {\n const remaining = Array.from(graph.nodes.values()).filter(\n (n) => n.status === 'pending' || n.status === 'blocked',\n );\n\n if (remaining.length === 0) return false;\n\n return remaining.every((node) => {\n const blockers = graph.edges\n .filter((e) => e.type === 'depends_on' && e.from === node.id)\n .map((e) => graph.nodes.get(e.to))\n .filter(Boolean) as TaskNode[];\n\n return blockers.some((b) => b.status === 'failed');\n });\n }\n}\n\n/**\n * Create an auto-executor that works with TaskFlow.\n */\nexport function createAutoExecutor(opts: {\n tracker: TaskTracker;\n events: EventBus;\n executeTask: AutoExecutorOptions['executeTask'];\n maxConcurrent?: number;\n maxRetries?: number;\n}): AutoExecutor {\n return new AutoExecutor({\n tracker: opts.tracker,\n events: opts.events,\n executeTask: opts.executeTask,\n maxConcurrent: opts.maxConcurrent,\n maxRetries: opts.maxRetries,\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/atomic-write.ts","../../src/sdd/spec-parser.ts","../../src/sdd/task-generator.ts","../../src/types/task-graph.ts","../../src/sdd/task-tracker.ts","../../src/sdd/task-flow.ts","../../src/sdd/spec-store.ts","../../src/sdd/task-graph-store.ts","../../src/sdd/spec-builder.ts","../../src/sdd/spec-templates.ts","../../src/sdd/task-visualizer.ts","../../src/sdd/critical-path.ts","../../src/sdd/spec-versioning.ts","../../src/sdd/auto-executor.ts"],"names":["stat","path2","fsp","path3","fsp2","path","atomicWrite"],"mappings":";;;;;;;;;;;;;;;AAAA,IAAA,oBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,oBAAA,EAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,SAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AASA,eAAsB,WAAA,CACpB,UAAA,EACA,OAAA,EACA,IAAA,GAA2B,EAAC,EACb;AACf,EAAA,MAAM,GAAA,GAAW,aAAQ,UAAU,CAAA;AACnC,EAAA,MAAS,EAAA,CAAA,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACvC,EAAA,MAAM,GAAA,GAAW,IAAA,CAAA,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAS,cAAS,UAAU,CAAC,CAAA,CAAA,EAAI,WAAA,CAAY,CAAC,CAAA,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA,IAAA,CAAM,CAAA;AAIhG,EAAA,IAAI;AACF,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,MAAS,EAAA,CAAA,SAAA,CAAU,GAAA,EAAK,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,MAAA,EAAQ,CAAA;AAAA,IACpF,CAAA,MAAO;AACL,MAAA,MAAS,aAAU,GAAA,EAAK,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,IACjD;AACA,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,MAAS,EAAA,CAAA,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,GAAG,IAAA,EAAK;AAAA,MAChB,CAAA,SAAE;AACA,QAAA,MAAM,GAAG,KAAA,EAAM;AAAA,MACjB;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAGA,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAMA,KAAAA,GAAO,MAAS,EAAA,CAAA,IAAA,CAAK,UAAU,CAAA;AACrC,MAAA,IAAA,GAAOA,MAAK,IAAA,GAAO,GAAA;AAAA,IACrB,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,GAAO,IAAA,CAAK,IAAA;AAAA,IACd;AACA,IAAA,IAAI,SAAS,KAAA,CAAA,EAAW;AACtB,MAAA,MAAS,EAAA,CAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IAC1B;AACA,IAAA,MAAM,eAAA,CAAgB,KAAK,UAAU,CAAA;AAAA,EACvC,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI;AACF,MAAA,MAAS,UAAO,GAAG,CAAA;AAAA,IACrB,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAEA,eAAsB,UAAU,GAAA,EAA4B;AAC1D,EAAA,MAAS,EAAA,CAAA,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACzC;AAQA,eAAe,eAAA,CAAgB,MAAc,EAAA,EAA2B;AACtE,EAAA,IAAI,OAAA,CAAQ,aAAa,OAAA,EAAS;AAChC,IAAA,MAAS,EAAA,CAAA,MAAA,CAAO,MAAM,EAAE,CAAA;AACxB,IAAA;AAAA,EACF;AACA,EAAA,MAAM,SAAS,CAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,KAAK,GAAG,CAAA;AACpC,EAAA,IAAI,OAAA;AACJ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,IAAI;AACF,MAAA,MAAS,EAAA,CAAA,MAAA,CAAO,MAAM,EAAE,CAAA;AACxB,MAAA;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,GAAU,GAAA;AACV,MAAA,MAAM,OAAQ,GAAA,EAA+B,IAAA;AAC7C,MAAA,IAAI,CAAC,QAAQ,CAAC,sBAAA,CAAuB,IAAI,IAAI,CAAA,IAAK,CAAA,KAAM,MAAA,CAAO,MAAA,EAAQ;AACrE,QAAA,MAAM,GAAA;AAAA,MACR;AACA,MAAA,MAAM,IAAI,QAAQ,CAAC,OAAA,KAAY,WAAW,OAAA,EAAS,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAAA,IAC/D;AAAA,EACF;AACA,EAAA,MAAM,OAAA;AACR;AA1FA,IAmEM,sBAAA;AAnEN,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2BAAA,GAAA;AAmEA,IAAM,sBAAA,uBAA6B,GAAA,CAAI,CAAC,SAAS,OAAA,EAAS,QAAA,EAAU,WAAW,CAAC,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC3DzE,IAAM,aAAN,MAAiB;AAAA,EACtB,MAAM,OAAA,EAAgC;AACpC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAC3C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA;AACnD,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,MACtB,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AAAA,MAC9B,OAAA,EAAS,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAAA,MAClC,MAAA,EAAQ,OAAA;AAAA,MACR,QAAA,EAAU,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAAA,MACpC,QAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEQ,aAAa,KAAA,EAAyB;AAC5C,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,CAAA,GAAI,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AACtC,MAAA,IAAI,CAAA,GAAI,CAAC,CAAA,EAAG,OAAO,EAAE,CAAC,CAAA;AAAA,IACxB;AACA,IAAA,OAAO,wBAAA;AAAA,EACT;AAAA,EAEQ,eAAe,KAAA,EAAyB;AAC9C,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,CAAA,GAAI,+BAAA,CAAgC,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAC1D,MAAA,IAAI,CAAA,GAAI,CAAC,CAAA,EAAG,OAAO,EAAE,CAAC,CAAA;AAAA,IACxB;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,gBAAgB,KAAA,EAAyB;AAC/C,IAAA,MAAM,gBAA0B,EAAC;AACjC,IAAA,IAAI,UAAA,GAAa,KAAA;AACjB,IAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AACvC,QAAA,UAAA,GAAa,IAAA;AACb,QAAA,YAAA,GAAe,IAAA;AACf,QAAA;AAAA,MACF;AACA,MAAA,IAAI,gBAAgB,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AAChD,MAAA,IAAI,UAAA,EAAY,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AAAA,IACzC;AAEA,IAAA,OAAO,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA,CAAE,MAAK,IAAK,sBAAA;AAAA,EAC5C;AAAA,EAEQ,gBAAgB,KAAA,EAAgC;AACtD,IAAA,MAAM,WAA0B,EAAC;AACjC,IAAA,IAAI,cAAA,GAA8C,IAAA;AAClD,IAAA,IAAI,eAAyB,EAAC;AAC9B,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,EAAA,GAAK,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AACxC,MAAA,MAAM,EAAA,GAAK,aAAA,CAAc,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAEzC,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,IAAI,cAAA,IAAkB,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAC7C,UAAA,QAAA,CAAS,IAAA,CAAK;AAAA,YACZ,IAAA,EAAM,IAAA,CAAK,cAAA,CAAe,cAAA,CAAe,SAAS,SAAS,CAAA;AAAA,YAC3D,KAAA,EAAO,eAAe,KAAA,IAAS,SAAA;AAAA,YAC/B,KAAA,EAAO,KAAA;AAAA,YACP,OAAA,EAAS,YAAA,CAAa,IAAA,CAAK,IAAI,EAAE,IAAA;AAAK,WACvC,CAAA;AAAA,QACH;AACA,QAAA,cAAA,GAAiB,EAAE,KAAA,EAAO,EAAA,CAAG,CAAC,KAAK,SAAA,EAAU;AAC7C,QAAA,YAAA,GAAe,EAAC;AAChB,QAAA,KAAA,GAAQ,CAAA;AACR,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AACtB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,MACxB;AAAA,IACF;AAEA,IAAA,IAAI,cAAA,IAAkB,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAC7C,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAA,EAAM,IAAA,CAAK,cAAA,CAAe,cAAA,CAAe,SAAS,SAAS,CAAA;AAAA,QAC3D,KAAA,EAAO,eAAe,KAAA,IAAS,SAAA;AAAA,QAC/B,KAAA,EAAO,KAAA;AAAA,QACP,OAAA,EAAS,YAAA,CAAa,IAAA,CAAK,IAAI,EAAE,IAAA;AAAK,OACvC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,oBAAoB,KAAA,EAAoC;AAC9D,IAAA,MAAM,eAAkC,EAAC;AACzC,IAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,qBAAA,CAAsB,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AAC3C,QAAA,cAAA,GAAiB,IAAA;AACjB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,kBAAkB,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AAElD,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,MAAM,MAAM,IAAA,CAAK,oBAAA,CAAqB,MAAM,CAAA,IAAA,EAAO,EAAE,SAAS,CAAA,CAAE,CAAA;AAChE,QAAA,IAAI,GAAA,EAAK,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA;AAAA,MAChC;AAAA,IACF;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEQ,oBAAA,CAAqB,MAAc,EAAA,EAAoC;AAC7E,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,UAAA,CAAW,GAAG,GAAG,OAAO,IAAA;AAEhD,IAAA,MAAM,KAAA,GAAQ,QAAQ,WAAA,EAAY;AAClC,IAAA,MAAM,KAAA,GAAmC;AAAA,MACvC,YAAA;AAAA,MACA,gBAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,IAAA,GAAgC,YAAA;AACpC,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAI,MAAM,QAAA,CAAS,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,GAAG,IAAA,GAAO,CAAA;AAAA,IACvC;AAEA,IAAA,IAAI,QAAA,GAAwC,QAAA;AAC5C,IAAA,IAAI,QAAQ,QAAA,CAAS,YAAY,KAAK,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA,EAAG;AACrE,MAAA,QAAA,GAAW,UAAA;AAAA,IACb,CAAA,MAAA,IAAW,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,EAAG;AACrC,MAAA,QAAA,GAAW,MAAA;AAAA,IACb,CAAA,MAAA,IAAW,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AACpC,MAAA,QAAA,GAAW,KAAA;AAAA,IACb;AAEA,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA,MACA,aAAa,OAAA,CAAQ,OAAA,CAAQ,aAAA,EAAe,EAAE,EAAE,IAAA,EAAK;AAAA,MACrD,oBAAoB;AAAC,KACvB;AAAA,EACF;AAAA,EAEQ,eAAe,KAAA,EAAoC;AACzD,IAAA,MAAM,CAAA,GAAI,MAAM,WAAA,EAAY;AAC5B,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,UAAU,CAAA,EAAG,OAAO,UAAA;AACnC,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,aAAa,CAAA,EAAG,OAAO,cAAA;AACtC,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,cAAA;AACpC,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAC9B,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,MAAA;AAC/B,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,UAAU,CAAA,EAAG,OAAO,UAAA;AACnC,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,YAAY,CAAA,EAAG,OAAO,YAAA;AACrC,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,QAAQ,IAAA,EAAmC;AACzC,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,MAAM,QAA+B,EAAC;AAGtC,IAAA,MAAM,WAAA,GAAc,KAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,UAAU,CAAA;AACnE,IAAA,MAAM,eAAA,GAAkB,KAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,cAAc,CAAA;AAC3E,IAAA,MAAM,aAAA,GAAgB,KAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,YAAY,CAAA;AAEvE,IAAA,IAAI,CAAC,WAAA,EAAa,IAAA,CAAK,IAAA,CAAK,0BAA0B,CAAA;AACtD,IAAA,IAAI,CAAC,eAAA,EAAiB,IAAA,CAAK,IAAA,CAAK,8BAA8B,CAAA;AAC9D,IAAA,IAAI,CAAC,aAAA,EAAe,IAAA,CAAK,IAAA,CAAK,qCAAqC,CAAA;AAEnE,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,KAAK,yBAAyB,CAAA;AACnC,MAAA,WAAA,CAAY,KAAK,yDAAyD,CAAA;AAAA,IAC5E;AAEA,IAAA,MAAM,cAAA,GAAiB,KAAK,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,kBAAA,CAAmB,MAAA,KAAW,CAAC,CAAA;AACxF,IAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,EAAG,cAAA,CAAe,MAAM,CAAA,yCAAA,CAA2C,CAAA;AAC7E,MAAA,WAAA,CAAY,KAAK,uDAAuD,CAAA;AAAA,IAC1E;AAEA,IAAA,MAAM,kBAAA,GAAqB,KAAK,YAAA,CAAa,MAAA;AAAA,MAC3C,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,cAAc,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,SAAA,CAAU,MAAA,GAAS;AAAA,KAC1E;AACA,IAAA,KAAA,MAAW,OAAO,kBAAA,EAAoB;AACpC,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,aAAa,GAAA,CAAI,EAAA;AAAA,QACjB,IAAA,EAAM,CAAA,gCAAA,EAAmC,GAAA,CAAI,SAAA,EAAW,MAAM,CAAA,mBAAA,CAAA;AAAA,QAC9D,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,eAAe,IAAA,CAAK,KAAA;AAAA,MAAA,CAAA,CACrB,WAAA,GAAc,IAAI,CAAA,KAClB,eAAA,GAAkB,IAAI,CAAA,CAAA,IACtB,aAAA,GAAgB,IAAI,CAAA,CAAA,IACpB,IAAA,CAAK,aAAa,MAAA,GAAS,CAAA,GAAI,IAAI,CAAA,CAAA,IACnC,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA,IAChC,CAAA,GACA;AAAA,KACJ;AAEA,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,YAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACR,YAAA,EAAc,KAAK,YAAA,CAAa,MAAA;AAAA,QAChC,YAAA,EAAc,IAAA,CAAK,YAAA,EAAc,MAAA,IAAU,CAAA;AAAA,QAC3C,SAAA,EAAW,CAAA;AAAA,QACX,aAAA,EAAe;AAAA,OACjB;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,SAAS,IAAA,EAA2C;AAClD,IAAA,MAAM,SAAyC,EAAC;AAChD,IAAA,MAAM,WAA6C,EAAC;AAEpD,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,EAAG;AACtB,MAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,qBAAqB,CAAA;AAAA,IAC7D;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAK,EAAG;AACxB,MAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,uBAAuB,CAAA;AAAA,IACjE;AAEA,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,YAAA,EAAc;AACnC,MAAA,IAAI,CAAC,GAAA,CAAI,WAAA,CAAY,IAAA,EAAK,EAAG;AAC3B,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,YAAA,EAAe,IAAI,EAAE,CAAA,CAAA,EAAI,OAAA,EAAS,kCAAA,EAAoC,CAAA;AAAA,MAC5F;AACA,MAAA,IAAI,GAAA,CAAI,kBAAA,CAAmB,MAAA,KAAW,CAAA,EAAG;AACvC,QAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,YAAA,EAAe,IAAI,EAAE,CAAA,CAAA,EAAI,OAAA,EAAS,gCAAA,EAAkC,CAAA;AAAA,MAC5F;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AACzD,IAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,IAAa,EAAE,CAAC,CAAA;AAChF,IAAA,KAAA,MAAW,MAAM,YAAA,EAAc;AAC7B,MAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,EAAG;AACnB,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,cAAA;AAAA,UACN,OAAA,EAAS,kDAAkD,EAAE,CAAA;AAAA,SAC9D,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,MACzB,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;;;AClQO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,IAAA,EAA4B;AAA5B,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAA6B;AAAA,EAA7B,IAAA;AAAA,EAE7B,MAAM,iBAAiB,IAAA,EAAyC;AAC9D,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,CAAK,YAAY,WAAA,CAAY,IAAA,CAAK,EAAA,EAAI,IAAA,CAAK,KAAK,CAAA;AAEzE,IAAA,MAAM,QAAA,GAAW,KAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,UAAU,CAAA;AAChE,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,IAAA,CAAK,YAAY,OAAA,CAAQ;AAAA,QAC5B,KAAA,EAAO,CAAA,UAAA,EAAa,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,QAC9B,aAAa,QAAA,CAAS,OAAA;AAAA,QACtB,IAAA,EAAM,SAAA;AAAA,QACN,QAAA,EAAU,MAAA;AAAA,QACV,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,UAAA,GAAsD;AAAA,MAC1D,UAAU,EAAC;AAAA,MACX,MAAM,EAAC;AAAA,MACP,QAAQ,EAAC;AAAA,MACT,KAAK;AAAC,KACR;AACA,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,YAAA,EAAc;AACnC,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,QAAQ,KAAK,UAAA,CAAW,MAAA;AACtD,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IACjB;AAEA,IAAA,MAAM,KAAA,GAAwB,CAAC,UAAA,EAAY,MAAA,EAAQ,UAAU,KAAK,CAAA;AAClE,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,KAAA,MAAW,GAAA,IAAO,UAAA,CAAW,CAAC,CAAA,EAAG;AAC/B,QAAA,IAAA,CAAK,KAAK,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,yBAAA,CAA0B,GAAG,CAAC,CAAA;AAAA,MACnE;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA,EAAG;AACrD,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ;AAAA,QAC9C,KAAA,EAAO,oBAAA;AAAA,QACP,WAAA,EAAa,CAAA,UAAA,EAAa,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA,cAAA,CAAA;AAAA,QAClD,IAAA,EAAM,SAAA;AAAA,QACN,QAAA,EAAU,MAAA;AAAA,QACV,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,KAAA,MAAW,QAAA,IAAY,KAAK,YAAA,EAAc;AACxC,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,sBAAA,CAAuB,QAAQ,CAAA;AACjD,QAAA,IAAA,CAAK,IAAA,CAAK,YAAY,OAAA,CAAQ;AAAA,UAC5B,GAAG,IAAA;AAAA,UACH,UAAU,SAAA,CAAU;AAAA,SACrB,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,OAAA,CAAQ;AAAA,MAC5B,KAAA,EAAO,aAAA;AAAA,MACP,WAAA,EAAa,8CAAA;AAAA,MACb,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,MAAA;AAAA,MACV,MAAA,EAAQ;AAAA,KACT,CAAA;AAGD,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,OAAA,CAAQ;AAAA,MAC5B,KAAA,EAAO,sBAAA;AAAA,MACP,WAAA,EAAa,8BAAA;AAAA,MACb,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,QAAA;AAAA,MACV,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,0BACN,GAAA,EACkD;AAClD,IAAA,OAAO;AAAA,MACL,OAAO,GAAA,CAAI,WAAA;AAAA,MACX,WAAA,EAAa,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAA;AAAA,MACtC,IAAA,EAAM,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,IAAI,CAAA;AAAA,MACtC,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,MAAA,EAAQ,SAAA;AAAA,MACR,mBAAmB,GAAA,CAAI,EAAA;AAAA,MACvB,IAAA,EAAM,CAAC,GAAA,CAAI,IAAA,EAAM,IAAI,QAAQ,CAAA;AAAA,MAC7B,aAAA,EAAe,IAAA,CAAK,aAAA,CAAc,GAAG;AAAA,KACvC;AAAA,EACF;AAAA,EAEQ,uBACN,QAAA,EACkD;AAClD,IAAA,OAAO;AAAA,MACL,OAAO,CAAA,EAAG,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,IAAI,CAAA,CAAA;AAAA,MAC1C,aAAa,QAAA,CAAS,WAAA;AAAA,MACtB,IAAA,EAAM,SAAA;AAAA,MACN,QAAA,EAAU,MAAA;AAAA,MACV,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,CAAC,QAAA,CAAS,MAAM,CAAA;AAAA,MACtB,aAAA,EAAe,IAAA,CAAK,mBAAA,CAAoB,QAAQ;AAAA,KAClD;AAAA,EACF;AAAA,EAEQ,iBAAiB,GAAA,EAA8B;AACrD,IAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,CAAI,WAAA,EAAa,EAAA,EAAI,eAAe,GAAA,CAAI,IAAA,EAAM,gBAAA,GAAmB,GAAA,CAAI,QAAQ,CAAA;AAE5F,IAAA,IAAI,GAAA,CAAI,kBAAA,CAAmB,MAAA,GAAS,CAAA,EAAG;AACrC,MAAA,KAAA,CAAM,IAAA,CAAK,IAAI,0BAA0B,CAAA;AACzC,MAAA,KAAA,MAAW,SAAA,IAAa,IAAI,kBAAA,EAAoB;AAC9C,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,CAAA;AAAA,MAC7B;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AAC7C,MAAA,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,gBAAA,EAAmB,GAAA,CAAI,UAAU,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC9D;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA,EAEQ,mBAAmB,IAAA,EAAyC;AAClE,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,YAAA;AACH,QAAA,OAAO,SAAA;AAAA,MACT,KAAK,gBAAA;AACH,QAAA,OAAO,SAAA;AAAA,MACT,KAAK,UAAA;AACH,QAAA,OAAO,SAAA;AAAA,MACT,KAAK,aAAA;AACH,QAAA,OAAO,SAAA;AAAA,MACT,KAAK,IAAA;AACH,QAAA,OAAO,SAAA;AAAA,MACT;AACE,QAAA,OAAO,SAAA;AAAA;AACX,EACF;AAAA,EAEQ,cAAc,GAAA,EAA8B;AAClD,IAAA,QAAQ,IAAI,QAAA;AAAU,MACpB,KAAK,UAAA;AACH,QAAA,OAAO,CAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,CAAA;AAAA,MACT,KAAK,QAAA;AACH,QAAA,OAAO,CAAA;AAAA,MACT,KAAK,KAAA;AACH,QAAA,OAAO,CAAA;AAAA,MACT;AACE,QAAA,OAAO,CAAA;AAAA;AACX,EACF;AAAA,EAEQ,oBACN,QAAA,EACQ;AACR,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,QAAA,CAAS,MAAM,KAAA,IAAS,CAAA;AAC5B,IAAA,IAAI,QAAA,CAAS,SAAS,KAAA,IAAS,CAAA;AAC/B,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,gBAAA,CAAiB,YAAA,EAAsB,IAAA,EAAoC;AAC/E,IAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,YAAY,CAAA,EAAG,iBAAA;AAC3D,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,GAAA,GAAM,KAAK,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AACxD,IAAA,IAAI,CAAC,GAAA,EAAK;AAEV,IAAA,IAAI,GAAA,CAAI,kBAAA,CAAmB,MAAA,GAAS,CAAA,EAAG;AACrC,MAAA,KAAA,MAAW,SAAA,IAAa,IAAI,kBAAA,EAAoB;AAC9C,QAAA,IAAA,CAAK,IAAA,CAAK,YAAY,OAAA,CAAQ;AAAA,UAC5B,KAAA,EAAO,SAAA;AAAA,UACP,WAAA,EAAa,WAAW,SAAS,CAAA,CAAA;AAAA,UACjC,IAAA,EAAM,MAAA;AAAA,UACN,QAAA,EAAU,QAAA;AAAA,UACV,MAAA,EAAQ,SAAA;AAAA,UACR,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,mBAAN,MAA4C;AAAA,EACzC,MAAA,uBAAa,GAAA,EAAuB;AAAA,EAE5C,MAAM,UAAU,KAAA,EAAiC;AAC/C,IAAA,IAAA,CAAK,OAAO,GAAA,CAAI,KAAA,CAAM,IAAI,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,EAClD;AAAA,EAEA,MAAM,UAAU,EAAA,EAAuC;AACrD,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAC5B,IAAA,OAAO,CAAA,GAAI,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,GAAI,IAAA;AAAA,EAClC;AAAA,EAEA,MAAM,UAAA,GAA0E;AAC9E,IAAA,OAAO,KAAA,CAAM,KAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAClD,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,WAAW,CAAA,CAAE;AAAA,KACf,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAM,YAAY,EAAA,EAA2B;AAC3C,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,EAAE,CAAA;AAAA,EACvB;AAAA,EAEQ,WAAW,CAAA,EAAyB;AAC1C,IAAA,OAAO;AAAA,MACL,GAAG,CAAA;AAAA,MACH,KAAA,EAAO,IAAI,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA;AAAA,MACtB,KAAA,EAAO,CAAC,GAAG,CAAA,CAAE,KAAK,CAAA;AAAA,MAClB,SAAA,EAAW,CAAC,GAAG,CAAA,CAAE,SAAS;AAAA,KAC5B;AAAA,EACF;AACF;;;ACnJO,SAAS,oBAAoB,KAAA,EAAgC;AAClE,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,MAAA,EAAO,EAAG;AACpC,IAAA,QAAQ,EAAE,MAAA;AAAQ,MAChB,KAAK,WAAA;AACH,QAAA,SAAA,EAAA;AACA,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,OAAA,EAAA;AACA,QAAA;AAAA,MACF,KAAK,aAAA;AACH,QAAA,UAAA,EAAA;AACA,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,OAAA,EAAA;AACA,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,MAAA,EAAA;AACA,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,MAAA,EAAA;AACA,QAAA;AAAA;AAEJ,IAAA,cAAA,IAAkB,EAAE,aAAA,IAAiB,CAAA;AACrC,IAAA,WAAA,IAAe,EAAE,WAAA,IAAe,CAAA;AAAA,EAClC;AACA,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,IAAA;AAE1B,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA,EAAiB,QAAQ,CAAA,GAAI,IAAA,CAAK,MAAO,SAAA,GAAY,KAAA,GAAS,GAAG,CAAA,GAAI,CAAA;AAAA,IACrE,cAAA;AAAA,IACA;AAAA,GACF;AACF;AAkBO,SAAS,gBAAgB,KAAA,EAA4B;AAC1D,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,SAAS,MAAM,EAAA,EAAkB;AAE/B,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,EAAG;AACrB,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,EAAG;AACrB,IAAA,IAAI,CAAC,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA,EAAG;AAE1B,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,EAAA,EAAI,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,IACrC;AAEA,IAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AACjB,IAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AAAA,EAChB;AAEA,EAAA,KAAA,MAAW,MAAA,IAAU,MAAM,SAAA,EAAW;AACpC,IAAA,KAAA,CAAM,MAAM,CAAA;AAAA,EACd;AAEA,EAAA,OAAO,MAAA;AACT;;;AClJO,IAAM,cAAN,MAAkB;AAAA,EAIvB,YAA6B,IAAA,EAA0B;AAA1B,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAA2B;AAAA,EAA3B,IAAA;AAAA,EAHrB,KAAA,GAA0B,IAAA;AAAA,EAC1B,cAAgC,EAAC;AAAA,EAIzC,MAAM,WAAA,CAAY,MAAA,EAAgB,KAAA,EAAmC;AACnE,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,MACtB,MAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA,sBAAW,GAAA,EAAI;AAAA,MACf,OAAO,EAAC;AAAA,MACR,WAAW,EAAC;AAAA,MACZ,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AACA,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAK,KAAK,CAAA;AAC1C,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,MAAM,UAAU,EAAA,EAAuC;AACrD,IAAA,IAAA,CAAK,QAAQ,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,UAAU,EAAE,CAAA;AAC/C,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,QAAQ,IAAA,EAAkE;AACxE,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAElD,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,OAAA,GAAoB;AAAA,MACxB,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,MACtB,MAAA,EAAQ,KAAK,MAAA,IAAU,SAAA;AAAA,MACvB,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,IAAI,OAAO,CAAA;AAExC,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAA;AAAA,IACtC;AAEA,IAAA,IAAA,CAAK,MAAM,SAAA,GAAY,GAAA;AACvB,IAAA,IAAA,CAAK,OAAA,EAAQ;AAEb,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,IAAA,EAAc,EAAA,EAAY,IAAA,GAAsC,YAAA,EAAoB;AAC1F,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAElD,IAAA,IAAA,CAAK,KAAA,CAAM,MAAM,IAAA,CAAK;AAAA,MACpB,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,MACtB,IAAA;AAAA,MACA,EAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI;AAChC,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA,EAEA,gBAAA,CAAiB,EAAA,EAAY,MAAA,EAA4B,MAAA,EAAuB;AAC9E,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAElD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,EAAE,CAAA;AACpC,IAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,EAAE,CAAA,UAAA,CAAY,CAAA;AAEjD,IAAA,MAAM,OAAO,IAAA,CAAK,MAAA;AAClB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,GAAA;AAEjB,IAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,MAAA,IAAA,CAAK,WAAA,GAAc,GAAA;AAAA,IACrB;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,EAAE,IAAA,EAAM,IAAI,MAAA,EAAQ,SAAA,EAAW,GAAA,EAAK,MAAA,EAAQ,CAAA;AAGlE,IAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,MAAA,IAAA,CAAK,kBAAkB,EAAE,CAAA;AAAA,IAC3B;AAGA,IAAA,IAAI,WAAW,aAAA,EAAe;AAC5B,MAAA,IAAA,CAAK,sBAAsB,EAAE,CAAA;AAAA,IAC/B;AAEA,IAAA,IAAA,CAAK,MAAM,SAAA,GAAY,GAAA;AACvB,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA,EAEA,QAAQ,EAAA,EAAkC;AACxC,IAAA,OAAO,IAAA,CAAK,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAAA,EACjC;AAAA,EAEA,WAAA,CAAY,QAAqB,IAAA,EAA6B;AAC5D,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,OAAO,EAAC;AAEzB,IAAA,IAAI,QAAQ,KAAA,CAAM,IAAA,CAAK,KAAK,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA;AAEhD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM;AAC1B,QAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,MAAA,IAAU,CAAC,MAAA,CAAO,OAAO,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG,OAAO,KAAA;AACvE,QAAA,IAAI,MAAA,CAAO,QAAA,EAAU,MAAA,IAAU,CAAC,MAAA,CAAO,SAAS,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA,EAAG,OAAO,KAAA;AAC7E,QAAA,IAAI,MAAA,CAAO,IAAA,EAAM,MAAA,IAAU,CAAC,MAAA,CAAO,KAAK,QAAA,CAAS,CAAA,CAAE,IAAI,CAAA,EAAG,OAAO,KAAA;AACjE,QAAA,IAAI,MAAA,CAAO,QAAA,EAAU,MAAA,IAAU,CAAA,CAAE,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAC/E,UAAA,OAAO,KAAA;AACT,QAAA,IAAI,MAAA,CAAO,IAAA,EAAM,MAAA,IAAU,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,MAAA,CAAO,IAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAA;AAC/E,UAAA,OAAO,KAAA;AACT,QAAA,IAAI,MAAA,CAAO,iBAAA,IAAqB,CAAA,CAAE,iBAAA,KAAsB,MAAA,CAAO,iBAAA;AAC7D,UAAA,OAAO,KAAA;AACT,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACnB,QAAA,MAAM,GAAA,GAAM,cAAA,CAAe,CAAA,EAAG,CAAA,EAAG,KAAK,KAAK,CAAA;AAC3C,QAAA,OAAO,IAAA,CAAK,SAAA,KAAc,KAAA,GAAQ,GAAA,GAAM,CAAC,GAAA;AAAA,MAC3C,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,YAAY,QAAA,EAA8B;AACxC,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,OAAO,EAAC;AACzB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,QAAQ,CAAA;AAAA,EACpF;AAAA,EAEA,cAAc,MAAA,EAA0B;AACtC,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,OAAO,EAAC;AACzB,IAAA,OAAO,KAAK,KAAA,CAAM,KAAA,CACf,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,SAAS,YAAY,CAAA,CAC1D,IAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAAA,EACpB;AAAA,EAEA,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,OAAO,EAAC;AACzB,IAAA,OAAO,KAAK,KAAA,CAAM,KAAA,CACf,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,MAAA,IAAU,CAAA,CAAE,SAAS,YAAY,CAAA,CACxD,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,EACtB;AAAA,EAEA,SAAS,MAAA,EAAyB;AAChC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AACxC,IAAA,OAAO,QAAA,CAAS,KAAA,CAAM,CAAC,EAAA,KAAO;AAC5B,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,EAAO,KAAA,CAAM,IAAI,EAAE,CAAA;AACrC,MAAA,OAAO,MAAM,MAAA,KAAW,WAAA;AAAA,IAC1B,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,WAAA,GAA4B;AAC1B,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,CAAA;AAAA,QACP,OAAA,EAAS,CAAA;AAAA,QACT,UAAA,EAAY,CAAA;AAAA,QACZ,OAAA,EAAS,CAAA;AAAA,QACT,MAAA,EAAQ,CAAA;AAAA,QACR,MAAA,EAAQ,CAAA;AAAA,QACR,SAAA,EAAW,CAAA;AAAA,QACX,eAAA,EAAiB,CAAA;AAAA,QACjB,cAAA,EAAgB,CAAA;AAAA,QAChB,WAAA,EAAa;AAAA,OACf;AAAA,IACF;AACA,IAAA,OAAO,mBAAA,CAAoB,KAAK,KAAK,CAAA;AAAA,EACvC;AAAA,EAEA,eAAe,MAAA,EAAmC;AAChD,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,CAAC,GAAG,KAAK,WAAW,CAAA;AAExC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,WAAW,CAAA;AAAA,EAC7B;AAAA,EAEQ,kBAAkB,WAAA,EAA2B;AACnD,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA;AACjD,IAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,KAAK,CAAA;AACtC,MAAA,IAAI,GAAA,EAAK,WAAW,SAAA,EAAW;AAC7B,QAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA;AAChD,QAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,KAAA,CAAM,CAAC,EAAA,KAAO;AACnD,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,EAAO,KAAA,CAAM,IAAI,EAAE,CAAA;AACxC,UAAA,OAAO,SAAS,MAAA,KAAW,WAAA;AAAA,QAC7B,CAAC,CAAA;AACD,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,GAAA,CAAI,MAAA,GAAS,SAAA;AACb,UAAA,GAAA,CAAI,SAAA,GAAY,KAAK,GAAA,EAAI;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,sBAAsB,MAAA,EAAsB;AAClD,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACjB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AACxC,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,IAAA,CAAK,CAAC,EAAA,KAAO;AACxC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,EAAO,KAAA,CAAM,IAAI,EAAE,CAAA;AACxC,MAAA,OAAO,SAAS,MAAA,KAAW,WAAA;AAAA,IAC7B,CAAC,CAAA;AACD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,MAAM,CAAA;AACxC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,QAAA,IAAA,CAAK,SAAA,GAAY,KAAK,GAAA,EAAI;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,OAAA,GAAgB;AACtB,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACjB,IAAA,IAAA,CAAK,IAAA,CAAK,MAAM,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AACnD,MAAA,IAAI,KAAK,IAAA,CAAK,cAAA,EAAgB,IAAA,CAAK,IAAA,CAAK,eAAe,GAAG,CAAA;AAAA;AAExD,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,kCAAA;AAAA,UACA,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,SACjD;AAAA,IACJ,CAAC,CAAA;AAAA,EACH;AACF;AAEA,IAAM,aAAA,GAAsD;AAAA,EAC1D,QAAA,EAAU,CAAA;AAAA,EACV,IAAA,EAAM,CAAA;AAAA,EACN,MAAA,EAAQ,CAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AACA,IAAM,WAAA,GAAkD;AAAA,EACtD,WAAA,EAAa,CAAA;AAAA,EACb,OAAA,EAAS,CAAA;AAAA,EACT,MAAA,EAAQ,CAAA;AAAA,EACR,OAAA,EAAS,CAAA;AAAA,EACT,MAAA,EAAQ,CAAA;AAAA,EACR,SAAA,EAAW;AACb,CAAA;AAEA,SAAS,cAAA,CAAe,CAAA,EAAa,CAAA,EAAa,KAAA,EAAkC;AAClF,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,UAAA;AACH,MAAA,OAAO,cAAc,CAAA,CAAE,QAAQ,CAAA,GAAI,aAAA,CAAc,EAAE,QAAQ,CAAA;AAAA,IAC7D,KAAK,QAAA;AACH,MAAA,OAAO,YAAY,CAAA,CAAE,MAAM,CAAA,GAAI,WAAA,CAAY,EAAE,MAAM,CAAA;AAAA,IACrD,KAAK,WAAA;AACH,MAAA,OAAO,CAAA,CAAE,YAAY,CAAA,CAAE,SAAA;AAAA,IACzB,KAAK,WAAA;AACH,MAAA,OAAO,CAAA,CAAE,YAAY,CAAA,CAAE,SAAA;AAAA;AAE7B;;;ACnPO,IAAM,WAAN,MAAe;AAAA,EAMpB,YAA6B,IAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAC3B,IAAA,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,EACtB;AAAA,EAF6B,IAAA;AAAA,EALrB,KAAA,GAAuB,MAAA;AAAA,EACvB,IAAA,GAA6B,IAAA;AAAA,EAC7B,KAAA,GAA0B,IAAA;AAAA,EAC1B,OAAA,GAAU,KAAA;AAAA,EAMV,IAAA,CAAkC,OAAU,OAAA,EAAoC;AACtF,IAAC,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,IAAA,CAAmD,OAAO,OAAO,CAAA;AAAA,EACrF;AAAA,EAEA,MAAM,SAAS,WAAA,EAAyC;AACtD,IAAA,IAAA,CAAK,SAAS,SAAS,CAAA;AAEvB,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,IAAA,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AAEpC,IAAA,IAAA,CAAK,SAAS,WAAW,CAAA;AACzB,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AACzC,IAAA,IAAA,CAAK,IAAA,CAAK,eAAA,EAAiB,EAAE,QAAA,EAAU,CAAA;AAEvC,IAAA,IAAI,QAAA,CAAS,eAAe,EAAA,EAAI;AAC9B,MAAA,IAAA,CAAK,KAAK,OAAA,EAAS;AAAA,QACjB,KAAA,EAAO,WAAA;AAAA,QACP,OAAO,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,QAAA,CAAS,YAAY,CAAA,CAAA,CAAG;AAAA,OACxE,CAAA;AACD,MAAA,IAAA,CAAK,SAAS,QAAQ,CAAA;AACtB,MAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,IACvC;AAEA,IAAA,IAAA,CAAK,SAAS,YAAY,CAAA;AAC1B,IAAA,MAAM,SAAA,GAAY,IAAI,aAAA,CAAc,EAAE,aAAa,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AACtE,IAAA,IAAA,CAAK,KAAA,GAAQ,MAAM,SAAA,CAAU,gBAAA,CAAiB,KAAK,IAAI,CAAA;AAEvD,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,MAAM,QAAQ,GAAA,EAAmD;AAC/D,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAExE,IAAA,IAAA,CAAK,SAAS,WAAW,CAAA;AACzB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAEf,IAAA,MAAM,YAAA,GAAe,KAAK,kBAAA,EAAmB;AAC7C,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,IAAA,CAAK,aAAA,IAAiB,CAAA;AAEjD,IAAA,OAAO,YAAA,CAAa,MAAA,GAAS,CAAA,IAAK,CAAC,KAAK,OAAA,EAAS;AAC/C,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,MAAA,CAAO,CAAA,EAAG,aAAa,CAAA;AAClD,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA;AAAA,QAC5B,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,KAAK,iBAAA,CAAkB,IAAA,EAAM,GAAG,CAAC;AAAA,OACvD;AAEA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,QAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,QAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AAEpB,QAAA,IAAI,CAAC,MAAA,IAAU,CAAC,IAAA,EAAM;AAEtB,QAAA,IAAI,MAAA,CAAO,WAAW,UAAA,EAAY;AAChC,UAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,UAAA,IAAA,CAAK,KAAK,OAAA,CAAQ,gBAAA,CAAiB,KAAK,EAAA,EAAI,QAAA,EAAU,QAAQ,OAAO,CAAA;AACrE,UAAA,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,EAAE,MAAA,EAAQ,IAAA,CAAK,IAAI,KAAA,EAAO,MAAA,EAAQ,OAAA,IAAW,SAAA,EAAW,CAAA;AACjF,UAAA,GAAA,CAAI,UAAA,GAAa,MAAM,MAAe,CAAA;AAAA,QACxC,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,IAAA,CAAK,IAAI,WAAW,CAAA;AACvD,UAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,EAAE,MAAA,EAAQ,KAAK,EAAA,EAAI,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,CAAA;AACrE,UAAA,GAAA,CAAI,cAAA,GAAiB,IAAA,EAAM,MAAA,CAAO,KAAK,CAAA;AAAA,QACzC;AAEA,QAAA,IAAA,CAAK,YAAA,EAAa;AAAA,MACpB;AAGA,MAAA,MAAM,YAAA,GAAe,KAAK,kBAAA,EAAmB;AAC7C,MAAA,YAAA,CAAa,MAAA,GAAS,CAAA;AACtB,MAAA,YAAA,CAAa,IAAA,CAAK,GAAG,YAAY,CAAA;AAGjC,MAAA,IAAI,IAAA,CAAK,oBAAmB,EAAG;AAC7B,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,SAAS,YAAY,CAAA;AAC1B,IAAA,IAAA,CAAK,KAAK,MAAA,EAAQ,EAAE,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AACvC,IAAA,IAAA,CAAK,SAAS,MAAM,CAAA;AAEpB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,MAAM,UAAA,CAAW,MAAA,EAAgB,QAAA,EAAmB,OAAA,EAAiC;AACnF,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,MAAM,CAAA;AAC7C,IAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,MAAM,CAAA,UAAA,CAAY,CAAA;AAErD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,MAAA,EAAQ,aAAa,OAAO,CAAA;AAC/D,MAAA,IAAA,CAAK,IAAA,CAAK,gBAAA,EAAkB,EAAE,MAAA,EAAQ,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,KAAK,OAAA,CAAQ,gBAAA,CAAiB,MAAA,EAAQ,aAAA,EAAe,WAAW,gBAAgB,CAAA;AACrF,MAAA,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,EAAE,MAAA,EAAQ,CAAA;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AAAA,EAEA,QAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,QAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,OAAA,GAAgC;AAC9B,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA,EAEQ,SAAS,KAAA,EAA4B;AAC3C,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,KAAK,cAAA,EAAgB,EAAE,IAAA,EAAM,EAAA,EAAI,OAAO,CAAA;AAAA,EAC/C;AAAA,EAEQ,kBAAA,GAAiC;AACvC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CACd,WAAA,CAAY,EAAE,MAAA,EAAQ,CAAC,SAAA,EAAW,SAAS,CAAA,EAAG,CAAA,CAC9C,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,SAAA,IAAa,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,CAAA,CAAE,EAAE,CAAC,CAAA,CACxE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACd,MAAA,MAAM,aAAA,GAAgB,EAAE,QAAA,EAAU,CAAA,EAAG,MAAM,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AAChE,MAAA,OAAA,CAAQ,aAAA,CAAc,EAAE,QAAQ,CAAA,IAAK,MAAM,aAAA,CAAc,CAAA,CAAE,QAAQ,CAAA,IAAK,CAAA,CAAA;AAAA,IAC1E,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAc,iBAAA,CAAkB,IAAA,EAAgB,GAAA,EAAiD;AAC/F,IAAA,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,IAAA,CAAK,IAAI,aAAa,CAAA;AACzD,IAAA,IAAA,CAAK,KAAK,cAAA,EAAgB,EAAE,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA;AAC7C,IAAA,OAAO,GAAA,CAAI,YAAY,IAAI,CAAA;AAAA,EAC7B;AAAA,EAEQ,kBAAA,GAA8B;AACpC,IAAA,MAAM,SAAA,GAAY,KAAK,IAAA,CAAK,aAAA;AAC5B,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAC/C,MAAA,OAAO,SAAS,eAAA,KAAoB,GAAA;AAAA,IACtC;AAEA,IAAA,QAAQ,UAAU,IAAA;AAAM,MACtB,KAAK,gBAAA,EAAkB;AACrB,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAC/C,QAAA,OAAO,QAAA,CAAS,OAAA,KAAY,CAAA,IAAK,QAAA,CAAS,UAAA,KAAe,CAAA;AAAA,MAC3D;AAAA,MACA,KAAK,YAAA;AACH,QAAA,OAAO,KAAA;AAAA;AAAA,MACT,KAAK,YAAA;AACH,QAAA,OAAO,KAAA;AAAA,MACT;AACE,QAAA,OAAO,KAAA;AAAA;AACX,EACF;AAAA,EAEQ,YAAA,GAAqB;AAC3B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAC/C,IAAA,IAAA,CAAK,KAAK,UAAA,EAAY;AAAA,MACpB,SAAS,QAAA,CAAS,eAAA;AAAA,MAClB,SAAS,CAAA,EAAG,QAAA,CAAS,SAAS,CAAA,CAAA,EAAI,SAAS,KAAK,CAAA,gBAAA;AAAA,KACjD,CAAA;AAAA,EACH;AACF;AAQO,IAAM,gBAAN,MAAoB;AAAA,EACjB,KAAA;AAAA,EACA,OAAA;AAAA,EACS,MAAA;AAAA,EACT,KAAA,uBAAY,GAAA,EAAsB;AAAA,EAE1C,YAAY,IAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,gBAAA,EAAiB;AAClC,IAAA,IAAA,CAAK,UAAU,IAAI,WAAA,CAAY,EAAE,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AACpD,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AAAA,EACrB;AAAA,EAEA,MAAM,UAAA,CAAW,WAAA,EAAqB,OAAA,EAAuD;AAC3F,IAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS;AAAA,MACxB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,GAAG;AAAA,KACJ,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA;AAC7C,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,IAAI,CAAA;AAE7B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,QAAQ,OAAA,EAAuC;AAC7C,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA;AAAA,EAC/B;AAAA,EAEA,SAAA,GAAmE;AACjE,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,EAAA,EAAI,IAAI,CAAA,MAAO;AAAA,MAC3D,EAAA;AAAA,MACA,KAAA,EAAO,IAAA,CAAK,QAAA,EAAS,EAAG,KAAA,IAAS,UAAA;AAAA,MACjC,KAAA,EAAO,KAAK,QAAA;AAAS,KACvB,CAAE,CAAA;AAAA,EACJ;AACF;;;AC5QA,iBAAA,EAAA;AA0BO,IAAM,YAAN,MAAgB;AAAA,EACJ,OAAA;AAAA,EACA,SAAA;AAAA,EAEjB,YAAY,IAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpB,IAAA,IAAA,CAAK,SAAA,GAAiBC,IAAA,CAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,aAAa,CAAA;AAAA,EACxD;AAAA,EAEA,MAAM,KAAK,IAAA,EAAoC;AAC7C,IAAA,MAAM,SAAA,CAAU,KAAK,OAAO,CAAA;AAC5B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA;AACtC,IAAA,MAAM,WAAA,CAAY,QAAA,EAAU,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AAC1E,IAAA,MAAM,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,EAC7B;AAAA,EAEA,MAAM,KAAK,EAAA,EAA2C;AACpD,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAUC,EAAA,CAAA,QAAA,CAAS,KAAK,QAAA,CAAS,EAAE,GAAG,MAAM,CAAA;AACxD,MAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,GAAkC;AACtC,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,EAAU;AACnC,IAAA,OAAO,KAAA,CAAM,QAAQ,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAS,CAAA;AAAA,EAC/D;AAAA,EAEA,MAAM,OAAO,EAAA,EAA8B;AACzC,IAAA,IAAI;AACF,MAAA,MAAUA,EAAA,CAAA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,EAAE,CAAC,CAAA;AAClC,MAAA,MAAM,IAAA,CAAK,gBAAgB,EAAE,CAAA;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,EAAA,EAA8B;AACzC,IAAA,IAAI;AACF,MAAA,MAAUA,EAAA,CAAA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,EAAE,CAAC,CAAA;AAClC,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,WAAA,CAAY,KAAA,EAAe,QAAA,EAA2C;AAC1E,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,IAAA,GAAsB;AAAA,MAC1B,IAAI,UAAA,EAAW;AAAA,MACf,KAAA;AAAA,MACA,OAAA,EAAS,OAAA;AAAA,MACT,MAAA,EAAQ,OAAA;AAAA,MACR,UAAU,QAAA,IAAY,EAAA;AAAA,MACtB,UAAU,EAAC;AAAA,MACX,cAAc,EAAC;AAAA,MACf,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AACA,IAAA,MAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,MAAA,CAAO,EAAA,EAAY,KAAA,EAAwF;AAC/G,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA;AAC/B,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,MAAM,OAAA,GAAyB;AAAA,MAC7B,GAAG,IAAA;AAAA,MACH,GAAG,KAAA;AAAA,MACH,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AACA,IAAA,MAAM,IAAA,CAAK,KAAK,OAAO,CAAA;AACvB,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,SAAS,EAAA,EAAoB;AACnC,IAAA,OAAYD,IAAA,CAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,EAAE,CAAA,KAAA,CAAO,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAc,SAAA,GAAgC;AAC5C,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAUC,EAAA,CAAA,QAAA,CAAS,IAAA,CAAK,WAAW,MAAM,CAAA;AACrD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAA,IAAI,MAAA,EAAQ,OAAA,KAAY,CAAA,EAAG,OAAO,MAAA;AAAA,IACpC,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,EACnC;AAAA,EAEA,MAAc,YAAY,IAAA,EAAoC;AAC5D,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,EAAU;AACnC,IAAA,MAAM,KAAA,GAAwB;AAAA,MAC5B,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,EAAE;AAAA,KACjC;AACA,IAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,IAAA,CAAK,EAAE,CAAA;AAC3D,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,KAAA;AAAA,IACvB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,IAC1B;AACA,IAAA,MAAM,WAAA,CAAY,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AAAA,EACnF;AAAA,EAEA,MAAc,gBAAgB,EAAA,EAA2B;AACvD,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,EAAU;AACnC,IAAA,KAAA,CAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AACvD,IAAA,MAAM,WAAA,CAAY,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AAAA,EACnF;AACF;;;ACpJA,iBAAA,EAAA;AA0BA,SAAS,YAAY,KAAA,EAA0B;AAC7C,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,GAAG,KAAA;AAAA,IACH,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,SAAS;AAAA,GACzC;AACA,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,YAAA,EAAc,IAAA,EAAM,CAAC,CAAA;AAC7C;AAEA,SAAS,cAAc,GAAA,EAAwB;AAC7C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,KAAA,EAAO,IAAI,GAAA,CAAI,MAAA,CAAO,KAAK;AAAA,GAC7B;AACF;AAMO,IAAM,iBAAN,MAAqB;AAAA,EACT,OAAA;AAAA,EACA,SAAA;AAAA,EAEjB,YAAY,IAAA,EAA6B;AACvC,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpB,IAAA,IAAA,CAAK,SAAA,GAAiBC,IAAA,CAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,aAAa,CAAA;AAAA,EACxD;AAAA,EAEA,MAAM,KAAK,KAAA,EAAiC;AAC1C,IAAA,MAAM,SAAA,CAAU,KAAK,OAAO,CAAA;AAC5B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,EAAE,CAAA;AACvC,IAAA,MAAM,WAAA,CAAY,UAAU,WAAA,CAAY,KAAK,GAAG,EAAE,IAAA,EAAM,KAAO,CAAA;AAC/D,IAAA,MAAM,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,KAAK,EAAA,EAAuC;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAUC,EAAA,CAAA,QAAA,CAAS,KAAK,QAAA,CAAS,EAAE,GAAG,MAAM,CAAA;AACxD,MAAA,OAAO,cAAc,GAAG,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,GAAuC;AAC3C,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,EAAU;AACnC,IAAA,OAAO,KAAA,CAAM,QAAQ,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAS,CAAA;AAAA,EAC/D;AAAA,EAEA,MAAM,OAAO,EAAA,EAA8B;AACzC,IAAA,IAAI;AACF,MAAA,MAAUA,EAAA,CAAA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,EAAE,CAAC,CAAA;AAClC,MAAA,MAAM,IAAA,CAAK,gBAAgB,EAAE,CAAA;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,EAAA,EAA8B;AACzC,IAAA,IAAI;AACF,MAAA,MAAUA,EAAA,CAAA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,EAAE,CAAC,CAAA;AAClC,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,SAAS,EAAA,EAAoB;AACnC,IAAA,OAAYD,IAAA,CAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,EAAE,CAAA,KAAA,CAAO,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAc,SAAA,GAAqC;AACjD,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAUC,EAAA,CAAA,QAAA,CAAS,IAAA,CAAK,WAAW,MAAM,CAAA;AACrD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAA,IAAI,MAAA,EAAQ,OAAA,KAAY,CAAA,EAAG,OAAO,MAAA;AAAA,IACpC,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,EACnC;AAAA,EAEA,MAAc,YAAY,KAAA,EAAiC;AACzD,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,EAAU;AACnC,IAAA,MAAM,iBAAiB,KAAA,CAAM,IAAA,CAAK,MAAM,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,MACtD,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW;AAAA,KACtB,CAAE,MAAA;AACF,IAAA,MAAM,KAAA,GAA6B;AAAA,MACjC,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,SAAA,EAAW,MAAM,KAAA,CAAM,IAAA;AAAA,MACvB,cAAA;AAAA,MACA,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,EAAE;AAAA,KAClC;AACA,IAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,KAAA,CAAM,EAAE,CAAA;AAC5D,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,KAAA;AAAA,IACvB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,IAC1B;AACA,IAAA,MAAM,WAAA,CAAY,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AAAA,EACnF;AAAA,EAEA,MAAc,gBAAgB,EAAA,EAA2B;AACvD,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,EAAU;AACnC,IAAA,KAAA,CAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AACvD,IAAA,MAAM,WAAA,CAAY,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AAAA,EACnF;AACF;;;ACzFA,SAAS,sBAAA,CAAuB,OAAA,EAAwB,GAAA,EAAa,GAAA,EAAqB;AACxF,EAAA,MAAM,QAAA,GAAW,QAAQ,OAAA,CAAQ,MAAA;AACjC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAM,QAAQ,CAAA;AAC5C,EAAA,MAAM,SAAS,GAAA,GAAM,QAAA;AAErB,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,CAAA,sDAAA,CAAA;AAAA,IACA,CAAA,UAAA,EAAa,QAAQ,KAAK,CAAA,CAAA,CAAA;AAAA,IAC1B,OAAA,CAAQ,UAAA,GAAa,CAAA,QAAA,EAAW,OAAA,CAAQ,UAAU,CAAA,CAAA,GAAK,EAAA;AAAA,IACvD,CAAA,oBAAA,EAAuB,QAAQ,CAAA,WAAA,EAAc,MAAM,CAAA,kBAAA,CAAA;AAAA,IACnD,EAAA;AAAA,IACA,0BAAA;AAAA,IACA,EAAA;AAAA,IACA,2EAAA;AAAA,IACA,0EAAA;AAAA,IACA,EAAA;AAAA,IACA,kBAAkB,QAAQ,CAAA,kBAAA;AAAA,GAC5B;AAEA,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,sBAAA,EAAyB,SAAS,CAAA,6CAAA,CAA+C,CAAA;AAAA,EAC9F,CAAA,MAAA,IAAW,UAAU,CAAA,EAAG;AACtB,IAAA,KAAA,CAAM,KAAK,sEAAsE,CAAA;AAAA,EACnF,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,4FAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,EAAA;AAAA,IACA,YAAA;AAAA,IACA,8BAAA;AAAA,IACA,kEAAA;AAAA,IACA,mCAAA;AAAA,IACA,0FAAA;AAAA,IACA,iFAAA;AAAA,IACA,EAAA;AAAA,IACA,CAAA,qBAAA,EAAwB,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,UAAA,CAAA;AAAA,IACrC,CAAA,sBAAA,EAAyB,SAAA,GAAY,CAAA,GAAI,SAAA,GAAY,KAAK,CAAA;AAAA,GAC5D;AAEA,EAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,IAAA,KAAA,CAAM,KAAK,EAAA,EAAI,sBAAA,EAAwB,KAAA,EAAO,OAAA,CAAQ,gBAAgB,KAAK,CAAA;AAAA,EAC7E;AAEA,EAAA,IAAI,WAAW,CAAA,EAAG;AAChB,IAAA,KAAA,CAAM,IAAA,CAAK,IAAI,0BAA0B,CAAA;AACzC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA;AAC3B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,MAAM,CAAA,CAAE,CAAA;AAAA,IACrE;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,EAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA;AAAA,IACA,CAAA,iDAAA,CAAA;AAAA,IACA,CAAA,yDAAA,CAAA;AAAA,IACA,EAAA;AAAA,IACA,gFAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAA;AAAA,IACA,mBAAA;AAAA,IACA,sBAAA;AAAA,IACA,8IAAA;AAAA,IACA,iMAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AACxC;AAEA,SAAS,sBAAsB,OAAA,EAAgC;AAC7D,EAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AACrB,EAAA,IAAI,CAAC,MAAM,OAAO,wBAAA;AAElB,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,YAAA,CACrB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,GAAA,EAAM,CAAA,CAAE,QAAQ,KAAK,CAAA,CAAE,WAAW,CAAA,CAAE,CAAA,CAC/C,KAAK,IAAI,CAAA;AAEZ,EAAA,OAAO;AAAA,IACL,CAAA,iDAAA,CAAA;AAAA,IACA,CAAA,UAAA,EAAa,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,IACvB,CAAA,cAAA,EAAiB,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA,CAAA;AAAA,IACzC,EAAA;AAAA,IACA,oBAAA;AAAA,IACA,IAAA,CAAK,QAAA;AAAA,IACL,EAAA;AAAA,IACA,mBAAA;AAAA,IACA,UAAA;AAAA,IACA,EAAA;AAAA,IACA,KAAA;AAAA,IACA,gFAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACb;AAEA,SAAS,0BAA0B,OAAA,EAAgC;AACjE,EAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AACrB,EAAA,IAAI,CAAC,MAAM,OAAO,uBAAA;AAElB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAClB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,KAAA,EAAQ,CAAA,CAAE,QAAQ,KAAK,CAAA,CAAE,WAAW,CAAA,CAAE,CAAA,CACjD,KAAK,IAAI,CAAA;AAEZ,EAAA,OAAO;AAAA,IACL,CAAA,6DAAA,CAAA;AAAA,IACA,CAAA,UAAA,EAAa,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,IACvB,CAAA,cAAA,EAAiB,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA,CAAA;AAAA,IACzC,EAAA;AAAA,IACA,gCAAA;AAAA,IACA,OAAA;AAAA,IACA,EAAA;AAAA,IACA,0BAAA;AAAA,IACA,iEAAA;AAAA,IACA,UAAA;AAAA,IACA,2BAAA;AAAA,IACA,2BAAA;AAAA,IACA,+BAAA;AAAA,IACA,4BAAA;AAAA,IACA,qBAAA;AAAA,IACA,EAAA;AAAA,IACA,oFAAA;AAAA,IACA,+FAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAA;AAAA,IACA,KAAA;AAAA,IACA,wCAAA;AAAA,IACA,kFAAA;AAAA,IACA,wBAAA;AAAA,IACA,6BAAA;AAAA,IACA,yBAAA;AAAA,IACA,oCAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,kCAAA;AAAA,IACA,0EAAA;AAAA,IACA,qBAAA;AAAA,IACA,yBAAA;AAAA,IACA,yBAAA;AAAA,IACA,8BAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAA;AAAA,IACA,KAAA;AAAA,IACA,EAAA;AAAA,IACA,QAAA;AAAA,IACA,8CAAA;AAAA,IACA,mEAAA;AAAA,IACA,gGAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACb;AAEA,SAAS,sBAAsB,OAAA,EAAgC;AAC7D,EAAA,OAAO;AAAA,IACL,CAAA,iDAAA,CAAA;AAAA,IACA,CAAA,UAAA,EAAa,OAAA,CAAQ,IAAA,EAAM,KAAA,IAAS,QAAQ,KAAK,CAAA,CAAA,CAAA;AAAA,IACjD,EAAA;AAAA,IACA,QAAQ,cAAA,IAAkB,6BAAA;AAAA,IAC1B,EAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACb;AAEA,SAAS,qBAAqB,OAAA,EAAgC;AAC5D,EAAA,OAAO;AAAA,IACL,CAAA,oDAAA,CAAA;AAAA,IACA,CAAA,UAAA,EAAa,OAAA,CAAQ,IAAA,EAAM,KAAA,IAAS,QAAQ,KAAK,CAAA,CAAA,CAAA;AAAA,IACjD,EAAA;AAAA,IACA,0BAAA;AAAA,IACA,yEAAA;AAAA,IACA,EAAA;AAAA,IACA,gBAAA;AAAA,IACA,6CAAA;AAAA,IACA,8BAAA;AAAA,IACA,oFAAA;AAAA,IACA,+BAAA;AAAA,IACA,EAAA;AAAA,IACA,gBAAA;AAAA,IACA,+BAAA;AAAA,IACA,6DAAA;AAAA,IACA,iEAAA;AAAA,IACA,+CAAA;AAAA,IACA,wEAAA;AAAA,IACA,EAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACb;AASO,IAAM,gBAAN,MAAoB;AAAA,EACjB,OAAA;AAAA,EACS,KAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EAEjB,YAAY,IAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,YAAA,IAAgB,CAAA;AACzC,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,YAAA,IAAgB,EAAA;AACzC,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA;AACxB,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,MACtB,KAAA,EAAO,aAAA;AAAA,MACP,KAAA,EAAO,EAAA;AAAA,MACP,UAAA,EAAY,EAAA;AAAA,MACZ,cAAA,EAAgB,KAAK,cAAA,IAAkB,EAAA;AAAA,MACvC,SAAS,EAAC;AAAA,MACV,aAAA,EAAe,CAAA;AAAA,MACf,QAAA,EAAU,KAAA;AAAA,MACV,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAA6B;AACjC,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACvB,IAAA,IAAI;AACF,MAAA,MAAMF,IAAAA,GAAM,MAAM,OAAO,aAAkB,CAAA;AAC3C,MAAA,MAAMG,KAAAA,GAAO,MAAM,OAAO,MAAW,CAAA;AACrC,MAAA,MAAM,EAAE,WAAA,EAAAC,YAAAA,EAAY,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,iBAAA,EAAA,EAAA,oBAAA,CAAA,CAAA;AAC9B,MAAA,MAAMJ,IAAAA,CAAI,KAAA,CAAMG,KAAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAGnE,MAAA,MAAMC,YAAAA,CAAY,KAAK,WAAA,EAAa,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IAC3E,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,WAAA,GAAgC;AACpC,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,OAAO,KAAA;AAC9B,IAAA,IAAI;AACF,MAAA,MAAMJ,IAAAA,GAAM,MAAM,OAAO,aAAkB,CAAA;AAC3C,MAAA,MAAM,MAAM,MAAMA,IAAAA,CAAI,QAAA,CAAS,IAAA,CAAK,aAAa,MAAM,CAAA;AACvD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAE7B,MAAA,IAAI,MAAA,EAAQ,EAAA,IAAM,MAAA,EAAQ,KAAA,IAAS,QAAQ,KAAA,EAAO;AAChD,QAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,aAAA,GAA+B;AACnC,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACvB,IAAA,IAAI;AACF,MAAA,MAAMA,IAAAA,GAAM,MAAM,OAAO,aAAkB,CAAA;AAC3C,MAAA,MAAMA,IAAAA,CAAI,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA;AAAA,IACnC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAA,GAAiB;AACvB,IAAA,IAAA,CAAK,WAAA,EAAY,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AAChC,MAAA,MAAM,SAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC9D,MAAA,OAAA,CAAQ,WAAA;AAAA,QACN,gCAAgC,MAAM,CAAA,CAAA;AAAA,QACtC;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,OAAe,MAAA,EAAuB;AACjD,IAAA,IAAA,CAAK,QAAQ,KAAA,GAAQ,KAAA;AACrB,IAAA,IAAA,CAAK,OAAA,CAAQ,aAAa,MAAA,IAAU,EAAA;AACpC,IAAA,IAAA,CAAK,QAAQ,KAAA,GAAQ,aAAA;AACrB,IAAA,IAAA,CAAK,OAAA,CAAQ,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI;AAClC,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA;AAAA,EAGA,UAAA,GAAsC;AACpC,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,OAAA,EAAQ;AAAA,EAC3B;AAAA;AAAA,EAGA,QAAA,GAAwB;AACtB,IAAA,OAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAA,GAAsB;AACpB,IAAA,QAAQ,IAAA,CAAK,QAAQ,KAAA;AAAO,MAC1B,KAAK,aAAA;AACH,QAAA,OAAO,uBAAuB,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,YAAA,EAAc,KAAK,YAAY,CAAA;AAAA,MAClF,KAAK,aAAA;AACH,QAAA,OAAO,qBAAA,CAAsB,KAAK,OAAO,CAAA;AAAA,MAC3C,KAAK,gBAAA;AACH,QAAA,OAAO,yBAAA,CAA0B,KAAK,OAAO,CAAA;AAAA,MAC/C,KAAK,aAAA;AACH,QAAA,OAAO,qBAAA,CAAsB,KAAK,OAAO,CAAA;AAAA,MAC3C,KAAK,WAAA;AACH,QAAA,OAAO,oBAAA,CAAqB,KAAK,OAAO,CAAA;AAAA,MAC1C,KAAK,MAAA;AACH,QAAA,OAAO,0DAAA;AAAA;AACX,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAA,CAAU,UAAkB,MAAA,EAAsB;AAChD,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,EAAE,QAAA,EAAU,QAAQ,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,EAAG,CAAA;AACrE,IAAA,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAA;AACb,IAAA,IAAA,CAAK,OAAA,CAAQ,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI;AAClC,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,yBAAA,GAAqC;AACnC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,GAAgB,IAAA,CAAK,YAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAA,GAAkC;AAChC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,IAAiB,IAAA,CAAK,YAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,IAAA,EAA2B;AACjC,IAAA,IAAA,CAAK,QAAQ,IAAA,GAAO,IAAA;AACpB,IAAA,IAAA,CAAK,QAAQ,KAAA,GAAQ,aAAA;AACrB,IAAA,IAAA,CAAK,OAAA,CAAQ,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI;AAClC,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAA,GAAuB;AACrB,IAAA,QAAQ,IAAA,CAAK,QAAQ,KAAA;AAAO,MAC1B,KAAK,aAAA;AACH,QAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM;AACtB,UAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,QAC1D;AACA,QAAA,IAAA,CAAK,QAAQ,KAAA,GAAQ,aAAA;AACrB,QAAA;AAAA,MACF,KAAK,aAAA;AACH,QAAA,IAAA,CAAK,QAAQ,KAAA,GAAQ,gBAAA;AACrB,QAAA;AAAA,MACF,KAAK,gBAAA;AACH,QAAA,IAAA,CAAK,QAAQ,KAAA,GAAQ,aAAA;AACrB,QAAA;AAAA,MACF,KAAK,aAAA;AACH,QAAA,IAAA,CAAK,QAAQ,KAAA,GAAQ,WAAA;AACrB,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,IAAA,CAAK,QAAQ,KAAA,GAAQ,MAAA;AACrB,QAAA;AAEA;AAEJ,IAAA,IAAA,CAAK,QAAQ,QAAA,GAAW,IAAA;AACxB,IAAA,IAAA,CAAK,OAAA,CAAQ,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI;AAClC,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,OAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,IAAA,EAAoB;AACpC,IAAA,IAAA,CAAK,QAAQ,cAAA,GAAiB,IAAA;AAC9B,IAAA,IAAA,CAAK,QAAQ,KAAA,GAAQ,aAAA;AACrB,IAAA,IAAA,CAAK,OAAA,CAAQ,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI;AAClC,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAiB;AACf,IAAA,IAAA,CAAK,QAAQ,KAAA,GAAQ,MAAA;AACrB,IAAA,IAAA,CAAK,OAAA,CAAQ,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI;AAClC,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,OAAA,EAAuB;AACpC,IAAA,IAAA,CAAK,QAAQ,WAAA,GAAc,OAAA;AAC3B,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAqC;AACnC,IAAA,OAAO,KAAK,OAAA,CAAQ,WAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAA,GAAmC;AACvC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM;AACtB,MAAA,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAAA,IACpC;AACA,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,IAAI,CAAA;AACvC,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,kBAAkB,OAAA,EAAgC;AAChD,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC7B,SAAS,CAAA,EAAG;AACV,MAAA,MAAM,IAAI,MAAM,CAAA,uBAAA,EAA0B,CAAA,YAAa,QAAQ,CAAA,CAAE,OAAA,GAAU,aAAa,CAAA,CAAE,CAAA;AAAA,IAC5F;AAEA,IAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACzC,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAChD;AAEA,IAAA,MAAM,GAAA,GAAM,MAAA;AACZ,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,MAAM,QAAQ,MAAA,CAAO,GAAA,CAAI,SAAS,IAAA,CAAK,OAAA,CAAQ,SAAS,UAAU,CAAA;AAClE,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,QAAA,IAAY,EAAE,CAAA;AAG1C,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,KAAa,WAAA,EAAa;AACzC,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,GAAI,GAAA,CAAI,WAAW,EAAC;AAClE,IAAA,MAAM,QAAA,GAA0B,WAAA,CAC7B,MAAA,CAAO,CAAC,CAAA,KAAe,CAAA,IAAK,OAAO,CAAA,KAAM,QAAQ,CAAA,CACjD,GAAA,CAAI,CAAC,CAAA,MAAgC;AAAA,MACpC,MAAO,CAAC,UAAA,EAAY,gBAAgB,cAAA,EAAgB,KAAA,EAAO,QAAQ,UAAA,EAAY,YAAY,EACxF,QAAA,CAAS,MAAA,CAAO,EAAE,IAAI,CAAC,IAAI,MAAA,CAAO,CAAA,CAAE,IAAI,CAAA,GAAI,UAAA;AAAA,MAC/C,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,KAAA,IAAS,EAAE,CAAA;AAAA,MAC3B,OAAA,EAAS,MAAA,CAAO,CAAA,CAAE,OAAA,IAAW,EAAE,CAAA;AAAA,MAC/B,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA,IAAK;AAAA,KAC5B,CAAE,CAAA;AAEJ,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,GAAI,GAAA,CAAI,eAAe,EAAC;AACtE,IAAA,MAAM,YAAA,GAAkC,OAAA,CACrC,MAAA,CAAO,CAAC,CAAA,KAAe,CAAA,IAAK,OAAO,CAAA,KAAM,QAAQ,CAAA,CACjD,GAAA,CAAI,CAAC,GAA4B,CAAA,MAAe;AAAA,MAC/C,IAAI,MAAA,CAAO,CAAA,CAAE,MAAM,CAAA,IAAA,EAAO,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACjC,MAAO,CAAC,YAAA,EAAc,gBAAA,EAAkB,UAAA,EAAY,eAAe,IAAI,CAAA,CACpE,QAAA,CAAS,MAAA,CAAO,EAAE,IAAI,CAAC,IAAI,MAAA,CAAO,CAAA,CAAE,IAAI,CAAA,GAAI,YAAA;AAAA,MAC/C,UAAW,CAAC,UAAA,EAAY,MAAA,EAAQ,QAAA,EAAU,KAAK,CAAA,CAC5C,QAAA,CAAS,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAC,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAA,GAAI,QAAA;AAAA,MACvD,WAAA,EAAa,MAAA,CAAO,CAAA,CAAE,WAAA,IAAe,EAAE,CAAA;AAAA,MACvC,kBAAA,EAAoB,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,kBAAkB,CAAA,GAClD,CAAA,CAAE,kBAAA,CAAmB,GAAA,CAAI,MAAM,CAAA,GACjC;AAAC,KACP,CAAE,CAAA;AAEF,IAAA,MAAM,IAAA,GAAsB;AAAA,MAC1B,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,MACtB,KAAA;AAAA,MACA,OAAA,EAAS,OAAA;AAAA,MACT,MAAA,EAAQ,OAAA;AAAA,MACR,QAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW,GAAA;AAAA,MACX,QAAA,EAAU;AAAA,QACR,WAAA,EAAa,eAAA;AAAA,QACb,SAAA,EAAW,KAAK,OAAA,CAAQ;AAAA;AAC1B,KACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,IAAA,EAA6B;AAEvC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,yBAAyB,CAAA;AAC3D,IAAA,IAAI,cAAA,GAAiB,CAAC,CAAA,EAAG;AACvB,MAAA,OAAO,cAAA,CAAe,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,IAChC;AAGA,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAA;AAC1D,IAAA,IAAI,iBAAA,GAAoB,CAAC,CAAA,EAAG;AAC1B,MAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,CAAC,CAAA,CAAE,IAAA,EAAK;AAC1C,MAAA,IAAI,QAAQ,UAAA,CAAW,GAAG,KAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACtD,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA;AAC5C,IAAA,IAAI,SAAA,GAAY,CAAC,CAAA,EAAG;AAClB,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAC,CAAA;AACvB,QAAA,OAAO,UAAU,CAAC,CAAA;AAAA,MACpB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,IAAA,EAAuB;AACrC,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,KAAM,IAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,uBAAuB,IAAA,EAAoC;AACzD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AAClC,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,kBAAkB,IAAI,CAAA;AAAA,IACpC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,IAAA,EAA6B;AAC5C,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,yBAAyB,CAAA;AAC3D,IAAA,IAAI,cAAA,GAAiB,CAAC,CAAA,EAAG;AACvB,MAAA,MAAM,OAAA,GAAU,cAAA,CAAe,CAAC,CAAA,CAAE,IAAA,EAAK;AACvC,MAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,OAAA;AAAA,IACtC;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA;AAC7C,IAAA,IAAI,UAAA,GAAa,CAAC,CAAA,EAAG;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,CAAC,CAAC,CAAA;AACvC,QAAA,IAAI,MAAM,OAAA,CAAQ,MAAM,CAAA,EAAG,OAAO,WAAW,CAAC,CAAA;AAAA,MAChD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC/oBO,IAAM,cAAA,GAAiC;AAAA,EAC5C;AAAA,IACE,EAAA,EAAI,SAAA;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,WAAA,EAAa,sCAAA;AAAA,IACb,QAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,OAAO,CAAA,EAAE;AAAA,MAChD,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,cAAA,EAAgB,OAAO,CAAA,EAAE;AAAA,MACxD,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,cAAA,EAAgB,OAAO,CAAA,EAAE;AAAA,MACxD,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,YAAA,EAAc,OAAO,CAAA,EAAE;AAAA,MAC7C,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAc,OAAO,CAAA,EAAE;AAAA,MAC9C,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,OAAO,CAAA,EAAE;AAAA,MAChD,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,qBAAA,EAAuB,OAAO,CAAA;AAAE,KAC/D;AAAA,IACA,mBAAA,EAAqB;AAAA,MACnB,EAAE,IAAA,EAAM,YAAA,EAAc,QAAA,EAAU,MAAA,EAAQ,kBAAA,EAAoB,EAAC,EAAG,SAAA,EAAW,EAAC,EAAG,UAAA,EAAY,EAAC,EAAE;AAAA,MAC9F,EAAE,IAAA,EAAM,gBAAA,EAAkB,QAAA,EAAU,QAAA,EAAU,kBAAA,EAAoB,EAAC,EAAG,SAAA,EAAW,EAAC,EAAG,UAAA,EAAY,EAAC;AAAE;AACtG,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,QAAA;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,qCAAA;AAAA,IACb,QAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,iBAAA,EAAmB,OAAO,CAAA,EAAE;AAAA,MACvD,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,qBAAA,EAAuB,OAAO,CAAA,EAAE;AAAA,MAC/D,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,kBAAA,EAAoB,OAAO,CAAA;AAAE,KAC5D;AAAA,IACA,mBAAA,EAAqB;AAAA,MACnB,EAAE,IAAA,EAAM,YAAA,EAAc,QAAA,EAAU,UAAA,EAAY,kBAAA,EAAoB,EAAC,EAAG,SAAA,EAAW,EAAC,EAAG,UAAA,EAAY,EAAC;AAAE;AACpG,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,UAAA;AAAA,IACJ,IAAA,EAAM,UAAA;AAAA,IACN,WAAA,EAAa,+BAAA;AAAA,IACb,QAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,eAAA,EAAiB,OAAO,CAAA,EAAE;AAAA,MACrD,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,mBAAA,EAAqB,OAAO,CAAA,EAAE;AAAA,MAC7D,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,qBAAA,EAAuB,OAAO,CAAA,EAAE;AAAA,MAC/D,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,cAAA,EAAgB,OAAO,CAAA;AAAE,KACxD;AAAA,IACA,mBAAA,EAAqB;AAAA,MACnB,EAAE,IAAA,EAAM,gBAAA,EAAkB,QAAA,EAAU,MAAA,EAAQ,kBAAA,EAAoB,EAAC,EAAG,SAAA,EAAW,EAAC,EAAG,UAAA,EAAY,EAAC;AAAE;AACpG,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,WAAA,EAAa,6CAAA;AAAA,IACb,QAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,cAAA,EAAgB,OAAO,CAAA,EAAE;AAAA,MACpD,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,cAAA,EAAgB,OAAO,CAAA,EAAE;AAAA,MACxD,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,QAAA,EAAU,OAAO,CAAA,EAAE;AAAA,MAClD,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,iBAAA,EAAmB,OAAO,CAAA,EAAE;AAAA,MACvD,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,cAAA,EAAgB,OAAO,CAAA;AAAE,KACxD;AAAA,IACA,mBAAA,EAAqB;AAAA,MACnB,EAAE,IAAA,EAAM,YAAA,EAAc,QAAA,EAAU,MAAA,EAAQ,kBAAA,EAAoB,EAAC,EAAG,SAAA,EAAW,EAAC,EAAG,UAAA,EAAY,EAAC,EAAE;AAAA,MAC9F,EAAE,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,kBAAA,EAAoB,EAAC,EAAG,SAAA,EAAW,EAAC,EAAG,UAAA,EAAY,EAAC;AAAE;AAC9F,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,aAAA;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,WAAA,EAAa,oDAAA;AAAA,IACb,QAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,sBAAA,EAAwB,OAAO,CAAA,EAAE;AAAA,MAC5D,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,0BAAA,EAA4B,OAAO,CAAA,EAAE;AAAA,MACpE,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,cAAA,EAAgB,OAAO,CAAA,EAAE;AAAA,MAC/C,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,cAAA,EAAgB,OAAO,CAAA,EAAE;AAAA,MACxD,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,iBAAA,EAAmB,OAAO,CAAA,EAAE;AAAA,MACvD,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,kBAAA,EAAoB,OAAO,CAAA;AAAE,KAC5D;AAAA,IACA,mBAAA,EAAqB;AAAA,MACnB,EAAE,IAAA,EAAM,YAAA,EAAc,QAAA,EAAU,MAAA,EAAQ,kBAAA,EAAoB,EAAC,EAAG,SAAA,EAAW,EAAC,EAAG,UAAA,EAAY,EAAC,EAAE;AAAA,MAC9F,EAAE,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,UAAA,EAAY,kBAAA,EAAoB,EAAC,EAAG,SAAA,EAAW,EAAC,EAAG,UAAA,EAAY,EAAC,EAAE;AAAA,MAChG,EAAE,IAAA,EAAM,aAAA,EAAe,QAAA,EAAU,QAAA,EAAU,kBAAA,EAAoB,EAAC,EAAG,SAAA,EAAW,EAAC,EAAG,UAAA,EAAY,EAAC;AAAE;AACnG,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,aAAA;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,WAAA,EAAa,8CAAA;AAAA,IACb,QAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,kBAAA,EAAoB,OAAO,CAAA,EAAE;AAAA,MACxD,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,sBAAA,EAAwB,OAAO,CAAA,EAAE;AAAA,MAChE,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,mBAAA,EAAqB,OAAO,CAAA,EAAE;AAAA,MACpD,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,gBAAA,EAAkB,OAAO,CAAA;AAAE,KAC1D;AAAA,IACA,mBAAA,EAAqB;AAAA,MACnB,EAAE,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,kBAAA,EAAoB,EAAC,EAAG,SAAA,EAAW,EAAC,EAAG,UAAA,EAAY,EAAC,EAAE;AAAA,MACtF,EAAE,IAAA,EAAM,YAAA,EAAc,QAAA,EAAU,MAAA,EAAQ,kBAAA,EAAoB,EAAC,EAAG,SAAA,EAAW,EAAC,EAAG,UAAA,EAAY,EAAC;AAAE;AAChG;AAEJ;AAKO,SAAS,YAAY,EAAA,EAAsC;AAChE,EAAA,OAAO,eAAe,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC/C;AAKO,SAAS,aAAA,GAA0E;AACxF,EAAA,OAAO,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,WAAA,EAAa,CAAA,CAAE,aAAY,CAAE,CAAA;AAC3F;AAKO,SAAS,kBAAA,CAAmB,UAAwB,KAAA,EAAwB;AACjF,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,KAAA,IAAS,wBAAwB,CAAA,CAAE,CAAA;AACnD,EAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAC3B,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,KAAA,MAAW,OAAA,IAAW,SAAS,QAAA,EAAU;AACvC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,KAAA,GAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAA;AAC9D,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,OAAA,CAAQ,IAAI,CAAA,qBAAA,CAAuB,CAAA;AACvD,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;AChIA,IAAM,WAAA,GAAkD;AAAA,EACtD,OAAA,EAAS,QAAA;AAAA,EACT,WAAA,EAAa,QAAA;AAAA,EACb,OAAA,EAAS,QAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,aAAA,GAAsD;AAAA,EAC1D,QAAA,EAAU,WAAA;AAAA,EACV,IAAA,EAAM,WAAA;AAAA,EACN,MAAA,EAAQ,WAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,SAAA,GAA8C;AAAA,EAClD,OAAA,EAAS,QAAA;AAAA,EACT,MAAA,EAAQ,WAAA;AAAA,EACR,QAAA,EAAU,cAAA;AAAA,EACV,IAAA,EAAM,WAAA;AAAA,EACN,IAAA,EAAM,WAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAKO,SAAS,eAAA,CAAgB,OAAkB,IAAA,EAAsC;AACtF,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,KAAA;AAGjC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,yBAAA,EAAkB,KAAA,CAAM,KAAK,CAAA,aAAA,CAAK,CAAA;AAC7C,EAAA,KAAA,CAAM,KAAK,CAAA,aAAA,EAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,GAAG,CAAC,CAAC,CAAA,kBAAA,EAAgB,KAAA,CAAM,MAAM,IAAI,CAAA,eAAA,EAAa,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,OAAA,CAAI,CAAA;AACjH,EAAA,KAAA,CAAM,IAAA,CAAK,QAAA,GAAM,QAAA,CAAI,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,EAAE,CAAC,IAAI,QAAG,CAAA;AACxE,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,MAAM,QAAA,GAAW,oBAAoB,KAAK,CAAA;AAC1C,EAAA,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAC,CAAA;AACnC,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAsB;AAC9C,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,IAAI,IAAA,CAAK,SAAS,YAAA,EAAc;AAE9B,MAAA,MAAM,OAAO,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,IAAI,KAAK,EAAC;AAC5C,MAAA,IAAA,CAAK,IAAA,CAAK,KAAK,EAAE,CAAA;AACjB,MAAA,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,IACjC;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,SAAA,CAAU,MAAA,CAAO,CAAC,OAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,EAAE,CAAC,CAAA;AAGpE,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,MAAA,GAAS,CAAA,GAClC,YACA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,CAAC,EAAA,KAAO;AAC5C,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AAC/B,IAAA,OAAO,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,CAAA;AAAA,EAClC,CAAC,CAAA;AAEL,EAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,IAAA,UAAA,CAAW,OAAO,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,WAAA,EAAa,SAAS,EAAE,CAAA;AAAA,EACrE;AAGA,EAAA,KAAA,MAAW,CAAC,EAAE,CAAA,IAAK,KAAA,CAAM,KAAA,EAAO;AAC9B,IAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG;AACrB,MAAA,UAAA,CAAW,OAAO,EAAA,EAAI,KAAA,EAAO,QAAA,EAAU,WAAA,EAAa,SAAS,EAAE,CAAA;AAAA,IACjE;AAAA,EACF;AAGA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,kGAAoE,CAAA;AAE/E,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,WACP,KAAA,EACA,MAAA,EACA,OACA,QAAA,EACA,WAAA,EACA,SACA,MAAA,EACM;AACN,EAAA,IAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG;AAC1B,EAAA,QAAA,CAAS,IAAI,MAAM,CAAA;AAEnB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AACnC,EAAA,IAAI,CAAC,IAAA,EAAM;AAEX,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AACpC,EAAA,MAAM,QAAA,GAAW,aAAA,CAAc,IAAA,CAAK,QAAQ,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AACpC,EAAA,MAAM,QAAQ,OAAA,GAAU,QAAA,CAAS,KAAK,KAAA,EAAO,EAAE,IAAI,IAAA,CAAK,KAAA;AAExD,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,GAAA,CAAI,MAAM,KAAK,EAAC;AAC9C,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,MAAA,GAAS,CAAA,GAC/B,CAAA,SAAA,EAAO,UAAU,GAAA,CAAI,CAAC,CAAA,KAAM,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,KAAA,EAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,IAAK,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GACtF,EAAA;AAEJ,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,EAAG,OAAO,CAAA,CAAE,CAAA;AAExE,EAAA,IAAI,CAAC,OAAA,IAAW,IAAA,CAAK,WAAA,EAAa;AAChC,IAAA,MAAM,SAAA,GAAY,KAAK,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AACzD,IAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,MAAM,CAAA,SAAA,EAAO,SAAS,EAAA,EAAI,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,IAC/C;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CACtB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,YAAA,IAAgB,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA,CACxD,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CACjB,MAAA,CAAO,CAAC,EAAA,KAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,EAAE,CAAC,CAAA;AAErC,EAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,IAAA,UAAA,CAAW,OAAO,KAAA,EAAO,KAAA,EAAO,UAAU,WAAA,EAAa,OAAA,EAAS,SAAS,IAAI,CAAA;AAAA,EAC/E;AACF;AAKO,SAAS,eAAe,QAAA,EAAgC;AAC7D,EAAA,MAAM,QAAA,GAAW,EAAA;AACjB,EAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAO,QAAA,CAAS,eAAA,GAAkB,MAAO,QAAQ,CAAA;AACrE,EAAA,MAAM,QAAQ,QAAA,GAAW,MAAA;AACzB,EAAA,MAAM,MAAM,QAAA,CAAI,MAAA,CAAO,MAAM,CAAA,GAAI,QAAA,CAAI,OAAO,KAAK,CAAA;AAEjD,EAAA,OAAO;AAAA,IACL,CAAA,WAAA,EAAc,GAAG,CAAA,EAAA,EAAK,QAAA,CAAS,eAAe,CAAA,CAAA,CAAA;AAAA,IAC9C,CAAA,EAAA,EAAK,QAAA,CAAS,SAAS,CAAA,aAAA,EAAW,SAAS,UAAU,CAAA,eAAA,EAAa,QAAA,CAAS,OAAO,CAAA,gBAAA,EAAc,QAAA,CAAS,OAAO,CAAA,gBAAA,EAAc,SAAS,MAAM,CAAA,OAAA;AAAA,GAC/I,CAAE,KAAK,IAAI,CAAA;AACb;AAKO,SAAS,eAAe,KAAA,EAA0B;AACvD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA;AAG7C,EAAA,MAAM,MAAA,GAAqC;AAAA,IACzC,aAAa,EAAC;AAAA,IACd,SAAS,EAAC;AAAA,IACV,SAAS,EAAC;AAAA,IACV,QAAQ,EAAC;AAAA,IACT,QAAQ,EAAC;AAAA,IACT,WAAW;AAAC,GACd;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA;AAAA,EAChC;AAEA,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACpD,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,IAAA,MAAM,IAAA,GAAO,YAAY,MAA4B,CAAA;AACrD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,aAAa,CAAA,EAAA,EAAK,KAAA,CAAM,MAAM,CAAA,CAAA,CAAG,CAAA;AAC9D,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAA,CAAK,QAAQ,CAAA;AACxC,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAChC,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAAA,IAC9C;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKO,SAAS,kBAAA,CACd,MACA,QAAA,EACQ;AACR,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,4BAAA,EAAqB,IAAA,CAAK,KAAK,CAAA,aAAA,CAAK,CAAA;AAC/C,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,MAAM,QAAA,GAAW,EAAA;AACjB,EAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAO,QAAA,CAAS,YAAA,GAAe,MAAO,QAAQ,CAAA;AAClE,EAAA,MAAM,GAAA,GAAM,SAAI,MAAA,CAAO,MAAM,IAAI,QAAA,CAAI,MAAA,CAAO,WAAW,MAAM,CAAA;AAC7D,EAAA,KAAA,CAAM,KAAK,CAAA,eAAA,EAAkB,GAAG,CAAA,EAAA,EAAK,QAAA,CAAS,YAAY,CAAA,CAAA,CAAG,CAAA;AAC7D,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,IAAI,QAAA,CAAS,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC5B,IAAA,KAAA,CAAM,KAAK,cAAS,CAAA;AACpB,IAAA,KAAA,MAAW,GAAA,IAAO,SAAS,IAAA,EAAM;AAC/B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAO,GAAG,CAAA,CAAE,CAAA;AAAA,IACzB;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,IAAI,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC7B,IAAA,KAAA,CAAM,KAAK,kBAAW,CAAA;AACtB,IAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,KAAA,EAAO;AACjC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAO,IAAI,CAAA,CAAE,CAAA;AAAA,IAC1B;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,IAAI,QAAA,CAAS,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACnC,IAAA,KAAA,CAAM,KAAK,wBAAiB,CAAA;AAC5B,IAAA,KAAA,MAAW,GAAA,IAAO,SAAS,WAAA,EAAa;AACtC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAO,GAAG,CAAA,CAAE,CAAA;AAAA,IACzB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,QAAA,CAAS,KAAa,MAAA,EAAwB;AACrD,EAAA,IAAI,GAAA,CAAI,MAAA,IAAU,MAAA,EAAQ,OAAO,GAAA;AACjC,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,MAAA,GAAS,CAAC,CAAA,GAAI,QAAA;AACpC;;;AClMO,SAAS,oBAAoB,KAAA,EAAwC;AAC1E,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,gBAAgB,KAAK,CAAA;AAGvC,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAyB;AAClD,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAyB;AAE/C,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,IAAI,IAAA,CAAK,SAAS,YAAA,EAAc;AAE9B,MAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAA,kBAAM,IAAI,GAAA,EAAK,CAAA;AACvE,MAAA,YAAA,CAAa,IAAI,IAAA,CAAK,IAAI,CAAA,CAAG,GAAA,CAAI,KAAK,EAAE,CAAA;AAExC,MAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,EAAA,kBAAI,IAAI,GAAA,EAAK,CAAA;AAC7D,MAAA,SAAA,CAAU,IAAI,IAAA,CAAK,EAAE,CAAA,CAAG,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,IACvC;AAAA,EACF;AAGA,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,MAAM,eAAyB,EAAC;AAEhC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,CAAK,WAAW,WAAA,EAAa;AACjC,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACzC,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,IAAA,KAAS,CAAA,EAAG;AACpC,MAAA,UAAA,CAAW,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,MAAM,eAAe,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,CAAE,KAAA,CAAM,CAAC,EAAA,KAAO;AACtD,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAC5B,QAAA,OAAO,GAAG,MAAA,KAAW,WAAA;AAAA,MACvB,CAAC,CAAA;AACD,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,UAAA,CAAW,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,YAAA,CAAa,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,cAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,CAAK,WAAW,WAAA,EAAa;AACjC,IAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,KAAA,EAAO,IAAA,CAAK,IAAI,SAAS,CAAA;AACjE,IAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AACvB,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,UAAU,EAAE,MAAA,CAAO,CAAC,KAAK,EAAA,KAAO;AAC9D,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAC5B,QAAA,OAAO,GAAA,IAAO,GAAG,aAAA,IAAiB,CAAA,CAAA;AAAA,MACpC,GAAG,CAAC,CAAA;AACJ,MAAA,WAAA,CAAY,IAAA,CAAK;AAAA,QACf,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,cAAc,UAAA,CAAW,IAAA;AAAA,QACzB,YAAA;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAA,CAAO,UAAA,CAAW,IAAA,GAAO,KAAA,CAAM,MAAA,GAAU,GAAG,CAAC;AAAA,OAC3E,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,WAAA,CAAY,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,QAAA,GAAW,EAAE,QAAQ,CAAA;AAGlD,EAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,KAAA,EAAO,SAAA,EAAW,YAAY,CAAA;AAGvE,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,MAAA,CAAO,CAAC,KAAK,EAAA,KAAO;AAClD,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAC5B,IAAA,OAAO,GAAA,IAAO,GAAG,aAAA,IAAiB,CAAA,CAAA;AAAA,EACpC,GAAG,CAAC,CAAA;AAGJ,EAAA,MAAM,cAAA,GAAiB,qBAAA,CAAsB,KAAA,EAAO,YAAY,CAAA;AAGhE,EAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,MAAA,CAAO,CAAC,EAAA,KAAO;AAC9C,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAC5B,IAAA,OAAO,CAAA,IAAK,EAAE,MAAA,KAAW,WAAA;AAAA,EAC3B,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;AAKA,SAAS,oBAAA,CACP,KAAA,EACA,MAAA,EACA,SAAA,EACa;AACb,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,MAAM,KAAA,GAAQ,CAAC,MAAM,CAAA;AAErB,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAM;AAC5B,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AACrC,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,IAAK,OAAO,MAAA,EAAQ;AACrC,QAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAKA,SAAS,mBAAA,CACP,KAAA,EACA,SAAA,EACA,YAAA,EACU;AAEV,EAAA,MAAM,SAAS,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA;AAC5C,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEjC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAoB;AACrC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAA2B;AAG5C,EAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,IAAA,IAAA,CAAK,GAAA,CAAI,IAAI,KAAA,CAAM,KAAA,CAAM,IAAI,EAAE,CAAA,EAAG,iBAAiB,CAAC,CAAA;AACpD,IAAA,IAAA,CAAK,GAAA,CAAI,IAAI,IAAI,CAAA;AAAA,EACnB;AAGA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAyB;AAC/C,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,QAAQ,CAAA,IAAK,YAAA,EAAc;AAC7C,IAAA,KAAA,MAAW,aAAa,QAAA,EAAU;AAChC,MAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA,YAAa,GAAA,CAAI,SAAA,kBAAW,IAAI,GAAA,EAAK,CAAA;AACjE,MAAA,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA,CAAG,GAAA,CAAI,MAAM,CAAA;AAAA,IACtC;AAAA,EACF;AAIA,EAAA,MAAM,IAAI,MAAA,CAAO,MAAA;AACjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AAC9B,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AAChC,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,KAAA,MAAW,aAAa,OAAA,EAAS;AAC/B,QAAA,MAAM,aAAA,GAAA,CAAiB,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,IAAK,CAAA,KAAM,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA,EAAG,aAAA,IAAiB,CAAA,CAAA;AAC1F,QAAA,IAAI,aAAA,IAAiB,IAAA,CAAK,GAAA,CAAI,SAAS,KAAK,CAAA,CAAA,EAAI;AAC9C,UAAA,IAAA,CAAK,GAAA,CAAI,WAAW,aAAa,CAAA;AACjC,UAAA,IAAA,CAAK,GAAA,CAAI,WAAW,EAAE,CAAA;AACtB,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,OAAA,EAAS;AAAA,EAChB;AAGA,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,KAAA,GAAQ,OAAO,CAAC,CAAA;AACpB,EAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,IAAK,CAAA;AAC1B,IAAA,IAAI,IAAI,OAAA,EAAS;AACf,MAAA,OAAA,GAAU,CAAA;AACV,MAAA,KAAA,GAAQ,EAAA;AAAA,IACV;AAAA,EACF;AAGA,EAAA,MAAMG,QAAiB,EAAC;AACxB,EAAA,IAAI,OAAA,GAAyB,KAAA;AAC7B,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,OAAO,OAAA,IAAW,CAAC,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACvC,IAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AACnB,IAAAA,KAAAA,CAAK,QAAQ,OAAO,CAAA;AACpB,IAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,IAAK,IAAA;AAAA,EACjC;AAEA,EAAA,OAAOA,KAAAA;AACT;AAMA,SAAS,qBAAA,CACP,OACA,YAAA,EACY;AACZ,EAAA,MAAM,SAAqB,EAAC;AAC5B,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,WAAW,CAAA;AAGrF,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAEhD,EAAA,OAAO,SAAA,CAAU,OAAO,CAAA,EAAG;AACzB,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,MAAA,MAAM,QAAA,GAAW,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA;AACpC,MAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,IAAA,KAAS,CAAA,EAAG;AACpC,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,MACf,CAAA,MAAO;AACL,QAAA,MAAM,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM,QAAA,CAAS,GAAA,CAAI,CAAC,CAAC,CAAA;AACrE,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAGtB,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,SAAS,EAAE,CAAC,CAAA;AACrC,MAAA,IAAI,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAAA,IAC7B;AAEA,IAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,MAAA,QAAA,CAAS,IAAI,EAAE,CAAA;AACf,MAAA,SAAA,CAAU,OAAO,EAAE,CAAA;AAAA,IACrB;AACA,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,EACnB;AAEA,EAAA,OAAO,MAAA;AACT;;;ACzPO,IAAM,iBAAN,MAAqB;AAAA,EAClB,QAAA,uBAAe,GAAA,EAA2B;AAAA;AAAA,EAGlD,aAAA,CAAc,MAAqB,iBAAA,EAAyC;AAC1E,IAAA,MAAM,OAAA,GAAuB;AAAA,MAC3B,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,IAAA,EAAM,EAAE,GAAG,IAAA,EAAK;AAAA,MAChB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB;AAAA,KACF;AAEA,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA,CAAS,IAAI,IAAA,CAAK,EAAE,KAAK,EAAC;AAC/C,IAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AACpB,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,OAAO,CAAA;AAElC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAGA,WAAW,MAAA,EAA+B;AACxC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,KAAK,EAAC;AAAA,EACvC;AAAA;AAAA,EAGA,UAAA,CAAW,QAAgB,OAAA,EAA0C;AACnE,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,KAAK,EAAC;AAC9C,IAAA,OAAO,QAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,OAAO,CAAA;AAAA,EAClD;AAAA;AAAA,EAGA,UAAU,MAAA,EAAyC;AACjD,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,KAAK,EAAC;AAC9C,IAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAAA,EACnC;AAAA;AAAA,EAGA,IAAA,CAAK,SAAwB,OAAA,EAAkC;AAC7D,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,OAAA,CAAQ,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AAClE,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,OAAA,CAAQ,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AAElE,IAAA,MAAM,QAA2B,EAAC;AAClC,IAAA,MAAM,UAA6B,EAAC;AACpC,IAAA,MAAM,WAAiC,EAAC;AAGxC,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,MAAM,CAAA,IAAK,OAAA,EAAS;AAClC,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAC7B,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,MACnB,CAAA,MAAO;AACL,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,mBAAA,CAAoB,MAAA,EAAQ,MAAM,CAAA;AACvD,QAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,UAAA,QAAA,CAAS,IAAA,CAAK;AAAA,YACZ,WAAA,EAAa,MAAA;AAAA,YACb,eAAA,EAAiB,MAAA;AAAA,YACjB;AAAA,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,MAAM,CAAA,IAAK,OAAA,EAAS;AAClC,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,EAAG;AACpB,QAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,MACrB;AAAA,IACF;AAEA,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,MAAA,CAAQ,CAAA;AACxD,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,QAAA,CAAU,CAAA;AAC9D,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,EAAG,QAAA,CAAS,MAAM,CAAA,SAAA,CAAW,CAAA;AAEjE,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAS,KAAA,CAAM,MAAA,GAAS,IAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI;AAAA,KACjD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAA,CACE,KAAA,EACA,OAAA,EACA,OAAA,EACyC;AACzC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,OAAO,CAAA;AAC3C,IAAA,MAAM,UAAoB,EAAC;AAG3B,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAsB;AAC5C,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,MAAA,EAAO,EAAG;AACvC,MAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,QAAA,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,iBAAA,EAAmB,IAAI,CAAA;AAAA,MAC5C;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,GAAA,IAAO,SAAS,OAAA,EAAS;AAClC,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA;AACjC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAC1B,QAAA,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,IAAA,CAAK,EAAA,IAAM,CAAA,CAAE,EAAA,KAAO,KAAK,EAAE,CAAA;AAC9E,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAiB,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAAA,MAC5C;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,GAAA,IAAO,SAAS,QAAA,EAAU;AACnC,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,GAAA,CAAI,GAAA,CAAI,YAAY,EAAE,CAAA;AAC7C,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,WAAA,CAAY,WAAA;AAC7B,QAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,oBAAA,CAAqB,GAAA,CAAI,WAAW,CAAA;AAC5D,QAAA,IAAA,CAAK,QAAA,GAAW,IAAI,WAAA,CAAY,QAAA;AAChC,QAAA,IAAA,CAAK,SAAA,GAAY,KAAK,GAAA,EAAI;AAC1B,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAiB,IAAA,CAAK,KAAK,CAAA,EAAA,EAAK,IAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,MACxE;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,GAAA,IAAO,SAAS,KAAA,EAAO;AAChC,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,OAAA,GAAoB;AAAA,QACxB,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,QACtB,OAAO,GAAA,CAAI,WAAA;AAAA,QACX,WAAA,EAAa,IAAA,CAAK,oBAAA,CAAqB,GAAG,CAAA;AAAA,QAC1C,IAAA,EAAM,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AAAA,QAC9B,UAAU,GAAA,CAAI,QAAA;AAAA,QACd,MAAA,EAAQ,SAAA;AAAA,QACR,mBAAmB,GAAA,CAAI,EAAA;AAAA,QACvB,IAAA,EAAM,CAAC,GAAA,CAAI,IAAA,EAAM,IAAI,QAAQ,CAAA;AAAA,QAC7B,SAAA,EAAW,GAAA;AAAA,QACX,SAAA,EAAW;AAAA,OACb;AACA,MAAA,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI,OAAO,CAAA;AACnC,MAAA,KAAA,CAAM,SAAA,CAAU,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAA;AAC/B,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,YAAA,EAAe,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAA;AAAA,IAC7C;AAEA,IAAA,KAAA,CAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,OAAO,EAAE,OAAO,OAAA,EAAQ;AAAA,EAC1B;AAAA,EAEQ,mBAAA,CAAoB,KAAsB,OAAA,EAAoC;AACpF,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,IAAI,IAAI,WAAA,KAAgB,OAAA,CAAQ,WAAA,EAAa,OAAA,CAAQ,KAAK,aAAa,CAAA;AACvE,IAAA,IAAI,IAAI,QAAA,KAAa,OAAA,CAAQ,QAAA,EAAU,OAAA,CAAQ,KAAK,UAAU,CAAA;AAC9D,IAAA,IAAI,IAAI,IAAA,KAAS,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,KAAK,MAAM,CAAA;AAClD,IAAA,IAAI,IAAA,CAAK,UAAU,GAAA,CAAI,kBAAkB,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,kBAAkB,CAAA,EAAG;AACzF,MAAA,OAAA,CAAQ,KAAK,qBAAqB,CAAA;AAAA,IACpC;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,GAAA,CAAI,SAAS,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,SAAS,CAAA,EAAG;AACvE,MAAA,OAAA,CAAQ,KAAK,cAAc,CAAA;AAAA,IAC7B;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,qBAAqB,GAAA,EAA8B;AACzD,IAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,CAAI,WAAA,EAAa,EAAA,EAAI,CAAA,UAAA,EAAa,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,CAAA,cAAA,EAAiB,GAAA,CAAI,QAAQ,CAAA,CAAE,CAAA;AAC5F,IAAA,IAAI,GAAA,CAAI,kBAAA,CAAmB,MAAA,GAAS,CAAA,EAAG;AACrC,MAAA,KAAA,CAAM,IAAA,CAAK,IAAI,0BAA0B,CAAA;AACzC,MAAA,KAAA,MAAW,EAAA,IAAM,IAAI,kBAAA,EAAoB;AACvC,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,EAAE,CAAA,CAAE,CAAA;AAAA,MACtB;AAAA,IACF;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA,EAEQ,WAAW,IAAA,EAAiD;AAClE,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,YAAA;AACH,QAAA,OAAO,SAAA;AAAA,MACT,KAAK,UAAA;AACH,QAAA,OAAO,SAAA;AAAA,MACT,KAAK,aAAA;AACH,QAAA,OAAO,SAAA;AAAA,MACT,KAAK,IAAA;AACH,QAAA,OAAO,SAAA;AAAA,MACT;AACE,QAAA,OAAO,SAAA;AAAA;AACX,EACF;AACF;;;ACxJO,IAAM,eAAN,MAAmB;AAAA,EACP,IAAA;AAAA,EACT,OAAA,GAAU,KAAA;AAAA,EACV,QAAA,uBAAe,GAAA,EAAoB;AAAA,EAE3C,YAAY,IAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,KAAA,EAAkB,IAAA,EAAgD;AAC9E,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,MAAM,QAAA,GAAW,oBAAoB,KAAK,CAAA;AAC1C,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,MAAM,OAAA,GAAU,CAAA;AAChB,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,OAAO,CAAC,KAAK,OAAA,EAAS;AACpB,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA;AAE3C,MAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAE3B,QAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,MAAM,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,KAAA;AAAA,UAC/C,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,WAAA,IAAe,EAAE,MAAA,KAAW;AAAA,SAClD;AACA,QAAA,IAAI,OAAA,EAAS;AAGb,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAC7C,QAAA,IAAI,WAAA,EAAa;AAEjB,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,QAAQ,UAAA,CAAW,KAAA,CAAM,GAAG,IAAA,CAAK,IAAA,CAAK,iBAAiB,CAAC,CAAA;AAE9D,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA;AAAA,QAC5B,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,KAAK,oBAAA,CAAqB,IAAA,EAAM,KAAA,EAAO,IAAI,CAAC;AAAA,OAClE;AAEA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,QAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,QAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,QAAA,IAAI,CAAC,MAAA,IAAU,CAAC,IAAA,EAAM;AAEtB,QAAA,IAAI,MAAA,CAAO,WAAW,WAAA,EAAa;AACjC,UAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAY,OAAA,KAAY,MAAA,CAAO,KAAA;AAC/C,UAAA,IAAI,WAAW,OAAA,EAAS;AACtB,YAAA,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,IAAA,CAAK,IAAI,WAAW,CAAA;AACvD,YAAA,SAAA,EAAA;AACA,YAAA,IAAI,UAAU,CAAA,EAAG,OAAA,EAAA;AACjB,YAAA,IAAA,CAAK,IAAA,CAAK,cAAA,GAAiB,IAAA,EAAM,UAAU,CAAA;AAAA,UAC7C,CAAA,MAAA,IAAW,WAAW,KAAA,EAAO;AAC3B,YAAA,OAAA,EAAA;AAAA,UAEF,CAAA,MAAO;AACL,YAAA,IAAA,CAAK,KAAK,OAAA,CAAQ,gBAAA,CAAiB,KAAK,EAAA,EAAI,QAAA,EAAU,WAAW,KAAK,CAAA;AACtE,YAAA,MAAA,EAAA;AAAA,UACF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,IAAA,CAAK,QAAQ,gBAAA,CAAiB,IAAA,CAAK,IAAI,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AAC3E,UAAA,MAAA,EAAA;AACA,UAAA,IAAA,CAAK,IAAA,CAAK,UAAA,GAAa,IAAA,EAAM,MAAA,CAAO,QAAiB,CAAC,CAAA;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,IAAA,MAAM,OAAA,GAA4B;AAAA,MAChC,KAAA,EAAO,MAAM,KAAA,CAAM,IAAA;AAAA,MACnB,SAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAc,QAAA,CAAS;AAAA,KACzB;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,SAAS,OAAO,CAAA;AAC1B,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AAAA;AAAA,EAGQ,cAAc,KAAA,EAA8B;AAClD,IAAA,MAAM,QAAoB,EAAC;AAE3B,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,MAAA,EAAO,EAAG;AACvC,MAAA,IAAI,IAAA,CAAK,WAAW,SAAA,EAAW;AAG/B,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CACpB,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,YAAA,IAAgB,CAAA,CAAE,IAAA,KAAS,IAAA,CAAK,EAAE,CAAA,CAC3D,GAAA,CAAI,CAAC,CAAA,KAAM,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA,CAChC,MAAA,CAAO,OAAO,CAAA;AAEjB,MAAA,MAAM,kBAAkB,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,WAAW,CAAA;AACtE,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,MACjB;AAAA,IACF;AAGA,IAAA,MAAM,aAAA,GAAgB,EAAE,QAAA,EAAU,CAAA,EAAG,MAAM,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AAChE,IAAA,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,aAAA,CAAc,CAAA,CAAE,QAAQ,CAAA,IAAK,CAAA,KAAM,aAAA,CAAc,CAAA,CAAE,QAAQ,KAAK,CAAA,CAAE,CAAA;AAExF,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAc,oBAAA,CACZ,IAAA,EACA,KAAA,EACA,IAAA,EAC2D;AAC3D,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,UAAA,IAAc,CAAA;AAC3C,IAAA,IAAI,aAAa,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,IAAK,CAAA;AAE/C,IAAA,OAAO,cAAc,UAAA,EAAY;AAC/B,MAAA,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,IAAA,CAAK,IAAI,aAAa,CAAA;AACzD,MAAA,IAAA,CAAK,IAAA,CAAK,cAAc,IAAI,CAAA;AAE5B,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,IAAI,KAAK,CAAA;AAC5D,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,IAAI,KAAK,CAAA;AAExD,MAAA,MAAM,OAAA,GAAgC;AAAA,QACpC,IAAA;AAAA,QACA,KAAA;AAAA,QACA,IAAA;AAAA,QACA,YAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,MAAM,OAAO,CAAA;AAExD,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA,MAAM,iBAAiB,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,IAAK,CAAA;AACrD,UAAA,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAC5B,UAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,cAAA,EAAe;AAAA,QAC3C;AAEA,QAAA,IAAI,MAAA,CAAO,KAAA,IAAS,UAAA,GAAa,UAAA,EAAY;AAC3C,UAAA,UAAA,EAAA;AACA,UAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,UAAU,CAAA;AACrC,UAAA,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,IAAA,CAAK,IAAI,SAAS,CAAA;AACrD,UAAA;AAAA,QACF;AAEA,QAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,UAAA,EAAW;AAAA,MACvC,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,UAAA,UAAA,EAAA;AACA,UAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,UAAU,CAAA;AACrC,UAAA,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,IAAA,CAAK,IAAI,SAAS,CAAA;AACrD,UAAA,IAAA,CAAK,IAAA,CAAK,UAAA,GAAa,IAAA,EAAM,KAAA,EAAgB,UAAU,CAAA;AACvD,UAAA;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ;AAAA,YACN,OAAA,EAAS,KAAA;AAAA,YACT,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,WAC9D;AAAA,UACA,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,QAAQ,EAAE,OAAA,EAAS,OAAO,KAAA,EAAO,sBAAA,EAAuB,EAAG,OAAA,EAAS,UAAA,EAAW;AAAA,EAC1F;AAAA;AAAA,EAGQ,mBAAA,CAAoB,QAAgB,KAAA,EAA8B;AACxE,IAAA,OAAO,KAAA,CAAM,MACV,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,YAAA,IAAgB,CAAA,CAAE,IAAA,KAAS,MAAM,EAC1D,GAAA,CAAI,CAAC,CAAA,KAAM,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,EAAE,EAAE,CAAC,CAAA,CAChC,MAAA,CAAO,OAAO,CAAA;AAAA,EACnB;AAAA;AAAA,EAGQ,iBAAA,CAAkB,QAAgB,KAAA,EAA8B;AACtE,IAAA,OAAO,KAAA,CAAM,MACV,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,YAAA,IAAgB,CAAA,CAAE,EAAA,KAAO,MAAM,EACxD,GAAA,CAAI,CAAC,CAAA,KAAM,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,EAAE,IAAI,CAAC,CAAA,CAClC,MAAA,CAAO,OAAO,CAAA;AAAA,EACnB;AAAA;AAAA,EAGQ,eAAe,KAAA,EAA2B;AAChD,IAAA,MAAM,YAAY,KAAA,CAAM,IAAA,CAAK,MAAM,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,MACjD,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,SAAA,IAAa,EAAE,MAAA,KAAW;AAAA,KAChD;AAEA,IAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAEnC,IAAA,OAAO,SAAA,CAAU,KAAA,CAAM,CAAC,IAAA,KAAS;AAC/B,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CACpB,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,YAAA,IAAgB,CAAA,CAAE,IAAA,KAAS,IAAA,CAAK,EAAE,CAAA,CAC3D,GAAA,CAAI,CAAC,CAAA,KAAM,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA,CAChC,MAAA,CAAO,OAAO,CAAA;AAEjB,MAAA,OAAO,SAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,QAAQ,CAAA;AAAA,IACnD,CAAC,CAAA;AAAA,EACH;AACF;AAKO,SAAS,mBAAmB,IAAA,EAMlB;AACf,EAAA,OAAO,IAAI,YAAA,CAAa;AAAA,IACtB,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,YAAY,IAAA,CAAK;AAAA,GAClB,CAAA;AACH","file":"index.js","sourcesContent":["import { randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport interface AtomicWriteOptions {\n mode?: number;\n encoding?: BufferEncoding;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array,\n opts: AtomicWriteOptions = {},\n): Promise<void> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const tmp = path.join(dir, `.${path.basename(targetPath)}.${randomBytes(6).toString('hex')}.tmp`);\n\n // Write content to tmp first; 'wx' ensures exclusive creation (fails if\n // tmp already exists — extremely unlikely with 6-byte random suffix).\n try {\n if (typeof content === 'string') {\n await fs.writeFile(tmp, content, { flag: 'wx', encoding: opts.encoding ?? 'utf8' });\n } else {\n await fs.writeFile(tmp, content, { flag: 'wx' });\n }\n try {\n const fh = await fs.open(tmp, 'r+');\n try {\n await fh.sync();\n } finally {\n await fh.close();\n }\n } catch {\n // fsync best-effort\n }\n // Now safely read mode from target (if it exists) and apply to tmp before rename.\n // Prefer opts.mode for new files; for existing files preserve their mode.\n let mode: number | undefined;\n try {\n const stat = await fs.stat(targetPath);\n mode = stat.mode & 0o777;\n } catch {\n mode = opts.mode;\n }\n if (mode !== undefined) {\n await fs.chmod(tmp, mode);\n }\n await renameWithRetry(tmp, targetPath);\n } catch (err) {\n try {\n await fs.unlink(tmp);\n } catch {\n // ignore cleanup error\n }\n throw err;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\n// On Windows, fs.rename over an existing file can fail with EPERM/EBUSY/EACCES\n// when antivirus, file indexers, editor file watchers, or a concurrent writer\n// briefly hold a handle on the destination. These are transient — retry with a\n// short backoff before giving up. POSIX renames are atomic and won't hit this.\nconst TRANSIENT_RENAME_CODES = new Set(['EPERM', 'EBUSY', 'EACCES', 'ENOTEMPTY']);\n\nasync function renameWithRetry(from: string, to: string): Promise<void> {\n if (process.platform !== 'win32') {\n await fs.rename(from, to);\n return;\n }\n const delays = [10, 25, 60, 120, 250];\n let lastErr: unknown;\n for (let i = 0; i <= delays.length; i++) {\n try {\n await fs.rename(from, to);\n return;\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException)?.code;\n if (!code || !TRANSIENT_RENAME_CODES.has(code) || i === delays.length) {\n throw err;\n }\n await new Promise((resolve) => setTimeout(resolve, delays[i]));\n }\n }\n throw lastErr;\n}\n","import type {\n SpecAnalysis,\n SpecRequirement,\n SpecSection,\n SpecValidationResult,\n Specification,\n} from '../types/spec.js';\n\nexport class SpecParser {\n parse(content: string): Specification {\n const lines = content.split('\\n');\n const sections = this.extractSections(lines);\n const requirements = this.extractRequirements(lines);\n const now = Date.now();\n\n return {\n id: crypto.randomUUID(),\n title: this.extractTitle(lines),\n version: this.extractVersion(lines),\n status: 'draft',\n overview: this.extractOverview(lines),\n sections,\n requirements,\n createdAt: now,\n updatedAt: now,\n };\n }\n\n private extractTitle(lines: string[]): string {\n for (const line of lines) {\n const m = /^#\\s+(.+)/.exec(line.trim());\n if (m?.[1]) return m[1];\n }\n return 'Untitled Specification';\n }\n\n private extractVersion(lines: string[]): string {\n for (const line of lines) {\n const m = /version[:\\s]+(\\d+\\.\\d+\\.\\d+)/i.exec(line.trim());\n if (m?.[1]) return m[1];\n }\n return '0.0.1';\n }\n\n private extractOverview(lines: string[]): string {\n const overviewLines: string[] = [];\n let inOverview = false;\n let foundHeading = false;\n\n for (const line of lines) {\n if (/^##\\s+Overview/i.test(line.trim())) {\n inOverview = true;\n foundHeading = true;\n continue;\n }\n if (foundHeading && /^##\\s+/.test(line.trim())) break;\n if (inOverview) overviewLines.push(line);\n }\n\n return overviewLines.join('\\n').trim() || 'No overview provided';\n }\n\n private extractSections(lines: string[]): SpecSection[] {\n const sections: SpecSection[] = [];\n let currentSection: Partial<SpecSection> | null = null;\n let currentLines: string[] = [];\n let depth = 1;\n\n for (const line of lines) {\n const h2 = /^##\\s+(.+)/.exec(line.trim());\n const h3 = /^###\\s+(.+)/.exec(line.trim());\n\n if (h2) {\n if (currentSection && currentLines.length > 0) {\n sections.push({\n type: this.mapSectionType(currentSection.title ?? 'unknown'),\n title: currentSection.title ?? 'Unknown',\n level: depth,\n content: currentLines.join('\\n').trim(),\n });\n }\n currentSection = { title: h2[1] ?? 'Unknown' };\n currentLines = [];\n depth = 2;\n continue;\n }\n\n if (h3) {\n currentLines.push(line);\n continue;\n }\n\n if (currentSection) {\n currentLines.push(line);\n }\n }\n\n if (currentSection && currentLines.length > 0) {\n sections.push({\n type: this.mapSectionType(currentSection.title ?? 'unknown'),\n title: currentSection.title ?? 'Unknown',\n level: depth,\n content: currentLines.join('\\n').trim(),\n });\n }\n\n return sections;\n }\n\n private extractRequirements(lines: string[]): SpecRequirement[] {\n const requirements: SpecRequirement[] = [];\n let inRequirements = false;\n let idCounter = 0;\n\n for (const line of lines) {\n if (/^##\\s+Requirements/i.test(line.trim())) {\n inRequirements = true;\n continue;\n }\n if (inRequirements && /^##\\s+/.test(line.trim())) break;\n\n if (inRequirements) {\n const req = this.parseRequirementLine(line, `REQ-${++idCounter}`);\n if (req) requirements.push(req);\n }\n }\n\n return requirements;\n }\n\n private parseRequirementLine(line: string, id: string): SpecRequirement | null {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) return null;\n\n const lower = trimmed.toLowerCase();\n const types: SpecRequirement['type'][] = [\n 'functional',\n 'non-functional',\n 'security',\n 'performance',\n 'ux',\n ];\n let type: SpecRequirement['type'] = 'functional';\n for (const t of types) {\n if (lower.includes(`[${t}]`)) type = t;\n }\n\n let priority: SpecRequirement['priority'] = 'medium';\n if (trimmed.includes('[critical]') || trimmed.includes('[prio:high]')) {\n priority = 'critical';\n } else if (trimmed.includes('[high]')) {\n priority = 'high';\n } else if (trimmed.includes('[low]')) {\n priority = 'low';\n }\n\n return {\n id,\n type,\n priority,\n description: trimmed.replace(/\\[[^\\]]+\\]/g, '').trim(),\n acceptanceCriteria: [],\n };\n }\n\n private mapSectionType(title: string): SpecSection['type'] {\n const t = title.toLowerCase();\n if (t.includes('overview')) return 'overview';\n if (t.includes('requirement')) return 'requirements';\n if (t.includes('architect')) return 'architecture';\n if (t.includes('api')) return 'api';\n if (t.includes('data')) return 'data';\n if (t.includes('security')) return 'security';\n if (t.includes('acceptance')) return 'acceptance';\n return 'overview';\n }\n\n analyze(spec: Specification): SpecAnalysis {\n const gaps: string[] = [];\n const suggestions: string[] = [];\n const risks: SpecAnalysis['risks'] = [];\n\n // Check completeness\n const hasOverview = spec.sections.some((s) => s.type === 'overview');\n const hasRequirements = spec.sections.some((s) => s.type === 'requirements');\n const hasAcceptance = spec.sections.some((s) => s.type === 'acceptance');\n\n if (!hasOverview) gaps.push('Missing Overview section');\n if (!hasRequirements) gaps.push('Missing Requirements section');\n if (!hasAcceptance) gaps.push('Missing Acceptance Criteria section');\n\n if (spec.requirements.length === 0) {\n gaps.push('No requirements defined');\n suggestions.push('Add specific functional and non-functional requirements');\n }\n\n const unverifiedReqs = spec.requirements.filter((r) => r.acceptanceCriteria.length === 0);\n if (unverifiedReqs.length > 0) {\n gaps.push(`${unverifiedReqs.length} requirements without acceptance criteria`);\n suggestions.push('Define clear acceptance criteria for each requirement');\n }\n\n const criticalUnresolved = spec.requirements.filter(\n (r) => r.priority === 'critical' && r.blockedBy && r.blockedBy.length > 0,\n );\n for (const req of criticalUnresolved) {\n risks.push({\n requirement: req.id,\n risk: `Critical requirement blocked by ${req.blockedBy?.length} other requirements`,\n severity: 'high',\n });\n }\n\n const completeness = Math.round(\n (((hasOverview ? 1 : 0) +\n (hasRequirements ? 1 : 0) +\n (hasAcceptance ? 1 : 0) +\n (spec.requirements.length > 0 ? 1 : 0) +\n (spec.sections.length > 3 ? 1 : 0)) /\n 5) *\n 100,\n );\n\n return {\n specId: spec.id,\n completeness,\n coverage: {\n requirements: spec.requirements.length,\n apiEndpoints: spec.apiEndpoints?.length ?? 0,\n edgeCases: 0,\n errorHandling: 0,\n },\n gaps,\n risks,\n suggestions,\n };\n }\n\n validate(spec: Specification): SpecValidationResult {\n const errors: SpecValidationResult['errors'] = [];\n const warnings: SpecValidationResult['warnings'] = [];\n\n if (!spec.title.trim()) {\n errors.push({ path: 'title', message: 'Title is required' });\n }\n\n if (!spec.version.trim()) {\n errors.push({ path: 'version', message: 'Version is required' });\n }\n\n for (const req of spec.requirements) {\n if (!req.description.trim()) {\n errors.push({ path: `requirement.${req.id}`, message: 'Requirement description is empty' });\n }\n if (req.acceptanceCriteria.length === 0) {\n warnings.push({ path: `requirement.${req.id}`, message: 'No acceptance criteria defined' });\n }\n }\n\n const reqIds = new Set(spec.requirements.map((r) => r.id));\n const blockedByIds = new Set(spec.requirements.flatMap((r) => r.blockedBy ?? []));\n for (const id of blockedByIds) {\n if (!reqIds.has(id)) {\n errors.push({\n path: 'requirements',\n message: `BlockedBy references non-existent requirement: ${id}`,\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n }\n}\n","import type { SpecRequirement, Specification } from '../types/spec.js';\nimport type { TaskGraph, TaskNode, TaskPriority, TaskType } from '../types/task-graph.js';\nimport type { TaskStore, TaskTracker } from './task-tracker.js';\n\nexport interface TaskGeneratorOptions {\n taskTracker: TaskTracker;\n}\n\nexport interface GeneratedTask {\n specRequirementId?: string;\n title: string;\n description: string;\n type: TaskType;\n priority: TaskPriority;\n estimateHours?: number;\n tags?: string[];\n}\n\nexport class TaskGenerator {\n constructor(private readonly opts: TaskGeneratorOptions) {}\n\n async generateFromSpec(spec: Specification): Promise<TaskGraph> {\n const graph = await this.opts.taskTracker.createGraph(spec.id, spec.title);\n\n const overview = spec.sections.find((s) => s.type === 'overview');\n if (overview) {\n this.opts.taskTracker.addNode({\n title: `Implement ${spec.title}`,\n description: overview.content,\n type: 'feature',\n priority: 'high',\n status: 'pending',\n });\n }\n\n // Group requirements by priority in a single pass, then emit in priority order.\n const byPriority: Record<TaskPriority, SpecRequirement[]> = {\n critical: [],\n high: [],\n medium: [],\n low: [],\n };\n for (const req of spec.requirements) {\n const bucket = byPriority[req.priority] ?? byPriority.medium;\n bucket.push(req);\n }\n\n const order: TaskPriority[] = ['critical', 'high', 'medium', 'low'];\n for (const p of order) {\n for (const req of byPriority[p]) {\n this.opts.taskTracker.addNode(this.createTaskFromRequirement(req));\n }\n }\n\n // API tasks\n if (spec.apiEndpoints && spec.apiEndpoints.length > 0) {\n const apiParent = this.opts.taskTracker.addNode({\n title: 'API Implementation',\n description: `Implement ${spec.apiEndpoints.length} API endpoints`,\n type: 'feature',\n priority: 'high',\n status: 'pending',\n });\n\n for (const endpoint of spec.apiEndpoints) {\n const task = this.createTaskFromEndpoint(endpoint);\n this.opts.taskTracker.addNode({\n ...task,\n parentId: apiParent.id,\n });\n }\n }\n\n // Test tasks\n this.opts.taskTracker.addNode({\n title: 'Write Tests',\n description: 'Comprehensive test coverage for all features',\n type: 'test',\n priority: 'high',\n status: 'pending',\n });\n\n // Documentation tasks\n this.opts.taskTracker.addNode({\n title: 'Update Documentation',\n description: 'Update docs for new features',\n type: 'docs',\n priority: 'medium',\n status: 'pending',\n });\n\n return graph;\n }\n\n private createTaskFromRequirement(\n req: SpecRequirement,\n ): Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'> {\n return {\n title: req.description,\n description: this.buildDescription(req),\n type: this.mapRequirementType(req.type),\n priority: req.priority,\n status: 'pending',\n specRequirementId: req.id,\n tags: [req.type, req.priority],\n estimateHours: this.estimateHours(req),\n };\n }\n\n private createTaskFromEndpoint(\n endpoint: NonNullable<Specification['apiEndpoints']>[number],\n ): Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'> {\n return {\n title: `${endpoint.method} ${endpoint.path}`,\n description: endpoint.description,\n type: 'feature',\n priority: 'high',\n status: 'pending',\n tags: [endpoint.method],\n estimateHours: this.estimateForEndpoint(endpoint),\n };\n }\n\n private buildDescription(req: SpecRequirement): string {\n const lines = [req.description, '', '**Type:** ' + req.type, '**Priority:** ' + req.priority];\n\n if (req.acceptanceCriteria.length > 0) {\n lines.push('', '**Acceptance Criteria:**');\n for (const criterion of req.acceptanceCriteria) {\n lines.push(`- ${criterion}`);\n }\n }\n\n if (req.blockedBy && req.blockedBy.length > 0) {\n lines.push('', `**Blocked by:** ${req.blockedBy.join(', ')}`);\n }\n\n return lines.join('\\n');\n }\n\n private mapRequirementType(type: SpecRequirement['type']): TaskType {\n switch (type) {\n case 'functional':\n return 'feature';\n case 'non-functional':\n return 'feature';\n case 'security':\n return 'feature';\n case 'performance':\n return 'feature';\n case 'ux':\n return 'feature';\n default:\n return 'feature';\n }\n }\n\n private estimateHours(req: SpecRequirement): number {\n switch (req.priority) {\n case 'critical':\n return 8;\n case 'high':\n return 4;\n case 'medium':\n return 2;\n case 'low':\n return 1;\n default:\n return 2;\n }\n }\n\n private estimateForEndpoint(\n endpoint: NonNullable<Specification['apiEndpoints']>[number],\n ): number {\n let hours = 2;\n if (endpoint.auth) hours += 1;\n if (endpoint.request) hours += 1;\n return hours;\n }\n\n async generateSubtasks(parentTaskId: string, spec: Specification): Promise<void> {\n const reqId = this.opts.taskTracker.getNode(parentTaskId)?.specRequirementId;\n if (!reqId) return;\n\n const req = spec.requirements.find((r) => r.id === reqId);\n if (!req) return;\n\n if (req.acceptanceCriteria.length > 0) {\n for (const criterion of req.acceptanceCriteria) {\n this.opts.taskTracker.addNode({\n title: criterion,\n description: `Verify: ${criterion}`,\n type: 'test',\n priority: 'medium',\n status: 'pending',\n parentId: parentTaskId,\n });\n }\n }\n }\n}\n\nexport class DefaultTaskStore implements TaskStore {\n private graphs = new Map<string, TaskGraph>();\n\n async saveGraph(graph: TaskGraph): Promise<void> {\n this.graphs.set(graph.id, this.cloneGraph(graph));\n }\n\n async loadGraph(id: string): Promise<TaskGraph | null> {\n const g = this.graphs.get(id);\n return g ? this.cloneGraph(g) : null;\n }\n\n async listGraphs(): Promise<{ id: string; title: string; updatedAt: number }[]> {\n return Array.from(this.graphs.values()).map((g) => ({\n id: g.id,\n title: g.title,\n updatedAt: g.updatedAt,\n }));\n }\n\n async deleteGraph(id: string): Promise<void> {\n this.graphs.delete(id);\n }\n\n private cloneGraph(g: TaskGraph): TaskGraph {\n return {\n ...g,\n nodes: new Map(g.nodes),\n edges: [...g.edges],\n rootNodes: [...g.rootNodes],\n };\n }\n}\n","export type TaskStatus = 'pending' | 'in_progress' | 'blocked' | 'failed' | 'review' | 'completed';\nexport type TaskPriority = 'critical' | 'high' | 'medium' | 'low';\nexport type TaskType = 'feature' | 'bugfix' | 'refactor' | 'docs' | 'test' | 'chore';\n\nexport interface TaskNode {\n id: string;\n title: string;\n description: string;\n type: TaskType;\n priority: TaskPriority;\n status: TaskStatus;\n assignee?: string;\n estimateHours?: number;\n actualHours?: number;\n tags?: string[];\n specRequirementId?: string;\n parentId?: string;\n children?: string[];\n createdAt: number;\n updatedAt: number;\n completedAt?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface TaskEdge {\n id: string;\n from: string;\n to: string;\n type: 'blocks' | 'depends_on' | 'relates_to' | 'implements';\n weight?: number;\n}\n\nexport interface TaskGraph {\n id: string;\n specId: string;\n title: string;\n nodes: Map<string, TaskNode>;\n edges: TaskEdge[];\n rootNodes: string[];\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface TaskDependency {\n taskId: string;\n blockedBy: string[];\n blocking: string[];\n}\n\nexport interface TaskAssignment {\n taskId: string;\n assignee: string;\n assignedAt: number;\n}\n\nexport interface TaskProgress {\n total: number;\n pending: number;\n inProgress: number;\n blocked: number;\n failed: number;\n review: number;\n completed: number;\n percentComplete: number;\n estimatedHours: number;\n actualHours: number;\n}\n\nexport interface TaskFilter {\n status?: TaskStatus[];\n priority?: TaskPriority[];\n type?: TaskType[];\n assignee?: string[];\n tags?: string[];\n specRequirementId?: string;\n}\n\nexport interface TaskSort {\n field: 'priority' | 'createdAt' | 'updatedAt' | 'status';\n direction: 'asc' | 'desc';\n}\n\nexport interface CriticalPathResult {\n taskIds: string[];\n totalEstimateHours: number;\n bottleneckTasks: string[];\n}\n\nexport function computeTaskProgress(graph: TaskGraph): TaskProgress {\n let completed = 0;\n let pending = 0;\n let inProgress = 0;\n let blocked = 0;\n let failed = 0;\n let review = 0;\n let estimatedHours = 0;\n let actualHours = 0;\n for (const n of graph.nodes.values()) {\n switch (n.status) {\n case 'completed':\n completed++;\n break;\n case 'pending':\n pending++;\n break;\n case 'in_progress':\n inProgress++;\n break;\n case 'blocked':\n blocked++;\n break;\n case 'failed':\n failed++;\n break;\n case 'review':\n review++;\n break;\n }\n estimatedHours += n.estimateHours ?? 0;\n actualHours += n.actualHours ?? 0;\n }\n const total = graph.nodes.size;\n\n return {\n total,\n pending,\n inProgress,\n blocked,\n failed,\n review,\n completed,\n percentComplete: total > 0 ? Math.round((completed / total) * 100) : 0,\n estimatedHours,\n actualHours,\n };\n}\n\nexport function findCriticalPath(graph: TaskGraph): CriticalPathResult {\n const nodes = Array.from(graph.nodes.values());\n const criticalNodes = nodes.filter((n) => n.priority === 'critical');\n const bottleneckTasks = criticalNodes\n .filter((n) => graph.edges.some((e) => e.to === n.id && e.type === 'depends_on'))\n .map((n) => n.id);\n\n const totalEstimateHours = criticalNodes.reduce((sum, n) => sum + (n.estimateHours ?? 0), 0);\n\n return {\n taskIds: criticalNodes.map((n) => n.id),\n totalEstimateHours,\n bottleneckTasks,\n };\n}\n\nexport function topologicalSort(graph: TaskGraph): string[] {\n const visited = new Set<string>();\n const inStack = new Set<string>();\n const result: string[] = [];\n\n function visit(id: string): void {\n // Cycle: callers must detect cycles up-front if they care; we just stop recursing.\n if (inStack.has(id)) return;\n if (visited.has(id)) return;\n if (!graph.nodes.has(id)) return;\n\n visited.add(id);\n inStack.add(id);\n\n for (const edge of graph.edges) {\n if (edge.from === id) visit(edge.to);\n }\n\n inStack.delete(id);\n result.push(id);\n }\n\n for (const rootId of graph.rootNodes) {\n visit(rootId);\n }\n\n return result;\n}\n","import type {\n TaskFilter,\n TaskGraph,\n TaskNode,\n TaskProgress,\n TaskSort,\n} from '../types/task-graph.js';\nimport { computeTaskProgress } from '../types/task-graph.js';\n\nexport interface TaskStore {\n saveGraph(graph: TaskGraph): Promise<void>;\n loadGraph(id: string): Promise<TaskGraph | null>;\n listGraphs(): Promise<{ id: string; title: string; updatedAt: number }[]>;\n deleteGraph(id: string): Promise<void>;\n}\n\nexport interface TaskTrackerOptions {\n store: TaskStore;\n /**\n * Called when an in-the-background persistence (`saveGraph`) rejects.\n * The synchronous TaskTracker methods (addNode/addEdge/updateNodeStatus)\n * fire-and-forget their writes; without this, a failing store silently\n * loses graph mutations. Defaults to a console.warn.\n */\n onPersistError?: (err: unknown) => void;\n}\n\nexport interface TaskTransition {\n from: TaskNode['status'];\n to: TaskNode['status'];\n timestamp: number;\n reason?: string;\n}\n\nexport class TaskTracker {\n private graph: TaskGraph | null = null;\n private transitions: TaskTransition[] = [];\n\n constructor(private readonly opts: TaskTrackerOptions) {}\n\n async createGraph(specId: string, title: string): Promise<TaskGraph> {\n this.graph = {\n id: crypto.randomUUID(),\n specId,\n title,\n nodes: new Map(),\n edges: [],\n rootNodes: [],\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n await this.opts.store.saveGraph(this.graph);\n return this.graph;\n }\n\n async loadGraph(id: string): Promise<TaskGraph | null> {\n this.graph = await this.opts.store.loadGraph(id);\n return this.graph;\n }\n\n addNode(node: Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'>): TaskNode {\n if (!this.graph) throw new Error('No graph loaded');\n\n const now = Date.now();\n const newNode: TaskNode = {\n ...node,\n id: crypto.randomUUID(),\n status: node.status ?? 'pending',\n createdAt: now,\n updatedAt: now,\n };\n\n this.graph.nodes.set(newNode.id, newNode);\n\n if (!node.parentId) {\n this.graph.rootNodes.push(newNode.id);\n }\n\n this.graph.updatedAt = now;\n this.persist();\n\n return newNode;\n }\n\n addEdge(from: string, to: string, type: TaskGraph['edges'][0]['type'] = 'depends_on'): void {\n if (!this.graph) throw new Error('No graph loaded');\n\n this.graph.edges.push({\n id: crypto.randomUUID(),\n from,\n to,\n type,\n });\n this.graph.updatedAt = Date.now();\n this.persist();\n }\n\n updateNodeStatus(id: string, status: TaskNode['status'], reason?: string): void {\n if (!this.graph) throw new Error('No graph loaded');\n\n const node = this.graph.nodes.get(id);\n if (!node) throw new Error(`Node ${id} not found`);\n\n const from = node.status;\n const now = Date.now();\n node.status = status;\n node.updatedAt = now;\n\n if (status === 'completed') {\n node.completedAt = now;\n }\n\n this.transitions.push({ from, to: status, timestamp: now, reason });\n\n // Auto-unblock dependents\n if (status === 'completed') {\n this.unblockDependents(id);\n }\n\n // Auto-block blockers\n if (status === 'in_progress') {\n this.checkAndBlockIfNeeded(id);\n }\n\n this.graph.updatedAt = now;\n this.persist();\n }\n\n getNode(id: string): TaskNode | undefined {\n return this.graph?.nodes.get(id);\n }\n\n getAllNodes(filter?: TaskFilter, sort?: TaskSort): TaskNode[] {\n if (!this.graph) return [];\n\n let nodes = Array.from(this.graph.nodes.values());\n\n if (filter) {\n nodes = nodes.filter((n) => {\n if (filter.status?.length && !filter.status.includes(n.status)) return false;\n if (filter.priority?.length && !filter.priority.includes(n.priority)) return false;\n if (filter.type?.length && !filter.type.includes(n.type)) return false;\n if (filter.assignee?.length && n.assignee && !filter.assignee.includes(n.assignee))\n return false;\n if (filter.tags?.length && n.tags && !n.tags.some((t) => filter.tags!.includes(t)))\n return false;\n if (filter.specRequirementId && n.specRequirementId !== filter.specRequirementId)\n return false;\n return true;\n });\n }\n\n if (sort) {\n nodes.sort((a, b) => {\n const cmp = compareByField(a, b, sort.field);\n return sort.direction === 'asc' ? cmp : -cmp;\n });\n }\n\n return nodes;\n }\n\n getChildren(parentId: string): TaskNode[] {\n if (!this.graph) return [];\n return Array.from(this.graph.nodes.values()).filter((n) => n.parentId === parentId);\n }\n\n getDependents(taskId: string): string[] {\n if (!this.graph) return [];\n return this.graph.edges\n .filter((e) => e.from === taskId && e.type === 'depends_on')\n .map((e) => e.to);\n }\n\n getBlockers(taskId: string): string[] {\n if (!this.graph) return [];\n return this.graph.edges\n .filter((e) => e.to === taskId && e.type === 'depends_on')\n .map((e) => e.from);\n }\n\n canStart(taskId: string): boolean {\n const blockers = this.getBlockers(taskId);\n return blockers.every((id) => {\n const node = this.graph?.nodes.get(id);\n return node?.status === 'completed';\n });\n }\n\n getProgress(): TaskProgress {\n if (!this.graph) {\n return {\n total: 0,\n pending: 0,\n inProgress: 0,\n blocked: 0,\n failed: 0,\n review: 0,\n completed: 0,\n percentComplete: 0,\n estimatedHours: 0,\n actualHours: 0,\n };\n }\n return computeTaskProgress(this.graph);\n }\n\n getTransitions(taskId?: string): TaskTransition[] {\n if (!taskId) return [...this.transitions];\n // Would need taskId tracking per transition\n return [...this.transitions];\n }\n\n private unblockDependents(completedId: string): void {\n if (!this.graph) return;\n const dependents = this.getDependents(completedId);\n for (const depId of dependents) {\n const dep = this.graph.nodes.get(depId);\n if (dep?.status === 'blocked') {\n const remainingBlockers = this.getBlockers(depId);\n const allUnblocked = remainingBlockers.every((id) => {\n const blocker = this.graph?.nodes.get(id);\n return blocker?.status === 'completed';\n });\n if (allUnblocked) {\n dep.status = 'pending';\n dep.updatedAt = Date.now();\n }\n }\n }\n }\n\n private checkAndBlockIfNeeded(taskId: string): void {\n if (!this.graph) return;\n const blockers = this.getBlockers(taskId);\n const someBlocked = blockers.some((id) => {\n const blocker = this.graph?.nodes.get(id);\n return blocker?.status !== 'completed';\n });\n if (someBlocked) {\n const node = this.graph.nodes.get(taskId);\n if (node) {\n node.status = 'blocked';\n node.updatedAt = Date.now();\n }\n }\n }\n\n /**\n * Fire-and-forget persistence with attached error handler.\n * Synchronous mutators (addNode/addEdge/updateNodeStatus) use this to\n * avoid forcing an async cascade through every caller; if the store\n * rejects, the configured `onPersistError` is invoked so failures are\n * surfaced instead of swallowed by an unhandled promise rejection.\n */\n private persist(): void {\n if (!this.graph) return;\n this.opts.store.saveGraph(this.graph).catch((err) => {\n if (this.opts.onPersistError) this.opts.onPersistError(err);\n else\n console.warn(\n '[task-tracker] saveGraph failed:',\n err instanceof Error ? err.message : String(err),\n );\n });\n }\n}\n\nconst PRIORITY_RANK: Record<TaskNode['priority'], number> = {\n critical: 0,\n high: 1,\n medium: 2,\n low: 3,\n};\nconst STATUS_RANK: Record<TaskNode['status'], number> = {\n in_progress: 0,\n pending: 1,\n review: 2,\n blocked: 3,\n failed: 4,\n completed: 5,\n};\n\nfunction compareByField(a: TaskNode, b: TaskNode, field: TaskSort['field']): number {\n switch (field) {\n case 'priority':\n return PRIORITY_RANK[a.priority] - PRIORITY_RANK[b.priority];\n case 'status':\n return STATUS_RANK[a.status] - STATUS_RANK[b.status];\n case 'createdAt':\n return a.createdAt - b.createdAt;\n case 'updatedAt':\n return a.updatedAt - b.updatedAt;\n }\n}\n","import type { EventBus } from '../kernel/events.js';\nimport type { DoneCondition } from '../types/multi-agent.js';\nimport type { SpecAnalysis, Specification } from '../types/spec.js';\nimport type { TaskGraph, TaskNode } from '../types/task-graph.js';\nimport { SpecParser } from './spec-parser.js';\nimport { DefaultTaskStore, TaskGenerator } from './task-generator.js';\nimport { TaskTracker } from './task-tracker.js';\n\n/**\n * Extended event map used internally by TaskFlow and multi-agent components.\n * These events are emitted on the injected EventBus and are a subset of\n * the full EventMap — they do not require a separate registration.\n */\nexport interface TaskFlowEventMap {\n 'phase.change': { from: TaskFlowPhase; to: TaskFlowPhase };\n 'task.started': { taskId: string };\n 'task.completed': { taskId: string; result?: unknown };\n 'task.failed': { taskId: string; error: string };\n 'task.review': { taskId: string };\n 'spec.analyzed': { analysis: SpecAnalysis };\n progress: { percent: number; message: string };\n done: { graph: TaskGraph };\n error: { phase: TaskFlowPhase; error: Error };\n}\n\nexport type TaskFlowPhase =\n | 'idle'\n | 'parsing'\n | 'analyzing'\n | 'generating'\n | 'executing'\n | 'reviewing'\n | 'completing'\n | 'done'\n | 'failed';\n\nexport type TaskFlowEventName = keyof TaskFlowEventMap;\n\nexport interface TaskFlowOptions {\n tracker: TaskTracker;\n events: EventBus;\n doneCondition?: DoneCondition;\n maxConcurrent?: number;\n}\n\nexport interface TaskFlowExecutionContext {\n executeTask: (task: TaskNode) => Promise<unknown>;\n onTaskComplete?: (task: TaskNode, result: unknown) => void;\n onTaskFail?: (task: TaskNode, error: Error) => void;\n}\n\nexport class TaskFlow {\n private phase: TaskFlowPhase = 'idle';\n private spec: Specification | null = null;\n private graph: TaskGraph | null = null;\n private stopped = false;\n\n constructor(private readonly opts: TaskFlowOptions) {\n this.setPhase('idle');\n }\n\n private emit<K extends TaskFlowEventName>(event: K, payload: TaskFlowEventMap[K]): void {\n (this.opts.events.emit as (event: string, payload: unknown) => void)(event, payload);\n }\n\n async fromSpec(specContent: string): Promise<TaskGraph> {\n this.setPhase('parsing');\n\n const parser = new SpecParser();\n this.spec = parser.parse(specContent);\n\n this.setPhase('analyzing');\n const analysis = parser.analyze(this.spec);\n this.emit('spec.analyzed', { analysis });\n\n if (analysis.completeness < 50) {\n this.emit('error', {\n phase: 'analyzing',\n error: new Error(`Spec completeness too low: ${analysis.completeness}%`),\n });\n this.setPhase('failed');\n throw new Error('Spec too incomplete');\n }\n\n this.setPhase('generating');\n const generator = new TaskGenerator({ taskTracker: this.opts.tracker });\n this.graph = await generator.generateFromSpec(this.spec);\n\n return this.graph;\n }\n\n async execute(ctx: TaskFlowExecutionContext): Promise<TaskGraph> {\n if (!this.graph) throw new Error('No graph loaded. Call fromSpec first.');\n\n this.setPhase('executing');\n this.stopped = false;\n\n const pendingTasks = this.getExecutableTasks();\n const maxConcurrent = this.opts.maxConcurrent ?? 2;\n\n while (pendingTasks.length > 0 && !this.stopped) {\n const batch = pendingTasks.splice(0, maxConcurrent);\n const results = await Promise.allSettled(\n batch.map((task) => this.executeSingleTask(task, ctx)),\n );\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const task = batch[i];\n\n if (!result || !task) continue;\n\n if (result.status === 'rejected') {\n const reason = result.reason as Error | undefined;\n this.opts.tracker.updateNodeStatus(task.id, 'failed', reason?.message);\n this.emit('task.failed', { taskId: task.id, error: reason?.message ?? 'unknown' });\n ctx.onTaskFail?.(task, reason as Error);\n } else {\n this.opts.tracker.updateNodeStatus(task.id, 'completed');\n this.emit('task.completed', { taskId: task.id, result: result.value });\n ctx.onTaskComplete?.(task, result.value);\n }\n\n this.emitProgress();\n }\n\n // Re-evaluate pending tasks (some may have become unblocked)\n const stillPending = this.getExecutableTasks();\n pendingTasks.length = 0;\n pendingTasks.push(...stillPending);\n\n // Check done condition\n if (this.checkDoneCondition()) {\n break;\n }\n }\n\n this.setPhase('completing');\n this.emit('done', { graph: this.graph });\n this.setPhase('done');\n\n return this.graph;\n }\n\n async reviewTask(taskId: string, approved: boolean, comment?: string): Promise<void> {\n const task = this.opts.tracker.getNode(taskId);\n if (!task) throw new Error(`Task ${taskId} not found`);\n\n if (approved) {\n this.opts.tracker.updateNodeStatus(taskId, 'completed', comment);\n this.emit('task.completed', { taskId });\n } else {\n this.opts.tracker.updateNodeStatus(taskId, 'in_progress', comment ?? 'Needs revision');\n this.emit('task.review', { taskId });\n }\n }\n\n stop(): void {\n this.stopped = true;\n }\n\n getPhase(): TaskFlowPhase {\n return this.phase;\n }\n\n getGraph(): TaskGraph | null {\n return this.graph;\n }\n\n getSpec(): Specification | null {\n return this.spec;\n }\n\n private setPhase(phase: TaskFlowPhase): void {\n const from = this.phase;\n this.phase = phase;\n this.emit('phase.change', { from, to: phase });\n }\n\n private getExecutableTasks(): TaskNode[] {\n return this.opts.tracker\n .getAllNodes({ status: ['pending', 'blocked'] })\n .filter((n) => n.status === 'pending' && this.opts.tracker.canStart(n.id))\n .sort((a, b) => {\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n return (priorityOrder[a.priority] ?? 4) - (priorityOrder[b.priority] ?? 4);\n });\n }\n\n private async executeSingleTask(task: TaskNode, ctx: TaskFlowExecutionContext): Promise<unknown> {\n this.opts.tracker.updateNodeStatus(task.id, 'in_progress');\n this.emit('task.started', { taskId: task.id });\n return ctx.executeTask(task);\n }\n\n private checkDoneCondition(): boolean {\n const condition = this.opts.doneCondition;\n if (!condition) {\n const progress = this.opts.tracker.getProgress();\n return progress.percentComplete === 100;\n }\n\n switch (condition.type) {\n case 'all_tasks_done': {\n const progress = this.opts.tracker.getProgress();\n return progress.pending === 0 && progress.inProgress === 0;\n }\n case 'iterations':\n return false; // Not tracked here\n case 'tool_calls':\n return false;\n default:\n return false;\n }\n }\n\n private emitProgress(): void {\n const progress = this.opts.tracker.getProgress();\n this.emit('progress', {\n percent: progress.percentComplete,\n message: `${progress.completed}/${progress.total} tasks completed`,\n });\n }\n}\n\nexport interface SpecDrivenDevOptions {\n workingDirectory: string;\n events: EventBus;\n doneCondition?: DoneCondition;\n}\n\nexport class SpecDrivenDev {\n private store: DefaultTaskStore;\n private tracker: TaskTracker;\n private readonly events: EventBus;\n private flows = new Map<string, TaskFlow>();\n\n constructor(opts: SpecDrivenDevOptions) {\n this.store = new DefaultTaskStore();\n this.tracker = new TaskTracker({ store: this.store });\n this.events = opts.events;\n }\n\n async createFlow(specContent: string, options?: Partial<TaskFlowOptions>): Promise<TaskFlow> {\n const flow = new TaskFlow({\n tracker: this.tracker,\n events: this.events,\n ...options,\n });\n\n const graph = await flow.fromSpec(specContent);\n this.flows.set(graph.id, flow);\n\n return flow;\n }\n\n getTracker(): TaskTracker {\n return this.tracker;\n }\n\n getFlow(graphId: string): TaskFlow | undefined {\n return this.flows.get(graphId);\n }\n\n listFlows(): { id: string; title: string; phase: TaskFlowPhase }[] {\n return Array.from(this.flows.entries()).map(([id, flow]) => ({\n id,\n title: flow.getGraph()?.title ?? 'Untitled',\n phase: flow.getPhase(),\n }));\n }\n}\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { atomicWrite, ensureDir } from '../utils/atomic-write.js';\nimport type { Specification, SpecStatus } from '../types/spec.js';\n\nexport interface SpecStoreOptions {\n /** Directory where spec files are stored. Defaults to `.wrongstack/specs`. */\n baseDir: string;\n}\n\nexport interface SpecIndexEntry {\n id: string;\n title: string;\n version: string;\n status: SpecStatus;\n updatedAt: number;\n filePath: string;\n}\n\ninterface SpecIndex {\n version: 1;\n entries: SpecIndexEntry[];\n}\n\n/**\n * File-backed spec storage. Each spec is a JSON file under `baseDir/`.\n * An index file (`_index.json`) tracks all specs for fast listing.\n */\nexport class SpecStore {\n private readonly baseDir: string;\n private readonly indexPath: string;\n\n constructor(opts: SpecStoreOptions) {\n this.baseDir = opts.baseDir;\n this.indexPath = path.join(this.baseDir, '_index.json');\n }\n\n async save(spec: Specification): Promise<void> {\n await ensureDir(this.baseDir);\n const filePath = this.filePath(spec.id);\n await atomicWrite(filePath, JSON.stringify(spec, null, 2), { mode: 0o600 });\n await this.updateIndex(spec);\n }\n\n async load(id: string): Promise<Specification | null> {\n try {\n const raw = await fsp.readFile(this.filePath(id), 'utf8');\n return JSON.parse(raw) as Specification;\n } catch {\n return null;\n }\n }\n\n async list(): Promise<SpecIndexEntry[]> {\n const index = await this.readIndex();\n return index.entries.sort((a, b) => b.updatedAt - a.updatedAt);\n }\n\n async delete(id: string): Promise<boolean> {\n try {\n await fsp.unlink(this.filePath(id));\n await this.removeFromIndex(id);\n return true;\n } catch {\n return false;\n }\n }\n\n async exists(id: string): Promise<boolean> {\n try {\n await fsp.access(this.filePath(id));\n return true;\n } catch {\n return false;\n }\n }\n\n /** Create a new spec with defaults, assign ID, and persist. */\n async createDraft(title: string, overview?: string): Promise<Specification> {\n const now = Date.now();\n const spec: Specification = {\n id: randomUUID(),\n title,\n version: '0.1.0',\n status: 'draft',\n overview: overview ?? '',\n sections: [],\n requirements: [],\n createdAt: now,\n updatedAt: now,\n };\n await this.save(spec);\n return spec;\n }\n\n /** Update spec fields and persist. */\n async update(id: string, patch: Partial<Omit<Specification, 'id' | 'createdAt'>>): Promise<Specification | null> {\n const spec = await this.load(id);\n if (!spec) return null;\n const updated: Specification = {\n ...spec,\n ...patch,\n id: spec.id,\n createdAt: spec.createdAt,\n updatedAt: Date.now(),\n };\n await this.save(updated);\n return updated;\n }\n\n private filePath(id: string): string {\n return path.join(this.baseDir, `${id}.json`);\n }\n\n private async readIndex(): Promise<SpecIndex> {\n try {\n const raw = await fsp.readFile(this.indexPath, 'utf8');\n const parsed = JSON.parse(raw) as SpecIndex;\n if (parsed?.version === 1) return parsed;\n } catch {\n /* no index yet */\n }\n return { version: 1, entries: [] };\n }\n\n private async updateIndex(spec: Specification): Promise<void> {\n const index = await this.readIndex();\n const entry: SpecIndexEntry = {\n id: spec.id,\n title: spec.title,\n version: spec.version,\n status: spec.status,\n updatedAt: spec.updatedAt,\n filePath: this.filePath(spec.id),\n };\n const idx = index.entries.findIndex((e) => e.id === spec.id);\n if (idx >= 0) {\n index.entries[idx] = entry;\n } else {\n index.entries.push(entry);\n }\n await atomicWrite(this.indexPath, JSON.stringify(index, null, 2), { mode: 0o600 });\n }\n\n private async removeFromIndex(id: string): Promise<void> {\n const index = await this.readIndex();\n index.entries = index.entries.filter((e) => e.id !== id);\n await atomicWrite(this.indexPath, JSON.stringify(index, null, 2), { mode: 0o600 });\n }\n}\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { atomicWrite, ensureDir } from '../utils/atomic-write.js';\nimport type { TaskGraph, TaskNode, TaskEdge } from '../types/task-graph.js';\n\nexport interface TaskGraphStoreOptions {\n /** Directory where task graph files are stored. Defaults to `.wrongstack/task-graphs`. */\n baseDir: string;\n}\n\nexport interface TaskGraphIndexEntry {\n id: string;\n specId: string;\n title: string;\n nodeCount: number;\n completedCount: number;\n updatedAt: number;\n filePath: string;\n}\n\ninterface TaskGraphIndex {\n version: 1;\n entries: TaskGraphIndexEntry[];\n}\n\n/**\n * JSON serialisation helpers for TaskGraph (Map → Array round-trip).\n */\nfunction graphToJSON(graph: TaskGraph): string {\n const serialisable = {\n ...graph,\n nodes: Array.from(graph.nodes.entries()),\n };\n return JSON.stringify(serialisable, null, 2);\n}\n\nfunction graphFromJSON(raw: string): TaskGraph {\n const parsed = JSON.parse(raw) as Omit<TaskGraph, 'nodes'> & { nodes: [string, TaskNode][] };\n return {\n ...parsed,\n nodes: new Map(parsed.nodes),\n };\n}\n\n/**\n * File-backed task graph storage. Each graph is a JSON file under `baseDir/`.\n * An index file (`_index.json`) tracks all graphs for fast listing.\n */\nexport class TaskGraphStore {\n private readonly baseDir: string;\n private readonly indexPath: string;\n\n constructor(opts: TaskGraphStoreOptions) {\n this.baseDir = opts.baseDir;\n this.indexPath = path.join(this.baseDir, '_index.json');\n }\n\n async save(graph: TaskGraph): Promise<void> {\n await ensureDir(this.baseDir);\n const filePath = this.filePath(graph.id);\n await atomicWrite(filePath, graphToJSON(graph), { mode: 0o600 });\n await this.updateIndex(graph);\n }\n\n async load(id: string): Promise<TaskGraph | null> {\n try {\n const raw = await fsp.readFile(this.filePath(id), 'utf8');\n return graphFromJSON(raw);\n } catch {\n return null;\n }\n }\n\n async list(): Promise<TaskGraphIndexEntry[]> {\n const index = await this.readIndex();\n return index.entries.sort((a, b) => b.updatedAt - a.updatedAt);\n }\n\n async delete(id: string): Promise<boolean> {\n try {\n await fsp.unlink(this.filePath(id));\n await this.removeFromIndex(id);\n return true;\n } catch {\n return false;\n }\n }\n\n async exists(id: string): Promise<boolean> {\n try {\n await fsp.access(this.filePath(id));\n return true;\n } catch {\n return false;\n }\n }\n\n private filePath(id: string): string {\n return path.join(this.baseDir, `${id}.json`);\n }\n\n private async readIndex(): Promise<TaskGraphIndex> {\n try {\n const raw = await fsp.readFile(this.indexPath, 'utf8');\n const parsed = JSON.parse(raw) as TaskGraphIndex;\n if (parsed?.version === 1) return parsed;\n } catch {\n /* no index yet */\n }\n return { version: 1, entries: [] };\n }\n\n private async updateIndex(graph: TaskGraph): Promise<void> {\n const index = await this.readIndex();\n const completedCount = Array.from(graph.nodes.values()).filter(\n (n) => n.status === 'completed',\n ).length;\n const entry: TaskGraphIndexEntry = {\n id: graph.id,\n specId: graph.specId,\n title: graph.title,\n nodeCount: graph.nodes.size,\n completedCount,\n updatedAt: graph.updatedAt,\n filePath: this.filePath(graph.id),\n };\n const idx = index.entries.findIndex((e) => e.id === graph.id);\n if (idx >= 0) {\n index.entries[idx] = entry;\n } else {\n index.entries.push(entry);\n }\n await atomicWrite(this.indexPath, JSON.stringify(index, null, 2), { mode: 0o600 });\n }\n\n private async removeFromIndex(id: string): Promise<void> {\n const index = await this.readIndex();\n index.entries = index.entries.filter((e) => e.id !== id);\n await atomicWrite(this.indexPath, JSON.stringify(index, null, 2), { mode: 0o600 });\n }\n}\n","import type { Specification, SpecRequirement, SpecSection } from '../types/spec.js';\r\nimport type { SpecStore } from './spec-store.js';\r\n\r\n// ─── Session Types ────────────────────────────────────────────────────────────\r\n\r\nexport type AISpecPhase =\r\n | 'questioning' // AI is asking questions\r\n | 'spec_review' // Spec generated, waiting for user approval\r\n | 'implementation' // Implementation plan phase\r\n | 'task_review' // Tasks generated, waiting for execution\r\n | 'executing' // Running tasks\r\n | 'done'; // Everything complete\r\n\r\nexport interface CollectedAnswer {\r\n question: string;\r\n answer: string;\r\n timestamp: number;\r\n}\r\n\r\nexport interface AISpecSession {\r\n id: string;\r\n phase: AISpecPhase;\r\n title: string;\r\n userIntent: string;\r\n projectContext: string;\r\n answers: CollectedAnswer[];\r\n questionCount: number;\r\n spec?: Specification;\r\n implementation?: string;\r\n taskGraphId?: string;\r\n approved: boolean;\r\n createdAt: number;\r\n updatedAt: number;\r\n}\r\n\r\n// ─── Builder Options ──────────────────────────────────────────────────────────\r\n\r\nexport interface AISpecBuilderOptions {\r\n store: SpecStore;\r\n /** Minimum questions the AI should ask. Default: 2 */\r\n minQuestions?: number;\r\n /** Maximum questions before forcing spec generation. Default: 10 */\r\n maxQuestions?: number;\r\n /** Project context string (package.json, file structure, etc.) */\r\n projectContext?: string;\r\n /** Path to persist session state. If set, session survives process restarts. */\r\n sessionPath?: string;\r\n}\r\n\r\n// ─── AI Prompts ───────────────────────────────────────────────────────────────\r\n\r\nfunction buildQuestioningPrompt(session: AISpecSession, min: number, max: number): string {\r\n const answered = session.answers.length;\r\n const remaining = Math.max(0, min - answered);\r\n const budget = max - answered;\r\n\r\n const lines: string[] = [\r\n `═══ SDD Spec Builder ═══`,\r\n `Feature: \"${session.title}\"`,\r\n session.userIntent ? `Intent: ${session.userIntent}` : '',\r\n `Phase: Questioning (${answered} answered, ${budget} remaining budget)`,\r\n '',\r\n '**Instructions for AI:**',\r\n '',\r\n 'You are conducting a specification interview. Your job is to ask the user',\r\n 'intelligent, contextual questions to understand what they want to build.',\r\n '',\r\n `You have asked ${answered} questions so far.`,\r\n ];\r\n\r\n if (remaining > 0) {\r\n lines.push(`You MUST ask at least ${remaining} more question(s) before generating the spec.`);\r\n } else if (budget <= 0) {\r\n lines.push('You have reached the maximum question budget. Generate the spec NOW.');\r\n } else {\r\n lines.push(\r\n 'You may ask more questions if needed, or generate the spec if you have enough information.',\r\n 'Ask a question ONLY if it reveals something you genuinely need to know.',\r\n );\r\n }\r\n\r\n lines.push(\r\n '',\r\n '**Rules:**',\r\n '- Ask ONE question at a time',\r\n '- Questions must be specific and contextual — never generic',\r\n '- Adapt based on previous answers',\r\n '- Cover: scope, constraints, edge cases, integrations, security, performance as relevant',\r\n '- When you have enough info, respond with the full specification in JSON format',\r\n '',\r\n `**Question budget:** ${budget}/${max} remaining`,\r\n `**Minimum required:** ${remaining > 0 ? remaining : 'met'}`,\r\n );\r\n\r\n if (session.projectContext) {\r\n lines.push('', '**Project Context:**', '```', session.projectContext, '```');\r\n }\r\n\r\n if (answered > 0) {\r\n lines.push('', '**Conversation so far:**');\r\n for (let i = 0; i < answered; i++) {\r\n const a = session.answers[i]!;\r\n lines.push(``, `Q${i + 1}: ${a.question}`, `A${i + 1}: ${a.answer}`);\r\n }\r\n }\r\n\r\n lines.push(\r\n '',\r\n '---',\r\n 'Now either:',\r\n `1. Ask your next question (if you need more info)`,\r\n `2. Generate the complete specification as JSON (if ready)`,\r\n '',\r\n 'If generating spec, output JSON inside ```json code block with this structure:',\r\n '```json',\r\n '{',\r\n ' \"title\": \"...\",',\r\n ' \"overview\": \"...\",',\r\n ' \"sections\": [{ \"type\": \"overview|requirements|architecture|api|data|security|acceptance\", \"title\": \"...\", \"content\": \"...\", \"level\": 1 }],',\r\n ' \"requirements\": [{ \"id\": \"REQ-1\", \"type\": \"functional|non-functional|security|performance|ux\", \"priority\": \"critical|high|medium|low\", \"description\": \"...\", \"acceptanceCriteria\": [\"...\"] }]',\r\n '}',\r\n '```',\r\n );\r\n\r\n return lines.filter(Boolean).join('\\n');\r\n}\r\n\r\nfunction buildSpecReviewPrompt(session: AISpecSession): string {\r\n const spec = session.spec;\r\n if (!spec) return 'No spec generated yet.';\r\n\r\n const reqSummary = spec.requirements\r\n .map((r) => ` [${r.priority}] ${r.description}`)\r\n .join('\\n');\r\n\r\n return [\r\n `═══ Spec Review ═══`,\r\n `Feature: \"${spec.title}\"`,\r\n `Requirements: ${spec.requirements.length}`,\r\n '',\r\n '**Specification:**',\r\n spec.overview,\r\n '',\r\n '**Requirements:**',\r\n reqSummary,\r\n '',\r\n '---',\r\n 'Approve this spec? The AI will then generate an implementation plan and tasks.',\r\n 'Say \"approve\" to proceed, or describe what needs to change.',\r\n ].join('\\n');\r\n}\r\n\r\nfunction buildImplementationPrompt(session: AISpecSession): string {\r\n const spec = session.spec;\r\n if (!spec) return 'No spec to implement.';\r\n\r\n const reqList = spec.requirements\r\n .map((r) => ` - [${r.priority}] ${r.description}`)\r\n .join('\\n');\r\n\r\n return [\r\n `═══ Implementation Planning ═══`,\r\n `Feature: \"${spec.title}\"`,\r\n `Requirements: ${spec.requirements.length}`,\r\n '',\r\n '**Requirements to implement:**',\r\n reqList,\r\n '',\r\n '**Instructions for AI:**',\r\n 'Generate a detailed implementation plan for this specification.',\r\n 'Include:',\r\n '1. Architecture decisions',\r\n '2. File structure changes',\r\n '3. Key implementation details',\r\n '4. Dependency requirements',\r\n '5. Testing strategy',\r\n '',\r\n '**IMPORTANT:** After the plan, you MUST generate executable tasks as a JSON array.',\r\n 'Each task should be a concrete, actionable step. Output the JSON inside a ```json code block:',\r\n '```json',\r\n '[',\r\n ' {',\r\n ' \"title\": \"Create auth middleware\",',\r\n ' \"description\": \"Implement JWT verification middleware for protected routes\",',\r\n ' \"type\": \"feature\",',\r\n ' \"priority\": \"critical\",',\r\n ' \"estimateHours\": 3,',\r\n ' \"tags\": [\"auth\", \"middleware\"]',\r\n ' },',\r\n ' {',\r\n ' \"title\": \"Write auth tests\",',\r\n ' \"description\": \"Unit and integration tests for authentication flow\",',\r\n ' \"type\": \"test\",',\r\n ' \"priority\": \"high\",',\r\n ' \"estimateHours\": 2,',\r\n ' \"tags\": [\"test\", \"auth\"]',\r\n ' }',\r\n ']',\r\n '```',\r\n '',\r\n 'Rules:',\r\n '- Each task must be independently executable',\r\n '- Order tasks by dependency (things that block others come first)',\r\n '- Use type: \"feature\" for code, \"test\" for tests, \"docs\" for documentation, \"chore\" for config',\r\n '- Use priority: \"critical\" for blockers, \"high\" for core features, \"medium\" for nice-to-haves, \"low\" for polish',\r\n ].join('\\n');\r\n}\r\n\r\nfunction buildTaskReviewPrompt(session: AISpecSession): string {\r\n return [\r\n `═══ Task Review ═══`,\r\n `Feature: \"${session.spec?.title ?? session.title}\"`,\r\n '',\r\n session.implementation ?? 'No implementation plan yet.',\r\n '',\r\n '---',\r\n 'Ready to execute these tasks? Say \"execute\" to begin, or describe changes needed.',\r\n ].join('\\n');\r\n}\r\n\r\nfunction buildExecutingPrompt(session: AISpecSession): string {\r\n return [\r\n `═══ Task Execution ═══`,\r\n `Feature: \"${session.spec?.title ?? session.title}\"`,\r\n '',\r\n '**Instructions for AI:**',\r\n 'Execute the tasks one by one in the order shown in the task list above.',\r\n '',\r\n 'For each task:',\r\n '1. Implement the code (create/modify files)',\r\n '2. Write tests if applicable',\r\n '3. After completing a task, tell the user to run: /sdd done <task number or title>',\r\n '4. Then move to the next task',\r\n '',\r\n '**Important:**',\r\n '- Focus on ONE task at a time',\r\n '- After completing each task, explicitly state what you did',\r\n '- Tell the user: \"Run /sdd done <N> to mark this task complete\"',\r\n '- Then proceed to the next task automatically',\r\n '- When ALL tasks are done, provide a summary of everything implemented',\r\n '',\r\n 'Start executing the first pending task now.',\r\n ].join('\\n');\r\n}\r\n\r\n// ─── Spec Builder Class ───────────────────────────────────────────────────────\r\n\r\n/**\r\n * AI-driven specification builder. Instead of static questions, this builder\r\n * tracks conversation state and generates prompts that instruct the AI agent\r\n * to ask contextual questions and build specifications interactively.\r\n */\r\nexport class AISpecBuilder {\r\n private session: AISpecSession;\r\n private readonly store: SpecStore;\r\n private readonly minQuestions: number;\r\n private readonly maxQuestions: number;\r\n private readonly sessionPath?: string;\r\n\r\n constructor(opts: AISpecBuilderOptions) {\r\n this.store = opts.store;\r\n this.minQuestions = opts.minQuestions ?? 2;\r\n this.maxQuestions = opts.maxQuestions ?? 10;\r\n this.sessionPath = opts.sessionPath;\r\n this.session = {\r\n id: crypto.randomUUID(),\r\n phase: 'questioning',\r\n title: '',\r\n userIntent: '',\r\n projectContext: opts.projectContext ?? '',\r\n answers: [],\r\n questionCount: 0,\r\n approved: false,\r\n createdAt: Date.now(),\r\n updatedAt: Date.now(),\r\n };\r\n }\r\n\r\n // ── Session Persistence ──────────────────────────────────────────────────\r\n\r\n /** Save session state to disk. */\r\n async saveSession(): Promise<void> {\r\n if (!this.sessionPath) return;\r\n try {\r\n const fsp = await import('node:fs/promises');\r\n const path = await import('node:path');\r\n const { atomicWrite } = await import('../utils/atomic-write.js');\r\n await fsp.mkdir(path.dirname(this.sessionPath), { recursive: true });\r\n // atomicWrite: torn save would corrupt the SDD session JSON and the\r\n // next load would silently fall back to a fresh session.\r\n await atomicWrite(this.sessionPath, JSON.stringify(this.session, null, 2));\r\n } catch {\r\n // Best-effort persistence — don't crash if save fails\r\n }\r\n }\r\n\r\n /** Load session state from disk. Returns true if a session was loaded. */\r\n async loadSession(): Promise<boolean> {\r\n if (!this.sessionPath) return false;\r\n try {\r\n const fsp = await import('node:fs/promises');\r\n const raw = await fsp.readFile(this.sessionPath, 'utf8');\r\n const loaded = JSON.parse(raw) as AISpecSession;\r\n // Validate basic structure\r\n if (loaded?.id && loaded?.phase && loaded?.title) {\r\n this.session = loaded;\r\n return true;\r\n }\r\n } catch {\r\n // No saved session or invalid file\r\n }\r\n return false;\r\n }\r\n\r\n /** Delete saved session from disk. */\r\n async deleteSession(): Promise<void> {\r\n if (!this.sessionPath) return;\r\n try {\r\n const fsp = await import('node:fs/promises');\r\n await fsp.unlink(this.sessionPath);\r\n } catch {\r\n // File might not exist\r\n }\r\n }\r\n\r\n /** Auto-save helper — calls saveSession() but never throws.\r\n * Failures are surfaced via process.emitWarning so a persistent\r\n * ENOSPC / EACCES doesn't silently strand session edits in memory. */\r\n private autoSave(): void {\r\n this.saveSession().catch((err) => {\r\n const detail = err instanceof Error ? err.message : String(err);\r\n process.emitWarning(\r\n `SpecBuilder autoSave failed: ${detail}`,\r\n 'SpecBuilderWarning',\r\n );\r\n });\r\n }\r\n\r\n // ── Session Lifecycle ─────────────────────────────────────────────────────\r\n\r\n /** Start a new session with a title and optional intent. */\r\n startSession(title: string, intent?: string): void {\r\n this.session.title = title;\r\n this.session.userIntent = intent ?? '';\r\n this.session.phase = 'questioning';\r\n this.session.updatedAt = Date.now();\r\n this.autoSave();\r\n }\r\n\r\n /** Get current session state (readonly). */\r\n getSession(): Readonly<AISpecSession> {\r\n return { ...this.session };\r\n }\r\n\r\n /** Get the current phase. */\r\n getPhase(): AISpecPhase {\r\n return this.session.phase;\r\n }\r\n\r\n // ── AI Prompt Generation ──────────────────────────────────────────────────\r\n\r\n /**\r\n * Get the AI prompt for the current phase.\r\n * This prompt is injected into the conversation so the AI agent knows\r\n * what to do next (ask a question, generate a spec, etc.).\r\n */\r\n getAIPrompt(): string {\r\n switch (this.session.phase) {\r\n case 'questioning':\r\n return buildQuestioningPrompt(this.session, this.minQuestions, this.maxQuestions);\r\n case 'spec_review':\r\n return buildSpecReviewPrompt(this.session);\r\n case 'implementation':\r\n return buildImplementationPrompt(this.session);\r\n case 'task_review':\r\n return buildTaskReviewPrompt(this.session);\r\n case 'executing':\r\n return buildExecutingPrompt(this.session);\r\n case 'done':\r\n return 'All tasks completed. Specification is fully implemented.';\r\n }\r\n }\r\n\r\n // ── Answer Processing ─────────────────────────────────────────────────────\r\n\r\n /**\r\n * Record a question/answer pair from the AI conversation.\r\n * Call this when the AI asks a question and the user responds.\r\n */\r\n addAnswer(question: string, answer: string): void {\r\n this.session.answers.push({ question, answer, timestamp: Date.now() });\r\n this.session.questionCount++;\r\n this.session.updatedAt = Date.now();\r\n this.autoSave();\r\n }\r\n\r\n /**\r\n * Check if more questions should be asked.\r\n * Returns false if max reached or if the AI has signaled it has enough info.\r\n */\r\n shouldContinueQuestioning(): boolean {\r\n return this.session.questionCount < this.maxQuestions;\r\n }\r\n\r\n /**\r\n * Check if minimum questions have been asked.\r\n */\r\n hasMetMinimumQuestions(): boolean {\r\n return this.session.questionCount >= this.minQuestions;\r\n }\r\n\r\n // ── Phase Transitions ─────────────────────────────────────────────────────\r\n\r\n /**\r\n * Set the generated specification and move to spec_review phase.\r\n */\r\n setSpec(spec: Specification): void {\r\n this.session.spec = spec;\r\n this.session.phase = 'spec_review';\r\n this.session.updatedAt = Date.now();\r\n this.autoSave();\r\n }\r\n\r\n /**\r\n * Approve the current phase and advance to the next.\r\n * questioning → spec_review (requires spec to be set)\r\n * spec_review → implementation\r\n * implementation → task_review (requires implementation to be set)\r\n * task_review → executing\r\n * executing → done\r\n */\r\n approve(): AISpecPhase {\r\n switch (this.session.phase) {\r\n case 'questioning':\r\n if (!this.session.spec) {\r\n throw new Error('Cannot approve: no spec generated yet.');\r\n }\r\n this.session.phase = 'spec_review';\r\n break;\r\n case 'spec_review':\r\n this.session.phase = 'implementation';\r\n break;\r\n case 'implementation':\r\n this.session.phase = 'task_review';\r\n break;\r\n case 'task_review':\r\n this.session.phase = 'executing';\r\n break;\r\n case 'executing':\r\n this.session.phase = 'done';\r\n break;\r\n case 'done':\r\n break;\r\n }\r\n this.session.approved = true;\r\n this.session.updatedAt = Date.now();\r\n this.autoSave();\r\n return this.session.phase;\r\n }\r\n\r\n /**\r\n * Set the implementation plan text.\r\n */\r\n setImplementation(plan: string): void {\r\n this.session.implementation = plan;\r\n this.session.phase = 'task_review';\r\n this.session.updatedAt = Date.now();\r\n this.autoSave();\r\n }\r\n\r\n /**\r\n * Mark session as done.\r\n */\r\n markDone(): void {\r\n this.session.phase = 'done';\r\n this.session.updatedAt = Date.now();\r\n this.autoSave();\r\n }\r\n\r\n /**\r\n * Set the task graph ID for this session.\r\n */\r\n setTaskGraphId(graphId: string): void {\r\n this.session.taskGraphId = graphId;\r\n this.autoSave();\r\n }\r\n\r\n /**\r\n * Get the task graph ID for this session.\r\n */\r\n getTaskGraphId(): string | undefined {\r\n return this.session.taskGraphId;\r\n }\r\n\r\n // ── Spec Persistence ──────────────────────────────────────────────────────\r\n\r\n /**\r\n * Save the current spec to the store.\r\n */\r\n async saveSpec(): Promise<Specification> {\r\n if (!this.session.spec) {\r\n throw new Error('No spec to save.');\r\n }\r\n await this.store.save(this.session.spec);\r\n return this.session.spec;\r\n }\r\n\r\n // ── Spec Generation Helpers ───────────────────────────────────────────────\r\n\r\n /**\r\n * Parse a spec from a JSON string (from AI output).\r\n * Validates and normalizes the structure.\r\n */\r\n parseSpecFromJSON(jsonStr: string): Specification {\r\n let parsed: unknown;\r\n try {\r\n parsed = JSON.parse(jsonStr);\r\n } catch (e) {\r\n throw new Error(`Invalid JSON for spec: ${e instanceof Error ? e.message : 'parse error'}`);\r\n }\r\n\r\n if (!parsed || typeof parsed !== 'object') {\r\n throw new Error('Spec JSON must be an object.');\r\n }\r\n\r\n const raw = parsed as Record<string, unknown>;\r\n const now = Date.now();\r\n\r\n const title = String(raw.title ?? this.session.title ?? 'Untitled');\r\n const overview = String(raw.overview ?? '');\r\n\r\n // Validate overview is not empty\r\n if (!overview || overview === 'undefined') {\r\n throw new Error('Spec must have an overview.');\r\n }\r\n\r\n const rawSections = Array.isArray(raw.sections) ? raw.sections : [];\r\n const sections: SpecSection[] = rawSections\r\n .filter((s: unknown) => s && typeof s === 'object')\r\n .map((s: Record<string, unknown>) => ({\r\n type: (['overview', 'requirements', 'architecture', 'api', 'data', 'security', 'acceptance']\r\n .includes(String(s.type)) ? String(s.type) : 'overview') as SpecSection['type'],\r\n title: String(s.title ?? ''),\r\n content: String(s.content ?? ''),\r\n level: Number(s.level) || 1,\r\n }));\r\n\r\n const rawReqs = Array.isArray(raw.requirements) ? raw.requirements : [];\r\n const requirements: SpecRequirement[] = rawReqs\r\n .filter((r: unknown) => r && typeof r === 'object')\r\n .map((r: Record<string, unknown>, i: number) => ({\r\n id: String(r.id ?? `REQ-${i + 1}`),\r\n type: (['functional', 'non-functional', 'security', 'performance', 'ux']\r\n .includes(String(r.type)) ? String(r.type) : 'functional') as SpecRequirement['type'],\r\n priority: (['critical', 'high', 'medium', 'low']\r\n .includes(String(r.priority)) ? String(r.priority) : 'medium') as SpecRequirement['priority'],\r\n description: String(r.description ?? ''),\r\n acceptanceCriteria: Array.isArray(r.acceptanceCriteria)\r\n ? r.acceptanceCriteria.map(String)\r\n : [],\r\n }));\r\n\r\n const spec: Specification = {\r\n id: crypto.randomUUID(),\r\n title,\r\n version: '0.1.0',\r\n status: 'draft',\r\n overview,\r\n sections,\r\n requirements,\r\n createdAt: now,\r\n updatedAt: now,\r\n metadata: {\r\n generatedBy: 'AISpecBuilder',\r\n sessionId: this.session.id,\r\n },\r\n };\r\n\r\n return spec;\r\n }\r\n\r\n /**\r\n * Extract JSON from AI output (handles ```json blocks and raw JSON).\r\n */\r\n extractJSON(text: string): string | null {\r\n // Try ```json ... ``` first\r\n const codeBlockMatch = text.match(/```json\\s*([\\s\\S]*?)```/);\r\n if (codeBlockMatch?.[1]) {\r\n return codeBlockMatch[1].trim();\r\n }\r\n\r\n // Try ``` ... ``` without language tag\r\n const genericBlockMatch = text.match(/```\\s*([\\s\\S]*?)```/);\r\n if (genericBlockMatch?.[1]) {\r\n const trimmed = genericBlockMatch[1].trim();\r\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\r\n return trimmed;\r\n }\r\n }\r\n\r\n // Try raw JSON object\r\n const jsonMatch = text.match(/(\\{[\\s\\S]*\\})/);\r\n if (jsonMatch?.[1]) {\r\n try {\r\n JSON.parse(jsonMatch[1]);\r\n return jsonMatch[1];\r\n } catch {\r\n // not valid JSON\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Detect if AI output contains a spec (JSON block).\r\n */\r\n hasSpecInOutput(text: string): boolean {\r\n return this.extractJSON(text) !== null;\r\n }\r\n\r\n /**\r\n * Try to parse a spec from AI output text.\r\n * Returns null if no valid spec found.\r\n */\r\n tryParseSpecFromOutput(text: string): Specification | null {\r\n const json = this.extractJSON(text);\r\n if (!json) return null;\r\n\r\n try {\r\n return this.parseSpecFromJSON(json);\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n // ── JSON Array Extraction (for tasks) ─────────────────────────────────────\r\n\r\n /**\r\n * Extract a JSON array from AI output (for task lists).\r\n */\r\n extractJSONArray(text: string): string | null {\r\n const codeBlockMatch = text.match(/```json\\s*([\\s\\S]*?)```/);\r\n if (codeBlockMatch?.[1]) {\r\n const trimmed = codeBlockMatch[1].trim();\r\n if (trimmed.startsWith('[')) return trimmed;\r\n }\r\n\r\n const arrayMatch = text.match(/(\\[[\\s\\S]*\\])/);\r\n if (arrayMatch?.[1]) {\r\n try {\r\n const parsed = JSON.parse(arrayMatch[1]);\r\n if (Array.isArray(parsed)) return arrayMatch[1];\r\n } catch {\r\n // not valid\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n","import type { SpecTemplate } from '../types/spec.js';\n\n/**\n * Built-in spec templates for common development scenarios.\n */\nexport const SPEC_TEMPLATES: SpecTemplate[] = [\n {\n id: 'feature',\n name: 'New Feature',\n description: 'Template for new feature development',\n sections: [\n { type: 'overview', title: 'Overview', level: 2 },\n { type: 'requirements', title: 'Requirements', level: 2 },\n { type: 'architecture', title: 'Architecture', level: 2 },\n { type: 'api', title: 'API Design', level: 2 },\n { type: 'data', title: 'Data Model', level: 2 },\n { type: 'security', title: 'Security', level: 2 },\n { type: 'acceptance', title: 'Acceptance Criteria', level: 2 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'non-functional', priority: 'medium', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n {\n id: 'bugfix',\n name: 'Bug Fix',\n description: 'Template for bug fix specifications',\n sections: [\n { type: 'overview', title: 'Bug Description', level: 2 },\n { type: 'requirements', title: 'Root Cause Analysis', level: 2 },\n { type: 'acceptance', title: 'Fix Verification', level: 2 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'critical', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n {\n id: 'refactor',\n name: 'Refactor',\n description: 'Template for code refactoring',\n sections: [\n { type: 'overview', title: 'Current State', level: 2 },\n { type: 'requirements', title: 'Refactoring Goals', level: 2 },\n { type: 'architecture', title: 'Target Architecture', level: 2 },\n { type: 'acceptance', title: 'Verification', level: 2 },\n ],\n defaultRequirements: [\n { type: 'non-functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n {\n id: 'infra',\n name: 'Infrastructure',\n description: 'Template for infrastructure/tooling changes',\n sections: [\n { type: 'overview', title: 'What and Why', level: 2 },\n { type: 'requirements', title: 'Requirements', level: 2 },\n { type: 'architecture', title: 'Design', level: 2 },\n { type: 'security', title: 'Security Impact', level: 2 },\n { type: 'acceptance', title: 'Rollout Plan', level: 2 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'security', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n {\n id: 'integration',\n name: 'Integration',\n description: 'Template for integrating external services or APIs',\n sections: [\n { type: 'overview', title: 'Integration Overview', level: 2 },\n { type: 'requirements', title: 'Integration Requirements', level: 2 },\n { type: 'api', title: 'API Contract', level: 2 },\n { type: 'architecture', title: 'Architecture', level: 2 },\n { type: 'security', title: 'Auth & Security', level: 2 },\n { type: 'acceptance', title: 'Testing Strategy', level: 2 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'security', priority: 'critical', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'performance', priority: 'medium', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n {\n id: 'cli-command',\n name: 'CLI Command',\n description: 'Template for new CLI commands/slash commands',\n sections: [\n { type: 'overview', title: 'Command Overview', level: 2 },\n { type: 'requirements', title: 'Command Requirements', level: 2 },\n { type: 'api', title: 'Command Interface', level: 2 },\n { type: 'acceptance', title: 'Usage Examples', level: 2 },\n ],\n defaultRequirements: [\n { type: 'ux', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n];\n\n/**\n * Get a template by ID.\n */\nexport function getTemplate(id: string): SpecTemplate | undefined {\n return SPEC_TEMPLATES.find((t) => t.id === id);\n}\n\n/**\n * List all available templates.\n */\nexport function listTemplates(): Array<{ id: string; name: string; description: string }> {\n return SPEC_TEMPLATES.map((t) => ({ id: t.id, name: t.name, description: t.description }));\n}\n\n/**\n * Generate a markdown skeleton from a template.\n */\nexport function templateToMarkdown(template: SpecTemplate, title?: string): string {\n const lines: string[] = [];\n lines.push(`# ${title ?? 'Untitled Specification'}`);\n lines.push('Version: 0.1.0');\n lines.push('');\n\n for (const section of template.sections) {\n lines.push(`${'#'.repeat(section.level + 1)} ${section.title}`);\n lines.push(`_<!-- ${section.type} section content -->_`);\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","import type { TaskGraph, TaskNode, TaskProgress } from '../types/task-graph.js';\nimport { computeTaskProgress } from '../types/task-graph.js';\nimport type { Specification } from '../types/spec.js';\n\nconst STATUS_ICON: Record<TaskNode['status'], string> = {\n pending: '○',\n in_progress: '◐',\n blocked: '⊘',\n failed: '✗',\n review: '◑',\n completed: '●',\n};\n\nconst PRIORITY_ICON: Record<TaskNode['priority'], string> = {\n critical: '🔴',\n high: '🟠',\n medium: '🟡',\n low: '🟢',\n};\n\nconst TYPE_ICON: Record<TaskNode['type'], string> = {\n feature: '⚡',\n bugfix: '🐛',\n refactor: '♻️',\n docs: '📝',\n test: '🧪',\n chore: '🔧',\n};\n\n/**\n * Render a task graph as ASCII art for terminal display.\n */\nexport function renderTaskGraph(graph: TaskGraph, opts?: { compact?: boolean }): string {\n const lines: string[] = [];\n const compact = opts?.compact ?? false;\n\n // Header\n lines.push(`╭─ Task Graph: ${graph.title} ─╮`);\n lines.push(`│ Spec: ${graph.specId.slice(0, 8)}... │ Nodes: ${graph.nodes.size} │ Edges: ${graph.edges.length} │`);\n lines.push('╰' + '─'.repeat(Math.max(50, graph.title.length + 30)) + '╯');\n lines.push('');\n\n // Progress bar\n const progress = computeTaskProgress(graph);\n lines.push(renderProgress(progress));\n lines.push('');\n\n // Build adjacency for display\n const childrenMap = new Map<string, string[]>();\n for (const edge of graph.edges) {\n if (edge.type === 'depends_on') {\n // edge.from depends on edge.to → edge.to is a blocker\n const deps = childrenMap.get(edge.from) ?? [];\n deps.push(edge.to);\n childrenMap.set(edge.from, deps);\n }\n }\n\n // Render root nodes and their dependents\n const rendered = new Set<string>();\n const rootNodes = graph.rootNodes.filter((id) => graph.nodes.has(id));\n\n // If no root nodes, use all nodes\n const startNodes = rootNodes.length > 0\n ? rootNodes\n : Array.from(graph.nodes.keys()).filter((id) => {\n const deps = childrenMap.get(id);\n return !deps || deps.length === 0;\n });\n\n for (const rootId of startNodes) {\n renderNode(graph, rootId, lines, rendered, childrenMap, compact, '');\n }\n\n // Render any orphan nodes\n for (const [id] of graph.nodes) {\n if (!rendered.has(id)) {\n renderNode(graph, id, lines, rendered, childrenMap, compact, '');\n }\n }\n\n // Legend\n lines.push('');\n lines.push('Legend: ● done ◐ in-progress ○ pending ⊗ blocked ✗ failed ◒ review');\n\n return lines.join('\\n');\n}\n\nfunction renderNode(\n graph: TaskGraph,\n nodeId: string,\n lines: string[],\n rendered: Set<string>,\n childrenMap: Map<string, string[]>,\n compact: boolean,\n prefix: string,\n): void {\n if (rendered.has(nodeId)) return;\n rendered.add(nodeId);\n\n const node = graph.nodes.get(nodeId);\n if (!node) return;\n\n const icon = STATUS_ICON[node.status];\n const prioIcon = PRIORITY_ICON[node.priority];\n const typeIcon = TYPE_ICON[node.type];\n const title = compact ? truncate(node.title, 40) : node.title;\n\n const blockedBy = childrenMap.get(nodeId) ?? [];\n const depsStr = blockedBy.length > 0\n ? ` ← [${blockedBy.map((d) => graph.nodes.get(d)?.title?.slice(0, 12) ?? '?').join(', ')}]`\n : '';\n\n lines.push(`${prefix}${icon} ${typeIcon} ${prioIcon} ${title}${depsStr}`);\n\n if (!compact && node.description) {\n const descLines = node.description.split('\\n').slice(0, 3);\n for (const dl of descLines) {\n lines.push(`${prefix} └ ${truncate(dl, 60)}`);\n }\n }\n\n // Render nodes that depend on this one\n const dependents = graph.edges\n .filter((e) => e.type === 'depends_on' && e.to === nodeId)\n .map((e) => e.from)\n .filter((id) => graph.nodes.has(id));\n\n for (const depId of dependents) {\n renderNode(graph, depId, lines, rendered, childrenMap, compact, prefix + ' ');\n }\n}\n\n/**\n * Render a progress bar.\n */\nexport function renderProgress(progress: TaskProgress): string {\n const barWidth = 30;\n const filled = Math.round((progress.percentComplete / 100) * barWidth);\n const empty = barWidth - filled;\n const bar = '█'.repeat(filled) + '░'.repeat(empty);\n\n return [\n `Progress: [${bar}] ${progress.percentComplete}%`,\n ` ${progress.completed} done │ ${progress.inProgress} active │ ${progress.pending} pending │ ${progress.blocked} blocked │ ${progress.failed} failed`,\n ].join('\\n');\n}\n\n/**\n * Render a compact task list (for quick status checks).\n */\nexport function renderTaskList(graph: TaskGraph): string {\n const lines: string[] = [];\n const nodes = Array.from(graph.nodes.values());\n\n // Group by status\n const groups: Record<string, TaskNode[]> = {\n in_progress: [],\n pending: [],\n blocked: [],\n review: [],\n failed: [],\n completed: [],\n };\n\n for (const node of nodes) {\n groups[node.status]?.push(node);\n }\n\n for (const [status, group] of Object.entries(groups)) {\n if (group.length === 0) continue;\n const icon = STATUS_ICON[status as TaskNode['status']];\n lines.push(`${icon} ${status.toUpperCase()} (${group.length})`);\n for (const node of group) {\n const prio = PRIORITY_ICON[node.priority];\n const type = TYPE_ICON[node.type];\n lines.push(` ${type} ${prio} ${node.title}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Render spec analysis summary.\n */\nexport function renderSpecAnalysis(\n spec: Specification,\n analysis: { completeness: number; gaps: string[]; risks: string[]; suggestions: string[] },\n): string {\n const lines: string[] = [];\n\n lines.push(`╭─ Spec Analysis: ${spec.title} ─╮`);\n lines.push('');\n\n // Completeness\n const barWidth = 20;\n const filled = Math.round((analysis.completeness / 100) * barWidth);\n const bar = '█'.repeat(filled) + '░'.repeat(barWidth - filled);\n lines.push(`Completeness: [${bar}] ${analysis.completeness}%`);\n lines.push('');\n\n if (analysis.gaps.length > 0) {\n lines.push('⚠ Gaps:');\n for (const gap of analysis.gaps) {\n lines.push(` • ${gap}`);\n }\n lines.push('');\n }\n\n if (analysis.risks.length > 0) {\n lines.push('🔴 Risks:');\n for (const risk of analysis.risks) {\n lines.push(` • ${risk}`);\n }\n lines.push('');\n }\n\n if (analysis.suggestions.length > 0) {\n lines.push('💡 Suggestions:');\n for (const sug of analysis.suggestions) {\n lines.push(` • ${sug}`);\n }\n }\n\n return lines.join('\\n');\n}\n\nfunction truncate(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n return str.slice(0, maxLen - 1) + '…';\n}\n","import type { TaskGraph, TaskNode, CriticalPathResult } from '../types/task-graph.js';\nimport { topologicalSort } from '../types/task-graph.js';\n\n/**\n * Enhanced critical path analysis with bottleneck detection,\n * parallel execution groups, and time estimation.\n */\nexport interface CriticalPathAnalysis {\n /** Ordered list of critical path task IDs. */\n criticalPath: string[];\n /** Total estimated hours for the critical path. */\n totalHours: number;\n /** Tasks that block the most downstream work. */\n bottlenecks: BottleneckTask[];\n /** Groups of tasks that can run in parallel. */\n parallelGroups: string[][];\n /** Recommended execution order respecting dependencies. */\n executionOrder: string[];\n /** Tasks with no blockers (can start immediately). */\n readyTasks: string[];\n /** Tasks that are blocked and cannot start. */\n blockedTasks: string[];\n}\n\nexport interface BottleneckTask {\n taskId: string;\n title: string;\n /** Number of tasks directly or transitively blocked by this task. */\n blockedCount: number;\n /** Total estimated hours of blocked downstream work. */\n blockedHours: number;\n /** Severity score (0-100). */\n severity: number;\n}\n\n/**\n * Analyze a task graph and return critical path analysis.\n */\nexport function analyzeCriticalPath(graph: TaskGraph): CriticalPathAnalysis {\n const nodes = Array.from(graph.nodes.values());\n const topoOrder = topologicalSort(graph);\n\n // Build adjacency: blocker → blocked tasks\n const blockedByMap = new Map<string, Set<string>>();\n const blocksMap = new Map<string, Set<string>>();\n\n for (const edge of graph.edges) {\n if (edge.type === 'depends_on') {\n // edge.from depends on edge.to\n if (!blockedByMap.has(edge.from)) blockedByMap.set(edge.from, new Set());\n blockedByMap.get(edge.from)!.add(edge.to);\n\n if (!blocksMap.has(edge.to)) blocksMap.set(edge.to, new Set());\n blocksMap.get(edge.to)!.add(edge.from);\n }\n }\n\n // Find ready tasks (no blockers or all blockers completed)\n const readyTasks: string[] = [];\n const blockedTasks: string[] = [];\n\n for (const node of nodes) {\n if (node.status === 'completed') continue;\n const blockers = blockedByMap.get(node.id);\n if (!blockers || blockers.size === 0) {\n readyTasks.push(node.id);\n } else {\n const allCompleted = Array.from(blockers).every((id) => {\n const n = graph.nodes.get(id);\n return n?.status === 'completed';\n });\n if (allCompleted) {\n readyTasks.push(node.id);\n } else {\n blockedTasks.push(node.id);\n }\n }\n }\n\n // Compute bottleneck scores\n const bottlenecks: BottleneckTask[] = [];\n for (const node of nodes) {\n if (node.status === 'completed') continue;\n const downstream = getTransitiveBlocked(graph, node.id, blocksMap);\n if (downstream.size > 0) {\n const blockedHours = Array.from(downstream).reduce((sum, id) => {\n const n = graph.nodes.get(id);\n return sum + (n?.estimateHours ?? 0);\n }, 0);\n bottlenecks.push({\n taskId: node.id,\n title: node.title,\n blockedCount: downstream.size,\n blockedHours,\n severity: Math.min(100, Math.round((downstream.size / nodes.length) * 100)),\n });\n }\n }\n\n bottlenecks.sort((a, b) => b.severity - a.severity);\n\n // Compute critical path (longest path by estimated hours)\n const criticalPath = computeCriticalPath(graph, topoOrder, blockedByMap);\n\n // Total hours on critical path\n const totalHours = criticalPath.reduce((sum, id) => {\n const n = graph.nodes.get(id);\n return sum + (n?.estimateHours ?? 0);\n }, 0);\n\n // Parallel execution groups\n const parallelGroups = computeParallelGroups(graph, blockedByMap);\n\n // Execution order: topo sort filtered to non-completed tasks\n const executionOrder = topoOrder.filter((id) => {\n const n = graph.nodes.get(id);\n return n && n.status !== 'completed';\n });\n\n return {\n criticalPath,\n totalHours,\n bottlenecks,\n parallelGroups,\n executionOrder,\n readyTasks,\n blockedTasks,\n };\n}\n\n/**\n * Get all tasks transitively blocked by a given task.\n */\nfunction getTransitiveBlocked(\n graph: TaskGraph,\n taskId: string,\n blocksMap: Map<string, Set<string>>,\n): Set<string> {\n const visited = new Set<string>();\n const queue = [taskId];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const blocked = blocksMap.get(current);\n if (!blocked) continue;\n for (const id of blocked) {\n if (!visited.has(id) && id !== taskId) {\n visited.add(id);\n queue.push(id);\n }\n }\n }\n\n return visited;\n}\n\n/**\n * Compute the critical path (longest path by estimated hours).\n */\nfunction computeCriticalPath(\n graph: TaskGraph,\n topoOrder: string[],\n blockedByMap: Map<string, Set<string>>,\n): string[] {\n // Use all nodes in the graph, not just topo-reachable ones\n const allIds = Array.from(graph.nodes.keys());\n if (allIds.length === 0) return [];\n\n const dist = new Map<string, number>();\n const prev = new Map<string, string | null>();\n\n // Initialize each node's distance to its own estimate\n for (const id of allIds) {\n dist.set(id, graph.nodes.get(id)?.estimateHours ?? 1);\n prev.set(id, null);\n }\n\n // Build reverse map: blocker → tasks it blocks\n const blocksMap = new Map<string, Set<string>>();\n for (const [taskId, blockers] of blockedByMap) {\n for (const blockerId of blockers) {\n if (!blocksMap.has(blockerId)) blocksMap.set(blockerId, new Set());\n blocksMap.get(blockerId)!.add(taskId);\n }\n }\n\n // Relax edges repeatedly (Bellman-Ford style) since topoOrder may be incomplete.\n // Run N-1 iterations to handle longest path in DAG.\n const n = allIds.length;\n for (let i = 0; i < n - 1; i++) {\n let changed = false;\n for (const id of allIds) {\n const blocked = blocksMap.get(id);\n if (!blocked) continue;\n for (const blockedId of blocked) {\n const candidateDist = (dist.get(id) ?? 0) + (graph.nodes.get(blockedId)?.estimateHours ?? 1);\n if (candidateDist > (dist.get(blockedId) ?? 0)) {\n dist.set(blockedId, candidateDist);\n prev.set(blockedId, id);\n changed = true;\n }\n }\n }\n if (!changed) break;\n }\n\n // Find the node with maximum distance (end of critical path)\n let maxDist = 0;\n let maxId = allIds[0]!;\n for (const id of allIds) {\n const d = dist.get(id) ?? 0;\n if (d > maxDist) {\n maxDist = d;\n maxId = id;\n }\n }\n\n // Trace back the critical path\n const path: string[] = [];\n let current: string | null = maxId;\n const visited = new Set<string>();\n while (current && !visited.has(current)) {\n visited.add(current);\n path.unshift(current);\n current = prev.get(current) ?? null;\n }\n\n return path;\n}\n\n/**\n * Compute groups of tasks that can run in parallel.\n * Tasks in the same group have no dependencies on each other.\n */\nfunction computeParallelGroups(\n graph: TaskGraph,\n blockedByMap: Map<string, Set<string>>,\n): string[][] {\n const groups: string[][] = [];\n const assigned = new Set<string>();\n const nodes = Array.from(graph.nodes.values()).filter((n) => n.status !== 'completed');\n\n // Topological levels\n const remaining = new Set(nodes.map((n) => n.id));\n\n while (remaining.size > 0) {\n const group: string[] = [];\n for (const id of remaining) {\n const blockers = blockedByMap.get(id);\n if (!blockers || blockers.size === 0) {\n group.push(id);\n } else {\n const allAssigned = Array.from(blockers).every((b) => assigned.has(b));\n if (allAssigned) {\n group.push(id);\n }\n }\n }\n\n if (group.length === 0) {\n // Circular dependency or all remaining are blocked by non-completed\n // Just take the first remaining\n const first = Array.from(remaining)[0];\n if (first) group.push(first);\n }\n\n for (const id of group) {\n assigned.add(id);\n remaining.delete(id);\n }\n groups.push(group);\n }\n\n return groups;\n}\n","import type { Specification, SpecRequirement } from '../types/spec.js';\nimport type { TaskGraph, TaskNode } from '../types/task-graph.js';\nimport { SpecParser } from './spec-parser.js';\n\nexport interface SpecVersion {\n version: string;\n spec: Specification;\n timestamp: number;\n changeDescription?: string;\n}\n\nexport interface SpecDiff {\n added: SpecRequirement[];\n removed: SpecRequirement[];\n modified: Array<{\n requirement: SpecRequirement;\n previousVersion: SpecRequirement;\n changes: string[];\n }>;\n summary: string;\n}\n\n/**\n * Track spec versions and compute diffs between versions.\n */\nexport class SpecVersioning {\n private versions = new Map<string, SpecVersion[]>();\n\n /** Record a new version of a spec. */\n recordVersion(spec: Specification, changeDescription?: string): SpecVersion {\n const version: SpecVersion = {\n version: spec.version,\n spec: { ...spec },\n timestamp: Date.now(),\n changeDescription,\n };\n\n const history = this.versions.get(spec.id) ?? [];\n history.push(version);\n this.versions.set(spec.id, history);\n\n return version;\n }\n\n /** Get version history for a spec. */\n getHistory(specId: string): SpecVersion[] {\n return this.versions.get(specId) ?? [];\n }\n\n /** Get a specific version of a spec. */\n getVersion(specId: string, version: string): SpecVersion | undefined {\n const history = this.versions.get(specId) ?? [];\n return history.find((v) => v.version === version);\n }\n\n /** Get the latest version of a spec. */\n getLatest(specId: string): SpecVersion | undefined {\n const history = this.versions.get(specId) ?? [];\n return history[history.length - 1];\n }\n\n /** Compute diff between two versions of a spec. */\n diff(oldSpec: Specification, newSpec: Specification): SpecDiff {\n const oldReqs = new Map(oldSpec.requirements.map((r) => [r.id, r]));\n const newReqs = new Map(newSpec.requirements.map((r) => [r.id, r]));\n\n const added: SpecRequirement[] = [];\n const removed: SpecRequirement[] = [];\n const modified: SpecDiff['modified'] = [];\n\n // Find added and modified\n for (const [id, newReq] of newReqs) {\n const oldReq = oldReqs.get(id);\n if (!oldReq) {\n added.push(newReq);\n } else {\n const changes = this.compareRequirements(oldReq, newReq);\n if (changes.length > 0) {\n modified.push({\n requirement: newReq,\n previousVersion: oldReq,\n changes,\n });\n }\n }\n }\n\n // Find removed\n for (const [id, oldReq] of oldReqs) {\n if (!newReqs.has(id)) {\n removed.push(oldReq);\n }\n }\n\n const parts: string[] = [];\n if (added.length > 0) parts.push(`${added.length} added`);\n if (removed.length > 0) parts.push(`${removed.length} removed`);\n if (modified.length > 0) parts.push(`${modified.length} modified`);\n\n return {\n added,\n removed,\n modified,\n summary: parts.length > 0 ? parts.join(', ') : 'No changes',\n };\n }\n\n /**\n * Update a task graph incrementally based on spec changes.\n * - Added requirements → new tasks\n * - Removed requirements → remove tasks\n * - Modified requirements → update task descriptions\n * Returns the updated graph and list of changes made.\n */\n updateTaskGraph(\n graph: TaskGraph,\n oldSpec: Specification,\n newSpec: Specification,\n ): { graph: TaskGraph; changes: string[] } {\n const specDiff = this.diff(oldSpec, newSpec);\n const changes: string[] = [];\n\n // Map requirement IDs to task nodes\n const reqToTask = new Map<string, TaskNode>();\n for (const node of graph.nodes.values()) {\n if (node.specRequirementId) {\n reqToTask.set(node.specRequirementId, node);\n }\n }\n\n // Remove tasks for removed requirements\n for (const req of specDiff.removed) {\n const task = reqToTask.get(req.id);\n if (task) {\n graph.nodes.delete(task.id);\n graph.edges = graph.edges.filter((e) => e.from !== task.id && e.to !== task.id);\n changes.push(`Removed task: ${task.title}`);\n }\n }\n\n // Update tasks for modified requirements\n for (const mod of specDiff.modified) {\n const task = reqToTask.get(mod.requirement.id);\n if (task) {\n task.title = mod.requirement.description;\n task.description = this.buildTaskDescription(mod.requirement);\n task.priority = mod.requirement.priority;\n task.updatedAt = Date.now();\n changes.push(`Updated task: ${task.title} (${mod.changes.join(', ')})`);\n }\n }\n\n // Add tasks for new requirements\n for (const req of specDiff.added) {\n const now = Date.now();\n const newTask: TaskNode = {\n id: crypto.randomUUID(),\n title: req.description,\n description: this.buildTaskDescription(req),\n type: this.mapReqType(req.type),\n priority: req.priority,\n status: 'pending',\n specRequirementId: req.id,\n tags: [req.type, req.priority],\n createdAt: now,\n updatedAt: now,\n };\n graph.nodes.set(newTask.id, newTask);\n graph.rootNodes.push(newTask.id);\n changes.push(`Added task: ${newTask.title}`);\n }\n\n graph.updatedAt = Date.now();\n return { graph, changes };\n }\n\n private compareRequirements(old: SpecRequirement, current: SpecRequirement): string[] {\n const changes: string[] = [];\n if (old.description !== current.description) changes.push('description');\n if (old.priority !== current.priority) changes.push('priority');\n if (old.type !== current.type) changes.push('type');\n if (JSON.stringify(old.acceptanceCriteria) !== JSON.stringify(current.acceptanceCriteria)) {\n changes.push('acceptance criteria');\n }\n if (JSON.stringify(old.blockedBy) !== JSON.stringify(current.blockedBy)) {\n changes.push('dependencies');\n }\n return changes;\n }\n\n private buildTaskDescription(req: SpecRequirement): string {\n const lines = [req.description, '', `**Type:** ${req.type}`, `**Priority:** ${req.priority}`];\n if (req.acceptanceCriteria.length > 0) {\n lines.push('', '**Acceptance Criteria:**');\n for (const ac of req.acceptanceCriteria) {\n lines.push(`- ${ac}`);\n }\n }\n return lines.join('\\n');\n }\n\n private mapReqType(type: SpecRequirement['type']): TaskNode['type'] {\n switch (type) {\n case 'functional':\n return 'feature';\n case 'security':\n return 'feature';\n case 'performance':\n return 'feature';\n case 'ux':\n return 'feature';\n default:\n return 'feature';\n }\n }\n}\n","import type { TaskGraph, TaskNode } from '../types/task-graph.js';\nimport type { Specification } from '../types/spec.js';\nimport type { EventBus } from '../kernel/events.js';\nimport type { TaskTracker } from './task-tracker.js';\nimport { TaskFlow } from './task-flow.js';\nimport { analyzeCriticalPath } from './critical-path.js';\n\nexport interface AutoExecutorOptions {\n tracker: TaskTracker;\n events: EventBus;\n /** Maximum concurrent tasks. Defaults to 1 (sequential). */\n maxConcurrent?: number;\n /** Maximum retry attempts for failed tasks. */\n maxRetries?: number;\n /** Custom task executor function. */\n executeTask: (task: TaskNode, context: TaskExecutionContext) => Promise<TaskExecutionResult>;\n /** Called before each task starts. */\n onTaskStart?: (task: TaskNode) => void;\n /** Called after each task completes. */\n onTaskComplete?: (task: TaskNode, result: TaskExecutionResult) => void;\n /** Called when a task fails. */\n onTaskFail?: (task: TaskNode, error: Error, retryCount: number) => void;\n /** Called when all tasks are done or no more can execute. */\n onDone?: (summary: ExecutionSummary) => void;\n}\n\nexport interface TaskExecutionContext {\n /** The spec being implemented. */\n spec: Specification;\n /** The full task graph. */\n graph: TaskGraph;\n /** The current task being executed. */\n task: TaskNode;\n /** Tasks that this task depends on. */\n dependencies: TaskNode[];\n /** Tasks that depend on this task. */\n dependents: TaskNode[];\n /** Retry count for this task (0 = first attempt). */\n retryCount: number;\n}\n\nexport interface TaskExecutionResult {\n success: boolean;\n output?: string;\n error?: string;\n /** If true, the task will be retried. */\n retry?: boolean;\n}\n\nexport interface ExecutionSummary {\n total: number;\n completed: number;\n failed: number;\n skipped: number;\n retried: number;\n duration: number;\n criticalPath: string[];\n}\n\n/**\n * Auto-executor that drives task execution with dependency resolution,\n * retry logic, and critical path awareness.\n */\nexport class AutoExecutor {\n private readonly opts: AutoExecutorOptions;\n private stopped = false;\n private retryMap = new Map<string, number>();\n\n constructor(opts: AutoExecutorOptions) {\n this.opts = opts;\n }\n\n /**\n * Execute all tasks in the graph, respecting dependencies.\n */\n async execute(graph: TaskGraph, spec: Specification): Promise<ExecutionSummary> {\n this.stopped = false;\n this.retryMap.clear();\n const startTime = Date.now();\n\n const critical = analyzeCriticalPath(graph);\n let completed = 0;\n let failed = 0;\n const skipped = 0;\n let retried = 0;\n\n while (!this.stopped) {\n const readyTasks = this.getReadyTasks(graph);\n\n if (readyTasks.length === 0) {\n // Check if all tasks are done\n const allDone = Array.from(graph.nodes.values()).every(\n (n) => n.status === 'completed' || n.status === 'failed',\n );\n if (allDone) break;\n\n // Check for deadlock (all remaining tasks are blocked by failed tasks)\n const hasDeadlock = this.detectDeadlock(graph);\n if (hasDeadlock) break;\n\n break;\n }\n\n // Execute batch\n const batch = readyTasks.slice(0, this.opts.maxConcurrent ?? 1);\n\n const results = await Promise.allSettled(\n batch.map((task) => this.executeTaskWithRetry(task, graph, spec)),\n );\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const task = batch[i];\n if (!result || !task) continue;\n\n if (result.status === 'fulfilled') {\n const { result: execResult, retries } = result.value;\n if (execResult.success) {\n this.opts.tracker.updateNodeStatus(task.id, 'completed');\n completed++;\n if (retries > 0) retried++;\n this.opts.onTaskComplete?.(task, execResult);\n } else if (execResult.retry) {\n retried++;\n // Task will be retried on next iteration\n } else {\n this.opts.tracker.updateNodeStatus(task.id, 'failed', execResult.error);\n failed++;\n }\n } else {\n this.opts.tracker.updateNodeStatus(task.id, 'failed', String(result.reason));\n failed++;\n this.opts.onTaskFail?.(task, result.reason as Error, 0);\n }\n }\n }\n\n const duration = Date.now() - startTime;\n const summary: ExecutionSummary = {\n total: graph.nodes.size,\n completed,\n failed,\n skipped,\n retried,\n duration,\n criticalPath: critical.criticalPath,\n };\n\n this.opts.onDone?.(summary);\n return summary;\n }\n\n /** Stop execution. */\n stop(): void {\n this.stopped = true;\n }\n\n /** Get tasks that are ready to execute (all dependencies completed). */\n private getReadyTasks(graph: TaskGraph): TaskNode[] {\n const ready: TaskNode[] = [];\n\n for (const node of graph.nodes.values()) {\n if (node.status !== 'pending') continue;\n\n // Check if all blockers are completed\n const blockers = graph.edges\n .filter((e) => e.type === 'depends_on' && e.from === node.id)\n .map((e) => graph.nodes.get(e.to))\n .filter(Boolean) as TaskNode[];\n\n const allBlockersDone = blockers.every((b) => b.status === 'completed');\n if (allBlockersDone) {\n ready.push(node);\n }\n }\n\n // Sort by priority\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n ready.sort((a, b) => (priorityOrder[a.priority] ?? 4) - (priorityOrder[b.priority] ?? 4));\n\n return ready;\n }\n\n /** Execute a single task with retry logic. */\n private async executeTaskWithRetry(\n task: TaskNode,\n graph: TaskGraph,\n spec: Specification,\n ): Promise<{ result: TaskExecutionResult; retries: number }> {\n const maxRetries = this.opts.maxRetries ?? 2;\n let retryCount = this.retryMap.get(task.id) ?? 0;\n\n while (retryCount <= maxRetries) {\n this.opts.tracker.updateNodeStatus(task.id, 'in_progress');\n this.opts.onTaskStart?.(task);\n\n const dependencies = this.getTaskDependencies(task.id, graph);\n const dependents = this.getTaskDependents(task.id, graph);\n\n const context: TaskExecutionContext = {\n spec,\n graph,\n task,\n dependencies,\n dependents,\n retryCount,\n };\n\n try {\n const result = await this.opts.executeTask(task, context);\n\n if (result.success) {\n const retriesForTask = this.retryMap.get(task.id) ?? 0;\n this.retryMap.delete(task.id);\n return { result, retries: retriesForTask };\n }\n\n if (result.retry && retryCount < maxRetries) {\n retryCount++;\n this.retryMap.set(task.id, retryCount);\n this.opts.tracker.updateNodeStatus(task.id, 'pending');\n continue;\n }\n\n return { result, retries: retryCount };\n } catch (error) {\n if (retryCount < maxRetries) {\n retryCount++;\n this.retryMap.set(task.id, retryCount);\n this.opts.tracker.updateNodeStatus(task.id, 'pending');\n this.opts.onTaskFail?.(task, error as Error, retryCount);\n continue;\n }\n\n return {\n result: {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n },\n retries: retryCount,\n };\n }\n }\n\n return { result: { success: false, error: 'Max retries exceeded' }, retries: retryCount };\n }\n\n /** Get tasks that this task depends on. */\n private getTaskDependencies(taskId: string, graph: TaskGraph): TaskNode[] {\n return graph.edges\n .filter((e) => e.type === 'depends_on' && e.from === taskId)\n .map((e) => graph.nodes.get(e.to))\n .filter(Boolean) as TaskNode[];\n }\n\n /** Get tasks that depend on this task. */\n private getTaskDependents(taskId: string, graph: TaskGraph): TaskNode[] {\n return graph.edges\n .filter((e) => e.type === 'depends_on' && e.to === taskId)\n .map((e) => graph.nodes.get(e.from))\n .filter(Boolean) as TaskNode[];\n }\n\n /** Detect deadlock: all remaining tasks are blocked by failed tasks. */\n private detectDeadlock(graph: TaskGraph): boolean {\n const remaining = Array.from(graph.nodes.values()).filter(\n (n) => n.status === 'pending' || n.status === 'blocked',\n );\n\n if (remaining.length === 0) return false;\n\n return remaining.every((node) => {\n const blockers = graph.edges\n .filter((e) => e.type === 'depends_on' && e.from === node.id)\n .map((e) => graph.nodes.get(e.to))\n .filter(Boolean) as TaskNode[];\n\n return blockers.some((b) => b.status === 'failed');\n });\n }\n}\n\n/**\n * Create an auto-executor that works with TaskFlow.\n */\nexport function createAutoExecutor(opts: {\n tracker: TaskTracker;\n events: EventBus;\n executeTask: AutoExecutorOptions['executeTask'];\n maxConcurrent?: number;\n maxRetries?: number;\n}): AutoExecutor {\n return new AutoExecutor({\n tracker: opts.tracker,\n events: opts.events,\n executeTask: opts.executeTask,\n maxConcurrent: opts.maxConcurrent,\n maxRetries: opts.maxRetries,\n });\n}\n"]}
|