agents-task-assigning 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/server.ts","../src/db/connection.ts","../src/db/schema.ts","../src/db/queries.ts","../src/services/dag-service.ts","../src/services/git-service.ts","../src/services/conflict-service.ts","../src/services/task-service.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./server.js\";\n\nasync function main() {\n\tconst server = createServer();\n\tconst transport = new StdioServerTransport();\n\tawait server.connect(transport);\n}\n\nmain().catch((error) => {\n\tconsole.error(\"Fatal error:\", error);\n\tprocess.exit(1);\n});\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { getDb } from \"./db/connection.js\";\nimport { TaskService } from \"./services/task-service.js\";\n\nlet taskService: TaskService | null = null;\n\nfunction getTaskService(): TaskService {\n\tif (!taskService) {\n\t\tconst db = getDb();\n\t\ttaskService = new TaskService(db);\n\t}\n\treturn taskService;\n}\n\nexport function createServer(): McpServer {\n\tconst server = new McpServer({\n\t\tname: \"task-manager\",\n\t\tversion: \"0.1.0\",\n\t});\n\n\t// ── create_tasks ────────────────────────────────────────────────────\n\tserver.tool(\n\t\t\"create_tasks\",\n\t\t\"Create a group of tasks from a high-level requirement. Analyzes dependencies and file ownership.\",\n\t\t{\n\t\t\tgroup_title: z.string().describe(\"Title for the task group\"),\n\t\t\tgroup_description: z\n\t\t\t\t.string()\n\t\t\t\t.describe(\"Description of the overall requirement\"),\n\t\t\ttasks: z.array(\n\t\t\t\tz.object({\n\t\t\t\t\ttitle: z.string(),\n\t\t\t\t\tdescription: z.string(),\n\t\t\t\t\tpriority: z\n\t\t\t\t\t\t.enum([\"high\", \"medium\", \"low\"])\n\t\t\t\t\t\t.optional()\n\t\t\t\t\t\t.default(\"medium\"),\n\t\t\t\t\tdepends_on: z.array(z.number()).optional().default([]),\n\t\t\t\t\tfile_patterns: z\n\t\t\t\t\t\t.array(\n\t\t\t\t\t\t\tz.object({\n\t\t\t\t\t\t\t\tpattern: z.string(),\n\t\t\t\t\t\t\t\townership_type: z.enum([\"exclusive\", \"shared\"]),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.optional()\n\t\t\t\t\t\t.default([]),\n\t\t\t\t}),\n\t\t\t),\n\t\t},\n\t\tasync (params) => {\n\t\t\ttry {\n\t\t\t\tconst result = getTaskService().createTasks(params);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: \"text\" as const, text: JSON.stringify(result, null, 2) },\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\ttext: `Error: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t);\n\n\t// ── list_tasks ──────────────────────────────────────────────────────\n\tserver.tool(\n\t\t\"list_tasks\",\n\t\t\"List tasks with optional filtering by group and status. Can include progress details.\",\n\t\t{\n\t\t\tgroup_id: z.string().optional(),\n\t\t\tstatus: z\n\t\t\t\t.array(\n\t\t\t\t\tz.enum([\n\t\t\t\t\t\t\"pending\",\n\t\t\t\t\t\t\"assigned\",\n\t\t\t\t\t\t\"in_progress\",\n\t\t\t\t\t\t\"in_review\",\n\t\t\t\t\t\t\"completed\",\n\t\t\t\t\t\t\"failed\",\n\t\t\t\t\t\t\"blocked\",\n\t\t\t\t\t]),\n\t\t\t\t)\n\t\t\t\t.optional(),\n\t\t\tinclude_progress: z.boolean().optional().default(false),\n\t\t},\n\t\tasync (params) => {\n\t\t\ttry {\n\t\t\t\tconst result = getTaskService().listTasks(params);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: \"text\" as const, text: JSON.stringify(result, null, 2) },\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\ttext: `Error: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t);\n\n\t// ── get_task ────────────────────────────────────────────────────────\n\tserver.tool(\n\t\t\"get_task\",\n\t\t\"Get detailed information about a specific task including dependencies, file ownership, and progress logs.\",\n\t\t{\n\t\t\ttask_id: z.string(),\n\t\t},\n\t\tasync (params) => {\n\t\t\ttry {\n\t\t\t\tconst result = getTaskService().getTask(params);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: \"text\" as const, text: JSON.stringify(result, null, 2) },\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\ttext: `Error: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t);\n\n\t// ── claim_task ──────────────────────────────────────────────────────\n\tserver.tool(\n\t\t\"claim_task\",\n\t\t\"Claim a task for an agent. Assigns the task and checks for dependency and file ownership conflicts.\",\n\t\t{\n\t\t\ttask_id: z.string(),\n\t\t\tagent_id: z.string().optional(),\n\t\t},\n\t\tasync (params) => {\n\t\t\ttry {\n\t\t\t\tconst result = getTaskService().claimTask(params);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: \"text\" as const, text: JSON.stringify(result, null, 2) },\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\ttext: `Error: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t);\n\n\t// ── start_task ──────────────────────────────────────────────────────\n\tserver.tool(\n\t\t\"start_task\",\n\t\t\"Start working on a claimed task. Creates a git worktree and branch for isolated work.\",\n\t\t{\n\t\t\ttask_id: z.string(),\n\t\t},\n\t\tasync (params) => {\n\t\t\ttry {\n\t\t\t\tconst result = getTaskService().startTask(params);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: \"text\" as const, text: JSON.stringify(result, null, 2) },\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\ttext: `Error: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t);\n\n\t// ── update_progress ─────────────────────────────────────────────────\n\tserver.tool(\n\t\t\"update_progress\",\n\t\t\"Update progress on an in-progress task. Reports percentage complete and checks for file conflicts.\",\n\t\t{\n\t\t\ttask_id: z.string(),\n\t\t\tprogress: z.number().min(0).max(100),\n\t\t\tnote: z.string(),\n\t\t\tfiles_changed: z.array(z.string()).optional(),\n\t\t},\n\t\tasync (params) => {\n\t\t\ttry {\n\t\t\t\tconst result = getTaskService().updateProgress(params);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: \"text\" as const, text: JSON.stringify(result, null, 2) },\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\ttext: `Error: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t);\n\n\t// ── complete_task ───────────────────────────────────────────────────\n\tserver.tool(\n\t\t\"complete_task\",\n\t\t\"Mark a task as completed with a summary and list of changed files. Moves task to in_review status.\",\n\t\t{\n\t\t\ttask_id: z.string(),\n\t\t\tsummary: z.string(),\n\t\t\tfiles_changed: z.array(z.string()),\n\t\t},\n\t\tasync (params) => {\n\t\t\ttry {\n\t\t\t\tconst result = getTaskService().completeTask(params);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: \"text\" as const, text: JSON.stringify(result, null, 2) },\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\ttext: `Error: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t);\n\n\t// ── merge_task ──────────────────────────────────────────────────────\n\tserver.tool(\n\t\t\"merge_task\",\n\t\t\"Merge a completed task branch back into the main branch. Supports merge and squash strategies.\",\n\t\t{\n\t\t\ttask_id: z.string(),\n\t\t\tstrategy: z.enum([\"merge\", \"squash\"]).optional().default(\"squash\"),\n\t\t},\n\t\tasync (params) => {\n\t\t\ttry {\n\t\t\t\tconst result = getTaskService().mergeTask(params);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: \"text\" as const, text: JSON.stringify(result, null, 2) },\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\ttext: `Error: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t);\n\n\t// ── cleanup_task ────────────────────────────────────────────────────\n\tserver.tool(\n\t\t\"cleanup_task\",\n\t\t\"Clean up a task by removing its worktree and branch. Used after merging or to abandon a task.\",\n\t\t{\n\t\t\ttask_id: z.string(),\n\t\t\treason: z.string().optional(),\n\t\t},\n\t\tasync (params) => {\n\t\t\ttry {\n\t\t\t\tconst result = getTaskService().cleanupTask(params);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{ type: \"text\" as const, text: JSON.stringify(result, null, 2) },\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\ttext: `Error: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t);\n\n\treturn server;\n}\n\nexport const server = createServer();\n","import Database from \"better-sqlite3\";\nimport { mkdirSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { initializeSchema } from \"./schema.js\";\n\ntype DB = InstanceType<typeof Database>;\n\nconst instances = new Map<string, DB>();\n\nfunction resolveDefaultPath(): string {\n\tconst envPath = process.env.TASK_DB_PATH;\n\tif (envPath) {\n\t\treturn resolve(envPath);\n\t}\n\treturn resolve(process.cwd(), \".tasks\", \"tasks.db\");\n}\n\nexport function getDb(dbPath?: string): DB {\n\tconst resolvedPath = dbPath ? resolve(dbPath) : resolveDefaultPath();\n\n\tconst cached = instances.get(resolvedPath);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\t// Ensure the parent directory exists\n\tmkdirSync(dirname(resolvedPath), { recursive: true });\n\n\tconst db = new Database(resolvedPath);\n\tdb.pragma(\"journal_mode = WAL\");\n\tdb.pragma(\"foreign_keys = ON\");\n\n\tinitializeSchema(db);\n\n\tinstances.set(resolvedPath, db);\n\treturn db;\n}\n\nexport function closeDb(): void {\n\tfor (const [path, db] of instances) {\n\t\tdb.close();\n\t\tinstances.delete(path);\n\t}\n}\n\nexport function getDbForTesting(dbPath?: string): DB {\n\tconst db = dbPath ? new Database(dbPath) : new Database(\":memory:\");\n\tdb.pragma(\"journal_mode = WAL\");\n\tdb.pragma(\"foreign_keys = ON\");\n\tinitializeSchema(db);\n\treturn db;\n}\n","import Database from \"better-sqlite3\";\n\ntype DB = InstanceType<typeof Database>;\n\nexport function initializeSchema(db: DB): void {\n\tdb.exec(`\n CREATE TABLE IF NOT EXISTS task_groups (\n id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n description TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'active',\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n\n CREATE TABLE IF NOT EXISTS tasks (\n id TEXT PRIMARY KEY,\n group_id TEXT NOT NULL REFERENCES task_groups(id),\n sequence INTEGER NOT NULL,\n title TEXT NOT NULL,\n description TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n priority TEXT NOT NULL DEFAULT 'medium',\n assigned_to TEXT,\n branch_name TEXT,\n worktree_path TEXT,\n progress INTEGER NOT NULL DEFAULT 0,\n progress_note TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n started_at TEXT,\n completed_at TEXT,\n merged_at TEXT\n );\n\n CREATE TABLE IF NOT EXISTS task_dependencies (\n task_id TEXT NOT NULL REFERENCES tasks(id),\n depends_on TEXT NOT NULL REFERENCES tasks(id),\n PRIMARY KEY (task_id, depends_on)\n );\n\n CREATE TABLE IF NOT EXISTS task_file_ownership (\n task_id TEXT NOT NULL REFERENCES tasks(id),\n file_pattern TEXT NOT NULL,\n ownership_type TEXT NOT NULL DEFAULT 'exclusive',\n PRIMARY KEY (task_id, file_pattern)\n );\n\n CREATE TABLE IF NOT EXISTS progress_logs (\n id TEXT PRIMARY KEY,\n task_id TEXT NOT NULL REFERENCES tasks(id),\n timestamp TEXT NOT NULL DEFAULT (datetime('now')),\n event TEXT NOT NULL,\n message TEXT NOT NULL,\n metadata TEXT\n );\n\n CREATE INDEX IF NOT EXISTS idx_tasks_group ON tasks(group_id);\n CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);\n CREATE INDEX IF NOT EXISTS idx_deps_task ON task_dependencies(task_id);\n CREATE INDEX IF NOT EXISTS idx_deps_depends ON task_dependencies(depends_on);\n CREATE INDEX IF NOT EXISTS idx_logs_task ON progress_logs(task_id);\n `);\n}\n","import Database from \"better-sqlite3\";\nimport type {\n\tTask,\n\tTaskGroup,\n\tTaskFileOwnership,\n\tProgressLog,\n} from \"../types/index.js\";\n\ntype DB = InstanceType<typeof Database>;\n\nexport class TaskQueries {\n\tprivate db: DB;\n\n\tconstructor(db: DB) {\n\t\tthis.db = db;\n\t}\n\n\t// ── Task Groups ──────────────────────────────────────────────────\n\n\tcreateGroup(group: Omit<TaskGroup, \"created_at\">): TaskGroup {\n\t\tconst stmt = this.db.prepare(`\n INSERT INTO task_groups (id, title, description, status)\n VALUES (@id, @title, @description, @status)\n `);\n\t\tstmt.run(group);\n\t\treturn this.getGroup(group.id)!;\n\t}\n\n\tgetGroup(id: string): TaskGroup | undefined {\n\t\tconst stmt = this.db.prepare(`\n SELECT id, title, description, status, created_at\n FROM task_groups WHERE id = ?\n `);\n\t\treturn stmt.get(id) as TaskGroup | undefined;\n\t}\n\n\t// ── Tasks ────────────────────────────────────────────────────────\n\n\tcreateTask(\n\t\ttask: Omit<\n\t\t\tTask,\n\t\t\t\"created_at\" | \"started_at\" | \"completed_at\" | \"merged_at\"\n\t\t>,\n\t): Task {\n\t\tconst stmt = this.db.prepare(`\n INSERT INTO tasks (id, group_id, sequence, title, description, status, priority,\n assigned_to, branch_name, worktree_path, progress, progress_note)\n VALUES (@id, @group_id, @sequence, @title, @description, @status, @priority,\n @assigned_to, @branch_name, @worktree_path, @progress, @progress_note)\n `);\n\t\tstmt.run({\n\t\t\tid: task.id,\n\t\t\tgroup_id: task.group_id,\n\t\t\tsequence: task.sequence,\n\t\t\ttitle: task.title,\n\t\t\tdescription: task.description,\n\t\t\tstatus: task.status,\n\t\t\tpriority: task.priority,\n\t\t\tassigned_to: task.assigned_to ?? null,\n\t\t\tbranch_name: task.branch_name ?? null,\n\t\t\tworktree_path: task.worktree_path ?? null,\n\t\t\tprogress: task.progress,\n\t\t\tprogress_note: task.progress_note ?? null,\n\t\t});\n\t\treturn this.getTask(task.id)!;\n\t}\n\n\tgetTask(id: string): Task | undefined {\n\t\tconst stmt = this.db.prepare(`\n SELECT id, group_id, sequence, title, description, status, priority,\n assigned_to, branch_name, worktree_path, progress, progress_note,\n created_at, started_at, completed_at, merged_at\n FROM tasks WHERE id = ?\n `);\n\t\treturn stmt.get(id) as Task | undefined;\n\t}\n\n\tgetTaskBySequenceAndGroup(\n\t\tgroupId: string,\n\t\tsequence: number,\n\t): Task | undefined {\n\t\tconst stmt = this.db.prepare(`\n SELECT id, group_id, sequence, title, description, status, priority,\n assigned_to, branch_name, worktree_path, progress, progress_note,\n created_at, started_at, completed_at, merged_at\n FROM tasks WHERE group_id = ? AND sequence = ?\n `);\n\t\treturn stmt.get(groupId, sequence) as Task | undefined;\n\t}\n\n\tlistTasks(opts?: { group_id?: string; status?: string[] }): Task[] {\n\t\tlet sql = `\n SELECT id, group_id, sequence, title, description, status, priority,\n assigned_to, branch_name, worktree_path, progress, progress_note,\n created_at, started_at, completed_at, merged_at\n FROM tasks\n `;\n\t\tconst conditions: string[] = [];\n\t\tconst params: unknown[] = [];\n\n\t\tif (opts?.group_id) {\n\t\t\tconditions.push(\"group_id = ?\");\n\t\t\tparams.push(opts.group_id);\n\t\t}\n\n\t\tif (opts?.status && opts.status.length > 0) {\n\t\t\tconst placeholders = opts.status.map(() => \"?\").join(\", \");\n\t\t\tconditions.push(`status IN (${placeholders})`);\n\t\t\tparams.push(...opts.status);\n\t\t}\n\n\t\tif (conditions.length > 0) {\n\t\t\tsql += \" WHERE \" + conditions.join(\" AND \");\n\t\t}\n\n\t\tsql += \" ORDER BY sequence ASC\";\n\n\t\tconst stmt = this.db.prepare(sql);\n\t\treturn stmt.all(...params) as Task[];\n\t}\n\n\tupdateTask(\n\t\tid: string,\n\t\tupdates: Partial<\n\t\t\tPick<\n\t\t\t\tTask,\n\t\t\t\t| \"status\"\n\t\t\t\t| \"assigned_to\"\n\t\t\t\t| \"branch_name\"\n\t\t\t\t| \"worktree_path\"\n\t\t\t\t| \"progress\"\n\t\t\t\t| \"progress_note\"\n\t\t\t\t| \"started_at\"\n\t\t\t\t| \"completed_at\"\n\t\t\t\t| \"merged_at\"\n\t\t\t>\n\t\t>,\n\t): Task {\n\t\tconst keys = Object.keys(updates).filter(\n\t\t\t(k) => (updates as Record<string, unknown>)[k] !== undefined,\n\t\t);\n\n\t\tif (keys.length === 0) {\n\t\t\treturn this.getTask(id)!;\n\t\t}\n\n\t\tconst setClauses = keys.map((k) => `${k} = @${k}`).join(\", \");\n\t\tconst sql = `UPDATE tasks SET ${setClauses} WHERE id = @id`;\n\t\tconst stmt = this.db.prepare(sql);\n\t\tstmt.run({ id, ...updates });\n\t\treturn this.getTask(id)!;\n\t}\n\n\t// ── Dependencies ─────────────────────────────────────────────────\n\n\taddDependency(taskId: string, dependsOn: string): void {\n\t\tconst stmt = this.db.prepare(`\n INSERT OR IGNORE INTO task_dependencies (task_id, depends_on)\n VALUES (?, ?)\n `);\n\t\tstmt.run(taskId, dependsOn);\n\t}\n\n\tgetDependencies(taskId: string): Task[] {\n\t\tconst stmt = this.db.prepare(`\n SELECT t.id, t.group_id, t.sequence, t.title, t.description, t.status,\n t.priority, t.assigned_to, t.branch_name, t.worktree_path,\n t.progress, t.progress_note, t.created_at, t.started_at,\n t.completed_at, t.merged_at\n FROM task_dependencies d\n JOIN tasks t ON t.id = d.depends_on\n WHERE d.task_id = ?\n ORDER BY t.sequence ASC\n `);\n\t\treturn stmt.all(taskId) as Task[];\n\t}\n\n\tgetDependents(taskId: string): Task[] {\n\t\tconst stmt = this.db.prepare(`\n SELECT t.id, t.group_id, t.sequence, t.title, t.description, t.status,\n t.priority, t.assigned_to, t.branch_name, t.worktree_path,\n t.progress, t.progress_note, t.created_at, t.started_at,\n t.completed_at, t.merged_at\n FROM task_dependencies d\n JOIN tasks t ON t.id = d.task_id\n WHERE d.depends_on = ?\n ORDER BY t.sequence ASC\n `);\n\t\treturn stmt.all(taskId) as Task[];\n\t}\n\n\t// ── File Ownership ───────────────────────────────────────────────\n\n\taddFileOwnership(ownership: TaskFileOwnership): void {\n\t\tconst stmt = this.db.prepare(`\n INSERT OR REPLACE INTO task_file_ownership (task_id, file_pattern, ownership_type)\n VALUES (@task_id, @file_pattern, @ownership_type)\n `);\n\t\tstmt.run(ownership);\n\t}\n\n\tgetFileOwnership(taskId: string): TaskFileOwnership[] {\n\t\tconst stmt = this.db.prepare(`\n SELECT task_id, file_pattern, ownership_type\n FROM task_file_ownership WHERE task_id = ?\n `);\n\t\treturn stmt.all(taskId) as TaskFileOwnership[];\n\t}\n\n\tgetFileOwnershipConflicts(\n\t\ttaskId: string,\n\t): Array<{ task: Task; pattern: string; ownership_type: string }> {\n\t\t// Find in_progress tasks whose file patterns overlap with this task's patterns.\n\t\t// Two patterns \"overlap\" when they are identical strings. The conflict applies\n\t\t// when the other task is currently in_progress and has a matching pattern.\n\t\tconst stmt = this.db.prepare(`\n SELECT t.id, t.group_id, t.sequence, t.title, t.description, t.status,\n t.priority, t.assigned_to, t.branch_name, t.worktree_path,\n t.progress, t.progress_note, t.created_at, t.started_at,\n t.completed_at, t.merged_at,\n other_fo.file_pattern AS pattern,\n other_fo.ownership_type AS ownership_type\n FROM task_file_ownership my_fo\n JOIN task_file_ownership other_fo ON my_fo.file_pattern = other_fo.file_pattern\n JOIN tasks t ON t.id = other_fo.task_id\n WHERE my_fo.task_id = ?\n AND other_fo.task_id != ?\n AND t.status = 'in_progress'\n `);\n\n\t\tconst rows = stmt.all(taskId, taskId) as Array<\n\t\t\tTask & { pattern: string; ownership_type: string }\n\t\t>;\n\n\t\treturn rows.map((row) => {\n\t\t\tconst { pattern, ownership_type, ...taskFields } = row;\n\t\t\treturn {\n\t\t\t\ttask: taskFields as Task,\n\t\t\t\tpattern,\n\t\t\t\townership_type,\n\t\t\t};\n\t\t});\n\t}\n\n\t// ── Progress Logs ────────────────────────────────────────────────\n\n\taddProgressLog(log: Omit<ProgressLog, \"timestamp\">): ProgressLog {\n\t\tconst stmt = this.db.prepare(`\n INSERT INTO progress_logs (id, task_id, event, message, metadata)\n VALUES (@id, @task_id, @event, @message, @metadata)\n `);\n\t\tstmt.run({\n\t\t\tid: log.id,\n\t\t\ttask_id: log.task_id,\n\t\t\tevent: log.event,\n\t\t\tmessage: log.message,\n\t\t\tmetadata: log.metadata ? JSON.stringify(log.metadata) : null,\n\t\t});\n\t\treturn this.getProgressLog(log.id)!;\n\t}\n\n\tgetProgressLogs(taskId: string): ProgressLog[] {\n\t\tconst stmt = this.db.prepare(`\n SELECT id, task_id, timestamp, event, message, metadata\n FROM progress_logs WHERE task_id = ?\n ORDER BY timestamp ASC\n `);\n\t\tconst rows = stmt.all(taskId) as Array<\n\t\t\tOmit<ProgressLog, \"metadata\"> & { metadata: string | null }\n\t\t>;\n\t\treturn rows.map((row) => ({\n\t\t\t...row,\n\t\t\tmetadata: row.metadata ? JSON.parse(row.metadata) : null,\n\t\t}));\n\t}\n\n\t// ── Private helpers ──────────────────────────────────────────────\n\n\tprivate getProgressLog(id: string): ProgressLog | undefined {\n\t\tconst stmt = this.db.prepare(`\n SELECT id, task_id, timestamp, event, message, metadata\n FROM progress_logs WHERE id = ?\n `);\n\t\tconst row = stmt.get(id) as\n\t\t\t| (Omit<ProgressLog, \"metadata\"> & { metadata: string | null })\n\t\t\t| undefined;\n\t\tif (!row) return undefined;\n\t\treturn {\n\t\t\t...row,\n\t\t\tmetadata: row.metadata ? JSON.parse(row.metadata) : null,\n\t\t};\n\t}\n}\n","export class DagService {\n\t/**\n\t * Validate that adding dependencies won't create a cycle.\n\t * Uses DFS-based cycle detection.\n\t */\n\tvalidateNoCycles(dependencies: Map<string, string[]>): {\n\t\tvalid: boolean;\n\t\tcycle?: string[];\n\t} {\n\t\tconst WHITE = 0; // unvisited\n\t\tconst GRAY = 1; // in current DFS path\n\t\tconst BLACK = 2; // fully processed\n\n\t\tconst color = new Map<string, number>();\n\n\t\t// Initialize all nodes\n\t\tfor (const [node, deps] of dependencies) {\n\t\t\tcolor.set(node, WHITE);\n\t\t\tfor (const dep of deps) {\n\t\t\t\tif (!color.has(dep)) {\n\t\t\t\t\tcolor.set(dep, WHITE);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst parent = new Map<string, string | null>();\n\n\t\tconst dfs = (node: string): string[] | null => {\n\t\t\tcolor.set(node, GRAY);\n\n\t\t\tconst neighbors = dependencies.get(node) ?? [];\n\t\t\tfor (const neighbor of neighbors) {\n\t\t\t\tconst neighborColor = color.get(neighbor) ?? WHITE;\n\n\t\t\t\tif (neighborColor === GRAY) {\n\t\t\t\t\t// Found a cycle - reconstruct it\n\t\t\t\t\tconst cycle: string[] = [neighbor, node];\n\t\t\t\t\tlet current = node;\n\t\t\t\t\twhile (\n\t\t\t\t\t\tparent.get(current) !== null &&\n\t\t\t\t\t\tparent.get(current) !== neighbor\n\t\t\t\t\t) {\n\t\t\t\t\t\tcurrent = parent.get(current)!;\n\t\t\t\t\t\tcycle.push(current);\n\t\t\t\t\t}\n\t\t\t\t\tcycle.reverse();\n\t\t\t\t\treturn cycle;\n\t\t\t\t}\n\n\t\t\t\tif (neighborColor === WHITE) {\n\t\t\t\t\tparent.set(neighbor, node);\n\t\t\t\t\tconst result = dfs(neighbor);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcolor.set(node, BLACK);\n\t\t\treturn null;\n\t\t};\n\n\t\tfor (const node of color.keys()) {\n\t\t\tif (color.get(node) === WHITE) {\n\t\t\t\tparent.set(node, null);\n\t\t\t\tconst cycle = dfs(node);\n\t\t\t\tif (cycle) {\n\t\t\t\t\treturn { valid: false, cycle };\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn { valid: true };\n\t}\n\n\t/**\n\t * Get topological order of tasks using Kahn's algorithm.\n\t */\n\ttopologicalSort(dependencies: Map<string, string[]>): string[] {\n\t\t// Build in-degree map and collect all nodes\n\t\tconst inDegree = new Map<string, number>();\n\t\tconst adjacency = new Map<string, string[]>();\n\n\t\t// Collect all nodes\n\t\tfor (const [node, deps] of dependencies) {\n\t\t\tif (!inDegree.has(node)) {\n\t\t\t\tinDegree.set(node, 0);\n\t\t\t}\n\t\t\tif (!adjacency.has(node)) {\n\t\t\t\tadjacency.set(node, []);\n\t\t\t}\n\t\t\tfor (const dep of deps) {\n\t\t\t\tif (!inDegree.has(dep)) {\n\t\t\t\t\tinDegree.set(dep, 0);\n\t\t\t\t}\n\t\t\t\tif (!adjacency.has(dep)) {\n\t\t\t\t\tadjacency.set(dep, []);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Build adjacency: dep -> [nodes that depend on dep]\n\t\t// and compute in-degrees\n\t\tfor (const [node, deps] of dependencies) {\n\t\t\tinDegree.set(node, (inDegree.get(node) ?? 0) + deps.length);\n\t\t\tfor (const dep of deps) {\n\t\t\t\tconst adj = adjacency.get(dep) ?? [];\n\t\t\t\tadj.push(node);\n\t\t\t\tadjacency.set(dep, adj);\n\t\t\t}\n\t\t}\n\n\t\t// Start with nodes that have no dependencies (in-degree 0)\n\t\tconst queue: string[] = [];\n\t\tfor (const [node, degree] of inDegree) {\n\t\t\tif (degree === 0) {\n\t\t\t\tqueue.push(node);\n\t\t\t}\n\t\t}\n\n\t\tconst result: string[] = [];\n\n\t\twhile (queue.length > 0) {\n\t\t\tconst node = queue.shift()!;\n\t\t\tresult.push(node);\n\n\t\t\tconst neighbors = adjacency.get(node) ?? [];\n\t\t\tfor (const neighbor of neighbors) {\n\t\t\t\tconst newDegree = (inDegree.get(neighbor) ?? 1) - 1;\n\t\t\t\tinDegree.set(neighbor, newDegree);\n\t\t\t\tif (newDegree === 0) {\n\t\t\t\t\tqueue.push(neighbor);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If result doesn't contain all nodes, there's a cycle\n\t\tif (result.length !== inDegree.size) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Cannot perform topological sort: graph contains a cycle\",\n\t\t\t);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Check if a task can start (all dependencies completed).\n\t */\n\tcanStart(\n\t\ttaskId: string,\n\t\tdependencies: Map<string, string[]>,\n\t\tcompletedTasks: Set<string>,\n\t): boolean {\n\t\tconst deps = dependencies.get(taskId) ?? [];\n\t\treturn deps.every((dep) => completedTasks.has(dep));\n\t}\n\n\t/**\n\t * Get all tasks that would be unlocked if a given task is completed.\n\t * A task is unlocked when ALL of its dependencies are in the completed set.\n\t */\n\tgetUnlockedTasks(\n\t\tcompletedTaskId: string,\n\t\tallDependencies: Map<string, string[]>,\n\t\tcompletedTasks: Set<string>,\n\t): string[] {\n\t\t// Create a new completed set that includes the newly completed task\n\t\tconst newCompleted = new Set(completedTasks);\n\t\tnewCompleted.add(completedTaskId);\n\n\t\tconst unlocked: string[] = [];\n\n\t\tfor (const [taskId, deps] of allDependencies) {\n\t\t\t// Skip if already completed or if it doesn't depend on the completed task\n\t\t\tif (newCompleted.has(taskId)) continue;\n\t\t\tif (!deps.includes(completedTaskId)) continue;\n\n\t\t\t// Check if all dependencies are now met\n\t\t\tif (deps.every((dep) => newCompleted.has(dep))) {\n\t\t\t\tunlocked.push(taskId);\n\t\t\t}\n\t\t}\n\n\t\treturn unlocked;\n\t}\n}\n\n// Export singleton instance\nexport const dagService = new DagService();\n","import { execSync } from \"node:child_process\";\n\nexport class GitService {\n\tconstructor(private repoRoot: string) {}\n\n\t/**\n\t * Get the repo root directory.\n\t */\n\tstatic getRepoRoot(): string {\n\t\ttry {\n\t\t\treturn execSync(\"git rev-parse --show-toplevel\", {\n\t\t\t\tencoding: \"utf-8\",\n\t\t\t\tstdio: \"pipe\",\n\t\t\t}).trim();\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to determine git repo root: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a new worktree with a new branch.\n\t */\n\tcreateWorktree(worktreePath: string, branchName: string): void {\n\t\ttry {\n\t\t\texecSync(`git worktree add \"${worktreePath}\" -b \"${branchName}\"`, {\n\t\t\t\tcwd: this.repoRoot,\n\t\t\t\tencoding: \"utf-8\",\n\t\t\t\tstdio: \"pipe\",\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to create worktree at ${worktreePath} with branch ${branchName}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Remove a worktree.\n\t */\n\tremoveWorktree(worktreePath: string): void {\n\t\ttry {\n\t\t\texecSync(`git worktree remove \"${worktreePath}\" --force`, {\n\t\t\t\tcwd: this.repoRoot,\n\t\t\t\tencoding: \"utf-8\",\n\t\t\t\tstdio: \"pipe\",\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to remove worktree at ${worktreePath}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Delete a branch.\n\t */\n\tdeleteBranch(branchName: string): void {\n\t\ttry {\n\t\t\texecSync(`git branch -D \"${branchName}\"`, {\n\t\t\t\tcwd: this.repoRoot,\n\t\t\t\tencoding: \"utf-8\",\n\t\t\t\tstdio: \"pipe\",\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to delete branch ${branchName}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get current branch name.\n\t */\n\tgetCurrentBranch(): string {\n\t\ttry {\n\t\t\treturn execSync(\"git rev-parse --abbrev-ref HEAD\", {\n\t\t\t\tcwd: this.repoRoot,\n\t\t\t\tencoding: \"utf-8\",\n\t\t\t\tstdio: \"pipe\",\n\t\t\t}).trim();\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to get current branch: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Check if we're on the main/master branch.\n\t */\n\tisOnMainBranch(): boolean {\n\t\tconst branch = this.getCurrentBranch();\n\t\treturn branch === \"main\" || branch === \"master\";\n\t}\n\n\t/**\n\t * Get the latest commit hash on a branch.\n\t */\n\tgetLatestCommit(branch?: string): string {\n\t\ttry {\n\t\t\tconst ref = branch ?? \"HEAD\";\n\t\t\treturn execSync(`git rev-parse \"${ref}\"`, {\n\t\t\t\tcwd: this.repoRoot,\n\t\t\t\tencoding: \"utf-8\",\n\t\t\t\tstdio: \"pipe\",\n\t\t\t}).trim();\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to get latest commit${branch ? ` for branch ${branch}` : \"\"}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Check if a worktree path exists in the list of worktrees.\n\t */\n\tworktreeExists(worktreePath: string): boolean {\n\t\ttry {\n\t\t\tconst output = execSync(\"git worktree list --porcelain\", {\n\t\t\t\tcwd: this.repoRoot,\n\t\t\t\tencoding: \"utf-8\",\n\t\t\t\tstdio: \"pipe\",\n\t\t\t});\n\t\t\treturn output.includes(worktreePath);\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Merge a branch (squash or regular).\n\t * Returns success status and any conflicted files.\n\t */\n\tmergeBranch(\n\t\tbranchName: string,\n\t\tstrategy: \"merge\" | \"squash\",\n\t): { success: boolean; conflicts: string[] } {\n\t\ttry {\n\t\t\tconst cmd =\n\t\t\t\tstrategy === \"squash\"\n\t\t\t\t\t? `git merge --squash \"${branchName}\"`\n\t\t\t\t\t: `git merge \"${branchName}\" --no-edit`;\n\n\t\t\texecSync(cmd, {\n\t\t\t\tcwd: this.repoRoot,\n\t\t\t\tencoding: \"utf-8\",\n\t\t\t\tstdio: \"pipe\",\n\t\t\t});\n\n\t\t\treturn { success: true, conflicts: [] };\n\t\t} catch {\n\t\t\t// Check if there are conflicts\n\t\t\tconst conflicts = this.getConflictedFiles();\n\t\t\tif (conflicts.length > 0) {\n\t\t\t\treturn { success: false, conflicts };\n\t\t\t}\n\t\t\t// If no conflicts detected, it was a different kind of error\n\t\t\tthrow new Error(`Failed to merge branch ${branchName}`);\n\t\t}\n\t}\n\n\t/**\n\t * Abort a merge in progress.\n\t */\n\tabortMerge(): void {\n\t\ttry {\n\t\t\texecSync(\"git merge --abort\", {\n\t\t\t\tcwd: this.repoRoot,\n\t\t\t\tencoding: \"utf-8\",\n\t\t\t\tstdio: \"pipe\",\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to abort merge: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get list of conflicted files.\n\t */\n\tgetConflictedFiles(): string[] {\n\t\ttry {\n\t\t\tconst output = execSync(\"git diff --name-only --diff-filter=U\", {\n\t\t\t\tcwd: this.repoRoot,\n\t\t\t\tencoding: \"utf-8\",\n\t\t\t\tstdio: \"pipe\",\n\t\t\t});\n\t\t\treturn output\n\t\t\t\t.trim()\n\t\t\t\t.split(\"\\n\")\n\t\t\t\t.filter((f) => f.length > 0);\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/**\n\t * Check if main branch has new commits since a given commit hash.\n\t */\n\thasNewCommitsSince(commitHash: string): boolean {\n\t\ttry {\n\t\t\t// Try main first, fall back to master\n\t\t\tlet mainBranch = \"main\";\n\t\t\ttry {\n\t\t\t\texecSync(\"git rev-parse --verify main\", {\n\t\t\t\t\tcwd: this.repoRoot,\n\t\t\t\t\tencoding: \"utf-8\",\n\t\t\t\t\tstdio: \"pipe\",\n\t\t\t\t});\n\t\t\t} catch {\n\t\t\t\tmainBranch = \"master\";\n\t\t\t}\n\n\t\t\tconst output = execSync(\n\t\t\t\t`git log --oneline \"${commitHash}..${mainBranch}\"`,\n\t\t\t\t{\n\t\t\t\t\tcwd: this.repoRoot,\n\t\t\t\t\tencoding: \"utf-8\",\n\t\t\t\t\tstdio: \"pipe\",\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn output.trim().length > 0;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n/**\n * Factory function to create a GitService instance.\n */\nexport function createGitService(repoRoot?: string): GitService {\n\tconst root = repoRoot ?? GitService.getRepoRoot();\n\treturn new GitService(root);\n}\n","import type { TaskFileOwnership, Task } from \"../types/index.js\";\n\nexport class ConflictService {\n\t/**\n\t * Check if two glob patterns could overlap.\n\t * Simple heuristic: check if one pattern is a prefix of another\n\t * after removing glob suffixes like **, *.\n\t */\n\tpatternsOverlap(pattern1: string, pattern2: string): boolean {\n\t\tconst normalize = (p: string): string =>\n\t\t\tp\n\t\t\t\t.replace(/\\*\\*\\/?/g, \"\")\n\t\t\t\t.replace(/\\*/g, \"\")\n\t\t\t\t.replace(/\\/+$/, \"\");\n\n\t\tconst base1 = normalize(pattern1);\n\t\tconst base2 = normalize(pattern2);\n\n\t\t// If either base is empty (e.g., \"**\"), it matches everything\n\t\tif (base1.length === 0 || base2.length === 0) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Check if one is a prefix of the other\n\t\treturn base1.startsWith(base2) || base2.startsWith(base1);\n\t}\n\n\t/**\n\t * Find potential conflicts between a task's file patterns and other in-progress tasks.\n\t * Only exclusive patterns cause conflicts.\n\t */\n\tfindConflicts(\n\t\ttaskPatterns: TaskFileOwnership[],\n\t\totherTasks: Array<{ task: Task; patterns: TaskFileOwnership[] }>,\n\t): Array<{\n\t\ttask: Task;\n\t\tconflicting_pattern: string;\n\t\townership_type: string;\n\t}> {\n\t\tconst conflicts: Array<{\n\t\t\ttask: Task;\n\t\t\tconflicting_pattern: string;\n\t\t\townership_type: string;\n\t\t}> = [];\n\n\t\tfor (const myOwnership of taskPatterns) {\n\t\t\tfor (const other of otherTasks) {\n\t\t\t\tfor (const otherOwnership of other.patterns) {\n\t\t\t\t\t// Conflict if either side claims exclusive ownership on overlapping patterns\n\t\t\t\t\tif (\n\t\t\t\t\t\t(myOwnership.ownership_type === \"exclusive\" ||\n\t\t\t\t\t\t\totherOwnership.ownership_type === \"exclusive\") &&\n\t\t\t\t\t\tthis.patternsOverlap(\n\t\t\t\t\t\t\tmyOwnership.file_pattern,\n\t\t\t\t\t\t\totherOwnership.file_pattern,\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\tconflicts.push({\n\t\t\t\t\t\t\ttask: other.task,\n\t\t\t\t\t\t\tconflicting_pattern: otherOwnership.file_pattern,\n\t\t\t\t\t\t\townership_type: otherOwnership.ownership_type,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn conflicts;\n\t}\n\n\t/**\n\t * Check if a specific file matches any of the given patterns.\n\t * Uses simple string matching: startsWith for directory patterns (ending with ** or *).\n\t */\n\tfileMatchesPatterns(filePath: string, patterns: string[]): boolean {\n\t\tfor (const pattern of patterns) {\n\t\t\t// Remove trailing glob suffixes to get directory prefix\n\t\t\tconst base = pattern.replace(/\\*\\*\\/?$/, \"\").replace(/\\*$/, \"\");\n\n\t\t\tif (base.length === 0) {\n\t\t\t\t// Pattern like \"**\" matches everything\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (filePath.startsWith(base)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// Exact match\n\t\t\tif (filePath === pattern) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Check changed files against other tasks' exclusive patterns.\n\t * Returns warning messages for any files that conflict.\n\t */\n\tcheckFileConflicts(\n\t\tchangedFiles: string[],\n\t\totherTasks: Array<{ task: Task; patterns: TaskFileOwnership[] }>,\n\t): string[] {\n\t\tconst warnings: string[] = [];\n\n\t\tfor (const file of changedFiles) {\n\t\t\tfor (const other of otherTasks) {\n\t\t\t\tconst exclusivePatterns = other.patterns\n\t\t\t\t\t.filter((p) => p.ownership_type === \"exclusive\")\n\t\t\t\t\t.map((p) => p.file_pattern);\n\n\t\t\t\tif (this.fileMatchesPatterns(file, exclusivePatterns)) {\n\t\t\t\t\twarnings.push(\n\t\t\t\t\t\t`File \"${file}\" conflicts with task #${other.task.sequence} \"${other.task.title}\" which has exclusive ownership`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn warnings;\n\t}\n}\n\n// Export singleton instance\nexport const conflictService = new ConflictService();\n","import Database from \"better-sqlite3\";\nimport { TaskQueries } from \"../db/queries.js\";\nimport { DagService, dagService } from \"./dag-service.js\";\nimport { GitService, createGitService } from \"./git-service.js\";\nimport { ConflictService, conflictService } from \"./conflict-service.js\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport slugify from \"slugify\";\nimport { resolve } from \"node:path\";\nimport type {\n\tTask,\n\tCreateTasksInput,\n\tCreateTasksOutput,\n\tListTasksInput,\n\tListTasksOutput,\n\tGetTaskInput,\n\tGetTaskOutput,\n\tClaimTaskInput,\n\tClaimTaskOutput,\n\tStartTaskInput,\n\tStartTaskOutput,\n\tUpdateProgressInput,\n\tUpdateProgressOutput,\n\tCompleteTaskInput,\n\tCompleteTaskOutput,\n\tMergeTaskInput,\n\tMergeTaskOutput,\n\tCleanupTaskInput,\n\tCleanupTaskOutput,\n} from \"../types/index.js\";\n\ntype DB = InstanceType<typeof Database>;\n\nexport class TaskService {\n\tprivate queries: TaskQueries;\n\tprivate dagService: DagService;\n\tprivate gitService: GitService;\n\tprivate conflictService: ConflictService;\n\n\tconstructor(db: DB, gitRepoRoot?: string) {\n\t\tthis.queries = new TaskQueries(db);\n\t\tthis.dagService = dagService;\n\t\tthis.conflictService = conflictService;\n\n\t\t// Create git service - use provided root or try to detect it\n\t\tif (gitRepoRoot) {\n\t\t\tthis.gitService = new GitService(gitRepoRoot);\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tthis.gitService = createGitService();\n\t\t\t} catch {\n\t\t\t\t// If not in a git repo, create with cwd as fallback\n\t\t\t\tthis.gitService = new GitService(process.cwd());\n\t\t\t}\n\t\t}\n\t}\n\n\t// === Task Management ===\n\n\t/**\n\t * Create a task group with tasks, dependencies, and file ownership.\n\t */\n\tcreateTasks(input: CreateTasksInput): CreateTasksOutput {\n\t\tconst groupId = uuidv4();\n\t\tconst warnings: string[] = [];\n\n\t\t// 1. Create task group\n\t\tthis.queries.createGroup({\n\t\t\tid: groupId,\n\t\t\ttitle: input.group_title,\n\t\t\tdescription: input.group_description,\n\t\t\tstatus: \"active\",\n\t\t});\n\n\t\t// 2. Create all tasks with sequence numbers (1-based)\n\t\tconst sequenceToIdMap = new Map<number, string>();\n\t\tconst createdTasks: Task[] = [];\n\n\t\tfor (let i = 0; i < input.tasks.length; i++) {\n\t\t\tconst taskInput = input.tasks[i];\n\t\t\tconst sequence = i + 1;\n\t\t\tconst taskId = uuidv4();\n\t\t\tsequenceToIdMap.set(sequence, taskId);\n\n\t\t\tconst task = this.queries.createTask({\n\t\t\t\tid: taskId,\n\t\t\t\tgroup_id: groupId,\n\t\t\t\tsequence,\n\t\t\t\ttitle: taskInput.title,\n\t\t\t\tdescription: taskInput.description,\n\t\t\t\tstatus: \"pending\", // Will be updated after dependency analysis\n\t\t\t\tpriority: taskInput.priority ?? \"medium\",\n\t\t\t\tassigned_to: null,\n\t\t\t\tbranch_name: null,\n\t\t\t\tworktree_path: null,\n\t\t\t\tprogress: 0,\n\t\t\t\tprogress_note: null,\n\t\t\t});\n\n\t\t\tcreatedTasks.push(task);\n\t\t}\n\n\t\t// 3. Add dependencies (resolve sequence numbers to task IDs)\n\t\tconst dependencyMap = new Map<string, string[]>();\n\n\t\tfor (let i = 0; i < input.tasks.length; i++) {\n\t\t\tconst taskInput = input.tasks[i];\n\t\t\tconst sequence = i + 1;\n\t\t\tconst taskId = sequenceToIdMap.get(sequence)!;\n\t\t\tconst deps: string[] = [];\n\n\t\t\tif (taskInput.depends_on && taskInput.depends_on.length > 0) {\n\t\t\t\tfor (const depSequence of taskInput.depends_on) {\n\t\t\t\t\tconst depId = sequenceToIdMap.get(depSequence);\n\t\t\t\t\tif (depId) {\n\t\t\t\t\t\tthis.queries.addDependency(taskId, depId);\n\t\t\t\t\t\tdeps.push(depId);\n\t\t\t\t\t} else {\n\t\t\t\t\t\twarnings.push(\n\t\t\t\t\t\t\t`Task #${sequence} \"${taskInput.title}\" references invalid dependency sequence #${depSequence}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdependencyMap.set(taskId, deps);\n\t\t}\n\n\t\t// 4. Add file ownership\n\t\tfor (let i = 0; i < input.tasks.length; i++) {\n\t\t\tconst taskInput = input.tasks[i];\n\t\t\tconst sequence = i + 1;\n\t\t\tconst taskId = sequenceToIdMap.get(sequence)!;\n\n\t\t\tif (taskInput.file_patterns) {\n\t\t\t\tfor (const fp of taskInput.file_patterns) {\n\t\t\t\t\tthis.queries.addFileOwnership({\n\t\t\t\t\t\ttask_id: taskId,\n\t\t\t\t\t\tfile_pattern: fp.pattern,\n\t\t\t\t\t\townership_type: fp.ownership_type,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// 5. Validate DAG has no cycles\n\t\tconst validation = this.dagService.validateNoCycles(dependencyMap);\n\t\tif (!validation.valid) {\n\t\t\twarnings.push(\n\t\t\t\t`Dependency cycle detected: ${validation.cycle?.join(\" -> \")}`,\n\t\t\t);\n\t\t}\n\n\t\t// 6. Check for file ownership overlaps and generate warnings\n\t\tfor (let i = 0; i < input.tasks.length; i++) {\n\t\t\tconst taskInputI = input.tasks[i];\n\t\t\tconst seqI = i + 1;\n\t\t\tconst taskIdI = sequenceToIdMap.get(seqI)!;\n\n\t\t\tif (!taskInputI.file_patterns) continue;\n\n\t\t\tfor (let j = i + 1; j < input.tasks.length; j++) {\n\t\t\t\tconst taskInputJ = input.tasks[j];\n\t\t\t\tconst seqJ = j + 1;\n\n\t\t\t\tif (!taskInputJ.file_patterns) continue;\n\n\t\t\t\tfor (const fpI of taskInputI.file_patterns) {\n\t\t\t\t\tfor (const fpJ of taskInputJ.file_patterns) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t(fpI.ownership_type === \"exclusive\" ||\n\t\t\t\t\t\t\t\tfpJ.ownership_type === \"exclusive\") &&\n\t\t\t\t\t\t\tthis.conflictService.patternsOverlap(fpI.pattern, fpJ.pattern)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\twarnings.push(\n\t\t\t\t\t\t\t\t`File pattern overlap: task #${seqI} \"${taskInputI.title}\" (${fpI.pattern}) and task #${seqJ} \"${taskInputJ.title}\" (${fpJ.pattern})`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// 7. Set initial status: 'pending' if no deps, 'blocked' if has unmet deps\n\t\tconst completedTasks = new Set<string>(); // None completed yet\n\t\tconst outputTasks: CreateTasksOutput[\"tasks\"] = [];\n\n\t\tfor (let i = 0; i < createdTasks.length; i++) {\n\t\t\tconst sequence = i + 1;\n\t\t\tconst taskId = sequenceToIdMap.get(sequence)!;\n\t\t\tconst deps = dependencyMap.get(taskId) ?? [];\n\t\t\tconst hasDeps = deps.length > 0;\n\n\t\t\tif (hasDeps) {\n\t\t\t\tthis.queries.updateTask(taskId, { status: \"blocked\" });\n\t\t\t}\n\n\t\t\tconst canStart = this.dagService.canStart(\n\t\t\t\ttaskId,\n\t\t\t\tdependencyMap,\n\t\t\t\tcompletedTasks,\n\t\t\t);\n\n\t\t\toutputTasks.push({\n\t\t\t\tid: taskId,\n\t\t\t\tsequence,\n\t\t\t\ttitle: createdTasks[i].title,\n\t\t\t\tstatus: hasDeps ? \"blocked\" : \"pending\",\n\t\t\t\tcan_start: canStart,\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tgroup_id: groupId,\n\t\t\ttasks: outputTasks,\n\t\t\twarnings,\n\t\t};\n\t}\n\n\t/**\n\t * List tasks with computed can_start and summary.\n\t */\n\tlistTasks(input: ListTasksInput): ListTasksOutput {\n\t\tconst tasks = this.queries.listTasks({\n\t\t\tgroup_id: input.group_id,\n\t\t\tstatus: input.status,\n\t\t});\n\n\t\t// Build dependency map and completed set for can_start computation\n\t\tconst dependencyMap = new Map<string, string[]>();\n\t\tconst completedTasks = new Set<string>();\n\n\t\tfor (const task of tasks) {\n\t\t\tconst deps = this.queries.getDependencies(task.id);\n\t\t\tdependencyMap.set(\n\t\t\t\ttask.id,\n\t\t\t\tdeps.map((d) => d.id),\n\t\t\t);\n\t\t\tif (task.status === \"completed\") {\n\t\t\t\tcompletedTasks.add(task.id);\n\t\t\t}\n\t\t}\n\n\t\tconst outputTasks: ListTasksOutput[\"tasks\"] = tasks.map((task) => {\n\t\t\tconst deps = this.queries.getDependencies(task.id);\n\t\t\tconst canStart =\n\t\t\t\ttask.status === \"pending\" &&\n\t\t\t\tthis.dagService.canStart(task.id, dependencyMap, completedTasks);\n\n\t\t\treturn {\n\t\t\t\tid: task.id,\n\t\t\t\tsequence: task.sequence,\n\t\t\t\ttitle: task.title,\n\t\t\t\tstatus: task.status,\n\t\t\t\tprogress: task.progress,\n\t\t\t\tprogress_note: task.progress_note,\n\t\t\t\tassigned_to: task.assigned_to,\n\t\t\t\tbranch_name: task.branch_name,\n\t\t\t\tworktree_path: task.worktree_path,\n\t\t\t\tdependencies: deps.map((d) => ({\n\t\t\t\t\tsequence: d.sequence,\n\t\t\t\t\ttitle: d.title,\n\t\t\t\t\tstatus: d.status,\n\t\t\t\t})),\n\t\t\t\tcan_start: canStart,\n\t\t\t};\n\t\t});\n\n\t\t// Build summary\n\t\tconst summary = {\n\t\t\ttotal: tasks.length,\n\t\t\tpending: tasks.filter((t) => t.status === \"pending\").length,\n\t\t\tin_progress: tasks.filter((t) => t.status === \"in_progress\").length,\n\t\t\tin_review: tasks.filter((t) => t.status === \"in_review\").length,\n\t\t\tcompleted: tasks.filter((t) => t.status === \"completed\").length,\n\t\t\tblocked: tasks.filter((t) => t.status === \"blocked\").length,\n\t\t};\n\n\t\treturn { tasks: outputTasks, summary };\n\t}\n\n\t/**\n\t * Get a task with all related data.\n\t */\n\tgetTask(input: GetTaskInput): GetTaskOutput {\n\t\tconst task = this.queries.getTask(input.task_id);\n\t\tif (!task) {\n\t\t\tthrow new Error(`Task not found: ${input.task_id}`);\n\t\t}\n\n\t\tconst deps = this.queries.getDependencies(task.id);\n\t\tconst fileOwnership = this.queries.getFileOwnership(task.id);\n\t\tconst progressLogs = this.queries.getProgressLogs(task.id);\n\n\t\treturn {\n\t\t\ttask,\n\t\t\tdependencies: deps.map((d) => ({\n\t\t\t\tsequence: d.sequence,\n\t\t\t\ttitle: d.title,\n\t\t\t\tstatus: d.status,\n\t\t\t})),\n\t\t\tfile_ownership: fileOwnership,\n\t\t\tprogress_logs: progressLogs,\n\t\t};\n\t}\n\n\t// === Agent Workflow ===\n\n\t/**\n\t * Claim a task for an agent. Uses a transaction for atomicity.\n\t */\n\tclaimTask(input: ClaimTaskInput): ClaimTaskOutput {\n\t\tconst task = this.queries.getTask(input.task_id);\n\t\tif (!task) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\ttask: null as unknown as Task,\n\t\t\t\terror: `Task not found: ${input.task_id}`,\n\t\t\t};\n\t\t}\n\n\t\t// 1. Verify task is 'pending'\n\t\tif (task.status !== \"pending\") {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\ttask,\n\t\t\t\terror: `Task is not pending (current status: ${task.status})`,\n\t\t\t};\n\t\t}\n\n\t\t// 2. Check all dependencies are 'completed'\n\t\tconst deps = this.queries.getDependencies(task.id);\n\t\tconst unmetDeps = deps.filter((d) => d.status !== \"completed\");\n\t\tif (unmetDeps.length > 0) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\ttask,\n\t\t\t\terror: `Unmet dependencies: ${unmetDeps.map((d) => `#${d.sequence} \"${d.title}\" (${d.status})`).join(\", \")}`,\n\t\t\t};\n\t\t}\n\n\t\t// 3. Check file ownership conflicts with in_progress tasks\n\t\tconst conflicts = this.queries.getFileOwnershipConflicts(task.id);\n\t\tif (conflicts.length > 0) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\ttask,\n\t\t\t\terror: `File ownership conflicts with in-progress tasks: ${conflicts.map((c) => `#${c.task.sequence} \"${c.task.title}\" on pattern \"${c.pattern}\"`).join(\", \")}`,\n\t\t\t};\n\t\t}\n\n\t\t// 4. Update status to 'assigned', set assigned_to (use transaction)\n\t\tconst agentId = input.agent_id ?? `agent-${uuidv4().slice(0, 8)}`;\n\n\t\tconst updatedTask = this.queries.updateTask(task.id, {\n\t\t\tstatus: \"assigned\",\n\t\t\tassigned_to: agentId,\n\t\t});\n\n\t\t// 5. Log 'claimed' event\n\t\tthis.queries.addProgressLog({\n\t\t\tid: uuidv4(),\n\t\t\ttask_id: task.id,\n\t\t\tevent: \"claimed\",\n\t\t\tmessage: `Task claimed by ${agentId}`,\n\t\t\tmetadata: { agent_id: agentId },\n\t\t});\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\ttask: updatedTask,\n\t\t};\n\t}\n\n\t/**\n\t * Start a task: create git worktree, update task state.\n\t */\n\tstartTask(input: StartTaskInput): StartTaskOutput {\n\t\tconst task = this.queries.getTask(input.task_id);\n\t\tif (!task) {\n\t\t\tthrow new Error(`Task not found: ${input.task_id}`);\n\t\t}\n\n\t\t// 1. Verify task is 'assigned'\n\t\tif (task.status !== \"assigned\") {\n\t\t\tthrow new Error(\n\t\t\t\t`Task must be 'assigned' to start (current status: ${task.status})`,\n\t\t\t);\n\t\t}\n\n\t\t// 2. Generate branch name: task/task-{sequence}-{slugified-title}\n\t\tconst slugifiedTitle = slugify(task.title, {\n\t\t\tlower: true,\n\t\t\tstrict: true,\n\t\t}).slice(0, 30);\n\t\tconst branchName = `task/task-${task.sequence}-${slugifiedTitle}`;\n\n\t\t// 3. Generate worktree path: .worktrees/task-{sequence}-{slugified-title}\n\t\tconst worktreePath = resolve(\n\t\t\tthis.gitService[\"repoRoot\"],\n\t\t\t\".worktrees\",\n\t\t\t`task-${task.sequence}-${slugifiedTitle}`,\n\t\t);\n\n\t\t// 4. Create git worktree\n\t\tthis.gitService.createWorktree(worktreePath, branchName);\n\n\t\t// 5. Update task with branch_name, worktree_path, started_at, status='in_progress'\n\t\tconst now = new Date().toISOString();\n\t\tconst updatedTask = this.queries.updateTask(task.id, {\n\t\t\tstatus: \"in_progress\",\n\t\t\tbranch_name: branchName,\n\t\t\tworktree_path: worktreePath,\n\t\t\tstarted_at: now,\n\t\t});\n\n\t\t// 6. Log 'started' event\n\t\tthis.queries.addProgressLog({\n\t\t\tid: uuidv4(),\n\t\t\ttask_id: task.id,\n\t\t\tevent: \"started\",\n\t\t\tmessage: `Task started with branch ${branchName}`,\n\t\t\tmetadata: {\n\t\t\t\tbranch_name: branchName,\n\t\t\t\tworktree_path: worktreePath,\n\t\t\t},\n\t\t});\n\n\t\t// 7. Return task context\n\t\tconst deps = this.queries.getDependencies(task.id);\n\t\tconst fileOwnership = this.queries.getFileOwnership(task.id);\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tworktree_path: worktreePath,\n\t\t\tbranch_name: branchName,\n\t\t\ttask: updatedTask,\n\t\t\tcontext: {\n\t\t\t\tdescription: task.description,\n\t\t\t\tfile_patterns: fileOwnership.map((fo) => fo.file_pattern),\n\t\t\t\tdependencies_completed: deps\n\t\t\t\t\t.filter((d) => d.status === \"completed\")\n\t\t\t\t\t.map((d) => ({\n\t\t\t\t\t\ttitle: d.title,\n\t\t\t\t\t\tbranch_name: d.branch_name ?? \"\",\n\t\t\t\t\t})),\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Update progress on a task.\n\t */\n\tupdateProgress(input: UpdateProgressInput): UpdateProgressOutput {\n\t\tconst task = this.queries.getTask(input.task_id);\n\t\tif (!task) {\n\t\t\tthrow new Error(`Task not found: ${input.task_id}`);\n\t\t}\n\n\t\t// 1. Update progress and progress_note\n\t\tthis.queries.updateTask(task.id, {\n\t\t\tprogress: input.progress,\n\t\t\tprogress_note: input.note,\n\t\t});\n\n\t\t// 2. Check files_changed against other tasks' file ownership\n\t\tlet conflictWarnings: string[] = [];\n\t\tif (input.files_changed && input.files_changed.length > 0) {\n\t\t\t// Get all in-progress tasks except this one\n\t\t\tconst allTasks = this.queries.listTasks({\n\t\t\t\tgroup_id: task.group_id,\n\t\t\t\tstatus: [\"in_progress\"],\n\t\t\t});\n\t\t\tconst otherTasks = allTasks\n\t\t\t\t.filter((t) => t.id !== task.id)\n\t\t\t\t.map((t) => ({\n\t\t\t\t\ttask: t,\n\t\t\t\t\tpatterns: this.queries.getFileOwnership(t.id),\n\t\t\t\t}));\n\n\t\t\tconflictWarnings = this.conflictService.checkFileConflicts(\n\t\t\t\tinput.files_changed,\n\t\t\t\totherTasks,\n\t\t\t);\n\t\t}\n\n\t\t// 3. Check if main has new commits (rebase recommendation)\n\t\tlet rebaseRecommended = false;\n\t\tif (task.branch_name) {\n\t\t\ttry {\n\t\t\t\tconst mainCommit = this.gitService.getLatestCommit(\"HEAD\");\n\t\t\t\trebaseRecommended = this.gitService.hasNewCommitsSince(mainCommit);\n\t\t\t} catch {\n\t\t\t\t// Ignore git errors for rebase check\n\t\t\t}\n\t\t}\n\n\t\t// 4. Log 'progress_update' event\n\t\tthis.queries.addProgressLog({\n\t\t\tid: uuidv4(),\n\t\t\ttask_id: task.id,\n\t\t\tevent: \"progress_update\",\n\t\t\tmessage: input.note,\n\t\t\tmetadata: {\n\t\t\t\tprogress: input.progress,\n\t\t\t\tfiles_changed: input.files_changed ?? [],\n\t\t\t\tconflict_warnings: conflictWarnings,\n\t\t\t},\n\t\t});\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tconflict_warnings: conflictWarnings,\n\t\t\trebase_recommended: rebaseRecommended,\n\t\t};\n\t}\n\n\t/**\n\t * Mark a task as complete and find unlocked downstream tasks.\n\t */\n\tcompleteTask(input: CompleteTaskInput): CompleteTaskOutput {\n\t\tconst task = this.queries.getTask(input.task_id);\n\t\tif (!task) {\n\t\t\tthrow new Error(`Task not found: ${input.task_id}`);\n\t\t}\n\n\t\t// 1. Verify task is 'in_progress'\n\t\tif (task.status !== \"in_progress\") {\n\t\t\tthrow new Error(\n\t\t\t\t`Task must be 'in_progress' to complete (current status: ${task.status})`,\n\t\t\t);\n\t\t}\n\n\t\t// 2. Update status to 'in_review', set completed_at\n\t\tconst now = new Date().toISOString();\n\t\tconst updatedTask = this.queries.updateTask(task.id, {\n\t\t\tstatus: \"in_review\",\n\t\t\tcompleted_at: now,\n\t\t\tprogress: 100,\n\t\t\tprogress_note: input.summary,\n\t\t});\n\n\t\t// 3. Find unlocked downstream tasks\n\t\tconst allGroupTasks = this.queries.listTasks({ group_id: task.group_id });\n\t\tconst completedTasks = new Set(\n\t\t\tallGroupTasks\n\t\t\t\t.filter((t) => t.status === \"completed\" || t.status === \"in_review\")\n\t\t\t\t.map((t) => t.id),\n\t\t);\n\t\t// Include the current task as effectively completed\n\t\tcompletedTasks.add(task.id);\n\n\t\tconst dependencyMap = new Map<string, string[]>();\n\t\tfor (const t of allGroupTasks) {\n\t\t\tconst deps = this.queries.getDependencies(t.id);\n\t\t\tdependencyMap.set(\n\t\t\t\tt.id,\n\t\t\t\tdeps.map((d) => d.id),\n\t\t\t);\n\t\t}\n\n\t\tconst unlockedIds = this.dagService.getUnlockedTasks(\n\t\t\ttask.id,\n\t\t\tdependencyMap,\n\t\t\tcompletedTasks,\n\t\t);\n\n\t\tconst unlockedTasks = unlockedIds\n\t\t\t.map((id) => allGroupTasks.find((t) => t.id === id))\n\t\t\t.filter((t): t is Task => t !== undefined)\n\t\t\t.map((t) => ({\n\t\t\t\tsequence: t.sequence,\n\t\t\t\ttitle: t.title,\n\t\t\t}));\n\n\t\t// Update unlocked tasks from 'blocked' to 'pending'\n\t\tfor (const id of unlockedIds) {\n\t\t\tconst t = allGroupTasks.find((at) => at.id === id);\n\t\t\tif (t && t.status === \"blocked\") {\n\t\t\t\tthis.queries.updateTask(id, { status: \"pending\" });\n\t\t\t}\n\t\t}\n\n\t\t// 4. Log 'completed' event\n\t\tthis.queries.addProgressLog({\n\t\t\tid: uuidv4(),\n\t\t\ttask_id: task.id,\n\t\t\tevent: \"completed\",\n\t\t\tmessage: input.summary,\n\t\t\tmetadata: {\n\t\t\t\tfiles_changed: input.files_changed,\n\t\t\t\tunlocked_tasks: unlockedTasks,\n\t\t\t},\n\t\t});\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\ttask: updatedTask,\n\t\t\tunlocked_tasks: unlockedTasks,\n\t\t};\n\t}\n\n\t// === Integration ===\n\n\t/**\n\t * Merge a task's branch into the main branch.\n\t */\n\tmergeTask(input: MergeTaskInput): MergeTaskOutput {\n\t\t// 1. Verify on main branch\n\t\tif (!this.gitService.isOnMainBranch()) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Must be on main/master branch to merge. Current branch: \" +\n\t\t\t\t\tthis.gitService.getCurrentBranch(),\n\t\t\t);\n\t\t}\n\n\t\tconst task = this.queries.getTask(input.task_id);\n\t\tif (!task) {\n\t\t\tthrow new Error(`Task not found: ${input.task_id}`);\n\t\t}\n\n\t\t// 2. Verify task is 'in_review'\n\t\tif (task.status !== \"in_review\") {\n\t\t\tthrow new Error(\n\t\t\t\t`Task must be 'in_review' to merge (current status: ${task.status})`,\n\t\t\t);\n\t\t}\n\n\t\tif (!task.branch_name) {\n\t\t\tthrow new Error(\"Task has no branch to merge\");\n\t\t}\n\n\t\tconst strategy = input.strategy ?? \"squash\";\n\n\t\t// 3. Attempt merge\n\t\tconst mergeResult = this.gitService.mergeBranch(task.branch_name, strategy);\n\n\t\tif (mergeResult.success) {\n\t\t\t// 4. If success: update status to 'completed', set merged_at\n\t\t\tconst now = new Date().toISOString();\n\t\t\tthis.queries.updateTask(task.id, {\n\t\t\t\tstatus: \"completed\",\n\t\t\t\tmerged_at: now,\n\t\t\t});\n\n\t\t\t// Cleanup worktree and branch\n\t\t\tif (task.worktree_path) {\n\t\t\t\ttry {\n\t\t\t\t\tif (this.gitService.worktreeExists(task.worktree_path)) {\n\t\t\t\t\t\tthis.gitService.removeWorktree(task.worktree_path);\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Best-effort cleanup\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.gitService.deleteBranch(task.branch_name);\n\t\t\t} catch {\n\t\t\t\t// Best-effort cleanup\n\t\t\t}\n\n\t\t\t// Find unlocked tasks\n\t\t\tconst allGroupTasks = this.queries.listTasks({\n\t\t\t\tgroup_id: task.group_id,\n\t\t\t});\n\t\t\tconst completedTasks = new Set(\n\t\t\t\tallGroupTasks.filter((t) => t.status === \"completed\").map((t) => t.id),\n\t\t\t);\n\n\t\t\tconst dependencyMap = new Map<string, string[]>();\n\t\t\tfor (const t of allGroupTasks) {\n\t\t\t\tconst deps = this.queries.getDependencies(t.id);\n\t\t\t\tdependencyMap.set(\n\t\t\t\t\tt.id,\n\t\t\t\t\tdeps.map((d) => d.id),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst unlockedIds = this.dagService.getUnlockedTasks(\n\t\t\t\ttask.id,\n\t\t\t\tdependencyMap,\n\t\t\t\tcompletedTasks,\n\t\t\t);\n\n\t\t\tconst unlockedTasks = unlockedIds\n\t\t\t\t.map((id) => allGroupTasks.find((t) => t.id === id))\n\t\t\t\t.filter((t): t is Task => t !== undefined)\n\t\t\t\t.map((t) => {\n\t\t\t\t\tconst canStart = this.dagService.canStart(\n\t\t\t\t\t\tt.id,\n\t\t\t\t\t\tdependencyMap,\n\t\t\t\t\t\tcompletedTasks,\n\t\t\t\t\t);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsequence: t.sequence,\n\t\t\t\t\t\ttitle: t.title,\n\t\t\t\t\t\tcan_start: canStart,\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t// Update unlocked tasks from 'blocked' to 'pending'\n\t\t\tfor (const id of unlockedIds) {\n\t\t\t\tconst t = allGroupTasks.find((at) => at.id === id);\n\t\t\t\tif (t && t.status === \"blocked\") {\n\t\t\t\t\tthis.queries.updateTask(id, { status: \"pending\" });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 6. Log 'merged' event\n\t\t\tthis.queries.addProgressLog({\n\t\t\t\tid: uuidv4(),\n\t\t\t\ttask_id: task.id,\n\t\t\t\tevent: \"merged\",\n\t\t\t\tmessage: `Task merged via ${strategy} strategy`,\n\t\t\t\tmetadata: {\n\t\t\t\t\tstrategy,\n\t\t\t\t\tunlocked_tasks: unlockedTasks,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tmerge_result: \"clean\",\n\t\t\t\tunlocked_tasks: unlockedTasks,\n\t\t\t};\n\t\t} else {\n\t\t\t// 5. If conflict: return conflict details\n\t\t\tconst conflicts = mergeResult.conflicts.map((file) => ({\n\t\t\t\tfile,\n\t\t\t\tdescription: `Merge conflict in ${file}`,\n\t\t\t\tauto_resolvable: false,\n\t\t\t\tsuggestion: `Manually resolve conflicts in ${file} and commit the result`,\n\t\t\t}));\n\n\t\t\t// Log conflict event\n\t\t\tthis.queries.addProgressLog({\n\t\t\t\tid: uuidv4(),\n\t\t\t\ttask_id: task.id,\n\t\t\t\tevent: \"conflict_detected\",\n\t\t\t\tmessage: `Merge conflicts detected in ${mergeResult.conflicts.length} file(s)`,\n\t\t\t\tmetadata: {\n\t\t\t\t\tconflicted_files: mergeResult.conflicts,\n\t\t\t\t\tstrategy,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tmerge_result: \"conflict\",\n\t\t\t\tconflicts,\n\t\t\t\tunlocked_tasks: [],\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Clean up a task: remove worktree, delete branch, mark as failed.\n\t */\n\tcleanupTask(input: CleanupTaskInput): CleanupTaskOutput {\n\t\tconst task = this.queries.getTask(input.task_id);\n\t\tif (!task) {\n\t\t\tthrow new Error(`Task not found: ${input.task_id}`);\n\t\t}\n\n\t\tlet worktreeRemoved = false;\n\t\tlet branchRemoved = false;\n\n\t\t// 1. Remove worktree if exists\n\t\tif (task.worktree_path) {\n\t\t\ttry {\n\t\t\t\tif (this.gitService.worktreeExists(task.worktree_path)) {\n\t\t\t\t\tthis.gitService.removeWorktree(task.worktree_path);\n\t\t\t\t\tworktreeRemoved = true;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Best-effort cleanup\n\t\t\t}\n\t\t}\n\n\t\t// 2. Delete branch if exists\n\t\tif (task.branch_name) {\n\t\t\ttry {\n\t\t\t\tthis.gitService.deleteBranch(task.branch_name);\n\t\t\t\tbranchRemoved = true;\n\t\t\t} catch {\n\t\t\t\t// Best-effort cleanup - branch might not exist\n\t\t\t}\n\t\t}\n\n\t\t// 3. Update status to 'failed'\n\t\tthis.queries.updateTask(task.id, {\n\t\t\tstatus: \"failed\",\n\t\t});\n\n\t\t// 4. Log 'failed' event\n\t\tthis.queries.addProgressLog({\n\t\t\tid: uuidv4(),\n\t\t\ttask_id: task.id,\n\t\t\tevent: \"failed\",\n\t\t\tmessage: input.reason ?? \"Task cleaned up and marked as failed\",\n\t\t\tmetadata: {\n\t\t\t\treason: input.reason,\n\t\t\t\tworktree_removed: worktreeRemoved,\n\t\t\t\tbranch_removed: branchRemoved,\n\t\t\t},\n\t\t});\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tcleaned: {\n\t\t\t\tworktree_removed: worktreeRemoved,\n\t\t\t\tbranch_removed: branchRemoved,\n\t\t\t},\n\t\t};\n\t}\n}\n"],"mappings":";;;;AAAA,SAAS,4BAA4B;;;ACArC,SAAS,iBAAiB;AAC1B,SAAS,SAAS;;;ACDlB,OAAO,cAAc;AACrB,SAAS,iBAAiB;AAC1B,SAAS,SAAS,eAAe;;;ACE1B,SAAS,iBAAiB,IAAc;AAC9C,KAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAuDN;AACH;;;ADtDA,IAAM,YAAY,oBAAI,IAAgB;AAEtC,SAAS,qBAA6B;AACrC,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,SAAS;AACZ,WAAO,QAAQ,OAAO;AAAA,EACvB;AACA,SAAO,QAAQ,QAAQ,IAAI,GAAG,UAAU,UAAU;AACnD;AAEO,SAAS,MAAM,QAAqB;AAC1C,QAAM,eAAe,SAAS,QAAQ,MAAM,IAAI,mBAAmB;AAEnE,QAAM,SAAS,UAAU,IAAI,YAAY;AACzC,MAAI,QAAQ;AACX,WAAO;AAAA,EACR;AAGA,YAAU,QAAQ,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AAEpD,QAAM,KAAK,IAAI,SAAS,YAAY;AACpC,KAAG,OAAO,oBAAoB;AAC9B,KAAG,OAAO,mBAAmB;AAE7B,mBAAiB,EAAE;AAEnB,YAAU,IAAI,cAAc,EAAE;AAC9B,SAAO;AACR;;;AE1BO,IAAM,cAAN,MAAkB;AAAA,EAChB;AAAA,EAER,YAAY,IAAQ;AACnB,SAAK,KAAK;AAAA,EACX;AAAA;AAAA,EAIA,YAAY,OAAiD;AAC5D,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA,KAG1B;AACH,SAAK,IAAI,KAAK;AACd,WAAO,KAAK,SAAS,MAAM,EAAE;AAAA,EAC9B;AAAA,EAEA,SAAS,IAAmC;AAC3C,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA,KAG1B;AACH,WAAO,KAAK,IAAI,EAAE;AAAA,EACnB;AAAA;AAAA,EAIA,WACC,MAIO;AACP,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,KAK1B;AACH,SAAK,IAAI;AAAA,MACR,IAAI,KAAK;AAAA,MACT,UAAU,KAAK;AAAA,MACf,UAAU,KAAK;AAAA,MACf,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK;AAAA,MACf,aAAa,KAAK,eAAe;AAAA,MACjC,aAAa,KAAK,eAAe;AAAA,MACjC,eAAe,KAAK,iBAAiB;AAAA,MACrC,UAAU,KAAK;AAAA,MACf,eAAe,KAAK,iBAAiB;AAAA,IACtC,CAAC;AACD,WAAO,KAAK,QAAQ,KAAK,EAAE;AAAA,EAC5B;AAAA,EAEA,QAAQ,IAA8B;AACrC,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,KAK1B;AACH,WAAO,KAAK,IAAI,EAAE;AAAA,EACnB;AAAA,EAEA,0BACC,SACA,UACmB;AACnB,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,KAK1B;AACH,WAAO,KAAK,IAAI,SAAS,QAAQ;AAAA,EAClC;AAAA,EAEA,UAAU,MAAyD;AAClE,QAAI,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAMV,UAAM,aAAuB,CAAC;AAC9B,UAAM,SAAoB,CAAC;AAE3B,QAAI,MAAM,UAAU;AACnB,iBAAW,KAAK,cAAc;AAC9B,aAAO,KAAK,KAAK,QAAQ;AAAA,IAC1B;AAEA,QAAI,MAAM,UAAU,KAAK,OAAO,SAAS,GAAG;AAC3C,YAAM,eAAe,KAAK,OAAO,IAAI,MAAM,GAAG,EAAE,KAAK,IAAI;AACzD,iBAAW,KAAK,cAAc,YAAY,GAAG;AAC7C,aAAO,KAAK,GAAG,KAAK,MAAM;AAAA,IAC3B;AAEA,QAAI,WAAW,SAAS,GAAG;AAC1B,aAAO,YAAY,WAAW,KAAK,OAAO;AAAA,IAC3C;AAEA,WAAO;AAEP,UAAM,OAAO,KAAK,GAAG,QAAQ,GAAG;AAChC,WAAO,KAAK,IAAI,GAAG,MAAM;AAAA,EAC1B;AAAA,EAEA,WACC,IACA,SAcO;AACP,UAAM,OAAO,OAAO,KAAK,OAAO,EAAE;AAAA,MACjC,CAAC,MAAO,QAAoC,CAAC,MAAM;AAAA,IACpD;AAEA,QAAI,KAAK,WAAW,GAAG;AACtB,aAAO,KAAK,QAAQ,EAAE;AAAA,IACvB;AAEA,UAAM,aAAa,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,IAAI;AAC5D,UAAM,MAAM,oBAAoB,UAAU;AAC1C,UAAM,OAAO,KAAK,GAAG,QAAQ,GAAG;AAChC,SAAK,IAAI,EAAE,IAAI,GAAG,QAAQ,CAAC;AAC3B,WAAO,KAAK,QAAQ,EAAE;AAAA,EACvB;AAAA;AAAA,EAIA,cAAc,QAAgB,WAAyB;AACtD,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA,KAG1B;AACH,SAAK,IAAI,QAAQ,SAAS;AAAA,EAC3B;AAAA,EAEA,gBAAgB,QAAwB;AACvC,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAS1B;AACH,WAAO,KAAK,IAAI,MAAM;AAAA,EACvB;AAAA,EAEA,cAAc,QAAwB;AACrC,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAS1B;AACH,WAAO,KAAK,IAAI,MAAM;AAAA,EACvB;AAAA;AAAA,EAIA,iBAAiB,WAAoC;AACpD,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA,KAG1B;AACH,SAAK,IAAI,SAAS;AAAA,EACnB;AAAA,EAEA,iBAAiB,QAAqC;AACrD,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA,KAG1B;AACH,WAAO,KAAK,IAAI,MAAM;AAAA,EACvB;AAAA,EAEA,0BACC,QACiE;AAIjE,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAa1B;AAEH,UAAM,OAAO,KAAK,IAAI,QAAQ,MAAM;AAIpC,WAAO,KAAK,IAAI,CAAC,QAAQ;AACxB,YAAM,EAAE,SAAS,gBAAgB,GAAG,WAAW,IAAI;AACnD,aAAO;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACD;AAAA,IACD,CAAC;AAAA,EACF;AAAA;AAAA,EAIA,eAAe,KAAkD;AAChE,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA,KAG1B;AACH,SAAK,IAAI;AAAA,MACR,IAAI,IAAI;AAAA,MACR,SAAS,IAAI;AAAA,MACb,OAAO,IAAI;AAAA,MACX,SAAS,IAAI;AAAA,MACb,UAAU,IAAI,WAAW,KAAK,UAAU,IAAI,QAAQ,IAAI;AAAA,IACzD,CAAC;AACD,WAAO,KAAK,eAAe,IAAI,EAAE;AAAA,EAClC;AAAA,EAEA,gBAAgB,QAA+B;AAC9C,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA,KAI1B;AACH,UAAM,OAAO,KAAK,IAAI,MAAM;AAG5B,WAAO,KAAK,IAAI,CAAC,SAAS;AAAA,MACzB,GAAG;AAAA,MACH,UAAU,IAAI,WAAW,KAAK,MAAM,IAAI,QAAQ,IAAI;AAAA,IACrD,EAAE;AAAA,EACH;AAAA;AAAA,EAIQ,eAAe,IAAqC;AAC3D,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA,KAG1B;AACH,UAAM,MAAM,KAAK,IAAI,EAAE;AAGvB,QAAI,CAAC,IAAK,QAAO;AACjB,WAAO;AAAA,MACN,GAAG;AAAA,MACH,UAAU,IAAI,WAAW,KAAK,MAAM,IAAI,QAAQ,IAAI;AAAA,IACrD;AAAA,EACD;AACD;;;ACpSO,IAAM,aAAN,MAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKvB,iBAAiB,cAGf;AACD,UAAM,QAAQ;AACd,UAAM,OAAO;AACb,UAAM,QAAQ;AAEd,UAAM,QAAQ,oBAAI,IAAoB;AAGtC,eAAW,CAAC,MAAM,IAAI,KAAK,cAAc;AACxC,YAAM,IAAI,MAAM,KAAK;AACrB,iBAAW,OAAO,MAAM;AACvB,YAAI,CAAC,MAAM,IAAI,GAAG,GAAG;AACpB,gBAAM,IAAI,KAAK,KAAK;AAAA,QACrB;AAAA,MACD;AAAA,IACD;AAEA,UAAM,SAAS,oBAAI,IAA2B;AAE9C,UAAM,MAAM,CAAC,SAAkC;AAC9C,YAAM,IAAI,MAAM,IAAI;AAEpB,YAAM,YAAY,aAAa,IAAI,IAAI,KAAK,CAAC;AAC7C,iBAAW,YAAY,WAAW;AACjC,cAAM,gBAAgB,MAAM,IAAI,QAAQ,KAAK;AAE7C,YAAI,kBAAkB,MAAM;AAE3B,gBAAM,QAAkB,CAAC,UAAU,IAAI;AACvC,cAAI,UAAU;AACd,iBACC,OAAO,IAAI,OAAO,MAAM,QACxB,OAAO,IAAI,OAAO,MAAM,UACvB;AACD,sBAAU,OAAO,IAAI,OAAO;AAC5B,kBAAM,KAAK,OAAO;AAAA,UACnB;AACA,gBAAM,QAAQ;AACd,iBAAO;AAAA,QACR;AAEA,YAAI,kBAAkB,OAAO;AAC5B,iBAAO,IAAI,UAAU,IAAI;AACzB,gBAAM,SAAS,IAAI,QAAQ;AAC3B,cAAI,OAAQ,QAAO;AAAA,QACpB;AAAA,MACD;AAEA,YAAM,IAAI,MAAM,KAAK;AACrB,aAAO;AAAA,IACR;AAEA,eAAW,QAAQ,MAAM,KAAK,GAAG;AAChC,UAAI,MAAM,IAAI,IAAI,MAAM,OAAO;AAC9B,eAAO,IAAI,MAAM,IAAI;AACrB,cAAM,QAAQ,IAAI,IAAI;AACtB,YAAI,OAAO;AACV,iBAAO,EAAE,OAAO,OAAO,MAAM;AAAA,QAC9B;AAAA,MACD;AAAA,IACD;AAEA,WAAO,EAAE,OAAO,KAAK;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,cAA+C;AAE9D,UAAM,WAAW,oBAAI,IAAoB;AACzC,UAAM,YAAY,oBAAI,IAAsB;AAG5C,eAAW,CAAC,MAAM,IAAI,KAAK,cAAc;AACxC,UAAI,CAAC,SAAS,IAAI,IAAI,GAAG;AACxB,iBAAS,IAAI,MAAM,CAAC;AAAA,MACrB;AACA,UAAI,CAAC,UAAU,IAAI,IAAI,GAAG;AACzB,kBAAU,IAAI,MAAM,CAAC,CAAC;AAAA,MACvB;AACA,iBAAW,OAAO,MAAM;AACvB,YAAI,CAAC,SAAS,IAAI,GAAG,GAAG;AACvB,mBAAS,IAAI,KAAK,CAAC;AAAA,QACpB;AACA,YAAI,CAAC,UAAU,IAAI,GAAG,GAAG;AACxB,oBAAU,IAAI,KAAK,CAAC,CAAC;AAAA,QACtB;AAAA,MACD;AAAA,IACD;AAIA,eAAW,CAAC,MAAM,IAAI,KAAK,cAAc;AACxC,eAAS,IAAI,OAAO,SAAS,IAAI,IAAI,KAAK,KAAK,KAAK,MAAM;AAC1D,iBAAW,OAAO,MAAM;AACvB,cAAM,MAAM,UAAU,IAAI,GAAG,KAAK,CAAC;AACnC,YAAI,KAAK,IAAI;AACb,kBAAU,IAAI,KAAK,GAAG;AAAA,MACvB;AAAA,IACD;AAGA,UAAM,QAAkB,CAAC;AACzB,eAAW,CAAC,MAAM,MAAM,KAAK,UAAU;AACtC,UAAI,WAAW,GAAG;AACjB,cAAM,KAAK,IAAI;AAAA,MAChB;AAAA,IACD;AAEA,UAAM,SAAmB,CAAC;AAE1B,WAAO,MAAM,SAAS,GAAG;AACxB,YAAM,OAAO,MAAM,MAAM;AACzB,aAAO,KAAK,IAAI;AAEhB,YAAM,YAAY,UAAU,IAAI,IAAI,KAAK,CAAC;AAC1C,iBAAW,YAAY,WAAW;AACjC,cAAM,aAAa,SAAS,IAAI,QAAQ,KAAK,KAAK;AAClD,iBAAS,IAAI,UAAU,SAAS;AAChC,YAAI,cAAc,GAAG;AACpB,gBAAM,KAAK,QAAQ;AAAA,QACpB;AAAA,MACD;AAAA,IACD;AAGA,QAAI,OAAO,WAAW,SAAS,MAAM;AACpC,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,SACC,QACA,cACA,gBACU;AACV,UAAM,OAAO,aAAa,IAAI,MAAM,KAAK,CAAC;AAC1C,WAAO,KAAK,MAAM,CAAC,QAAQ,eAAe,IAAI,GAAG,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBACC,iBACA,iBACA,gBACW;AAEX,UAAM,eAAe,IAAI,IAAI,cAAc;AAC3C,iBAAa,IAAI,eAAe;AAEhC,UAAM,WAAqB,CAAC;AAE5B,eAAW,CAAC,QAAQ,IAAI,KAAK,iBAAiB;AAE7C,UAAI,aAAa,IAAI,MAAM,EAAG;AAC9B,UAAI,CAAC,KAAK,SAAS,eAAe,EAAG;AAGrC,UAAI,KAAK,MAAM,CAAC,QAAQ,aAAa,IAAI,GAAG,CAAC,GAAG;AAC/C,iBAAS,KAAK,MAAM;AAAA,MACrB;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AACD;AAGO,IAAM,aAAa,IAAI,WAAW;;;AC3LzC,SAAS,gBAAgB;AAElB,IAAM,aAAN,MAAiB;AAAA,EACvB,YAAoB,UAAkB;AAAlB;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA,EAKvC,OAAO,cAAsB;AAC5B,QAAI;AACH,aAAO,SAAS,iCAAiC;AAAA,QAChD,UAAU;AAAA,QACV,OAAO;AAAA,MACR,CAAC,EAAE,KAAK;AAAA,IACT,SAAS,OAAO;AACf,YAAM,IAAI;AAAA,QACT,sCAAsC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC7F;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,cAAsB,YAA0B;AAC9D,QAAI;AACH,eAAS,qBAAqB,YAAY,SAAS,UAAU,KAAK;AAAA,QACjE,KAAK,KAAK;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,MACR,CAAC;AAAA,IACF,SAAS,OAAO;AACf,YAAM,IAAI;AAAA,QACT,gCAAgC,YAAY,gBAAgB,UAAU,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAClI;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,cAA4B;AAC1C,QAAI;AACH,eAAS,wBAAwB,YAAY,aAAa;AAAA,QACzD,KAAK,KAAK;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,MACR,CAAC;AAAA,IACF,SAAS,OAAO;AACf,YAAM,IAAI;AAAA,QACT,gCAAgC,YAAY,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACxG;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,YAA0B;AACtC,QAAI;AACH,eAAS,kBAAkB,UAAU,KAAK;AAAA,QACzC,KAAK,KAAK;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,MACR,CAAC;AAAA,IACF,SAAS,OAAO;AACf,YAAM,IAAI;AAAA,QACT,2BAA2B,UAAU,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACjG;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,mBAA2B;AAC1B,QAAI;AACH,aAAO,SAAS,mCAAmC;AAAA,QAClD,KAAK,KAAK;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,MACR,CAAC,EAAE,KAAK;AAAA,IACT,SAAS,OAAO;AACf,YAAM,IAAI;AAAA,QACT,iCAAiC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACxF;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,iBAA0B;AACzB,UAAM,SAAS,KAAK,iBAAiB;AACrC,WAAO,WAAW,UAAU,WAAW;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,QAAyB;AACxC,QAAI;AACH,YAAM,MAAM,UAAU;AACtB,aAAO,SAAS,kBAAkB,GAAG,KAAK;AAAA,QACzC,KAAK,KAAK;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,MACR,CAAC,EAAE,KAAK;AAAA,IACT,SAAS,OAAO;AACf,YAAM,IAAI;AAAA,QACT,8BAA8B,SAAS,eAAe,MAAM,KAAK,EAAE,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC/H;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,cAA+B;AAC7C,QAAI;AACH,YAAM,SAAS,SAAS,iCAAiC;AAAA,QACxD,KAAK,KAAK;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,MACR,CAAC;AACD,aAAO,OAAO,SAAS,YAAY;AAAA,IACpC,QAAQ;AACP,aAAO;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YACC,YACA,UAC4C;AAC5C,QAAI;AACH,YAAM,MACL,aAAa,WACV,uBAAuB,UAAU,MACjC,cAAc,UAAU;AAE5B,eAAS,KAAK;AAAA,QACb,KAAK,KAAK;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,MACR,CAAC;AAED,aAAO,EAAE,SAAS,MAAM,WAAW,CAAC,EAAE;AAAA,IACvC,QAAQ;AAEP,YAAM,YAAY,KAAK,mBAAmB;AAC1C,UAAI,UAAU,SAAS,GAAG;AACzB,eAAO,EAAE,SAAS,OAAO,UAAU;AAAA,MACpC;AAEA,YAAM,IAAI,MAAM,0BAA0B,UAAU,EAAE;AAAA,IACvD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AAClB,QAAI;AACH,eAAS,qBAAqB;AAAA,QAC7B,KAAK,KAAK;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,MACR,CAAC;AAAA,IACF,SAAS,OAAO;AACf,YAAM,IAAI;AAAA,QACT,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACjF;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,qBAA+B;AAC9B,QAAI;AACH,YAAM,SAAS,SAAS,wCAAwC;AAAA,QAC/D,KAAK,KAAK;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,MACR,CAAC;AACD,aAAO,OACL,KAAK,EACL,MAAM,IAAI,EACV,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,IAC7B,QAAQ;AACP,aAAO,CAAC;AAAA,IACT;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,YAA6B;AAC/C,QAAI;AAEH,UAAI,aAAa;AACjB,UAAI;AACH,iBAAS,+BAA+B;AAAA,UACvC,KAAK,KAAK;AAAA,UACV,UAAU;AAAA,UACV,OAAO;AAAA,QACR,CAAC;AAAA,MACF,QAAQ;AACP,qBAAa;AAAA,MACd;AAEA,YAAM,SAAS;AAAA,QACd,sBAAsB,UAAU,KAAK,UAAU;AAAA,QAC/C;AAAA,UACC,KAAK,KAAK;AAAA,UACV,UAAU;AAAA,UACV,OAAO;AAAA,QACR;AAAA,MACD;AACA,aAAO,OAAO,KAAK,EAAE,SAAS;AAAA,IAC/B,QAAQ;AACP,aAAO;AAAA,IACR;AAAA,EACD;AACD;AAKO,SAAS,iBAAiB,UAA+B;AAC/D,QAAM,OAAO,YAAY,WAAW,YAAY;AAChD,SAAO,IAAI,WAAW,IAAI;AAC3B;;;AC3OO,IAAM,kBAAN,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM5B,gBAAgB,UAAkB,UAA2B;AAC5D,UAAM,YAAY,CAAC,MAClB,EACE,QAAQ,YAAY,EAAE,EACtB,QAAQ,OAAO,EAAE,EACjB,QAAQ,QAAQ,EAAE;AAErB,UAAM,QAAQ,UAAU,QAAQ;AAChC,UAAM,QAAQ,UAAU,QAAQ;AAGhC,QAAI,MAAM,WAAW,KAAK,MAAM,WAAW,GAAG;AAC7C,aAAO;AAAA,IACR;AAGA,WAAO,MAAM,WAAW,KAAK,KAAK,MAAM,WAAW,KAAK;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cACC,cACA,YAKE;AACF,UAAM,YAID,CAAC;AAEN,eAAW,eAAe,cAAc;AACvC,iBAAW,SAAS,YAAY;AAC/B,mBAAW,kBAAkB,MAAM,UAAU;AAE5C,eACE,YAAY,mBAAmB,eAC/B,eAAe,mBAAmB,gBACnC,KAAK;AAAA,YACJ,YAAY;AAAA,YACZ,eAAe;AAAA,UAChB,GACC;AACD,sBAAU,KAAK;AAAA,cACd,MAAM,MAAM;AAAA,cACZ,qBAAqB,eAAe;AAAA,cACpC,gBAAgB,eAAe;AAAA,YAChC,CAAC;AAAA,UACF;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAoB,UAAkB,UAA6B;AAClE,eAAW,WAAW,UAAU;AAE/B,YAAM,OAAO,QAAQ,QAAQ,YAAY,EAAE,EAAE,QAAQ,OAAO,EAAE;AAE9D,UAAI,KAAK,WAAW,GAAG;AAEtB,eAAO;AAAA,MACR;AAEA,UAAI,SAAS,WAAW,IAAI,GAAG;AAC9B,eAAO;AAAA,MACR;AAGA,UAAI,aAAa,SAAS;AACzB,eAAO;AAAA,MACR;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBACC,cACA,YACW;AACX,UAAM,WAAqB,CAAC;AAE5B,eAAW,QAAQ,cAAc;AAChC,iBAAW,SAAS,YAAY;AAC/B,cAAM,oBAAoB,MAAM,SAC9B,OAAO,CAAC,MAAM,EAAE,mBAAmB,WAAW,EAC9C,IAAI,CAAC,MAAM,EAAE,YAAY;AAE3B,YAAI,KAAK,oBAAoB,MAAM,iBAAiB,GAAG;AACtD,mBAAS;AAAA,YACR,SAAS,IAAI,0BAA0B,MAAM,KAAK,QAAQ,KAAK,MAAM,KAAK,KAAK;AAAA,UAChF;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AACD;AAGO,IAAM,kBAAkB,IAAI,gBAAgB;;;ACzHnD,SAAS,MAAM,cAAc;AAC7B,OAAO,aAAa;AACpB,SAAS,WAAAA,gBAAe;AAyBjB,IAAM,cAAN,MAAkB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,IAAQ,aAAsB;AACzC,SAAK,UAAU,IAAI,YAAY,EAAE;AACjC,SAAK,aAAa;AAClB,SAAK,kBAAkB;AAGvB,QAAI,aAAa;AAChB,WAAK,aAAa,IAAI,WAAW,WAAW;AAAA,IAC7C,OAAO;AACN,UAAI;AACH,aAAK,aAAa,iBAAiB;AAAA,MACpC,QAAQ;AAEP,aAAK,aAAa,IAAI,WAAW,QAAQ,IAAI,CAAC;AAAA,MAC/C;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,OAA4C;AACvD,UAAM,UAAU,OAAO;AACvB,UAAM,WAAqB,CAAC;AAG5B,SAAK,QAAQ,YAAY;AAAA,MACxB,IAAI;AAAA,MACJ,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,QAAQ;AAAA,IACT,CAAC;AAGD,UAAM,kBAAkB,oBAAI,IAAoB;AAChD,UAAM,eAAuB,CAAC;AAE9B,aAAS,IAAI,GAAG,IAAI,MAAM,MAAM,QAAQ,KAAK;AAC5C,YAAM,YAAY,MAAM,MAAM,CAAC;AAC/B,YAAM,WAAW,IAAI;AACrB,YAAM,SAAS,OAAO;AACtB,sBAAgB,IAAI,UAAU,MAAM;AAEpC,YAAM,OAAO,KAAK,QAAQ,WAAW;AAAA,QACpC,IAAI;AAAA,QACJ,UAAU;AAAA,QACV;AAAA,QACA,OAAO,UAAU;AAAA,QACjB,aAAa,UAAU;AAAA,QACvB,QAAQ;AAAA;AAAA,QACR,UAAU,UAAU,YAAY;AAAA,QAChC,aAAa;AAAA,QACb,aAAa;AAAA,QACb,eAAe;AAAA,QACf,UAAU;AAAA,QACV,eAAe;AAAA,MAChB,CAAC;AAED,mBAAa,KAAK,IAAI;AAAA,IACvB;AAGA,UAAM,gBAAgB,oBAAI,IAAsB;AAEhD,aAAS,IAAI,GAAG,IAAI,MAAM,MAAM,QAAQ,KAAK;AAC5C,YAAM,YAAY,MAAM,MAAM,CAAC;AAC/B,YAAM,WAAW,IAAI;AACrB,YAAM,SAAS,gBAAgB,IAAI,QAAQ;AAC3C,YAAM,OAAiB,CAAC;AAExB,UAAI,UAAU,cAAc,UAAU,WAAW,SAAS,GAAG;AAC5D,mBAAW,eAAe,UAAU,YAAY;AAC/C,gBAAM,QAAQ,gBAAgB,IAAI,WAAW;AAC7C,cAAI,OAAO;AACV,iBAAK,QAAQ,cAAc,QAAQ,KAAK;AACxC,iBAAK,KAAK,KAAK;AAAA,UAChB,OAAO;AACN,qBAAS;AAAA,cACR,SAAS,QAAQ,KAAK,UAAU,KAAK,6CAA6C,WAAW;AAAA,YAC9F;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAEA,oBAAc,IAAI,QAAQ,IAAI;AAAA,IAC/B;AAGA,aAAS,IAAI,GAAG,IAAI,MAAM,MAAM,QAAQ,KAAK;AAC5C,YAAM,YAAY,MAAM,MAAM,CAAC;AAC/B,YAAM,WAAW,IAAI;AACrB,YAAM,SAAS,gBAAgB,IAAI,QAAQ;AAE3C,UAAI,UAAU,eAAe;AAC5B,mBAAW,MAAM,UAAU,eAAe;AACzC,eAAK,QAAQ,iBAAiB;AAAA,YAC7B,SAAS;AAAA,YACT,cAAc,GAAG;AAAA,YACjB,gBAAgB,GAAG;AAAA,UACpB,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD;AAGA,UAAM,aAAa,KAAK,WAAW,iBAAiB,aAAa;AACjE,QAAI,CAAC,WAAW,OAAO;AACtB,eAAS;AAAA,QACR,8BAA8B,WAAW,OAAO,KAAK,MAAM,CAAC;AAAA,MAC7D;AAAA,IACD;AAGA,aAAS,IAAI,GAAG,IAAI,MAAM,MAAM,QAAQ,KAAK;AAC5C,YAAM,aAAa,MAAM,MAAM,CAAC;AAChC,YAAM,OAAO,IAAI;AACjB,YAAM,UAAU,gBAAgB,IAAI,IAAI;AAExC,UAAI,CAAC,WAAW,cAAe;AAE/B,eAAS,IAAI,IAAI,GAAG,IAAI,MAAM,MAAM,QAAQ,KAAK;AAChD,cAAM,aAAa,MAAM,MAAM,CAAC;AAChC,cAAM,OAAO,IAAI;AAEjB,YAAI,CAAC,WAAW,cAAe;AAE/B,mBAAW,OAAO,WAAW,eAAe;AAC3C,qBAAW,OAAO,WAAW,eAAe;AAC3C,iBACE,IAAI,mBAAmB,eACvB,IAAI,mBAAmB,gBACxB,KAAK,gBAAgB,gBAAgB,IAAI,SAAS,IAAI,OAAO,GAC5D;AACD,uBAAS;AAAA,gBACR,+BAA+B,IAAI,KAAK,WAAW,KAAK,MAAM,IAAI,OAAO,eAAe,IAAI,KAAK,WAAW,KAAK,MAAM,IAAI,OAAO;AAAA,cACnI;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAGA,UAAM,iBAAiB,oBAAI,IAAY;AACvC,UAAM,cAA0C,CAAC;AAEjD,aAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC7C,YAAM,WAAW,IAAI;AACrB,YAAM,SAAS,gBAAgB,IAAI,QAAQ;AAC3C,YAAM,OAAO,cAAc,IAAI,MAAM,KAAK,CAAC;AAC3C,YAAM,UAAU,KAAK,SAAS;AAE9B,UAAI,SAAS;AACZ,aAAK,QAAQ,WAAW,QAAQ,EAAE,QAAQ,UAAU,CAAC;AAAA,MACtD;AAEA,YAAM,WAAW,KAAK,WAAW;AAAA,QAChC;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAEA,kBAAY,KAAK;AAAA,QAChB,IAAI;AAAA,QACJ;AAAA,QACA,OAAO,aAAa,CAAC,EAAE;AAAA,QACvB,QAAQ,UAAU,YAAY;AAAA,QAC9B,WAAW;AAAA,MACZ,CAAC;AAAA,IACF;AAEA,WAAO;AAAA,MACN,UAAU;AAAA,MACV,OAAO;AAAA,MACP;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,OAAwC;AACjD,UAAM,QAAQ,KAAK,QAAQ,UAAU;AAAA,MACpC,UAAU,MAAM;AAAA,MAChB,QAAQ,MAAM;AAAA,IACf,CAAC;AAGD,UAAM,gBAAgB,oBAAI,IAAsB;AAChD,UAAM,iBAAiB,oBAAI,IAAY;AAEvC,eAAW,QAAQ,OAAO;AACzB,YAAM,OAAO,KAAK,QAAQ,gBAAgB,KAAK,EAAE;AACjD,oBAAc;AAAA,QACb,KAAK;AAAA,QACL,KAAK,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,MACrB;AACA,UAAI,KAAK,WAAW,aAAa;AAChC,uBAAe,IAAI,KAAK,EAAE;AAAA,MAC3B;AAAA,IACD;AAEA,UAAM,cAAwC,MAAM,IAAI,CAAC,SAAS;AACjE,YAAM,OAAO,KAAK,QAAQ,gBAAgB,KAAK,EAAE;AACjD,YAAM,WACL,KAAK,WAAW,aAChB,KAAK,WAAW,SAAS,KAAK,IAAI,eAAe,cAAc;AAEhE,aAAO;AAAA,QACN,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,QACf,eAAe,KAAK;AAAA,QACpB,aAAa,KAAK;AAAA,QAClB,aAAa,KAAK;AAAA,QAClB,eAAe,KAAK;AAAA,QACpB,cAAc,KAAK,IAAI,CAAC,OAAO;AAAA,UAC9B,UAAU,EAAE;AAAA,UACZ,OAAO,EAAE;AAAA,UACT,QAAQ,EAAE;AAAA,QACX,EAAE;AAAA,QACF,WAAW;AAAA,MACZ;AAAA,IACD,CAAC;AAGD,UAAM,UAAU;AAAA,MACf,OAAO,MAAM;AAAA,MACb,SAAS,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EAAE;AAAA,MACrD,aAAa,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,aAAa,EAAE;AAAA,MAC7D,WAAW,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW,EAAE;AAAA,MACzD,WAAW,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW,EAAE;AAAA,MACzD,SAAS,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EAAE;AAAA,IACtD;AAEA,WAAO,EAAE,OAAO,aAAa,QAAQ;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,OAAoC;AAC3C,UAAM,OAAO,KAAK,QAAQ,QAAQ,MAAM,OAAO;AAC/C,QAAI,CAAC,MAAM;AACV,YAAM,IAAI,MAAM,mBAAmB,MAAM,OAAO,EAAE;AAAA,IACnD;AAEA,UAAM,OAAO,KAAK,QAAQ,gBAAgB,KAAK,EAAE;AACjD,UAAM,gBAAgB,KAAK,QAAQ,iBAAiB,KAAK,EAAE;AAC3D,UAAM,eAAe,KAAK,QAAQ,gBAAgB,KAAK,EAAE;AAEzD,WAAO;AAAA,MACN;AAAA,MACA,cAAc,KAAK,IAAI,CAAC,OAAO;AAAA,QAC9B,UAAU,EAAE;AAAA,QACZ,OAAO,EAAE;AAAA,QACT,QAAQ,EAAE;AAAA,MACX,EAAE;AAAA,MACF,gBAAgB;AAAA,MAChB,eAAe;AAAA,IAChB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,OAAwC;AACjD,UAAM,OAAO,KAAK,QAAQ,QAAQ,MAAM,OAAO;AAC/C,QAAI,CAAC,MAAM;AACV,aAAO;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,QACN,OAAO,mBAAmB,MAAM,OAAO;AAAA,MACxC;AAAA,IACD;AAGA,QAAI,KAAK,WAAW,WAAW;AAC9B,aAAO;AAAA,QACN,SAAS;AAAA,QACT;AAAA,QACA,OAAO,wCAAwC,KAAK,MAAM;AAAA,MAC3D;AAAA,IACD;AAGA,UAAM,OAAO,KAAK,QAAQ,gBAAgB,KAAK,EAAE;AACjD,UAAM,YAAY,KAAK,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW;AAC7D,QAAI,UAAU,SAAS,GAAG;AACzB,aAAO;AAAA,QACN,SAAS;AAAA,QACT;AAAA,QACA,OAAO,uBAAuB,UAAU,IAAI,CAAC,MAAM,IAAI,EAAE,QAAQ,KAAK,EAAE,KAAK,MAAM,EAAE,MAAM,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,MAC3G;AAAA,IACD;AAGA,UAAM,YAAY,KAAK,QAAQ,0BAA0B,KAAK,EAAE;AAChE,QAAI,UAAU,SAAS,GAAG;AACzB,aAAO;AAAA,QACN,SAAS;AAAA,QACT;AAAA,QACA,OAAO,oDAAoD,UAAU,IAAI,CAAC,MAAM,IAAI,EAAE,KAAK,QAAQ,KAAK,EAAE,KAAK,KAAK,iBAAiB,EAAE,OAAO,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,MAC9J;AAAA,IACD;AAGA,UAAM,UAAU,MAAM,YAAY,SAAS,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;AAE/D,UAAM,cAAc,KAAK,QAAQ,WAAW,KAAK,IAAI;AAAA,MACpD,QAAQ;AAAA,MACR,aAAa;AAAA,IACd,CAAC;AAGD,SAAK,QAAQ,eAAe;AAAA,MAC3B,IAAI,OAAO;AAAA,MACX,SAAS,KAAK;AAAA,MACd,OAAO;AAAA,MACP,SAAS,mBAAmB,OAAO;AAAA,MACnC,UAAU,EAAE,UAAU,QAAQ;AAAA,IAC/B,CAAC;AAED,WAAO;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,IACP;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,OAAwC;AACjD,UAAM,OAAO,KAAK,QAAQ,QAAQ,MAAM,OAAO;AAC/C,QAAI,CAAC,MAAM;AACV,YAAM,IAAI,MAAM,mBAAmB,MAAM,OAAO,EAAE;AAAA,IACnD;AAGA,QAAI,KAAK,WAAW,YAAY;AAC/B,YAAM,IAAI;AAAA,QACT,qDAAqD,KAAK,MAAM;AAAA,MACjE;AAAA,IACD;AAGA,UAAM,iBAAiB,QAAQ,KAAK,OAAO;AAAA,MAC1C,OAAO;AAAA,MACP,QAAQ;AAAA,IACT,CAAC,EAAE,MAAM,GAAG,EAAE;AACd,UAAM,aAAa,aAAa,KAAK,QAAQ,IAAI,cAAc;AAG/D,UAAM,eAAeA;AAAA,MACpB,KAAK,WAAW,UAAU;AAAA,MAC1B;AAAA,MACA,QAAQ,KAAK,QAAQ,IAAI,cAAc;AAAA,IACxC;AAGA,SAAK,WAAW,eAAe,cAAc,UAAU;AAGvD,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,UAAM,cAAc,KAAK,QAAQ,WAAW,KAAK,IAAI;AAAA,MACpD,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,eAAe;AAAA,MACf,YAAY;AAAA,IACb,CAAC;AAGD,SAAK,QAAQ,eAAe;AAAA,MAC3B,IAAI,OAAO;AAAA,MACX,SAAS,KAAK;AAAA,MACd,OAAO;AAAA,MACP,SAAS,4BAA4B,UAAU;AAAA,MAC/C,UAAU;AAAA,QACT,aAAa;AAAA,QACb,eAAe;AAAA,MAChB;AAAA,IACD,CAAC;AAGD,UAAM,OAAO,KAAK,QAAQ,gBAAgB,KAAK,EAAE;AACjD,UAAM,gBAAgB,KAAK,QAAQ,iBAAiB,KAAK,EAAE;AAE3D,WAAO;AAAA,MACN,SAAS;AAAA,MACT,eAAe;AAAA,MACf,aAAa;AAAA,MACb,MAAM;AAAA,MACN,SAAS;AAAA,QACR,aAAa,KAAK;AAAA,QAClB,eAAe,cAAc,IAAI,CAAC,OAAO,GAAG,YAAY;AAAA,QACxD,wBAAwB,KACtB,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW,EACtC,IAAI,CAAC,OAAO;AAAA,UACZ,OAAO,EAAE;AAAA,UACT,aAAa,EAAE,eAAe;AAAA,QAC/B,EAAE;AAAA,MACJ;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,OAAkD;AAChE,UAAM,OAAO,KAAK,QAAQ,QAAQ,MAAM,OAAO;AAC/C,QAAI,CAAC,MAAM;AACV,YAAM,IAAI,MAAM,mBAAmB,MAAM,OAAO,EAAE;AAAA,IACnD;AAGA,SAAK,QAAQ,WAAW,KAAK,IAAI;AAAA,MAChC,UAAU,MAAM;AAAA,MAChB,eAAe,MAAM;AAAA,IACtB,CAAC;AAGD,QAAI,mBAA6B,CAAC;AAClC,QAAI,MAAM,iBAAiB,MAAM,cAAc,SAAS,GAAG;AAE1D,YAAM,WAAW,KAAK,QAAQ,UAAU;AAAA,QACvC,UAAU,KAAK;AAAA,QACf,QAAQ,CAAC,aAAa;AAAA,MACvB,CAAC;AACD,YAAM,aAAa,SACjB,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,EAC9B,IAAI,CAAC,OAAO;AAAA,QACZ,MAAM;AAAA,QACN,UAAU,KAAK,QAAQ,iBAAiB,EAAE,EAAE;AAAA,MAC7C,EAAE;AAEH,yBAAmB,KAAK,gBAAgB;AAAA,QACvC,MAAM;AAAA,QACN;AAAA,MACD;AAAA,IACD;AAGA,QAAI,oBAAoB;AACxB,QAAI,KAAK,aAAa;AACrB,UAAI;AACH,cAAM,aAAa,KAAK,WAAW,gBAAgB,MAAM;AACzD,4BAAoB,KAAK,WAAW,mBAAmB,UAAU;AAAA,MAClE,QAAQ;AAAA,MAER;AAAA,IACD;AAGA,SAAK,QAAQ,eAAe;AAAA,MAC3B,IAAI,OAAO;AAAA,MACX,SAAS,KAAK;AAAA,MACd,OAAO;AAAA,MACP,SAAS,MAAM;AAAA,MACf,UAAU;AAAA,QACT,UAAU,MAAM;AAAA,QAChB,eAAe,MAAM,iBAAiB,CAAC;AAAA,QACvC,mBAAmB;AAAA,MACpB;AAAA,IACD,CAAC;AAED,WAAO;AAAA,MACN,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,oBAAoB;AAAA,IACrB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAA8C;AAC1D,UAAM,OAAO,KAAK,QAAQ,QAAQ,MAAM,OAAO;AAC/C,QAAI,CAAC,MAAM;AACV,YAAM,IAAI,MAAM,mBAAmB,MAAM,OAAO,EAAE;AAAA,IACnD;AAGA,QAAI,KAAK,WAAW,eAAe;AAClC,YAAM,IAAI;AAAA,QACT,2DAA2D,KAAK,MAAM;AAAA,MACvE;AAAA,IACD;AAGA,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,UAAM,cAAc,KAAK,QAAQ,WAAW,KAAK,IAAI;AAAA,MACpD,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,MACV,eAAe,MAAM;AAAA,IACtB,CAAC;AAGD,UAAM,gBAAgB,KAAK,QAAQ,UAAU,EAAE,UAAU,KAAK,SAAS,CAAC;AACxE,UAAM,iBAAiB,IAAI;AAAA,MAC1B,cACE,OAAO,CAAC,MAAM,EAAE,WAAW,eAAe,EAAE,WAAW,WAAW,EAClE,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IAClB;AAEA,mBAAe,IAAI,KAAK,EAAE;AAE1B,UAAM,gBAAgB,oBAAI,IAAsB;AAChD,eAAW,KAAK,eAAe;AAC9B,YAAM,OAAO,KAAK,QAAQ,gBAAgB,EAAE,EAAE;AAC9C,oBAAc;AAAA,QACb,EAAE;AAAA,QACF,KAAK,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,MACrB;AAAA,IACD;AAEA,UAAM,cAAc,KAAK,WAAW;AAAA,MACnC,KAAK;AAAA,MACL;AAAA,MACA;AAAA,IACD;AAEA,UAAM,gBAAgB,YACpB,IAAI,CAAC,OAAO,cAAc,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAClD,OAAO,CAAC,MAAiB,MAAM,MAAS,EACxC,IAAI,CAAC,OAAO;AAAA,MACZ,UAAU,EAAE;AAAA,MACZ,OAAO,EAAE;AAAA,IACV,EAAE;AAGH,eAAW,MAAM,aAAa;AAC7B,YAAM,IAAI,cAAc,KAAK,CAAC,OAAO,GAAG,OAAO,EAAE;AACjD,UAAI,KAAK,EAAE,WAAW,WAAW;AAChC,aAAK,QAAQ,WAAW,IAAI,EAAE,QAAQ,UAAU,CAAC;AAAA,MAClD;AAAA,IACD;AAGA,SAAK,QAAQ,eAAe;AAAA,MAC3B,IAAI,OAAO;AAAA,MACX,SAAS,KAAK;AAAA,MACd,OAAO;AAAA,MACP,SAAS,MAAM;AAAA,MACf,UAAU;AAAA,QACT,eAAe,MAAM;AAAA,QACrB,gBAAgB;AAAA,MACjB;AAAA,IACD,CAAC;AAED,WAAO;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,MACN,gBAAgB;AAAA,IACjB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,OAAwC;AAEjD,QAAI,CAAC,KAAK,WAAW,eAAe,GAAG;AACtC,YAAM,IAAI;AAAA,QACT,6DACC,KAAK,WAAW,iBAAiB;AAAA,MACnC;AAAA,IACD;AAEA,UAAM,OAAO,KAAK,QAAQ,QAAQ,MAAM,OAAO;AAC/C,QAAI,CAAC,MAAM;AACV,YAAM,IAAI,MAAM,mBAAmB,MAAM,OAAO,EAAE;AAAA,IACnD;AAGA,QAAI,KAAK,WAAW,aAAa;AAChC,YAAM,IAAI;AAAA,QACT,sDAAsD,KAAK,MAAM;AAAA,MAClE;AAAA,IACD;AAEA,QAAI,CAAC,KAAK,aAAa;AACtB,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC9C;AAEA,UAAM,WAAW,MAAM,YAAY;AAGnC,UAAM,cAAc,KAAK,WAAW,YAAY,KAAK,aAAa,QAAQ;AAE1E,QAAI,YAAY,SAAS;AAExB,YAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,WAAK,QAAQ,WAAW,KAAK,IAAI;AAAA,QAChC,QAAQ;AAAA,QACR,WAAW;AAAA,MACZ,CAAC;AAGD,UAAI,KAAK,eAAe;AACvB,YAAI;AACH,cAAI,KAAK,WAAW,eAAe,KAAK,aAAa,GAAG;AACvD,iBAAK,WAAW,eAAe,KAAK,aAAa;AAAA,UAClD;AAAA,QACD,QAAQ;AAAA,QAER;AAAA,MACD;AAEA,UAAI;AACH,aAAK,WAAW,aAAa,KAAK,WAAW;AAAA,MAC9C,QAAQ;AAAA,MAER;AAGA,YAAM,gBAAgB,KAAK,QAAQ,UAAU;AAAA,QAC5C,UAAU,KAAK;AAAA,MAChB,CAAC;AACD,YAAM,iBAAiB,IAAI;AAAA,QAC1B,cAAc,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,MACtE;AAEA,YAAM,gBAAgB,oBAAI,IAAsB;AAChD,iBAAW,KAAK,eAAe;AAC9B,cAAM,OAAO,KAAK,QAAQ,gBAAgB,EAAE,EAAE;AAC9C,sBAAc;AAAA,UACb,EAAE;AAAA,UACF,KAAK,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,QACrB;AAAA,MACD;AAEA,YAAM,cAAc,KAAK,WAAW;AAAA,QACnC,KAAK;AAAA,QACL;AAAA,QACA;AAAA,MACD;AAEA,YAAM,gBAAgB,YACpB,IAAI,CAAC,OAAO,cAAc,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAClD,OAAO,CAAC,MAAiB,MAAM,MAAS,EACxC,IAAI,CAAC,MAAM;AACX,cAAM,WAAW,KAAK,WAAW;AAAA,UAChC,EAAE;AAAA,UACF;AAAA,UACA;AAAA,QACD;AACA,eAAO;AAAA,UACN,UAAU,EAAE;AAAA,UACZ,OAAO,EAAE;AAAA,UACT,WAAW;AAAA,QACZ;AAAA,MACD,CAAC;AAGF,iBAAW,MAAM,aAAa;AAC7B,cAAM,IAAI,cAAc,KAAK,CAAC,OAAO,GAAG,OAAO,EAAE;AACjD,YAAI,KAAK,EAAE,WAAW,WAAW;AAChC,eAAK,QAAQ,WAAW,IAAI,EAAE,QAAQ,UAAU,CAAC;AAAA,QAClD;AAAA,MACD;AAGA,WAAK,QAAQ,eAAe;AAAA,QAC3B,IAAI,OAAO;AAAA,QACX,SAAS,KAAK;AAAA,QACd,OAAO;AAAA,QACP,SAAS,mBAAmB,QAAQ;AAAA,QACpC,UAAU;AAAA,UACT;AAAA,UACA,gBAAgB;AAAA,QACjB;AAAA,MACD,CAAC;AAED,aAAO;AAAA,QACN,SAAS;AAAA,QACT,cAAc;AAAA,QACd,gBAAgB;AAAA,MACjB;AAAA,IACD,OAAO;AAEN,YAAM,YAAY,YAAY,UAAU,IAAI,CAAC,UAAU;AAAA,QACtD;AAAA,QACA,aAAa,qBAAqB,IAAI;AAAA,QACtC,iBAAiB;AAAA,QACjB,YAAY,iCAAiC,IAAI;AAAA,MAClD,EAAE;AAGF,WAAK,QAAQ,eAAe;AAAA,QAC3B,IAAI,OAAO;AAAA,QACX,SAAS,KAAK;AAAA,QACd,OAAO;AAAA,QACP,SAAS,+BAA+B,YAAY,UAAU,MAAM;AAAA,QACpE,UAAU;AAAA,UACT,kBAAkB,YAAY;AAAA,UAC9B;AAAA,QACD;AAAA,MACD,CAAC;AAED,aAAO;AAAA,QACN,SAAS;AAAA,QACT,cAAc;AAAA,QACd;AAAA,QACA,gBAAgB,CAAC;AAAA,MAClB;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,OAA4C;AACvD,UAAM,OAAO,KAAK,QAAQ,QAAQ,MAAM,OAAO;AAC/C,QAAI,CAAC,MAAM;AACV,YAAM,IAAI,MAAM,mBAAmB,MAAM,OAAO,EAAE;AAAA,IACnD;AAEA,QAAI,kBAAkB;AACtB,QAAI,gBAAgB;AAGpB,QAAI,KAAK,eAAe;AACvB,UAAI;AACH,YAAI,KAAK,WAAW,eAAe,KAAK,aAAa,GAAG;AACvD,eAAK,WAAW,eAAe,KAAK,aAAa;AACjD,4BAAkB;AAAA,QACnB;AAAA,MACD,QAAQ;AAAA,MAER;AAAA,IACD;AAGA,QAAI,KAAK,aAAa;AACrB,UAAI;AACH,aAAK,WAAW,aAAa,KAAK,WAAW;AAC7C,wBAAgB;AAAA,MACjB,QAAQ;AAAA,MAER;AAAA,IACD;AAGA,SAAK,QAAQ,WAAW,KAAK,IAAI;AAAA,MAChC,QAAQ;AAAA,IACT,CAAC;AAGD,SAAK,QAAQ,eAAe;AAAA,MAC3B,IAAI,OAAO;AAAA,MACX,SAAS,KAAK;AAAA,MACd,OAAO;AAAA,MACP,SAAS,MAAM,UAAU;AAAA,MACzB,UAAU;AAAA,QACT,QAAQ,MAAM;AAAA,QACd,kBAAkB;AAAA,QAClB,gBAAgB;AAAA,MACjB;AAAA,IACD,CAAC;AAED,WAAO;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACR,kBAAkB;AAAA,QAClB,gBAAgB;AAAA,MACjB;AAAA,IACD;AAAA,EACD;AACD;;;AP1yBA,IAAI,cAAkC;AAEtC,SAAS,iBAA8B;AACtC,MAAI,CAAC,aAAa;AACjB,UAAM,KAAK,MAAM;AACjB,kBAAc,IAAI,YAAY,EAAE;AAAA,EACjC;AACA,SAAO;AACR;AAEO,SAAS,eAA0B;AACzC,QAAMC,UAAS,IAAI,UAAU;AAAA,IAC5B,MAAM;AAAA,IACN,SAAS;AAAA,EACV,CAAC;AAGD,EAAAA,QAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,MACC,aAAa,EAAE,OAAO,EAAE,SAAS,0BAA0B;AAAA,MAC3D,mBAAmB,EACjB,OAAO,EACP,SAAS,wCAAwC;AAAA,MACnD,OAAO,EAAE;AAAA,QACR,EAAE,OAAO;AAAA,UACR,OAAO,EAAE,OAAO;AAAA,UAChB,aAAa,EAAE,OAAO;AAAA,UACtB,UAAU,EACR,KAAK,CAAC,QAAQ,UAAU,KAAK,CAAC,EAC9B,SAAS,EACT,QAAQ,QAAQ;AAAA,UAClB,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,UACrD,eAAe,EACb;AAAA,YACA,EAAE,OAAO;AAAA,cACR,SAAS,EAAE,OAAO;AAAA,cAClB,gBAAgB,EAAE,KAAK,CAAC,aAAa,QAAQ,CAAC;AAAA,YAC/C,CAAC;AAAA,UACF,EACC,SAAS,EACT,QAAQ,CAAC,CAAC;AAAA,QACb,CAAC;AAAA,MACF;AAAA,IACD;AAAA,IACA,OAAO,WAAW;AACjB,UAAI;AACH,cAAM,SAAS,eAAe,EAAE,YAAY,MAAM;AAClD,eAAO;AAAA,UACN,SAAS;AAAA,YACR,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE;AAAA,UAChE;AAAA,QACD;AAAA,MACD,SAAS,OAAO;AACf,eAAO;AAAA,UACN,SAAS;AAAA,YACR;AAAA,cACC,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,YACvE;AAAA,UACD;AAAA,UACA,SAAS;AAAA,QACV;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAGA,EAAAA,QAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,MACC,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,MAC9B,QAAQ,EACN;AAAA,QACA,EAAE,KAAK;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACD,CAAC;AAAA,MACF,EACC,SAAS;AAAA,MACX,kBAAkB,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,IACvD;AAAA,IACA,OAAO,WAAW;AACjB,UAAI;AACH,cAAM,SAAS,eAAe,EAAE,UAAU,MAAM;AAChD,eAAO;AAAA,UACN,SAAS;AAAA,YACR,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE;AAAA,UAChE;AAAA,QACD;AAAA,MACD,SAAS,OAAO;AACf,eAAO;AAAA,UACN,SAAS;AAAA,YACR;AAAA,cACC,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,YACvE;AAAA,UACD;AAAA,UACA,SAAS;AAAA,QACV;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAGA,EAAAA,QAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,MACC,SAAS,EAAE,OAAO;AAAA,IACnB;AAAA,IACA,OAAO,WAAW;AACjB,UAAI;AACH,cAAM,SAAS,eAAe,EAAE,QAAQ,MAAM;AAC9C,eAAO;AAAA,UACN,SAAS;AAAA,YACR,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE;AAAA,UAChE;AAAA,QACD;AAAA,MACD,SAAS,OAAO;AACf,eAAO;AAAA,UACN,SAAS;AAAA,YACR;AAAA,cACC,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,YACvE;AAAA,UACD;AAAA,UACA,SAAS;AAAA,QACV;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAGA,EAAAA,QAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,MACC,SAAS,EAAE,OAAO;AAAA,MAClB,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,IAC/B;AAAA,IACA,OAAO,WAAW;AACjB,UAAI;AACH,cAAM,SAAS,eAAe,EAAE,UAAU,MAAM;AAChD,eAAO;AAAA,UACN,SAAS;AAAA,YACR,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE;AAAA,UAChE;AAAA,QACD;AAAA,MACD,SAAS,OAAO;AACf,eAAO;AAAA,UACN,SAAS;AAAA,YACR;AAAA,cACC,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,YACvE;AAAA,UACD;AAAA,UACA,SAAS;AAAA,QACV;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAGA,EAAAA,QAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,MACC,SAAS,EAAE,OAAO;AAAA,IACnB;AAAA,IACA,OAAO,WAAW;AACjB,UAAI;AACH,cAAM,SAAS,eAAe,EAAE,UAAU,MAAM;AAChD,eAAO;AAAA,UACN,SAAS;AAAA,YACR,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE;AAAA,UAChE;AAAA,QACD;AAAA,MACD,SAAS,OAAO;AACf,eAAO;AAAA,UACN,SAAS;AAAA,YACR;AAAA,cACC,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,YACvE;AAAA,UACD;AAAA,UACA,SAAS;AAAA,QACV;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAGA,EAAAA,QAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,MACC,SAAS,EAAE,OAAO;AAAA,MAClB,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,MACnC,MAAM,EAAE,OAAO;AAAA,MACf,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IAC7C;AAAA,IACA,OAAO,WAAW;AACjB,UAAI;AACH,cAAM,SAAS,eAAe,EAAE,eAAe,MAAM;AACrD,eAAO;AAAA,UACN,SAAS;AAAA,YACR,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE;AAAA,UAChE;AAAA,QACD;AAAA,MACD,SAAS,OAAO;AACf,eAAO;AAAA,UACN,SAAS;AAAA,YACR;AAAA,cACC,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,YACvE;AAAA,UACD;AAAA,UACA,SAAS;AAAA,QACV;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAGA,EAAAA,QAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,MACC,SAAS,EAAE,OAAO;AAAA,MAClB,SAAS,EAAE,OAAO;AAAA,MAClB,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,IAClC;AAAA,IACA,OAAO,WAAW;AACjB,UAAI;AACH,cAAM,SAAS,eAAe,EAAE,aAAa,MAAM;AACnD,eAAO;AAAA,UACN,SAAS;AAAA,YACR,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE;AAAA,UAChE;AAAA,QACD;AAAA,MACD,SAAS,OAAO;AACf,eAAO;AAAA,UACN,SAAS;AAAA,YACR;AAAA,cACC,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,YACvE;AAAA,UACD;AAAA,UACA,SAAS;AAAA,QACV;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAGA,EAAAA,QAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,MACC,SAAS,EAAE,OAAO;AAAA,MAClB,UAAU,EAAE,KAAK,CAAC,SAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,QAAQ;AAAA,IAClE;AAAA,IACA,OAAO,WAAW;AACjB,UAAI;AACH,cAAM,SAAS,eAAe,EAAE,UAAU,MAAM;AAChD,eAAO;AAAA,UACN,SAAS;AAAA,YACR,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE;AAAA,UAChE;AAAA,QACD;AAAA,MACD,SAAS,OAAO;AACf,eAAO;AAAA,UACN,SAAS;AAAA,YACR;AAAA,cACC,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,YACvE;AAAA,UACD;AAAA,UACA,SAAS;AAAA,QACV;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAGA,EAAAA,QAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,MACC,SAAS,EAAE,OAAO;AAAA,MAClB,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,IAC7B;AAAA,IACA,OAAO,WAAW;AACjB,UAAI;AACH,cAAM,SAAS,eAAe,EAAE,YAAY,MAAM;AAClD,eAAO;AAAA,UACN,SAAS;AAAA,YACR,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE;AAAA,UAChE;AAAA,QACD;AAAA,MACD,SAAS,OAAO;AACf,eAAO;AAAA,UACN,SAAS;AAAA,YACR;AAAA,cACC,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,YACvE;AAAA,UACD;AAAA,UACA,SAAS;AAAA,QACV;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,SAAOA;AACR;AAEO,IAAM,SAAS,aAAa;;;ADvUnC,eAAe,OAAO;AACrB,QAAMC,UAAS,aAAa;AAC5B,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAMA,QAAO,QAAQ,SAAS;AAC/B;AAEA,KAAK,EAAE,MAAM,CAAC,UAAU;AACvB,UAAQ,MAAM,gBAAgB,KAAK;AACnC,UAAQ,KAAK,CAAC;AACf,CAAC;","names":["resolve","server","server"]}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "agents-task-assigning",
3
+ "version": "0.1.0",
4
+ "description": "MCP Server for multi-agent task assignment and coordination",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "agents-task-assigning": "dist/index.js"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "keywords": [
15
+ "mcp",
16
+ "mcp-server",
17
+ "multi-agent",
18
+ "task-assignment",
19
+ "claude",
20
+ "ai-agents",
21
+ "coordination"
22
+ ],
23
+ "license": "MIT",
24
+ "dependencies": {
25
+ "@modelcontextprotocol/sdk": "^1.12.1",
26
+ "better-sqlite3": "^11.8.2",
27
+ "slugify": "^1.6.6",
28
+ "uuid": "^11.1.0",
29
+ "zod": "^4.3.6"
30
+ },
31
+ "devDependencies": {
32
+ "@types/better-sqlite3": "^7.6.13",
33
+ "@types/node": "^22.13.4",
34
+ "@types/uuid": "^10.0.0",
35
+ "tsup": "^8.3.6",
36
+ "typescript": "^5.7.3",
37
+ "vitest": "^3.0.5"
38
+ },
39
+ "scripts": {
40
+ "build": "tsup",
41
+ "dev": "tsup --watch",
42
+ "test": "vitest run",
43
+ "test:watch": "vitest"
44
+ }
45
+ }