syntaur 0.2.0 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dashboard/dist/assets/{_basePickBy-CHKX1r7P.js → _basePickBy-BhaCV7eH.js} +1 -1
  2. package/dashboard/dist/assets/{_baseUniq-CTxTc4MS.js → _baseUniq-CDPcqrs2.js} +1 -1
  3. package/dashboard/dist/assets/{arc-BUo5zftd.js → arc-BP0RxLwl.js} +1 -1
  4. package/dashboard/dist/assets/{architectureDiagram-2XIMDMQ5-CrJLm-P0.js → architectureDiagram-2XIMDMQ5-BDzvaeJp.js} +1 -1
  5. package/dashboard/dist/assets/{blockDiagram-WCTKOSBZ-BK60lBBJ.js → blockDiagram-WCTKOSBZ-ZeL9mROo.js} +1 -1
  6. package/dashboard/dist/assets/{c4Diagram-IC4MRINW-C7oJEvA0.js → c4Diagram-IC4MRINW-7S5bvFLp.js} +1 -1
  7. package/dashboard/dist/assets/channel-CcB_wcgb.js +1 -0
  8. package/dashboard/dist/assets/{chunk-4BX2VUAB-CjUPlzHz.js → chunk-4BX2VUAB-Ca7R4nv5.js} +1 -1
  9. package/dashboard/dist/assets/{chunk-55IACEB6-6HmWguiO.js → chunk-55IACEB6-flEv13FB.js} +1 -1
  10. package/dashboard/dist/assets/{chunk-FMBD7UC4-CLuJnd1b.js → chunk-FMBD7UC4-CfcYWBM6.js} +1 -1
  11. package/dashboard/dist/assets/{chunk-JSJVCQXG-B4d62qWV.js → chunk-JSJVCQXG-Dw4yL0VS.js} +1 -1
  12. package/dashboard/dist/assets/{chunk-KX2RTZJC-AsEKRPq2.js → chunk-KX2RTZJC-B2cDe40G.js} +1 -1
  13. package/dashboard/dist/assets/{chunk-NQ4KR5QH-DQhHHvwY.js → chunk-NQ4KR5QH-LZVm0IWg.js} +1 -1
  14. package/dashboard/dist/assets/{chunk-QZHKN3VN-Ds1TtI3E.js → chunk-QZHKN3VN-Dg0EeHNI.js} +1 -1
  15. package/dashboard/dist/assets/{chunk-WL4C6EOR-C7jE3-cR.js → chunk-WL4C6EOR-v3rXNwXc.js} +1 -1
  16. package/dashboard/dist/assets/classDiagram-VBA2DB6C-BJr38z2g.js +1 -0
  17. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-BJr38z2g.js +1 -0
  18. package/dashboard/dist/assets/clone-Cfs2GUGt.js +1 -0
  19. package/dashboard/dist/assets/{cose-bilkent-S5V4N54A-C9ka5v1m.js → cose-bilkent-S5V4N54A-D-3JzLoS.js} +1 -1
  20. package/dashboard/dist/assets/{dagre-KLK3FWXG-BbgPQBKy.js → dagre-KLK3FWXG-d_mbczhU.js} +1 -1
  21. package/dashboard/dist/assets/{diagram-E7M64L7V-DpdeZFD4.js → diagram-E7M64L7V-BUyAp8pW.js} +1 -1
  22. package/dashboard/dist/assets/{diagram-IFDJBPK2-FlHLQzOV.js → diagram-IFDJBPK2-C8doXcyQ.js} +1 -1
  23. package/dashboard/dist/assets/{diagram-P4PSJMXO-B22NkEF_.js → diagram-P4PSJMXO-BUSmHa55.js} +1 -1
  24. package/dashboard/dist/assets/{erDiagram-INFDFZHY-zSqmtDid.js → erDiagram-INFDFZHY-Bn5_0LPU.js} +1 -1
  25. package/dashboard/dist/assets/{flowDiagram-PKNHOUZH-BP_0XmVV.js → flowDiagram-PKNHOUZH-CnEjerQM.js} +1 -1
  26. package/dashboard/dist/assets/{ganttDiagram-A5KZAMGK-8uRyYgZV.js → ganttDiagram-A5KZAMGK-CL94fbyy.js} +1 -1
  27. package/dashboard/dist/assets/{gitGraphDiagram-K3NZZRJ6-JFqg8sv4.js → gitGraphDiagram-K3NZZRJ6-4i_PeG8V.js} +1 -1
  28. package/dashboard/dist/assets/{graph-a-PAH599.js → graph-BtoFhoAd.js} +1 -1
  29. package/dashboard/dist/assets/index-DZUGYrvE.css +1 -0
  30. package/dashboard/dist/assets/index-Dv_-SxuL.js +481 -0
  31. package/dashboard/dist/assets/{infoDiagram-LFFYTUFH-C3kq7Nbv.js → infoDiagram-LFFYTUFH-CdUsuNgZ.js} +1 -1
  32. package/dashboard/dist/assets/{ishikawaDiagram-PHBUUO56-Kqi4EZ-n.js → ishikawaDiagram-PHBUUO56-BjggRlUx.js} +1 -1
  33. package/dashboard/dist/assets/{journeyDiagram-4ABVD52K-CTfv0Wcr.js → journeyDiagram-4ABVD52K-V4AgexlR.js} +1 -1
  34. package/dashboard/dist/assets/{kanban-definition-K7BYSVSG-Dmx0lgvR.js → kanban-definition-K7BYSVSG-ChlylQRf.js} +1 -1
  35. package/dashboard/dist/assets/{layout-KKRbT2Od.js → layout-DLcz9AmA.js} +1 -1
  36. package/dashboard/dist/assets/{linear-5egaBiw7.js → linear-l2xnSHze.js} +1 -1
  37. package/dashboard/dist/assets/{mermaid.core-C9pF_oFQ.js → mermaid.core-DKO1ytRW.js} +4 -4
  38. package/dashboard/dist/assets/{mindmap-definition-YRQLILUH-C7HXYEXt.js → mindmap-definition-YRQLILUH-DTmTPHrT.js} +1 -1
  39. package/dashboard/dist/assets/{pieDiagram-SKSYHLDU-DkdZm-YP.js → pieDiagram-SKSYHLDU-CwK80y8Y.js} +1 -1
  40. package/dashboard/dist/assets/{quadrantDiagram-337W2JSQ-DkcRJs5F.js → quadrantDiagram-337W2JSQ-Be1xqW_w.js} +1 -1
  41. package/dashboard/dist/assets/{requirementDiagram-Z7DCOOCP-BaTDVYTl.js → requirementDiagram-Z7DCOOCP-JcspXCs0.js} +1 -1
  42. package/dashboard/dist/assets/{sankeyDiagram-WA2Y5GQK-DvPLbGV5.js → sankeyDiagram-WA2Y5GQK-nJb1BInq.js} +1 -1
  43. package/dashboard/dist/assets/{sequenceDiagram-2WXFIKYE-DQoZ2xMK.js → sequenceDiagram-2WXFIKYE-DUrclEgA.js} +1 -1
  44. package/dashboard/dist/assets/{stateDiagram-RAJIS63D-CS4l0OjM.js → stateDiagram-RAJIS63D-CjinnNtF.js} +1 -1
  45. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-yfclw-nM.js +1 -0
  46. package/dashboard/dist/assets/{timeline-definition-YZTLITO2-aC0iCFCW.js → timeline-definition-YZTLITO2-kM-oVLNz.js} +1 -1
  47. package/dashboard/dist/assets/{treemap-KZPCXAKY-Ie-PFjgx.js → treemap-KZPCXAKY-CYziFlrQ.js} +1 -1
  48. package/dashboard/dist/assets/{vennDiagram-LZ73GAT5-CJN3ExTQ.js → vennDiagram-LZ73GAT5-DX0DbxBN.js} +1 -1
  49. package/dashboard/dist/assets/{xychartDiagram-JWTSCODW-DSiDu1CN.js → xychartDiagram-JWTSCODW-BGqM42ZM.js} +1 -1
  50. package/dashboard/dist/index.html +2 -2
  51. package/dist/dashboard/server.d.ts +5 -0
  52. package/dist/dashboard/server.js +2185 -609
  53. package/dist/dashboard/server.js.map +1 -1
  54. package/dist/index.js +2596 -959
  55. package/dist/index.js.map +1 -1
  56. package/examples/playbooks/keep-records-updated.md +14 -8
  57. package/examples/playbooks/read-before-plan.md +8 -5
  58. package/examples/sample-project/_status.md +1 -1
  59. package/examples/sample-project/assignments/design-auth-schema/assignment.md +4 -17
  60. package/examples/sample-project/assignments/design-auth-schema/comments.md +26 -0
  61. package/examples/sample-project/assignments/design-auth-schema/progress.md +20 -0
  62. package/examples/sample-project/assignments/implement-jwt-middleware/assignment.md +4 -17
  63. package/examples/sample-project/assignments/implement-jwt-middleware/comments.md +17 -0
  64. package/examples/sample-project/assignments/implement-jwt-middleware/progress.md +20 -0
  65. package/examples/sample-project/assignments/write-auth-tests/assignment.md +4 -8
  66. package/examples/sample-project/assignments/write-auth-tests/comments.md +10 -0
  67. package/examples/sample-project/assignments/write-auth-tests/progress.md +10 -0
  68. package/package.json +1 -1
  69. package/platforms/claude-code/.claude-plugin/plugin.json +5 -1
  70. package/platforms/claude-code/agents/syntaur-expert.md +46 -15
  71. package/platforms/claude-code/commands/track-session/track-session.md +43 -18
  72. package/platforms/claude-code/hooks/hooks.json +11 -0
  73. package/platforms/claude-code/hooks/session-cleanup.sh +13 -23
  74. package/platforms/claude-code/hooks/session-start.sh +80 -0
  75. package/platforms/claude-code/hooks/statusline.sh +110 -0
  76. package/platforms/claude-code/references/file-ownership.md +15 -3
  77. package/platforms/claude-code/references/protocol-summary.md +19 -5
  78. package/platforms/claude-code/skills/complete-assignment/SKILL.md +14 -0
  79. package/platforms/claude-code/skills/create-assignment/SKILL.md +12 -10
  80. package/platforms/claude-code/skills/grab-assignment/SKILL.md +30 -15
  81. package/platforms/claude-code/skills/plan-assignment/SKILL.md +16 -8
  82. package/platforms/claude-code/skills/syntaur-protocol/SKILL.md +21 -11
  83. package/platforms/codex/.codex-plugin/plugin.json +1 -1
  84. package/platforms/codex/agents/syntaur-operator.md +39 -25
  85. package/platforms/codex/references/file-ownership.md +14 -3
  86. package/platforms/codex/references/protocol-summary.md +19 -5
  87. package/platforms/codex/scripts/resolve-session.sh +49 -0
  88. package/platforms/codex/skills/complete-assignment/SKILL.md +1 -0
  89. package/platforms/codex/skills/create-assignment/SKILL.md +13 -8
  90. package/platforms/codex/skills/grab-assignment/SKILL.md +7 -5
  91. package/platforms/codex/skills/plan-assignment/SKILL.md +8 -4
  92. package/platforms/codex/skills/syntaur-protocol/SKILL.md +26 -13
  93. package/dashboard/dist/assets/channel-DdltvFFH.js +0 -1
  94. package/dashboard/dist/assets/classDiagram-VBA2DB6C-BHqdFE-8.js +0 -1
  95. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-BHqdFE-8.js +0 -1
  96. package/dashboard/dist/assets/clone-CBJOOeOm.js +0 -1
  97. package/dashboard/dist/assets/index-CoVCLSh2.css +0 -1
  98. package/dashboard/dist/assets/index-yyAIuzrP.js +0 -471
  99. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-DkBtE1WJ.js +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/paths.ts","../src/utils/fs.ts","../src/templates/config.ts","../src/dashboard/parser.ts","../src/utils/timestamp.ts","../src/utils/config.ts","../src/lifecycle/types.ts","../src/lifecycle/state-machine.ts","../src/lifecycle/frontmatter.ts","../src/lifecycle/transitions.ts","../src/lifecycle/index.ts","../src/dashboard/help.ts","../src/dashboard/servers.ts","../src/dashboard/scanner.ts","../src/dashboard/api.ts","../src/todos/parser.ts","../src/tui/hooks/useProjects.ts","../src/tui/hooks/useTreeState.ts","../src/tui/hooks/useSearch.ts","../src/tui/colors.ts","../src/tui/components/TreeItem.tsx","../src/tui/components/TreeView.tsx","../src/tui/components/SearchBar.tsx","../src/tui/components/StatusBar.tsx","../src/tui/App.tsx","../src/tui/launch.ts","../src/index.ts","../src/commands/init.ts","../src/utils/playbooks.ts","../src/commands/create-project.ts","../src/utils/slug.ts","../src/utils/uuid.ts","../src/templates/index.ts","../src/templates/manifest.ts","../src/utils/yaml.ts","../src/templates/project.ts","../src/templates/assignment.ts","../src/templates/scratchpad.ts","../src/templates/handoff.ts","../src/templates/progress.ts","../src/templates/comments.ts","../src/templates/decision-record.ts","../src/templates/index-stubs.ts","../src/templates/playbook.ts","../src/templates/cursor-rules.ts","../src/templates/codex-agents.ts","../src/templates/opencode-config.ts","../src/commands/create-assignment.ts","../src/commands/dashboard.ts","../src/dashboard/server.ts","../src/dashboard/watcher.ts","../src/dashboard/api-write.ts","../src/dashboard/acceptance-criteria.ts","../src/dashboard/api-servers.ts","../src/dashboard/api-agent-sessions.ts","../src/dashboard/agent-sessions.ts","../src/dashboard/session-db.ts","../src/dashboard/api-playbooks.ts","../src/dashboard/api-todos.ts","../src/dashboard/api-backup.ts","../src/utils/github-backup.ts","../src/dashboard/autodiscovery.ts","../src/commands/_lifecycle-helper.ts","../src/utils/assignment-resolver.ts","../src/commands/assign.ts","../src/commands/start.ts","../src/commands/complete.ts","../src/commands/block.ts","../src/commands/unblock.ts","../src/commands/review.ts","../src/commands/fail.ts","../src/commands/reopen.ts","../src/commands/install-plugin.ts","../src/utils/install.ts","../src/utils/package-root.ts","../src/utils/prompt.ts","../src/commands/install-codex-plugin.ts","../src/commands/setup.ts","../src/commands/uninstall.ts","../src/commands/setup-adapter.ts","../src/commands/track-session.ts","../src/commands/browse.ts","../src/commands/create-playbook.ts","../src/commands/list-playbooks.ts","../src/commands/todo.ts","../src/commands/backup.ts","../src/commands/doctor.ts","../src/utils/doctor/index.ts","../src/utils/doctor/context.ts","../src/utils/doctor/checks/env.ts","../src/utils/doctor/checks/structure.ts","../src/utils/doctor/checks/project.ts","../src/utils/doctor/checks/assignment.ts","../src/utils/doctor/checks/dashboard.ts","../src/utils/doctor/checks/integrations.ts","../src/utils/doctor/checks/workspace.ts","../src/utils/doctor/registry.ts","../src/utils/doctor/output-human.ts","../src/utils/doctor/output-json.ts","../src/commands/comment.ts","../src/commands/request.ts","../src/cli-default-command.ts","../src/utils/npx-prompt.ts","../src/utils/version.ts"],"sourcesContent":["import { homedir } from 'node:os';\nimport { resolve } from 'node:path';\n\nexport function expandHome(p: string): string {\n if (p.startsWith('~/') || p === '~') {\n return resolve(homedir(), p.slice(2));\n }\n return p;\n}\n\nexport function syntaurRoot(): string {\n const override = process.env.SYNTAUR_HOME;\n if (override && override.length > 0) {\n return resolve(expandHome(override));\n }\n return resolve(homedir(), '.syntaur');\n}\n\nexport function defaultProjectDir(): string {\n return resolve(syntaurRoot(), 'projects');\n}\n\nexport function assignmentsDir(): string {\n return resolve(syntaurRoot(), 'assignments');\n}\n\nexport function serversDir(): string {\n return resolve(syntaurRoot(), 'servers');\n}\n\nexport function playbooksDir(): string {\n return resolve(syntaurRoot(), 'playbooks');\n}\n\nexport function todosDir(): string {\n return resolve(syntaurRoot(), 'todos');\n}\n","import { mkdir, writeFile, access, rename } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\n\nexport async function ensureDir(dir: string): Promise<void> {\n await mkdir(dir, { recursive: true });\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function writeFileSafe(\n filePath: string,\n content: string,\n): Promise<boolean> {\n if (await fileExists(filePath)) {\n return false;\n }\n await ensureDir(dirname(filePath));\n await writeFile(filePath, content, 'utf-8');\n return true;\n}\n\nexport async function writeFileForce(\n filePath: string,\n content: string,\n): Promise<void> {\n const dir = dirname(filePath);\n const tempPath = join(\n dir,\n `.${Math.random().toString(36).slice(2)}.${Date.now()}.tmp`,\n );\n await ensureDir(dir);\n await writeFile(tempPath, content, 'utf-8');\n await rename(tempPath, filePath);\n}\n","export interface ConfigParams {\n defaultProjectDir: string;\n}\n\nexport function renderConfig(params: ConfigParams): string {\n return `---\nversion: \"1.0\"\ndefaultProjectDir: ${params.defaultProjectDir}\nonboarding:\n completed: false\nagentDefaults:\n trustLevel: medium\n autoApprove: false\nbackup:\n repo: null\n categories: projects, playbooks, todos, servers, config\n lastBackup: null\n lastRestore: null\n---\n\n# Syntaur Configuration\n\nGlobal configuration for the Syntaur CLI.\n`;\n}\n","/**\n * Generic frontmatter/markdown parser for all Syntaur file types.\n * Pattern copied from src/lifecycle/frontmatter.ts:3-23 (extractFrontmatter + parseSimpleValue).\n */\n\nexport interface ParsedFile {\n frontmatter: Record<string, string>;\n body: string;\n}\n\n/**\n * Split a markdown file into its frontmatter block and body.\n */\nexport function extractFrontmatter(fileContent: string): [string, string] {\n const match = fileContent.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) {\n return ['', fileContent];\n }\n const frontmatterBlock = match[1];\n const body = fileContent.slice(match[0].length).trim();\n return [frontmatterBlock, body];\n}\n\n/**\n * Parse a simple YAML value, handling null and quoted strings.\n */\nfunction parseSimpleValue(raw: string): string | null {\n const trimmed = raw.trim();\n if (trimmed === 'null' || trimmed === '') return null;\n if (\n (trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n ) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n}\n\n/**\n * Extract a top-level scalar field from frontmatter text.\n */\nexport function getField(frontmatter: string, key: string): string | null {\n const match = frontmatter.match(new RegExp(`^${key}:\\\\s*(.*)$`, 'm'));\n if (!match) return null;\n return parseSimpleValue(match[1]);\n}\n\n/**\n * Extract an indented scalar field (one level deep) from frontmatter text.\n */\nexport function getNestedField(frontmatter: string, parent: string, key: string): string | null {\n const parentRegex = new RegExp(`^${parent}:\\\\s*\\\\n((?:\\\\s+.*\\\\n?)*)`, 'm');\n const parentMatch = frontmatter.match(parentRegex);\n if (!parentMatch) return null;\n const block = parentMatch[1];\n const fieldMatch = block.match(new RegExp(`^\\\\s+${key}:\\\\s*(.*)$`, 'm'));\n if (!fieldMatch) return null;\n return parseSimpleValue(fieldMatch[1]);\n}\n\n/**\n * Parse a YAML list field (e.g., tags, dependsOn, relatedAssignments).\n */\nfunction parseListField(frontmatter: string, fieldName: string): string[] {\n const inlineMatch = frontmatter.match(new RegExp(`^${fieldName}:\\\\s*\\\\[\\\\s*\\\\]`, 'm'));\n if (inlineMatch) return [];\n\n const results: string[] = [];\n const blockMatch = frontmatter.match(\n new RegExp(`^${fieldName}:\\\\s*\\\\n((?:\\\\s+-\\\\s+.*\\\\n?)*)`, 'm'),\n );\n if (blockMatch) {\n let item: RegExpExecArray | null;\n const regex = /^\\s+-\\s+(.+)$/gm;\n while ((item = regex.exec(blockMatch[1])) !== null) {\n results.push(item[1].trim());\n }\n }\n return results;\n}\n\n// --- Project Parser ---\n\nexport interface ParsedProject {\n id: string;\n slug: string;\n title: string;\n archived: boolean;\n archivedAt: string | null;\n archivedReason: string | null;\n statusOverride: string | null;\n created: string;\n updated: string;\n tags: string[];\n workspace: string | null;\n body: string;\n}\n\nexport function parseProject(fileContent: string): ParsedProject {\n const [fm, body] = extractFrontmatter(fileContent);\n return {\n id: getField(fm, 'id') ?? '',\n slug: getField(fm, 'slug') ?? '',\n title: getField(fm, 'title') ?? '',\n archived: getField(fm, 'archived') === 'true',\n archivedAt: getField(fm, 'archivedAt'),\n archivedReason: getField(fm, 'archivedReason'),\n statusOverride: getField(fm, 'statusOverride'),\n created: getField(fm, 'created') ?? '',\n updated: getField(fm, 'updated') ?? '',\n tags: parseListField(fm, 'tags'),\n workspace: getField(fm, 'workspace'),\n body,\n };\n}\n\n// --- Status Parser (for _status.md) ---\n\nexport interface ParsedStatus {\n project: string;\n status: string;\n progress: Record<string, number> & { total: number };\n needsAttention: {\n blockedCount: number;\n failedCount: number;\n openQuestions: number;\n };\n body: string;\n}\n\nexport function parseStatus(fileContent: string): ParsedStatus {\n const [fm, body] = extractFrontmatter(fileContent);\n\n // Dynamically parse progress fields\n const progress: Record<string, number> & { total: number } = { total: 0 };\n const progressMatch = fm.match(/^progress:\\s*\\n((?:\\s+.*\\n?)*)/m);\n if (progressMatch) {\n const lines = progressMatch[1].split('\\n');\n for (const line of lines) {\n const kv = line.match(/^\\s+(\\w+):\\s*(\\d+)/);\n if (kv) {\n progress[kv[1]] = parseInt(kv[2], 10);\n }\n }\n }\n\n return {\n project: getField(fm, 'project') ?? '',\n status: getField(fm, 'status') ?? 'pending',\n progress,\n needsAttention: {\n blockedCount: parseInt(getNestedField(fm, 'needsAttention', 'blockedCount') ?? '0', 10),\n failedCount: parseInt(getNestedField(fm, 'needsAttention', 'failedCount') ?? '0', 10),\n openQuestions: parseInt(getNestedField(fm, 'needsAttention', 'openQuestions') ?? '0', 10),\n },\n body,\n };\n}\n\n// --- Assignment Summary Parser ---\n\nexport interface ParsedAssignmentSummary {\n id: string;\n slug: string;\n title: string;\n status: string;\n priority: string;\n assignee: string | null;\n dependsOn: string[];\n links: string[];\n updated: string;\n}\n\nexport function parseAssignmentSummary(fileContent: string): ParsedAssignmentSummary {\n const [fm] = extractFrontmatter(fileContent);\n return {\n id: getField(fm, 'id') ?? '',\n slug: getField(fm, 'slug') ?? '',\n title: getField(fm, 'title') ?? '',\n status: getField(fm, 'status') ?? 'pending',\n priority: getField(fm, 'priority') ?? 'medium',\n assignee: getField(fm, 'assignee'),\n dependsOn: parseListField(fm, 'dependsOn'),\n links: parseListField(fm, 'links'),\n updated: getField(fm, 'updated') ?? '',\n };\n}\n\n// --- Full Assignment Parser ---\n\nexport interface ParsedAssignmentFull {\n id: string;\n slug: string;\n title: string;\n project: string | null;\n type: string | null;\n status: string;\n priority: string;\n assignee: string | null;\n dependsOn: string[];\n links: string[];\n blockedReason: string | null;\n workspace: {\n repository: string | null;\n worktreePath: string | null;\n branch: string | null;\n parentBranch: string | null;\n };\n externalIds: Array<{ system: string; id: string; url: string }>;\n tags: string[];\n created: string;\n updated: string;\n body: string;\n}\n\nfunction parseExternalIds(frontmatter: string): Array<{ system: string; id: string; url: string }> {\n const inlineMatch = frontmatter.match(/^externalIds:\\s*\\[\\s*\\]/m);\n if (inlineMatch) return [];\n\n const results: Array<{ system: string; id: string; url: string }> = [];\n const blockMatch = frontmatter.match(\n /^externalIds:\\s*\\n((?:\\s+-\\s+[\\s\\S]*?)(?=^\\w|\\n---))/m,\n );\n if (!blockMatch) return [];\n\n const itemBlocks = blockMatch[1].split(/\\n\\s+-\\s+/).filter(Boolean);\n for (const block of itemBlocks) {\n const lines = block.split('\\n');\n const entry: Record<string, string> = {};\n for (const line of lines) {\n const colonIdx = line.indexOf(':');\n if (colonIdx < 0) continue;\n const key = line.slice(0, colonIdx).trim().replace(/^-\\s+/, '');\n const value = line.slice(colonIdx + 1).trim();\n if (key && value) {\n entry[key] = value;\n }\n }\n if (entry['system'] && entry['id'] && entry['url']) {\n results.push({\n system: entry['system'],\n id: entry['id'],\n url: entry['url'],\n });\n }\n }\n return results;\n}\n\nexport function parseAssignmentFull(fileContent: string): ParsedAssignmentFull {\n const [fm, body] = extractFrontmatter(fileContent);\n return {\n id: getField(fm, 'id') ?? '',\n slug: getField(fm, 'slug') ?? '',\n title: getField(fm, 'title') ?? '',\n project: getField(fm, 'project'),\n type: getField(fm, 'type'),\n status: getField(fm, 'status') ?? 'pending',\n priority: getField(fm, 'priority') ?? 'medium',\n assignee: getField(fm, 'assignee'),\n dependsOn: parseListField(fm, 'dependsOn'),\n links: parseListField(fm, 'links'),\n blockedReason: getField(fm, 'blockedReason'),\n workspace: {\n repository: getNestedField(fm, 'workspace', 'repository'),\n worktreePath: getNestedField(fm, 'workspace', 'worktreePath'),\n branch: getNestedField(fm, 'workspace', 'branch'),\n parentBranch: getNestedField(fm, 'workspace', 'parentBranch'),\n },\n externalIds: parseExternalIds(fm),\n tags: parseListField(fm, 'tags'),\n created: getField(fm, 'created') ?? '',\n updated: getField(fm, 'updated') ?? '',\n body,\n };\n}\n\n// --- Plan Parser ---\n\nexport interface ParsedPlan {\n assignment: string;\n status: string;\n created: string;\n updated: string;\n body: string;\n}\n\nexport function parsePlan(fileContent: string): ParsedPlan {\n const [fm, body] = extractFrontmatter(fileContent);\n return {\n assignment: getField(fm, 'assignment') ?? '',\n status: getField(fm, 'status') ?? '',\n created: getField(fm, 'created') ?? '',\n updated: getField(fm, 'updated') ?? '',\n body,\n };\n}\n\n// --- Scratchpad Parser ---\n\nexport interface ParsedScratchpad {\n assignment: string;\n updated: string;\n body: string;\n}\n\nexport function parseScratchpad(fileContent: string): ParsedScratchpad {\n const [fm, body] = extractFrontmatter(fileContent);\n return {\n assignment: getField(fm, 'assignment') ?? '',\n updated: getField(fm, 'updated') ?? '',\n body,\n };\n}\n\n// --- Handoff Parser ---\n\nexport interface ParsedHandoff {\n assignment: string;\n handoffCount: number;\n updated: string;\n body: string;\n}\n\nexport function parseHandoff(fileContent: string): ParsedHandoff {\n const [fm, body] = extractFrontmatter(fileContent);\n return {\n assignment: getField(fm, 'assignment') ?? '',\n handoffCount: parseInt(getField(fm, 'handoffCount') ?? '0', 10),\n updated: getField(fm, 'updated') ?? '',\n body,\n };\n}\n\n// --- Decision Record Parser ---\n\nexport interface ParsedDecisionRecord {\n assignment: string;\n decisionCount: number;\n updated: string;\n body: string;\n}\n\nexport function parseDecisionRecord(fileContent: string): ParsedDecisionRecord {\n const [fm, body] = extractFrontmatter(fileContent);\n return {\n assignment: getField(fm, 'assignment') ?? '',\n decisionCount: parseInt(getField(fm, 'decisionCount') ?? '0', 10),\n updated: getField(fm, 'updated') ?? '',\n body,\n };\n}\n\n// --- Comments Parser ---\n\nexport interface ParsedComment {\n id: string;\n timestamp: string;\n author: string;\n type: 'question' | 'note' | 'feedback';\n body: string;\n replyTo?: string;\n resolved?: boolean;\n}\n\nexport interface ParsedComments {\n assignment: string;\n entryCount: number;\n updated: string;\n entries: ParsedComment[];\n body: string;\n}\n\nexport function parseComments(fileContent: string): ParsedComments {\n const [fm, body] = extractFrontmatter(fileContent);\n const entries: ParsedComment[] = [];\n const sections = body.split(/^## /m).slice(1);\n for (const section of sections) {\n const newlineIdx = section.indexOf('\\n');\n if (newlineIdx === -1) continue;\n const id = section.slice(0, newlineIdx).trim();\n const rest = section.slice(newlineIdx + 1);\n const headerMatch = rest.match(\n /^\\s*\\*\\*Recorded:\\*\\*\\s*(.*)\\n\\*\\*Author:\\*\\*\\s*(.*)\\n\\*\\*Type:\\*\\*\\s*(question|note|feedback)(?:\\n\\*\\*Reply to:\\*\\*\\s*(.*))?(?:\\n\\*\\*Resolved:\\*\\*\\s*(true|false))?\\n+([\\s\\S]*)$/,\n );\n if (!headerMatch) continue;\n const [, timestamp, author, type, replyTo, resolvedStr, entryBody] = headerMatch;\n const entry: ParsedComment = {\n id,\n timestamp: timestamp.trim(),\n author: author.trim(),\n type: type as 'question' | 'note' | 'feedback',\n body: entryBody.trim(),\n };\n if (replyTo) entry.replyTo = replyTo.trim();\n if (resolvedStr) entry.resolved = resolvedStr === 'true';\n entries.push(entry);\n }\n return {\n assignment: getField(fm, 'assignment') ?? '',\n entryCount: parseInt(getField(fm, 'entryCount') ?? '0', 10),\n updated: getField(fm, 'updated') ?? '',\n entries,\n body,\n };\n}\n\n// --- Progress Parser ---\n\nexport interface ProgressEntry {\n timestamp: string;\n body: string;\n}\n\nexport interface ParsedProgress {\n assignment: string;\n entryCount: number;\n updated: string;\n entries: ProgressEntry[];\n body: string;\n}\n\nexport function parseProgress(fileContent: string): ParsedProgress {\n const [fm, body] = extractFrontmatter(fileContent);\n const entries: ProgressEntry[] = [];\n const sections = body.split(/^## /m).slice(1);\n for (const section of sections) {\n const newlineIdx = section.indexOf('\\n');\n if (newlineIdx === -1) continue;\n const timestamp = section.slice(0, newlineIdx).trim();\n const entryBody = section.slice(newlineIdx + 1).trim();\n entries.push({ timestamp, body: entryBody });\n }\n return {\n assignment: getField(fm, 'assignment') ?? '',\n entryCount: parseInt(getField(fm, 'entryCount') ?? '0', 10),\n updated: getField(fm, 'updated') ?? '',\n entries,\n body,\n };\n}\n\n// --- Resource Parser ---\n\nexport interface ParsedResource {\n name: string;\n source: string;\n category: string;\n relatedAssignments: string[];\n created: string;\n updated: string;\n body: string;\n}\n\nexport function parseResource(fileContent: string): ParsedResource {\n const [fm, body] = extractFrontmatter(fileContent);\n return {\n name: getField(fm, 'name') ?? '',\n source: getField(fm, 'source') ?? '',\n category: getField(fm, 'category') ?? '',\n relatedAssignments: parseListField(fm, 'relatedAssignments'),\n created: getField(fm, 'created') ?? '',\n updated: getField(fm, 'updated') ?? '',\n body,\n };\n}\n\n// --- Memory Parser ---\n\nexport interface ParsedMemory {\n name: string;\n source: string;\n scope: string;\n sourceAssignment: string | null;\n relatedAssignments: string[];\n created: string;\n updated: string;\n body: string;\n}\n\nexport function parseMemory(fileContent: string): ParsedMemory {\n const [fm, body] = extractFrontmatter(fileContent);\n return {\n name: getField(fm, 'name') ?? '',\n source: getField(fm, 'source') ?? '',\n scope: getField(fm, 'scope') ?? '',\n sourceAssignment: getField(fm, 'sourceAssignment'),\n relatedAssignments: parseListField(fm, 'relatedAssignments'),\n created: getField(fm, 'created') ?? '',\n updated: getField(fm, 'updated') ?? '',\n body,\n };\n}\n\n// --- Playbook Parser ---\n\nexport interface ParsedPlaybook {\n slug: string;\n name: string;\n description: string;\n whenToUse: string;\n created: string;\n updated: string;\n tags: string[];\n body: string;\n}\n\nexport function parsePlaybook(fileContent: string): ParsedPlaybook {\n const [fm, body] = extractFrontmatter(fileContent);\n return {\n slug: getField(fm, 'slug') ?? '',\n name: getField(fm, 'name') ?? '',\n description: getField(fm, 'description') ?? '',\n whenToUse: getField(fm, 'when_to_use') ?? '',\n created: getField(fm, 'created') ?? '',\n updated: getField(fm, 'updated') ?? '',\n tags: parseListField(fm, 'tags'),\n body,\n };\n}\n\n// --- Mermaid Graph Extractor ---\n\n/**\n * Extract the mermaid code block from _status.md body content.\n * Returns null if no mermaid block is found.\n */\nexport function extractMermaidGraph(body: string): string | null {\n const match = body.match(/```mermaid\\n([\\s\\S]*?)```/);\n return match ? match[1].trim() : null;\n}\n","export function nowTimestamp(): string {\n return new Date().toISOString().replace(/\\.\\d{3}Z$/, 'Z');\n}\n","import { readFile } from 'node:fs/promises';\nimport { resolve, isAbsolute } from 'node:path';\nimport { syntaurRoot, defaultProjectDir, expandHome } from './paths.js';\nimport { fileExists, writeFileForce } from './fs.js';\nimport { renderConfig } from '../templates/config.js';\n\nexport interface StatusDefinition {\n id: string;\n label: string;\n description?: string;\n color?: string;\n icon?: string;\n terminal?: boolean;\n}\n\nexport interface StatusTransition {\n from: string;\n command: string;\n to: string;\n label?: string;\n description?: string;\n requiresReason?: boolean;\n}\n\nexport interface StatusConfig {\n statuses: StatusDefinition[];\n order: string[];\n transitions: StatusTransition[];\n}\n\nexport interface TypeDefinition {\n id: string;\n label?: string;\n description?: string;\n color?: string;\n icon?: string;\n}\n\nexport interface TypesConfig {\n definitions: TypeDefinition[];\n default: string;\n}\n\nexport const DEFAULT_ASSIGNMENT_TYPES: TypesConfig = {\n definitions: [\n { id: 'feature', label: 'Feature' },\n { id: 'bug', label: 'Bug' },\n { id: 'refactor', label: 'Refactor' },\n { id: 'research', label: 'Research' },\n { id: 'chore', label: 'Chore' },\n ],\n default: 'feature',\n};\n\nexport interface IntegrationConfig {\n claudePluginDir: string | null;\n codexPluginDir: string | null;\n codexMarketplacePath: string | null;\n}\n\nexport interface OnboardingConfig {\n completed: boolean;\n}\n\nexport interface BackupConfig {\n repo: string | null;\n categories: string;\n lastBackup: string | null;\n lastRestore: string | null;\n}\n\nexport interface SyntaurConfig {\n version: string;\n defaultProjectDir: string;\n onboarding: OnboardingConfig;\n agentDefaults: {\n trustLevel: 'low' | 'medium' | 'high';\n autoApprove: boolean;\n };\n integrations: IntegrationConfig;\n backup: BackupConfig | null;\n statuses: StatusConfig | null;\n types: TypesConfig | null;\n}\n\nconst DEFAULT_CONFIG: SyntaurConfig = {\n version: '2.0',\n defaultProjectDir: defaultProjectDir(),\n onboarding: {\n completed: false,\n },\n agentDefaults: {\n trustLevel: 'medium',\n autoApprove: false,\n },\n integrations: {\n claudePluginDir: null,\n codexPluginDir: null,\n codexMarketplacePath: null,\n },\n backup: null,\n statuses: null,\n types: null,\n};\n\nfunction parseFrontmatter(content: string): Record<string, string> {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return {};\n const result: Record<string, string> = {};\n const lines = match[1].split('\\n');\n let currentParent: string | null = null;\n for (const line of lines) {\n if (line.trim() === '') continue;\n const indent = line.length - line.trimStart().length;\n const colonIndex = line.indexOf(':');\n if (colonIndex < 0) continue;\n const key = line.slice(0, colonIndex).trim();\n const value = line.slice(colonIndex + 1).trim();\n if (indent === 0) {\n if (value === '' || value === undefined) {\n currentParent = key;\n } else {\n currentParent = null;\n result[key] = value.replace(/^[\"']|[\"']$/g, '');\n }\n } else if (indent > 0 && currentParent) {\n result[`${currentParent}.${key}`] = value.replace(/^[\"']|[\"']$/g, '');\n }\n }\n return result;\n}\n\nfunction parseStatusConfig(content: string): StatusConfig | null {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return null;\n const fmBlock = match[1];\n\n // Check if there's a top-level statuses: section\n const statusesStart = fmBlock.match(/^statuses:\\s*$/m);\n if (!statusesStart) return null;\n\n // Extract the statuses block (everything indented after \"statuses:\")\n const startIdx = fmBlock.indexOf(statusesStart[0]) + statusesStart[0].length;\n const remaining = fmBlock.slice(startIdx);\n\n const statuses: StatusDefinition[] = [];\n const order: string[] = [];\n const transitions: StatusTransition[] = [];\n\n // Parse sub-sections: definitions, order, transitions\n let currentSection: 'definitions' | 'order' | 'transitions' | null = null;\n const lines = remaining.split('\\n');\n\n function parseListEntry(lineIdx: number, baseIndent: number): { entry: Record<string, string>; consumed: number } {\n const entry: Record<string, string> = {};\n const firstLine = lines[lineIdx].trimStart().slice(2).trim();\n const colonIdx = firstLine.indexOf(':');\n if (colonIdx > 0) {\n entry[firstLine.slice(0, colonIdx).trim()] = firstLine.slice(colonIdx + 1).trim();\n }\n let consumed = 1;\n for (let i = lineIdx + 1; i < lines.length; i++) {\n const next = lines[i];\n const nextTrimmed = next.trimStart();\n const nextIndent = next.length - nextTrimmed.length;\n if (nextIndent <= baseIndent || nextTrimmed.startsWith('- ')) break;\n const ci = nextTrimmed.indexOf(':');\n if (ci > 0) {\n entry[nextTrimmed.slice(0, ci).trim()] = nextTrimmed.slice(ci + 1).trim();\n }\n consumed++;\n }\n return { entry, consumed };\n }\n\n for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n const line = lines[lineIdx];\n const trimmed = line.trimStart();\n const indent = line.length - trimmed.length;\n\n // Top-level key under statuses (indent 2)\n if (indent === 2 && trimmed.endsWith(':')) {\n const key = trimmed.slice(0, -1).trim();\n if (key === 'definitions') currentSection = 'definitions';\n else if (key === 'order') currentSection = 'order';\n else if (key === 'transitions') currentSection = 'transitions';\n else currentSection = null;\n continue;\n }\n\n // Stop if we hit a new top-level key (no indent)\n if (indent === 0 && trimmed.includes(':')) break;\n\n if (currentSection === 'order' && indent >= 4 && trimmed.startsWith('- ')) {\n order.push(trimmed.slice(2).trim());\n continue;\n }\n\n if (currentSection === 'definitions' && indent >= 4 && trimmed.startsWith('- ')) {\n const { entry, consumed } = parseListEntry(lineIdx, indent);\n if (entry['id']) {\n statuses.push({\n id: entry['id'],\n label: entry['label'] ?? entry['id'],\n description: entry['description'],\n color: entry['color'],\n icon: entry['icon'],\n terminal: entry['terminal'] === 'true',\n });\n }\n lineIdx += consumed - 1; // skip consumed continuation lines\n continue;\n }\n\n if (currentSection === 'transitions' && indent >= 4 && trimmed.startsWith('- ')) {\n const { entry, consumed } = parseListEntry(lineIdx, indent);\n if (entry['from'] && entry['command'] && entry['to']) {\n transitions.push({\n from: entry['from'],\n command: entry['command'],\n to: entry['to'],\n label: entry['label'],\n description: entry['description'],\n requiresReason: entry['requiresReason'] === 'true',\n });\n }\n lineIdx += consumed - 1;\n continue;\n }\n }\n\n if (statuses.length === 0) return null;\n\n return {\n statuses,\n order: order.length > 0 ? order : statuses.map((s) => s.id),\n transitions,\n };\n}\n\nfunction serializeStatusConfig(statuses: StatusConfig): string {\n const lines: string[] = [];\n lines.push('statuses:');\n\n // definitions\n lines.push(' definitions:');\n for (const s of statuses.statuses) {\n lines.push(` - id: ${s.id}`);\n lines.push(` label: ${s.label}`);\n if (s.description) lines.push(` description: ${s.description}`);\n if (s.color) lines.push(` color: ${s.color}`);\n if (s.icon) lines.push(` icon: ${s.icon}`);\n if (s.terminal) lines.push(` terminal: true`);\n }\n\n // order\n lines.push(' order:');\n for (const id of statuses.order) {\n lines.push(` - ${id}`);\n }\n\n // transitions\n if (statuses.transitions.length > 0) {\n lines.push(' transitions:');\n for (const t of statuses.transitions) {\n lines.push(` - from: ${t.from}`);\n lines.push(` command: ${t.command}`);\n lines.push(` to: ${t.to}`);\n if (t.label) lines.push(` label: ${t.label}`);\n if (t.description) lines.push(` description: ${t.description}`);\n if (t.requiresReason) lines.push(` requiresReason: true`);\n }\n }\n\n return lines.join('\\n');\n}\n\nfunction serializeIntegrationConfig(integrations: IntegrationConfig): string | null {\n const lines: string[] = [];\n\n if (integrations.claudePluginDir) {\n lines.push(` claudePluginDir: ${integrations.claudePluginDir}`);\n }\n if (integrations.codexPluginDir) {\n lines.push(` codexPluginDir: ${integrations.codexPluginDir}`);\n }\n if (integrations.codexMarketplacePath) {\n lines.push(` codexMarketplacePath: ${integrations.codexMarketplacePath}`);\n }\n\n if (lines.length === 0) {\n return null;\n }\n\n return ['integrations:', ...lines].join('\\n');\n}\n\nfunction serializeOnboardingConfig(onboarding: OnboardingConfig): string {\n return ['onboarding:', ` completed: ${onboarding.completed ? 'true' : 'false'}`].join('\\n');\n}\n\nfunction serializeBackupConfig(backup: BackupConfig): string {\n const lines: string[] = ['backup:'];\n lines.push(` repo: ${backup.repo ?? 'null'}`);\n lines.push(` categories: ${backup.categories}`);\n lines.push(` lastBackup: ${backup.lastBackup ?? 'null'}`);\n lines.push(` lastRestore: ${backup.lastRestore ?? 'null'}`);\n return lines.join('\\n');\n}\n\nfunction stripTopLevelBlock(fmBlock: string, key: string): string {\n const blockStart = fmBlock.match(new RegExp(`^${key}:\\\\s*$`, 'm'));\n if (!blockStart) {\n return fmBlock.replace(/\\n+$/, '');\n }\n\n const startIdx = fmBlock.indexOf(blockStart[0]);\n const before = fmBlock.slice(0, startIdx);\n const after = fmBlock.slice(startIdx + blockStart[0].length);\n const remaining = after.split('\\n');\n let endIdx = 0;\n\n for (let i = 0; i < remaining.length; i++) {\n const line = remaining[i];\n if (line.trim() === '') {\n endIdx = i + 1;\n continue;\n }\n if (line.length > 0 && line[0] !== ' ') {\n break;\n }\n endIdx = i + 1;\n }\n\n return (before + remaining.slice(endIdx).join('\\n')).replace(/\\n+$/, '');\n}\n\nfunction parseOptionalAbsolutePath(\n value: string | undefined,\n fieldName: string,\n): string | null {\n if (!value) {\n return null;\n }\n\n const expanded = expandHome(String(value));\n if (!isAbsolute(expanded)) {\n console.warn(\n `Warning: config.md ${fieldName} is not an absolute path (\"${value}\"), ignoring it`,\n );\n return null;\n }\n\n return resolve(expanded);\n}\n\nexport async function writeStatusConfig(statuses: StatusConfig): Promise<void> {\n const configPath = resolve(syntaurRoot(), 'config.md');\n const statusBlock = serializeStatusConfig(statuses);\n\n if (!(await fileExists(configPath))) {\n // Create new config file with defaults + statuses\n const content = `---\\nversion: \"2.0\"\\ndefaultProjectDir: ~/projects\\n${statusBlock}\\n---\\n`;\n await writeFileForce(configPath, content);\n return;\n }\n\n const existing = await readFile(configPath, 'utf-8');\n const fmMatch = existing.match(/^(---\\n)([\\s\\S]*?)\\n(---)/);\n if (!fmMatch) {\n // No frontmatter — wrap in new frontmatter\n const content = `---\\nversion: \"2.0\"\\n${statusBlock}\\n---\\n${existing}`;\n await writeFileForce(configPath, content);\n return;\n }\n\n const fmBlock = fmMatch[2];\n const afterFrontmatter = existing.slice(fmMatch[0].length);\n\n // Remove existing statuses: block from frontmatter\n const statusesStart = fmBlock.match(/^statuses:\\s*$/m);\n let cleanedFm: string;\n if (statusesStart) {\n const startIdx = fmBlock.indexOf(statusesStart[0]);\n const before = fmBlock.slice(0, startIdx);\n const after = fmBlock.slice(startIdx + statusesStart[0].length);\n // Skip all indented lines (belonging to statuses block)\n const remaining = after.split('\\n');\n let endIdx = 0;\n for (let i = 0; i < remaining.length; i++) {\n const line = remaining[i];\n if (line.trim() === '') { endIdx = i + 1; continue; }\n if (line.length > 0 && line[0] !== ' ') break;\n endIdx = i + 1;\n }\n cleanedFm = before + remaining.slice(endIdx).join('\\n');\n } else {\n cleanedFm = fmBlock;\n }\n\n // Trim trailing whitespace/newlines from cleaned frontmatter\n cleanedFm = cleanedFm.replace(/\\n+$/, '');\n\n const newContent = `---\\n${cleanedFm}\\n${statusBlock}\\n---${afterFrontmatter}`;\n await writeFileForce(configPath, newContent);\n}\n\nexport async function deleteStatusConfig(): Promise<void> {\n const configPath = resolve(syntaurRoot(), 'config.md');\n if (!(await fileExists(configPath))) return;\n\n const existing = await readFile(configPath, 'utf-8');\n const fmMatch = existing.match(/^(---\\n)([\\s\\S]*?)\\n(---)/);\n if (!fmMatch) return;\n\n const fmBlock = fmMatch[2];\n const afterFrontmatter = existing.slice(fmMatch[0].length);\n const cleanedFm = stripTopLevelBlock(fmBlock, 'statuses');\n\n const newContent = `---\\n${cleanedFm}\\n---${afterFrontmatter}`;\n await writeFileForce(configPath, newContent);\n}\n\nexport async function updateIntegrationConfig(\n integrations: Partial<IntegrationConfig>,\n): Promise<void> {\n const configPath = resolve(syntaurRoot(), 'config.md');\n const nextIntegrations: IntegrationConfig = {\n ...(await readConfig()).integrations,\n ...integrations,\n };\n\n const integrationBlock = serializeIntegrationConfig(nextIntegrations);\n const existing = await fileExists(configPath)\n ? await readFile(configPath, 'utf-8')\n : renderConfig({ defaultProjectDir: defaultProjectDir() });\n\n const fmMatch = existing.match(/^(---\\n)([\\s\\S]*?)\\n(---)/);\n if (!fmMatch) {\n const content = `---\\nversion: \"2.0\"\\ndefaultProjectDir: ${defaultProjectDir()}\\n${integrationBlock ?? ''}\\n---\\n${existing}`;\n await writeFileForce(configPath, content.replace(/\\n\\n---/, '\\n---'));\n return;\n }\n\n const fmBlock = fmMatch[2];\n const afterFrontmatter = existing.slice(fmMatch[0].length);\n const cleanedFm = stripTopLevelBlock(fmBlock, 'integrations');\n const newFm = integrationBlock\n ? `${cleanedFm}\\n${integrationBlock}`.replace(/^\\n+/, '')\n : cleanedFm;\n const normalizedFm = newFm.replace(/\\n+$/, '');\n const newContent = `---\\n${normalizedFm}\\n---${afterFrontmatter}`;\n await writeFileForce(configPath, newContent);\n}\n\nexport async function updateOnboardingConfig(\n onboarding: Partial<OnboardingConfig>,\n): Promise<void> {\n const configPath = resolve(syntaurRoot(), 'config.md');\n const nextOnboarding: OnboardingConfig = {\n ...(await readConfig()).onboarding,\n ...onboarding,\n };\n\n const onboardingBlock = serializeOnboardingConfig(nextOnboarding);\n const existing = await fileExists(configPath)\n ? await readFile(configPath, 'utf-8')\n : renderConfig({ defaultProjectDir: defaultProjectDir() });\n\n const fmMatch = existing.match(/^(---\\n)([\\s\\S]*?)\\n(---)/);\n if (!fmMatch) {\n const content = `---\\nversion: \"2.0\"\\ndefaultProjectDir: ${defaultProjectDir()}\\n${onboardingBlock}\\n---\\n${existing}`;\n await writeFileForce(configPath, content.replace(/\\n\\n---/, '\\n---'));\n return;\n }\n\n const fmBlock = fmMatch[2];\n const afterFrontmatter = existing.slice(fmMatch[0].length);\n const cleanedFm = stripTopLevelBlock(fmBlock, 'onboarding');\n const newFm = `${cleanedFm}\\n${onboardingBlock}`.replace(/^\\n+/, '');\n const normalizedFm = newFm.replace(/\\n+$/, '');\n const newContent = `---\\n${normalizedFm}\\n---${afterFrontmatter}`;\n await writeFileForce(configPath, newContent);\n}\n\nexport async function updateBackupConfig(\n backup: Partial<BackupConfig>,\n): Promise<void> {\n const configPath = resolve(syntaurRoot(), 'config.md');\n const current = (await readConfig()).backup;\n const nextBackup: BackupConfig = {\n repo: current?.repo ?? null,\n categories: current?.categories ?? 'projects, playbooks, todos, servers, config',\n lastBackup: current?.lastBackup ?? null,\n lastRestore: current?.lastRestore ?? null,\n ...backup,\n };\n\n const backupBlock = serializeBackupConfig(nextBackup);\n const existing = await fileExists(configPath)\n ? await readFile(configPath, 'utf-8')\n : renderConfig({ defaultProjectDir: defaultProjectDir() });\n\n const fmMatch = existing.match(/^(---\\n)([\\s\\S]*?)\\n(---)/);\n if (!fmMatch) {\n const content = `---\\nversion: \"2.0\"\\ndefaultProjectDir: ${defaultProjectDir()}\\n${backupBlock}\\n---\\n${existing}`;\n await writeFileForce(configPath, content.replace(/\\n\\n---/, '\\n---'));\n return;\n }\n\n const fmBlock = fmMatch[2];\n const afterFrontmatter = existing.slice(fmMatch[0].length);\n const cleanedFm = stripTopLevelBlock(fmBlock, 'backup');\n const newFm = `${cleanedFm}\\n${backupBlock}`.replace(/^\\n+/, '');\n const normalizedFm = newFm.replace(/\\n+$/, '');\n const newContent = `---\\n${normalizedFm}\\n---${afterFrontmatter}`;\n await writeFileForce(configPath, newContent);\n}\n\nexport async function readConfig(): Promise<SyntaurConfig> {\n const configPath = resolve(syntaurRoot(), 'config.md');\n if (!(await fileExists(configPath))) {\n return { ...DEFAULT_CONFIG };\n }\n const content = await readFile(configPath, 'utf-8');\n const fm = parseFrontmatter(content);\n\n if (Object.keys(fm).length === 0) {\n console.warn('Warning: ~/.syntaur/config.md has malformed frontmatter, using defaults');\n return { ...DEFAULT_CONFIG };\n }\n\n let projectDir = fm['defaultProjectDir']\n ? expandHome(String(fm['defaultProjectDir']))\n : DEFAULT_CONFIG.defaultProjectDir;\n if (!isAbsolute(projectDir)) {\n console.warn(\n `Warning: config.md defaultProjectDir is not an absolute path (\"${fm['defaultProjectDir']}\"), using default`,\n );\n projectDir = DEFAULT_CONFIG.defaultProjectDir;\n }\n\n return {\n version: fm['version'] || DEFAULT_CONFIG.version,\n defaultProjectDir: projectDir,\n onboarding: {\n completed: fm['onboarding.completed'] === 'true',\n },\n agentDefaults: {\n trustLevel:\n (fm['agentDefaults.trustLevel'] as SyntaurConfig['agentDefaults']['trustLevel']) ||\n DEFAULT_CONFIG.agentDefaults.trustLevel,\n autoApprove:\n fm['agentDefaults.autoApprove'] === 'true' ||\n DEFAULT_CONFIG.agentDefaults.autoApprove,\n },\n integrations: {\n claudePluginDir: parseOptionalAbsolutePath(\n fm['integrations.claudePluginDir'],\n 'integrations.claudePluginDir',\n ),\n codexPluginDir: parseOptionalAbsolutePath(\n fm['integrations.codexPluginDir'],\n 'integrations.codexPluginDir',\n ),\n codexMarketplacePath: parseOptionalAbsolutePath(\n fm['integrations.codexMarketplacePath'],\n 'integrations.codexMarketplacePath',\n ),\n },\n backup: fm['backup.repo'] || fm['backup.categories']\n ? {\n repo: fm['backup.repo'] && fm['backup.repo'] !== 'null' ? fm['backup.repo'] : null,\n categories: fm['backup.categories'] || 'projects, playbooks, todos, servers, config',\n lastBackup: fm['backup.lastBackup'] && fm['backup.lastBackup'] !== 'null' ? fm['backup.lastBackup'] : null,\n lastRestore: fm['backup.lastRestore'] && fm['backup.lastRestore'] !== 'null' ? fm['backup.lastRestore'] : null,\n }\n : null,\n statuses: parseStatusConfig(content),\n types: null,\n };\n}\n\nexport function getAssignmentTypes(config: SyntaurConfig): TypesConfig {\n return config.types ?? DEFAULT_ASSIGNMENT_TYPES;\n}\n","export type AssignmentStatus = string;\n\nexport type TransitionCommand = string;\n\nexport const DEFAULT_STATUSES = [\n 'pending',\n 'in_progress',\n 'blocked',\n 'review',\n 'completed',\n 'failed',\n] as const;\n\nexport const DEFAULT_COMMANDS = [\n 'start',\n 'complete',\n 'block',\n 'unblock',\n 'review',\n 'fail',\n 'reopen',\n 'assign',\n] as const;\n\nexport const DEFAULT_TERMINAL_STATUSES: ReadonlySet<string> = new Set([\n 'completed',\n 'failed',\n]);\n\nexport const TERMINAL_STATUSES: ReadonlySet<string> = DEFAULT_TERMINAL_STATUSES;\n\nexport interface ExternalId {\n system: string;\n id: string;\n url: string;\n}\n\nexport interface Workspace {\n repository: string | null;\n worktreePath: string | null;\n branch: string | null;\n parentBranch: string | null;\n}\n\nexport interface AssignmentFrontmatter {\n id: string;\n slug: string;\n title: string;\n project: string | null;\n type: string | null;\n status: AssignmentStatus;\n priority: 'low' | 'medium' | 'high' | 'critical';\n created: string;\n updated: string;\n assignee: string | null;\n externalIds: ExternalId[];\n dependsOn: string[];\n links: string[];\n blockedReason: string | null;\n workspace: Workspace;\n tags: string[];\n}\n\nexport interface TransitionResult {\n success: boolean;\n message: string;\n fromStatus: AssignmentStatus;\n toStatus?: AssignmentStatus;\n warnings?: string[];\n}\n","import type { AssignmentStatus, TransitionCommand } from './types.js';\nimport { TERMINAL_STATUSES } from './types.js';\n\n/**\n * Maps a command to its target status. Commands always produce the same\n * target regardless of the current status — workflow enforcement is\n * handled via agent prompting, not code guards.\n */\nexport const DEFAULT_COMMAND_TARGETS = new Map<string, string>([\n ['start', 'in_progress'],\n ['block', 'blocked'],\n ['unblock', 'in_progress'],\n ['review', 'review'],\n ['complete', 'completed'],\n ['fail', 'failed'],\n ['reopen', 'in_progress'],\n]);\n\n/** @deprecated Transition guards removed — kept for API compat, always returns true */\nexport const DEFAULT_TRANSITION_TABLE = new Map<string, string>([\n ['pending:start', 'in_progress'],\n ['pending:block', 'blocked'],\n ['in_progress:block', 'blocked'],\n ['in_progress:review', 'review'],\n ['in_progress:complete', 'completed'],\n ['in_progress:fail', 'failed'],\n ['blocked:unblock', 'in_progress'],\n ['review:start', 'in_progress'],\n ['review:complete', 'completed'],\n ['review:fail', 'failed'],\n ['completed:reopen', 'in_progress'],\n ['failed:reopen', 'in_progress'],\n]);\n\nexport function buildTransitionTable(\n transitions: Array<{ from: string; command: string; to: string }>,\n): Map<string, string> {\n const table = new Map<string, string>();\n for (const t of transitions) {\n table.set(`${t.from}:${t.command}`, t.to);\n }\n return table;\n}\n\nexport function buildCommandTargets(\n transitions: Array<{ from: string; command: string; to: string }>,\n): Map<string, string> {\n const targets = new Map<string, string>();\n for (const t of transitions) {\n targets.set(t.command, t.to);\n }\n return targets;\n}\n\nexport function getTargetStatus(\n _from: AssignmentStatus,\n command: TransitionCommand,\n table?: Map<string, string>,\n): AssignmentStatus | null {\n // Try command-only lookup first, fall back to from:command for backwards compat\n if (!table || table === DEFAULT_TRANSITION_TABLE) {\n return DEFAULT_COMMAND_TARGETS.get(command) ?? null;\n }\n // Custom table: try command-only key first, then from:command\n return table.get(command) ?? table.get(`${_from}:${command}`) ?? null;\n}\n\n/** @deprecated Guards removed — always returns true for known commands */\nexport function canTransition(\n _from: AssignmentStatus,\n command: TransitionCommand,\n table?: Map<string, string>,\n): boolean {\n return getTargetStatus(_from, command, table) !== null;\n}\n\nexport function isTerminalStatus(\n status: AssignmentStatus,\n terminalSet?: ReadonlySet<string>,\n): boolean {\n return (terminalSet ?? TERMINAL_STATUSES).has(status);\n}\n","import type { AssignmentFrontmatter, ExternalId, Workspace } from './types.js';\n\nfunction extractFrontmatter(fileContent: string): [string, string] {\n const match = fileContent.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) {\n throw new Error('No frontmatter found in file. Expected --- delimiters.');\n }\n const frontmatterBlock = match[1];\n const body = fileContent.slice(match[0].length);\n return [frontmatterBlock, body];\n}\n\nfunction parseSimpleValue(raw: string): string | null {\n const trimmed = raw.trim();\n if (trimmed === 'null') return null;\n if (\n (trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n ) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n}\n\nfunction parseDependsOn(frontmatter: string): string[] {\n const inlineMatch = frontmatter.match(/^dependsOn:\\s*\\[\\s*\\]/m);\n if (inlineMatch) return [];\n\n const results: string[] = [];\n const blockMatch = frontmatter.match(/^dependsOn:\\s*\\n((?:\\s+-\\s+.*\\n?)*)/m);\n if (blockMatch) {\n const items = blockMatch[1].matchAll(/^\\s+-\\s+(.+)$/gm);\n for (const item of items) {\n results.push(item[1].trim());\n }\n }\n return results;\n}\n\nfunction parseLinks(frontmatter: string): string[] {\n const inlineMatch = frontmatter.match(/^links:\\s*\\[\\s*\\]/m);\n if (inlineMatch) return [];\n\n const results: string[] = [];\n const blockMatch = frontmatter.match(/^links:\\s*\\n((?:\\s+-\\s+.*\\n?)*)/m);\n if (blockMatch) {\n const items = blockMatch[1].matchAll(/^\\s+-\\s+(.+)$/gm);\n for (const item of items) {\n results.push(item[1].trim());\n }\n }\n return results;\n}\n\nfunction parseExternalIds(frontmatter: string): ExternalId[] {\n const inlineMatch = frontmatter.match(/^externalIds:\\s*\\[\\s*\\]/m);\n if (inlineMatch) return [];\n\n const results: ExternalId[] = [];\n const blockMatch = frontmatter.match(\n /^externalIds:\\s*\\n((?:\\s+-\\s+[\\s\\S]*?)(?=^\\w|\\n---))/m,\n );\n if (!blockMatch) return [];\n\n const itemBlocks = blockMatch[1].split(/\\n\\s+-\\s+/).filter(Boolean);\n for (const block of itemBlocks) {\n const lines = block.split('\\n');\n const entry: Record<string, string> = {};\n for (const line of lines) {\n const colonIdx = line.indexOf(':');\n if (colonIdx < 0) continue;\n const key = line.slice(0, colonIdx).trim().replace(/^-\\s+/, '');\n const value = line.slice(colonIdx + 1).trim();\n if (key && value) {\n entry[key] = value;\n }\n }\n if (entry['system'] && entry['id'] && entry['url']) {\n results.push({\n system: entry['system'],\n id: entry['id'],\n url: entry['url'],\n });\n }\n }\n return results;\n}\n\nfunction parseWorkspace(frontmatter: string): Workspace {\n const defaults: Workspace = {\n repository: null,\n worktreePath: null,\n branch: null,\n parentBranch: null,\n };\n\n const fields = ['repository', 'worktreePath', 'branch', 'parentBranch'] as const;\n for (const field of fields) {\n const match = frontmatter.match(new RegExp(`^\\\\s+${field}:\\\\s*(.*)$`, 'm'));\n if (match) {\n defaults[field] = parseSimpleValue(match[1]);\n }\n }\n return defaults;\n}\n\nfunction parseTags(frontmatter: string): string[] {\n const inlineMatch = frontmatter.match(/^tags:\\s*\\[\\s*\\]/m);\n if (inlineMatch) return [];\n\n const results: string[] = [];\n const blockMatch = frontmatter.match(/^tags:\\s*\\n((?:\\s+-\\s+.*\\n?)*)/m);\n if (blockMatch) {\n const items = blockMatch[1].matchAll(/^\\s+-\\s+(.+)$/gm);\n for (const item of items) {\n results.push(item[1].trim());\n }\n }\n return results;\n}\n\nexport function parseAssignmentFrontmatter(fileContent: string): AssignmentFrontmatter {\n const [frontmatter] = extractFrontmatter(fileContent);\n\n function getField(key: string): string | null {\n const match = frontmatter.match(new RegExp(`^${key}:\\\\s*(.*)$`, 'm'));\n if (!match) return null;\n return parseSimpleValue(match[1]);\n }\n\n return {\n id: getField('id') ?? '',\n slug: getField('slug') ?? '',\n title: getField('title') ?? '',\n project: getField('project'),\n type: getField('type'),\n status: getField('status') ?? 'pending',\n priority: (getField('priority') ?? 'medium') as AssignmentFrontmatter['priority'],\n created: getField('created') ?? '',\n updated: getField('updated') ?? '',\n assignee: getField('assignee'),\n externalIds: parseExternalIds(frontmatter),\n dependsOn: parseDependsOn(frontmatter),\n links: parseLinks(frontmatter),\n blockedReason: getField('blockedReason'),\n workspace: parseWorkspace(frontmatter),\n tags: parseTags(frontmatter),\n };\n}\n\nfunction formatYamlValue(value: string | null): string {\n if (value === null) return 'null';\n if (/^\\d{4}-\\d{2}-\\d{2}T/.test(value)) {\n return `\"${value}\"`;\n }\n // Quote values containing YAML-special characters that could cause parse issues\n if (/[:#{}[\\],&*?|>!%@`]/.test(value) || /^\\s|\\s$/.test(value) || value === '') {\n const escaped = value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n return `\"${escaped}\"`;\n }\n return value;\n}\n\nexport function updateAssignmentFile(\n fileContent: string,\n updates: Partial<Pick<AssignmentFrontmatter, 'status' | 'assignee' | 'blockedReason' | 'updated'>>,\n): string {\n let result = fileContent;\n\n for (const [key, value] of Object.entries(updates)) {\n if (value === undefined) continue;\n const formatted = formatYamlValue(value as string | null);\n const fieldRegex = new RegExp(`^(${key}:)\\\\s*.*$`, 'm');\n if (fieldRegex.test(result)) {\n result = result.replace(fieldRegex, `$1 ${formatted}`);\n }\n }\n\n return result;\n}\n","import { resolve } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport { fileExists, writeFileForce } from '../utils/fs.js';\nimport { nowTimestamp } from '../utils/timestamp.js';\nimport { getTargetStatus } from './state-machine.js';\nimport { parseAssignmentFrontmatter, updateAssignmentFile } from './frontmatter.js';\nimport type { TransitionCommand, TransitionResult, AssignmentFrontmatter } from './types.js';\n\nfunction resolveAssignmentPath(projectDir: string, assignmentSlug: string): string {\n return resolve(projectDir, 'assignments', assignmentSlug, 'assignment.md');\n}\n\nasync function readAssignment(\n filePath: string,\n): Promise<{ content: string; frontmatter: AssignmentFrontmatter }> {\n if (!(await fileExists(filePath))) {\n throw new Error(`Assignment file not found: ${filePath}`);\n }\n const content = await readFile(filePath, 'utf-8');\n const frontmatter = parseAssignmentFrontmatter(content);\n return { content, frontmatter };\n}\n\nasync function checkDependencies(\n projectDir: string,\n dependsOn: string[],\n terminalStatuses?: ReadonlySet<string>,\n): Promise<{ satisfied: boolean; unmet: string[] }> {\n const terminals = terminalStatuses ?? new Set(['completed']);\n const unmet: string[] = [];\n for (const depSlug of dependsOn) {\n const depPath = resolveAssignmentPath(projectDir, depSlug);\n if (!(await fileExists(depPath))) {\n unmet.push(`${depSlug} (file not found)`);\n continue;\n }\n const depContent = await readFile(depPath, 'utf-8');\n const depFrontmatter = parseAssignmentFrontmatter(depContent);\n if (!terminals.has(depFrontmatter.status)) {\n unmet.push(`${depSlug} (status: ${depFrontmatter.status})`);\n }\n }\n return { satisfied: unmet.length === 0, unmet };\n}\n\nexport interface TransitionOptions {\n reason?: string;\n agent?: string;\n transitionTable?: Map<string, string>;\n terminalStatuses?: ReadonlySet<string>;\n}\n\nexport async function executeTransition(\n projectDir: string,\n assignmentSlug: string,\n command: Exclude<TransitionCommand, 'assign'>,\n options: TransitionOptions = {},\n): Promise<TransitionResult> {\n const filePath = resolveAssignmentPath(projectDir, assignmentSlug);\n const { content, frontmatter } = await readAssignment(filePath);\n\n const targetStatus = getTargetStatus(frontmatter.status, command, options.transitionTable);\n\n if (!targetStatus) {\n return {\n success: false,\n message: `Unknown command '${command}' for assignment \"${assignmentSlug}\".`,\n fromStatus: frontmatter.status,\n };\n }\n\n const warnings: string[] = [];\n\n if (command === 'start' && frontmatter.dependsOn.length > 0) {\n const depCheck = await checkDependencies(projectDir, frontmatter.dependsOn, options.terminalStatuses);\n if (!depCheck.satisfied) {\n warnings.push(`Starting with unmet dependencies: ${depCheck.unmet.join(', ')}`);\n }\n }\n\n const updates: Partial<Pick<AssignmentFrontmatter, 'status' | 'assignee' | 'blockedReason' | 'updated'>> = {\n status: targetStatus,\n updated: nowTimestamp(),\n };\n\n if (command === 'start' && options.agent && !frontmatter.assignee) {\n updates.assignee = options.agent;\n }\n if (command === 'block') {\n updates.blockedReason = options.reason ?? null;\n }\n if (command === 'unblock') {\n updates.blockedReason = null;\n }\n\n const updatedContent = updateAssignmentFile(content, updates);\n await writeFileForce(filePath, updatedContent);\n\n return {\n success: true,\n message: `Assignment \"${assignmentSlug}\" transitioned: ${frontmatter.status} -> ${targetStatus}`,\n fromStatus: frontmatter.status,\n toStatus: targetStatus,\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n}\n\nexport async function executeAssign(\n projectDir: string,\n assignmentSlug: string,\n agent: string,\n): Promise<TransitionResult> {\n const filePath = resolveAssignmentPath(projectDir, assignmentSlug);\n const { content, frontmatter } = await readAssignment(filePath);\n\n const updates: Partial<Pick<AssignmentFrontmatter, 'status' | 'assignee' | 'blockedReason' | 'updated'>> = {\n assignee: agent,\n updated: nowTimestamp(),\n };\n\n const updatedContent = updateAssignmentFile(content, updates);\n await writeFileForce(filePath, updatedContent);\n\n return {\n success: true,\n message: `Assignment \"${assignmentSlug}\" assigned to '${agent}'.`,\n fromStatus: frontmatter.status,\n };\n}\n\nexport interface TransitionByDirOptions extends TransitionOptions {\n standalone?: boolean;\n}\n\nexport async function executeTransitionByDir(\n assignmentDir: string,\n command: Exclude<TransitionCommand, 'assign'>,\n options: TransitionByDirOptions = {},\n): Promise<TransitionResult> {\n const filePath = resolve(assignmentDir, 'assignment.md');\n const { content, frontmatter } = await readAssignment(filePath);\n\n const targetStatus = getTargetStatus(frontmatter.status, command, options.transitionTable);\n if (!targetStatus) {\n return {\n success: false,\n message: `Unknown command '${command}' for assignment \"${frontmatter.slug || assignmentDir}\".`,\n fromStatus: frontmatter.status,\n };\n }\n\n const warnings: string[] = [];\n\n if (command === 'start' && !options.standalone && frontmatter.dependsOn.length > 0) {\n // Dependency check requires a project context — skip for standalone\n const projectDir = resolve(assignmentDir, '..', '..');\n const depCheck = await checkDependencies(\n projectDir,\n frontmatter.dependsOn,\n options.terminalStatuses,\n );\n if (!depCheck.satisfied) {\n warnings.push(`Starting with unmet dependencies: ${depCheck.unmet.join(', ')}`);\n }\n }\n\n const updates: Partial<Pick<AssignmentFrontmatter, 'status' | 'assignee' | 'blockedReason' | 'updated'>> = {\n status: targetStatus,\n updated: nowTimestamp(),\n };\n\n if (command === 'start' && options.agent && !frontmatter.assignee) {\n updates.assignee = options.agent;\n }\n if (command === 'block') {\n updates.blockedReason = options.reason ?? null;\n }\n if (command === 'unblock') {\n updates.blockedReason = null;\n }\n\n const updatedContent = updateAssignmentFile(content, updates);\n await writeFileForce(filePath, updatedContent);\n\n return {\n success: true,\n message: `Assignment \"${frontmatter.slug || assignmentDir}\" transitioned: ${frontmatter.status} -> ${targetStatus}`,\n fromStatus: frontmatter.status,\n toStatus: targetStatus,\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n}\n\nexport async function executeAssignByDir(\n assignmentDir: string,\n agent: string,\n): Promise<TransitionResult> {\n const filePath = resolve(assignmentDir, 'assignment.md');\n const { content, frontmatter } = await readAssignment(filePath);\n\n const updates: Partial<Pick<AssignmentFrontmatter, 'status' | 'assignee' | 'blockedReason' | 'updated'>> = {\n assignee: agent,\n updated: nowTimestamp(),\n };\n\n const updatedContent = updateAssignmentFile(content, updates);\n await writeFileForce(filePath, updatedContent);\n\n return {\n success: true,\n message: `Assignment \"${frontmatter.slug || assignmentDir}\" assigned to '${agent}'.`,\n fromStatus: frontmatter.status,\n };\n}\n","export type {\n AssignmentStatus,\n TransitionCommand,\n AssignmentFrontmatter,\n ExternalId,\n Workspace,\n TransitionResult,\n} from './types.js';\nexport { TERMINAL_STATUSES, DEFAULT_STATUSES, DEFAULT_COMMANDS, DEFAULT_TERMINAL_STATUSES } from './types.js';\nexport { canTransition, getTargetStatus, isTerminalStatus, DEFAULT_TRANSITION_TABLE, DEFAULT_COMMAND_TARGETS, buildTransitionTable, buildCommandTargets } from './state-machine.js';\nexport { parseAssignmentFrontmatter, updateAssignmentFile } from './frontmatter.js';\nexport { executeTransition, executeAssign, executeTransitionByDir, executeAssignByDir } from './transitions.js';\nexport type { TransitionOptions, TransitionByDirOptions } from './transitions.js';\n","import type {\n HelpChecklistItem,\n HelpCommand,\n HelpResponse,\n HelpStatusGuideEntry,\n} from './types.js';\nimport { getStatusConfig } from './api.js';\n\nconst CLI_COMMANDS: HelpCommand[] = [\n // --- Core setup & scaffolding (indices 0-4) ---\n {\n command: 'syntaur setup',\n description: 'Initialize Syntaur and optionally install plugins or launch the dashboard.',\n example: 'syntaur setup',\n },\n {\n command: 'syntaur init',\n description: 'Initialize the local Syntaur home directory and config scaffolding without any prompts.',\n example: 'syntaur init',\n },\n {\n command: 'syntaur create-project',\n description: 'Create a new project folder with the required source and derived files.',\n example: 'syntaur create-project \"Ship dashboard overhaul\"',\n },\n {\n command: 'syntaur create-assignment',\n description: 'Create a new assignment inside a project.',\n example: 'syntaur create-assignment \"Implement overview API\" --project ui-overhaul',\n },\n {\n command: 'syntaur assign',\n description: 'Set the assignee for an assignment before work begins.',\n example: 'syntaur assign implement-overview --project ui-overhaul --agent codex-1',\n },\n\n // --- Lifecycle transitions (indices 5-11) ---\n {\n command: 'syntaur start',\n description: 'Transition an assignment to in_progress.',\n example: 'syntaur start implement-overview --project ui-overhaul',\n },\n {\n command: 'syntaur review',\n description: 'Move active work into review once implementation is ready for inspection.',\n example: 'syntaur review implement-overview --project ui-overhaul',\n },\n {\n command: 'syntaur complete',\n description: 'Mark an assignment completed after review or direct completion.',\n example: 'syntaur complete implement-overview --project ui-overhaul',\n },\n {\n command: 'syntaur block',\n description: 'Mark an assignment blocked and record the explicit reason.',\n example: 'syntaur block implement-overview --project ui-overhaul --reason \"Waiting on API spec\"',\n },\n {\n command: 'syntaur unblock',\n description: 'Move a blocked assignment back to in_progress after the blocker is cleared.',\n example: 'syntaur unblock implement-overview --project ui-overhaul',\n },\n {\n command: 'syntaur fail',\n description: 'Mark an assignment failed when it cannot be completed as planned.',\n example: 'syntaur fail implement-overview --project ui-overhaul',\n },\n {\n command: 'syntaur reopen',\n description: 'Reopen a completed or failed assignment back to in_progress.',\n example: 'syntaur reopen implement-overview --project ui-overhaul',\n },\n\n // --- Dashboard (index 12) ---\n {\n command: 'syntaur dashboard',\n description: 'Start the local dashboard UI over the project files on disk.',\n example: 'syntaur dashboard --port 4800',\n },\n\n // --- Plugin & adapter setup (indices 13-16) ---\n {\n command: 'syntaur install-plugin',\n description: 'Install the Syntaur Claude Code plugin, detecting the local Claude marketplace when available and prompting for the target directory when interactive.',\n example: 'syntaur install-plugin --target-dir ~/.claude/plugins/marketplaces/user-plugins/plugins/syntaur',\n },\n {\n command: 'syntaur install-codex-plugin',\n description: 'Install the Syntaur Codex plugin and register its marketplace entry, prompting for both paths when interactive.',\n example: 'syntaur install-codex-plugin --target-dir ~/plugins/syntaur --marketplace-path ~/.agents/plugins/marketplace.json',\n },\n {\n command: 'syntaur uninstall',\n description: 'Remove Syntaur plugins and optionally local ~/.syntaur data.',\n example: 'syntaur uninstall --all',\n },\n {\n command: 'syntaur setup-adapter',\n description: 'Generate adapter instruction files for cursor, codex, or opencode in the current directory.',\n example: 'syntaur setup-adapter cursor --project ui-overhaul --assignment implement-overview',\n },\n\n // --- Session & server tracking (index 17) ---\n {\n command: 'syntaur track-session',\n description: 'Register an agent session, optionally linked to a project and assignment.',\n example: 'syntaur track-session --agent claude --project ui-overhaul --assignment implement-overview',\n },\n\n // --- Browsing & playbooks (indices 18-20) ---\n {\n command: 'syntaur browse',\n description: 'Interactive TUI browser for projects and assignments.',\n example: 'syntaur browse',\n },\n {\n command: 'syntaur create-playbook',\n description: 'Create a new playbook with behavioral rules for agents.',\n example: 'syntaur create-playbook \"Code Review Standards\"',\n },\n {\n command: 'syntaur list-playbooks',\n description: 'List all playbooks in the Syntaur home directory.',\n example: 'syntaur list-playbooks',\n },\n];\n\nconst WORKFLOW: HelpChecklistItem[] = [\n {\n title: 'Initialize the workspace',\n detail: 'Run setup once so Syntaur can initialize its local home directory and offer plugin installation.',\n command: CLI_COMMANDS[0],\n },\n {\n title: 'Create a project',\n detail: 'Use a project for a higher-level objective. Projects group assignments, shared resources, and memories.',\n command: CLI_COMMANDS[2],\n href: '/create/project',\n },\n {\n title: 'Create the first assignment',\n detail: 'Assignments are the execution unit. Create one for each concrete chunk of work inside the project.',\n command: CLI_COMMANDS[3],\n },\n {\n title: 'Assign the work',\n detail: 'Setting an assignee before starting is recommended for clarity, but not required.',\n command: CLI_COMMANDS[4],\n },\n {\n title: 'Start, review, complete, or block through lifecycle actions',\n detail: 'Status changes happen through lifecycle actions, kanban drag-and-drop, or the status override controls.',\n command: CLI_COMMANDS[5],\n },\n {\n title: 'Use the dashboard for triage and context',\n detail: 'Overview shows the current queue, project pages show health, assignment pages show the execution surface.',\n command: CLI_COMMANDS[12],\n href: '/',\n },\n];\n\nconst DEFAULT_STATUS_GUIDE: Record<string, { meaning: string; useWhen: string }> = {\n pending: {\n meaning: 'The assignment has not started yet.',\n useWhen: 'Use pending while waiting to start. If dependencies are unmet, pending is the normal waiting state.',\n },\n in_progress: {\n meaning: 'An assigned agent is actively working the assignment.',\n useWhen: 'Use in_progress once the work has started and dependencies are satisfied.',\n },\n blocked: {\n meaning: 'The assignment hit a manual or runtime obstacle.',\n useWhen: 'Use blocked when work hits an obstacle. Adding a blockedReason is recommended for traceability.',\n },\n review: {\n meaning: 'Implementation is ready for inspection or validation.',\n useWhen: 'Use review after active work is ready to be checked before completion.',\n },\n completed: {\n meaning: 'The assignment is done.',\n useWhen: 'Use completed when the acceptance criteria are satisfied.',\n },\n failed: {\n meaning: 'The assignment could not be completed as planned.',\n useWhen: 'Use failed when the work cannot be recovered within the current assignment.',\n },\n};\n\nasync function buildStatusGuide(): Promise<HelpStatusGuideEntry[]> {\n const config = await getStatusConfig();\n\n return config.statuses.map((s) => {\n const defaults = DEFAULT_STATUS_GUIDE[s.id];\n return {\n status: s.id,\n meaning: s.description ?? defaults?.meaning ?? `The assignment is in the \"${s.label}\" state.`,\n useWhen: defaults?.useWhen ?? `Use ${s.id} when appropriate for the \"${s.label}\" workflow state.`,\n };\n });\n}\n\nexport async function getDashboardHelp(): Promise<HelpResponse> {\n return {\n generatedAt: new Date().toISOString(),\n whatIsSyntaur: {\n summary:\n 'Syntaur is a local-first, markdown-backed agent work system. The dashboard is a live view over project folders and files on disk.',\n bullets: [\n 'Markdown files are the source of truth.',\n 'The UI reads project folders, assignment files, and derived indexes from the local filesystem.',\n 'Derived underscore-prefixed files are projections, not the canonical edit target.',\n ],\n },\n coreConcepts: [\n {\n term: 'Project',\n description:\n 'A project is the higher-level objective. It owns assignments, shared resources, and project memories.',\n },\n {\n term: 'Assignment',\n description:\n 'An assignment is a concrete unit of execution. Assignment frontmatter is the source of truth for status, priority, assignee, and dependencies.',\n },\n {\n term: 'Resource',\n description:\n 'A project-level shared reference file that provides source material or constraints for the work.',\n },\n {\n term: 'Memory',\n description:\n 'A project-level learning or pattern captured during execution so future assignments can reuse it.',\n },\n {\n term: 'Manifest',\n description:\n 'A derived navigation file that points agents at the project overview, indexes, and agent instructions.',\n },\n {\n term: 'Derived file',\n description:\n 'An underscore-prefixed file regenerated from canonical markdown sources. Read it, but do not edit it directly.',\n },\n {\n term: 'Handoff',\n description:\n 'An append-only log that records baton-passes between agents or sessions without rewriting prior history.',\n },\n {\n term: 'Decision record',\n description:\n 'An append-only record of important decisions, rationale, and follow-up consequences.',\n },\n {\n term: 'Playbook',\n description:\n 'A behavioral rule set stored in ~/.syntaur/playbooks/. Playbooks define constraints and conventions that agents must follow during execution. Manage them via the CLI or the Playbooks page.',\n },\n {\n term: 'Workspace',\n description:\n 'The repository context for an assignment, including the repository path, worktree path, branch, and parent branch. Workspace fields connect an assignment to the code being worked on and define write boundaries.',\n },\n {\n term: 'Agent Session',\n description:\n 'A tracked AI session tied to assignment work. Sessions are registered via the track-session CLI command or the Claude Code plugin and visible on the Agent Sessions page.',\n },\n {\n term: 'Server',\n description:\n 'A tracked tmux session with automatic port discovery, branch detection, and assignment linking. The Servers page shows all tracked sessions with their windows, panes, and discovered services.',\n },\n ],\n workflow: WORKFLOW,\n statusGuide: await buildStatusGuide(),\n ownershipRules: [\n {\n label: 'Human-authored files',\n files: ['project.md', 'agent.md', 'claude.md'],\n description:\n 'These files define project intent and instructions. The dashboard treats project status as derived except for the archive fields.',\n },\n {\n label: 'Assignment working files',\n files: ['assignment.md', 'plan*.md (optional, versioned)', 'scratchpad.md'],\n description:\n 'These are agent-writable files. The dashboard lets you edit the source markdown while preserving unsupported frontmatter keys.',\n },\n {\n label: 'Append-only logs',\n files: ['handoff.md', 'decision-record.md'],\n description:\n 'These logs preserve history. The dashboard appends new entries instead of rewriting previous ones.',\n },\n {\n label: 'Derived files',\n files: ['_status.md', '_index-assignments.md', '_index-plans.md', '_index-decisions.md'],\n description:\n 'These files are read-only projections. They can lag behind source files, so the dashboard computes source-first state.',\n },\n ],\n commands: CLI_COMMANDS,\n navigation: [\n {\n label: 'Overview',\n description: 'Triage hub showing current attention items, recent activity, progress stats, and first-run setup guidance.',\n href: '/',\n },\n {\n label: 'Projects',\n description: 'Browse, search, filter, and sort the project directory. Create new projects and drill into project workspaces.',\n href: '/projects',\n },\n {\n label: 'Assignments',\n description: 'Cross-project kanban board of all assignments. Drag cards between columns to change status, or filter by project, assignee, or status.',\n href: '/assignments',\n },\n {\n label: 'Servers',\n description: 'Tracked tmux sessions with auto-discovered ports, URLs, git branches, and links to related assignments. Register sessions manually or let autodiscovery find them.',\n href: '/servers',\n },\n {\n label: 'Agent Sessions',\n description: 'Monitor which AI agents are currently working, what assignments they are linked to, and session duration. Sessions are registered via the Claude Code plugin or track-session CLI command.',\n href: '/agent-sessions',\n },\n {\n label: 'Playbooks',\n description: 'Create, browse, and edit behavioral rules that agents must follow. The playbook manifest at ~/.syntaur/playbooks/manifest.md is auto-generated for inclusion in agent instructions.',\n href: '/playbooks',\n },\n {\n label: 'Attention',\n description: 'Focused queue of assignments that need action: blocked, failed, in review, stale, or with unmet dependencies.',\n href: '/attention',\n },\n {\n label: 'Help',\n description: 'This page. Status guide, CLI quick reference, core concepts, and FAQ.',\n href: '/help',\n },\n {\n label: 'Settings',\n description: 'Customize status definitions, labels, colors, display order, and done states. Changes apply globally across the dashboard and CLI.',\n href: '/settings',\n },\n {\n label: 'Project page',\n description: 'The project workspace shows health stats, assignment list, dependency graph, shared resources, and memories.',\n href: '/projects',\n },\n {\n label: 'Assignment page',\n description: 'The assignment workspace shows lifecycle actions, plan editor, scratchpad, handoff log, decision records, and agent sessions.',\n href: '/projects',\n },\n ],\n faq: [\n {\n question: 'Why are some files read-only in the dashboard?',\n answer:\n 'Underscore-prefixed files are derived projections that can be rebuilt from canonical markdown sources. Editing them would create drift, so the UI treats them as read-only.',\n },\n {\n question: 'Why can an assignment be pending even when nothing looks broken?',\n answer:\n 'Pending often just means the work has not started yet or it is waiting on declared dependencies. Blocked is reserved for exceptional runtime obstacles that need intervention.',\n },\n {\n question: 'How do I change an assignment\\'s status?',\n answer:\n 'Use lifecycle CLI commands (syntaur start, syntaur complete, etc.), drag cards on the kanban board, or use the Override Status dropdown on the assignment page. Any status can be set from any other status.',\n },\n {\n question: 'How do I customize statuses?',\n answer:\n 'Open the Settings page from the sidebar. You can add, remove, rename, recolor, and reorder statuses. You can also mark statuses as done states. Changes are saved to ~/.syntaur/config.md and take effect immediately across the dashboard.',\n },\n {\n question: 'What is a done state?',\n answer:\n 'A done state (also called terminal status) means the assignment is finished. Done states fill the completed portion of progress bars and satisfy dependency requirements. By default, \"completed\" and \"failed\" are done states. You can configure which statuses are done states in Settings.',\n },\n {\n question: 'What are playbooks and how do I use them?',\n answer:\n 'Playbooks are markdown files in ~/.syntaur/playbooks/ that define behavioral rules agents must follow. Create them via the CLI (syntaur create-playbook) or the Playbooks page. The auto-generated manifest at ~/.syntaur/playbooks/manifest.md can be included in your CLAUDE.md so agents pick up the rules.',\n },\n {\n question: 'How does agent session tracking work?',\n answer:\n 'When an AI agent starts working on an assignment, it can register a session via the track-session CLI command or the Claude Code plugin\\'s /track-session command. The Agent Sessions page shows active and completed sessions with their linked assignments and duration.',\n },\n {\n question: 'How does server tracking work?',\n answer:\n 'Syntaur tracks tmux sessions to discover running dev servers, their ports, git branches, and linked assignments. Register sessions on the Servers page or let autodiscovery find them. Pane info refreshes automatically.',\n },\n ],\n firstProjectChecklist: [\n {\n title: 'Create the project',\n detail: 'Describe the overall objective in project.md, then add tags and archive metadata only when needed.',\n command: CLI_COMMANDS[1],\n href: '/create/project',\n },\n {\n title: 'Create at least one assignment',\n detail: 'Break the project into executable work units with explicit priority and dependencies.',\n command: CLI_COMMANDS[2],\n },\n {\n title: 'Assign and start the first assignment',\n detail: 'Set an assignee, then start the assignment once prerequisites are complete.',\n command: CLI_COMMANDS[3],\n },\n {\n title: 'Use the assignment workspace for execution',\n detail: 'Keep the objective and todos in assignment.md, implementation plans in optional versioned plan files (plan.md, plan-v2.md, ...), and transient notes in scratchpad.md.',\n href: '/projects',\n },\n {\n title: 'Record handoffs and decisions without rewriting history',\n detail: 'Append new handoff and decision entries instead of editing prior entries.',\n },\n {\n title: 'Return to Overview for triage',\n detail: 'Overview and Attention show the queue that needs action next.',\n href: '/',\n },\n ],\n links: [\n { label: 'Overview', href: '/' },\n { label: 'Project Directory', href: '/projects' },\n { label: 'Assignments Board', href: '/assignments' },\n { label: 'Attention Queue', href: '/attention' },\n { label: 'Servers', href: '/servers' },\n { label: 'Agent Sessions', href: '/agent-sessions' },\n { label: 'Playbooks', href: '/playbooks' },\n { label: 'Settings', href: '/settings' },\n { label: 'Create Project', href: '/create/project' },\n ],\n };\n}\n\nexport function getHelpCommandNames(): string[] {\n return CLI_COMMANDS.map((command) => command.command.replace(/^syntaur\\s+/, ''));\n}\n","import { readdir, readFile, unlink } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { ensureDir, fileExists, writeFileForce } from '../utils/fs.js';\nimport { extractFrontmatter, getField } from './parser.js';\nimport type { SessionFileData, SessionKind } from './types.js';\n\nexport function sanitizeSessionName(name: string): string {\n return name.replace(/[^a-zA-Z0-9_-]/g, '-');\n}\n\nfunction nowTimestamp(): string {\n return new Date().toISOString();\n}\n\nexport interface BuildSessionOptions {\n session: string;\n registered: string;\n lastRefreshed: string;\n overrides: Record<string, { project: string; assignment: string }>;\n auto?: boolean;\n kind?: SessionKind;\n pid?: number;\n ports?: number[];\n cwd?: string;\n}\n\nexport function buildSessionContent(opts: BuildSessionOptions): string {\n const lines = [\n '---',\n `session: ${opts.session}`,\n `registered: ${opts.registered}`,\n `last_refreshed: ${opts.lastRefreshed}`,\n ];\n\n if (opts.auto != null) {\n lines.push(`auto: ${opts.auto}`);\n }\n if (opts.kind) {\n lines.push(`kind: ${opts.kind}`);\n }\n if (opts.pid != null) {\n lines.push(`pid: ${opts.pid}`);\n }\n if (opts.ports && opts.ports.length > 0) {\n lines.push(`ports: [${opts.ports.join(', ')}]`);\n }\n if (opts.cwd) {\n lines.push(`cwd: ${opts.cwd}`);\n }\n\n if (Object.keys(opts.overrides).length > 0) {\n lines.push('overrides:');\n for (const [key, val] of Object.entries(opts.overrides)) {\n lines.push(` \"${key}\": { project: \"${val.project}\", assignment: \"${val.assignment}\" }`);\n }\n }\n\n lines.push('---', '');\n return lines.join('\\n');\n}\n\nexport async function registerSession(dir: string, rawName: string): Promise<string> {\n const name = sanitizeSessionName(rawName);\n await ensureDir(dir);\n const now = nowTimestamp();\n const content = buildSessionContent({\n session: name, registered: now, lastRefreshed: now, overrides: {},\n });\n await writeFileForce(resolve(dir, `${name}.md`), content);\n return name;\n}\n\nexport async function listSessionFiles(dir: string): Promise<string[]> {\n if (!(await fileExists(dir))) return [];\n const entries = await readdir(dir);\n return entries\n .filter((f) => f.endsWith('.md'))\n .map((f) => f.replace(/\\.md$/, ''));\n}\n\nexport async function readSessionFile(dir: string, name: string): Promise<SessionFileData | null> {\n const filePath = resolve(dir, `${sanitizeSessionName(name)}.md`);\n if (!(await fileExists(filePath))) return null;\n\n const raw = await readFile(filePath, 'utf-8');\n const [frontmatter] = extractFrontmatter(raw);\n if (!frontmatter) return null;\n\n const session = getField(frontmatter, 'session') ?? name;\n const registered = getField(frontmatter, 'registered') ?? '';\n const lastRefreshed = getField(frontmatter, 'last_refreshed') ?? '';\n\n // Parse overrides block\n const overrides: Record<string, { project: string; assignment: string }> = {};\n const overridesMatch = frontmatter.match(/^overrides:\\n((?:\\s+\".+\\n?)*)/m);\n if (overridesMatch) {\n const overrideLines = overridesMatch[1].matchAll(\n /^\\s+\"([^\"]+)\":\\s*\\{\\s*project:\\s*\"([^\"]+)\",\\s*assignment:\\s*\"([^\"]+)\"\\s*\\}/gm,\n );\n for (const m of overrideLines) {\n overrides[m[1]] = { project: m[2], assignment: m[3] };\n }\n }\n\n const autoField = getField(frontmatter, 'auto');\n const auto = autoField === 'true' ? true : autoField === 'false' ? false : undefined;\n const kind = getField(frontmatter, 'kind') as SessionKind | undefined;\n const pidField = getField(frontmatter, 'pid');\n const pid = pidField ? parseInt(pidField, 10) : undefined;\n const cwdField = getField(frontmatter, 'cwd');\n\n let ports: number[] | undefined;\n const portsMatch = frontmatter.match(/^ports:\\s*\\[([^\\]]*)\\]/m);\n if (portsMatch) {\n ports = portsMatch[1].split(',').map((s) => parseInt(s.trim(), 10)).filter((n) => !isNaN(n));\n }\n\n return {\n session, registered, lastRefreshed, overrides,\n ...(auto != null && { auto }),\n ...(kind && { kind }),\n ...(pid != null && !isNaN(pid) && { pid }),\n ...(ports && ports.length > 0 && { ports }),\n ...(cwdField && { cwd: cwdField }),\n };\n}\n\nexport async function removeSession(dir: string, name: string): Promise<void> {\n const filePath = resolve(dir, `${sanitizeSessionName(name)}.md`);\n if (await fileExists(filePath)) {\n await unlink(filePath);\n }\n}\n\nexport async function updateLastRefreshed(dir: string, name: string): Promise<void> {\n const data = await readSessionFile(dir, name);\n if (!data) return;\n const content = buildSessionContent({ ...data, lastRefreshed: nowTimestamp() });\n await writeFileForce(resolve(dir, `${sanitizeSessionName(name)}.md`), content);\n}\n\nexport async function setOverride(\n dir: string,\n sessionName: string,\n windowIndex: number,\n paneIndex: number,\n assignment: { project: string; assignment: string } | null,\n): Promise<void> {\n const data = await readSessionFile(dir, sessionName);\n if (!data) return;\n const key = `${windowIndex}:${paneIndex}`;\n if (assignment) {\n data.overrides[key] = assignment;\n } else {\n delete data.overrides[key];\n }\n const content = buildSessionContent({ ...data });\n await writeFileForce(resolve(dir, `${sanitizeSessionName(sessionName)}.md`), content);\n}\n\nexport interface RegisterAutoOptions {\n kind: SessionKind;\n pid?: number;\n ports?: number[];\n cwd?: string;\n}\n\nexport async function registerAutoSession(\n dir: string,\n rawName: string,\n opts: RegisterAutoOptions,\n): Promise<string> {\n const name = sanitizeSessionName(rawName);\n await ensureDir(dir);\n const now = nowTimestamp();\n const content = buildSessionContent({\n session: name,\n registered: now,\n lastRefreshed: now,\n overrides: {},\n auto: true,\n kind: opts.kind,\n pid: opts.pid,\n ports: opts.ports,\n cwd: opts.cwd,\n });\n await writeFileForce(resolve(dir, `${name}.md`), content);\n return name;\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { resolve } from 'node:path';\nimport { realpath, readdir, readFile } from 'node:fs/promises';\nimport { listProjects } from './api.js';\nimport {\n readSessionFile,\n listSessionFiles,\n} from './servers.js';\nimport { extractFrontmatter, getField, getNestedField } from './parser.js';\nimport type {\n TrackedSession,\n TrackedWindow,\n TrackedPane,\n ServersResponse,\n SessionFileData,\n} from './types.js';\n\nconst exec = promisify(execFile);\n\n// --- Cache ---\nlet cache: { data: ServersResponse; expiry: number } | null = null;\nconst CACHE_TTL_MS = 10_000;\n\nexport function clearScanCache(): void {\n cache = null;\n}\n\n// --- Pure parsing functions (exported for testing) ---\n\nexport interface RawPane {\n windowIndex: number;\n windowName: string;\n paneIndex: number;\n command: string;\n cwd: string;\n pid: number;\n}\n\nexport function parseTmuxPaneOutput(output: string): RawPane[] {\n return output\n .trim()\n .split('\\n')\n .filter((line) => line.length > 0)\n .map((line) => {\n const [wi, wn, pi, cmd, cwd, pid] = line.split('|');\n return {\n windowIndex: parseInt(wi, 10),\n windowName: wn,\n paneIndex: parseInt(pi, 10),\n command: cmd,\n cwd,\n pid: parseInt(pid, 10),\n };\n });\n}\n\nexport function findListeningPorts(lsofOutput: string, pids: Set<number>): number[] {\n const ports: number[] = [];\n for (const line of lsofOutput.split('\\n')) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length < 9) continue;\n const pid = parseInt(parts[1], 10);\n if (!pids.has(pid)) continue;\n const tcpAddr = parts.find((p) => p.includes(':') && /:\\d+$/.test(p));\n if (tcpAddr) {\n const port = parseInt(tcpAddr.split(':').pop()!, 10);\n if (!isNaN(port) && !ports.includes(port)) {\n ports.push(port);\n }\n }\n }\n return ports;\n}\n\n// --- Shell helpers ---\n\nexport async function execQuiet(cmd: string, args: string[]): Promise<string> {\n try {\n const { stdout } = await exec(cmd, args);\n return stdout.trim();\n } catch {\n return '';\n }\n}\n\nexport async function checkTmuxAvailable(): Promise<boolean> {\n const result = await execQuiet('which', ['tmux']);\n return result.length > 0;\n}\n\nexport async function sessionAlive(name: string): Promise<boolean> {\n try {\n await exec('tmux', ['has-session', '-t', name]);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function listTmuxPanes(sessionName: string): Promise<RawPane[]> {\n const output = await execQuiet('tmux', [\n 'list-panes', '-s', '-t', sessionName,\n '-F', '#{window_index}|#{window_name}|#{pane_index}|#{pane_current_command}|#{pane_current_path}|#{pane_pid}',\n ]);\n return parseTmuxPaneOutput(output);\n}\n\nexport async function getDescendantPids(rootPid: number, maxDepth: number = 4): Promise<Set<number>> {\n const all = new Set<number>([rootPid]);\n let frontier = [rootPid];\n\n for (let depth = 0; depth < maxDepth && frontier.length > 0; depth++) {\n const nextFrontier: number[] = [];\n for (const pid of frontier) {\n const output = await execQuiet('pgrep', ['-P', String(pid)]);\n for (const line of output.split('\\n')) {\n const child = parseInt(line, 10);\n if (!isNaN(child) && !all.has(child)) {\n all.add(child);\n nextFrontier.push(child);\n }\n }\n }\n frontier = nextFrontier;\n }\n\n return all;\n}\n\nexport async function getLsofOutput(): Promise<string> {\n return execQuiet('lsof', ['-i', '-P', '-n', '-sTCP:LISTEN']);\n}\n\nexport async function getGitInfo(cwd: string): Promise<{ branch: string | null; worktree: boolean }> {\n const branch = await execQuiet('git', ['-C', cwd, 'rev-parse', '--abbrev-ref', 'HEAD']);\n if (!branch) return { branch: null, worktree: false };\n\n const commonDir = await execQuiet('git', ['-C', cwd, 'rev-parse', '--git-common-dir']);\n const gitDir = await execQuiet('git', ['-C', cwd, 'rev-parse', '--git-dir']);\n\n let isWorktree = false;\n if (commonDir && gitDir && commonDir !== gitDir) {\n try {\n const resolvedCommon = await realpath(resolve(cwd, commonDir));\n const resolvedGit = await realpath(resolve(cwd, gitDir));\n isWorktree = resolvedCommon !== resolvedGit;\n } catch {\n isWorktree = false;\n }\n }\n\n return { branch: branch || null, worktree: isWorktree };\n}\n\n// --- Auto-linking ---\n\nexport interface AssignmentLink {\n project: string;\n slug: string;\n title: string;\n}\n\nexport interface WorkspaceRecord {\n projectSlug: string;\n assignmentSlug: string;\n assignmentTitle: string;\n worktreePath: string | null;\n branch: string | null;\n}\n\nexport async function loadWorkspaceRecords(projectsDir: string): Promise<WorkspaceRecord[]> {\n const records: WorkspaceRecord[] = [];\n try {\n const projects = await listProjects(projectsDir);\n\n for (const project of projects) {\n const assignmentsDir = resolve(projectsDir, project.slug, 'assignments');\n let slugs: string[];\n try {\n slugs = await readdir(assignmentsDir);\n } catch {\n continue;\n }\n for (const aslug of slugs) {\n const aFile = resolve(assignmentsDir, aslug, 'assignment.md');\n try {\n const raw = await readFile(aFile, 'utf-8');\n const [fm] = extractFrontmatter(raw);\n if (!fm) continue;\n records.push({\n projectSlug: project.slug,\n assignmentSlug: aslug,\n assignmentTitle: getField(fm, 'title') ?? aslug,\n worktreePath: getNestedField(fm, 'workspace', 'worktreePath') ?? null,\n branch: getNestedField(fm, 'workspace', 'branch') ?? null,\n });\n } catch {\n continue;\n }\n }\n }\n } catch {\n // If projects can't be loaded, auto-linking just returns no matches\n }\n return records;\n}\n\nexport async function resolveAndNormalize(p: string): Promise<string> {\n try {\n const resolved = await realpath(p);\n return resolved.replace(/\\/+$/, '');\n } catch {\n return p.replace(/\\/+$/, '');\n }\n}\n\nexport async function autoLinkPane(\n cwd: string,\n branch: string | null,\n records: WorkspaceRecord[],\n): Promise<AssignmentLink | null> {\n const normalizedCwd = await resolveAndNormalize(cwd);\n for (const rec of records) {\n if (rec.worktreePath) {\n const normalizedWt = await resolveAndNormalize(rec.worktreePath);\n if (normalizedCwd === normalizedWt) {\n return { project: rec.projectSlug, slug: rec.assignmentSlug, title: rec.assignmentTitle };\n }\n }\n }\n if (branch) {\n for (const rec of records) {\n if (rec.branch && rec.branch === branch) {\n return { project: rec.projectSlug, slug: rec.assignmentSlug, title: rec.assignmentTitle };\n }\n }\n }\n return null;\n}\n\n// --- Main scan function ---\n\nasync function scanSession(\n sessionData: SessionFileData,\n lsofOutput: string,\n workspaceRecords: WorkspaceRecord[],\n): Promise<TrackedSession> {\n const now = new Date().toISOString();\n const alive = await sessionAlive(sessionData.session);\n\n if (!alive) {\n return {\n name: sessionData.session,\n kind: 'tmux',\n registered: sessionData.registered,\n lastRefreshed: sessionData.lastRefreshed,\n scannedAt: now,\n alive: false,\n windows: [],\n };\n }\n\n const rawPanes = await listTmuxPanes(sessionData.session);\n\n // Group panes by window\n const windowMap = new Map<number, { name: string; panes: RawPane[] }>();\n for (const rp of rawPanes) {\n if (!windowMap.has(rp.windowIndex)) {\n windowMap.set(rp.windowIndex, { name: rp.windowName, panes: [] });\n }\n windowMap.get(rp.windowIndex)!.panes.push(rp);\n }\n\n // Get git info per unique cwd\n const cwdSet = new Set(rawPanes.map((p) => p.cwd));\n const gitInfoCache = new Map<string, { branch: string | null; worktree: boolean }>();\n for (const cwd of cwdSet) {\n gitInfoCache.set(cwd, await getGitInfo(cwd));\n }\n\n // Get all descendant PIDs for port lookup\n const pidToPaneKey = new Map<number, string>();\n for (const rp of rawPanes) {\n const descendants = await getDescendantPids(rp.pid);\n const key = `${rp.windowIndex}:${rp.paneIndex}`;\n for (const pid of descendants) {\n pidToPaneKey.set(pid, key);\n }\n }\n\n // Find ports per pane\n const panePorts = new Map<string, number[]>();\n for (const line of lsofOutput.split('\\n')) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length < 9) continue;\n const pid = parseInt(parts[1], 10);\n const paneKey = pidToPaneKey.get(pid);\n if (!paneKey) continue;\n const tcpAddr = parts.find((p) => p.includes(':') && /:\\d+$/.test(p));\n if (tcpAddr) {\n const port = parseInt(tcpAddr.split(':').pop()!, 10);\n if (!isNaN(port)) {\n if (!panePorts.has(paneKey)) panePorts.set(paneKey, []);\n const existing = panePorts.get(paneKey)!;\n if (!existing.includes(port)) existing.push(port);\n }\n }\n }\n\n // Build windows — use for-of loop, NOT .map() with async callback\n const windows: TrackedWindow[] = [];\n for (const [windowIndex, { name, panes: rawPanesInWindow }] of windowMap) {\n const panes: TrackedPane[] = [];\n for (const rp of rawPanesInWindow) {\n const key = `${rp.windowIndex}:${rp.paneIndex}`;\n const gitInfo = gitInfoCache.get(rp.cwd) ?? { branch: null, worktree: false };\n const ports = panePorts.get(key) ?? [];\n const urls = ports.map((p) => `http://localhost:${p}`);\n\n const override = sessionData.overrides[key];\n let assignment: AssignmentLink | null = null;\n if (override) {\n const rec = workspaceRecords.find(\n (r) => r.projectSlug === override.project && r.assignmentSlug === override.assignment,\n );\n assignment = {\n project: override.project,\n slug: override.assignment,\n title: rec?.assignmentTitle ?? override.assignment,\n };\n } else {\n assignment = await autoLinkPane(rp.cwd, gitInfo.branch, workspaceRecords);\n }\n\n panes.push({\n index: rp.paneIndex,\n command: rp.command,\n cwd: rp.cwd,\n branch: gitInfo.branch,\n worktree: gitInfo.worktree,\n ports,\n urls,\n assignment,\n });\n }\n\n windows.push({ index: windowIndex, name, panes });\n }\n\n windows.sort((a, b) => a.index - b.index);\n\n return {\n name: sessionData.session,\n kind: 'tmux' as const,\n registered: sessionData.registered,\n lastRefreshed: sessionData.lastRefreshed,\n scannedAt: now,\n alive: true,\n windows,\n };\n}\n\nasync function scanProcessSession(\n sessionData: SessionFileData,\n lsofOutput: string,\n workspaceRecords: WorkspaceRecord[],\n): Promise<TrackedSession> {\n const now = new Date().toISOString();\n\n // Check if the process is still alive\n let alive = false;\n if (sessionData.pid) {\n try {\n process.kill(sessionData.pid, 0);\n alive = true;\n } catch {\n alive = false;\n }\n }\n\n if (!alive || !sessionData.cwd) {\n return {\n name: sessionData.session,\n kind: 'process',\n registered: sessionData.registered,\n lastRefreshed: sessionData.lastRefreshed,\n scannedAt: now,\n alive: false,\n windows: [],\n };\n }\n\n // Re-resolve ports from lsof for the PID\n const ports = findListeningPorts(lsofOutput, new Set([sessionData.pid!]));\n\n const gitInfo = await getGitInfo(sessionData.cwd);\n\n // Honor manual overrides (process sessions use key \"0:0\")\n const override = sessionData.overrides['0:0'];\n let assignment: AssignmentLink | null = null;\n if (override) {\n const rec = workspaceRecords.find(\n (r) => r.projectSlug === override.project && r.assignmentSlug === override.assignment,\n );\n assignment = {\n project: override.project,\n slug: override.assignment,\n title: rec?.assignmentTitle ?? override.assignment,\n };\n } else {\n assignment = await autoLinkPane(sessionData.cwd, gitInfo.branch, workspaceRecords);\n }\n\n const pane: TrackedPane = {\n index: 0,\n command: sessionData.session,\n cwd: sessionData.cwd,\n branch: gitInfo.branch,\n worktree: gitInfo.worktree,\n ports,\n urls: ports.map((p) => `http://localhost:${p}`),\n assignment,\n };\n\n return {\n name: sessionData.session,\n kind: 'process' as const,\n registered: sessionData.registered,\n lastRefreshed: sessionData.lastRefreshed,\n scannedAt: now,\n alive: true,\n windows: [{ index: 0, name: 'process', panes: [pane] }],\n };\n}\n\nexport async function scanAllSessions(\n serversDir: string,\n projectsDir: string,\n options?: { bypassCache?: boolean },\n): Promise<ServersResponse> {\n if (!options?.bypassCache && cache && Date.now() < cache.expiry) {\n return cache.data;\n }\n\n const tmuxAvailable = await checkTmuxAvailable();\n const names = await listSessionFiles(serversDir);\n const lsofOutput = await getLsofOutput();\n const workspaceRecords = await loadWorkspaceRecords(projectsDir);\n\n const sessions: TrackedSession[] = [];\n for (const name of names) {\n const data = await readSessionFile(serversDir, name);\n if (!data) continue;\n\n if (data.kind === 'process') {\n sessions.push(await scanProcessSession(data, lsofOutput, workspaceRecords));\n } else if (tmuxAvailable) {\n sessions.push(await scanSession(data, lsofOutput, workspaceRecords));\n }\n // Skip tmux-kind entries when tmux is unavailable\n }\n\n const result: ServersResponse = { sessions, tmuxAvailable };\n cache = { data: result, expiry: Date.now() + CACHE_TTL_MS };\n return result;\n}\n\nexport async function scanSingleSession(\n serversDir: string,\n projectsDir: string,\n name: string,\n): Promise<TrackedSession | null> {\n const data = await readSessionFile(serversDir, name);\n if (!data) return null;\n\n const lsofOutput = await getLsofOutput();\n const workspaceRecords = await loadWorkspaceRecords(projectsDir);\n\n if (data.kind === 'process') {\n return scanProcessSession(data, lsofOutput, workspaceRecords);\n }\n return scanSession(data, lsofOutput, workspaceRecords);\n}\n","import { readdir, readFile, writeFile } from 'node:fs/promises';\nimport { resolve, dirname } from 'node:path';\nimport { getTargetStatus, DEFAULT_STATUSES, DEFAULT_TRANSITION_TABLE, buildTransitionTable } from '../lifecycle/index.js';\nimport { fileExists } from '../utils/fs.js';\nimport { readConfig, type StatusConfig, type StatusTransition } from '../utils/config.js';\nimport {\n parseProject,\n parseStatus,\n parseAssignmentFull,\n parsePlan,\n parseScratchpad,\n parseHandoff,\n parseDecisionRecord,\n parseResource,\n parseMemory,\n parsePlaybook,\n extractMermaidGraph,\n} from './parser.js';\nimport { getDashboardHelp } from './help.js';\nimport type {\n AssignmentBoardItem,\n AssignmentDetail,\n AssignmentSummary,\n AssignmentsBoardResponse,\n AssignmentTransitionAction,\n AttentionItem,\n AttentionResponse,\n EditableDocumentResponse,\n EnrichedLink,\n HelpResponse,\n MemorySummary,\n ProjectDetail,\n ProjectSummary,\n OverviewResponse,\n ProgressCounts,\n NeedsAttention,\n RecentActivityItem,\n ResourceSummary,\n PlaybookSummary,\n PlaybookDetail,\n} from './types.js';\n\nconst STALE_ASSIGNMENT_MS = 7 * 24 * 60 * 60 * 1000;\nconst ATTENTION_PAGE_LIMIT = 50;\nconst OVERVIEW_ATTENTION_LIMIT = 6;\nconst RECENT_PROJECTS_LIMIT = 6;\nconst RECENT_ACTIVITY_LIMIT = 12;\n\ntype AssignmentRecord = ReturnType<typeof parseAssignmentFull>;\n\ninterface ProjectRecord {\n projectPath: string;\n project: ReturnType<typeof parseProject>;\n assignments: AssignmentRecord[];\n summary: ProjectSummary;\n dependencyGraph: string | null;\n}\n\ninterface AttentionSeverityCounts {\n critical: number;\n high: number;\n medium: number;\n low: number;\n}\n\nconst DEFAULT_TRANSITION_DEFINITIONS: Array<{\n command: string;\n label: string;\n description: string;\n requiresReason: boolean;\n}> = [\n {\n command: 'start',\n label: 'Start',\n description: 'Move pending or review work into active execution.',\n requiresReason: false,\n },\n {\n command: 'review',\n label: 'Send To Review',\n description: 'Mark the assignment ready for inspection.',\n requiresReason: false,\n },\n {\n command: 'complete',\n label: 'Complete',\n description: 'Mark the assignment done.',\n requiresReason: false,\n },\n {\n command: 'block',\n label: 'Block',\n description: 'Record an exceptional blocker and pause work.',\n requiresReason: true,\n },\n {\n command: 'unblock',\n label: 'Unblock',\n description: 'Resume active work after the blocker is cleared.',\n requiresReason: false,\n },\n {\n command: 'fail',\n label: 'Fail',\n description: 'Mark the assignment as failed when it cannot be completed as planned.',\n requiresReason: false,\n },\n {\n command: 'reopen',\n label: 'Reopen',\n description: 'Reopen a completed or failed assignment to resume work.',\n requiresReason: false,\n },\n];\n\nconst DEFAULT_STATUS_COLORS: Record<string, string> = {\n pending: 'slate',\n in_progress: 'teal',\n blocked: 'amber',\n review: 'violet',\n completed: 'emerald',\n failed: 'rose',\n};\n\nfunction toTitleCase(s: string): string {\n return s.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction getTransitionDefinitions(config: ResolvedStatusConfig) {\n if (!config.custom) return DEFAULT_TRANSITION_DEFINITIONS;\n // Deduplicate commands from transitions\n const seen = new Set<string>();\n return config.transitions\n .filter((t) => {\n if (seen.has(t.command)) return false;\n seen.add(t.command);\n return true;\n })\n .map((t) => ({\n command: t.command,\n label: t.label ?? toTitleCase(t.command),\n description: t.description ?? `Transition via ${t.command}.`,\n requiresReason: t.requiresReason ?? false,\n }));\n}\n\ninterface ResolvedStatusConfig {\n custom: boolean;\n statuses: Array<{ id: string; label: string; description?: string; color?: string; terminal?: boolean }>;\n order: string[];\n transitions: StatusTransition[];\n transitionTable: Map<string, string>;\n terminalStatuses: ReadonlySet<string>;\n}\n\nlet _cachedConfig: ResolvedStatusConfig | null = null;\n\nexport async function getStatusConfig(): Promise<ResolvedStatusConfig> {\n if (_cachedConfig) return _cachedConfig;\n\n const config = await readConfig();\n\n if (config.statuses) {\n const terminalSet = new Set(\n config.statuses.statuses.filter((s) => s.terminal).map((s) => s.id),\n );\n _cachedConfig = {\n custom: true,\n statuses: config.statuses.statuses,\n order: config.statuses.order,\n transitions: config.statuses.transitions,\n transitionTable: buildTransitionTable(config.statuses.transitions),\n terminalStatuses: terminalSet.size > 0 ? terminalSet : new Set(['completed', 'failed']),\n };\n } else {\n _cachedConfig = {\n custom: false,\n statuses: DEFAULT_STATUSES.map((id) => ({\n id,\n label: toTitleCase(id),\n color: DEFAULT_STATUS_COLORS[id] ?? 'gray',\n terminal: id === 'completed' || id === 'failed',\n })),\n order: [...DEFAULT_STATUSES],\n transitions: Array.from(DEFAULT_TRANSITION_TABLE.entries()).map(([key, to]) => {\n const [from, command] = key.split(':');\n return { from, command, to };\n }),\n transitionTable: DEFAULT_TRANSITION_TABLE,\n terminalStatuses: new Set(['completed', 'failed']),\n };\n }\n\n return _cachedConfig;\n}\n\nexport function clearStatusConfigCache(): void {\n _cachedConfig = null;\n}\n\n/**\n * List all projects with source-first summary data.\n * GET /api/projects\n */\nexport async function listProjects(projectsDir: string): Promise<ProjectSummary[]> {\n const projectRecords = await listProjectRecords(projectsDir);\n return projectRecords.map((record) => record.summary);\n}\n\n/**\n * Read the workspace registry file (~/.syntaur/workspaces.json).\n * Returns an array of explicitly registered workspace names.\n */\nasync function readWorkspaceRegistry(projectsDir: string): Promise<string[]> {\n const registryPath = resolve(dirname(projectsDir), 'workspaces.json');\n try {\n const raw = await readFile(registryPath, 'utf-8');\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? parsed.filter((w): w is string => typeof w === 'string') : [];\n } catch {\n return [];\n }\n}\n\nasync function writeWorkspaceRegistry(projectsDir: string, workspaces: string[]): Promise<void> {\n const registryPath = resolve(dirname(projectsDir), 'workspaces.json');\n await writeFile(registryPath, JSON.stringify(workspaces, null, 2) + '\\n', 'utf-8');\n}\n\n/**\n * List all workspaces: merge registry (explicit) with discovered (from projects).\n * GET /api/workspaces\n */\nexport async function listWorkspaces(projectsDir: string): Promise<{ workspaces: string[]; hasUngrouped: boolean }> {\n const [projectRecords, registered] = await Promise.all([\n listProjectRecords(projectsDir),\n readWorkspaceRegistry(projectsDir),\n ]);\n const workspaceSet = new Set<string>(registered);\n let hasUngrouped = false;\n for (const record of projectRecords) {\n if (record.project.workspace) {\n workspaceSet.add(record.project.workspace);\n } else {\n hasUngrouped = true;\n }\n }\n const workspaces = Array.from(workspaceSet).sort();\n return { workspaces, hasUngrouped };\n}\n\n/**\n * Create an empty workspace by registering it.\n * POST /api/workspaces\n */\nexport async function createWorkspace(projectsDir: string, name: string): Promise<void> {\n const registered = await readWorkspaceRegistry(projectsDir);\n if (!registered.includes(name)) {\n registered.push(name);\n registered.sort();\n await writeWorkspaceRegistry(projectsDir, registered);\n }\n}\n\n/**\n * Delete a workspace from the registry.\n * DELETE /api/workspaces/:name\n */\nexport async function deleteWorkspace(projectsDir: string, name: string): Promise<void> {\n const registered = await readWorkspaceRegistry(projectsDir);\n const filtered = registered.filter((w) => w !== name);\n await writeWorkspaceRegistry(projectsDir, filtered);\n}\n\n/**\n * Get overview data used by the app landing page.\n * GET /api/overview\n */\nexport async function getOverview(projectsDir: string, serversDir?: string): Promise<OverviewResponse> {\n const projectRecords = await listProjectRecords(projectsDir);\n const attention = buildAttentionItems(projectRecords);\n const recentActivity = buildRecentActivity(projectRecords);\n\n let serverStats: OverviewResponse['serverStats'];\n if (serversDir) {\n try {\n const { scanAllSessions } = await import('./scanner.js');\n const servers = await scanAllSessions(serversDir, projectsDir);\n if (servers.tmuxAvailable) {\n const alive = servers.sessions.filter(s => s.alive).length;\n const totalPorts = servers.sessions.reduce((sum, s) =>\n sum + s.windows.reduce((ws, w) =>\n ws + w.panes.reduce((ps, p) => ps + p.ports.length, 0), 0), 0);\n serverStats = {\n trackedSessions: servers.sessions.length,\n aliveSessions: alive,\n deadSessions: servers.sessions.length - alive,\n totalPorts,\n };\n }\n } catch {\n // Server scanning failure should not break overview\n }\n }\n\n return {\n generatedAt: new Date().toISOString(),\n firstRun: projectRecords.length === 0,\n stats: {\n activeProjects: projectRecords.filter((record) => record.summary.status === 'active').length,\n inProgressAssignments: projectRecords.reduce(\n (total, record) => total + (record.summary.progress['in_progress'] ?? 0),\n 0,\n ),\n blockedAssignments: projectRecords.reduce(\n (total, record) => total + (record.summary.progress['blocked'] ?? 0),\n 0,\n ),\n reviewAssignments: projectRecords.reduce(\n (total, record) => total + (record.summary.progress['review'] ?? 0),\n 0,\n ),\n failedAssignments: projectRecords.reduce(\n (total, record) => total + (record.summary.progress['failed'] ?? 0),\n 0,\n ),\n staleAssignments: projectRecords.reduce(\n (total, record) =>\n total + record.assignments.filter((assignment) => isStale(assignment.updated)).length,\n 0,\n ),\n },\n attention: attention.slice(0, OVERVIEW_ATTENTION_LIMIT),\n recentProjects: projectRecords\n .map((record) => record.summary)\n .sort((left, right) => compareTimestamps(right.updated, left.updated))\n .slice(0, RECENT_PROJECTS_LIMIT),\n recentActivity: recentActivity.slice(0, RECENT_ACTIVITY_LIMIT),\n serverStats,\n };\n}\n\n/**\n * Get the explicit attention queue.\n * GET /api/attention\n */\nexport async function getAttention(projectsDir: string, serversDir?: string): Promise<AttentionResponse> {\n const projectRecords = await listProjectRecords(projectsDir);\n const items = buildAttentionItems(projectRecords);\n\n if (serversDir) {\n try {\n const { scanAllSessions } = await import('./scanner.js');\n const servers = await scanAllSessions(serversDir, projectsDir);\n for (const session of servers.sessions) {\n if (!session.alive) {\n items.push({\n id: `server-dead-${session.name}`,\n severity: 'low',\n projectSlug: '',\n projectTitle: '',\n assignmentSlug: '',\n assignmentTitle: `tmux: ${session.name}`,\n status: 'failed',\n reason: 'Tmux session no longer exists but is still registered',\n updated: session.lastRefreshed,\n href: '/servers',\n stale: false,\n blockedReason: null,\n });\n }\n }\n } catch {\n // Server scanning failure should not break attention\n }\n }\n\n const pagedItems = items.slice(0, ATTENTION_PAGE_LIMIT);\n const summary: AttentionSeverityCounts = {\n critical: 0,\n high: 0,\n medium: 0,\n low: 0,\n };\n\n for (const item of pagedItems) {\n summary[item.severity]++;\n }\n\n return {\n generatedAt: new Date().toISOString(),\n summary: {\n total: pagedItems.length,\n critical: summary.critical,\n high: summary.high,\n medium: summary.medium,\n low: summary.low,\n },\n items: pagedItems,\n };\n}\n\n/**\n * Get all assignments across all projects for the global kanban board.\n * GET /api/assignments\n */\nexport async function listAssignmentsBoard(projectsDir: string): Promise<AssignmentsBoardResponse> {\n const projectRecords = await listProjectRecords(projectsDir);\n const assignments = await Promise.all(\n projectRecords.flatMap(async (record) =>\n Promise.all(\n record.assignments.map(async (assignment) =>\n toAssignmentBoardItem(projectsDir, record, assignment),\n ),\n ),\n ),\n );\n\n return {\n generatedAt: new Date().toISOString(),\n assignments: assignments\n .flat()\n .sort((left, right) => compareTimestamps(right.updated, left.updated)),\n };\n}\n\n/**\n * Get the structured help model used by Help and onboarding surfaces.\n * GET /api/help\n */\nexport async function getHelp(): Promise<HelpResponse> {\n return getDashboardHelp();\n}\n\n/**\n * Get a raw editable document for dashboard editor pages.\n */\nexport async function getEditableDocument(\n projectsDir: string,\n documentType: EditableDocumentResponse['documentType'],\n projectSlug: string,\n assignmentSlug?: string,\n): Promise<EditableDocumentResponse | null> {\n const filePath = getDocumentPath(projectsDir, documentType, projectSlug, assignmentSlug);\n if (!filePath || !(await fileExists(filePath))) {\n return null;\n }\n\n const content = await readFile(filePath, 'utf-8');\n const title = getEditableDocumentTitle(documentType, projectSlug, assignmentSlug);\n\n return {\n documentType,\n title,\n content,\n projectSlug,\n assignmentSlug,\n appendOnly: documentType === 'handoff' || documentType === 'decision-record',\n };\n}\n\n/**\n * Get full project detail with assignments, resources, and memories.\n * GET /api/projects/:slug\n */\nexport async function getProjectDetail(\n projectsDir: string,\n slug: string,\n): Promise<ProjectDetail | null> {\n const projectPath = resolve(projectsDir, slug);\n const projectMdPath = resolve(projectPath, 'project.md');\n\n if (!(await fileExists(projectMdPath))) {\n return null;\n }\n\n const projectContent = await readFile(projectMdPath, 'utf-8');\n const project = parseProject(projectContent);\n const assignments = await listAssignmentRecords(projectPath);\n const rollup = buildProjectRollup(project, assignments);\n const dependencyGraph = await loadDependencyGraph(projectPath, assignments);\n const resources = await listResources(projectPath);\n const memories = await listMemories(projectPath);\n const updated = getProjectActivityTimestamp(project.updated, assignments);\n\n return {\n slug: project.slug || slug,\n title: project.title,\n status: rollup.status,\n statusOverride: project.statusOverride,\n archived: project.archived,\n archivedAt: project.archivedAt,\n archivedReason: project.archivedReason,\n created: project.created,\n updated,\n tags: project.tags,\n body: project.body,\n progress: rollup.progress,\n needsAttention: rollup.needsAttention,\n assignments: assignments\n .map(toAssignmentSummary)\n .sort((left, right) => compareTimestamps(right.updated, left.updated)),\n resources,\n memories,\n dependencyGraph,\n workspace: project.workspace,\n };\n}\n\n/**\n * Get full assignment detail with plan, scratchpad, handoff, and decision record.\n * GET /api/projects/:slug/assignments/:aslug\n */\nexport async function getAssignmentDetail(\n projectsDir: string,\n projectSlug: string,\n assignmentSlug: string,\n): Promise<AssignmentDetail | null> {\n const assignmentDir = resolve(projectsDir, projectSlug, 'assignments', assignmentSlug);\n const assignmentMdPath = resolve(assignmentDir, 'assignment.md');\n\n if (!(await fileExists(assignmentMdPath))) {\n return null;\n }\n\n const assignmentContent = await readFile(assignmentMdPath, 'utf-8');\n const assignment = parseAssignmentFull(assignmentContent);\n\n let plan: AssignmentDetail['plan'] = null;\n const planPath = resolve(assignmentDir, 'plan.md');\n if (await fileExists(planPath)) {\n const planContent = await readFile(planPath, 'utf-8');\n const parsed = parsePlan(planContent);\n plan = {\n status: parsed.status,\n updated: parsed.updated,\n body: parsed.body,\n };\n }\n\n let scratchpad: AssignmentDetail['scratchpad'] = null;\n const scratchpadPath = resolve(assignmentDir, 'scratchpad.md');\n if (await fileExists(scratchpadPath)) {\n const scratchpadContent = await readFile(scratchpadPath, 'utf-8');\n const parsed = parseScratchpad(scratchpadContent);\n scratchpad = {\n updated: parsed.updated,\n body: parsed.body,\n };\n }\n\n let handoff: AssignmentDetail['handoff'] = null;\n const handoffPath = resolve(assignmentDir, 'handoff.md');\n if (await fileExists(handoffPath)) {\n const handoffContent = await readFile(handoffPath, 'utf-8');\n const parsed = parseHandoff(handoffContent);\n handoff = {\n updated: parsed.updated,\n handoffCount: parsed.handoffCount,\n body: parsed.body,\n };\n }\n\n let decisionRecord: AssignmentDetail['decisionRecord'] = null;\n const decisionRecordPath = resolve(assignmentDir, 'decision-record.md');\n if (await fileExists(decisionRecordPath)) {\n const decisionRecordContent = await readFile(decisionRecordPath, 'utf-8');\n const parsed = parseDecisionRecord(decisionRecordContent);\n decisionRecord = {\n updated: parsed.updated,\n decisionCount: parsed.decisionCount,\n body: parsed.body,\n };\n }\n\n const detail: AssignmentDetail = {\n id: assignment.id,\n projectSlug,\n slug: assignment.slug || assignmentSlug,\n title: assignment.title,\n status: assignment.status,\n priority: assignment.priority as AssignmentDetail['priority'],\n assignee: assignment.assignee,\n dependsOn: assignment.dependsOn,\n links: assignment.links,\n reverseLinks: [],\n enrichedLinks: [],\n blockedReason: assignment.blockedReason,\n workspace: assignment.workspace,\n externalIds: assignment.externalIds,\n tags: assignment.tags,\n created: assignment.created,\n updated: assignment.updated,\n body: assignment.body,\n plan,\n scratchpad,\n handoff,\n decisionRecord,\n availableTransitions: await getAvailableTransitions(\n projectsDir,\n projectSlug,\n assignmentSlug,\n assignment,\n ),\n };\n\n // Compute reverse links and enrich all links\n const selfSlug = `${projectSlug}/${detail.slug}`;\n const projectRecords = await listProjectRecords(projectsDir);\n\n // Find reverse links: assignments across all projects whose links contain this assignment\n const reverseLinks: string[] = [];\n for (const mr of projectRecords) {\n for (const a of mr.assignments) {\n const qualifiedSlug = `${mr.summary.slug}/${a.slug}`;\n if (qualifiedSlug === selfSlug) continue; // skip self\n if (a.links.includes(selfSlug)) {\n reverseLinks.push(qualifiedSlug);\n }\n }\n }\n\n // Filter self-links and malformed links from forward links\n const isValidLinkFormat = (l: string) => {\n const parts = l.split('/');\n return parts.length === 2 && parts[0].length > 0 && parts[1].length > 0;\n };\n const forwardLinks = assignment.links.filter((l) => l !== selfSlug && isValidLinkFormat(l));\n\n // Deduplicate: if a slug is in both forward and reverse, keep in forward only\n const forwardSet = new Set(forwardLinks);\n const dedupedReverseLinks = reverseLinks.filter((l) => !forwardSet.has(l));\n\n detail.links = forwardLinks;\n detail.reverseLinks = dedupedReverseLinks;\n\n // Build enriched links for the frontend\n const allProjectAssignments = new Map<string, { title: string; status: string }>();\n for (const mr of projectRecords) {\n for (const a of mr.assignments) {\n allProjectAssignments.set(`${mr.summary.slug}/${a.slug}`, {\n title: a.title,\n status: a.status,\n });\n }\n }\n\n const enrichedLinks: EnrichedLink[] = [];\n for (const linkSlug of forwardLinks) {\n const [ms, as] = linkSlug.split('/');\n const info = allProjectAssignments.get(linkSlug);\n enrichedLinks.push({\n slug: linkSlug,\n projectSlug: ms,\n assignmentSlug: as,\n title: info?.title ?? linkSlug,\n status: info?.status ?? 'pending',\n isReverse: false,\n });\n }\n for (const linkSlug of dedupedReverseLinks) {\n const [ms, as] = linkSlug.split('/');\n const info = allProjectAssignments.get(linkSlug);\n enrichedLinks.push({\n slug: linkSlug,\n projectSlug: ms,\n assignmentSlug: as,\n title: info?.title ?? linkSlug,\n status: info?.status ?? 'pending',\n isReverse: true,\n });\n }\n\n detail.enrichedLinks = enrichedLinks;\n\n return detail;\n}\n\nasync function listProjectRecords(projectsDir: string): Promise<ProjectRecord[]> {\n if (!(await fileExists(projectsDir))) {\n return [];\n }\n\n const entries = await readdir(projectsDir, { withFileTypes: true });\n const projectDirs = entries.filter((entry) => entry.isDirectory() && !entry.name.startsWith('.'));\n const records: ProjectRecord[] = [];\n\n for (const entry of projectDirs) {\n const projectPath = resolve(projectsDir, entry.name);\n const projectMdPath = resolve(projectPath, 'project.md');\n\n if (!(await fileExists(projectMdPath))) {\n continue;\n }\n\n const projectContent = await readFile(projectMdPath, 'utf-8');\n const project = parseProject(projectContent);\n const assignments = await listAssignmentRecords(projectPath);\n const rollup = buildProjectRollup(project, assignments);\n const updated = getProjectActivityTimestamp(project.updated, assignments);\n\n records.push({\n projectPath,\n project,\n assignments,\n dependencyGraph: await loadDependencyGraph(projectPath, assignments),\n summary: {\n slug: project.slug || entry.name,\n title: project.title,\n status: rollup.status,\n statusOverride: project.statusOverride,\n archived: project.archived,\n archivedAt: project.archivedAt,\n archivedReason: project.archivedReason,\n created: project.created,\n updated,\n tags: project.tags,\n progress: rollup.progress,\n needsAttention: rollup.needsAttention,\n workspace: project.workspace,\n },\n });\n }\n\n records.sort((left, right) => compareTimestamps(right.summary.updated, left.summary.updated));\n return records;\n}\n\nasync function listAssignmentRecords(projectPath: string): Promise<AssignmentRecord[]> {\n const assignmentsDir = resolve(projectPath, 'assignments');\n if (!(await fileExists(assignmentsDir))) {\n return [];\n }\n\n const entries = await readdir(assignmentsDir, { withFileTypes: true });\n const records: AssignmentRecord[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n const assignmentMd = resolve(assignmentsDir, entry.name, 'assignment.md');\n if (!(await fileExists(assignmentMd))) {\n continue;\n }\n\n const content = await readFile(assignmentMd, 'utf-8');\n records.push(parseAssignmentFull(content));\n }\n\n records.sort((left, right) => compareTimestamps(right.updated, left.updated));\n return records;\n}\n\nasync function listResources(projectPath: string): Promise<ResourceSummary[]> {\n const resourcesDir = resolve(projectPath, 'resources');\n if (!(await fileExists(resourcesDir))) {\n return [];\n }\n\n const entries = await readdir(resourcesDir, { withFileTypes: true });\n const results: ResourceSummary[] = [];\n\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith('.md') || entry.name.startsWith('_')) {\n continue;\n }\n\n const filePath = resolve(resourcesDir, entry.name);\n const content = await readFile(filePath, 'utf-8');\n const parsed = parseResource(content);\n results.push({\n name: parsed.name,\n slug: entry.name.replace(/\\.md$/, ''),\n category: parsed.category,\n source: parsed.source,\n relatedAssignments: parsed.relatedAssignments,\n updated: parsed.updated,\n });\n }\n\n results.sort((left, right) => compareTimestamps(right.updated, left.updated));\n return results;\n}\n\nasync function listMemories(projectPath: string): Promise<MemorySummary[]> {\n const memoriesDir = resolve(projectPath, 'memories');\n if (!(await fileExists(memoriesDir))) {\n return [];\n }\n\n const entries = await readdir(memoriesDir, { withFileTypes: true });\n const results: MemorySummary[] = [];\n\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith('.md') || entry.name.startsWith('_')) {\n continue;\n }\n\n const filePath = resolve(memoriesDir, entry.name);\n const content = await readFile(filePath, 'utf-8');\n const parsed = parseMemory(content);\n results.push({\n name: parsed.name,\n slug: entry.name.replace(/\\.md$/, ''),\n source: parsed.source,\n scope: parsed.scope,\n sourceAssignment: parsed.sourceAssignment,\n updated: parsed.updated,\n });\n }\n\n results.sort((left, right) => compareTimestamps(right.updated, left.updated));\n return results;\n}\n\nasync function loadDependencyGraph(\n projectPath: string,\n assignments: AssignmentRecord[],\n): Promise<string | null> {\n const statusPath = resolve(projectPath, '_status.md');\n if (await fileExists(statusPath)) {\n const statusContent = await readFile(statusPath, 'utf-8');\n const parsed = parseStatus(statusContent);\n const derivedGraph = extractMermaidGraph(parsed.body);\n if (derivedGraph) {\n return derivedGraph;\n }\n }\n\n return buildDependencyGraph(assignments);\n}\n\nfunction buildProjectRollup(\n project: ReturnType<typeof parseProject>,\n assignments: AssignmentRecord[],\n): {\n progress: ProgressCounts;\n needsAttention: NeedsAttention;\n status: string;\n} {\n const progress: ProgressCounts = { total: assignments.length };\n\n let openQuestions = 0;\n for (const assignment of assignments) {\n const s = assignment.status;\n progress[s] = (progress[s] ?? 0) + 1;\n openQuestions += countPendingAnswers(assignment.body);\n }\n\n const needsAttention: NeedsAttention = {\n blockedCount: progress['blocked'] ?? 0,\n failedCount: progress['failed'] ?? 0,\n openQuestions,\n };\n\n let status = 'pending';\n if (project.statusOverride) {\n status = project.statusOverride;\n } else if (project.archived) {\n status = 'archived';\n } else if (progress.total > 0 && (progress['completed'] ?? 0) === progress.total) {\n status = 'completed';\n } else if ((progress['in_progress'] ?? 0) > 0 || (progress['review'] ?? 0) > 0) {\n status = 'active';\n } else if ((progress['failed'] ?? 0) > 0) {\n status = 'failed';\n } else if ((progress['blocked'] ?? 0) > 0) {\n status = 'blocked';\n } else if (progress.total === 0 || (progress['pending'] ?? 0) === progress.total) {\n status = 'pending';\n } else {\n status = 'active';\n }\n\n return { progress, needsAttention, status };\n}\n\nfunction toAssignmentSummary(assignment: AssignmentRecord): AssignmentSummary {\n return {\n id: assignment.id,\n slug: assignment.slug,\n title: assignment.title,\n status: assignment.status,\n priority: assignment.priority as AssignmentSummary['priority'],\n assignee: assignment.assignee,\n dependsOn: assignment.dependsOn,\n links: assignment.links,\n updated: assignment.updated,\n };\n}\n\nasync function toAssignmentBoardItem(\n projectsDir: string,\n projectRecord: ProjectRecord,\n assignment: AssignmentRecord,\n): Promise<AssignmentBoardItem> {\n return {\n ...toAssignmentSummary(assignment),\n projectSlug: projectRecord.summary.slug,\n projectTitle: projectRecord.summary.title,\n blockedReason: assignment.blockedReason,\n projectWorkspace: projectRecord.project.workspace,\n availableTransitions: await getAvailableTransitions(\n projectsDir,\n projectRecord.summary.slug,\n assignment.slug,\n assignment,\n ),\n };\n}\n\nconst DEFAULT_GRAPH_COLORS: Record<string, string> = {\n completed: 'fill:#4ea84f,stroke:#1f6b29,color:#ffffff',\n in_progress: 'fill:#1e6fd9,stroke:#0f3f8f,color:#ffffff',\n pending: 'fill:#c0ccd9,stroke:#738399,color:#163047',\n blocked: 'fill:#db5a3f,stroke:#8d2815,color:#ffffff',\n failed: 'fill:#9f2d2d,stroke:#651616,color:#ffffff',\n review: 'fill:#c6911e,stroke:#7a5a10,color:#ffffff',\n};\n\nfunction buildDependencyGraph(assignments: AssignmentRecord[]): string | null {\n const edges: string[] = [];\n const usedStatuses = new Set<string>();\n\n for (const assignment of assignments) {\n for (const dependency of assignment.dependsOn) {\n const depStatus = findAssignmentStatus(assignments, dependency);\n usedStatuses.add(depStatus);\n usedStatuses.add(assignment.status);\n edges.push(\n ` ${dependency}:::${depStatus} --> ${assignment.slug}:::${assignment.status}`,\n );\n }\n }\n\n if (edges.length === 0) {\n return null;\n }\n\n const classDefs: string[] = [];\n for (const status of usedStatuses) {\n const colors = DEFAULT_GRAPH_COLORS[status] ?? 'fill:#94a3b8,stroke:#64748b,color:#ffffff';\n classDefs.push(` classDef ${status} ${colors}`);\n }\n\n return ['graph TD', ...edges, ...classDefs].join('\\n');\n}\n\nfunction findAssignmentStatus(assignments: AssignmentRecord[], slug: string): string {\n return assignments.find((assignment) => assignment.slug === slug)?.status ?? 'pending';\n}\n\nasync function getAvailableTransitions(\n projectsDir: string,\n projectSlug: string,\n assignmentSlug: string,\n assignment: AssignmentRecord,\n): Promise<AssignmentTransitionAction[]> {\n const config = await getStatusConfig();\n const transitionDefs = getTransitionDefinitions(config);\n const actions: AssignmentTransitionAction[] = [];\n const projectPath = resolve(projectsDir, projectSlug);\n\n for (const definition of transitionDefs) {\n let warning: string | null = null;\n\n if (definition.command === 'start' && !assignment.assignee) {\n warning = 'No assignee set — consider assigning before starting.';\n }\n\n if (definition.command === 'start' && assignment.dependsOn.length > 0) {\n const unmetDependencies = await getUnmetDependencies(projectPath, assignment.dependsOn, config.terminalStatuses);\n if (unmetDependencies.length > 0) {\n warning = `Unmet dependencies: ${unmetDependencies.join(', ')}.`;\n }\n }\n\n const target = getTargetStatus(assignment.status, definition.command, config.transitionTable);\n\n actions.push({\n command: definition.command,\n label: definition.label,\n description: definition.description,\n targetStatus: target ?? definition.command,\n disabled: false,\n disabledReason: null,\n warning,\n requiresReason: definition.requiresReason,\n });\n }\n\n return actions;\n}\n\nasync function getUnmetDependencies(projectPath: string, dependsOn: string[], terminalStatuses?: ReadonlySet<string>): Promise<string[]> {\n const terminals = terminalStatuses ?? new Set(['completed']);\n const unmet: string[] = [];\n\n for (const dependency of dependsOn) {\n const dependencyPath = resolve(projectPath, 'assignments', dependency, 'assignment.md');\n if (!(await fileExists(dependencyPath))) {\n unmet.push(`${dependency} (missing)`);\n continue;\n }\n\n const content = await readFile(dependencyPath, 'utf-8');\n const parsed = parseAssignmentFull(content);\n if (!terminals.has(parsed.status)) {\n unmet.push(`${dependency} (${parsed.status})`);\n }\n }\n\n return unmet;\n}\n\nfunction buildAttentionItems(projectRecords: ProjectRecord[]): AttentionItem[] {\n const items: AttentionItem[] = [];\n\n for (const record of projectRecords) {\n for (const assignment of record.assignments) {\n const stale = isStale(assignment.updated);\n const base = {\n projectSlug: record.summary.slug,\n projectTitle: record.summary.title,\n assignmentSlug: assignment.slug,\n assignmentTitle: assignment.title,\n status: assignment.status,\n updated: assignment.updated,\n href: `/projects/${record.summary.slug}/assignments/${assignment.slug}`,\n blockedReason: assignment.blockedReason,\n stale,\n };\n\n if (assignment.status === 'failed') {\n items.push({\n id: `${record.summary.slug}:${assignment.slug}:failed`,\n severity: 'critical',\n reason: 'Marked failed and needs a recovery decision.',\n ...base,\n });\n }\n\n if (assignment.status === 'blocked') {\n items.push({\n id: `${record.summary.slug}:${assignment.slug}:blocked`,\n severity: 'high',\n reason: assignment.blockedReason || 'Blocked and waiting for intervention.',\n ...base,\n });\n }\n\n if (assignment.status === 'review') {\n items.push({\n id: `${record.summary.slug}:${assignment.slug}:review`,\n severity: 'medium',\n reason: 'Ready for review.',\n ...base,\n });\n }\n\n if (stale) {\n items.push({\n id: `${record.summary.slug}:${assignment.slug}:stale`,\n severity: 'low',\n reason: 'No source updates have been recorded in the last 7 days.',\n ...base,\n });\n }\n }\n }\n\n return items.sort(compareAttentionItems);\n}\n\nfunction buildRecentActivity(projectRecords: ProjectRecord[]): RecentActivityItem[] {\n const activity: RecentActivityItem[] = [];\n\n for (const record of projectRecords) {\n activity.push({\n id: `project:${record.summary.slug}`,\n type: 'project',\n title: record.summary.title,\n updated: record.summary.updated,\n href: `/projects/${record.summary.slug}`,\n projectSlug: record.summary.slug,\n projectTitle: record.summary.title,\n assignmentSlug: null,\n summary: `Project status is ${record.summary.status}.`,\n });\n\n for (const assignment of record.assignments) {\n activity.push({\n id: `assignment:${record.summary.slug}:${assignment.slug}`,\n type: 'assignment',\n title: assignment.title,\n updated: assignment.updated,\n href: `/projects/${record.summary.slug}/assignments/${assignment.slug}`,\n projectSlug: record.summary.slug,\n projectTitle: record.summary.title,\n assignmentSlug: assignment.slug,\n summary: `Assignment is ${assignment.status} with ${assignment.priority} priority.`,\n });\n }\n }\n\n activity.sort((left, right) => compareTimestamps(right.updated, left.updated));\n return activity;\n}\n\nfunction compareAttentionItems(left: AttentionItem, right: AttentionItem): number {\n const severityRank = { critical: 0, high: 1, medium: 2, low: 3 };\n const severityDifference = severityRank[left.severity] - severityRank[right.severity];\n if (severityDifference !== 0) {\n return severityDifference;\n }\n return compareTimestamps(right.updated, left.updated);\n}\n\nfunction compareTimestamps(left: string, right: string): number {\n return parseTimestamp(left) - parseTimestamp(right);\n}\n\nfunction parseTimestamp(timestamp: string): number {\n const parsed = Date.parse(timestamp);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction isStale(updated: string): boolean {\n const timestamp = parseTimestamp(updated);\n if (timestamp === 0) {\n return false;\n }\n return Date.now() - timestamp > STALE_ASSIGNMENT_MS;\n}\n\nfunction countPendingAnswers(body: string): number {\n const matches = body.match(/^\\*\\*A:\\*\\*\\s+pending\\s*$/gim);\n return matches ? matches.length : 0;\n}\n\nfunction getProjectActivityTimestamp(projectUpdated: string, assignments: AssignmentRecord[]): string {\n let latest = projectUpdated;\n for (const assignment of assignments) {\n if (compareTimestamps(assignment.updated, latest) > 0) {\n latest = assignment.updated;\n }\n }\n return latest;\n}\n\nfunction getDocumentPath(\n projectsDir: string,\n documentType: EditableDocumentResponse['documentType'],\n projectSlug: string,\n assignmentSlug?: string,\n): string | null {\n switch (documentType) {\n case 'project':\n return resolve(projectsDir, projectSlug, 'project.md');\n case 'assignment':\n return assignmentSlug\n ? resolve(projectsDir, projectSlug, 'assignments', assignmentSlug, 'assignment.md')\n : null;\n case 'plan':\n return assignmentSlug\n ? resolve(projectsDir, projectSlug, 'assignments', assignmentSlug, 'plan.md')\n : null;\n case 'scratchpad':\n return assignmentSlug\n ? resolve(projectsDir, projectSlug, 'assignments', assignmentSlug, 'scratchpad.md')\n : null;\n case 'handoff':\n return assignmentSlug\n ? resolve(projectsDir, projectSlug, 'assignments', assignmentSlug, 'handoff.md')\n : null;\n case 'decision-record':\n return assignmentSlug\n ? resolve(projectsDir, projectSlug, 'assignments', assignmentSlug, 'decision-record.md')\n : null;\n default:\n return null;\n }\n}\n\nfunction getEditableDocumentTitle(\n documentType: EditableDocumentResponse['documentType'],\n projectSlug: string,\n assignmentSlug?: string,\n): string {\n switch (documentType) {\n case 'project':\n return `Edit Project: ${projectSlug}`;\n case 'assignment':\n return `Edit Assignment: ${assignmentSlug || 'assignment'}`;\n case 'plan':\n return `Edit Plan: ${assignmentSlug || 'assignment'}`;\n case 'scratchpad':\n return `Edit Scratchpad: ${assignmentSlug || 'assignment'}`;\n case 'handoff':\n return `Append Handoff: ${assignmentSlug || 'assignment'}`;\n case 'decision-record':\n return `Append Decision: ${assignmentSlug || 'assignment'}`;\n case 'playbook':\n return `Edit Playbook: ${projectSlug}`;\n default:\n return projectSlug;\n }\n}\n\n// --- Playbook API ---\n\nexport async function listPlaybooks(playbooksDir: string): Promise<PlaybookSummary[]> {\n if (!(await fileExists(playbooksDir))) return [];\n\n const entries = await readdir(playbooksDir, { withFileTypes: true });\n const playbooks: PlaybookSummary[] = [];\n\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith('.md') || entry.name.startsWith('_') || entry.name === 'manifest.md') continue;\n\n const filePath = resolve(playbooksDir, entry.name);\n const raw = await readFile(filePath, 'utf-8');\n const parsed = parsePlaybook(raw);\n\n const slug = parsed.slug || entry.name.replace(/\\.md$/, '');\n playbooks.push({\n slug,\n name: parsed.name || slug,\n description: parsed.description,\n whenToUse: parsed.whenToUse,\n tags: parsed.tags,\n created: parsed.created,\n updated: parsed.updated,\n });\n }\n\n return playbooks.sort((a, b) => (b.updated || b.created).localeCompare(a.updated || a.created));\n}\n\nexport async function getPlaybookDetail(\n playbooksDir: string,\n slug: string,\n): Promise<PlaybookDetail | null> {\n const filePath = resolve(playbooksDir, `${slug}.md`);\n if (!(await fileExists(filePath))) return null;\n\n const raw = await readFile(filePath, 'utf-8');\n const parsed = parsePlaybook(raw);\n\n return {\n slug: parsed.slug || slug,\n name: parsed.name || slug,\n description: parsed.description,\n whenToUse: parsed.whenToUse,\n tags: parsed.tags,\n created: parsed.created,\n updated: parsed.updated,\n body: parsed.body,\n };\n}\n","import { randomBytes } from 'node:crypto';\nimport { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { extractFrontmatter, getField } from '../dashboard/parser.js';\nimport { ensureDir, fileExists, writeFileForce } from '../utils/fs.js';\nimport type {\n TodoItem,\n TodoChecklist,\n TodoStatus,\n ArchiveInterval,\n LogEntry,\n TodoLog,\n} from './types.js';\n\n// --- Short ID ---\n\nexport function generateShortId(): string {\n return randomBytes(2).toString('hex');\n}\n\nexport function generateUniqueId(existingIds: Set<string>): string {\n let id = generateShortId();\n let attempts = 0;\n while (existingIds.has(id) && attempts < 100) {\n id = generateShortId();\n attempts++;\n }\n return id;\n}\n\n// --- Checklist parsing ---\n\nconst ITEM_REGEX = /^- \\[([ x!]|>[^\\]]*)\\]\\s+(.+)$/;\nconst ID_REGEX = /\\[t:([a-f0-9]{4})\\]/;\nconst TAG_REGEX = /#([a-zA-Z0-9_-]+)/g;\n\nfunction parseStatus(marker: string): { status: TodoStatus; session: string | null } {\n if (marker === ' ') return { status: 'open', session: null };\n if (marker === 'x') return { status: 'completed', session: null };\n if (marker === '!') return { status: 'blocked', session: null };\n if (marker.startsWith('>:')) return { status: 'in_progress', session: marker.slice(2) };\n if (marker === '>') return { status: 'in_progress', session: null };\n return { status: 'open', session: null };\n}\n\nfunction sanitizeSession(session: string): string {\n // Strip characters that would break the markdown checkbox syntax\n return session.replace(/[\\[\\]]/g, '');\n}\n\nfunction statusToMarker(item: TodoItem): string {\n switch (item.status) {\n case 'open':\n return ' ';\n case 'completed':\n return 'x';\n case 'blocked':\n return '!';\n case 'in_progress':\n return item.session ? `>:${sanitizeSession(item.session)}` : '>';\n }\n}\n\nexport function parseChecklistItem(line: string): TodoItem | null {\n const match = line.match(ITEM_REGEX);\n if (!match) return null;\n\n const marker = match[1];\n const rest = match[2];\n\n const { status, session } = parseStatus(marker);\n\n const idMatch = rest.match(ID_REGEX);\n const id = idMatch ? idMatch[1] : '';\n\n const tags: string[] = [];\n let tagMatch;\n const tagRegex = new RegExp(TAG_REGEX.source, 'g');\n while ((tagMatch = tagRegex.exec(rest)) !== null) {\n tags.push(tagMatch[1]);\n }\n\n // Description is everything before the first #tag or [t:...], trimmed\n let description = rest;\n const firstTagIdx = rest.search(/#[a-zA-Z0-9_-]/);\n const firstIdIdx = rest.search(/\\[t:[a-f0-9]{4}\\]/);\n const cutPoints = [firstTagIdx, firstIdIdx].filter((i) => i >= 0);\n if (cutPoints.length > 0) {\n description = rest.slice(0, Math.min(...cutPoints)).trim();\n }\n\n return { id, description, status, tags, session };\n}\n\nexport function serializeChecklistItem(item: TodoItem): string {\n const marker = statusToMarker(item);\n const tagStr = item.tags.map((t) => `#${t}`).join(' ');\n const parts = [`- [${marker}] ${item.description}`];\n if (tagStr) parts.push(tagStr);\n parts.push(`[t:${item.id}]`);\n return parts.join(' ');\n}\n\nexport function parseChecklist(content: string): TodoChecklist {\n const [fm, body] = extractFrontmatter(content);\n const workspace = getField(fm, 'workspace') || '_global';\n const archiveIntervalRaw = getField(fm, 'archiveInterval') || 'weekly';\n const archiveInterval = (['daily', 'weekly', 'monthly', 'never'].includes(archiveIntervalRaw)\n ? archiveIntervalRaw\n : 'weekly') as ArchiveInterval;\n\n const items: TodoItem[] = [];\n for (const line of body.split('\\n')) {\n const item = parseChecklistItem(line);\n if (item) items.push(item);\n }\n\n return { workspace, archiveInterval, items };\n}\n\nexport function serializeChecklist(checklist: TodoChecklist): string {\n const fm = [\n '---',\n `workspace: ${checklist.workspace}`,\n `archiveInterval: ${checklist.archiveInterval}`,\n '---',\n ].join('\\n');\n\n const header = '# Quick Todos';\n const items = checklist.items.map(serializeChecklistItem).join('\\n');\n\n return `${fm}\\n\\n${header}\\n\\n${items}\\n`;\n}\n\n// --- Log parsing ---\n\nexport function parseLog(content: string): TodoLog {\n const [fm, body] = extractFrontmatter(content);\n const workspace = getField(fm, 'workspace') || '_global';\n\n const entries: LogEntry[] = [];\n const sections = body.split(/^### /m).filter((s) => s.match(/^\\d{4}-/));\n\n for (const section of sections) {\n const lines = section.split('\\n');\n const heading = lines[0]?.trim() || '';\n\n // Heading format: 2026-04-07T14:30:00Z — t:a3f1, t:b7c2\n const headingMatch = heading.match(/^(\\S+)\\s*—?\\s*(.*)/);\n if (!headingMatch) continue;\n\n const timestamp = headingMatch[1];\n const idsPart = headingMatch[2] || '';\n const itemIds = [...idsPart.matchAll(/t:([a-f0-9]{4})/g)].map((m) => m[1]);\n\n const entry: LogEntry = {\n timestamp,\n itemIds,\n items: '',\n session: null,\n branch: null,\n summary: '',\n blockers: null,\n status: null,\n };\n\n for (const line of lines.slice(1)) {\n const fieldMatch = line.match(/^\\*\\*(\\w+):\\*\\*\\s*(.*)/);\n if (!fieldMatch) continue;\n const key = fieldMatch[1].toLowerCase();\n const value = fieldMatch[2].trim();\n switch (key) {\n case 'items':\n entry.items = value;\n break;\n case 'session':\n entry.session = value;\n break;\n case 'branch':\n entry.branch = value;\n break;\n case 'summary':\n entry.summary = value;\n break;\n case 'blockers':\n entry.blockers = value;\n break;\n case 'status':\n entry.status = value;\n break;\n }\n }\n\n entries.push(entry);\n }\n\n return { workspace, entries };\n}\n\nexport function serializeLogEntry(entry: LogEntry): string {\n const idStr = entry.itemIds.map((id) => `t:${id}`).join(', ');\n const lines = [`### ${entry.timestamp} — ${idStr}`];\n if (entry.items) lines.push(`**Items:** ${entry.items}`);\n if (entry.session) lines.push(`**Session:** ${entry.session}`);\n if (entry.branch) lines.push(`**Branch:** ${entry.branch}`);\n if (entry.summary) lines.push(`**Summary:** ${entry.summary}`);\n if (entry.blockers) lines.push(`**Blockers:** ${entry.blockers}`);\n if (entry.status) lines.push(`**Status:** ${entry.status}`);\n return lines.join('\\n');\n}\n\n// --- File I/O ---\n\nexport function checklistPath(todosDir: string, workspace: string): string {\n return resolve(todosDir, `${workspace}.md`);\n}\n\nexport function logPath(todosDir: string, workspace: string): string {\n return resolve(todosDir, `${workspace}-log.md`);\n}\n\nexport function archivePath(\n todosDir: string,\n workspace: string,\n interval: ArchiveInterval,\n now: Date = new Date(),\n): string {\n const year = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const day = String(now.getDate()).padStart(2, '0');\n\n let suffix: string;\n switch (interval) {\n case 'daily':\n suffix = `${year}-${month}-${day}`;\n break;\n case 'weekly': {\n // ISO week number\n const jan1 = new Date(year, 0, 1);\n const days = Math.floor((now.getTime() - jan1.getTime()) / 86400000);\n const week = String(Math.ceil((days + jan1.getDay() + 1) / 7)).padStart(2, '0');\n suffix = `${year}-W${week}`;\n break;\n }\n case 'monthly':\n suffix = `${year}-${month}`;\n break;\n default:\n suffix = `${year}-${month}-${day}`;\n }\n\n return resolve(todosDir, 'archive', `${workspace}-${suffix}.md`);\n}\n\nexport async function readChecklist(todosDir: string, workspace: string): Promise<TodoChecklist> {\n const path = checklistPath(todosDir, workspace);\n if (!(await fileExists(path))) {\n return { workspace, archiveInterval: 'weekly', items: [] };\n }\n const content = await readFile(path, 'utf-8');\n return parseChecklist(content);\n}\n\nexport async function writeChecklist(todosDir: string, checklist: TodoChecklist): Promise<void> {\n await ensureDir(todosDir);\n const path = checklistPath(todosDir, checklist.workspace);\n await writeFileForce(path, serializeChecklist(checklist));\n}\n\nexport async function readLog(todosDir: string, workspace: string): Promise<TodoLog> {\n const path = logPath(todosDir, workspace);\n if (!(await fileExists(path))) {\n return { workspace, entries: [] };\n }\n const content = await readFile(path, 'utf-8');\n return parseLog(content);\n}\n\nexport async function appendLogEntry(\n todosDir: string,\n workspace: string,\n entry: LogEntry,\n): Promise<void> {\n await ensureDir(todosDir);\n const path = logPath(todosDir, workspace);\n let content: string;\n if (await fileExists(path)) {\n content = await readFile(path, 'utf-8');\n content = content.trimEnd() + '\\n\\n' + serializeLogEntry(entry) + '\\n';\n } else {\n const fm = `---\\nworkspace: ${workspace}\\n---\\n\\n# Todo Log\\n\\n`;\n content = fm + serializeLogEntry(entry) + '\\n';\n }\n await writeFileForce(path, content);\n}\n\nexport function computeCounts(items: TodoItem[]) {\n const counts = { open: 0, in_progress: 0, completed: 0, blocked: 0, total: items.length };\n for (const item of items) {\n counts[item.status]++;\n }\n return counts;\n}\n","import { useState, useEffect } from 'react';\nimport { listProjects, getProjectDetail } from '../../dashboard/api.js';\nimport type { ProjectSummary, ProjectDetail } from '../../dashboard/types.js';\nimport type { TreeNode } from '../types.js';\n\nexport function useProjects(projectsDir: string) {\n const [nodes, setNodes] = useState<TreeNode[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n async function load() {\n try {\n const projects = await listProjects(projectsDir);\n const details = await Promise.all(\n projects.map((m) => getProjectDetail(projectsDir, m.slug)),\n );\n\n if (cancelled) return;\n\n const tree: TreeNode[] = projects.map((m, i) => {\n const detail = details[i];\n const children: TreeNode[] = (detail?.assignments ?? []).map((a) => ({\n id: `a:${m.slug}:${a.slug}`,\n kind: 'assignment' as const,\n label: a.title,\n slug: a.slug,\n projectSlug: m.slug,\n status: a.status,\n priority: a.priority,\n assignee: a.assignee,\n }));\n\n return {\n id: `m:${m.slug}`,\n kind: 'project' as const,\n label: m.title,\n slug: m.slug,\n projectSlug: m.slug,\n status: m.status,\n progress: {\n completed: m.progress.completed,\n total: m.progress.total,\n },\n children,\n };\n });\n\n setNodes(tree);\n setLoading(false);\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : String(err));\n setLoading(false);\n }\n }\n }\n\n load();\n return () => {\n cancelled = true;\n };\n }, [projectsDir]);\n\n return { nodes, loading, error };\n}\n","import { useState, useMemo, useCallback } from 'react';\nimport type { TreeNode, FlatNode } from '../types.js';\n\nexport function useTreeState(nodes: TreeNode[], filteredIds: Set<string> | null) {\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\n const [cursor, setCursor] = useState(0);\n\n const flatList = useMemo(() => {\n const result: FlatNode[] = [];\n for (const project of nodes) {\n if (filteredIds && !filteredIds.has(project.id)) {\n const hasMatchingChild = project.children?.some((c) => filteredIds.has(c.id));\n if (!hasMatchingChild) continue;\n }\n\n const isExpanded = expanded.has(project.id) ||\n (filteredIds !== null && project.children?.some((c) => filteredIds.has(c.id)));\n\n result.push({\n ...project,\n depth: 0,\n expanded: isExpanded,\n hasChildren: (project.children?.length ?? 0) > 0,\n });\n\n if (isExpanded && project.children) {\n for (const child of project.children) {\n if (filteredIds && !filteredIds.has(child.id) && !filteredIds.has(project.id)) continue;\n result.push({\n ...child,\n depth: 1,\n expanded: false,\n hasChildren: false,\n });\n }\n }\n }\n return result;\n }, [nodes, expanded, filteredIds]);\n\n const moveUp = useCallback(() => {\n setCursor((c) => Math.max(0, c - 1));\n }, []);\n\n const moveDown = useCallback(() => {\n setCursor((c) => Math.min(flatList.length - 1, c + 1));\n }, [flatList.length]);\n\n const toggle = useCallback(\n (nodeId: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(nodeId)) {\n next.delete(nodeId);\n } else {\n next.add(nodeId);\n }\n return next;\n });\n },\n [],\n );\n\n const expandNode = useCallback((nodeId: string) => {\n setExpanded((prev) => {\n if (prev.has(nodeId)) return prev;\n const next = new Set(prev);\n next.add(nodeId);\n return next;\n });\n }, []);\n\n const collapseNode = useCallback((nodeId: string) => {\n setExpanded((prev) => {\n if (!prev.has(nodeId)) return prev;\n const next = new Set(prev);\n next.delete(nodeId);\n return next;\n });\n }, []);\n\n const currentNode = flatList[cursor] ?? null;\n\n return {\n flatList,\n cursor,\n setCursor,\n moveUp,\n moveDown,\n toggle,\n expandNode,\n collapseNode,\n currentNode,\n };\n}\n","import { useState, useMemo } from 'react';\nimport Fuse from 'fuse.js';\nimport type { TreeNode } from '../types.js';\n\ninterface SearchableItem {\n id: string;\n label: string;\n slug: string;\n status: string;\n assignee: string;\n priority: string;\n projectSlug: string;\n}\n\nexport function useSearch(nodes: TreeNode[]) {\n const [query, setQuery] = useState('');\n const [searchActive, setSearchActive] = useState(false);\n\n const fuse = useMemo(() => {\n const items: SearchableItem[] = [];\n for (const project of nodes) {\n items.push({\n id: project.id,\n label: project.label,\n slug: project.slug,\n status: project.status,\n assignee: '',\n priority: '',\n projectSlug: project.projectSlug,\n });\n if (project.children) {\n for (const child of project.children) {\n items.push({\n id: child.id,\n label: child.label,\n slug: child.slug,\n status: child.status,\n assignee: child.assignee ?? '',\n priority: child.priority ?? '',\n projectSlug: child.projectSlug,\n });\n }\n }\n }\n return new Fuse(items, {\n keys: ['label', 'slug', 'status', 'assignee', 'priority'],\n threshold: 0.4,\n includeScore: true,\n });\n }, [nodes]);\n\n const filteredIds = useMemo<Set<string> | null>(() => {\n if (!query.trim()) return null;\n const results = fuse.search(query);\n return new Set(results.map((r) => r.item.id));\n }, [fuse, query]);\n\n return {\n query,\n setQuery,\n searchActive,\n setSearchActive,\n filteredIds,\n };\n}\n","export const statusColors: Record<string, string> = {\n pending: 'gray',\n in_progress: 'blue',\n blocked: 'red',\n review: 'yellow',\n completed: 'green',\n failed: 'red',\n active: 'blue',\n archived: 'gray',\n};\n\nexport const priorityColors: Record<string, string> = {\n critical: 'red',\n high: 'yellow',\n medium: 'white',\n low: 'gray',\n};\n\nexport function priorityIndicator(priority?: string): string {\n if (priority === 'critical') return '!!';\n if (priority === 'high') return '!';\n return '';\n}\n","import React from 'react';\nimport { Text, Box } from 'ink';\nimport type { FlatNode } from '../types.js';\nimport { statusColors, priorityColors, priorityIndicator } from '../colors.js';\n\ninterface TreeItemProps {\n node: FlatNode;\n isSelected: boolean;\n}\n\nexport function TreeItem({ node, isSelected }: TreeItemProps) {\n const indent = ' '.repeat(node.depth);\n const statusColor = statusColors[node.status] ?? 'white';\n\n if (node.kind === 'project') {\n const chevron = node.expanded ? '▾' : '▸';\n const progressText = node.progress\n ? `${node.progress.completed}/${node.progress.total}`\n : '';\n\n return (\n <Box>\n <Text inverse={isSelected} bold={isSelected}>\n {indent}\n <Text>{chevron} </Text>\n <Text bold>{node.label}</Text>\n <Text> </Text>\n <Text color={statusColor}>{node.status}</Text>\n {progressText ? <Text dimColor> {progressText} done</Text> : null}\n </Text>\n </Box>\n );\n }\n\n const prio = priorityIndicator(node.priority);\n const prioColor = node.priority ? priorityColors[node.priority] : undefined;\n\n return (\n <Box>\n <Text inverse={isSelected} bold={isSelected}>\n {indent}\n <Text dimColor>{'▪ '}</Text>\n <Text>{node.label}</Text>\n <Text> </Text>\n <Text color={statusColor}>{node.status.replace('_', ' ')}</Text>\n {prio ? <Text color={prioColor}> {prio}</Text> : null}\n {node.assignee ? <Text dimColor> @{node.assignee}</Text> : null}\n </Text>\n </Box>\n );\n}\n","import React, { useMemo } from 'react';\nimport { Box, Text } from 'ink';\nimport type { FlatNode } from '../types.js';\nimport { TreeItem } from './TreeItem.js';\n\ninterface TreeViewProps {\n nodes: FlatNode[];\n cursor: number;\n viewportHeight: number;\n}\n\nexport function TreeView({ nodes, cursor, viewportHeight }: TreeViewProps) {\n const { start, end } = useMemo(() => {\n const half = Math.floor(viewportHeight / 2);\n let start = cursor - half;\n if (start < 0) start = 0;\n let end = start + viewportHeight;\n if (end > nodes.length) {\n end = nodes.length;\n start = Math.max(0, end - viewportHeight);\n }\n return { start, end };\n }, [cursor, viewportHeight, nodes.length]);\n\n if (nodes.length === 0) {\n return (\n <Box flexDirection=\"column\" paddingLeft={1}>\n <Text dimColor>No projects found. Run `syntaur create-project` to get started.</Text>\n </Box>\n );\n }\n\n const visible = nodes.slice(start, end);\n\n return (\n <Box flexDirection=\"column\">\n {visible.map((node, i) => (\n <TreeItem\n key={node.id}\n node={node}\n isSelected={start + i === cursor}\n />\n ))}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport TextInput from 'ink-text-input';\n\ninterface SearchBarProps {\n active: boolean;\n query: string;\n onChange: (value: string) => void;\n resultCount: number;\n}\n\nexport function SearchBar({ active, query, onChange, resultCount }: SearchBarProps) {\n if (!active && !query) {\n return (\n <Box paddingLeft={1}>\n <Text dimColor>/ to search</Text>\n </Box>\n );\n }\n\n return (\n <Box paddingLeft={1}>\n <Text color=\"yellow\">/</Text>\n {active ? (\n <TextInput value={query} onChange={onChange} />\n ) : (\n <Text>{query}</Text>\n )}\n {query ? (\n <Text dimColor> ({resultCount} matches)</Text>\n ) : null}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { FlatNode } from '../types.js';\n\ninterface StatusBarProps {\n currentNode: FlatNode | null;\n searchActive: boolean;\n}\n\nexport function StatusBar({ currentNode, searchActive }: StatusBarProps) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"single\" borderTop borderBottom={false} borderLeft={false} borderRight={false} paddingLeft={1}>\n <Box gap={2}>\n <Text dimColor>↑↓ navigate</Text>\n <Text dimColor>←→ expand/collapse</Text>\n <Text dimColor>Enter select</Text>\n {searchActive ? (\n <Text dimColor>Esc clear search</Text>\n ) : (\n <Text dimColor>/ search</Text>\n )}\n <Text dimColor>q quit</Text>\n </Box>\n {currentNode?.kind === 'assignment' && currentNode.workspace?.worktreePath ? (\n <Text dimColor>workspace: {currentNode.workspace.worktreePath}</Text>\n ) : null}\n </Box>\n );\n}\n","import React, { useState, useCallback } from 'react';\nimport { Box, Text, useApp, useInput, useStdout } from 'ink';\nimport { useProjects } from './hooks/useProjects.js';\nimport { useTreeState } from './hooks/useTreeState.js';\nimport { useSearch } from './hooks/useSearch.js';\nimport { TreeView } from './components/TreeView.js';\nimport { SearchBar } from './components/SearchBar.js';\nimport { StatusBar } from './components/StatusBar.js';\nimport type { LaunchOptions } from './launch.js';\n\ninterface AppProps {\n projectsDir: string;\n onLaunch: (options: Omit<LaunchOptions, 'agent'>) => void;\n}\n\nexport function App({ projectsDir, onLaunch }: AppProps) {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const terminalHeight = stdout?.rows ?? 24;\n const viewportHeight = Math.max(5, terminalHeight - 6);\n\n const { nodes, loading, error } = useProjects(projectsDir);\n const { query, setQuery, searchActive, setSearchActive, filteredIds } = useSearch(nodes);\n const {\n flatList,\n cursor,\n setCursor,\n moveUp,\n moveDown,\n toggle,\n expandNode,\n collapseNode,\n currentNode,\n } = useTreeState(nodes, filteredIds);\n\n useInput((input, key) => {\n if (searchActive) {\n if (key.escape) {\n setSearchActive(false);\n setQuery('');\n return;\n }\n if (key.return) {\n setSearchActive(false);\n return;\n }\n // Text input is handled by TextInput component\n return;\n }\n\n // Navigation mode\n if (input === 'q' || key.escape) {\n exit();\n return;\n }\n\n if (input === '/') {\n setSearchActive(true);\n return;\n }\n\n if (key.upArrow || input === 'k') {\n moveUp();\n return;\n }\n\n if (key.downArrow || input === 'j') {\n moveDown();\n return;\n }\n\n if (key.rightArrow && currentNode?.kind === 'project') {\n expandNode(currentNode.id);\n return;\n }\n\n if (key.leftArrow) {\n if (currentNode?.kind === 'project') {\n collapseNode(currentNode.id);\n } else if (currentNode?.kind === 'assignment') {\n // Jump to parent project\n const parentId = `m:${currentNode.projectSlug}`;\n const parentIndex = flatList.findIndex((n) => n.id === parentId);\n if (parentIndex >= 0) {\n setCursor(parentIndex);\n }\n }\n return;\n }\n\n if (key.return && currentNode) {\n if (currentNode.kind === 'project') {\n toggle(currentNode.id);\n } else if (currentNode.kind === 'assignment') {\n onLaunch({\n projectsDir,\n projectSlug: currentNode.projectSlug,\n assignmentSlug: currentNode.slug,\n });\n }\n return;\n }\n });\n\n if (loading) {\n return (\n <Box paddingLeft={1}>\n <Text>Loading projects...</Text>\n </Box>\n );\n }\n\n if (error) {\n return (\n <Box paddingLeft={1}>\n <Text color=\"red\">Error: {error}</Text>\n </Box>\n );\n }\n\n const projectCount = nodes.length;\n const matchCount = filteredIds?.size ?? flatList.length;\n\n return (\n <Box flexDirection=\"column\">\n <Box paddingLeft={1} marginBottom={0}>\n <Text bold color=\"cyan\">Syntaur</Text>\n <Text dimColor> {projectCount} project{projectCount !== 1 ? 's' : ''}</Text>\n </Box>\n <SearchBar\n active={searchActive}\n query={query}\n onChange={setQuery}\n resultCount={matchCount}\n />\n <TreeView\n nodes={flatList}\n cursor={cursor}\n viewportHeight={viewportHeight}\n />\n <StatusBar currentNode={currentNode} searchActive={searchActive} />\n </Box>\n );\n}\n","import { spawn } from 'node:child_process';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { getAssignmentDetail } from '../dashboard/api.js';\n\nexport type AgentType = 'claude' | 'codex';\n\nconst AGENT_COMMANDS: Record<AgentType, string> = {\n claude: 'c',\n codex: 'cx',\n};\n\nexport interface LaunchOptions {\n projectsDir: string;\n projectSlug: string;\n assignmentSlug: string;\n agent: AgentType;\n}\n\nexport async function launchAgent(options: LaunchOptions): Promise<void> {\n const { projectsDir, projectSlug, assignmentSlug, agent } = options;\n const command = AGENT_COMMANDS[agent];\n\n const detail = await getAssignmentDetail(projectsDir, projectSlug, assignmentSlug);\n if (!detail) {\n console.error(`Assignment not found: ${projectSlug}/${assignmentSlug}`);\n process.exit(1);\n }\n\n const workspaceDir =\n detail.workspace.worktreePath ??\n (detail.workspace.repository?.startsWith('/') ? detail.workspace.repository : null) ??\n process.cwd();\n\n const projectDir = resolve(projectsDir, projectSlug);\n const assignmentDir = resolve(projectDir, 'assignments', assignmentSlug);\n\n const contextDir = resolve(workspaceDir, '.syntaur');\n await mkdir(contextDir, { recursive: true });\n\n const context = {\n projectSlug,\n assignmentSlug,\n projectDir,\n assignmentDir,\n workspaceRoot: workspaceDir,\n title: detail.title,\n branch: detail.workspace.branch ?? null,\n grabbedAt: new Date().toISOString(),\n };\n\n await writeFile(\n resolve(contextDir, 'context.json'),\n JSON.stringify(context, null, 2) + '\\n',\n );\n\n return new Promise<void>((resolvePromise, reject) => {\n const initialPrompt =\n `Read the current Syntaur assignment at ${assignmentDir}/assignment.md and give me a brief summary: title, status, priority, objective, and acceptance criteria.`;\n\n const child = spawn(command, [initialPrompt], {\n cwd: workspaceDir,\n stdio: 'inherit',\n });\n\n child.on('error', (err) => {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n console.error(`${agent} CLI not found. Is \\`${command}\\` installed and in your PATH?`);\n } else {\n console.error(`Failed to launch ${agent}:`, err.message);\n }\n process.exit(1);\n });\n\n child.on('exit', (code) => {\n process.exit(code ?? 0);\n });\n });\n}\n","import { Command } from 'commander';\nimport { initCommand } from './commands/init.js';\nimport { createProjectCommand } from './commands/create-project.js';\nimport { createAssignmentCommand } from './commands/create-assignment.js';\nimport { dashboardCommand, didUserSpecifyDashboardPort } from './commands/dashboard.js';\nimport { assignCommand } from './commands/assign.js';\nimport { startCommand } from './commands/start.js';\nimport { completeCommand } from './commands/complete.js';\nimport { blockCommand } from './commands/block.js';\nimport { unblockCommand } from './commands/unblock.js';\nimport { reviewCommand } from './commands/review.js';\nimport { failCommand } from './commands/fail.js';\nimport { reopenCommand } from './commands/reopen.js';\nimport { installPluginCommand } from './commands/install-plugin.js';\nimport { installCodexPluginCommand } from './commands/install-codex-plugin.js';\nimport { setupCommand } from './commands/setup.js';\nimport { uninstallCommand } from './commands/uninstall.js';\nimport { setupAdapterCommand } from './commands/setup-adapter.js';\nimport { trackSessionCommand } from './commands/track-session.js';\nimport { browseCommand } from './commands/browse.js';\nimport { createPlaybookCommand } from './commands/create-playbook.js';\nimport { listPlaybooksCommand } from './commands/list-playbooks.js';\nimport { todoCommand } from './commands/todo.js';\nimport { backupCommand } from './commands/backup.js';\nimport { doctorCommand } from './commands/doctor.js';\nimport { commentCommand } from './commands/comment.js';\nimport { requestCommand } from './commands/request.js';\nimport { getDefaultCommandName } from './cli-default-command.js';\nimport { maybePromptInstall } from './utils/npx-prompt.js';\nimport { readPackageVersion } from './utils/version.js';\n\nawait maybePromptInstall(import.meta.url);\n\nconst program = new Command();\nconst version = (await readPackageVersion(import.meta.url)) ?? '0.0.0';\n\nprogram\n .name('syntaur')\n .description('CLI scaffolding tool for the Syntaur protocol')\n .version(version);\n\nprogram\n .command('init')\n .description('Initialize ~/.syntaur/ directory structure and config')\n .option('--force', 'Overwrite existing config file')\n .action(async (options) => {\n try {\n await initCommand(options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('create-project')\n .description('Create a new project with all required files')\n .argument('<title>', 'Project title')\n .option('--slug <slug>', 'Override auto-generated slug')\n .option('--dir <path>', 'Override default project directory')\n .option('--workspace <workspace>', 'Workspace for organizational grouping')\n .action(async (title, options) => {\n try {\n await createProjectCommand(title, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('create-assignment')\n .description('Create a new assignment within a project')\n .argument('<title>', 'Assignment title')\n .option('--project <slug>', 'Target project slug (required unless --one-off)')\n .option('--one-off', 'Create a standalone assignment at ~/.syntaur/assignments/<uuid>/')\n .option('--slug <slug>', 'Override auto-generated slug (display only for standalone; folder name for project-nested)')\n .option(\n '--priority <level>',\n 'Priority level (low|medium|high|critical)',\n 'medium',\n )\n .option('--type <type>', 'Assignment type (e.g. feature, bug, refactor)')\n .option('--depends-on <slugs>', 'Comma-separated dependency slugs (not allowed with --one-off)')\n .option('--links <slugs>', 'Comma-separated linked assignment slugs (projectSlug/assignmentSlug format)')\n .option('--dir <path>', 'Override default project directory (ignored for --one-off)')\n .action(async (title, options) => {\n try {\n await createAssignmentCommand(title, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('comment')\n .description('Add a comment to an assignment (CLI-mediated, append-only)')\n .argument('<assignment>', 'Target assignment slug (with --project) or UUID (standalone)')\n .argument('<text>', 'Comment body')\n .option('--project <slug>', 'Project slug if the target is project-nested')\n .option('--reply-to <id>', 'ID of the comment this replies to')\n .option('--type <type>', 'Comment type: question | note | feedback', 'note')\n .option('--author <name>', 'Override author (default: $USER or \"unknown\")')\n .option('--dir <path>', 'Override default project directory')\n .action(async (assignment, text, options) => {\n try {\n await commentCommand(assignment, text, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('request')\n .description('Append a todo to another assignment (cross-assignment work request)')\n .argument('<target>', 'Target assignment slug (with --project) or UUID (standalone)')\n .argument('<text>', 'Todo text')\n .option('--project <slug>', 'Project slug if the target is project-nested')\n .option('--from <source>', 'Source assignment (default: $SYNTAUR_ASSIGNMENT)')\n .option('--dir <path>', 'Override default project directory')\n .action(async (target, text, options) => {\n try {\n await requestCommand(target, text, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('dashboard')\n .description('Start the local Syntaur dashboard web UI')\n .option('--port <number>', 'Port to run the dashboard on', '4800')\n .option('--dev', 'Run the dashboard with the Vite dev server', false)\n .option('--server-only', 'Run only the API server without any UI', false)\n .option('--api-only', 'Deprecated alias for --server-only', false)\n .option('--no-open', 'Do not automatically open the browser')\n .action(async (options) => {\n try {\n const autoPort = !didUserSpecifyDashboardPort();\n await dashboardCommand({\n ...options,\n autoPort,\n });\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('assign')\n .description('Set the assignee on an assignment')\n .argument('<assignment>', 'Assignment slug')\n .option('--project <slug>', 'Target project slug')\n .option('--agent <name>', 'Agent name to assign')\n .option('--dir <path>', 'Override default project directory')\n .action(async (assignment, options) => {\n try {\n await assignCommand(assignment, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('start')\n .description('Transition an assignment to in_progress')\n .argument('<assignment>', 'Assignment slug')\n .option('--project <slug>', 'Target project slug')\n .option('--agent <name>', 'Agent name (sets assignee if not already set)')\n .option('--dir <path>', 'Override default project directory')\n .action(async (assignment, options) => {\n try {\n await startCommand(assignment, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('complete')\n .description('Transition an assignment to completed')\n .argument('<assignment>', 'Assignment slug')\n .option('--project <slug>', 'Target project slug')\n .option('--dir <path>', 'Override default project directory')\n .action(async (assignment, options) => {\n try {\n await completeCommand(assignment, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('block')\n .description('Transition an assignment to blocked')\n .argument('<assignment>', 'Assignment slug')\n .option('--project <slug>', 'Target project slug')\n .option('--reason <text>', 'Reason for blocking')\n .option('--dir <path>', 'Override default project directory')\n .action(async (assignment, options) => {\n try {\n await blockCommand(assignment, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('unblock')\n .description('Transition a blocked assignment to in_progress')\n .argument('<assignment>', 'Assignment slug')\n .option('--project <slug>', 'Target project slug')\n .option('--dir <path>', 'Override default project directory')\n .action(async (assignment, options) => {\n try {\n await unblockCommand(assignment, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('review')\n .description('Transition an assignment to review')\n .argument('<assignment>', 'Assignment slug')\n .option('--project <slug>', 'Target project slug')\n .option('--dir <path>', 'Override default project directory')\n .action(async (assignment, options) => {\n try {\n await reviewCommand(assignment, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('fail')\n .description('Transition an assignment to failed')\n .argument('<assignment>', 'Assignment slug')\n .option('--project <slug>', 'Target project slug')\n .option('--dir <path>', 'Override default project directory')\n .action(async (assignment, options) => {\n try {\n await failCommand(assignment, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('reopen')\n .description('Reopen a completed or failed assignment')\n .argument('<assignment>', 'Assignment slug')\n .option('--project <slug>', 'Target project slug')\n .option('--dir <path>', 'Override default project directory')\n .action(async (assignment, options) => {\n try {\n await reopenCommand(assignment, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('setup')\n .description('Initialize Syntaur and optionally install plugins or launch the dashboard')\n .option('--yes', 'Skip interactive prompts and perform only the requested flags')\n .option('--claude', 'Install the Claude Code plugin')\n .option('--codex', 'Install the Codex plugin')\n .option('--claude-dir <path>', 'Install the Claude Code plugin at a specific path')\n .option('--codex-dir <path>', 'Install the Codex plugin at a specific path')\n .option('--codex-marketplace-path <path>', 'Write the Codex marketplace entry to a specific file')\n .option('--dashboard', 'Launch the dashboard after setup')\n .action(async (options) => {\n try {\n await setupCommand(options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('install-plugin')\n .description('Install the Syntaur Claude Code plugin')\n .option('--force', 'Overwrite an existing Syntaur-managed install')\n .option('--target-dir <path>', 'Install the plugin at a specific directory')\n .option('--link', 'Use a symlink instead of copying files (repo-local dev only)')\n .action(async (options) => {\n try {\n await installPluginCommand({ ...options, promptForTarget: true });\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('install-codex-plugin')\n .description('Install the Syntaur Codex plugin and marketplace entry')\n .option('--force', 'Overwrite an existing Syntaur-managed install')\n .option('--target-dir <path>', 'Install the plugin at a specific directory')\n .option('--marketplace-path <path>', 'Write the marketplace entry to a specific file')\n .option('--link', 'Use a symlink instead of copying files (repo-local dev only)')\n .action(async (options) => {\n try {\n await installCodexPluginCommand({ ...options, promptForTarget: true });\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('uninstall')\n .description('Remove Syntaur integrations and optionally local data')\n .option('--claude', 'Remove only the Claude Code plugin')\n .option('--codex', 'Remove only the Codex plugin and marketplace entry')\n .option('--data', 'Remove ~/.syntaur data')\n .option('--all', 'Remove plugins and ~/.syntaur data')\n .option('--yes', 'Skip confirmation prompts')\n .action(async (options) => {\n try {\n await uninstallCommand(options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('setup-adapter')\n .description('Generate adapter instruction files for a framework in the current directory')\n .argument('<framework>', 'Target framework (cursor, codex, opencode)')\n .option('--project <slug>', 'Target project slug (required)')\n .option('--assignment <slug>', 'Target assignment slug (required)')\n .option('--force', 'Overwrite existing adapter files')\n .option('--dir <path>', 'Override default project directory')\n .action(async (framework, options) => {\n try {\n await setupAdapterCommand(framework, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('track-session')\n .description('Register an agent session (optionally linked to a project/assignment)')\n .option('--project <slug>', 'Target project slug')\n .option('--assignment <slug>', 'Assignment slug')\n .option('--agent <name>', 'Agent name, e.g. claude, codex, cursor (required)')\n .option('--session-id <id>', 'Session ID (auto-generated if omitted)')\n .option('--path <path>', 'Full path to session on disk (defaults to cwd)')\n .option('--dir <path>', 'Override default project directory')\n .option('--description <text>', 'Description of what this session is for')\n .action(async (options) => {\n try {\n await trackSessionCommand(options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('browse')\n .description('Interactive TUI browser for projects and assignments')\n .option('--agent <type>', 'Agent to launch: claude or codex', 'claude')\n .action(async (options) => {\n try {\n await browseCommand(options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('create-playbook')\n .description('Create a new playbook')\n .argument('<name>', 'Playbook name')\n .option('--slug <slug>', 'Override auto-generated slug')\n .option('--description <desc>', 'Playbook description')\n .action(async (name, options) => {\n try {\n await createPlaybookCommand(name, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('list-playbooks')\n .description('List all playbooks')\n .action(async () => {\n try {\n await listPlaybooksCommand();\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram.addCommand(todoCommand);\nprogram.addCommand(backupCommand);\nprogram.addCommand(doctorCommand);\n\n// Default to dashboard when no command is given\nif (process.argv.length <= 2) {\n process.argv.push(await getDefaultCommandName());\n}\n\nawait program.parseAsync();\n","import { resolve, dirname } from 'node:path';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { fileURLToPath } from 'node:url';\nimport { syntaurRoot, defaultProjectDir, assignmentsDir } from '../utils/paths.js';\nimport { ensureDir, writeFileSafe, writeFileForce, fileExists } from '../utils/fs.js';\nimport { renderConfig } from '../templates/config.js';\nimport { rebuildPlaybookManifest } from '../utils/playbooks.js';\n\nexport interface InitOptions {\n force?: boolean;\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n const root = syntaurRoot();\n const projectsDir = defaultProjectDir();\n const standaloneAssignmentsDir = assignmentsDir();\n const configPath = resolve(root, 'config.md');\n\n const playbooksDir = resolve(root, 'playbooks');\n\n await ensureDir(root);\n await ensureDir(projectsDir);\n await ensureDir(standaloneAssignmentsDir);\n await ensureDir(playbooksDir);\n\n const configContent = renderConfig({\n defaultProjectDir: projectsDir,\n });\n\n if (options.force) {\n await writeFileForce(configPath, configContent);\n console.log(`Created ${root}/`);\n console.log(`Created ${projectsDir}/`);\n console.log(`Created ${standaloneAssignmentsDir}/`);\n console.log(`Created ${playbooksDir}/`);\n console.log(`Wrote ${configPath} (overwritten)`);\n } else {\n const written = await writeFileSafe(configPath, configContent);\n console.log(`Created ${root}/`);\n console.log(`Created ${projectsDir}/`);\n console.log(`Created ${standaloneAssignmentsDir}/`);\n console.log(`Created ${playbooksDir}/`);\n if (written) {\n console.log(`Wrote ${configPath}`);\n } else {\n console.log(`Skipped ${configPath} (already exists; use --force to overwrite)`);\n }\n }\n\n // Seed default playbooks (only if they don't already exist)\n const seeded = await seedDefaultPlaybooks(playbooksDir);\n if (seeded > 0) {\n console.log(`Seeded ${seeded} default playbook(s) in ${playbooksDir}/`);\n }\n\n // Rebuild playbook index\n await rebuildPlaybookManifest(playbooksDir);\n\n console.log('\\nSyntaur initialized successfully.');\n}\n\nasync function seedDefaultPlaybooks(playbooksDir: string): Promise<number> {\n const __filename = fileURLToPath(import.meta.url);\n const packageRoot = resolve(dirname(__filename), '..');\n const examplesDir = resolve(packageRoot, 'examples', 'playbooks');\n\n if (!(await fileExists(examplesDir))) return 0;\n\n const entries = await readdir(examplesDir, { withFileTypes: true });\n let count = 0;\n\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith('.md')) continue;\n const targetPath = resolve(playbooksDir, entry.name);\n if (await fileExists(targetPath)) continue;\n\n const content = await readFile(resolve(examplesDir, entry.name), 'utf-8');\n await writeFileSafe(targetPath, content);\n count++;\n }\n\n return count;\n}\n","import { resolve } from 'node:path';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { fileExists, writeFileForce } from './fs.js';\nimport { parsePlaybook } from '../dashboard/parser.js';\nimport { nowTimestamp } from './timestamp.js';\n\nexport async function rebuildPlaybookManifest(playbooksDir: string): Promise<void> {\n if (!(await fileExists(playbooksDir))) return;\n\n const entries = await readdir(playbooksDir, { withFileTypes: true });\n const rows: Array<{ name: string; slug: string; description: string; whenToUse: string }> = [];\n\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith('.md') || entry.name.startsWith('_') || entry.name === 'manifest.md') continue;\n\n const raw = await readFile(resolve(playbooksDir, entry.name), 'utf-8');\n const parsed = parsePlaybook(raw);\n const slug = parsed.slug || entry.name.replace(/\\.md$/, '');\n\n rows.push({\n name: parsed.name || slug,\n slug,\n description: parsed.description,\n whenToUse: parsed.whenToUse,\n });\n }\n\n rows.sort((a, b) => a.name.localeCompare(b.name));\n\n const timestamp = nowTimestamp();\n const lines = [\n '---',\n `generated: \"${timestamp}\"`,\n `total: ${rows.length}`,\n '---',\n '',\n '# Playbooks',\n '',\n 'Behavioral rules for AI agents. Read and follow all playbooks before starting work.',\n '',\n ];\n\n for (const row of rows) {\n lines.push(`- **[${row.name}](${row.slug}.md)** — ${row.description}`);\n if (row.whenToUse) {\n lines.push(` _When to use: ${row.whenToUse}_`);\n }\n }\n\n lines.push('');\n\n await writeFileForce(resolve(playbooksDir, 'manifest.md'), lines.join('\\n'));\n}\n","import { resolve } from 'node:path';\nimport { slugify, isValidSlug } from '../utils/slug.js';\nimport { nowTimestamp } from '../utils/timestamp.js';\nimport { generateId } from '../utils/uuid.js';\nimport { expandHome } from '../utils/paths.js';\nimport { ensureDir, writeFileForce, fileExists } from '../utils/fs.js';\nimport { readConfig } from '../utils/config.js';\nimport {\n renderManifest,\n renderProject,\n renderIndexAssignments,\n renderIndexPlans,\n renderIndexDecisions,\n renderStatus,\n renderResourcesIndex,\n renderMemoriesIndex,\n} from '../templates/index.js';\n\nexport interface CreateProjectOptions {\n slug?: string;\n dir?: string;\n workspace?: string;\n}\n\nexport async function createProjectCommand(\n title: string,\n options: CreateProjectOptions,\n): Promise<string> {\n if (!title.trim()) {\n throw new Error('Project title cannot be empty.');\n }\n\n const slug = options.slug || slugify(title);\n if (!isValidSlug(slug)) {\n throw new Error(\n `Invalid slug \"${slug}\". Slugs must be lowercase, hyphen-separated, with no special characters.`,\n );\n }\n\n const config = await readConfig();\n const baseDir = options.dir\n ? expandHome(options.dir)\n : config.defaultProjectDir;\n const projectDir = resolve(baseDir, slug);\n\n if (await fileExists(projectDir)) {\n throw new Error(\n `Project folder already exists: ${projectDir}\\nUse --slug to specify a different slug.`,\n );\n }\n\n const timestamp = nowTimestamp();\n const id = generateId();\n\n await ensureDir(resolve(projectDir, 'assignments'));\n await ensureDir(resolve(projectDir, 'resources'));\n await ensureDir(resolve(projectDir, 'memories'));\n\n const files: Array<[string, string]> = [\n [\n resolve(projectDir, 'manifest.md'),\n renderManifest({ slug, timestamp }),\n ],\n [\n resolve(projectDir, 'project.md'),\n renderProject({ id, slug, title, timestamp, workspace: options.workspace }),\n ],\n [\n resolve(projectDir, '_index-assignments.md'),\n renderIndexAssignments({ slug, title, timestamp }),\n ],\n [\n resolve(projectDir, '_index-plans.md'),\n renderIndexPlans({ slug, title, timestamp }),\n ],\n [\n resolve(projectDir, '_index-decisions.md'),\n renderIndexDecisions({ slug, title, timestamp }),\n ],\n [\n resolve(projectDir, '_status.md'),\n renderStatus({ slug, title, timestamp }),\n ],\n [\n resolve(projectDir, 'resources', '_index.md'),\n renderResourcesIndex({ slug, title, timestamp }),\n ],\n [\n resolve(projectDir, 'memories', '_index.md'),\n renderMemoriesIndex({ slug, title, timestamp }),\n ],\n ];\n\n for (const [filePath, content] of files) {\n await writeFileForce(filePath, content);\n }\n\n console.log(`Created project \"${title}\" at ${projectDir}/`);\n console.log(` Slug: ${slug}`);\n console.log(` Files created:`);\n console.log(` manifest.md`);\n console.log(` project.md`);\n console.log(` _index-assignments.md`);\n console.log(` _index-plans.md`);\n console.log(` _index-decisions.md`);\n console.log(` _status.md`);\n console.log(` resources/_index.md`);\n console.log(` memories/_index.md`);\n\n return slug;\n}\n","export function slugify(title: string): string {\n return title\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\nexport function isValidSlug(slug: string): boolean {\n return /^[a-z0-9]+(-[a-z0-9]+)*$/.test(slug);\n}\n","import { randomUUID } from 'node:crypto';\n\nexport function generateId(): string {\n return randomUUID();\n}\n","export { renderConfig } from './config.js';\nexport type { ConfigParams } from './config.js';\n\nexport { renderManifest } from './manifest.js';\nexport type { ManifestParams } from './manifest.js';\n\nexport { renderProject } from './project.js';\nexport type { ProjectParams } from './project.js';\n\nexport { renderAssignment } from './assignment.js';\nexport type { AssignmentParams } from './assignment.js';\n\nexport { renderPlan } from './plan.js';\nexport type { PlanParams } from './plan.js';\n\nexport { renderScratchpad } from './scratchpad.js';\nexport type { ScratchpadParams } from './scratchpad.js';\n\nexport { renderHandoff } from './handoff.js';\nexport type { HandoffParams } from './handoff.js';\n\nexport { renderProgress, formatProgressEntry } from './progress.js';\nexport type { ProgressParams } from './progress.js';\n\nexport { renderComments, formatCommentEntry } from './comments.js';\nexport type { CommentsParams, Comment, CommentType } from './comments.js';\n\nexport { renderDecisionRecord } from './decision-record.js';\nexport type { DecisionRecordParams } from './decision-record.js';\n\nexport {\n renderIndexAssignments,\n renderIndexPlans,\n renderIndexDecisions,\n renderStatus,\n renderResourcesIndex,\n renderMemoriesIndex,\n} from './index-stubs.js';\nexport type { IndexStubParams } from './index-stubs.js';\n\nexport { renderPlaybook } from './playbook.js';\nexport type { PlaybookParams } from './playbook.js';\n\nexport { renderCursorProtocol, renderCursorAssignment } from './cursor-rules.js';\nexport type { CursorAssignmentParams } from './cursor-rules.js';\n\nexport { renderCodexAgents } from './codex-agents.js';\nexport type { CodexAgentsParams } from './codex-agents.js';\n\nexport { renderOpenCodeConfig } from './opencode-config.js';\nexport type { OpenCodeConfigParams } from './opencode-config.js';\n","export interface ManifestParams {\n slug: string;\n timestamp: string;\n}\n\nexport function renderManifest(params: ManifestParams): string {\n return `---\nversion: \"2.0\"\nproject: ${params.slug}\ngenerated: \"${params.timestamp}\"\n---\n\n# Project: ${params.slug}\n\n## Overview\n- [Project Overview](./project.md)\n\n## Indexes\n- [Assignments](./_index-assignments.md)\n- [Plans](./_index-plans.md)\n- [Decision Records](./_index-decisions.md)\n- [Status](./_status.md)\n- [Resources](./resources/_index.md)\n- [Memories](./memories/_index.md)\n`;\n}\n","export function escapeYamlString(value: string): string {\n if (value.includes('\\n') || value.includes('\\r')) {\n throw new Error(\n `YAML string values must be single-line. Got: \"${value.slice(0, 50)}...\"`,\n );\n }\n const escaped = value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n return `\"${escaped}\"`;\n}\n","import { escapeYamlString } from '../utils/yaml.js';\n\nexport interface ProjectParams {\n id: string;\n slug: string;\n title: string;\n timestamp: string;\n workspace?: string;\n}\n\nexport function renderProject(params: ProjectParams): string {\n const safeTitle = escapeYamlString(params.title);\n const workspaceLine = params.workspace ? `\\nworkspace: ${params.workspace}` : '';\n return `---\nid: ${params.id}\nslug: ${params.slug}\ntitle: ${safeTitle}\narchived: false\narchivedAt: null\narchivedReason: null\ncreated: \"${params.timestamp}\"\nupdated: \"${params.timestamp}\"\nexternalIds: []\ntags: []${workspaceLine}\n---\n\n# ${params.title}\n\n## Overview\n\n<!-- Describe the project goal, context, and success criteria here. -->\n\n## Notes\n\n<!-- Optional human notes, updates, or context. -->\n`;\n}\n","import { escapeYamlString } from '../utils/yaml.js';\n\nexport interface AssignmentParams {\n id: string;\n slug: string;\n title: string;\n timestamp: string;\n priority: 'low' | 'medium' | 'high' | 'critical';\n dependsOn: string[];\n links: string[];\n project?: string | null;\n type?: string;\n}\n\nexport function renderAssignment(params: AssignmentParams): string {\n const safeTitle = escapeYamlString(params.title);\n const dependsOnYaml =\n params.dependsOn.length === 0\n ? 'dependsOn: []'\n : `dependsOn:\\n - ${params.dependsOn.join('\\n - ')}`;\n const linksYaml =\n params.links.length === 0\n ? 'links: []'\n : `links:\\n - ${params.links.join('\\n - ')}`;\n const projectYaml = `project: ${params.project == null ? 'null' : params.project}`;\n const typeYaml = `type: ${params.type ?? 'feature'}`;\n\n return `---\nid: ${params.id}\nslug: ${params.slug}\ntitle: ${safeTitle}\n${projectYaml}\n${typeYaml}\nstatus: pending\npriority: ${params.priority}\ncreated: \"${params.timestamp}\"\nupdated: \"${params.timestamp}\"\nassignee: null\nexternalIds: []\n${dependsOnYaml}\n${linksYaml}\nblockedReason: null\nworkspace:\n repository: null\n worktreePath: null\n branch: null\n parentBranch: null\ntags: []\n---\n\n# ${params.title}\n\n## Objective\n\n<!-- Clear description of what needs to be done and why. -->\n\n## Acceptance Criteria\n\n- [ ] <!-- criterion 1 -->\n- [ ] <!-- criterion 2 -->\n- [ ] <!-- criterion 3 -->\n\n## Todos\n\n<!--\nChecklist of work items for this assignment. Items may be simple tasks\nor a markdown link to a plan file (e.g., \"- [ ] Execute [plan](./plan.md)\").\nWhen a plan is superseded by a new one, mark the old todo as:\n - [x] ~~Execute [old plan](./plan.md)~~ (superseded by plan-v2)\nNever delete superseded todos — preserve the history.\n-->\n\n## Context\n\n<!-- Links to relevant docs, code, or other assignments. -->\n\n## Links\n\n- [Progress](./progress.md)\n- [Comments](./comments.md)\n- [Scratchpad](./scratchpad.md)\n- [Handoff](./handoff.md)\n- [Decision Record](./decision-record.md)\n`;\n}\n","export interface ScratchpadParams {\n assignmentSlug: string;\n timestamp: string;\n}\n\nexport function renderScratchpad(params: ScratchpadParams): string {\n return `---\nassignment: ${params.assignmentSlug}\nupdated: \"${params.timestamp}\"\n---\n\n# Scratchpad\n\nNo working notes yet.\n`;\n}\n","export interface HandoffParams {\n assignmentSlug: string;\n timestamp: string;\n}\n\nexport function renderHandoff(params: HandoffParams): string {\n return `---\nassignment: ${params.assignmentSlug}\nupdated: \"${params.timestamp}\"\nhandoffCount: 0\n---\n\n# Handoff Log\n\nNo handoffs recorded yet.\n`;\n}\n","export interface ProgressParams {\n assignment: string;\n timestamp: string;\n}\n\nexport function renderProgress(params: ProgressParams): string {\n return `---\nassignment: ${params.assignment}\nentryCount: 0\ngenerated: \"${params.timestamp}\"\nupdated: \"${params.timestamp}\"\n---\n\n# Progress\n\nNo progress yet.\n`;\n}\n\nexport function formatProgressEntry(body: string, timestamp: string): string {\n const trimmed = body.trim();\n return `## ${timestamp}\\n\\n${trimmed}\\n`;\n}\n","export interface CommentsParams {\n assignment: string;\n timestamp: string;\n}\n\nexport type CommentType = 'question' | 'note' | 'feedback';\n\nexport interface Comment {\n id: string;\n timestamp: string;\n author: string;\n type: CommentType;\n body: string;\n replyTo?: string;\n resolved?: boolean;\n}\n\nexport function renderComments(params: CommentsParams): string {\n return `---\nassignment: ${params.assignment}\nentryCount: 0\ngenerated: \"${params.timestamp}\"\nupdated: \"${params.timestamp}\"\n---\n\n# Comments\n\nNo comments yet.\n`;\n}\n\nexport function formatCommentEntry(comment: Comment): string {\n const lines: string[] = [];\n lines.push(`## ${comment.id}`);\n lines.push('');\n lines.push(`**Recorded:** ${comment.timestamp}`);\n lines.push(`**Author:** ${comment.author}`);\n lines.push(`**Type:** ${comment.type}`);\n if (comment.replyTo) {\n lines.push(`**Reply to:** ${comment.replyTo}`);\n }\n if (comment.type === 'question') {\n lines.push(`**Resolved:** ${comment.resolved ? 'true' : 'false'}`);\n }\n lines.push('');\n lines.push(comment.body.trim());\n lines.push('');\n return lines.join('\\n');\n}\n","export interface DecisionRecordParams {\n assignmentSlug: string;\n timestamp: string;\n}\n\nexport function renderDecisionRecord(\n params: DecisionRecordParams,\n): string {\n return `---\nassignment: ${params.assignmentSlug}\nupdated: \"${params.timestamp}\"\ndecisionCount: 0\n---\n\n# Decision Record\n\nNo decisions recorded yet.\n`;\n}\n","export interface IndexStubParams {\n slug: string;\n title: string;\n timestamp: string;\n}\n\nexport function renderIndexAssignments(params: IndexStubParams): string {\n return `---\nproject: ${params.slug}\ngenerated: \"${params.timestamp}\"\ntotal: 0\nby_status:\n pending: 0\n in_progress: 0\n blocked: 0\n review: 0\n completed: 0\n failed: 0\n---\n\n# Assignments\n\n| Slug | Title | Status | Priority | Assignee | Dependencies | Updated |\n|------|-------|--------|----------|----------|--------------|---------|\n`;\n}\n\nexport function renderIndexPlans(params: IndexStubParams): string {\n return `---\nproject: ${params.slug}\ngenerated: \"${params.timestamp}\"\n---\n\n# Plans\n\n| Assignment | Plan Status | Updated |\n|------------|-------------|---------|\n`;\n}\n\nexport function renderIndexDecisions(params: IndexStubParams): string {\n return `---\nproject: ${params.slug}\ngenerated: \"${params.timestamp}\"\n---\n\n# Decision Records\n\n| Assignment | Count | Latest Decision | Latest Status | Updated |\n|------------|-------|-----------------|---------------|---------|\n`;\n}\n\nexport function renderStatus(params: IndexStubParams): string {\n return `---\nproject: ${params.slug}\ngenerated: \"${params.timestamp}\"\nstatus: pending\nprogress:\n total: 0\n completed: 0\n in_progress: 0\n blocked: 0\n pending: 0\n review: 0\n failed: 0\nneedsAttention:\n blockedCount: 0\n failedCount: 0\n openQuestions: 0\n---\n\n# Project Status: ${params.title}\n\n**Status:** pending\n**Progress:** 0/0 assignments complete\n\n## Assignments\n\nNo assignments yet.\n\n## Dependency Graph\n\nNo dependencies yet.\n\n## Needs Attention\n\n- **0 blocked** assignments\n- **0 failed** assignments\n- **0 unanswered** questions\n`;\n}\n\nexport function renderResourcesIndex(params: IndexStubParams): string {\n return `---\nproject: ${params.slug}\ngenerated: \"${params.timestamp}\"\ntotal: 0\n---\n\n# Resources\n\n| Name | Category | Source | Related Assignments | Updated |\n|------|----------|--------|---------------------|---------|\n`;\n}\n\nexport function renderMemoriesIndex(params: IndexStubParams): string {\n return `---\nproject: ${params.slug}\ngenerated: \"${params.timestamp}\"\ntotal: 0\n---\n\n# Memories\n\n| Name | Source | Scope | Source Assignment | Updated |\n|------|--------|-------|------------------|---------|\n`;\n}\n","import { escapeYamlString } from '../utils/yaml.js';\n\nexport interface PlaybookParams {\n slug: string;\n name: string;\n description: string;\n whenToUse?: string;\n timestamp: string;\n}\n\nexport function renderPlaybook(params: PlaybookParams): string {\n const whenToUse = params.whenToUse\n ? escapeYamlString(params.whenToUse)\n : 'null';\n return `---\nname: ${escapeYamlString(params.name)}\nslug: ${params.slug}\ndescription: ${escapeYamlString(params.description)}\nwhen_to_use: ${whenToUse}\ncreated: \"${params.timestamp}\"\nupdated: \"${params.timestamp}\"\ntags: []\n---\n\n# ${params.name}\n\n<!-- Write imperative rules and workflows here. Keep it under 50 lines. -->\n`;\n}\n","export interface CursorAssignmentParams {\n projectSlug: string;\n assignmentSlug: string;\n projectDir: string;\n assignmentDir: string;\n}\n\nexport function renderCursorProtocol(): string {\n return `---\ndescription: Syntaur protocol rules for multi-agent coordination\nglobs:\nalwaysApply: true\n---\n\n# Syntaur Protocol\n\nYou are working within the Syntaur protocol for multi-agent project coordination.\n\n## Directory Structure\n\n\\`\\`\\`\n~/.syntaur/\n config.md\n projects/\n <project-slug>/\n manifest.md # Derived: root navigation (read-only)\n project.md # Human-authored: project overview (read-only)\n _index-assignments.md # Derived (read-only)\n _index-plans.md # Derived (read-only)\n _index-decisions.md # Derived (read-only)\n _status.md # Derived (read-only)\n claude.md # Human-authored: Claude-specific instructions (read-only)\n agent.md # Human-authored: universal agent instructions (read-only)\n assignments/\n <assignment-slug>/\n assignment.md # Agent-writable: source of truth for state (includes ## Todos)\n plan*.md # Agent-writable: versioned implementation plans (optional, one per ## Todos entry)\n scratchpad.md # Agent-writable: working notes\n handoff.md # Agent-writable: append-only handoff log\n decision-record.md # Agent-writable: append-only decision log\n resources/\n _index.md # Derived (read-only)\n <resource-slug>.md # Shared-writable\n memories/\n _index.md # Derived (read-only)\n <memory-slug>.md # Shared-writable\n\\`\\`\\`\n\n## Write Boundary Rules (CRITICAL)\n\n### Files you may WRITE:\n1. **Your assignment folder** -- only the assignment you are currently working on:\n - \\`assignment.md\\`, \\`plan*.md\\` (0 or more versioned plan files), \\`scratchpad.md\\`, \\`handoff.md\\`, \\`decision-record.md\\`\n - Path: \\`~/.syntaur/projects/<project>/assignments/<your-assignment>/\\`\n2. **Shared resources and memories** at the project level:\n - \\`~/.syntaur/projects/<project>/resources/<slug>.md\\`\n - \\`~/.syntaur/projects/<project>/memories/<slug>.md\\`\n3. **Your workspace** -- source code files in the current working directory (the directory where this adapter file lives). If your assignment's frontmatter specifies a \\`workspace\\` field, read it at runtime to determine the exact boundary.\n\n> **Note:** The \\`setup-adapter\\` command does not parse assignment frontmatter for workspace paths. Workspace boundaries are resolved by the agent at runtime by reading \\`assignment.md\\` frontmatter. If no \\`workspace\\` field is set, treat the current working directory as your workspace.\n\n### Files you must NEVER write:\n1. \\`project.md\\`, \\`agent.md\\`, \\`claude.md\\` -- human-authored, read-only\n2. \\`manifest.md\\` -- derived, rebuilt by tooling\n3. Any file prefixed with \\`_\\` -- derived\n4. Other agents' assignment folders\n5. Any files outside your workspace boundary\n\n## Assignment Lifecycle\n\n| Status | Meaning |\n|--------|---------|\n| \\`pending\\` | Not yet started |\n| \\`in_progress\\` | Actively being worked on |\n| \\`blocked\\` | Manually blocked (requires blockedReason) |\n| \\`review\\` | Work complete, awaiting review |\n| \\`completed\\` | Done |\n| \\`failed\\` | Could not be completed |\n\n## Valid State Transitions\n\n| From | Command | To |\n|------|---------|-----|\n| pending | start | in_progress |\n| pending | block | blocked |\n| in_progress | block | blocked |\n| in_progress | review | review |\n| in_progress | complete | completed |\n| in_progress | fail | failed |\n| blocked | unblock | in_progress |\n| review | start | in_progress |\n| review | complete | completed |\n| review | fail | failed |\n\n## Lifecycle Commands\n\nUse the \\`syntaur\\` CLI for state transitions:\n- \\`syntaur assign <slug> --agent <name> --project <project>\\` -- set assignee\n- \\`syntaur start <slug> --project <project>\\` -- pending -> in_progress\n- \\`syntaur review <slug> --project <project>\\` -- in_progress -> review\n- \\`syntaur complete <slug> --project <project>\\` -- in_progress/review -> completed\n- \\`syntaur block <slug> --project <project> --reason <text>\\` -- block an assignment\n- \\`syntaur unblock <slug> --project <project>\\` -- unblock\n- \\`syntaur fail <slug> --project <project>\\` -- mark as failed\n\n## Playbooks\n\nPlaybooks are user-defined behavioral rules stored in \\`~/.syntaur/playbooks/\\`. Read the playbook manifest before starting work:\n\n\\`\\`\\`bash\ncat ~/.syntaur/playbooks/manifest.md\n\\`\\`\\`\n\nFollow the rules in each playbook. They take precedence over default conventions when they conflict.\n\n## Conventions\n\n- Assignment frontmatter is the single source of truth for state\n- Slugs are lowercase, hyphen-separated\n- Always read \\`agent.md\\` at the project level before starting work\n- Add unanswered questions to the Q&A section of assignment.md\n- Commit frequently with messages referencing the assignment slug\n`;\n}\n\nexport function renderCursorAssignment(params: CursorAssignmentParams): string {\n return `---\ndescription: Syntaur assignment context for ${params.projectSlug}/${params.assignmentSlug}\nglobs:\nalwaysApply: true\n---\n\n# Current Assignment Context\n\n- **Project:** ${params.projectSlug}\n- **Assignment:** ${params.assignmentSlug}\n- **Project directory:** ${params.projectDir}\n- **Assignment directory:** ${params.assignmentDir}\n\n## Reading Order\n\nBefore starting work, read these files in order:\n1. \\`${params.projectDir}/agent.md\\` -- universal agent instructions and boundaries\n2. \\`${params.projectDir}/project.md\\` -- project overview and goals\n3. \\`${params.assignmentDir}/assignment.md\\` -- your assignment details, acceptance criteria, todos, current status\n4. any \\`${params.assignmentDir}/plan*.md\\` files linked from active todos in the \\`## Todos\\` section (may be 0, 1, or many)\n5. \\`${params.assignmentDir}/handoff.md\\` -- previous session handoff notes\n\n## Your Writable Files\n\nYou may ONLY write to files inside your assignment folder:\n- \\`${params.assignmentDir}/assignment.md\\`\n- \\`${params.assignmentDir}/plan*.md\\` (0 or more versioned plan files, e.g., \\`plan.md\\`, \\`plan-v2.md\\`)\n- \\`${params.assignmentDir}/scratchpad.md\\`\n- \\`${params.assignmentDir}/handoff.md\\`\n- \\`${params.assignmentDir}/decision-record.md\\`\n\nAnd source code files in your workspace. Read the \\`workspace\\` field from your assignment's frontmatter to determine the exact boundary. If not set, the current working directory is your workspace.\n`;\n}\n","export interface CodexAgentsParams {\n projectSlug: string;\n assignmentSlug: string;\n projectDir: string;\n assignmentDir: string;\n}\n\nexport function renderCodexAgents(params: CodexAgentsParams): string {\n return `# Syntaur Protocol -- Agent Instructions\n\nThis project uses the Syntaur protocol for multi-agent project coordination.\n\n## Current Assignment\n\n- **Project:** ${params.projectSlug}\n- **Assignment:** ${params.assignmentSlug}\n- **Project directory:** ${params.projectDir}\n- **Assignment directory:** ${params.assignmentDir}\n\n## Preferred Workflow\n\nIf the global Syntaur Codex plugin is installed, prefer these workflows instead of ad hoc protocol edits:\n\n- \\`syntaur-operator\\` agent -- use for broad Syntaur protocol work or when a task spans multiple lifecycle steps\n- \\`syntaur-protocol\\` -- background protocol and write-boundary rules\n- \\`create-project\\` -- scaffold a project\n- \\`create-assignment\\` -- create a new assignment\n- \\`grab-assignment\\` -- claim work, create \\`.syntaur/context.json\\`, and register a session\n- \\`plan-assignment\\` -- write a versioned plan file (\\`plan.md\\`, \\`plan-v2.md\\`, ...) and link it from the \\`## Todos\\` section of \\`assignment.md\\`\n- \\`complete-assignment\\` -- append the handoff, close the session, and transition state\n- \\`track-session\\` -- manage tracked tmux sessions for the dashboard\n\nIf the plugin is unavailable, follow the same workflow manually with the \\`syntaur\\` CLI and keep the protocol files current yourself.\n\n## Reading Order\n\nBefore starting work, read these files in order:\n1. \\`${params.projectDir}/manifest.md\\` -- root navigation entry point\n2. \\`${params.projectDir}/agent.md\\` -- universal agent instructions and boundaries\n3. \\`${params.projectDir}/project.md\\` -- project overview and goals\n4. \\`${params.projectDir}/claude.md\\` if it exists -- extra project context that may still be relevant\n5. \\`${params.assignmentDir}/assignment.md\\` -- your assignment details, acceptance criteria, todos, current status\n6. any \\`${params.assignmentDir}/plan*.md\\` files linked from active todos in the \\`## Todos\\` section (may be 0, 1, or many)\n7. \\`${params.assignmentDir}/handoff.md\\` -- previous session handoff notes\n\n## Context File\n\n- Treat \\`.syntaur/context.json\\` in the current working directory as the active assignment context when it exists.\n- Use that file to resolve the workspace boundary, assignment path, project path, and active session ID.\n- If there is no context file yet and you are supposed to work on an assignment, claim or set up the assignment before editing code.\n\n## Directory Structure\n\n\\`\\`\\`\n~/.syntaur/\n config.md\n projects/\n <project-slug>/\n manifest.md # Derived: root navigation (read-only)\n project.md # Human-authored: project overview (read-only)\n _index-assignments.md # Derived (read-only)\n _index-plans.md # Derived (read-only)\n _index-decisions.md # Derived (read-only)\n _status.md # Derived (read-only)\n claude.md # Human-authored: Claude-specific instructions (read-only)\n agent.md # Human-authored: universal agent instructions (read-only)\n assignments/\n <assignment-slug>/\n assignment.md # Agent-writable: source of truth for state (includes ## Todos)\n plan*.md # Agent-writable: versioned implementation plans (optional, one per ## Todos entry)\n scratchpad.md # Agent-writable: working notes\n handoff.md # Agent-writable: append-only handoff log\n decision-record.md # Agent-writable: append-only decision log\n resources/\n _index.md # Derived (read-only)\n <resource-slug>.md # Shared-writable\n memories/\n _index.md # Derived (read-only)\n <memory-slug>.md # Shared-writable\n\\`\\`\\`\n\n## Write Boundary Rules (CRITICAL)\n\n### Files you may WRITE:\n1. **Your assignment folder** -- only the assignment you are currently working on:\n - \\`assignment.md\\`, \\`plan*.md\\` (0 or more versioned plan files), \\`scratchpad.md\\`, \\`handoff.md\\`, \\`decision-record.md\\`\n - Path: \\`${params.assignmentDir}/\\`\n2. **Shared resources and memories** at the project level:\n - \\`${params.projectDir}/resources/<slug>.md\\`\n - \\`${params.projectDir}/memories/<slug>.md\\`\n3. **Your workspace** -- source code files in the current working directory (the directory where this AGENTS.md lives). If your assignment's frontmatter specifies a \\`workspace\\` field, read it at runtime to determine the exact boundary.\n\n> **Note:** Workspace boundaries are resolved by the agent at runtime by reading \\`assignment.md\\` frontmatter. If no \\`workspace\\` field is set, treat the current working directory as your workspace.\n\n### Files you must NEVER write:\n1. \\`project.md\\`, \\`agent.md\\`, \\`claude.md\\` -- human-authored, read-only\n2. \\`manifest.md\\` -- derived, rebuilt by tooling\n3. Any file prefixed with \\`_\\` -- derived\n4. Other agents' assignment folders\n5. Any files outside your workspace boundary\n\n## Assignment Lifecycle\n\n| Status | Meaning |\n|--------|---------|\n| \\`pending\\` | Not yet started |\n| \\`in_progress\\` | Actively being worked on |\n| \\`blocked\\` | Manually blocked (requires blockedReason) |\n| \\`review\\` | Work complete, awaiting review |\n| \\`completed\\` | Done |\n| \\`failed\\` | Could not be completed |\n\n## Valid State Transitions\n\n| From | Command | To |\n|------|---------|-----|\n| pending | start | in_progress |\n| pending | block | blocked |\n| in_progress | block | blocked |\n| in_progress | review | review |\n| in_progress | complete | completed |\n| in_progress | fail | failed |\n| blocked | unblock | in_progress |\n| review | start | in_progress |\n| review | complete | completed |\n| review | fail | failed |\n\n## Lifecycle Commands\n\nUse the \\`syntaur\\` CLI for state transitions:\n- \\`syntaur assign ${params.assignmentSlug} --agent <name> --project ${params.projectSlug}\\` -- set assignee\n- \\`syntaur start ${params.assignmentSlug} --project ${params.projectSlug}\\` -- pending -> in_progress\n- \\`syntaur review ${params.assignmentSlug} --project ${params.projectSlug}\\` -- in_progress -> review\n- \\`syntaur complete ${params.assignmentSlug} --project ${params.projectSlug}\\` -- in_progress/review -> completed\n- \\`syntaur block ${params.assignmentSlug} --project ${params.projectSlug} --reason <text>\\` -- block\n- \\`syntaur unblock ${params.assignmentSlug} --project ${params.projectSlug}\\` -- unblock\n- \\`syntaur fail ${params.assignmentSlug} --project ${params.projectSlug}\\` -- mark as failed\n\n## Troubleshooting\n\nIf Syntaur state looks inconsistent (missing files, stale manifests, unexpected hook blocks), run \\`syntaur doctor\\` to diagnose. Use \\`--json\\` for structured output.\n\n## Playbooks\n\nPlaybooks are user-defined behavioral rules stored in \\`~/.syntaur/playbooks/\\`. Before starting work, read the playbook manifest and then each referenced playbook:\n\n\\`\\`\\`bash\ncat ~/.syntaur/playbooks/manifest.md\n\\`\\`\\`\n\nRead each linked playbook and follow the rules in its body section. The \\`when_to_use\\` field tells you when each playbook applies. Playbooks take precedence over default conventions when they conflict.\n\n## Conventions\n\n- Assignment frontmatter is the single source of truth for state\n- Slugs are lowercase, hyphen-separated\n- Always read \\`agent.md\\` at the project level before starting work\n- Keep \\`assignment.md\\` progress, acceptance criteria, and \\`## Todos\\` updated as work lands\n- Keep active plan file(s) current after planning changes and \\`handoff.md\\` current before leaving the task\n- When requirements shift, supersede the prior plan todo (\\`- [x] ~~...~~ (superseded by plan-v<N>)\\`) and write a new plan file instead of rewriting the old one\n- Add unanswered questions to the Q&A section of assignment.md\n- Commit frequently with messages referencing the assignment slug\n`;\n}\n","export interface OpenCodeConfigParams {\n projectDir: string;\n}\n\nexport function renderOpenCodeConfig(params: OpenCodeConfigParams): string {\n const config = {\n instructions: [\n `Read AGENTS.md in this directory for Syntaur protocol instructions.`,\n `Also read ${params.projectDir}/agent.md for universal agent conventions.`,\n ],\n };\n return JSON.stringify(config, null, 2) + '\\n';\n}\n","import { resolve } from 'node:path';\nimport { slugify, isValidSlug } from '../utils/slug.js';\nimport { nowTimestamp } from '../utils/timestamp.js';\nimport { generateId } from '../utils/uuid.js';\nimport { expandHome, assignmentsDir as assignmentsDirFn } from '../utils/paths.js';\nimport { ensureDir, writeFileForce, fileExists } from '../utils/fs.js';\nimport { readConfig } from '../utils/config.js';\nimport {\n renderAssignment,\n renderScratchpad,\n renderHandoff,\n renderDecisionRecord,\n renderProgress,\n renderComments,\n} from '../templates/index.js';\n\nexport interface CreateAssignmentOptions {\n project?: string;\n oneOff?: boolean;\n slug?: string;\n priority?: 'low' | 'medium' | 'high' | 'critical';\n dependsOn?: string;\n links?: string;\n dir?: string;\n type?: string;\n}\n\nexport async function createAssignmentCommand(\n title: string,\n options: CreateAssignmentOptions,\n): Promise<void> {\n if (!title.trim()) {\n throw new Error('Assignment title cannot be empty.');\n }\n\n if (!options.project && !options.oneOff) {\n throw new Error(\n 'Either --project <slug> or --one-off is required.',\n );\n }\n if (options.project && options.oneOff) {\n throw new Error(\n 'Cannot use both --project and --one-off. Use --project to add to an existing project, or --one-off to create a standalone assignment.',\n );\n }\n\n if (options.project && !isValidSlug(options.project)) {\n throw new Error(\n `Invalid project slug \"${options.project}\". Slugs must be lowercase, hyphen-separated, with no special characters.`,\n );\n }\n\n if (options.oneOff && options.dependsOn) {\n throw new Error('Standalone assignments cannot have dependencies (--depends-on is not allowed with --one-off).');\n }\n\n const assignmentSlug = options.slug || slugify(title);\n if (!isValidSlug(assignmentSlug)) {\n throw new Error(\n `Invalid slug \"${assignmentSlug}\". Slugs must be lowercase, hyphen-separated, with no special characters.`,\n );\n }\n\n const dependsOn = options.dependsOn\n ? options.dependsOn.split(',').map((s) => s.trim()).filter(Boolean)\n : [];\n for (const dep of dependsOn) {\n if (!isValidSlug(dep)) {\n throw new Error(\n `Invalid dependency slug \"${dep}\". Slugs must be lowercase, hyphen-separated, with no special characters.`,\n );\n }\n }\n\n const links = options.links\n ? options.links.split(',').map((s) => s.trim()).filter(Boolean)\n : [];\n for (const link of links) {\n const parts = link.split('/');\n if (parts.length !== 2 || !parts.every(isValidSlug)) {\n throw new Error(\n `Invalid link \"${link}\". Links must be in projectSlug/assignmentSlug format (e.g., \"my-project/my-assignment\").`,\n );\n }\n }\n\n const validPriorities = ['low', 'medium', 'high', 'critical'] as const;\n const priority = (options.priority || 'medium') as typeof validPriorities[number];\n if (!validPriorities.includes(priority)) {\n throw new Error(\n `Invalid priority \"${options.priority}\". Must be one of: ${validPriorities.join(', ')}`,\n );\n }\n\n const config = await readConfig();\n const timestamp = nowTimestamp();\n const id = generateId();\n\n let assignmentDir: string;\n let projectSlug: string | null;\n let folderName: string;\n\n if (options.oneOff) {\n // Standalone: folder name = UUID, project: null\n const standaloneRoot = assignmentsDirFn();\n folderName = id;\n assignmentDir = resolve(standaloneRoot, folderName);\n projectSlug = null;\n await ensureDir(standaloneRoot);\n } else {\n const baseDir = options.dir\n ? expandHome(options.dir)\n : config.defaultProjectDir;\n projectSlug = options.project!;\n const projectDir = resolve(baseDir, projectSlug);\n\n const projectMdPath = resolve(projectDir, 'project.md');\n if (!(await fileExists(projectDir)) || !(await fileExists(projectMdPath))) {\n throw new Error(\n `Project \"${projectSlug}\" not found at ${projectDir}.\\nRun 'syntaur create-project' first or use --one-off.`,\n );\n }\n\n if (dependsOn.length > 0) {\n const depDirBase = resolve(projectDir, 'assignments');\n for (const dep of dependsOn) {\n const depDir = resolve(depDirBase, dep);\n if (!(await fileExists(depDir))) {\n console.warn(\n `Warning: dependency \"${dep}\" does not exist in project \"${projectSlug}\" yet.`,\n );\n }\n }\n }\n\n folderName = assignmentSlug;\n assignmentDir = resolve(projectDir, 'assignments', folderName);\n }\n\n if (await fileExists(assignmentDir)) {\n throw new Error(\n `Assignment folder already exists: ${assignmentDir}\\nUse --slug to specify a different slug.`,\n );\n }\n\n await ensureDir(assignmentDir);\n\n const companionAssignmentRef = projectSlug === null ? id : assignmentSlug;\n\n const files: Array<[string, string]> = [\n [\n resolve(assignmentDir, 'assignment.md'),\n renderAssignment({\n id,\n slug: assignmentSlug,\n title,\n timestamp,\n priority,\n dependsOn,\n links,\n project: projectSlug,\n type: options.type,\n }),\n ],\n [\n resolve(assignmentDir, 'scratchpad.md'),\n renderScratchpad({\n assignmentSlug: companionAssignmentRef,\n timestamp,\n }),\n ],\n [\n resolve(assignmentDir, 'handoff.md'),\n renderHandoff({\n assignmentSlug: companionAssignmentRef,\n timestamp,\n }),\n ],\n [\n resolve(assignmentDir, 'decision-record.md'),\n renderDecisionRecord({\n assignmentSlug: companionAssignmentRef,\n timestamp,\n }),\n ],\n [\n resolve(assignmentDir, 'progress.md'),\n renderProgress({\n assignment: companionAssignmentRef,\n timestamp,\n }),\n ],\n [\n resolve(assignmentDir, 'comments.md'),\n renderComments({\n assignment: companionAssignmentRef,\n timestamp,\n }),\n ],\n ];\n\n for (const [filePath, content] of files) {\n await writeFileForce(filePath, content);\n }\n\n if (projectSlug === null) {\n console.log(\n `Created standalone assignment \"${title}\" at ${assignmentDir}/`,\n );\n console.log(` UUID: ${id}`);\n console.log(` Slug: ${assignmentSlug} (display only)`);\n } else {\n console.log(\n `Created assignment \"${title}\" in project \"${projectSlug}\" at ${assignmentDir}/`,\n );\n console.log(` Slug: ${assignmentSlug}`);\n }\n console.log(` Priority: ${priority}`);\n if (options.type) {\n console.log(` Type: ${options.type}`);\n }\n if (dependsOn.length > 0) {\n console.log(` Depends on: ${dependsOn.join(', ')}`);\n }\n if (links.length > 0) {\n console.log(` Links: ${links.join(', ')}`);\n }\n console.log(` Files created:`);\n console.log(` assignment.md`);\n console.log(` scratchpad.md`);\n console.log(` handoff.md`);\n console.log(` decision-record.md`);\n console.log(` progress.md`);\n console.log(` comments.md`);\n console.log(\n ` Plan files (plan.md, plan-v2.md, ...) are created on demand by /plan-assignment.`,\n );\n}\n","import { spawn, type ChildProcess } from 'node:child_process';\nimport { createServer as createNetServer } from 'node:net';\nimport { resolve, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { readConfig } from '../utils/config.js';\nimport { createDashboardServer } from '../dashboard/server.js';\nimport { serversDir as getServersDir, playbooksDir as getPlaybooksDir, todosDir as getTodosDir } from '../utils/paths.js';\nimport { fileExists } from '../utils/fs.js';\n\nexport interface DashboardOptions {\n port: string;\n dev?: boolean;\n serverOnly?: boolean;\n apiOnly: boolean;\n open: boolean;\n autoPort?: boolean;\n}\n\nexport type DashboardRuntimeMode = 'static' | 'dev' | 'server-only';\n\nexport function didUserSpecifyDashboardPort(argv: string[] = process.argv): boolean {\n return argv.some((arg) => arg === '--port' || arg.startsWith('--port='));\n}\n\nexport function resolveDashboardMode(options: DashboardOptions): DashboardRuntimeMode {\n const devMode = Boolean(options.dev);\n const serverOnly = Boolean(options.serverOnly || options.apiOnly);\n\n if (devMode && serverOnly) {\n throw new Error('Use either --dev or --server-only, not both.');\n }\n\n if (devMode) {\n return 'dev';\n }\n\n if (serverOnly) {\n return 'server-only';\n }\n\n return 'static';\n}\n\nasync function isPortAvailable(port: number): Promise<boolean> {\n return new Promise((resolveAvailability) => {\n const tester = createNetServer();\n\n tester.once('error', () => {\n resolveAvailability(false);\n });\n\n tester.once('listening', () => {\n tester.close(() => resolveAvailability(true));\n });\n\n tester.listen(port);\n });\n}\n\nexport async function findAvailablePort(\n startPort: number,\n maxAttempts: number = 20,\n): Promise<number | null> {\n for (let offset = 0; offset < maxAttempts; offset += 1) {\n const candidate = startPort + offset;\n if (candidate > 65535) {\n break;\n }\n if (await isPortAvailable(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nexport async function dashboardCommand(options: DashboardOptions): Promise<void> {\n const config = await readConfig();\n const projectsDir = config.defaultProjectDir;\n const requestedPort = parseInt(options.port, 10);\n\n if (isNaN(requestedPort) || requestedPort < 1 || requestedPort > 65535) {\n throw new Error(`Invalid port \"${options.port}\". Must be a number between 1 and 65535.`);\n }\n\n const mode = resolveDashboardMode(options);\n let port = requestedPort;\n\n if (options.autoPort) {\n const availablePort = await findAvailablePort(requestedPort);\n if (availablePort === null) {\n throw new Error(\n `Could not find an available dashboard port starting at ${requestedPort}. Run \"syntaur dashboard --port <number>\" to choose one manually.`,\n );\n }\n if (availablePort !== requestedPort) {\n console.log(`Port ${requestedPort} is busy. Launching the dashboard on port ${availablePort} instead.`);\n }\n port = availablePort;\n }\n\n // Compute the dashboard dist path relative to this file's location.\n // After tsup bundling, import.meta.url resolves to dist/index.js so we\n // go one level up to the package root, then into dashboard/dist.\n const thisFile = fileURLToPath(import.meta.url);\n const packageRoot = resolve(dirname(thisFile), '..');\n const dashboardDist = resolve(packageRoot, 'dashboard', 'dist');\n\n const server = createDashboardServer({\n port,\n projectsDir,\n serversDir: getServersDir(),\n playbooksDir: getPlaybooksDir(),\n todosDir: getTodosDir(),\n serveStaticUi: mode === 'static',\n dashboardDistPath: dashboardDist,\n });\n\n await server.start();\n\n let viteProcess: ChildProcess | null = null;\n\n if (mode === 'dev') {\n const dashboardDir = resolve(packageRoot, 'dashboard');\n const viteBin = resolve(dashboardDir, 'node_modules', '.bin', 'vite');\n\n if (!(await fileExists(viteBin))) {\n console.error(\n 'Vite not found. Run \"npm ci --prefix dashboard\" first, or use the default bundled dashboard mode.',\n );\n await server.stop();\n process.exit(1);\n }\n\n console.log(`API server running on http://localhost:${port}`);\n console.log('Starting Vite dev server...');\n\n viteProcess = spawn(viteBin, [], {\n cwd: dashboardDir,\n env: {\n ...process.env,\n VITE_API_PORT: String(port),\n },\n stdio: 'inherit',\n });\n\n viteProcess.on('error', (err) => {\n console.error('Failed to start Vite dev server:', err.message);\n });\n } else if (mode === 'server-only') {\n const url = `http://localhost:${port}`;\n console.log(`Syntaur Dashboard API running at ${url}`);\n } else {\n const url = `http://localhost:${port}`;\n console.log(`Syntaur Dashboard running at ${url}`);\n\n if (options.open) {\n try {\n const openModule = await import('open');\n await openModule.default(url);\n } catch {\n console.log(`Open ${url} in your browser to view the dashboard.`);\n }\n }\n }\n\n // Keep the process running\n let shuttingDown = false;\n const forceExit = () => {\n console.log('\\nForce exit.');\n if (viteProcess) {\n try { viteProcess.kill('SIGKILL'); } catch {}\n }\n process.exit(1);\n };\n const shutdown = async () => {\n if (shuttingDown) {\n forceExit();\n return;\n }\n shuttingDown = true;\n console.log('\\nShutting down dashboard... (press Ctrl+C again to force)');\n if (viteProcess) {\n viteProcess.kill();\n }\n try {\n await server.stop();\n } catch (err) {\n console.error('Error during shutdown:', err);\n }\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n","import express from 'express';\nimport { createServer } from 'node:http';\nimport { resolve } from 'node:path';\nimport { writeFile, unlink } from 'node:fs/promises';\nimport { syntaurRoot } from '../utils/paths.js';\nimport { WebSocketServer, WebSocket } from 'ws';\nimport {\n listProjects,\n listAssignmentsBoard,\n getProjectDetail,\n getAssignmentDetail,\n getOverview,\n getAttention,\n getHelp,\n getStatusConfig,\n clearStatusConfigCache,\n listWorkspaces,\n createWorkspace,\n deleteWorkspace,\n} from './api.js';\nimport { createWatcher } from './watcher.js';\nimport { fileExists } from '../utils/fs.js';\nimport { writeStatusConfig, deleteStatusConfig } from '../utils/config.js';\nimport { createWriteRouter } from './api-write.js';\nimport { createServersRouter } from './api-servers.js';\nimport { createAgentSessionsRouter } from './api-agent-sessions.js';\nimport { createPlaybooksRouter } from './api-playbooks.js';\nimport { createTodosRouter } from './api-todos.js';\nimport { createBackupRouter } from './api-backup.js';\nimport { initSessionDb, migrateFromMarkdown, closeSessionDb } from './session-db.js';\nimport { startAutodiscovery, stopAutodiscovery } from './autodiscovery.js';\nimport type { WsMessage } from './types.js';\n\nexport interface DashboardServerOptions {\n port: number;\n projectsDir: string;\n serversDir: string;\n playbooksDir: string;\n todosDir: string;\n serveStaticUi: boolean;\n /** Absolute path to the built dashboard UI (dashboard/dist). Required when serveStaticUi is true. */\n dashboardDistPath?: string;\n}\n\nexport function createDashboardServer(options: DashboardServerOptions) {\n const { port, projectsDir, serversDir, playbooksDir, todosDir, serveStaticUi, dashboardDistPath } = options;\n const app = express();\n const server = createServer(app);\n\n // --- WebSocket ---\n const wss = new WebSocketServer({ noServer: true });\n const clients = new Set<WebSocket>();\n\n server.on('upgrade', (request, socket, head) => {\n if (request.url === '/ws') {\n wss.handleUpgrade(request, socket, head, (ws) => {\n wss.emit('connection', ws, request);\n });\n } else {\n socket.destroy();\n }\n });\n\n wss.on('connection', (ws) => {\n clients.add(ws);\n const connectMsg: WsMessage = {\n type: 'connected',\n timestamp: new Date().toISOString(),\n };\n ws.send(JSON.stringify(connectMsg));\n\n ws.on('close', () => {\n clients.delete(ws);\n });\n });\n\n function broadcast(message: WsMessage): void {\n const data = JSON.stringify(message);\n for (const client of clients) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(data);\n }\n }\n }\n\n // --- Initialize session database ---\n initSessionDb();\n migrateFromMarkdown(projectsDir).catch((err) => {\n console.error('Session migration from markdown failed:', err);\n });\n\n // --- JSON body parsing ---\n app.use(express.json());\n\n // --- API Routes ---\n app.get('/api/overview', async (_req, res) => {\n try {\n const overview = await getOverview(projectsDir, serversDir);\n res.json(overview);\n } catch (error) {\n console.error('Error getting overview:', error);\n res.status(500).json({ error: 'Failed to get overview' });\n }\n });\n\n app.get('/api/attention', async (_req, res) => {\n try {\n const attention = await getAttention(projectsDir, serversDir);\n res.json(attention);\n } catch (error) {\n console.error('Error getting attention queue:', error);\n res.status(500).json({ error: 'Failed to get attention queue' });\n }\n });\n\n app.get('/api/help', async (_req, res) => {\n try {\n const help = await getHelp();\n res.json(help);\n } catch (error) {\n console.error('Error getting help content:', error);\n res.status(500).json({ error: 'Failed to get help content' });\n }\n });\n\n app.get('/api/config/statuses', async (_req, res) => {\n try {\n const config = await getStatusConfig();\n res.json({\n statuses: config.statuses,\n order: config.order,\n transitions: config.transitions,\n custom: config.custom,\n });\n } catch (error) {\n console.error('Error getting status config:', error);\n res.status(500).json({ error: 'Failed to get status config' });\n }\n });\n\n app.post('/api/config/statuses', async (req, res) => {\n try {\n const { statuses, order, transitions } = req.body;\n if (!Array.isArray(statuses) || !Array.isArray(order) || !Array.isArray(transitions)) {\n res.status(400).json({ error: 'Request body must include statuses, order, and transitions arrays' });\n return;\n }\n await writeStatusConfig({ statuses, order, transitions });\n clearStatusConfigCache();\n const config = await getStatusConfig();\n res.json({\n statuses: config.statuses,\n order: config.order,\n transitions: config.transitions,\n custom: config.custom,\n });\n } catch (error) {\n console.error('Error saving status config:', error);\n res.status(500).json({ error: 'Failed to save status config' });\n }\n });\n\n app.delete('/api/config/statuses', async (_req, res) => {\n try {\n await deleteStatusConfig();\n clearStatusConfigCache();\n const config = await getStatusConfig();\n res.json({\n statuses: config.statuses,\n order: config.order,\n transitions: config.transitions,\n custom: config.custom,\n });\n } catch (error) {\n console.error('Error resetting status config:', error);\n res.status(500).json({ error: 'Failed to reset status config' });\n }\n });\n\n app.get('/api/projects', async (req, res) => {\n try {\n let projects = await listProjects(projectsDir);\n const workspaceParam = req.query.workspace as string | undefined;\n if (workspaceParam) {\n if (workspaceParam === '_ungrouped') {\n projects = projects.filter((m) => m.workspace === null);\n } else {\n projects = projects.filter((m) => m.workspace === workspaceParam);\n }\n }\n res.json(projects);\n } catch (error) {\n console.error('Error listing projects:', error);\n res.status(500).json({ error: 'Failed to list projects' });\n }\n });\n\n app.get('/api/workspaces', async (_req, res) => {\n try {\n const result = await listWorkspaces(projectsDir);\n res.json(result);\n } catch (error) {\n console.error('Error listing workspaces:', error);\n res.status(500).json({ error: 'Failed to list workspaces' });\n }\n });\n\n app.post('/api/workspaces', async (req, res) => {\n try {\n const { name } = req.body;\n if (!name || typeof name !== 'string' || !/^[a-z0-9][a-z0-9-]*$/.test(name)) {\n res.status(400).json({ error: 'Invalid workspace name. Use lowercase letters, numbers, and hyphens.' });\n return;\n }\n await createWorkspace(projectsDir, name);\n broadcast({ type: 'project-updated', projectSlug: '', timestamp: new Date().toISOString() });\n res.json({ name });\n } catch (error) {\n console.error('Error creating workspace:', error);\n res.status(500).json({ error: 'Failed to create workspace' });\n }\n });\n\n app.delete('/api/workspaces/:name', async (req, res) => {\n try {\n await deleteWorkspace(projectsDir, req.params.name);\n broadcast({ type: 'project-updated', projectSlug: '', timestamp: new Date().toISOString() });\n res.json({ ok: true });\n } catch (error) {\n console.error('Error deleting workspace:', error);\n res.status(500).json({ error: 'Failed to delete workspace' });\n }\n });\n\n app.get('/api/assignments', async (req, res) => {\n try {\n const result = await listAssignmentsBoard(projectsDir);\n const workspaceParam = req.query.workspace as string | undefined;\n if (workspaceParam) {\n if (workspaceParam === '_ungrouped') {\n result.assignments = result.assignments.filter((a) => a.projectWorkspace === null);\n } else {\n result.assignments = result.assignments.filter((a) => a.projectWorkspace === workspaceParam);\n }\n }\n res.json(result);\n } catch (error) {\n console.error('Error listing assignments:', error);\n res.status(500).json({ error: 'Failed to list assignments' });\n }\n });\n\n app.get('/api/projects/:slug', async (req, res) => {\n try {\n const detail = await getProjectDetail(projectsDir, req.params.slug);\n if (!detail) {\n res.status(404).json({ error: `Project \"${req.params.slug}\" not found` });\n return;\n }\n res.json(detail);\n } catch (error) {\n console.error('Error getting project detail:', error);\n res.status(500).json({ error: 'Failed to get project detail' });\n }\n });\n\n app.get('/api/projects/:slug/assignments/:aslug', async (req, res) => {\n try {\n const detail = await getAssignmentDetail(\n projectsDir,\n req.params.slug,\n req.params.aslug,\n );\n if (!detail) {\n res.status(404).json({\n error: `Assignment \"${req.params.aslug}\" not found in project \"${req.params.slug}\"`,\n });\n return;\n }\n res.json(detail);\n } catch (error) {\n console.error('Error getting assignment detail:', error);\n res.status(500).json({ error: 'Failed to get assignment detail' });\n }\n });\n\n // --- Write API (create projects/assignments) ---\n app.use(createWriteRouter(projectsDir));\n\n // --- Servers API ---\n app.use('/api/servers', createServersRouter(serversDir, projectsDir));\n\n // --- Agent Sessions API ---\n app.use('/api/agent-sessions', createAgentSessionsRouter(projectsDir, broadcast));\n\n // --- Playbooks API ---\n app.use('/api/playbooks', createPlaybooksRouter(playbooksDir));\n\n // --- Todos API ---\n app.use('/api/todos', createTodosRouter(todosDir, broadcast));\n\n // --- Backup API ---\n app.use('/api/backup', createBackupRouter());\n\n // --- Static files (production only) ---\n if (serveStaticUi && dashboardDistPath) {\n app.use(express.static(dashboardDistPath));\n\n // SPA fallback: serve index.html for all non-API routes\n // Express 5 requires named wildcards; use '{*path}' instead of '*'\n app.get('{*path}', async (_req: any, res: any) => {\n const indexPath = resolve(dashboardDistPath, 'index.html');\n if (await fileExists(indexPath)) {\n res.sendFile(indexPath);\n } else {\n res.status(503).send(\n 'Dashboard not built. Run \"npm run build:dashboard\" first.',\n );\n }\n });\n }\n\n // --- File watcher ---\n let watcherHandle: { close: () => Promise<void> } | null = null;\n\n return {\n async start(): Promise<void> {\n watcherHandle = createWatcher({\n projectsDir,\n serversDir,\n playbooksDir,\n todosDir,\n onMessage: broadcast,\n });\n\n startAutodiscovery({ serversDir, projectsDir, excludePids: new Set([process.pid]) });\n\n return new Promise<void>((resolvePromise, reject) => {\n server.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n reject(new Error(\n `Port ${port} is already in use. Use --port <number> to specify a different port.`,\n ));\n } else {\n reject(err);\n }\n });\n server.listen(port, () => {\n const portFile = resolve(syntaurRoot(), 'dashboard-port');\n writeFile(portFile, String(port), 'utf-8').catch(() => {});\n resolvePromise();\n });\n });\n },\n\n async stop(): Promise<void> {\n await stopAutodiscovery();\n if (watcherHandle) {\n await watcherHandle.close();\n }\n closeSessionDb();\n for (const client of clients) {\n client.terminate();\n }\n clients.clear();\n const portFile = resolve(syntaurRoot(), 'dashboard-port');\n await unlink(portFile).catch(() => {});\n server.closeAllConnections?.();\n return new Promise<void>((resolvePromise) => {\n server.close(() => resolvePromise());\n });\n },\n\n get port(): number {\n return port;\n },\n };\n}\n","import { watch } from 'chokidar';\nimport { relative, sep } from 'node:path';\nimport type { WsMessage } from './types.js';\n\nexport interface WatcherOptions {\n projectsDir: string;\n serversDir?: string;\n playbooksDir?: string;\n todosDir?: string;\n onMessage: (message: WsMessage) => void;\n debounceMs?: number;\n}\n\nexport function createWatcher(options: WatcherOptions): { close: () => Promise<void> } {\n const { projectsDir, serversDir, playbooksDir, todosDir, onMessage, debounceMs = 300 } = options;\n const pendingEvents = new Map<string, NodeJS.Timeout>();\n\n // --- Projects watcher (existing logic) ---\n const projectsWatcher = watch(projectsDir, {\n ignoreInitial: true,\n persistent: true,\n depth: 10,\n ignored: /(^|[\\/\\\\])\\../,\n });\n\n function handleProjectChange(filePath: string): void {\n const rel = relative(projectsDir, filePath);\n const parts = rel.split(sep);\n\n if (parts.length === 0) return;\n\n const projectSlug = parts[0];\n let assignmentSlug: string | undefined;\n\n if (parts.length >= 3 && parts[1] === 'assignments') {\n assignmentSlug = parts[2];\n }\n\n const debounceKey = assignmentSlug\n ? `${projectSlug}/${assignmentSlug}`\n : projectSlug;\n\n const existing = pendingEvents.get(debounceKey);\n if (existing) clearTimeout(existing);\n\n // Session events are now emitted by the API write path, not the file watcher\n const messageType = assignmentSlug\n ? 'assignment-updated'\n : 'project-updated';\n\n pendingEvents.set(\n debounceKey,\n setTimeout(() => {\n pendingEvents.delete(debounceKey);\n const message: WsMessage = {\n type: messageType,\n projectSlug,\n assignmentSlug,\n timestamp: new Date().toISOString(),\n };\n onMessage(message);\n }, debounceMs),\n );\n }\n\n projectsWatcher.on('change', handleProjectChange);\n projectsWatcher.on('add', handleProjectChange);\n projectsWatcher.on('unlink', handleProjectChange);\n\n // --- Servers watcher (new) ---\n let serversWatcher: ReturnType<typeof watch> | null = null;\n\n if (serversDir) {\n serversWatcher = watch(serversDir, {\n ignoreInitial: true,\n persistent: true,\n depth: 1,\n ignored: /(^|[\\/\\\\])\\../,\n });\n\n function handleServerChange(): void {\n const debounceKey = '__servers__';\n const existing = pendingEvents.get(debounceKey);\n if (existing) clearTimeout(existing);\n\n pendingEvents.set(\n debounceKey,\n setTimeout(() => {\n pendingEvents.delete(debounceKey);\n const message: WsMessage = {\n type: 'servers-updated',\n timestamp: new Date().toISOString(),\n };\n onMessage(message);\n }, debounceMs),\n );\n }\n\n serversWatcher.on('change', handleServerChange);\n serversWatcher.on('add', handleServerChange);\n serversWatcher.on('unlink', handleServerChange);\n }\n\n // --- Playbooks watcher ---\n let playbooksWatcher: ReturnType<typeof watch> | null = null;\n\n if (playbooksDir) {\n playbooksWatcher = watch(playbooksDir, {\n ignoreInitial: true,\n persistent: true,\n depth: 1,\n ignored: /(^|[\\/\\\\])\\../,\n });\n\n function handlePlaybookChange(): void {\n const debounceKey = '__playbooks__';\n const existing = pendingEvents.get(debounceKey);\n if (existing) clearTimeout(existing);\n\n pendingEvents.set(\n debounceKey,\n setTimeout(() => {\n pendingEvents.delete(debounceKey);\n const message: WsMessage = {\n type: 'playbooks-updated',\n timestamp: new Date().toISOString(),\n };\n onMessage(message);\n }, debounceMs),\n );\n }\n\n playbooksWatcher.on('change', handlePlaybookChange);\n playbooksWatcher.on('add', handlePlaybookChange);\n playbooksWatcher.on('unlink', handlePlaybookChange);\n }\n\n // --- Todos watcher ---\n let todosWatcher: ReturnType<typeof watch> | null = null;\n\n if (todosDir) {\n todosWatcher = watch(todosDir, {\n ignoreInitial: true,\n persistent: true,\n depth: 1,\n ignored: /(^|[\\/\\\\])\\../,\n });\n\n function handleTodoChange(): void {\n const debounceKey = '__todos__';\n const existing = pendingEvents.get(debounceKey);\n if (existing) clearTimeout(existing);\n\n pendingEvents.set(\n debounceKey,\n setTimeout(() => {\n pendingEvents.delete(debounceKey);\n const message: WsMessage = {\n type: 'todos-updated',\n timestamp: new Date().toISOString(),\n };\n onMessage(message);\n }, debounceMs),\n );\n }\n\n todosWatcher.on('change', handleTodoChange);\n todosWatcher.on('add', handleTodoChange);\n todosWatcher.on('unlink', handleTodoChange);\n }\n\n return {\n close: async () => {\n pendingEvents.forEach((timeout) => {\n clearTimeout(timeout);\n });\n pendingEvents.clear();\n await projectsWatcher.close();\n if (serversWatcher) await serversWatcher.close();\n if (playbooksWatcher) await playbooksWatcher.close();\n if (todosWatcher) await todosWatcher.close();\n },\n };\n}\n","import { Router, type Request, type Response } from 'express';\nimport { resolve } from 'node:path';\nimport { rm, readFile } from 'node:fs/promises';\nimport { executeTransition } from '../lifecycle/index.js';\nimport { isValidSlug } from '../utils/slug.js';\nimport { generateId } from '../utils/uuid.js';\nimport { nowTimestamp } from '../utils/timestamp.js';\nimport { ensureDir, writeFileForce, fileExists } from '../utils/fs.js';\nimport {\n parseAssignmentFull,\n parseDecisionRecord,\n parseHandoff,\n parseProject,\n parsePlan,\n parseScratchpad,\n} from './parser.js';\nimport { toggleAcceptanceCriterion } from './acceptance-criteria.js';\nimport {\n getAssignmentDetail,\n getEditableDocument,\n getProjectDetail,\n getStatusConfig,\n} from './api.js';\nimport {\n renderProject,\n renderManifest,\n renderIndexAssignments,\n renderIndexPlans,\n renderIndexDecisions,\n renderStatus,\n renderResourcesIndex,\n renderMemoriesIndex,\n renderAssignment,\n renderScratchpad,\n renderHandoff,\n renderDecisionRecord,\n} from '../templates/index.js';\n\nfunction extractFrontmatter(content: string): Record<string, string> | null {\n const trimmed = content.trimStart();\n if (!trimmed.startsWith('---\\n') && !trimmed.startsWith('---\\r\\n')) {\n return null;\n }\n\n const afterFirst = trimmed.indexOf('\\n') + 1;\n const closingIdx = trimmed.indexOf('\\n---', afterFirst);\n if (closingIdx === -1) {\n return null;\n }\n\n const yamlBlock = trimmed.slice(afterFirst, closingIdx);\n const fields: Record<string, string> = {};\n\n for (const line of yamlBlock.split('\\n')) {\n const match = line.match(/^([a-zA-Z_][a-zA-Z0-9_]*):\\s*(.*)$/);\n if (!match) {\n continue;\n }\n\n let value = match[2].trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n fields[match[1]] = value;\n }\n\n return fields;\n}\n\nfunction validateRequired(\n fields: Record<string, string>,\n required: string[],\n): { valid: true } | { valid: false; missing: string[] } {\n const missing = required.filter((key) => !fields[key] || fields[key] === 'null');\n if (missing.length > 0) {\n return { valid: false, missing };\n }\n return { valid: true };\n}\n\nfunction formatYamlValue(value: boolean | number | string | null): string {\n if (value === null) {\n return 'null';\n }\n if (typeof value === 'boolean' || typeof value === 'number') {\n return String(value);\n }\n if (/^\\d{4}-\\d{2}-\\d{2}T/.test(value)) {\n return `\"${value}\"`;\n }\n if (value === '' || /[:#{}[\\],&*?|>!%@`]/.test(value) || /^\\s|\\s$/.test(value)) {\n return `\"${value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n }\n return value;\n}\n\nfunction setTopLevelField(\n content: string,\n key: string,\n value: boolean | number | string | null,\n): string {\n const formatted = formatYamlValue(value);\n const fieldRegex = new RegExp(`^(${escapeRegExp(key)}:)\\\\s*.*$`, 'm');\n\n if (fieldRegex.test(content)) {\n return content.replace(fieldRegex, `$1 ${formatted}`);\n }\n\n const closingIdx = content.indexOf('\\n---', 4);\n if (closingIdx === -1) {\n return content;\n }\n\n return `${content.slice(0, closingIdx)}\\n${key}: ${formatted}${content.slice(closingIdx)}`;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction appendLogEntry(\n existingContent: string,\n countField: 'handoffCount' | 'decisionCount',\n nextCount: number,\n heading: string,\n body: string,\n emptyPlaceholder: string,\n): string {\n const timestamp = nowTimestamp();\n let next = setTopLevelField(existingContent, 'updated', timestamp);\n next = setTopLevelField(next, countField, nextCount);\n\n const entryBody = body.trim();\n const entry = `## ${heading}\\n\\n**Recorded:** ${timestamp}\\n\\n${entryBody}\\n`;\n\n if (next.includes(emptyPlaceholder)) {\n return next.replace(emptyPlaceholder, entry.trimEnd());\n }\n\n return `${next.trimEnd()}\\n\\n${entry}`;\n}\n\nfunction requireContent(req: Request, res: Response): string | null {\n const { content } = req.body || {};\n if (!content || typeof content !== 'string' || !content.trim()) {\n res.status(400).json({ error: 'content is required' });\n return null;\n }\n return content;\n}\n\nfunction getParam(value: string | string[] | undefined): string {\n if (Array.isArray(value)) {\n return value[0] ?? '';\n }\n return value ?? '';\n}\n\nasync function readCurrentDocument(filePath: string): Promise<string | null> {\n if (!(await fileExists(filePath))) {\n return null;\n }\n return readFile(filePath, 'utf-8');\n}\n\nexport function createWriteRouter(projectsDir: string): Router {\n const router = Router();\n\n router.get('/api/templates/project', (_req: Request, res: Response) => {\n const content = renderProject({\n id: generateId(),\n slug: 'my-new-project',\n title: 'My New Project',\n timestamp: nowTimestamp(),\n });\n res.json({ content });\n });\n\n router.get('/api/templates/assignment', (_req: Request, res: Response) => {\n const content = renderAssignment({\n id: generateId(),\n slug: 'my-new-assignment',\n title: 'My New Assignment',\n timestamp: nowTimestamp(),\n priority: 'medium',\n dependsOn: [],\n links: [],\n });\n res.json({ content });\n });\n\n router.get('/api/projects/:slug/edit', async (req: Request, res: Response) => {\n const slug = getParam(req.params.slug);\n const document = await getEditableDocument(projectsDir, 'project', slug);\n if (!document) {\n res.status(404).json({ error: `Project \"${slug}\" not found` });\n return;\n }\n res.json(document);\n });\n\n router.get('/api/projects/:slug/assignments/:aslug/edit', async (req: Request, res: Response) => {\n const slug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const document = await getEditableDocument(\n projectsDir,\n 'assignment',\n slug,\n assignmentSlug,\n );\n if (!document) {\n res.status(404).json({ error: 'Assignment not found' });\n return;\n }\n res.json(document);\n });\n\n router.get('/api/projects/:slug/assignments/:aslug/plan/edit', async (req: Request, res: Response) => {\n const slug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const document = await getEditableDocument(\n projectsDir,\n 'plan',\n slug,\n assignmentSlug,\n );\n if (!document) {\n res.status(404).json({ error: 'Plan not found' });\n return;\n }\n res.json(document);\n });\n\n router.get('/api/projects/:slug/assignments/:aslug/scratchpad/edit', async (req: Request, res: Response) => {\n const slug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const document = await getEditableDocument(\n projectsDir,\n 'scratchpad',\n slug,\n assignmentSlug,\n );\n if (!document) {\n res.status(404).json({ error: 'Scratchpad not found' });\n return;\n }\n res.json(document);\n });\n\n router.get('/api/projects/:slug/assignments/:aslug/handoff/edit', async (req: Request, res: Response) => {\n const slug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const document = await getEditableDocument(\n projectsDir,\n 'handoff',\n slug,\n assignmentSlug,\n );\n if (!document) {\n res.status(404).json({ error: 'Handoff log not found' });\n return;\n }\n res.json(document);\n });\n\n router.get('/api/projects/:slug/assignments/:aslug/decision-record/edit', async (req: Request, res: Response) => {\n const slug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const document = await getEditableDocument(\n projectsDir,\n 'decision-record',\n slug,\n assignmentSlug,\n );\n if (!document) {\n res.status(404).json({ error: 'Decision record not found' });\n return;\n }\n res.json(document);\n });\n\n router.post('/api/projects', async (req: Request, res: Response) => {\n try {\n const content = requireContent(req, res);\n if (!content) {\n return;\n }\n\n const fields = extractFrontmatter(content);\n if (!fields) {\n res.status(400).json({ error: 'Invalid frontmatter: missing --- delimiters' });\n return;\n }\n\n const validation = validateRequired(fields, ['slug', 'title']);\n if (!validation.valid) {\n res.status(400).json({ error: `Missing required fields: ${validation.missing.join(', ')}` });\n return;\n }\n\n const slug = fields.slug;\n if (!isValidSlug(slug)) {\n res.status(400).json({ error: `Invalid slug \"${slug}\". Must be lowercase and hyphen-separated.` });\n return;\n }\n\n const projectDir = resolve(projectsDir, slug);\n if (await fileExists(projectDir)) {\n res.status(409).json({ error: `Project \"${slug}\" already exists` });\n return;\n }\n\n const title = fields.title;\n const timestamp = fields.created || nowTimestamp();\n\n await ensureDir(resolve(projectDir, 'assignments'));\n await ensureDir(resolve(projectDir, 'resources'));\n await ensureDir(resolve(projectDir, 'memories'));\n\n await writeFileForce(resolve(projectDir, 'project.md'), content);\n\n try {\n const companions: Array<[string, string]> = [\n [resolve(projectDir, 'manifest.md'), renderManifest({ slug, timestamp })],\n [resolve(projectDir, '_index-assignments.md'), renderIndexAssignments({ slug, title, timestamp })],\n [resolve(projectDir, '_index-plans.md'), renderIndexPlans({ slug, title, timestamp })],\n [resolve(projectDir, '_index-decisions.md'), renderIndexDecisions({ slug, title, timestamp })],\n [resolve(projectDir, '_status.md'), renderStatus({ slug, title, timestamp })],\n [resolve(projectDir, 'resources', '_index.md'), renderResourcesIndex({ slug, title, timestamp })],\n [resolve(projectDir, 'memories', '_index.md'), renderMemoriesIndex({ slug, title, timestamp })],\n ];\n\n for (const [filePath, fileContent] of companions) {\n await writeFileForce(filePath, fileContent);\n }\n } catch (companionError) {\n try {\n await rm(projectDir, { recursive: true, force: true });\n } catch {\n // Best effort cleanup only.\n }\n throw companionError;\n }\n\n res.status(201).json({ slug });\n } catch (error) {\n console.error('Error creating project:', error);\n res.status(500).json({ error: `Failed to create project: ${(error as Error).message}` });\n }\n });\n\n router.post('/api/projects/:slug/assignments', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const projectDir = resolve(projectsDir, projectSlug);\n const projectMdPath = resolve(projectDir, 'project.md');\n\n if (!(await fileExists(projectMdPath))) {\n res.status(404).json({ error: `Project \"${projectSlug}\" not found` });\n return;\n }\n\n const content = requireContent(req, res);\n if (!content) {\n return;\n }\n\n const fields = extractFrontmatter(content);\n if (!fields) {\n res.status(400).json({ error: 'Invalid frontmatter: missing --- delimiters' });\n return;\n }\n\n const validation = validateRequired(fields, ['slug', 'title']);\n if (!validation.valid) {\n res.status(400).json({ error: `Missing required fields: ${validation.missing.join(', ')}` });\n return;\n }\n\n const assignmentSlug = fields.slug;\n if (!isValidSlug(assignmentSlug)) {\n res.status(400).json({ error: `Invalid slug \"${assignmentSlug}\". Must be lowercase and hyphen-separated.` });\n return;\n }\n\n const validPriorities = ['low', 'medium', 'high', 'critical'];\n const priority = fields.priority || 'medium';\n if (!validPriorities.includes(priority)) {\n res.status(400).json({ error: `Invalid priority \"${priority}\". Must be low, medium, high, or critical.` });\n return;\n }\n\n const assignmentDir = resolve(projectDir, 'assignments', assignmentSlug);\n if (await fileExists(assignmentDir)) {\n res.status(409).json({\n error: `Assignment \"${assignmentSlug}\" already exists in project \"${projectSlug}\"`,\n });\n return;\n }\n\n const timestamp = fields.created || nowTimestamp();\n\n await ensureDir(assignmentDir);\n await writeFileForce(resolve(assignmentDir, 'assignment.md'), content);\n\n try {\n const companions: Array<[string, string]> = [\n [resolve(assignmentDir, 'scratchpad.md'), renderScratchpad({ assignmentSlug, timestamp })],\n [resolve(assignmentDir, 'handoff.md'), renderHandoff({ assignmentSlug, timestamp })],\n [resolve(assignmentDir, 'decision-record.md'), renderDecisionRecord({ assignmentSlug, timestamp })],\n ];\n\n for (const [filePath, fileContent] of companions) {\n await writeFileForce(filePath, fileContent);\n }\n } catch (companionError) {\n try {\n await rm(assignmentDir, { recursive: true, force: true });\n } catch {\n // Best effort cleanup only.\n }\n throw companionError;\n }\n\n res.status(201).json({ slug: assignmentSlug, projectSlug });\n } catch (error) {\n console.error('Error creating assignment:', error);\n res.status(500).json({ error: `Failed to create assignment: ${(error as Error).message}` });\n }\n });\n\n router.patch('/api/projects/:slug', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const projectPath = resolve(projectsDir, projectSlug, 'project.md');\n const currentContent = await readCurrentDocument(projectPath);\n if (!currentContent) {\n res.status(404).json({ error: `Project \"${projectSlug}\" not found` });\n return;\n }\n\n const nextContentRaw = requireContent(req, res);\n if (!nextContentRaw) {\n return;\n }\n\n const current = parseProject(currentContent);\n const next = parseProject(nextContentRaw);\n\n if (!next.slug || !next.title) {\n res.status(400).json({ error: 'Project content must include slug and title.' });\n return;\n }\n\n if (next.slug !== current.slug) {\n res.status(400).json({ error: 'Project slug cannot be changed once created.' });\n return;\n }\n\n const nextContent = setTopLevelField(nextContentRaw, 'updated', nowTimestamp());\n await writeFileForce(projectPath, nextContent);\n\n const project = await getProjectDetail(projectsDir, projectSlug);\n res.json({ project, content: nextContent });\n } catch (error) {\n console.error('Error updating project:', error);\n res.status(500).json({ error: `Failed to update project: ${(error as Error).message}` });\n }\n });\n\n router.patch('/api/projects/:slug/assignments/:aslug', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const assignmentPath = resolve(\n projectsDir,\n projectSlug,\n 'assignments',\n assignmentSlug,\n 'assignment.md',\n );\n const currentContent = await readCurrentDocument(assignmentPath);\n if (!currentContent) {\n res.status(404).json({ error: 'Assignment not found' });\n return;\n }\n\n const nextContentRaw = requireContent(req, res);\n if (!nextContentRaw) {\n return;\n }\n\n const current = parseAssignmentFull(currentContent);\n const next = parseAssignmentFull(nextContentRaw);\n\n if (!next.slug || !next.title) {\n res.status(400).json({ error: 'Assignment content must include slug and title.' });\n return;\n }\n\n if (next.slug !== current.slug) {\n res.status(400).json({ error: 'Assignment slug cannot be changed once created.' });\n return;\n }\n\n let nextContent = nextContentRaw;\n\n // Clear blockedReason when status moves away from blocked\n if (next.status !== current.status && current.status === 'blocked' && next.status !== 'blocked') {\n nextContent = setTopLevelField(nextContent, 'blockedReason', null);\n }\n\n nextContent = setTopLevelField(nextContent, 'updated', nowTimestamp());\n await writeFileForce(assignmentPath, nextContent);\n\n const assignment = await getAssignmentDetail(projectsDir, projectSlug, assignmentSlug);\n res.json({ assignment, content: nextContent });\n } catch (error) {\n console.error('Error updating assignment:', error);\n res.status(500).json({ error: `Failed to update assignment: ${(error as Error).message}` });\n }\n });\n\n router.patch('/api/projects/:slug/assignments/:aslug/acceptance-criteria/:index', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const assignmentPath = resolve(\n projectsDir,\n projectSlug,\n 'assignments',\n assignmentSlug,\n 'assignment.md',\n );\n const currentContent = await readCurrentDocument(assignmentPath);\n if (!currentContent) {\n res.status(404).json({ error: 'Assignment not found' });\n return;\n }\n\n const { checked } = req.body || {};\n if (typeof checked !== 'boolean') {\n res.status(400).json({ error: 'checked must be a boolean' });\n return;\n }\n\n const index = Number.parseInt(getParam(req.params.index), 10);\n const result = toggleAcceptanceCriterion(currentContent, index, checked);\n if ('error' in result) {\n res.status(400).json({ error: result.error });\n return;\n }\n\n const nextContent = setTopLevelField(result.content, 'updated', nowTimestamp());\n await writeFileForce(assignmentPath, nextContent);\n\n const assignment = await getAssignmentDetail(projectsDir, projectSlug, assignmentSlug);\n res.json({ assignment, content: nextContent });\n } catch (error) {\n console.error('Error toggling acceptance criterion:', error);\n res.status(500).json({ error: `Failed to toggle acceptance criterion: ${(error as Error).message}` });\n }\n });\n\n router.patch('/api/projects/:slug/assignments/:aslug/plan', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const planPath = resolve(\n projectsDir,\n projectSlug,\n 'assignments',\n assignmentSlug,\n 'plan.md',\n );\n const currentContent = await readCurrentDocument(planPath);\n if (!currentContent) {\n res.status(404).json({ error: 'Plan not found' });\n return;\n }\n\n const nextContentRaw = requireContent(req, res);\n if (!nextContentRaw) {\n return;\n }\n\n const next = parsePlan(nextContentRaw);\n if (!next.assignment) {\n res.status(400).json({ error: 'Plan content must include the assignment field.' });\n return;\n }\n\n if (next.assignment !== assignmentSlug) {\n res.status(400).json({ error: 'Plan assignment field must match the route assignment slug.' });\n return;\n }\n\n const nextContent = setTopLevelField(nextContentRaw, 'updated', nowTimestamp());\n await writeFileForce(planPath, nextContent);\n\n const assignment = await getAssignmentDetail(projectsDir, projectSlug, assignmentSlug);\n res.json({ assignment, content: nextContent });\n } catch (error) {\n console.error('Error updating plan:', error);\n res.status(500).json({ error: `Failed to update plan: ${(error as Error).message}` });\n }\n });\n\n router.patch('/api/projects/:slug/assignments/:aslug/scratchpad', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const scratchpadPath = resolve(\n projectsDir,\n projectSlug,\n 'assignments',\n assignmentSlug,\n 'scratchpad.md',\n );\n const currentContent = await readCurrentDocument(scratchpadPath);\n if (!currentContent) {\n res.status(404).json({ error: 'Scratchpad not found' });\n return;\n }\n\n const nextContentRaw = requireContent(req, res);\n if (!nextContentRaw) {\n return;\n }\n\n const next = parseScratchpad(nextContentRaw);\n if (!next.assignment) {\n res.status(400).json({ error: 'Scratchpad content must include the assignment field.' });\n return;\n }\n\n if (next.assignment !== assignmentSlug) {\n res.status(400).json({ error: 'Scratchpad assignment field must match the route assignment slug.' });\n return;\n }\n\n const nextContent = setTopLevelField(nextContentRaw, 'updated', nowTimestamp());\n await writeFileForce(scratchpadPath, nextContent);\n\n const assignment = await getAssignmentDetail(projectsDir, projectSlug, assignmentSlug);\n res.json({ assignment, content: nextContent });\n } catch (error) {\n console.error('Error updating scratchpad:', error);\n res.status(500).json({ error: `Failed to update scratchpad: ${(error as Error).message}` });\n }\n });\n\n router.post('/api/projects/:slug/assignments/:aslug/handoff/entries', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const handoffPath = resolve(\n projectsDir,\n projectSlug,\n 'assignments',\n assignmentSlug,\n 'handoff.md',\n );\n const currentContent = await readCurrentDocument(handoffPath);\n if (!currentContent) {\n res.status(404).json({ error: 'Handoff log not found' });\n return;\n }\n\n const { title, body } = req.body || {};\n if (!body || typeof body !== 'string' || !body.trim()) {\n res.status(400).json({ error: 'body is required' });\n return;\n }\n\n const parsed = parseHandoff(currentContent);\n const nextContent = appendLogEntry(\n currentContent,\n 'handoffCount',\n parsed.handoffCount + 1,\n title && typeof title === 'string' && title.trim() ? title.trim() : `Handoff ${parsed.handoffCount + 1}`,\n body,\n 'No handoffs recorded yet.',\n );\n\n await writeFileForce(handoffPath, nextContent);\n const assignment = await getAssignmentDetail(projectsDir, projectSlug, assignmentSlug);\n res.status(201).json({ assignment, content: nextContent });\n } catch (error) {\n console.error('Error appending handoff entry:', error);\n res.status(500).json({ error: `Failed to append handoff entry: ${(error as Error).message}` });\n }\n });\n\n router.post('/api/projects/:slug/assignments/:aslug/decision-record/entries', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const decisionPath = resolve(\n projectsDir,\n projectSlug,\n 'assignments',\n assignmentSlug,\n 'decision-record.md',\n );\n const currentContent = await readCurrentDocument(decisionPath);\n if (!currentContent) {\n res.status(404).json({ error: 'Decision record not found' });\n return;\n }\n\n const { title, body } = req.body || {};\n if (!body || typeof body !== 'string' || !body.trim()) {\n res.status(400).json({ error: 'body is required' });\n return;\n }\n\n const parsed = parseDecisionRecord(currentContent);\n const nextContent = appendLogEntry(\n currentContent,\n 'decisionCount',\n parsed.decisionCount + 1,\n title && typeof title === 'string' && title.trim() ? title.trim() : `Decision ${parsed.decisionCount + 1}`,\n body,\n 'No decisions recorded yet.',\n );\n\n await writeFileForce(decisionPath, nextContent);\n const assignment = await getAssignmentDetail(projectsDir, projectSlug, assignmentSlug);\n res.status(201).json({ assignment, content: nextContent });\n } catch (error) {\n console.error('Error appending decision entry:', error);\n res.status(500).json({ error: `Failed to append decision entry: ${(error as Error).message}` });\n }\n });\n\n // --- Move Workspace Endpoint ---\n\n router.post('/api/projects/:slug/move-workspace', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const projectPath = resolve(projectsDir, projectSlug, 'project.md');\n if (!(await fileExists(projectPath))) {\n res.status(404).json({ error: `Project \"${projectSlug}\" not found` });\n return;\n }\n\n const { workspace } = req.body || {};\n if (workspace !== null && (typeof workspace !== 'string' || !workspace.trim())) {\n res.status(400).json({ error: 'workspace must be a non-empty string or null (for ungrouped).' });\n return;\n }\n\n let content = await readFile(projectPath, 'utf-8');\n content = setTopLevelField(content, 'workspace', workspace ?? null);\n content = setTopLevelField(content, 'updated', nowTimestamp());\n await writeFileForce(projectPath, content);\n\n const project = await getProjectDetail(projectsDir, projectSlug);\n res.json({ project });\n } catch (error) {\n console.error('Error moving project workspace:', error);\n res.status(500).json({ error: `Failed to move workspace: ${(error as Error).message}` });\n }\n });\n\n // --- Status Override Endpoints ---\n\n router.post('/api/projects/:slug/status-override', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const projectPath = resolve(projectsDir, projectSlug, 'project.md');\n if (!(await fileExists(projectPath))) {\n res.status(404).json({ error: `Project \"${projectSlug}\" not found` });\n return;\n }\n\n const { status } = req.body || {};\n const config = await getStatusConfig();\n const validStatuses = ['active', 'archived', ...config.statuses.map((s) => s.id)];\n if (status !== null && (typeof status !== 'string' || !validStatuses.includes(status))) {\n res.status(400).json({ error: `Invalid status. Must be one of: ${validStatuses.join(', ')}, or null to clear.` });\n return;\n }\n\n let content = await readFile(projectPath, 'utf-8');\n content = setTopLevelField(content, 'statusOverride', status ?? null);\n content = setTopLevelField(content, 'updated', nowTimestamp());\n await writeFileForce(projectPath, content);\n\n const project = await getProjectDetail(projectsDir, projectSlug);\n res.json({ project });\n } catch (error) {\n console.error('Error setting project status override:', error);\n res.status(500).json({ error: `Failed to set status override: ${(error as Error).message}` });\n }\n });\n\n router.post('/api/projects/:slug/assignments/:aslug/status-override', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const assignmentPath = resolve(\n projectsDir,\n projectSlug,\n 'assignments',\n assignmentSlug,\n 'assignment.md',\n );\n if (!(await fileExists(assignmentPath))) {\n res.status(404).json({ error: 'Assignment not found' });\n return;\n }\n\n const { status } = req.body || {};\n const config = await getStatusConfig();\n const validStatuses = config.statuses.map((s) => s.id);\n if (typeof status !== 'string' || !validStatuses.includes(status)) {\n res.status(400).json({ error: `Invalid status. Must be one of: ${validStatuses.join(', ')}.` });\n return;\n }\n\n let content = await readFile(assignmentPath, 'utf-8');\n content = setTopLevelField(content, 'status', status);\n content = setTopLevelField(content, 'updated', nowTimestamp());\n\n // Clear blockedReason when moving away from blocked\n if (status !== 'blocked') {\n content = setTopLevelField(content, 'blockedReason', null);\n }\n\n await writeFileForce(assignmentPath, content);\n\n const assignment = await getAssignmentDetail(projectsDir, projectSlug, assignmentSlug);\n res.json({ assignment });\n } catch (error) {\n console.error('Error overriding assignment status:', error);\n res.status(500).json({ error: `Failed to override status: ${(error as Error).message}` });\n }\n });\n\n // --- Lifecycle Transitions ---\n\n router.post('/api/projects/:slug/assignments/:aslug/transitions/:command', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const command = req.params.command as Parameters<typeof executeTransition>[2];\n const config = await getStatusConfig();\n const validCommands = [...new Set(config.transitions.map((t) => t.command))];\n if (!validCommands.includes(command)) {\n res.status(400).json({ error: `Unsupported transition command \"${req.params.command}\"` });\n return;\n }\n\n const projectDir = resolve(projectsDir, projectSlug);\n const assignmentPath = resolve(projectDir, 'assignments', assignmentSlug, 'assignment.md');\n if (!(await fileExists(assignmentPath))) {\n res.status(404).json({ error: 'Assignment not found' });\n return;\n }\n\n const { reason } = req.body || {};\n const result = await executeTransition(projectDir, assignmentSlug, command, {\n reason: typeof reason === 'string' ? reason : undefined,\n transitionTable: config.custom ? config.transitionTable : undefined,\n terminalStatuses: config.custom ? config.terminalStatuses : undefined,\n });\n\n if (!result.success) {\n res.status(400).json({ error: result.message });\n return;\n }\n\n const assignment = await getAssignmentDetail(projectsDir, projectSlug, assignmentSlug);\n res.json({ assignment, transition: result });\n } catch (error) {\n console.error('Error running assignment transition:', error);\n res.status(500).json({ error: `Failed to transition assignment: ${(error as Error).message}` });\n }\n });\n\n router.delete('/api/projects/:slug/assignments/:aslug', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const assignmentDir = resolve(projectsDir, projectSlug, 'assignments', assignmentSlug);\n const assignmentPath = resolve(assignmentDir, 'assignment.md');\n\n if (!(await fileExists(assignmentPath))) {\n res.status(404).json({ error: `Assignment \"${assignmentSlug}\" not found in project \"${projectSlug}\"` });\n return;\n }\n\n await rm(assignmentDir, { recursive: true, force: true });\n res.json({ deleted: assignmentSlug, projectSlug });\n } catch (error) {\n console.error('Error deleting assignment:', error);\n res.status(500).json({ error: `Failed to delete assignment: ${(error as Error).message}` });\n }\n });\n\n return router;\n}\n","export interface ToggleAcceptanceCriterionResult {\n content: string;\n}\n\nexport interface ToggleAcceptanceCriterionError {\n error: string;\n}\n\nfunction splitFrontmatter(content: string): { prefix: string; body: string } {\n const match = content.match(/^(---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?)([\\s\\S]*)$/);\n if (!match) {\n return { prefix: '', body: content };\n }\n\n return {\n prefix: match[1],\n body: match[2],\n };\n}\n\nexport function toggleAcceptanceCriterion(\n content: string,\n index: number,\n checked: boolean,\n): ToggleAcceptanceCriterionResult | ToggleAcceptanceCriterionError {\n if (!Number.isInteger(index) || index < 0) {\n return { error: 'acceptance criteria index must be a non-negative integer' };\n }\n\n const { prefix, body } = splitFrontmatter(content);\n const lines = body.split('\\n');\n const sectionStart = lines.findIndex((line) => /^##\\s+Acceptance Criteria\\s*$/i.test(line.trim()));\n\n if (sectionStart === -1) {\n return { error: 'Acceptance Criteria section not found.' };\n }\n\n let sectionEnd = lines.length;\n for (let lineIndex = sectionStart + 1; lineIndex < lines.length; lineIndex += 1) {\n if (/^#{1,2}\\s+\\S/.test(lines[lineIndex].trim())) {\n sectionEnd = lineIndex;\n break;\n }\n }\n\n const checklistLines = lines\n .map((line, lineIndex) => ({ line, lineIndex }))\n .filter(({ lineIndex, line }) =>\n lineIndex > sectionStart\n && lineIndex < sectionEnd\n && /^\\s*[-*]\\s+\\[( |x|X)\\]\\s+.*$/.test(line),\n );\n\n const target = checklistLines[index];\n if (!target) {\n return { error: `Acceptance criteria item ${index} not found.` };\n }\n\n const nextLine = target.line.replace(\n /^(\\s*[-*]\\s+\\[)( |x|X)(\\]\\s+.*)$/,\n `$1${checked ? 'x' : ' '}$3`,\n );\n\n lines[target.lineIndex] = nextLine;\n return {\n content: `${prefix}${lines.join('\\n')}`,\n };\n}\n","import { Router } from 'express';\nimport {\n registerSession,\n removeSession,\n listSessionFiles,\n readSessionFile,\n updateLastRefreshed,\n setOverride,\n sanitizeSessionName,\n} from './servers.js';\nimport {\n scanAllSessions,\n scanSingleSession,\n clearScanCache,\n} from './scanner.js';\n\nexport function createServersRouter(serversDir: string, projectsDir: string): Router {\n const router = Router();\n\n // GET /api/servers — all sessions with cached scan data\n router.get('/', async (_req, res) => {\n try {\n const result = await scanAllSessions(serversDir, projectsDir);\n res.json(result);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Scan failed' });\n }\n });\n\n // GET /api/servers/:name — single session\n router.get('/:name', async (req, res) => {\n try {\n const session = await scanSingleSession(serversDir, projectsDir, req.params.name);\n if (!session) {\n res.status(404).json({ error: 'Session not found' });\n return;\n }\n res.json(session);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Scan failed' });\n }\n });\n\n // POST /api/servers — register a new session\n router.post('/', async (req, res) => {\n try {\n const { name } = req.body;\n if (!name || typeof name !== 'string') {\n res.status(400).json({ error: 'name is required' });\n return;\n }\n const sanitized = sanitizeSessionName(name);\n const existing = await readSessionFile(serversDir, sanitized);\n if (existing) {\n res.status(409).json({ error: `Session \"${sanitized}\" already registered` });\n return;\n }\n await registerSession(serversDir, name);\n clearScanCache();\n res.status(201).json({ name: sanitized });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Registration failed' });\n }\n });\n\n // DELETE /api/servers/:name — unregister\n router.delete('/:name', async (req, res) => {\n try {\n const data = await readSessionFile(serversDir, req.params.name);\n if (!data) {\n res.status(404).json({ error: 'Session not found' });\n return;\n }\n await removeSession(serversDir, req.params.name);\n clearScanCache();\n res.json({ removed: req.params.name });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Removal failed' });\n }\n });\n\n // POST /api/servers/refresh — fresh scan all (must be before /:name/refresh)\n router.post('/refresh', async (_req, res) => {\n try {\n const names = await listSessionFiles(serversDir);\n for (const name of names) {\n await updateLastRefreshed(serversDir, name);\n }\n clearScanCache();\n const result = await scanAllSessions(serversDir, projectsDir, { bypassCache: true });\n res.json(result);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Refresh failed' });\n }\n });\n\n // POST /api/servers/:name/refresh — fresh scan one\n router.post('/:name/refresh', async (req, res) => {\n try {\n const data = await readSessionFile(serversDir, req.params.name);\n if (!data) {\n res.status(404).json({ error: 'Session not found' });\n return;\n }\n await updateLastRefreshed(serversDir, req.params.name);\n clearScanCache();\n const session = await scanSingleSession(serversDir, projectsDir, req.params.name);\n res.json(session);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Refresh failed' });\n }\n });\n\n // PATCH /api/servers/:name/panes/:windowIndex/:paneIndex/assignment — manual link\n router.patch('/:name/panes/:windowIndex/:paneIndex/assignment', async (req, res) => {\n try {\n const { name, windowIndex, paneIndex } = req.params;\n const data = await readSessionFile(serversDir, name);\n if (!data) {\n res.status(404).json({ error: 'Session not found' });\n return;\n }\n const body = req.body;\n if (body === null || (body && body.project && body.assignment)) {\n await setOverride(\n serversDir,\n name,\n parseInt(windowIndex, 10),\n parseInt(paneIndex, 10),\n body,\n );\n clearScanCache();\n res.json({ updated: true });\n } else {\n res.status(400).json({ error: 'Body must be { project, assignment } or null' });\n }\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Update failed' });\n }\n });\n\n return router;\n}\n","import { Router } from 'express';\nimport { resolve } from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport {\n listAllSessions,\n listProjectSessions,\n appendSession,\n updateSessionStatus,\n deleteSessions,\n reconcileActiveSessions,\n} from './agent-sessions.js';\nimport { fileExists } from '../utils/fs.js';\nimport type { AgentSessionStatus, WsMessage } from './types.js';\n\nexport function createAgentSessionsRouter(\n projectsDir: string,\n broadcast?: (msg: WsMessage) => void,\n): Router {\n const router = Router();\n\n // GET /api/agent-sessions — all sessions across all projects\n router.get('/', async (_req, res) => {\n try {\n await reconcileActiveSessions(projectsDir);\n const sessions = await listAllSessions(projectsDir);\n res.json({ sessions, generatedAt: new Date().toISOString() });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to list sessions' });\n }\n });\n\n // GET /api/agent-sessions/:projectSlug — sessions for one project\n router.get('/:projectSlug', async (req, res) => {\n try {\n const { projectSlug } = req.params;\n const assignment = req.query.assignment as string | undefined;\n const projectDir = resolve(projectsDir, projectSlug);\n if (!(await fileExists(projectDir))) {\n res.status(404).json({ error: `Project \"${projectSlug}\" not found` });\n return;\n }\n await reconcileActiveSessions(projectsDir);\n const sessions = await listProjectSessions(projectsDir, projectSlug, assignment);\n res.json({ sessions, generatedAt: new Date().toISOString() });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to list sessions' });\n }\n });\n\n // POST /api/agent-sessions — register a new session\n router.post('/', async (req, res) => {\n try {\n const { projectSlug, assignmentSlug, agent, sessionId, path, description } = req.body;\n\n if (!agent) {\n res.status(400).json({ error: 'agent is required' });\n return;\n }\n\n if (projectSlug) {\n const projectDir = resolve(projectsDir, projectSlug);\n if (!(await fileExists(projectDir))) {\n res.status(404).json({ error: `Project \"${projectSlug}\" not found` });\n return;\n }\n }\n\n const id = sessionId || randomUUID();\n const session = {\n projectSlug: projectSlug || null,\n assignmentSlug: assignmentSlug || null,\n agent,\n sessionId: id,\n started: new Date().toISOString(),\n status: 'active' as AgentSessionStatus,\n path: path || '',\n description: description || null,\n };\n\n await appendSession('', session);\n broadcast?.({ type: 'agent-sessions-updated', timestamp: new Date().toISOString() });\n res.status(201).json({ sessionId: id });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Registration failed' });\n }\n });\n\n // PATCH /api/agent-sessions/:sessionId/status — update session status\n router.patch('/:sessionId/status', async (req, res) => {\n try {\n const { sessionId } = req.params;\n const { status } = req.body;\n\n if (!status) {\n res.status(400).json({ error: 'status is required' });\n return;\n }\n\n if (!['active', 'completed', 'stopped'].includes(status)) {\n res.status(400).json({ error: 'status must be active, completed, or stopped' });\n return;\n }\n\n const updated = await updateSessionStatus('', sessionId, status);\n if (!updated) {\n res.status(404).json({ error: `Session \"${sessionId}\" not found` });\n return;\n }\n\n broadcast?.({ type: 'agent-sessions-updated', timestamp: new Date().toISOString() });\n res.json({ updated: true });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Update failed' });\n }\n });\n\n // DELETE /api/agent-sessions — delete one or more sessions\n router.delete('/', async (req, res) => {\n try {\n const { sessionIds } = req.body;\n\n if (!Array.isArray(sessionIds) || sessionIds.length === 0) {\n res.status(400).json({ error: 'sessionIds must be a non-empty array' });\n return;\n }\n\n const deleted = await deleteSessions(sessionIds);\n broadcast?.({ type: 'agent-sessions-updated', timestamp: new Date().toISOString() });\n res.json({ deleted });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Delete failed' });\n }\n });\n\n return router;\n}\n","import { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { fileExists } from '../utils/fs.js';\nimport { getSessionDb } from './session-db.js';\nimport type { AgentSession, AgentSessionStatus } from './types.js';\n\ninterface SessionRow {\n session_id: string;\n project_slug: string | null;\n assignment_slug: string | null;\n agent: string;\n started: string;\n ended: string | null;\n status: string;\n path: string | null;\n description: string | null;\n}\n\nfunction rowToSession(row: SessionRow): AgentSession {\n return {\n sessionId: row.session_id,\n projectSlug: row.project_slug ?? null,\n assignmentSlug: row.assignment_slug ?? null,\n agent: row.agent,\n started: row.started,\n ended: row.ended ?? null,\n status: row.status as AgentSessionStatus,\n path: row.path ?? '',\n description: row.description ?? null,\n };\n}\n\n/**\n * Query sessions for a specific project.\n */\nexport async function parseSessionsIndex(\n _projectDir: string,\n projectSlug: string,\n): Promise<AgentSession[]> {\n const db = getSessionDb();\n const rows = db\n .prepare('SELECT * FROM sessions WHERE project_slug = ? ORDER BY started DESC')\n .all(projectSlug) as SessionRow[];\n return rows.map(rowToSession);\n}\n\n/**\n * Insert a new session into the database.\n */\nexport async function appendSession(\n _projectDir: string,\n session: AgentSession,\n): Promise<void> {\n const db = getSessionDb();\n db.prepare(`\n INSERT INTO sessions (session_id, project_slug, assignment_slug, agent, started, status, path, description)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `).run(\n session.sessionId,\n session.projectSlug ?? null,\n session.assignmentSlug ?? null,\n session.agent,\n session.started,\n session.status,\n session.path,\n session.description ?? null,\n );\n}\n\n/**\n * Update a session's status by sessionId.\n * Sets `ended` timestamp for terminal statuses (completed, stopped).\n */\nexport async function updateSessionStatus(\n _projectDir: string,\n sessionId: string,\n status: AgentSessionStatus,\n): Promise<boolean> {\n const db = getSessionDb();\n const isTerminal = status === 'completed' || status === 'stopped';\n\n const result = isTerminal\n ? db\n .prepare(\n 'UPDATE sessions SET status = ?, ended = datetime(\\'now\\'), updated_at = datetime(\\'now\\') WHERE session_id = ?',\n )\n .run(status, sessionId)\n : db\n .prepare(\n 'UPDATE sessions SET status = ?, updated_at = datetime(\\'now\\') WHERE session_id = ?',\n )\n .run(status, sessionId);\n\n return result.changes > 0;\n}\n\n/**\n * List all sessions across all projects.\n */\nexport async function listAllSessions(_projectsDir: string): Promise<AgentSession[]> {\n const db = getSessionDb();\n const rows = db\n .prepare('SELECT * FROM sessions ORDER BY started DESC')\n .all() as SessionRow[];\n return rows.map(rowToSession);\n}\n\n/**\n * List sessions for a specific project, optionally filtered by assignment.\n */\nexport async function listProjectSessions(\n _projectsDir: string,\n projectSlug: string,\n assignmentSlug?: string,\n): Promise<AgentSession[]> {\n const db = getSessionDb();\n\n if (assignmentSlug) {\n const rows = db\n .prepare(\n 'SELECT * FROM sessions WHERE project_slug = ? AND assignment_slug = ? ORDER BY started DESC',\n )\n .all(projectSlug, assignmentSlug) as SessionRow[];\n return rows.map(rowToSession);\n }\n\n const rows = db\n .prepare('SELECT * FROM sessions WHERE project_slug = ? ORDER BY started DESC')\n .all(projectSlug) as SessionRow[];\n return rows.map(rowToSession);\n}\n\n/**\n * Delete sessions by their IDs. Returns the number of rows deleted.\n */\nexport async function deleteSessions(sessionIds: string[]): Promise<number> {\n if (sessionIds.length === 0) return 0;\n const db = getSessionDb();\n const placeholders = sessionIds.map(() => '?').join(', ');\n const result = db\n .prepare(`DELETE FROM sessions WHERE session_id IN (${placeholders})`)\n .run(...sessionIds);\n return result.changes;\n}\n\n// Statuses that imply the working session is done (review means agent finished)\nconst DONE_ASSIGNMENT_STATUSES = new Set(['completed', 'failed', 'review']);\n\n/**\n * Read the status field from an assignment.md frontmatter without full parsing.\n */\nasync function readAssignmentStatus(\n projectDir: string,\n assignmentSlug: string,\n): Promise<string | null> {\n const assignmentPath = resolve(projectDir, 'assignments', assignmentSlug, 'assignment.md');\n if (!(await fileExists(assignmentPath))) return null;\n\n const raw = await readFile(assignmentPath, 'utf-8');\n const match = raw.match(/^status:\\s*(.+)$/m);\n return match ? match[1].trim() : null;\n}\n\n/**\n * Reconcile active sessions against assignment statuses.\n * Sessions whose assignments have moved to completed/failed/review are\n * marked as completed (or stopped for failed assignments).\n * Returns the number of sessions that were updated.\n */\nexport async function reconcileActiveSessions(\n projectsDir: string,\n): Promise<number> {\n const db = getSessionDb();\n\n // Get active sessions that are linked to a project/assignment (standalone sessions have nothing to reconcile)\n const activeSessions = db\n .prepare('SELECT * FROM sessions WHERE status = \\'active\\' AND project_slug IS NOT NULL AND assignment_slug IS NOT NULL')\n .all() as SessionRow[];\n\n if (activeSessions.length === 0) return 0;\n\n // Dedupe assignment slugs per project for status checks\n // project_slug and assignment_slug are guaranteed non-null by the query filter above\n const toCheck = new Map<string, Set<string>>();\n for (const session of activeSessions) {\n const slugs = toCheck.get(session.project_slug!) ?? new Set();\n slugs.add(session.assignment_slug!);\n toCheck.set(session.project_slug!, slugs);\n }\n\n // Read assignment statuses from disk\n const assignmentStatuses = new Map<string, string>();\n for (const [projectSlug, slugs] of toCheck) {\n const projectDir = resolve(projectsDir, projectSlug);\n for (const slug of slugs) {\n const status = await readAssignmentStatus(projectDir, slug);\n if (status) assignmentStatuses.set(`${projectSlug}/${slug}`, status);\n }\n }\n\n // Update stale sessions\n let totalUpdated = 0;\n for (const session of activeSessions) {\n const key = `${session.project_slug}/${session.assignment_slug}`;\n const assignmentStatus = assignmentStatuses.get(key);\n if (!assignmentStatus || !DONE_ASSIGNMENT_STATUSES.has(assignmentStatus)) continue;\n\n const newStatus: AgentSessionStatus =\n assignmentStatus === 'failed' ? 'stopped' : 'completed';\n await updateSessionStatus('', session.session_id, newStatus);\n totalUpdated++;\n }\n\n return totalUpdated;\n}\n","import Database from 'better-sqlite3';\nimport { resolve } from 'node:path';\nimport { readdir } from 'node:fs/promises';\nimport { syntaurRoot } from '../utils/paths.js';\nimport { fileExists } from '../utils/fs.js';\nimport type { AgentSession, AgentSessionStatus } from './types.js';\n\nlet db: Database.Database | null = null;\n\nconst SCHEMA_VERSION = '2';\n\nconst SCHEMA_SQL = `\nCREATE TABLE IF NOT EXISTS sessions (\n session_id TEXT PRIMARY KEY,\n project_slug TEXT,\n assignment_slug TEXT,\n agent TEXT NOT NULL,\n started TEXT NOT NULL,\n ended TEXT,\n status TEXT NOT NULL DEFAULT 'active',\n path TEXT,\n description TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\nCREATE INDEX IF NOT EXISTS idx_sessions_project ON sessions(project_slug);\nCREATE INDEX IF NOT EXISTS idx_sessions_assignment ON sessions(project_slug, assignment_slug);\nCREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status);\nCREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value TEXT);\n`;\n\n/**\n * Initialize the SQLite database for session tracking.\n * Creates the database file and schema if they don't exist.\n * @param dbPath Optional override for the database file path (used in tests).\n */\nexport function initSessionDb(dbPath?: string): Database.Database {\n if (db) return db;\n\n const finalPath = dbPath ?? resolve(syntaurRoot(), 'syntaur.db');\n db = new Database(finalPath);\n db.pragma('journal_mode = WAL');\n db.exec(SCHEMA_SQL);\n\n // Track schema version\n db.prepare('INSERT OR IGNORE INTO meta (key, value) VALUES (?, ?)').run(\n 'schema_version',\n SCHEMA_VERSION,\n );\n\n // Migrate from v1 to v2: make project/assignment nullable, add description\n const currentVersion = db\n .prepare(\"SELECT value FROM meta WHERE key = 'schema_version'\")\n .get() as { value: string } | undefined;\n\n if (currentVersion?.value === '1') {\n db.exec(`\n CREATE TABLE sessions_v2 (\n session_id TEXT PRIMARY KEY,\n project_slug TEXT,\n assignment_slug TEXT,\n agent TEXT NOT NULL,\n started TEXT NOT NULL,\n ended TEXT,\n status TEXT NOT NULL DEFAULT 'active',\n path TEXT,\n description TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n INSERT INTO sessions_v2 SELECT session_id, project_slug, assignment_slug, agent, started, ended, status, path, NULL, created_at, updated_at FROM sessions;\n DROP TABLE sessions;\n ALTER TABLE sessions_v2 RENAME TO sessions;\n CREATE INDEX IF NOT EXISTS idx_sessions_project ON sessions(project_slug);\n CREATE INDEX IF NOT EXISTS idx_sessions_assignment ON sessions(project_slug, assignment_slug);\n CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status);\n UPDATE meta SET value = '2' WHERE key = 'schema_version';\n `);\n }\n\n return db;\n}\n\n/**\n * Get the initialized database handle.\n * Throws if initSessionDb() has not been called.\n */\nexport function getSessionDb(): Database.Database {\n if (!db) {\n throw new Error(\n 'Session database not initialized. Call initSessionDb() first.',\n );\n }\n return db;\n}\n\n/**\n * Close the database connection.\n */\nexport function closeSessionDb(): void {\n if (db) {\n db.close();\n db = null;\n }\n}\n\n/**\n * Reset the singleton for testing purposes.\n */\nexport function resetSessionDb(): void {\n db = null;\n}\n\n/**\n * One-time migration: import sessions from markdown _index-sessions.md files into SQLite.\n * Only runs if the sessions table is empty and markdown files exist.\n */\nexport async function migrateFromMarkdown(projectsDir: string): Promise<number> {\n const database = getSessionDb();\n\n // Skip if sessions already exist in the database\n const count = database.prepare('SELECT COUNT(*) as count FROM sessions').get() as { count: number };\n if (count.count > 0) return 0;\n\n if (!(await fileExists(projectsDir))) return 0;\n\n const entries = await readdir(projectsDir, { withFileTypes: true });\n const allSessions: AgentSession[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const projectDir = resolve(projectsDir, entry.name);\n const indexPath = resolve(projectDir, '_index-sessions.md');\n if (!(await fileExists(indexPath))) continue;\n\n const sessions = await parseMarkdownSessionsIndex(indexPath, entry.name);\n allSessions.push(...sessions);\n }\n\n if (allSessions.length === 0) return 0;\n\n const insert = database.prepare(`\n INSERT OR IGNORE INTO sessions (session_id, project_slug, assignment_slug, agent, started, status, path)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `);\n\n const insertAll = database.transaction((sessions: AgentSession[]) => {\n for (const s of sessions) {\n insert.run(s.sessionId, s.projectSlug, s.assignmentSlug, s.agent, s.started, s.status, s.path);\n }\n });\n\n insertAll(allSessions);\n console.log(`Migrated ${allSessions.length} sessions from markdown to SQLite.`);\n return allSessions.length;\n}\n\n/**\n * Parse an _index-sessions.md file into AgentSession objects.\n * Used only for one-time migration. This is a copy of the old parsing logic.\n */\nasync function parseMarkdownSessionsIndex(\n filePath: string,\n projectSlug: string,\n): Promise<AgentSession[]> {\n const { readFile } = await import('node:fs/promises');\n const raw = await readFile(filePath, 'utf-8');\n const sessions: AgentSession[] = [];\n\n const lines = raw.split('\\n');\n let inTable = false;\n let headerSeen = false;\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n if (trimmed.startsWith('| Assignment') || trimmed.startsWith('|Assignment')) {\n inTable = true;\n headerSeen = false;\n continue;\n }\n\n if (inTable && !headerSeen && trimmed.match(/^\\|[-\\s|]+\\|$/)) {\n headerSeen = true;\n continue;\n }\n\n if (inTable && headerSeen && trimmed.startsWith('|')) {\n const cells = trimmed\n .split('|')\n .slice(1, -1)\n .map((c) => c.trim());\n\n if (cells.length >= 6) {\n sessions.push({\n assignmentSlug: cells[0],\n agent: cells[1],\n sessionId: cells[2],\n started: cells[3],\n status: (cells[4] as AgentSessionStatus) || 'active',\n path: cells[5],\n projectSlug,\n });\n }\n }\n }\n\n return sessions;\n}\n","import { Router } from 'express';\nimport { resolve } from 'node:path';\nimport { readFile, unlink } from 'node:fs/promises';\nimport { listPlaybooks, getPlaybookDetail } from './api.js';\nimport { parsePlaybook } from './parser.js';\nimport { isValidSlug } from '../utils/slug.js';\nimport { nowTimestamp } from '../utils/timestamp.js';\nimport { ensureDir, fileExists, writeFileForce } from '../utils/fs.js';\nimport { renderPlaybook } from '../templates/playbook.js';\nimport { rebuildPlaybookManifest } from '../utils/playbooks.js';\n\nexport function createPlaybooksRouter(playbooksDir: string): Router {\n const router = Router();\n\n // GET / — list all playbooks\n router.get('/', async (_req, res) => {\n try {\n const playbooks = await listPlaybooks(playbooksDir);\n res.json({ playbooks, generatedAt: new Date().toISOString() });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to list playbooks' });\n }\n });\n\n // GET /template/new — scaffold template (must be before /:slug to avoid param capture)\n router.get('/template/new', async (_req, res) => {\n try {\n const content = renderPlaybook({\n slug: 'my-playbook',\n name: 'My Playbook',\n description: 'A new playbook',\n timestamp: nowTimestamp(),\n });\n res.json({ content });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to get template' });\n }\n });\n\n // GET /:slug — get playbook detail\n router.get('/:slug', async (req, res) => {\n try {\n const detail = await getPlaybookDetail(playbooksDir, req.params.slug);\n if (!detail) {\n res.status(404).json({ error: `Playbook \"${req.params.slug}\" not found` });\n return;\n }\n res.json(detail);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to get playbook' });\n }\n });\n\n // GET /:slug/edit — raw file content for editor\n router.get('/:slug/edit', async (req, res) => {\n try {\n const filePath = resolve(playbooksDir, `${req.params.slug}.md`);\n if (!(await fileExists(filePath))) {\n res.status(404).json({ error: `Playbook \"${req.params.slug}\" not found` });\n return;\n }\n const content = await readFile(filePath, 'utf-8');\n res.json({\n documentType: 'playbook',\n title: `Edit Playbook: ${req.params.slug}`,\n content,\n slug: req.params.slug,\n });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to get playbook for editing' });\n }\n });\n\n // POST / — create new playbook\n router.post('/', async (req, res) => {\n try {\n const { content } = req.body;\n if (!content || typeof content !== 'string') {\n res.status(400).json({ error: 'content is required' });\n return;\n }\n\n const parsed = parsePlaybook(content);\n const slug = parsed.slug;\n if (!slug || !isValidSlug(slug)) {\n res.status(400).json({ error: `Invalid or missing slug: \"${slug}\"` });\n return;\n }\n\n await ensureDir(playbooksDir);\n const filePath = resolve(playbooksDir, `${slug}.md`);\n if (await fileExists(filePath)) {\n res.status(409).json({ error: `Playbook \"${slug}\" already exists` });\n return;\n }\n\n await writeFileForce(filePath, content);\n await rebuildPlaybookManifest(playbooksDir);\n res.status(201).json({ slug, path: filePath });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to create playbook' });\n }\n });\n\n // PUT /:slug — update playbook content\n router.put('/:slug', async (req, res) => {\n try {\n const { content } = req.body;\n if (!content || typeof content !== 'string') {\n res.status(400).json({ error: 'content is required' });\n return;\n }\n\n const filePath = resolve(playbooksDir, `${req.params.slug}.md`);\n if (!(await fileExists(filePath))) {\n res.status(404).json({ error: `Playbook \"${req.params.slug}\" not found` });\n return;\n }\n\n await writeFileForce(filePath, content);\n await rebuildPlaybookManifest(playbooksDir);\n res.json({ slug: req.params.slug, path: filePath });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to update playbook' });\n }\n });\n\n // DELETE /:slug — delete a playbook\n router.delete('/:slug', async (req, res) => {\n try {\n if (req.params.slug === 'manifest') {\n res.status(403).json({ error: 'The playbook manifest cannot be deleted' });\n return;\n }\n\n const filePath = resolve(playbooksDir, `${req.params.slug}.md`);\n if (!(await fileExists(filePath))) {\n res.status(404).json({ error: `Playbook \"${req.params.slug}\" not found` });\n return;\n }\n\n await unlink(filePath);\n await rebuildPlaybookManifest(playbooksDir);\n res.json({ deleted: req.params.slug });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to delete playbook' });\n }\n });\n\n return router;\n}\n","import { Router, type Request, type Response, type NextFunction } from 'express';\nimport { readdir } from 'node:fs/promises';\nimport {\n readChecklist,\n writeChecklist,\n readLog,\n appendLogEntry,\n generateUniqueId,\n computeCounts,\n} from '../todos/parser.js';\nimport { ensureDir, fileExists } from '../utils/fs.js';\nimport type { TodoItem, LogEntry } from '../todos/types.js';\nimport type { WsMessage } from './types.js';\n\nconst WORKSPACE_REGEX = /^[a-z0-9_][a-z0-9-]*$/;\n\nfunction getWorkspaceParam(value: string | string[] | undefined): string {\n if (Array.isArray(value)) {\n return value[0] ?? '';\n }\n return value ?? '';\n}\n\n// Per-workspace write lock to prevent concurrent read-modify-write races\nconst writeLocks = new Map<string, Promise<void>>();\nfunction withLock<T>(workspace: string, fn: () => Promise<T>): Promise<T> {\n const prev = writeLocks.get(workspace) ?? Promise.resolve();\n const next = prev.then(fn);\n writeLocks.set(workspace, next.then(() => {}, () => {}));\n return next;\n}\n\nexport function createTodosRouter(\n todosDir: string,\n broadcast: (msg: WsMessage) => void,\n): Router {\n const router = Router();\n\n function broadcastUpdate(): void {\n broadcast({ type: 'todos-updated', timestamp: new Date().toISOString() });\n }\n\n // Validate workspace name on all routes that use :workspace\n function validateWorkspace(req: Request, res: Response, next: NextFunction): void {\n const workspace = getWorkspaceParam(req.params.workspace);\n if (workspace && !WORKSPACE_REGEX.test(workspace)) {\n res.status(400).json({ error: `Invalid workspace name: \"${workspace}\". Use lowercase letters, numbers, hyphens, and underscores.` });\n return;\n }\n next();\n }\n\n // Apply workspace validation to all parameterized routes\n router.param('workspace', validateWorkspace as any);\n\n // GET / — aggregate all workspace checklists\n router.get('/', async (_req, res) => {\n try {\n await ensureDir(todosDir);\n const files = await readdir(todosDir).catch(() => []);\n const workspaces: Array<{\n workspace: string;\n archiveInterval: string;\n items: TodoItem[];\n counts: ReturnType<typeof computeCounts>;\n }> = [];\n\n for (const file of files) {\n if (typeof file !== 'string') continue;\n if (!file.endsWith('.md') || file.endsWith('-log.md')) continue;\n const workspace = file.replace('.md', '');\n const checklist = await readChecklist(todosDir, workspace);\n workspaces.push({\n workspace: checklist.workspace,\n archiveInterval: checklist.archiveInterval,\n items: checklist.items,\n counts: computeCounts(checklist.items),\n });\n }\n\n res.json({ workspaces });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to list todos' });\n }\n });\n\n // GET /:workspace — list items for one workspace\n router.get('/:workspace', async (req, res) => {\n try {\n const workspace = getWorkspaceParam(req.params.workspace);\n const checklist = await readChecklist(todosDir, workspace);\n res.json({\n workspace: checklist.workspace,\n archiveInterval: checklist.archiveInterval,\n items: checklist.items,\n counts: computeCounts(checklist.items),\n });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to get todos' });\n }\n });\n\n // POST /:workspace — add item\n router.post('/:workspace', async (req, res) => {\n try {\n const workspace = getWorkspaceParam(req.params.workspace);\n const { description, tags } = req.body;\n if (!description || typeof description !== 'string') {\n res.status(400).json({ error: 'description is required' });\n return;\n }\n\n const item = await withLock(workspace, async () => {\n const checklist = await readChecklist(todosDir, workspace);\n const existingIds = new Set(checklist.items.map((i) => i.id));\n const id = generateUniqueId(existingIds);\n\n const newItem: TodoItem = {\n id,\n description,\n status: 'open',\n tags: Array.isArray(tags) ? tags : [],\n session: null,\n };\n checklist.items.push(newItem);\n await writeChecklist(todosDir, checklist);\n return newItem;\n });\n broadcastUpdate();\n res.status(201).json(item);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to add todo' });\n }\n });\n\n // POST /:workspace/reorder — reorder items\n // Must be before /:workspace/:id to avoid param capture\n router.post('/:workspace/reorder', async (req, res) => {\n try {\n const workspace = getWorkspaceParam(req.params.workspace);\n const { ids } = req.body;\n if (!Array.isArray(ids) || !ids.every((id: unknown) => typeof id === 'string')) {\n res.status(400).json({ error: 'ids must be an array of strings' });\n return;\n }\n\n const items = await withLock(workspace, async () => {\n const checklist = await readChecklist(todosDir, workspace);\n const itemMap = new Map(checklist.items.map((i) => [i.id, i]));\n\n // Build reordered list: requested order first, then any items not in the ids array\n const reordered: TodoItem[] = [];\n for (const id of ids) {\n const item = itemMap.get(id);\n if (item) {\n reordered.push(item);\n itemMap.delete(id);\n }\n }\n // Append any remaining items not mentioned in ids\n for (const item of itemMap.values()) {\n reordered.push(item);\n }\n\n checklist.items = reordered;\n await writeChecklist(todosDir, checklist);\n return reordered;\n });\n broadcastUpdate();\n res.json({ items });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to reorder todos' });\n }\n });\n\n // GET /:workspace/log — full log\n // Must be before /:workspace/:id to avoid param capture\n router.get('/:workspace/log', async (req, res) => {\n try {\n const log = await readLog(todosDir, getWorkspaceParam(req.params.workspace));\n res.json(log);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to get log' });\n }\n });\n\n // POST /:workspace/archive — trigger archive\n router.post('/:workspace/archive', async (req, res) => {\n try {\n // Import archive logic inline to avoid circular deps\n const { archivePath } = await import('../todos/parser.js');\n const { resolve } = await import('node:path');\n const { readFile } = await import('node:fs/promises');\n const { writeFileForce } = await import('../utils/fs.js');\n\n const workspace = getWorkspaceParam(req.params.workspace);\n const checklist = await readChecklist(todosDir, workspace);\n const log = await readLog(todosDir, workspace);\n\n const completedIds = new Set(\n checklist.items.filter((i) => i.status === 'completed').map((i) => i.id),\n );\n\n if (completedIds.size === 0) {\n res.json({ archived: 0, message: 'No completed items to archive' });\n return;\n }\n\n const toArchive = log.entries.filter((e) =>\n e.itemIds.every((id) => completedIds.has(id)),\n );\n\n const archFile = archivePath(todosDir, workspace, checklist.archiveInterval);\n await ensureDir(resolve(todosDir, 'archive'));\n let archContent = '';\n if (await fileExists(archFile)) {\n archContent = await readFile(archFile, 'utf-8');\n archContent = archContent.trimEnd() + '\\n\\n';\n } else {\n archContent = `---\\nworkspace: ${workspace}\\n---\\n\\n# Archive\\n\\n`;\n }\n\n const completedItems = checklist.items.filter((i) => completedIds.has(i.id));\n for (const item of completedItems) {\n archContent += `- [x] ${item.description} ${item.tags.map((t: string) => `#${t}`).join(' ')} [t:${item.id}]\\n`;\n }\n archContent += '\\n';\n for (const entry of toArchive) {\n archContent += `### ${entry.timestamp} — ${entry.itemIds.map((i: string) => `t:${i}`).join(', ')}\\n`;\n if (entry.items) archContent += `**Items:** ${entry.items}\\n`;\n if (entry.session) archContent += `**Session:** ${entry.session}\\n`;\n if (entry.branch) archContent += `**Branch:** ${entry.branch}\\n`;\n if (entry.summary) archContent += `**Summary:** ${entry.summary}\\n`;\n if (entry.blockers) archContent += `**Blockers:** ${entry.blockers}\\n`;\n archContent += '\\n';\n }\n await writeFileForce(archFile, archContent);\n\n checklist.items = checklist.items.filter((i) => !completedIds.has(i.id));\n await writeChecklist(todosDir, checklist);\n\n broadcastUpdate();\n res.json({ archived: completedIds.size, logEntries: toArchive.length });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to archive' });\n }\n });\n\n // GET /:workspace/log/:id — log for specific item\n router.get('/:workspace/log/:id', async (req, res) => {\n try {\n const log = await readLog(todosDir, getWorkspaceParam(req.params.workspace));\n const entries = log.entries.filter((e) => e.itemIds.includes(req.params.id));\n res.json({ workspace: log.workspace, entries });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to get log' });\n }\n });\n\n // GET /:workspace/:id — single item with log\n router.get('/:workspace/:id', async (req, res) => {\n try {\n const workspace = getWorkspaceParam(req.params.workspace);\n const checklist = await readChecklist(todosDir, workspace);\n const item = checklist.items.find((i) => i.id === req.params.id);\n if (!item) {\n res.status(404).json({ error: `Todo \"${req.params.id}\" not found` });\n return;\n }\n const log = await readLog(todosDir, workspace);\n const logEntries = log.entries.filter((e) => e.itemIds.includes(req.params.id));\n res.json({ ...item, log: logEntries });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to get todo' });\n }\n });\n\n // PATCH /:workspace/:id — update description or tags\n router.patch('/:workspace/:id', async (req, res) => {\n try {\n const workspace = getWorkspaceParam(req.params.workspace);\n const result = await withLock(workspace, async () => {\n const checklist = await readChecklist(todosDir, workspace);\n const item = checklist.items.find((i) => i.id === req.params.id);\n if (!item) return null;\n if (req.body.description !== undefined) item.description = req.body.description;\n if (Array.isArray(req.body.tags)) item.tags = req.body.tags;\n await writeChecklist(todosDir, checklist);\n return { ...item };\n });\n if (!result) { res.status(404).json({ error: `Todo \"${req.params.id}\" not found` }); return; }\n broadcastUpdate();\n res.json(result);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to update todo' });\n }\n });\n\n // DELETE /:workspace/:id\n router.delete('/:workspace/:id', async (req, res) => {\n try {\n const workspace = getWorkspaceParam(req.params.workspace);\n const deleted = await withLock(workspace, async () => {\n const checklist = await readChecklist(todosDir, workspace);\n const idx = checklist.items.findIndex((i) => i.id === req.params.id);\n if (idx === -1) return false;\n checklist.items.splice(idx, 1);\n await writeChecklist(todosDir, checklist);\n return true;\n });\n if (!deleted) { res.status(404).json({ error: `Todo \"${req.params.id}\" not found` }); return; }\n broadcastUpdate();\n res.json({ deleted: req.params.id });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to delete todo' });\n }\n });\n\n // POST /:workspace/:id/start\n router.post('/:workspace/:id/start', async (req, res) => {\n try {\n const workspace = getWorkspaceParam(req.params.workspace);\n const result = await withLock(workspace, async () => {\n const checklist = await readChecklist(todosDir, workspace);\n const item = checklist.items.find((i) => i.id === req.params.id);\n if (!item) return { error: 'not_found' as const };\n if (item.status === 'in_progress') return { error: 'conflict' as const, session: item.session };\n item.status = 'in_progress';\n item.session = req.body.session || null;\n await writeChecklist(todosDir, checklist);\n return { item: { ...item } };\n });\n if ('error' in result) {\n if (result.error === 'not_found') { res.status(404).json({ error: `Todo \"${req.params.id}\" not found` }); return; }\n res.status(409).json({ error: `Todo is already in progress (session: ${result.session})` }); return;\n }\n broadcastUpdate();\n res.json(result.item);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to start todo' });\n }\n });\n\n // POST /:workspace/:id/complete\n router.post('/:workspace/:id/complete', async (req, res) => {\n try {\n const workspace = getWorkspaceParam(req.params.workspace);\n const result = await withLock(workspace, async () => {\n const checklist = await readChecklist(todosDir, workspace);\n const item = checklist.items.find((i) => i.id === req.params.id);\n if (!item) return null;\n item.status = 'completed';\n item.session = null;\n await writeChecklist(todosDir, checklist);\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n itemIds: [item.id],\n items: item.description,\n session: req.body.session || null,\n branch: req.body.branch || null,\n summary: req.body.summary || 'Completed.',\n blockers: null,\n status: null,\n };\n await appendLogEntry(todosDir, workspace, entry);\n return { ...item };\n });\n if (!result) { res.status(404).json({ error: `Todo \"${req.params.id}\" not found` }); return; }\n broadcastUpdate();\n res.json(result);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to complete todo' });\n }\n });\n\n // POST /:workspace/:id/block\n router.post('/:workspace/:id/block', async (req, res) => {\n try {\n const reason = req.body.reason || null;\n const workspace = getWorkspaceParam(req.params.workspace);\n const result = await withLock(workspace, async () => {\n const checklist = await readChecklist(todosDir, workspace);\n const item = checklist.items.find((i) => i.id === req.params.id);\n if (!item) return null;\n item.status = 'blocked';\n item.session = null;\n await writeChecklist(todosDir, checklist);\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n itemIds: [item.id],\n items: item.description,\n session: req.body.session || null,\n branch: null,\n summary: reason || 'Blocked.',\n blockers: reason,\n status: 'blocked',\n };\n await appendLogEntry(todosDir, workspace, entry);\n return { ...item };\n });\n if (!result) { res.status(404).json({ error: `Todo \"${req.params.id}\" not found` }); return; }\n broadcastUpdate();\n res.json(result);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to block todo' });\n }\n });\n\n // POST /:workspace/:id/reopen — move completed back to open\n router.post('/:workspace/:id/reopen', async (req, res) => {\n try {\n const workspace = getWorkspaceParam(req.params.workspace);\n const result = await withLock(workspace, async () => {\n const checklist = await readChecklist(todosDir, workspace);\n const item = checklist.items.find((i) => i.id === req.params.id);\n if (!item) return null;\n item.status = 'open';\n item.session = null;\n await writeChecklist(todosDir, checklist);\n return { ...item };\n });\n if (!result) { res.status(404).json({ error: `Todo \"${req.params.id}\" not found` }); return; }\n broadcastUpdate();\n res.json(result);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to reopen todo' });\n }\n });\n\n // POST /:workspace/:id/unblock\n router.post('/:workspace/:id/unblock', async (req, res) => {\n try {\n const workspace = getWorkspaceParam(req.params.workspace);\n const result = await withLock(workspace, async () => {\n const checklist = await readChecklist(todosDir, workspace);\n const item = checklist.items.find((i) => i.id === req.params.id);\n if (!item) return null;\n item.status = 'open';\n item.session = null;\n await writeChecklist(todosDir, checklist);\n return { ...item };\n });\n if (!result) { res.status(404).json({ error: `Todo \"${req.params.id}\" not found` }); return; }\n broadcastUpdate();\n res.json(result);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to unblock todo' });\n }\n });\n\n return router;\n}\n","import { Router } from 'express';\nimport { updateBackupConfig } from '../utils/config.js';\nimport {\n backupToGithub,\n restoreFromGithub,\n getBackupStatus,\n parseCategoriesStrict,\n validateRepoUrl,\n VALID_CATEGORIES,\n} from '../utils/github-backup.js';\n\nexport function createBackupRouter(): Router {\n const router = Router();\n\n router.get('/', async (_req, res) => {\n try {\n const status = await getBackupStatus();\n res.json(status);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : String(error) });\n }\n });\n\n router.put('/config', async (req, res) => {\n try {\n const body = req.body ?? {};\n const updates: { repo?: string; categories?: string } = {};\n\n if (body.repo !== undefined) {\n const trimmed = typeof body.repo === 'string' ? body.repo.trim() : body.repo;\n if (trimmed !== null && trimmed !== '' && !validateRepoUrl(trimmed)) {\n return res.status(400).json({\n error: `Invalid repo URL. Must start with https:// or git@.`,\n });\n }\n updates.repo = trimmed || null as unknown as string;\n }\n\n if (body.categories !== undefined) {\n let cats: string[];\n if (Array.isArray(body.categories)) {\n cats = body.categories.map((s: unknown) => String(s).trim()).filter(Boolean);\n } else if (typeof body.categories === 'string') {\n cats = body.categories.split(',').map((s: string) => s.trim()).filter(Boolean);\n } else {\n return res.status(400).json({ error: 'categories must be a string or array' });\n }\n if (cats.length === 0) {\n return res.status(400).json({\n error: `No categories provided. Valid: ${VALID_CATEGORIES.join(', ')}`,\n });\n }\n try {\n const valid = parseCategoriesStrict(cats);\n updates.categories = valid.join(', ');\n } catch (err) {\n return res.status(400).json({\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n if (Object.keys(updates).length === 0) {\n return res.status(400).json({ error: 'No fields to update' });\n }\n\n await updateBackupConfig(updates);\n const status = await getBackupStatus();\n res.json(status);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : String(error) });\n }\n });\n\n router.post('/push', async (_req, res) => {\n try {\n const result = await backupToGithub();\n res.json(result);\n } catch (error) {\n res.status(500).json({\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n router.post('/pull', async (_req, res) => {\n try {\n const result = await restoreFromGithub();\n res.json(result);\n } catch (error) {\n res.status(500).json({\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n return router;\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { cp, mkdtemp, rm, readFile, writeFile, unlink, stat, open, rename } from 'node:fs/promises';\nimport { resolve, join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { syntaurRoot, playbooksDir, todosDir, serversDir } from './paths.js';\nimport { ensureDir, fileExists } from './fs.js';\nimport { readConfig, updateBackupConfig, type BackupConfig } from './config.js';\n\nconst exec = promisify(execFile);\n\nexport const VALID_CATEGORIES = ['projects', 'playbooks', 'todos', 'servers', 'config'] as const;\nexport type BackupCategory = (typeof VALID_CATEGORIES)[number];\n\nconst LOCK_FILE_NAME = '.backup-lock';\n\nexport function parseCategories(csv: string): BackupCategory[] {\n return csv\n .split(',')\n .map((s) => s.trim())\n .filter((s): s is BackupCategory => (VALID_CATEGORIES as readonly string[]).includes(s));\n}\n\nexport function validateCategories(cats: string[]): BackupCategory[] {\n const valid: BackupCategory[] = [];\n for (const cat of cats) {\n if ((VALID_CATEGORIES as readonly string[]).includes(cat)) {\n valid.push(cat as BackupCategory);\n } else {\n console.warn(`Warning: unknown backup category \"${cat}\", skipping`);\n }\n }\n return valid;\n}\n\nexport function parseCategoriesStrict(cats: string[]): BackupCategory[] {\n const unknown: string[] = [];\n const valid: BackupCategory[] = [];\n for (const cat of cats) {\n if ((VALID_CATEGORIES as readonly string[]).includes(cat)) {\n valid.push(cat as BackupCategory);\n } else {\n unknown.push(cat);\n }\n }\n if (unknown.length > 0) {\n throw new Error(\n `Unknown categor${unknown.length === 1 ? 'y' : 'ies'}: ${unknown.map((c) => `\"${c}\"`).join(', ')}. Valid: ${VALID_CATEGORIES.join(', ')}`,\n );\n }\n return valid;\n}\n\nexport function validateRepoUrl(url: string): boolean {\n if (!url || typeof url !== 'string') return false;\n const trimmed = url.trim();\n return trimmed.startsWith('https://') || trimmed.startsWith('git@');\n}\n\nexport async function resolveCategoryPath(\n category: BackupCategory,\n): Promise<{ sourcePath: string; repoPath: string; isFile: boolean }> {\n switch (category) {\n case 'projects': {\n const config = await readConfig();\n return { sourcePath: config.defaultProjectDir, repoPath: 'projects', isFile: false };\n }\n case 'playbooks':\n return { sourcePath: playbooksDir(), repoPath: 'playbooks', isFile: false };\n case 'todos':\n return { sourcePath: todosDir(), repoPath: 'todos', isFile: false };\n case 'servers':\n return { sourcePath: serversDir(), repoPath: 'servers', isFile: false };\n case 'config':\n return { sourcePath: resolve(syntaurRoot(), 'config.md'), repoPath: 'config.md', isFile: true };\n }\n}\n\nasync function checkGitInstalled(): Promise<void> {\n try {\n await exec('git', ['--version']);\n } catch {\n throw new Error('git is not installed or not on PATH. Install git and try again.');\n }\n}\n\nasync function acquireLock(): Promise<string> {\n const lockPath = resolve(syntaurRoot(), LOCK_FILE_NAME);\n await ensureDir(syntaurRoot());\n try {\n const handle = await open(lockPath, 'wx');\n await handle.write(String(process.pid));\n await handle.close();\n return lockPath;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'EEXIST') {\n const pid = await readFile(lockPath, 'utf-8').catch(() => '');\n throw new Error(\n `Backup operation already in progress (lock file at ${lockPath}, pid ${pid.trim() || 'unknown'}). If stale, delete the file and retry.`,\n );\n }\n throw err;\n }\n}\n\nasync function releaseLock(lockPath: string): Promise<void> {\n try {\n await unlink(lockPath);\n } catch {\n // ignore\n }\n}\n\nasync function runGit(args: string[], cwd: string): Promise<{ stdout: string; stderr: string }> {\n return exec('git', args, { cwd });\n}\n\nasync function cloneOrInit(repoUrl: string, destDir: string): Promise<void> {\n try {\n await exec('git', ['clone', '--depth', '1', repoUrl, destDir]);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes('Repository not found') || message.includes('does not appear to be a git repository')) {\n throw new Error(`Repository not found or inaccessible: ${repoUrl}. Check URL and credentials.`);\n }\n if (message.includes('Authentication failed') || message.includes('could not read Username')) {\n throw new Error(`Authentication failed for ${repoUrl}. Check SSH keys or credentials.`);\n }\n throw new Error(`git clone failed: ${message}`);\n }\n}\n\nasync function copyRecursive(src: string, dest: string): Promise<void> {\n if (!(await fileExists(src))) return;\n const s = await stat(src);\n if (s.isDirectory()) {\n await ensureDir(dest);\n await cp(src, dest, { recursive: true, force: true });\n } else {\n await ensureDir(resolve(dest, '..'));\n await cp(src, dest, { force: true });\n }\n}\n\nexport interface BackupResult {\n success: boolean;\n timestamp: string;\n message: string;\n committed: boolean;\n}\n\nfunction resolveCategoriesStrict(csv: string): BackupCategory[] {\n const parts = csv.split(',').map((s) => s.trim()).filter(Boolean);\n return parseCategoriesStrict(parts);\n}\n\n/**\n * Read config.md and return a version with lastBackup/lastRestore set to null.\n * This is the copy that goes into the backup repo, so those timestamps — which\n * mutate on every local operation — never cause a self-diff on subsequent backups.\n */\nexport async function readSanitizedConfig(configPath: string): Promise<string> {\n const content = await readFile(configPath, 'utf-8');\n return content\n .replace(/^(\\s*lastBackup:\\s*).*$/m, '$1null')\n .replace(/^(\\s*lastRestore:\\s*).*$/m, '$1null');\n}\n\nexport async function backupToGithub(overrides?: {\n repo?: string;\n categories?: BackupCategory[];\n}): Promise<BackupResult> {\n await checkGitInstalled();\n const config = await readConfig();\n const rawRepo = overrides?.repo ?? config.backup?.repo ?? null;\n if (!rawRepo) {\n throw new Error('No backup repo configured. Set it via `syntaur backup config --repo <url>` or the dashboard.');\n }\n const repo = rawRepo.trim();\n if (!validateRepoUrl(repo)) {\n throw new Error(`Invalid repo URL: \"${rawRepo}\". Must start with https:// or git@.`);\n }\n\n const categoriesCsv = config.backup?.categories ?? 'projects, playbooks, todos, servers, config';\n const categories = overrides?.categories ?? resolveCategoriesStrict(categoriesCsv);\n if (categories.length === 0) {\n throw new Error('No valid backup categories selected.');\n }\n\n const lockPath = await acquireLock();\n let tmpDir: string | null = null;\n const timestamp = new Date().toISOString();\n\n try {\n tmpDir = await mkdtemp(join(tmpdir(), 'syntaur-backup-'));\n await cloneOrInit(repo, tmpDir);\n\n // Copy each selected category into the repo clone.\n // Always clear the destination first so local deletions propagate to the repo.\n for (const category of categories) {\n const { sourcePath, repoPath, isFile } = await resolveCategoryPath(category);\n const destPath = join(tmpDir, repoPath);\n\n if (isFile) {\n await rm(destPath, { force: true });\n } else {\n await rm(destPath, { recursive: true, force: true });\n }\n\n if (!(await fileExists(sourcePath))) {\n console.warn(`Category \"${category}\": no local data at ${sourcePath}; backup will reflect deletion.`);\n continue;\n }\n\n if (category === 'config') {\n // Sanitize config.md before writing to the repo: strip lastBackup/lastRestore\n // timestamps so they don't cause a self-diff on every backup.\n const sanitized = await readSanitizedConfig(sourcePath);\n await ensureDir(resolve(destPath, '..'));\n await writeFile(destPath, sanitized, 'utf-8');\n } else {\n await copyRecursive(sourcePath, destPath);\n }\n }\n\n // Stage and check for changes\n await runGit(['add', '-A'], tmpDir);\n const { stdout: status } = await runGit(['status', '--porcelain'], tmpDir);\n if (!status.trim()) {\n // No-op but successful: persist timestamp so UI reflects the completed check\n await updateBackupConfig({ lastBackup: timestamp }).catch(() => {});\n return {\n success: true,\n timestamp,\n message: 'No changes to back up.',\n committed: false,\n };\n }\n\n // Configure committer if unset (best-effort; user may have global config)\n try {\n await runGit(['config', 'user.email', 'syntaur@local'], tmpDir);\n await runGit(['config', 'user.name', 'Syntaur Backup'], tmpDir);\n } catch {\n // ignore\n }\n\n await runGit(['commit', '-m', `Syntaur backup ${timestamp}`], tmpDir);\n\n try {\n await runGit(['push'], tmpDir);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes('non-fast-forward') || message.includes('rejected')) {\n throw new Error('Push rejected (non-fast-forward). Pull and resolve manually, or delete remote contents.');\n }\n if (message.includes('Authentication') || message.includes('could not read Username')) {\n throw new Error('Push authentication failed. Check SSH keys or credentials.');\n }\n throw new Error(`git push failed: ${message}`);\n }\n\n // Push succeeded: persist timestamp\n await updateBackupConfig({ lastBackup: timestamp }).catch(() => {});\n\n return {\n success: true,\n timestamp,\n message: `Backed up ${categories.length} categor${categories.length === 1 ? 'y' : 'ies'} to ${repo}.`,\n committed: true,\n };\n } finally {\n if (tmpDir) {\n await rm(tmpDir, { recursive: true, force: true }).catch(() => {});\n }\n await releaseLock(lockPath);\n }\n}\n\nexport async function safeRestoreCategory(\n localPath: string,\n repoSrcPath: string,\n isFile: boolean,\n): Promise<void> {\n if (isFile) {\n // Single file: cp handles atomic rename internally. No staging needed.\n await ensureDir(resolve(localPath, '..'));\n await cp(repoSrcPath, localPath, { force: true });\n return;\n }\n\n // Directory: stage, then swap.\n const stagingPath = `${localPath}.syntaur-restore-staging`;\n const backupPath = `${localPath}.syntaur-restore-backup`;\n\n // Stale staging from a crashed run is always safe to discard.\n await rm(stagingPath, { recursive: true, force: true });\n\n // A pre-existing backup dir means a prior run crashed mid-swap and it may contain\n // the only copy of the user's original data. Do NOT delete it blindly.\n const backupExistsBefore = await fileExists(backupPath);\n const localExistsBefore = await fileExists(localPath);\n if (backupExistsBefore) {\n if (!localExistsBefore) {\n // Prior crash left the backup as the only copy. Restore it first.\n await rename(backupPath, localPath);\n } else {\n // Both exist — we can't tell which is authoritative. Bail out.\n throw new Error(\n `Cannot restore \"${localPath}\": a stale crash-recovery backup exists at ${backupPath} while the current path also exists. ` +\n `Inspect both and remove the one you don't need, then retry.`,\n );\n }\n }\n\n let localMovedAside = false;\n try {\n // Copy repo contents into staging. If this fails, local is untouched.\n await cp(repoSrcPath, stagingPath, { recursive: true, force: true });\n\n // Move current local aside (if it exists).\n const localExists = await fileExists(localPath);\n if (localExists) {\n await rename(localPath, backupPath);\n localMovedAside = true;\n }\n\n // Swap staging into place.\n await rename(stagingPath, localPath);\n\n // Success: remove the old data.\n await rm(backupPath, { recursive: true, force: true }).catch(() => {});\n } catch (err) {\n // Roll back: restore original if we moved it aside.\n if (localMovedAside && (await fileExists(backupPath))) {\n await rename(backupPath, localPath).catch(() => {});\n }\n // Always clean up staging (may or may not exist depending on where we failed).\n await rm(stagingPath, { recursive: true, force: true }).catch(() => {});\n throw err;\n }\n}\n\nexport async function restoreFromGithub(overrides?: {\n repo?: string;\n categories?: BackupCategory[];\n}): Promise<BackupResult> {\n await checkGitInstalled();\n const config = await readConfig();\n const rawRepo = overrides?.repo ?? config.backup?.repo ?? null;\n if (!rawRepo) {\n throw new Error('No backup repo configured.');\n }\n const repo = rawRepo.trim();\n if (!validateRepoUrl(repo)) {\n throw new Error(`Invalid repo URL: \"${rawRepo}\".`);\n }\n\n const categoriesCsv = config.backup?.categories ?? 'projects, playbooks, todos, servers, config';\n const categories = overrides?.categories ?? resolveCategoriesStrict(categoriesCsv);\n if (categories.length === 0) {\n throw new Error('No valid restore categories selected.');\n }\n\n const lockPath = await acquireLock();\n let tmpDir: string | null = null;\n const restored: string[] = [];\n const failed: string[] = [];\n const timestamp = new Date().toISOString();\n\n try {\n // Persist timestamp before work so UI reflects the attempt even on partial failure.\n // Inside try so lock is released even if config write fails.\n await updateBackupConfig({ lastRestore: timestamp });\n\n tmpDir = await mkdtemp(join(tmpdir(), 'syntaur-restore-'));\n await cloneOrInit(repo, tmpDir);\n\n for (const category of categories) {\n // Never overwrite config.md on restore — would clobber backup settings\n if (category === 'config') {\n console.warn('Skipping \"config\" on restore (would overwrite local backup settings).');\n continue;\n }\n try {\n const { sourcePath: localPath, repoPath, isFile } = await resolveCategoryPath(category);\n const repoSrcPath = join(tmpDir, repoPath);\n if (!(await fileExists(repoSrcPath))) {\n console.warn(`Category \"${category}\" not found in backup repo, skipping.`);\n continue;\n }\n await safeRestoreCategory(localPath, repoSrcPath, isFile);\n restored.push(category);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error(`Failed to restore \"${category}\": ${msg}`);\n failed.push(category);\n }\n }\n\n const success = failed.length === 0;\n return {\n success,\n timestamp,\n message: success\n ? `Restored ${restored.length} categor${restored.length === 1 ? 'y' : 'ies'} from ${repo}.`\n : `Partial restore: ${restored.length} succeeded, ${failed.length} failed (${failed.join(', ')}).`,\n committed: false,\n };\n } finally {\n if (tmpDir) {\n await rm(tmpDir, { recursive: true, force: true }).catch(() => {});\n }\n await releaseLock(lockPath);\n }\n}\n\nexport async function getBackupStatus(): Promise<{\n repo: string | null;\n categories: string;\n lastBackup: string | null;\n lastRestore: string | null;\n locked: boolean;\n}> {\n const config = await readConfig();\n const lockPath = resolve(syntaurRoot(), LOCK_FILE_NAME);\n const locked = await fileExists(lockPath);\n return {\n repo: config.backup?.repo ?? null,\n categories: config.backup?.categories ?? 'projects, playbooks, todos, servers, config',\n lastBackup: config.backup?.lastBackup ?? null,\n lastRestore: config.backup?.lastRestore ?? null,\n locked,\n };\n}\n","import {\n execQuiet,\n checkTmuxAvailable,\n sessionAlive,\n listTmuxPanes,\n getLsofOutput,\n loadWorkspaceRecords,\n autoLinkPane,\n getGitInfo,\n clearScanCache,\n} from './scanner.js';\nimport {\n readSessionFile,\n listSessionFiles,\n registerAutoSession,\n removeSession,\n sanitizeSessionName,\n} from './servers.js';\nimport type { SessionFileData } from './types.js';\n\n// --- Shared lsof helpers ---\n\nexport function parsePortsForPid(lsofOutput: string, targetPid: number): number[] {\n const ports: number[] = [];\n for (const line of lsofOutput.split('\\n')) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length < 9) continue;\n const pid = parseInt(parts[1], 10);\n if (pid !== targetPid) continue;\n const tcpAddr = parts.find((p) => p.includes(':') && /:\\d+$/.test(p));\n if (tcpAddr) {\n const port = parseInt(tcpAddr.split(':').pop()!, 10);\n if (!isNaN(port) && !ports.includes(port)) ports.push(port);\n }\n }\n return ports;\n}\n\nexport function parseLsofForListeningProcesses(lsofOutput: string): ListeningProcess[] {\n const seen = new Map<number, ListeningProcess>();\n for (const line of lsofOutput.split('\\n')) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length < 9) continue;\n const command = parts[0];\n const pid = parseInt(parts[1], 10);\n if (isNaN(pid)) continue;\n const tcpAddr = parts.find((p) => p.includes(':') && /:\\d+$/.test(p));\n if (!tcpAddr) continue;\n const port = parseInt(tcpAddr.split(':').pop()!, 10);\n if (isNaN(port)) continue;\n\n if (!seen.has(pid)) {\n seen.set(pid, { pid, port, command });\n }\n }\n return Array.from(seen.values());\n}\n\n// --- Singleton lifecycle ---\n\nlet timer: ReturnType<typeof setInterval> | null = null;\nlet activeReconcile: Promise<void> | null = null;\n\nexport interface AutodiscoveryOptions {\n serversDir: string;\n projectsDir: string;\n intervalMs?: number;\n excludePids?: Set<number>;\n}\n\nlet savedOptions: AutodiscoveryOptions | null = null;\n\nexport function startAutodiscovery(opts: AutodiscoveryOptions): void {\n if (timer) return;\n savedOptions = opts;\n const interval = opts.intervalMs ?? 45_000;\n // Run once immediately, then on interval\n runReconcile();\n timer = setInterval(() => {\n runReconcile();\n }, interval);\n}\n\nexport async function stopAutodiscovery(): Promise<void> {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n // Await in-flight reconcile to prevent overlap\n if (activeReconcile) {\n await activeReconcile;\n activeReconcile = null;\n }\n savedOptions = null;\n}\n\nfunction runReconcile(): void {\n if (activeReconcile || !savedOptions) return;\n const opts = savedOptions;\n activeReconcile = reconcile(opts.serversDir, opts.projectsDir, opts.excludePids)\n .catch((err) => {\n console.error('[autodiscovery] reconcile failed:', err);\n })\n .finally(() => {\n activeReconcile = null;\n });\n}\n\n// --- Tmux discovery ---\n\nexport async function listAllTmuxSessions(): Promise<string[]> {\n const output = await execQuiet('tmux', ['list-sessions', '-F', '#{session_name}']);\n if (!output) return [];\n return output.split('\\n').filter((line) => line.length > 0);\n}\n\nasync function discoverTmuxSessions(\n serversDir: string,\n projectsDir: string,\n existingNames: Set<string>,\n): Promise<boolean> {\n const tmuxAvailable = await checkTmuxAvailable();\n if (!tmuxAvailable) return false;\n\n const workspaceRecords = await loadWorkspaceRecords(projectsDir);\n if (workspaceRecords.length === 0) return false;\n\n const sessions = await listAllTmuxSessions();\n let changed = false;\n\n for (const sessionName of sessions) {\n const sanitized = sanitizeSessionName(sessionName);\n if (existingNames.has(sanitized)) {\n // Already tracked (manual or auto) — skip\n continue;\n }\n\n const panes = await listTmuxPanes(sessionName);\n if (panes.length === 0) continue;\n\n // Check if any pane matches a workspace\n let matched = false;\n const cwdGitCache = new Map<string, { branch: string | null; worktree: boolean }>();\n\n for (const pane of panes) {\n if (!cwdGitCache.has(pane.cwd)) {\n cwdGitCache.set(pane.cwd, await getGitInfo(pane.cwd));\n }\n const gitInfo = cwdGitCache.get(pane.cwd)!;\n const link = await autoLinkPane(pane.cwd, gitInfo.branch, workspaceRecords);\n if (link) {\n matched = true;\n break;\n }\n }\n\n if (matched) {\n await registerAutoSession(serversDir, sessionName, { kind: 'tmux' });\n changed = true;\n }\n }\n\n return changed;\n}\n\n// --- Non-tmux process discovery ---\n\ninterface ListeningProcess {\n pid: number;\n port: number;\n command: string;\n}\n\nasync function getProcessCwd(pid: number): Promise<string | null> {\n // macOS: use lsof to get cwd\n const output = await execQuiet('lsof', ['-a', '-d', 'cwd', '-p', String(pid), '-Fn']);\n if (!output) return null;\n // Output format: lines starting with 'n' contain the path\n for (const line of output.split('\\n')) {\n if (line.startsWith('n') && line.length > 1) {\n return line.slice(1);\n }\n }\n return null;\n}\n\nasync function discoverProcesses(\n serversDir: string,\n projectsDir: string,\n existingFiles: Map<string, SessionFileData>,\n excludePids?: Set<number>,\n): Promise<boolean> {\n const workspaceRecords = await loadWorkspaceRecords(projectsDir);\n if (workspaceRecords.length === 0) return false;\n\n const lsofOutput = await getLsofOutput();\n if (!lsofOutput) return false;\n\n const processes = parseLsofForListeningProcesses(lsofOutput);\n let changed = false;\n\n // Track which PIDs are already tracked by existing process-kind entries\n const trackedPids = new Set<number>();\n for (const data of existingFiles.values()) {\n if (data.kind === 'process' && data.pid) {\n trackedPids.add(data.pid);\n }\n }\n\n for (const proc of processes) {\n if (trackedPids.has(proc.pid)) continue;\n if (excludePids?.has(proc.pid)) continue;\n\n const cwd = await getProcessCwd(proc.pid);\n if (!cwd) continue;\n\n const gitInfo = await getGitInfo(cwd);\n const link = await autoLinkPane(cwd, gitInfo.branch, workspaceRecords);\n if (!link) continue;\n\n // Build a session name from the command and port\n const sessionName = `proc-${proc.command}-${proc.port}`;\n const sanitized = sanitizeSessionName(sessionName);\n\n // Skip if already registered under this name\n if (existingFiles.has(sanitized)) continue;\n\n const ports = parsePortsForPid(lsofOutput, proc.pid);\n await registerAutoSession(serversDir, sessionName, {\n kind: 'process',\n pid: proc.pid,\n ports: ports.length > 0 ? ports : [proc.port],\n cwd,\n });\n changed = true;\n }\n\n return changed;\n}\n\n// --- Reconciliation ---\n\nasync function cleanupDeadAutoSessions(\n serversDir: string,\n existingFiles: Map<string, SessionFileData>,\n): Promise<{ changed: boolean; removedNames: Set<string> }> {\n let changed = false;\n const removedNames = new Set<string>();\n\n // Only check tmux liveness if tmux is available\n const tmuxAvailable = await checkTmuxAvailable();\n\n for (const [name, data] of existingFiles) {\n if (!data.auto) continue;\n\n let alive = true; // Default to alive for unknown kinds\n if (data.kind === 'tmux') {\n if (!tmuxAvailable) continue; // Don't delete tmux sessions when tmux is unavailable\n alive = await sessionAlive(data.session);\n } else if (data.kind === 'process' && data.pid) {\n alive = await isProcessAlive(data.pid);\n } else {\n // Unknown kind with auto: true — leave it alone\n continue;\n }\n\n if (!alive) {\n await removeSession(serversDir, name);\n removedNames.add(name);\n changed = true;\n }\n }\n\n return { changed, removedNames };\n}\n\nexport async function isProcessAlive(pid: number): Promise<boolean> {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function reconcile(serversDir: string, projectsDir: string, excludePids?: Set<number>): Promise<void> {\n // Load all existing session files\n const names = await listSessionFiles(serversDir);\n const existingFiles = new Map<string, SessionFileData>();\n for (const name of names) {\n const data = await readSessionFile(serversDir, name);\n if (data) existingFiles.set(name, data);\n }\n\n // Clean up dead auto sessions FIRST so discovery can re-register restarted processes\n const { changed: cleanupChanged, removedNames } = await cleanupDeadAutoSessions(serversDir, existingFiles);\n\n // Remove cleaned-up entries from the maps so discovery sees them as available\n for (const name of removedNames) {\n existingFiles.delete(name);\n }\n const existingNames = new Set(existingFiles.keys());\n\n // Discover new sessions\n const tmuxChanged = await discoverTmuxSessions(serversDir, projectsDir, existingNames);\n const processChanged = await discoverProcesses(serversDir, projectsDir, existingFiles, excludePids);\n\n // Invalidate scan cache if anything changed\n if (tmuxChanged || processChanged || cleanupChanged) {\n clearScanCache();\n }\n}\n\n// --- Exports for testing ---\nexport { reconcile, getProcessCwd };\n","import { resolve } from 'node:path';\nimport { expandHome, assignmentsDir as assignmentsDirFn } from '../utils/paths.js';\nimport { fileExists } from '../utils/fs.js';\nimport { readConfig } from '../utils/config.js';\nimport { isValidSlug } from '../utils/slug.js';\nimport {\n executeTransition,\n executeTransitionByDir,\n executeAssign,\n executeAssignByDir,\n type TransitionCommand,\n type TransitionResult,\n} from '../lifecycle/index.js';\nimport { resolveAssignmentById } from '../utils/assignment-resolver.js';\n\nexport interface LifecycleOptions {\n project?: string;\n dir?: string;\n reason?: string;\n agent?: string;\n}\n\nexport async function runTransition(\n assignment: string,\n command: Exclude<TransitionCommand, 'assign'>,\n options: LifecycleOptions = {},\n): Promise<TransitionResult> {\n const config = await readConfig();\n const baseDir = options.dir ? expandHome(options.dir) : config.defaultProjectDir;\n\n if (options.project) {\n if (!isValidSlug(options.project)) {\n throw new Error(`Invalid project slug \"${options.project}\".`);\n }\n if (!isValidSlug(assignment)) {\n throw new Error(`Invalid assignment slug \"${assignment}\".`);\n }\n const projectDir = resolve(baseDir, options.project);\n const projectMdPath = resolve(projectDir, 'project.md');\n if (!(await fileExists(projectDir)) || !(await fileExists(projectMdPath))) {\n throw new Error(`Project \"${options.project}\" not found at ${projectDir}.`);\n }\n return executeTransition(projectDir, assignment, command, {\n reason: options.reason,\n agent: options.agent,\n });\n }\n\n const resolved = await resolveAssignmentById(baseDir, assignmentsDirFn(), assignment);\n if (!resolved) {\n throw new Error(\n `Assignment \"${assignment}\" not found. Provide --project <slug> or a valid standalone UUID.`,\n );\n }\n return executeTransitionByDir(resolved.assignmentDir, command, {\n reason: options.reason,\n agent: options.agent,\n standalone: resolved.standalone,\n });\n}\n\nexport async function runAssign(\n assignment: string,\n agent: string,\n options: LifecycleOptions = {},\n): Promise<TransitionResult> {\n const config = await readConfig();\n const baseDir = options.dir ? expandHome(options.dir) : config.defaultProjectDir;\n\n if (options.project) {\n if (!isValidSlug(options.project)) {\n throw new Error(`Invalid project slug \"${options.project}\".`);\n }\n if (!isValidSlug(assignment)) {\n throw new Error(`Invalid assignment slug \"${assignment}\".`);\n }\n const projectDir = resolve(baseDir, options.project);\n const projectMdPath = resolve(projectDir, 'project.md');\n if (!(await fileExists(projectDir)) || !(await fileExists(projectMdPath))) {\n throw new Error(`Project \"${options.project}\" not found at ${projectDir}.`);\n }\n return executeAssign(projectDir, assignment, agent);\n }\n\n const resolved = await resolveAssignmentById(baseDir, assignmentsDirFn(), assignment);\n if (!resolved) {\n throw new Error(\n `Assignment \"${assignment}\" not found. Provide --project <slug> or a valid standalone UUID.`,\n );\n }\n return executeAssignByDir(resolved.assignmentDir, agent);\n}\n\nexport function reportResult(result: TransitionResult): void {\n if (!result.success) {\n throw new Error(result.message);\n }\n console.log(result.message);\n for (const warning of result.warnings ?? []) {\n console.warn(`Warning: ${warning}`);\n }\n}\n","import { resolve } from 'node:path';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { fileExists } from './fs.js';\nimport { extractFrontmatter, getField } from '../dashboard/parser.js';\n\nexport interface ResolvedAssignment {\n assignmentDir: string;\n projectSlug: string | null;\n assignmentSlug: string;\n id: string;\n standalone: boolean;\n}\n\nexport async function resolveAssignmentById(\n projectsDir: string,\n assignmentsDir: string,\n id: string,\n): Promise<ResolvedAssignment | null> {\n let standaloneMatch: ResolvedAssignment | null = null;\n let projectMatch: ResolvedAssignment | null = null;\n\n // 1) Standalone: <assignmentsDir>/<id>/assignment.md\n const standaloneDir = resolve(assignmentsDir, id);\n const standalonePath = resolve(standaloneDir, 'assignment.md');\n if (await fileExists(standalonePath)) {\n standaloneMatch = {\n assignmentDir: standaloneDir,\n projectSlug: null,\n assignmentSlug: id,\n id,\n standalone: true,\n };\n }\n\n // 2) Project-nested: scan <projectsDir>/*/assignments/*/assignment.md and match by frontmatter id\n if (await fileExists(projectsDir)) {\n try {\n const projects = await readdir(projectsDir, { withFileTypes: true });\n for (const p of projects) {\n if (!p.isDirectory()) continue;\n if (p.name.startsWith('.') || p.name.startsWith('_')) continue;\n const assignmentsPath = resolve(projectsDir, p.name, 'assignments');\n if (!(await fileExists(assignmentsPath))) continue;\n\n const entries = await readdir(assignmentsPath, { withFileTypes: true });\n for (const a of entries) {\n if (!a.isDirectory()) continue;\n const aPath = resolve(assignmentsPath, a.name, 'assignment.md');\n if (!(await fileExists(aPath))) continue;\n\n try {\n const content = await readFile(aPath, 'utf-8');\n const [fm] = extractFrontmatter(content);\n const fileId = getField(fm, 'id');\n if (fileId === id) {\n projectMatch = {\n assignmentDir: resolve(assignmentsPath, a.name),\n projectSlug: p.name,\n assignmentSlug: a.name,\n id,\n standalone: false,\n };\n break;\n }\n } catch {\n // skip unreadable\n }\n }\n if (projectMatch) break;\n }\n } catch {\n // projectsDir not readable\n }\n }\n\n if (standaloneMatch && projectMatch) {\n console.warn(\n `Duplicate assignment ID ${id} found in both standalone and project-nested locations; using standalone`,\n );\n return standaloneMatch;\n }\n\n return standaloneMatch ?? projectMatch ?? null;\n}\n","import { runAssign, reportResult, type LifecycleOptions } from './_lifecycle-helper.js';\n\nexport interface AssignOptions extends LifecycleOptions {\n agent: string;\n}\n\nexport async function assignCommand(\n assignment: string,\n options: AssignOptions,\n): Promise<void> {\n if (!options.agent) {\n throw new Error('--agent <name> is required.');\n }\n const result = await runAssign(assignment, options.agent, options);\n reportResult(result);\n}\n","import { runTransition, reportResult, type LifecycleOptions } from './_lifecycle-helper.js';\n\nexport interface StartOptions extends LifecycleOptions {\n agent?: string;\n}\n\nexport async function startCommand(\n assignment: string,\n options: StartOptions,\n): Promise<void> {\n const result = await runTransition(assignment, 'start', options);\n reportResult(result);\n}\n","import { runTransition, reportResult, type LifecycleOptions } from './_lifecycle-helper.js';\n\nexport interface CompleteOptions extends LifecycleOptions {}\n\nexport async function completeCommand(\n assignment: string,\n options: CompleteOptions,\n): Promise<void> {\n const result = await runTransition(assignment, 'complete', options);\n reportResult(result);\n}\n","import { runTransition, reportResult, type LifecycleOptions } from './_lifecycle-helper.js';\n\nexport interface BlockOptions extends LifecycleOptions {\n reason?: string;\n}\n\nexport async function blockCommand(\n assignment: string,\n options: BlockOptions,\n): Promise<void> {\n const result = await runTransition(assignment, 'block', options);\n reportResult(result);\n}\n","import { runTransition, reportResult, type LifecycleOptions } from './_lifecycle-helper.js';\n\nexport interface UnblockOptions extends LifecycleOptions {}\n\nexport async function unblockCommand(\n assignment: string,\n options: UnblockOptions,\n): Promise<void> {\n const result = await runTransition(assignment, 'unblock', options);\n reportResult(result);\n}\n","import { runTransition, reportResult, type LifecycleOptions } from './_lifecycle-helper.js';\n\nexport interface ReviewOptions extends LifecycleOptions {}\n\nexport async function reviewCommand(\n assignment: string,\n options: ReviewOptions,\n): Promise<void> {\n const result = await runTransition(assignment, 'review', options);\n reportResult(result);\n}\n","import { runTransition, reportResult, type LifecycleOptions } from './_lifecycle-helper.js';\n\nexport interface FailOptions extends LifecycleOptions {}\n\nexport async function failCommand(\n assignment: string,\n options: FailOptions,\n): Promise<void> {\n const result = await runTransition(assignment, 'fail', options);\n reportResult(result);\n}\n","import { runTransition, reportResult, type LifecycleOptions } from './_lifecycle-helper.js';\n\nexport interface ReopenOptions extends LifecycleOptions {}\n\nexport async function reopenCommand(\n assignment: string,\n options: ReopenOptions,\n): Promise<void> {\n const result = await runTransition(assignment, 'reopen', options);\n reportResult(result);\n}\n","import { updateIntegrationConfig } from '../utils/config.js';\nimport {\n detectClaudeMarketplaceForTarget,\n ensureClaudeMarketplaceEntry,\n getConfiguredOrLegacyManagedPluginDir,\n inspectInstallPath,\n installManagedPlugin,\n normalizeAbsoluteInstallPath,\n removeClaudeMarketplaceEntry,\n recommendPluginTargetDir,\n getDefaultPluginTargetDir,\n uninstallManagedPlugin,\n} from '../utils/install.js';\nimport { confirmPrompt, isInteractiveTerminal, textPrompt } from '../utils/prompt.js';\n\nexport interface InstallPluginOptions {\n force?: boolean;\n link?: boolean;\n targetDir?: string;\n promptForTarget?: boolean;\n}\n\nasync function promptForInstallPath(\n question: string,\n recommendedPath: string,\n): Promise<string> {\n while (true) {\n const answer = await textPrompt(question, recommendedPath);\n try {\n return normalizeAbsoluteInstallPath(answer, question);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n }\n }\n}\n\nexport async function installPluginCommand(\n options: InstallPluginOptions,\n): Promise<void> {\n const shouldPromptForTarget = Boolean(\n options.promptForTarget !== false &&\n isInteractiveTerminal() &&\n !options.targetDir,\n );\n const recommendedTargetDir = await recommendPluginTargetDir('claude');\n const targetDir = options.targetDir\n ? normalizeAbsoluteInstallPath(options.targetDir, 'Claude plugin target')\n : shouldPromptForTarget\n ? await promptForInstallPath('Claude plugin directory', recommendedTargetDir)\n : recommendedTargetDir;\n\n const previousTargetDir = await getConfiguredOrLegacyManagedPluginDir('claude');\n const migrating = Boolean(previousTargetDir && previousTargetDir !== targetDir);\n let previousInstall = previousTargetDir\n ? await inspectInstallPath('claude', previousTargetDir)\n : null;\n const previousMarketplace = previousTargetDir\n ? await detectClaudeMarketplaceForTarget(previousTargetDir)\n : null;\n const legacyTargetDir = getDefaultPluginTargetDir('claude');\n const legacyInstall = targetDir !== legacyTargetDir\n ? await inspectInstallPath('claude', legacyTargetDir)\n : null;\n\n if (migrating && previousInstall?.exists && !previousInstall.managed) {\n throw new Error(\n `${previousTargetDir} exists but is not a Syntaur-managed install. Remove it manually before changing the Claude plugin location.`,\n );\n }\n\n if (\n targetDir !== legacyTargetDir &&\n legacyInstall?.exists &&\n !legacyInstall.managed &&\n (!previousTargetDir || previousTargetDir !== legacyTargetDir)\n ) {\n console.warn(\n `Warning: ${legacyTargetDir} already exists and is not a Syntaur-managed install. Syntaur will use ${targetDir} instead.`,\n );\n }\n\n if (migrating && previousInstall?.exists && previousInstall.managed && isInteractiveTerminal()) {\n const confirmed = await confirmPrompt(\n `Move the Claude Code plugin from ${previousTargetDir} to ${targetDir} and remove the old install?`,\n true,\n );\n if (!confirmed) {\n throw new Error('Install cancelled.');\n }\n }\n\n const result = await installManagedPlugin({\n pluginKind: 'claude',\n force: options.force,\n link: options.link,\n targetDir,\n });\n const currentMarketplace = await detectClaudeMarketplaceForTarget(result.targetDir);\n if (currentMarketplace) {\n await ensureClaudeMarketplaceEntry({\n marketplaceRootDir: currentMarketplace.rootDir,\n manifestPath: currentMarketplace.manifestPath,\n pluginTargetDir: result.targetDir,\n expectedExistingPluginTargetDir:\n previousMarketplace && previousMarketplace.manifestPath === currentMarketplace.manifestPath\n ? previousTargetDir\n : null,\n });\n }\n await updateIntegrationConfig({ claudePluginDir: result.targetDir });\n\n if (\n previousMarketplace &&\n previousTargetDir &&\n (!currentMarketplace || currentMarketplace.manifestPath !== previousMarketplace.manifestPath)\n ) {\n const removedMarketplaceEntry = await removeClaudeMarketplaceEntry({\n manifestPath: previousMarketplace.manifestPath,\n marketplaceRootDir: previousMarketplace.rootDir,\n pluginTargetDir: previousTargetDir,\n });\n if (removedMarketplaceEntry.removed) {\n console.log(`Removed previous Claude marketplace entry from ${removedMarketplaceEntry.manifestPath}`);\n }\n }\n\n if (migrating && previousInstall?.exists && previousInstall.managed && previousTargetDir) {\n const removed = await uninstallManagedPlugin('claude', previousTargetDir);\n if (removed.removed) {\n console.log(`Removed previous Claude Code plugin from ${removed.targetDir}`);\n }\n previousInstall = null;\n }\n\n console.log('Installed Syntaur plugin:');\n console.log(` target: ${result.targetDir}`);\n console.log(` source: ${result.sourceDir}`);\n console.log(` mode: ${result.mode}`);\n if (currentMarketplace) {\n console.log(` marketplace: ${currentMarketplace.manifestPath}`);\n }\n console.log('\\nThe plugin is now available in Claude Code.');\n console.log(' Skills: /grab-assignment, /plan-assignment, /complete-assignment');\n console.log(' Background: syntaur-protocol (auto-invoked)');\n console.log(' Hook: write boundary enforcement (PreToolUse)');\n}\n","import {\n cp,\n readdir,\n symlink,\n lstat,\n readFile,\n readlink,\n rm,\n unlink,\n writeFile,\n} from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { basename, dirname, isAbsolute, relative, resolve } from 'node:path';\nimport { readConfig } from './config.js';\nimport { ensureDir, fileExists } from './fs.js';\nimport { findPackageRoot } from './package-root.js';\nimport { expandHome, syntaurRoot } from './paths.js';\n\nexport type PluginKind = 'claude' | 'codex';\nexport type InstallMode = 'copy' | 'link';\n\nconst INSTALL_MARKER_FILENAME = '.syntaur-install.json';\n\ninterface PackageManifest {\n name: string;\n version: string;\n}\n\ninterface ClaudePluginManifest {\n name?: string;\n description?: string;\n version?: string;\n author?: string | {\n name?: string;\n email?: string;\n };\n}\n\ninterface InstallMetadata {\n packageName: string;\n packageVersion: string;\n pluginKind: PluginKind;\n installMode: InstallMode;\n installedAt: string;\n}\n\nexport interface ManagedPluginInstallOptions {\n pluginKind: PluginKind;\n force?: boolean;\n link?: boolean;\n targetDir?: string;\n}\n\nexport interface PluginPaths {\n packageRoot: string;\n sourceDir: string;\n targetDir: string;\n}\n\nexport interface ManagedPluginInstallResult {\n targetDir: string;\n sourceDir: string;\n mode: InstallMode;\n changed: boolean;\n}\n\nexport interface MarketplaceEntry {\n name: string;\n source: {\n source: 'local';\n path: string;\n };\n policy: {\n installation: 'AVAILABLE';\n authentication: 'ON_INSTALL';\n };\n category: 'Coding';\n}\n\nexport interface MarketplaceFile {\n name: string;\n interface?: {\n displayName?: string;\n };\n plugins: MarketplaceEntry[];\n}\n\ninterface InstallStatus {\n exists: boolean;\n managed: boolean;\n installMode?: InstallMode;\n manifestName?: string;\n symlinkTarget?: string;\n}\n\nexport interface ManagedInstallInspection {\n exists: boolean;\n managed: boolean;\n installMode?: InstallMode;\n targetDir: string;\n}\n\nexport interface EnsureMarketplaceEntryOptions {\n marketplacePath: string;\n pluginTargetDir: string;\n expectedExistingPluginTargetDir?: string | null;\n}\n\nexport interface RemoveMarketplaceEntryOptions {\n marketplacePath: string;\n pluginTargetDir?: string;\n expectedSourcePath?: string | null;\n}\n\ninterface ClaudeMarketplacePluginEntry {\n name?: string;\n description?: string;\n version?: string;\n author?: {\n name?: string;\n email?: string;\n };\n source?: string;\n category?: string;\n}\n\ninterface ClaudeMarketplaceFile {\n name?: string;\n plugins: ClaudeMarketplacePluginEntry[];\n [key: string]: unknown;\n}\n\ninterface KnownClaudeMarketplaceRecord {\n source?: {\n source?: string;\n path?: string;\n };\n installLocation?: string;\n}\n\ninterface ClaudeMarketplaceCandidate {\n name: string;\n rootDir: string;\n manifestPath: string;\n active: boolean;\n hasSyntaur: boolean;\n isUserPlugins: boolean;\n isDirectorySource: boolean;\n}\n\nexport interface ClaudeMarketplaceLocation {\n name: string;\n rootDir: string;\n manifestPath: string;\n targetDir: string;\n}\n\nfunction getPluginRelativePath(pluginKind: PluginKind): string {\n return pluginKind === 'claude' ? 'platforms/claude-code' : 'platforms/codex';\n}\n\nfunction getPluginManifestRelativePath(pluginKind: PluginKind): string {\n return pluginKind === 'claude'\n ? '.claude-plugin/plugin.json'\n : '.codex-plugin/plugin.json';\n}\n\nexport function getDefaultPluginTargetDir(pluginKind: PluginKind): string {\n const home = homedir();\n return pluginKind === 'claude'\n ? resolve(home, '.claude', 'plugins', 'syntaur')\n : resolve(home, 'plugins', 'syntaur');\n}\n\nexport function getDefaultMarketplacePath(): string {\n return resolve(homedir(), '.agents', 'plugins', 'marketplace.json');\n}\n\nfunction getClaudeMarketplacesRoot(): string {\n return resolve(homedir(), '.claude', 'plugins', 'marketplaces');\n}\n\nfunction getClaudeKnownMarketplacesPath(): string {\n return resolve(homedir(), '.claude', 'plugins', 'known_marketplaces.json');\n}\n\nfunction getClaudeInstalledPluginsPath(): string {\n return resolve(homedir(), '.claude', 'plugins', 'installed_plugins.json');\n}\n\nfunction getInstallMarkerPath(targetDir: string): string {\n return resolve(targetDir, INSTALL_MARKER_FILENAME);\n}\n\nasync function readPackageManifest(packageRoot: string): Promise<PackageManifest> {\n const raw = await readFile(resolve(packageRoot, 'package.json'), 'utf-8');\n return JSON.parse(raw) as PackageManifest;\n}\n\nasync function readJsonFileIfExists<T>(pathValue: string): Promise<T | null> {\n if (!(await fileExists(pathValue))) {\n return null;\n }\n\n try {\n const raw = await readFile(pathValue, 'utf-8');\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n}\n\nasync function readClaudePluginManifest(\n pluginDir: string,\n): Promise<ClaudePluginManifest> {\n return (\n await readJsonFileIfExists<ClaudePluginManifest>(\n resolve(pluginDir, '.claude-plugin', 'plugin.json'),\n )\n ) ?? {};\n}\n\nasync function readPluginManifestName(\n targetDir: string,\n pluginKind: PluginKind,\n): Promise<string | undefined> {\n const manifestPath = resolve(targetDir, getPluginManifestRelativePath(pluginKind));\n if (!(await fileExists(manifestPath))) {\n return undefined;\n }\n\n const raw = await readFile(manifestPath, 'utf-8');\n const parsed = JSON.parse(raw) as { name?: string };\n return parsed.name;\n}\n\nasync function readInstallMetadata(targetDir: string): Promise<InstallMetadata | null> {\n const markerPath = getInstallMarkerPath(targetDir);\n if (!(await fileExists(markerPath))) {\n return null;\n }\n\n try {\n const raw = await readFile(markerPath, 'utf-8');\n return JSON.parse(raw) as InstallMetadata;\n } catch {\n return null;\n }\n}\n\nasync function getInstallStatus(\n targetDir: string,\n pluginKind: PluginKind,\n): Promise<InstallStatus> {\n if (!(await fileExists(targetDir))) {\n return { exists: false, managed: false };\n }\n\n const info = await lstat(targetDir);\n if (info.isSymbolicLink()) {\n const symlinkTarget = await readlink(targetDir);\n const resolvedTarget = resolve(dirname(targetDir), symlinkTarget);\n const manifestName = await readPluginManifestName(resolvedTarget, pluginKind);\n return {\n exists: true,\n managed: manifestName === 'syntaur',\n installMode: 'link',\n manifestName,\n symlinkTarget: resolvedTarget,\n };\n }\n\n const metadata = await readInstallMetadata(targetDir);\n const manifestName = await readPluginManifestName(targetDir, pluginKind);\n return {\n exists: true,\n managed: Boolean(\n (metadata && metadata.pluginKind === pluginKind && metadata.packageName === 'syntaur') ||\n manifestName === 'syntaur',\n ),\n installMode: metadata?.installMode ?? 'copy',\n manifestName,\n };\n}\n\nasync function writeInstallMetadata(\n targetDir: string,\n pluginKind: PluginKind,\n installMode: InstallMode,\n packageManifest: PackageManifest,\n): Promise<void> {\n const metadata: InstallMetadata = {\n packageName: packageManifest.name,\n packageVersion: packageManifest.version,\n pluginKind,\n installMode,\n installedAt: new Date().toISOString(),\n };\n\n await writeFile(\n getInstallMarkerPath(targetDir),\n `${JSON.stringify(metadata, null, 2)}\\n`,\n 'utf-8',\n );\n}\n\nasync function installCopy(\n paths: PluginPaths,\n pluginKind: PluginKind,\n): Promise<void> {\n await ensureDir(dirname(paths.targetDir));\n await cp(paths.sourceDir, paths.targetDir, { recursive: true });\n const packageManifest = await readPackageManifest(paths.packageRoot);\n await writeInstallMetadata(paths.targetDir, pluginKind, 'copy', packageManifest);\n}\n\nasync function installLink(paths: PluginPaths): Promise<void> {\n await ensureDir(dirname(paths.targetDir));\n await rm(paths.targetDir, { recursive: true, force: true });\n await ensureDir(dirname(paths.targetDir));\n await symlink(resolve(paths.sourceDir), paths.targetDir, 'dir');\n}\n\nasync function removeInstallMarker(targetDir: string): Promise<void> {\n const markerPath = getInstallMarkerPath(targetDir);\n if (await fileExists(markerPath)) {\n await unlink(markerPath).catch(() => {});\n }\n}\n\nexport function normalizeAbsoluteInstallPath(pathValue: string, label: string): string {\n const expanded = expandHome(pathValue.trim());\n if (!isAbsolute(expanded)) {\n throw new Error(`${label} must be an absolute path.`);\n }\n return resolve(expanded);\n}\n\nexport async function resolvePluginPaths(\n pluginKind: PluginKind,\n targetDir?: string,\n): Promise<PluginPaths> {\n const packageRoot = await findPackageRoot(getPluginRelativePath(pluginKind));\n return {\n packageRoot,\n sourceDir: resolve(packageRoot, getPluginRelativePath(pluginKind)),\n targetDir: targetDir ?? getDefaultPluginTargetDir(pluginKind),\n };\n}\n\nasync function readInstalledClaudeMarketplaceNames(): Promise<Set<string>> {\n const parsed = await readJsonFileIfExists<{\n plugins?: Record<string, unknown>;\n }>(getClaudeInstalledPluginsPath());\n\n const names = new Set<string>();\n for (const key of Object.keys(parsed?.plugins ?? {})) {\n const atIndex = key.lastIndexOf('@');\n if (atIndex > 0 && atIndex < key.length - 1) {\n names.add(key.slice(atIndex + 1));\n }\n }\n return names;\n}\n\nasync function readKnownClaudeMarketplaceRecords(): Promise<Map<string, KnownClaudeMarketplaceRecord>> {\n const parsed = await readJsonFileIfExists<Record<string, KnownClaudeMarketplaceRecord>>(\n getClaudeKnownMarketplacesPath(),\n );\n return new Map(Object.entries(parsed ?? {}));\n}\n\nasync function readClaudeMarketplaceFile(\n manifestPath: string,\n): Promise<ClaudeMarketplaceFile> {\n const parsed = await readJsonFileIfExists<ClaudeMarketplaceFile>(manifestPath);\n if (!parsed || typeof parsed !== 'object') {\n return { plugins: [] };\n }\n\n return {\n ...parsed,\n plugins: Array.isArray(parsed.plugins)\n ? parsed.plugins.filter(\n (plugin): plugin is ClaudeMarketplacePluginEntry =>\n typeof plugin === 'object' && plugin !== null,\n )\n : [],\n };\n}\n\nasync function writeClaudeMarketplaceFile(\n manifestPath: string,\n marketplace: ClaudeMarketplaceFile,\n): Promise<void> {\n await ensureDir(dirname(manifestPath));\n await writeFile(manifestPath, `${JSON.stringify(marketplace, null, 2)}\\n`, 'utf-8');\n}\n\nfunction buildClaudeMarketplaceSourcePath(\n pluginTargetDir: string,\n marketplaceRootDir: string,\n): string {\n const relPath = relative(marketplaceRootDir, pluginTargetDir).replaceAll('\\\\', '/');\n if (relPath === '') {\n return '.';\n }\n return relPath.startsWith('.') ? relPath : `./${relPath}`;\n}\n\nfunction normalizeClaudeAuthor(\n author: ClaudePluginManifest['author'],\n): { name?: string; email?: string } | undefined {\n if (!author) {\n return undefined;\n }\n if (typeof author === 'string') {\n return { name: author };\n }\n return {\n name: author.name,\n email: author.email,\n };\n}\n\nfunction buildClaudeMarketplaceEntry(\n pluginTargetDir: string,\n marketplaceRootDir: string,\n manifest: ClaudePluginManifest,\n): ClaudeMarketplacePluginEntry {\n return {\n name: manifest.name ?? 'syntaur',\n description: manifest.description,\n version: manifest.version,\n author: normalizeClaudeAuthor(manifest.author),\n source: buildClaudeMarketplaceSourcePath(pluginTargetDir, marketplaceRootDir),\n category: 'development',\n };\n}\n\nfunction scoreClaudeMarketplaceCandidate(candidate: ClaudeMarketplaceCandidate): number {\n if (candidate.hasSyntaur) {\n return 100;\n }\n if (candidate.active && candidate.isUserPlugins) {\n return 90;\n }\n if (candidate.isUserPlugins) {\n return 80;\n }\n if (candidate.active && candidate.isDirectorySource) {\n return 70;\n }\n if (candidate.isDirectorySource) {\n return 60;\n }\n if (candidate.active) {\n return 50;\n }\n return 10;\n}\n\nasync function listClaudeMarketplaceCandidates(): Promise<ClaudeMarketplaceCandidate[]> {\n const rootDir = getClaudeMarketplacesRoot();\n if (!(await fileExists(rootDir))) {\n return [];\n }\n\n const [knownMarketplaces, activeMarketplaceNames, entries] = await Promise.all([\n readKnownClaudeMarketplaceRecords(),\n readInstalledClaudeMarketplaceNames(),\n readdir(rootDir, { withFileTypes: true }),\n ]);\n\n const candidates: ClaudeMarketplaceCandidate[] = [];\n const seen = new Set<string>();\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n const candidateRoot = resolve(rootDir, entry.name);\n const manifestPath = resolve(candidateRoot, '.claude-plugin', 'marketplace.json');\n if (!(await fileExists(manifestPath))) {\n continue;\n }\n\n const parsed = await readClaudeMarketplaceFile(manifestPath);\n const candidateName = typeof parsed.name === 'string' && parsed.name.trim() !== ''\n ? parsed.name\n : entry.name;\n const known = knownMarketplaces.get(candidateName);\n const hasSyntaur = parsed.plugins.some(\n (plugin) => plugin.name === 'syntaur' && typeof plugin.source === 'string',\n );\n const isUserPlugins = candidateName === 'user-plugins' || entry.name === 'user-plugins';\n\n candidates.push({\n name: candidateName,\n rootDir: candidateRoot,\n manifestPath,\n active: activeMarketplaceNames.has(candidateName),\n hasSyntaur,\n isUserPlugins,\n isDirectorySource: known?.source?.source === 'directory' || isUserPlugins,\n });\n seen.add(candidateRoot);\n }\n\n for (const [candidateName, known] of knownMarketplaces.entries()) {\n const installLocation = known.installLocation;\n if (!installLocation) {\n continue;\n }\n\n const candidateRoot = resolve(expandHome(installLocation));\n if (seen.has(candidateRoot)) {\n continue;\n }\n\n const manifestPath = resolve(candidateRoot, '.claude-plugin', 'marketplace.json');\n if (!(await fileExists(manifestPath))) {\n continue;\n }\n\n const parsed = await readClaudeMarketplaceFile(manifestPath);\n candidates.push({\n name: typeof parsed.name === 'string' && parsed.name.trim() !== ''\n ? parsed.name\n : candidateName,\n rootDir: candidateRoot,\n manifestPath,\n active: activeMarketplaceNames.has(candidateName),\n hasSyntaur: parsed.plugins.some(\n (plugin) => plugin.name === 'syntaur' && typeof plugin.source === 'string',\n ),\n isUserPlugins: candidateName === 'user-plugins',\n isDirectorySource: known.source?.source === 'directory' || candidateName === 'user-plugins',\n });\n }\n\n return candidates.sort((a, b) => scoreClaudeMarketplaceCandidate(b) - scoreClaudeMarketplaceCandidate(a));\n}\n\nasync function getPreferredClaudeMarketplace(): Promise<ClaudeMarketplaceLocation | null> {\n const candidate = (await listClaudeMarketplaceCandidates())[0];\n if (!candidate) {\n return null;\n }\n\n return {\n name: candidate.name,\n rootDir: candidate.rootDir,\n manifestPath: candidate.manifestPath,\n targetDir: resolve(candidate.rootDir, 'plugins', 'syntaur'),\n };\n}\n\nexport async function detectClaudeMarketplaceForTarget(\n targetDir: string,\n): Promise<ClaudeMarketplaceLocation | null> {\n const normalizedTargetDir = normalizeAbsoluteInstallPath(targetDir, 'Claude plugin target');\n const pluginsDir = dirname(normalizedTargetDir);\n if (basename(pluginsDir) !== 'plugins') {\n return null;\n }\n\n const rootDir = dirname(pluginsDir);\n const manifestPath = resolve(rootDir, '.claude-plugin', 'marketplace.json');\n if (!(await fileExists(manifestPath))) {\n return null;\n }\n\n const marketplace = await readClaudeMarketplaceFile(manifestPath);\n const name = typeof marketplace.name === 'string' && marketplace.name.trim() !== ''\n ? marketplace.name\n : basename(rootDir);\n\n return {\n name,\n rootDir,\n manifestPath,\n targetDir: normalizedTargetDir,\n };\n}\n\nasync function findManagedClaudeMarketplacePluginDir(): Promise<string | null> {\n const marketplaces = await listClaudeMarketplaceCandidates();\n for (const marketplace of marketplaces) {\n const targetDir = resolve(marketplace.rootDir, 'plugins', 'syntaur');\n const status = await getInstallStatus(targetDir, 'claude');\n if (status.exists && status.managed) {\n return targetDir;\n }\n }\n return null;\n}\n\nexport async function ensureClaudeMarketplaceEntry(options: {\n marketplaceRootDir: string;\n manifestPath: string;\n pluginTargetDir: string;\n expectedExistingPluginTargetDir?: string | null;\n}): Promise<{ manifestPath: string; changed: boolean }> {\n const marketplaceRootDir = normalizeAbsoluteInstallPath(\n options.marketplaceRootDir,\n 'Claude marketplace root',\n );\n const manifestPath = normalizeAbsoluteInstallPath(\n options.manifestPath,\n 'Claude marketplace manifest',\n );\n const pluginTargetDir = normalizeAbsoluteInstallPath(\n options.pluginTargetDir,\n 'Claude plugin target',\n );\n const marketplace = await readClaudeMarketplaceFile(manifestPath);\n const pluginManifest = await readClaudePluginManifest(pluginTargetDir);\n const entry = buildClaudeMarketplaceEntry(pluginTargetDir, marketplaceRootDir, pluginManifest);\n const expectedSource = entry.source;\n const existingIndex = marketplace.plugins.findIndex(\n (plugin) => plugin.name === entry.name && plugin.source === expectedSource,\n );\n\n if (existingIndex >= 0) {\n const existing = marketplace.plugins[existingIndex];\n const changed = JSON.stringify(existing) !== JSON.stringify(entry);\n if (changed) {\n marketplace.plugins[existingIndex] = entry;\n await writeClaudeMarketplaceFile(manifestPath, marketplace);\n }\n return { manifestPath, changed };\n }\n\n const conflictingIndex = marketplace.plugins.findIndex((plugin) => plugin.name === entry.name);\n if (conflictingIndex >= 0) {\n const expectedExistingSource = options.expectedExistingPluginTargetDir\n ? buildClaudeMarketplaceSourcePath(\n normalizeAbsoluteInstallPath(\n options.expectedExistingPluginTargetDir,\n 'Existing Claude plugin target',\n ),\n marketplaceRootDir,\n )\n : null;\n const existing = marketplace.plugins[conflictingIndex];\n if (expectedExistingSource && existing.source === expectedExistingSource) {\n marketplace.plugins[conflictingIndex] = entry;\n await writeClaudeMarketplaceFile(manifestPath, marketplace);\n return { manifestPath, changed: true };\n }\n\n throw new Error(\n `Marketplace entry \"${entry.name}\" already exists with different settings in ${manifestPath}. Remove it manually before installing the Claude plugin.`,\n );\n }\n\n marketplace.plugins.push(entry);\n await writeClaudeMarketplaceFile(manifestPath, marketplace);\n return { manifestPath, changed: true };\n}\n\nexport async function removeClaudeMarketplaceEntry(options: {\n manifestPath: string;\n marketplaceRootDir: string;\n pluginTargetDir?: string;\n}): Promise<{ manifestPath: string; removed: boolean }> {\n const manifestPath = normalizeAbsoluteInstallPath(\n options.manifestPath,\n 'Claude marketplace manifest',\n );\n if (!(await fileExists(manifestPath))) {\n return { manifestPath, removed: false };\n }\n\n const marketplaceRootDir = normalizeAbsoluteInstallPath(\n options.marketplaceRootDir,\n 'Claude marketplace root',\n );\n const expectedSource = options.pluginTargetDir\n ? buildClaudeMarketplaceSourcePath(\n normalizeAbsoluteInstallPath(options.pluginTargetDir, 'Claude plugin target'),\n marketplaceRootDir,\n )\n : null;\n const marketplace = await readClaudeMarketplaceFile(manifestPath);\n const beforeCount = marketplace.plugins.length;\n marketplace.plugins = marketplace.plugins.filter((plugin) => {\n if (plugin.name !== 'syntaur') {\n return true;\n }\n if (!expectedSource) {\n return false;\n }\n return plugin.source !== expectedSource;\n });\n\n if (marketplace.plugins.length === beforeCount) {\n return { manifestPath, removed: false };\n }\n\n await writeClaudeMarketplaceFile(manifestPath, marketplace);\n return { manifestPath, removed: true };\n}\n\nexport async function inspectInstallPath(\n pluginKind: PluginKind,\n targetDir: string,\n): Promise<ManagedInstallInspection> {\n const normalizedTarget = normalizeAbsoluteInstallPath(targetDir, `${getPluginDisplayName(pluginKind)} target`);\n const status = await getInstallStatus(normalizedTarget, pluginKind);\n return {\n exists: status.exists,\n managed: status.managed,\n installMode: status.installMode,\n targetDir: normalizedTarget,\n };\n}\n\nexport async function installManagedPlugin(\n options: ManagedPluginInstallOptions,\n): Promise<ManagedPluginInstallResult> {\n const {\n pluginKind,\n force = false,\n link = false,\n targetDir = getDefaultPluginTargetDir(pluginKind),\n } = options;\n const normalizedTargetDir = normalizeAbsoluteInstallPath(\n targetDir,\n `${getPluginDisplayName(pluginKind)} target`,\n );\n const paths = await resolvePluginPaths(pluginKind, normalizedTargetDir);\n\n if (!(await fileExists(paths.sourceDir))) {\n throw new Error(`Plugin source directory not found at ${paths.sourceDir}.`);\n }\n\n const desiredMode: InstallMode = link ? 'link' : 'copy';\n const existing = await getInstallStatus(paths.targetDir, pluginKind);\n\n if (existing.exists && !existing.managed) {\n throw new Error(\n `${paths.targetDir} already exists and is not a Syntaur-managed install. Remove it manually before installing Syntaur there.`,\n );\n }\n\n if (\n desiredMode === 'link' &&\n existing.exists &&\n existing.installMode === 'link' &&\n existing.symlinkTarget === resolve(paths.sourceDir) &&\n !force\n ) {\n return {\n targetDir: paths.targetDir,\n sourceDir: paths.sourceDir,\n mode: desiredMode,\n changed: false,\n };\n }\n\n if (existing.exists) {\n await rm(paths.targetDir, { recursive: true, force: true });\n }\n\n if (desiredMode === 'link') {\n await installLink(paths);\n } else {\n await installCopy(paths, pluginKind);\n }\n\n return {\n targetDir: paths.targetDir,\n sourceDir: paths.sourceDir,\n mode: desiredMode,\n changed: true,\n };\n}\n\nexport function buildMarketplaceSourcePath(\n pluginTargetDir: string,\n marketplacePath: string,\n): string {\n const relPath = relative(dirname(marketplacePath), pluginTargetDir).replaceAll('\\\\', '/');\n if (relPath === '') {\n return '.';\n }\n return relPath.startsWith('.') ? relPath : `./${relPath}`;\n}\n\nexport function buildSyntaurMarketplaceEntry(\n pluginTargetDir: string,\n marketplacePath: string,\n): MarketplaceEntry {\n return {\n name: 'syntaur',\n source: {\n source: 'local',\n path: buildMarketplaceSourcePath(pluginTargetDir, marketplacePath),\n },\n policy: {\n installation: 'AVAILABLE',\n authentication: 'ON_INSTALL',\n },\n category: 'Coding',\n };\n}\n\nexport async function readMarketplaceFile(marketplacePath: string): Promise<MarketplaceFile> {\n if (!(await fileExists(marketplacePath))) {\n return {\n name: 'local',\n interface: { displayName: 'Local Plugins' },\n plugins: [],\n };\n }\n\n const raw = await readFile(marketplacePath, 'utf-8');\n const parsed = JSON.parse(raw) as Partial<MarketplaceFile>;\n return {\n name: parsed.name ?? 'local',\n interface: parsed.interface ?? { displayName: 'Local Plugins' },\n plugins: Array.isArray(parsed.plugins)\n ? (parsed.plugins as MarketplaceEntry[])\n : [],\n };\n}\n\nexport async function writeMarketplaceFile(\n marketplacePath: string,\n marketplace: MarketplaceFile,\n): Promise<void> {\n await ensureDir(dirname(marketplacePath));\n await writeFile(marketplacePath, `${JSON.stringify(marketplace, null, 2)}\\n`, 'utf-8');\n}\n\nexport async function hasAnySyntaurMarketplaceEntry(marketplacePath: string): Promise<boolean> {\n const marketplace = await readMarketplaceFile(marketplacePath);\n return marketplace.plugins.some(\n (plugin) => plugin.name === 'syntaur' && plugin.source?.source === 'local',\n );\n}\n\nexport async function hasSyntaurMarketplaceEntry(\n marketplacePath: string,\n pluginTargetDir: string,\n): Promise<boolean> {\n const marketplace = await readMarketplaceFile(marketplacePath);\n const expectedPath = buildMarketplaceSourcePath(pluginTargetDir, marketplacePath);\n return marketplace.plugins.some(\n (plugin) =>\n plugin.name === 'syntaur' &&\n plugin.source?.source === 'local' &&\n plugin.source?.path === expectedPath,\n );\n}\n\nexport async function ensureMarketplaceEntry(\n options: EnsureMarketplaceEntryOptions,\n): Promise<{ marketplacePath: string; changed: boolean }> {\n const marketplacePath = normalizeAbsoluteInstallPath(\n options.marketplacePath,\n 'Codex marketplace path',\n );\n const pluginTargetDir = normalizeAbsoluteInstallPath(\n options.pluginTargetDir,\n 'Codex plugin target',\n );\n const marketplace = await readMarketplaceFile(marketplacePath);\n const entry = buildSyntaurMarketplaceEntry(pluginTargetDir, marketplacePath);\n const existingIndex = marketplace.plugins.findIndex(\n (plugin) =>\n plugin.name === entry.name &&\n plugin.source?.source === entry.source.source &&\n plugin.source?.path === entry.source.path,\n );\n\n if (existingIndex >= 0) {\n return { marketplacePath, changed: false };\n }\n\n const conflictingIndex = marketplace.plugins.findIndex((plugin) => plugin.name === entry.name);\n if (conflictingIndex >= 0) {\n const existing = marketplace.plugins[conflictingIndex];\n const expectedExistingPath = options.expectedExistingPluginTargetDir\n ? buildMarketplaceSourcePath(\n normalizeAbsoluteInstallPath(\n options.expectedExistingPluginTargetDir,\n 'Existing Codex plugin target',\n ),\n marketplacePath,\n )\n : null;\n\n if (\n existing.source?.source === 'local' &&\n expectedExistingPath &&\n existing.source?.path === expectedExistingPath\n ) {\n marketplace.plugins[conflictingIndex] = entry;\n await writeMarketplaceFile(marketplacePath, marketplace);\n return { marketplacePath, changed: true };\n }\n\n throw new Error(\n `Marketplace entry \"${entry.name}\" already exists with different settings in ${marketplacePath}. Remove it manually before installing the Codex plugin.`,\n );\n }\n\n marketplace.plugins.push(entry);\n await writeMarketplaceFile(marketplacePath, marketplace);\n return { marketplacePath, changed: true };\n}\n\nfunction isDefaultMarketplaceShell(marketplace: MarketplaceFile): boolean {\n return (\n marketplace.name === 'local' &&\n (marketplace.interface?.displayName ?? 'Local Plugins') === 'Local Plugins'\n );\n}\n\nexport async function removeMarketplaceEntry(\n options: RemoveMarketplaceEntryOptions,\n): Promise<{ marketplacePath: string; removed: boolean }> {\n const marketplacePath = normalizeAbsoluteInstallPath(\n options.marketplacePath,\n 'Codex marketplace path',\n );\n\n if (!(await fileExists(marketplacePath))) {\n return { marketplacePath, removed: false };\n }\n\n const expectedSourcePath = options.expectedSourcePath ?? (\n options.pluginTargetDir\n ? buildMarketplaceSourcePath(\n normalizeAbsoluteInstallPath(options.pluginTargetDir, 'Codex plugin target'),\n marketplacePath,\n )\n : null\n );\n const marketplace = await readMarketplaceFile(marketplacePath);\n const beforeCount = marketplace.plugins.length;\n marketplace.plugins = marketplace.plugins.filter((plugin) => {\n if (plugin.name !== 'syntaur' || plugin.source?.source !== 'local') {\n return true;\n }\n if (!expectedSourcePath) {\n return false;\n }\n return plugin.source.path !== expectedSourcePath;\n });\n\n if (marketplace.plugins.length === beforeCount) {\n return { marketplacePath, removed: false };\n }\n\n if (marketplace.plugins.length === 0 && isDefaultMarketplaceShell(marketplace)) {\n await rm(marketplacePath, { force: true });\n return { marketplacePath, removed: true };\n }\n\n await writeMarketplaceFile(marketplacePath, marketplace);\n return { marketplacePath, removed: true };\n}\n\nexport async function uninstallManagedPlugin(\n pluginKind: PluginKind,\n targetDir: string = getDefaultPluginTargetDir(pluginKind),\n): Promise<{ removed: boolean; targetDir: string }> {\n const normalizedTarget = normalizeAbsoluteInstallPath(\n targetDir,\n `${getPluginDisplayName(pluginKind)} target`,\n );\n const existing = await getInstallStatus(normalizedTarget, pluginKind);\n\n if (!existing.exists) {\n return { removed: false, targetDir: normalizedTarget };\n }\n\n if (!existing.managed) {\n throw new Error(\n `${normalizedTarget} exists but is not a Syntaur-managed install. Remove it manually if you want to replace it.`,\n );\n }\n\n await removeInstallMarker(normalizedTarget);\n await rm(normalizedTarget, { recursive: true, force: true });\n return { removed: true, targetDir: normalizedTarget };\n}\n\nexport async function getConfiguredOrLegacyManagedPluginDir(\n pluginKind: PluginKind,\n): Promise<string | null> {\n const config = await readConfig();\n const configuredPath = pluginKind === 'claude'\n ? config.integrations.claudePluginDir\n : config.integrations.codexPluginDir;\n if (configuredPath) {\n return configuredPath;\n }\n\n const defaultTarget = getDefaultPluginTargetDir(pluginKind);\n const status = await getInstallStatus(defaultTarget, pluginKind);\n if (status.exists && status.managed) {\n return defaultTarget;\n }\n\n if (pluginKind === 'claude') {\n return findManagedClaudeMarketplacePluginDir();\n }\n\n return null;\n}\n\nexport async function getConfiguredOrLegacyMarketplacePath(): Promise<string | null> {\n const config = await readConfig();\n if (config.integrations.codexMarketplacePath) {\n return config.integrations.codexMarketplacePath;\n }\n\n const defaultMarketplacePath = getDefaultMarketplacePath();\n return (await hasAnySyntaurMarketplaceEntry(defaultMarketplacePath))\n ? defaultMarketplacePath\n : null;\n}\n\nexport async function recommendPluginTargetDir(pluginKind: PluginKind): Promise<string> {\n const configuredOrManaged = await getConfiguredOrLegacyManagedPluginDir(pluginKind);\n\n if (pluginKind !== 'claude') {\n return configuredOrManaged ?? getDefaultPluginTargetDir(pluginKind);\n }\n\n const preferredMarketplace = await getPreferredClaudeMarketplace();\n const legacyTarget = getDefaultPluginTargetDir('claude');\n\n if (configuredOrManaged) {\n return configuredOrManaged === legacyTarget && preferredMarketplace\n ? preferredMarketplace.targetDir\n : configuredOrManaged;\n }\n\n return preferredMarketplace?.targetDir ?? legacyTarget;\n}\n\nexport async function recommendMarketplacePath(): Promise<string> {\n const configuredOrManaged = await getConfiguredOrLegacyMarketplacePath();\n return configuredOrManaged ?? getDefaultMarketplacePath();\n}\n\nexport async function isSyntaurDataInstalled(): Promise<boolean> {\n return fileExists(resolve(syntaurRoot(), 'config.md'));\n}\n\nexport function isSyntaurDataInstalledSync(): boolean {\n return existsSync(resolve(syntaurRoot(), 'config.md'));\n}\n\nexport async function removeSyntaurData(): Promise<void> {\n await rm(syntaurRoot(), { recursive: true, force: true });\n}\n\nexport async function getConfiguredProjectDir(): Promise<string | null> {\n if (!(await fileExists(resolve(syntaurRoot(), 'config.md')))) {\n return null;\n }\n\n return (await readConfig()).defaultProjectDir;\n}\n\nexport function getPluginDisplayName(pluginKind: PluginKind): string {\n return pluginKind === 'claude' ? 'Claude Code plugin' : 'Codex plugin';\n}\n\nexport function getPluginInstallCommand(pluginKind: PluginKind): string {\n return pluginKind === 'claude'\n ? 'syntaur install-plugin'\n : 'syntaur install-codex-plugin';\n}\n\nexport function getPluginTargetLabel(pluginKind: PluginKind): string {\n return basename(getDefaultPluginTargetDir(pluginKind));\n}\n","import { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { fileExists } from './fs.js';\n\nexport async function findPackageRoot(\n expectedRelativePath: string,\n): Promise<string> {\n let currentDir = dirname(fileURLToPath(import.meta.url));\n\n while (true) {\n const candidate = resolve(currentDir, expectedRelativePath);\n if (await fileExists(candidate)) {\n return currentDir;\n }\n\n const parentDir = resolve(currentDir, '..');\n if (parentDir === currentDir) {\n throw new Error(\n `Could not locate package root containing ${expectedRelativePath}.`,\n );\n }\n currentDir = parentDir;\n }\n}\n","import { stdin as input, stdout as output } from 'node:process';\nimport { createInterface } from 'node:readline/promises';\n\nexport function isInteractiveTerminal(): boolean {\n return Boolean(input.isTTY && output.isTTY);\n}\n\nexport function parseConfirmAnswer(\n answer: string,\n defaultValue: boolean = false,\n): boolean | null {\n const normalized = answer.trim().toLowerCase();\n if (normalized === '') {\n return defaultValue;\n }\n if (normalized === 'y' || normalized === 'yes') {\n return true;\n }\n if (normalized === 'n' || normalized === 'no') {\n return false;\n }\n return null;\n}\n\nexport async function confirmPrompt(\n question: string,\n defaultValue: boolean = false,\n): Promise<boolean> {\n if (!isInteractiveTerminal()) {\n throw new Error('Interactive confirmation requires a TTY.');\n }\n\n const suffix = defaultValue ? ' [Y/n] ' : ' [y/N] ';\n const rl = createInterface({ input, output });\n\n try {\n while (true) {\n const answer = await rl.question(`${question}${suffix}`);\n const parsed = parseConfirmAnswer(answer, defaultValue);\n if (parsed !== null) {\n return parsed;\n }\n console.log('Enter y, yes, n, no, or press Enter for the default.');\n }\n } finally {\n rl.close();\n }\n}\n\nexport async function textPrompt(\n question: string,\n defaultValue?: string,\n): Promise<string> {\n if (!isInteractiveTerminal()) {\n throw new Error('Interactive input requires a TTY.');\n }\n\n const suffix = defaultValue !== undefined ? ` [${defaultValue}] ` : ' ';\n const rl = createInterface({ input, output });\n\n try {\n const answer = (await rl.question(`${question}${suffix}`)).trim();\n if (answer === '' && defaultValue !== undefined) {\n return defaultValue;\n }\n return answer;\n } finally {\n rl.close();\n }\n}\n","import { updateIntegrationConfig } from '../utils/config.js';\nimport {\n ensureMarketplaceEntry,\n getConfiguredOrLegacyManagedPluginDir,\n getConfiguredOrLegacyMarketplacePath,\n hasSyntaurMarketplaceEntry,\n inspectInstallPath,\n installManagedPlugin,\n normalizeAbsoluteInstallPath,\n recommendMarketplacePath,\n recommendPluginTargetDir,\n removeMarketplaceEntry,\n uninstallManagedPlugin,\n} from '../utils/install.js';\nimport { confirmPrompt, isInteractiveTerminal, textPrompt } from '../utils/prompt.js';\n\nexport interface InstallCodexPluginOptions {\n force?: boolean;\n link?: boolean;\n targetDir?: string;\n marketplacePath?: string;\n promptForTarget?: boolean;\n}\n\nasync function promptForInstallPath(\n question: string,\n recommendedPath: string,\n): Promise<string> {\n while (true) {\n const answer = await textPrompt(question, recommendedPath);\n try {\n return normalizeAbsoluteInstallPath(answer, question);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n }\n }\n}\n\nexport async function installCodexPluginCommand(\n options: InstallCodexPluginOptions,\n): Promise<void> {\n const promptForTarget = Boolean(\n options.promptForTarget !== false &&\n isInteractiveTerminal() &&\n (!options.targetDir || !options.marketplacePath),\n );\n const recommendedTargetDir = await recommendPluginTargetDir('codex');\n const recommendedMarketplacePath = await recommendMarketplacePath();\n const targetDir = options.targetDir\n ? normalizeAbsoluteInstallPath(options.targetDir, 'Codex plugin target')\n : promptForTarget\n ? await promptForInstallPath('Codex plugin directory', recommendedTargetDir)\n : recommendedTargetDir;\n const marketplacePath = options.marketplacePath\n ? normalizeAbsoluteInstallPath(options.marketplacePath, 'Codex marketplace path')\n : promptForTarget\n ? await promptForInstallPath('Codex marketplace file path', recommendedMarketplacePath)\n : recommendedMarketplacePath;\n\n const previousTargetDir = await getConfiguredOrLegacyManagedPluginDir('codex');\n const previousMarketplacePath = await getConfiguredOrLegacyMarketplacePath();\n const pluginPathChanged = Boolean(previousTargetDir && previousTargetDir !== targetDir);\n const marketplacePathChanged = Boolean(\n previousMarketplacePath && previousMarketplacePath !== marketplacePath,\n );\n const previousInstall = previousTargetDir\n ? await inspectInstallPath('codex', previousTargetDir)\n : null;\n const previousMarketplaceEntryExists = Boolean(\n previousMarketplacePath &&\n previousTargetDir &&\n await hasSyntaurMarketplaceEntry(previousMarketplacePath, previousTargetDir),\n );\n\n if (pluginPathChanged && previousInstall?.exists && !previousInstall.managed) {\n throw new Error(\n `${previousTargetDir} exists but is not a Syntaur-managed install. Remove it manually before changing the Codex plugin location.`,\n );\n }\n\n if (\n (pluginPathChanged || marketplacePathChanged) &&\n (previousInstall?.exists || previousMarketplaceEntryExists) &&\n isInteractiveTerminal()\n ) {\n const confirmed = await confirmPrompt(\n `Move the Codex integration to ${targetDir} and ${marketplacePath} and remove the previous Syntaur-managed integration?`,\n true,\n );\n if (!confirmed) {\n throw new Error('Install cancelled.');\n }\n }\n\n const result = await installManagedPlugin({\n pluginKind: 'codex',\n force: options.force,\n link: options.link,\n targetDir,\n });\n const marketplace = await ensureMarketplaceEntry({\n marketplacePath,\n pluginTargetDir: result.targetDir,\n expectedExistingPluginTargetDir:\n previousMarketplacePath === marketplacePath ? previousTargetDir : null,\n });\n await updateIntegrationConfig({\n codexPluginDir: result.targetDir,\n codexMarketplacePath: marketplace.marketplacePath,\n });\n\n if (pluginPathChanged && previousInstall?.exists && previousInstall.managed && previousTargetDir) {\n const removed = await uninstallManagedPlugin('codex', previousTargetDir);\n if (removed.removed) {\n console.log(`Removed previous Codex plugin from ${removed.targetDir}`);\n }\n }\n\n if (\n previousMarketplacePath &&\n previousTargetDir &&\n previousMarketplacePath !== marketplace.marketplacePath\n ) {\n const removedMarketplace = await removeMarketplaceEntry({\n marketplacePath: previousMarketplacePath,\n pluginTargetDir: previousTargetDir,\n });\n if (removedMarketplace.removed) {\n console.log(`Removed previous Codex marketplace entry from ${removedMarketplace.marketplacePath}`);\n }\n }\n\n console.log('Installed Syntaur Codex plugin:');\n console.log(` target: ${result.targetDir}`);\n console.log(` source: ${result.sourceDir}`);\n console.log(` mode: ${result.mode}`);\n console.log(` marketplace: ${marketplace.marketplacePath}`);\n console.log('\\nThe plugin is now available to Codex.');\n console.log(\n ' Skills: syntaur-protocol, create-project, create-assignment, grab-assignment, plan-assignment, complete-assignment, track-session',\n );\n console.log(' Command: /track-session');\n console.log(' Hooks: write boundary enforcement, session cleanup');\n}\n","import { execSync } from 'node:child_process';\nimport { initCommand } from './init.js';\nimport { dashboardCommand, findAvailablePort } from './dashboard.js';\nimport { installPluginCommand } from './install-plugin.js';\nimport { installCodexPluginCommand } from './install-codex-plugin.js';\nimport { isSyntaurDataInstalled, getPluginInstallCommand } from '../utils/install.js';\nimport { confirmPrompt, isInteractiveTerminal } from '../utils/prompt.js';\nimport { updateOnboardingConfig } from '../utils/config.js';\n\nfunction isCliInstalled(command: string): boolean {\n try {\n execSync(`which ${command}`, { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface SetupOptions {\n yes?: boolean;\n claude?: boolean;\n codex?: boolean;\n dashboard?: boolean;\n claudeDir?: string;\n codexDir?: string;\n codexMarketplacePath?: string;\n}\n\nfunction printNonInteractiveSetupHelp(): void {\n console.error('Syntaur setup needs confirmation for optional steps when no TTY is available.');\n console.error('Run one of these commands instead:');\n console.error(' npx syntaur@latest setup --yes');\n console.error(' npx syntaur@latest setup --yes --claude');\n console.error(' npx syntaur@latest setup --yes --codex');\n console.error(` npx syntaur@latest setup --yes --dashboard`);\n}\n\nexport async function setupCommand(options: SetupOptions): Promise<void> {\n const initialized = await isSyntaurDataInstalled();\n const interactive = isInteractiveTerminal();\n\n if (!initialized) {\n if (!interactive && !options.yes && !options.claude && !options.codex && !options.dashboard) {\n printNonInteractiveSetupHelp();\n throw new Error('Non-interactive setup requires --yes and any optional follow-up flags.');\n }\n\n await initCommand({});\n } else {\n console.log('Syntaur is already initialized.');\n }\n\n let installClaude = Boolean(options.claude);\n let installCodex = Boolean(options.codex);\n let launchDashboard = Boolean(options.dashboard);\n\n if (interactive && !options.yes) {\n if (!options.claude) {\n const claudeAvailable = isCliInstalled('claude');\n if (!claudeAvailable) {\n console.log('Claude Code CLI not detected. Install it from https://claude.ai/download');\n installClaude = await confirmPrompt('Install the Claude Code plugin anyway?', false);\n } else {\n installClaude = await confirmPrompt('Install the Claude Code plugin?');\n }\n }\n if (!options.codex) {\n const codexAvailable = isCliInstalled('codex');\n if (!codexAvailable) {\n console.log('Codex CLI not detected. Install it from https://platform.openai.com/docs/codex');\n installCodex = await confirmPrompt('Install the Codex plugin anyway?', false);\n } else {\n installCodex = await confirmPrompt('Install the Codex plugin?');\n }\n }\n if (!options.dashboard) {\n launchDashboard = await confirmPrompt('Launch the dashboard now?', true);\n }\n }\n\n if (installClaude) {\n await installPluginCommand({\n targetDir: options.claudeDir,\n promptForTarget: !options.yes,\n });\n } else {\n console.log(`Skip Claude plugin for now. Install later with: ${getPluginInstallCommand('claude')}`);\n }\n\n if (installCodex) {\n await installCodexPluginCommand({\n targetDir: options.codexDir,\n marketplacePath: options.codexMarketplacePath,\n promptForTarget: !options.yes,\n });\n } else {\n console.log(`Skip Codex plugin for now. Install later with: ${getPluginInstallCommand('codex')}`);\n }\n\n if (launchDashboard) {\n const preferredPort = 4800;\n const port = await findAvailablePort(preferredPort);\n if (port === null) {\n throw new Error(\n `Could not find an available dashboard port starting at ${preferredPort}. Run \"syntaur dashboard --port <number>\" to choose one manually.`,\n );\n }\n if (port !== preferredPort) {\n console.log(`Port ${preferredPort} is busy. Launching the dashboard on port ${port} instead.`);\n }\n await updateOnboardingConfig({ completed: true });\n await dashboardCommand({\n port: String(port),\n dev: false,\n serverOnly: false,\n apiOnly: false,\n open: true,\n });\n return;\n }\n\n await updateOnboardingConfig({ completed: true });\n\n if (!initialized) {\n console.log('\\nNext steps:');\n console.log(' npx syntaur@latest create-project \"My First Project\"');\n console.log(' npx syntaur@latest dashboard');\n }\n}\n","import { resolve } from 'node:path';\nimport {\n detectClaudeMarketplaceForTarget,\n getConfiguredOrLegacyManagedPluginDir,\n getConfiguredOrLegacyMarketplacePath,\n getConfiguredProjectDir,\n removeClaudeMarketplaceEntry,\n removeSyntaurData,\n removeMarketplaceEntry,\n uninstallManagedPlugin,\n} from '../utils/install.js';\nimport { syntaurRoot } from '../utils/paths.js';\nimport { confirmPrompt } from '../utils/prompt.js';\n\nexport interface UninstallOptions {\n claude?: boolean;\n codex?: boolean;\n data?: boolean;\n all?: boolean;\n yes?: boolean;\n}\n\nfunction expandTargets(options: UninstallOptions): {\n claude: boolean;\n codex: boolean;\n data: boolean;\n} {\n if (options.all) {\n return { claude: true, codex: true, data: true };\n }\n\n if (options.claude || options.codex || options.data) {\n return {\n claude: Boolean(options.claude),\n codex: Boolean(options.codex),\n data: Boolean(options.data),\n };\n }\n\n return { claude: true, codex: true, data: false };\n}\n\nexport async function uninstallCommand(options: UninstallOptions): Promise<void> {\n const targets = expandTargets(options);\n const actions: string[] = [];\n\n if (targets.claude) actions.push('Claude Code plugin');\n if (targets.codex) actions.push('Codex plugin');\n if (targets.data) actions.push('~/.syntaur data');\n\n if (actions.length === 0) {\n console.log('Nothing selected for uninstall.');\n return;\n }\n\n if (!options.yes) {\n const confirmed = await confirmPrompt(\n `Remove: ${actions.join(', ')}?`,\n false,\n );\n if (!confirmed) {\n console.log('Uninstall cancelled.');\n return;\n }\n }\n\n if (targets.claude) {\n const claudeTargetDir = await getConfiguredOrLegacyManagedPluginDir('claude');\n const claudeMarketplace = claudeTargetDir\n ? await detectClaudeMarketplaceForTarget(claudeTargetDir)\n : null;\n const result = await uninstallManagedPlugin(\n 'claude',\n claudeTargetDir ?? undefined,\n );\n console.log(\n result.removed\n ? `Removed Claude Code plugin from ${result.targetDir}`\n : `Claude Code plugin not installed at ${result.targetDir}`,\n );\n if (claudeMarketplace) {\n const removedMarketplaceEntry = await removeClaudeMarketplaceEntry({\n manifestPath: claudeMarketplace.manifestPath,\n marketplaceRootDir: claudeMarketplace.rootDir,\n pluginTargetDir: claudeTargetDir ?? undefined,\n });\n if (removedMarketplaceEntry.removed) {\n console.log(`Removed Claude marketplace entry from ${removedMarketplaceEntry.manifestPath}`);\n }\n }\n }\n\n if (targets.codex) {\n const codexTargetDir = await getConfiguredOrLegacyManagedPluginDir('codex');\n const marketplacePath = await getConfiguredOrLegacyMarketplacePath();\n const result = await uninstallManagedPlugin(\n 'codex',\n codexTargetDir ?? undefined,\n );\n console.log(\n result.removed\n ? `Removed Codex plugin from ${result.targetDir}`\n : `Codex plugin not installed at ${result.targetDir}`,\n );\n\n if (marketplacePath) {\n const marketplace = await removeMarketplaceEntry({\n marketplacePath,\n pluginTargetDir: codexTargetDir ?? undefined,\n });\n if (marketplace.removed) {\n console.log(`Removed Codex marketplace entry from ${marketplace.marketplacePath}`);\n }\n }\n }\n\n if (targets.data) {\n const configuredProjectDir = await getConfiguredProjectDir();\n await removeSyntaurData();\n console.log(`Removed ${syntaurRoot()}`);\n\n if (\n configuredProjectDir &&\n resolve(configuredProjectDir) !== resolve(syntaurRoot(), 'projects')\n ) {\n console.warn(\n `Warning: config.md pointed to an external project directory (${configuredProjectDir}). That directory was not removed automatically.`,\n );\n }\n }\n\n if (!targets.data) {\n console.log('User project data in ~/.syntaur was kept.');\n }\n}\n","import { resolve } from 'node:path';\nimport { expandHome } from '../utils/paths.js';\nimport { fileExists, writeFileSafe, writeFileForce } from '../utils/fs.js';\nimport { readConfig } from '../utils/config.js';\nimport { isValidSlug } from '../utils/slug.js';\nimport { renderCursorProtocol, renderCursorAssignment } from '../templates/cursor-rules.js';\nimport { renderCodexAgents } from '../templates/codex-agents.js';\nimport { renderOpenCodeConfig } from '../templates/opencode-config.js';\n\nconst SUPPORTED_FRAMEWORKS = ['cursor', 'codex', 'opencode'] as const;\ntype Framework = (typeof SUPPORTED_FRAMEWORKS)[number];\n\nexport interface SetupAdapterOptions {\n project: string;\n assignment: string;\n force?: boolean;\n dir?: string;\n}\n\nexport async function setupAdapterCommand(\n framework: string,\n options: SetupAdapterOptions,\n): Promise<void> {\n // Validate framework\n if (!SUPPORTED_FRAMEWORKS.includes(framework as Framework)) {\n throw new Error(\n `Unsupported framework \"${framework}\". Supported: ${SUPPORTED_FRAMEWORKS.join(', ')}`,\n );\n }\n\n // Validate required options\n if (!options.project) {\n throw new Error('--project <slug> is required.');\n }\n if (!options.assignment) {\n throw new Error('--assignment <slug> is required.');\n }\n if (!isValidSlug(options.project)) {\n throw new Error(\n `Invalid project slug \"${options.project}\". Slugs must be lowercase, hyphen-separated, with no special characters.`,\n );\n }\n if (!isValidSlug(options.assignment)) {\n throw new Error(\n `Invalid assignment slug \"${options.assignment}\". Slugs must be lowercase, hyphen-separated, with no special characters.`,\n );\n }\n\n // Resolve paths\n const config = await readConfig();\n const baseDir = options.dir\n ? expandHome(options.dir)\n : config.defaultProjectDir;\n const projectDir = resolve(baseDir, options.project);\n const assignmentDir = resolve(\n projectDir,\n 'assignments',\n options.assignment,\n );\n\n // Verify project exists\n const projectMdPath = resolve(projectDir, 'project.md');\n if (!(await fileExists(projectDir)) || !(await fileExists(projectMdPath))) {\n throw new Error(\n `Project \"${options.project}\" not found at ${projectDir}.`,\n );\n }\n\n // Verify assignment exists\n const assignmentMdPath = resolve(assignmentDir, 'assignment.md');\n if (!(await fileExists(assignmentDir)) || !(await fileExists(assignmentMdPath))) {\n throw new Error(\n `Assignment \"${options.assignment}\" not found at ${assignmentDir}.`,\n );\n }\n\n const cwd = process.cwd();\n const writtenFiles: string[] = [];\n const skippedFiles: string[] = [];\n\n const rendererParams = {\n projectSlug: options.project,\n assignmentSlug: options.assignment,\n projectDir,\n assignmentDir,\n };\n\n async function writeAdapterFile(filePath: string, content: string): Promise<void> {\n if (options.force) {\n await writeFileForce(filePath, content);\n writtenFiles.push(filePath);\n } else {\n if (await writeFileSafe(filePath, content)) {\n writtenFiles.push(filePath);\n } else {\n skippedFiles.push(filePath);\n }\n }\n }\n\n if (framework === 'cursor') {\n const protocolPath = resolve(cwd, '.cursor', 'rules', 'syntaur-protocol.mdc');\n const assignmentPath = resolve(cwd, '.cursor', 'rules', 'syntaur-assignment.mdc');\n\n await writeAdapterFile(protocolPath, renderCursorProtocol());\n await writeAdapterFile(assignmentPath, renderCursorAssignment(rendererParams));\n } else if (framework === 'codex' || framework === 'opencode') {\n const agentsPath = resolve(cwd, 'AGENTS.md');\n await writeAdapterFile(agentsPath, renderCodexAgents(rendererParams));\n\n if (framework === 'opencode') {\n const configPath = resolve(cwd, 'opencode.json');\n await writeAdapterFile(configPath, renderOpenCodeConfig({ projectDir }));\n }\n }\n\n // Output results\n if (writtenFiles.length > 0) {\n console.log(`Generated ${framework} adapter files:`);\n for (const f of writtenFiles) {\n console.log(` ${f}`);\n }\n }\n if (skippedFiles.length > 0) {\n console.log(`Skipped (already exist, use --force to overwrite):`);\n for (const f of skippedFiles) {\n console.log(` ${f}`);\n }\n }\n if (writtenFiles.length === 0 && skippedFiles.length > 0) {\n console.log(`No files written. All target files already exist.`);\n }\n}\n","import { resolve } from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { expandHome } from '../utils/paths.js';\nimport { fileExists } from '../utils/fs.js';\nimport { readConfig } from '../utils/config.js';\nimport { initSessionDb } from '../dashboard/session-db.js';\nimport { appendSession } from '../dashboard/agent-sessions.js';\nimport type { AgentSessionStatus } from '../dashboard/types.js';\n\nexport interface TrackSessionOptions {\n project?: string;\n assignment?: string;\n agent: string;\n sessionId?: string;\n path?: string;\n dir?: string;\n description?: string;\n}\n\nexport async function trackSessionCommand(\n options: TrackSessionOptions,\n): Promise<void> {\n if (!options.agent) {\n throw new Error('--agent <name> is required.');\n }\n\n if (options.project) {\n const config = await readConfig();\n const baseDir = options.dir\n ? expandHome(options.dir)\n : config.defaultProjectDir;\n const projectDir = resolve(baseDir, options.project);\n\n if (!(await fileExists(projectDir))) {\n throw new Error(\n `Project \"${options.project}\" not found at ${projectDir}.`,\n );\n }\n }\n\n // Ensure the session database is initialized\n initSessionDb();\n\n const sessionId = options.sessionId || randomUUID();\n\n await appendSession('', {\n projectSlug: options.project || null,\n assignmentSlug: options.assignment || null,\n agent: options.agent,\n sessionId,\n started: new Date().toISOString(),\n status: 'active' as AgentSessionStatus,\n path: options.path || process.cwd(),\n description: options.description || null,\n });\n\n if (options.project && options.assignment) {\n console.log(`Registered agent session ${sessionId} for ${options.assignment} in ${options.project}.`);\n } else {\n console.log(`Registered standalone agent session ${sessionId}.`);\n }\n}\n","import { readConfig } from '../utils/config.js';\nimport type { AgentType } from '../tui/launch.js';\n\nexport async function browseCommand(options: { agent: AgentType }): Promise<void> {\n const config = await readConfig();\n const projectsDir = config.defaultProjectDir;\n const agent = options.agent;\n\n const { render } = await import('ink');\n const React = await import('react');\n const { App } = await import('../tui/App.js');\n const { launchAgent } = await import('../tui/launch.js');\n\n let unmount: (() => void) | null = null;\n\n const onLaunch = async (launchOpts: { projectsDir: string; projectSlug: string; assignmentSlug: string }) => {\n if (unmount) {\n unmount();\n unmount = null;\n }\n await launchAgent({ ...launchOpts, agent });\n };\n\n const instance = render(\n React.createElement(App, { projectsDir, onLaunch }),\n );\n unmount = instance.unmount;\n\n await instance.waitUntilExit();\n}\n","import { resolve } from 'node:path';\nimport { slugify, isValidSlug } from '../utils/slug.js';\nimport { nowTimestamp } from '../utils/timestamp.js';\nimport { playbooksDir as getPlaybooksDir } from '../utils/paths.js';\nimport { ensureDir, writeFileSafe, fileExists } from '../utils/fs.js';\nimport { renderPlaybook } from '../templates/playbook.js';\nimport { rebuildPlaybookManifest } from '../utils/playbooks.js';\n\nexport interface CreatePlaybookOptions {\n slug?: string;\n description?: string;\n}\n\nexport async function createPlaybookCommand(\n name: string,\n options: CreatePlaybookOptions,\n): Promise<string> {\n if (!name.trim()) {\n throw new Error('Playbook name cannot be empty.');\n }\n\n const slug = options.slug || slugify(name);\n if (!isValidSlug(slug)) {\n throw new Error(\n `Invalid slug \"${slug}\". Slugs must be lowercase, hyphen-separated, with no special characters.`,\n );\n }\n\n const dir = getPlaybooksDir();\n await ensureDir(dir);\n\n const filePath = resolve(dir, `${slug}.md`);\n if (await fileExists(filePath)) {\n throw new Error(\n `Playbook \"${slug}\" already exists at ${filePath}\\nUse --slug to specify a different slug.`,\n );\n }\n\n const timestamp = nowTimestamp();\n const description = options.description || '';\n\n const content = renderPlaybook({ slug, name, description, timestamp });\n await writeFileSafe(filePath, content);\n await rebuildPlaybookManifest(dir);\n\n console.log(`Created playbook \"${name}\" at ${filePath}`);\n console.log(` Slug: ${slug}`);\n\n return slug;\n}\n","import { readdir, readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { playbooksDir as getPlaybooksDir } from '../utils/paths.js';\nimport { fileExists } from '../utils/fs.js';\nimport { parsePlaybook } from '../dashboard/parser.js';\n\nexport async function listPlaybooksCommand(): Promise<void> {\n const dir = getPlaybooksDir();\n\n if (!(await fileExists(dir))) {\n console.log('No playbooks directory found. Run \"syntaur init\" first.');\n return;\n }\n\n const entries = await readdir(dir, { withFileTypes: true });\n const mdFiles = entries.filter((e) => e.isFile() && e.name.endsWith('.md') && !e.name.startsWith('_') && e.name !== 'manifest.md');\n\n if (mdFiles.length === 0) {\n console.log('No playbooks found. Create one with \"syntaur create-playbook <name>\".');\n return;\n }\n\n console.log(`Found ${mdFiles.length} playbook(s):\\n`);\n console.log(`${'Slug'.padEnd(30)} ${'Name'.padEnd(30)} Description`);\n console.log(`${'─'.repeat(30)} ${'─'.repeat(30)} ${'─'.repeat(40)}`);\n\n for (const entry of mdFiles) {\n const filePath = resolve(dir, entry.name);\n const raw = await readFile(filePath, 'utf-8');\n const parsed = parsePlaybook(raw);\n\n const slug = parsed.slug || entry.name.replace(/\\.md$/, '');\n const name = parsed.name || slug;\n const desc = parsed.description || '';\n\n console.log(`${slug.padEnd(30)} ${name.padEnd(30)} ${desc}`);\n }\n}\n","import { Command } from 'commander';\nimport { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { todosDir as getTodosDir } from '../utils/paths.js';\nimport {\n readChecklist,\n writeChecklist,\n readLog,\n appendLogEntry,\n generateUniqueId,\n computeCounts,\n checklistPath,\n logPath,\n archivePath,\n} from '../todos/parser.js';\nimport { ensureDir, fileExists, writeFileForce } from '../utils/fs.js';\nimport type { TodoItem, LogEntry } from '../todos/types.js';\n\nconst WORKSPACE_REGEX = /^[a-z0-9_][a-z0-9-]*$/;\n\nfunction resolveWorkspace(options: { workspace?: string; global?: boolean }): string {\n if (options.global) return '_global';\n if (options.workspace) {\n if (!WORKSPACE_REGEX.test(options.workspace)) {\n throw new Error(`Invalid workspace name: \"${options.workspace}\". Use lowercase letters, numbers, hyphens, and underscores.`);\n }\n return options.workspace;\n }\n return '_global';\n}\n\nfunction nowISO(): string {\n return new Date().toISOString();\n}\n\nexport const todoCommand = new Command('todo')\n .description('Manage quick todos');\n\ntodoCommand\n .command('add')\n .description('Add a new todo item')\n .argument('<description>', 'Todo description')\n .option('--tags <tags>', 'Comma-separated tags')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (description: string, options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n const existingIds = new Set(checklist.items.map((i) => i.id));\n const id = generateUniqueId(existingIds);\n const tags = options.tags ? options.tags.split(',').map((t: string) => t.trim()) : [];\n\n const item: TodoItem = { id, description, status: 'open', tags, session: null };\n checklist.items.push(item);\n await writeChecklist(todosPath, checklist);\n console.log(`Added todo [t:${id}]: ${description}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\ntodoCommand\n .command('list')\n .description('List todo items')\n .option('--tag <tag>', 'Filter by tag')\n .option('--status <status>', 'Filter by status (open|in_progress|completed|blocked)')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n let items = checklist.items;\n\n if (options.tag) {\n items = items.filter((i) => i.tags.includes(options.tag));\n }\n if (options.status) {\n items = items.filter((i) => i.status === options.status);\n }\n\n if (items.length === 0) {\n console.log('No todos found.');\n return;\n }\n\n const statusIcons: Record<string, string> = {\n open: '[ ]',\n in_progress: '[>]',\n completed: '[x]',\n blocked: '[!]',\n };\n\n for (const item of items) {\n const icon = statusIcons[item.status] || '[ ]';\n const tagStr = item.tags.length > 0 ? ` ${item.tags.map((t) => `#${t}`).join(' ')}` : '';\n console.log(`${icon} ${item.description}${tagStr} [t:${item.id}]`);\n }\n\n const counts = computeCounts(items);\n console.log(`\\n${counts.total} items: ${counts.open} open, ${counts.in_progress} active, ${counts.completed} done, ${counts.blocked} blocked`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\nfunction findItem(items: TodoItem[], id: string): TodoItem | undefined {\n return items.find((i) => i.id === id);\n}\n\ntodoCommand\n .command('start')\n .description('Mark a todo as in-progress')\n .argument('<id>', 'Todo short ID (e.g. a3f1)')\n .option('--session <session>', 'Session ID')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (id: string, options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n const item = findItem(checklist.items, id);\n if (!item) {\n console.error(`Todo [t:${id}] not found.`);\n process.exit(1);\n }\n if (item.status === 'in_progress') {\n console.error(`Todo [t:${id}] is already in progress (session: ${item.session}).`);\n process.exit(1);\n }\n item.status = 'in_progress';\n item.session = options.session || null;\n await writeChecklist(todosPath, checklist);\n console.log(`Started [t:${id}]: ${item.description}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\ntodoCommand\n .command('complete')\n .description('Mark a todo as completed')\n .argument('<id>', 'Todo short ID')\n .option('--summary <summary>', 'Completion summary')\n .option('--branch <branch>', 'Git branch name')\n .option('--session <session>', 'Session ID')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (id: string, options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n const item = findItem(checklist.items, id);\n if (!item) {\n console.error(`Todo [t:${id}] not found.`);\n process.exit(1);\n }\n item.status = 'completed';\n item.session = null;\n await writeChecklist(todosPath, checklist);\n\n const entry: LogEntry = {\n timestamp: nowISO(),\n itemIds: [id],\n items: item.description,\n session: options.session || null,\n branch: options.branch || null,\n summary: options.summary || 'Completed.',\n blockers: null,\n status: null,\n };\n await appendLogEntry(todosPath, workspace, entry);\n console.log(`Completed [t:${id}]: ${item.description}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\ntodoCommand\n .command('block')\n .description('Mark a todo as blocked')\n .argument('<id>', 'Todo short ID')\n .requiredOption('--reason <reason>', 'Blocking reason')\n .option('--session <session>', 'Session ID')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (id: string, options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n const item = findItem(checklist.items, id);\n if (!item) {\n console.error(`Todo [t:${id}] not found.`);\n process.exit(1);\n }\n item.status = 'blocked';\n item.session = null;\n await writeChecklist(todosPath, checklist);\n\n const entry: LogEntry = {\n timestamp: nowISO(),\n itemIds: [id],\n items: item.description,\n session: options.session || null,\n branch: null,\n summary: options.reason,\n blockers: options.reason,\n status: 'blocked',\n };\n await appendLogEntry(todosPath, workspace, entry);\n console.log(`Blocked [t:${id}]: ${item.description}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\ntodoCommand\n .command('unblock')\n .description('Return a blocked todo to open')\n .argument('<id>', 'Todo short ID')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (id: string, options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n const item = findItem(checklist.items, id);\n if (!item) {\n console.error(`Todo [t:${id}] not found.`);\n process.exit(1);\n }\n item.status = 'open';\n item.session = null;\n await writeChecklist(todosPath, checklist);\n console.log(`Unblocked [t:${id}]: ${item.description}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\ntodoCommand\n .command('delete')\n .description('Delete a todo item (no log entry)')\n .argument('<id>', 'Todo short ID')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (id: string, options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n const idx = checklist.items.findIndex((i) => i.id === id);\n if (idx === -1) {\n console.error(`Todo [t:${id}] not found.`);\n process.exit(1);\n }\n const item = checklist.items[idx];\n checklist.items.splice(idx, 1);\n await writeChecklist(todosPath, checklist);\n console.log(`Deleted [t:${id}]: ${item.description}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\ntodoCommand\n .command('edit')\n .description('Update a todo description')\n .argument('<id>', 'Todo short ID')\n .argument('<description>', 'New description')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (id: string, description: string, options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n const item = findItem(checklist.items, id);\n if (!item) {\n console.error(`Todo [t:${id}] not found.`);\n process.exit(1);\n }\n item.description = description;\n await writeChecklist(todosPath, checklist);\n console.log(`Updated [t:${id}]: ${description}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\ntodoCommand\n .command('tag')\n .description('Modify tags on a todo')\n .argument('<id>', 'Todo short ID')\n .option('--add <tags>', 'Tags to add (comma-separated)')\n .option('--remove <tags>', 'Tags to remove (comma-separated)')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (id: string, options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n const item = findItem(checklist.items, id);\n if (!item) {\n console.error(`Todo [t:${id}] not found.`);\n process.exit(1);\n }\n if (options.add) {\n const toAdd = options.add.split(',').map((t: string) => t.trim());\n for (const tag of toAdd) {\n if (!item.tags.includes(tag)) item.tags.push(tag);\n }\n }\n if (options.remove) {\n const toRemove = options.remove.split(',').map((t: string) => t.trim());\n item.tags = item.tags.filter((t) => !toRemove.includes(t));\n }\n await writeChecklist(todosPath, checklist);\n console.log(`Tags for [t:${id}]: ${item.tags.map((t) => `#${t}`).join(' ') || '(none)'}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\ntodoCommand\n .command('log')\n .description('Show log entries')\n .argument('[id]', 'Optional todo short ID to filter')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (id: string | undefined, options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const log = await readLog(todosPath, workspace);\n let entries = log.entries;\n\n if (id) {\n entries = entries.filter((e) => e.itemIds.includes(id));\n }\n\n if (entries.length === 0) {\n console.log('No log entries found.');\n return;\n }\n\n for (const entry of entries) {\n console.log(`\\n${entry.timestamp} — ${entry.itemIds.map((i) => `t:${i}`).join(', ')}`);\n if (entry.items) console.log(` Items: ${entry.items}`);\n if (entry.session) console.log(` Session: ${entry.session}`);\n if (entry.branch) console.log(` Branch: ${entry.branch}`);\n console.log(` Summary: ${entry.summary}`);\n if (entry.blockers) console.log(` Blockers: ${entry.blockers}`);\n }\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\ntodoCommand\n .command('archive')\n .description('Archive completed todos and their log entries')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n const log = await readLog(todosPath, workspace);\n\n const completedIds = new Set(\n checklist.items.filter((i) => i.status === 'completed').map((i) => i.id),\n );\n\n if (completedIds.size === 0) {\n console.log('No completed items to archive.');\n return;\n }\n\n // Collect log entries for completed items\n const toArchive = log.entries.filter((e) =>\n e.itemIds.every((id) => completedIds.has(id)),\n );\n\n // Write archive file\n const archFile = archivePath(todosPath, workspace, checklist.archiveInterval);\n await ensureDir(resolve(todosPath, 'archive'));\n let archContent = '';\n if (await fileExists(archFile)) {\n archContent = await readFile(archFile, 'utf-8');\n archContent = archContent.trimEnd() + '\\n\\n';\n } else {\n archContent = `---\\nworkspace: ${workspace}\\n---\\n\\n# Archive\\n\\n`;\n }\n\n // Add completed items as reference\n const completedItems = checklist.items.filter((i) => completedIds.has(i.id));\n for (const item of completedItems) {\n archContent += `- [x] ${item.description} ${item.tags.map((t) => `#${t}`).join(' ')} [t:${item.id}]\\n`;\n }\n archContent += '\\n';\n\n // Add log entries\n for (const entry of toArchive) {\n archContent += `### ${entry.timestamp} — ${entry.itemIds.map((i) => `t:${i}`).join(', ')}\\n`;\n if (entry.items) archContent += `**Items:** ${entry.items}\\n`;\n if (entry.session) archContent += `**Session:** ${entry.session}\\n`;\n if (entry.branch) archContent += `**Branch:** ${entry.branch}\\n`;\n if (entry.summary) archContent += `**Summary:** ${entry.summary}\\n`;\n if (entry.blockers) archContent += `**Blockers:** ${entry.blockers}\\n`;\n archContent += '\\n';\n }\n\n await writeFileForce(archFile, archContent);\n\n // Remove completed items from checklist\n checklist.items = checklist.items.filter((i) => !completedIds.has(i.id));\n await writeChecklist(todosPath, checklist);\n\n // Remove archived entries from log using Set identity (index-based)\n const archivedEntries = new Set(toArchive);\n log.entries = log.entries.filter((e) => !archivedEntries.has(e));\n // Rewrite the log\n if (log.entries.length > 0) {\n let logContent = `---\\nworkspace: ${workspace}\\n---\\n\\n# Todo Log\\n\\n`;\n for (const entry of log.entries) {\n logContent += `### ${entry.timestamp} — ${entry.itemIds.map((i) => `t:${i}`).join(', ')}\\n`;\n if (entry.items) logContent += `**Items:** ${entry.items}\\n`;\n if (entry.session) logContent += `**Session:** ${entry.session}\\n`;\n if (entry.branch) logContent += `**Branch:** ${entry.branch}\\n`;\n if (entry.summary) logContent += `**Summary:** ${entry.summary}\\n`;\n if (entry.blockers) logContent += `**Blockers:** ${entry.blockers}\\n`;\n logContent += '\\n';\n }\n await writeFileForce(logPath(todosPath, workspace), logContent);\n } else {\n await writeFileForce(logPath(todosPath, workspace), `---\\nworkspace: ${workspace}\\n---\\n\\n# Todo Log\\n`);\n }\n\n console.log(`Archived ${completedIds.size} completed items and ${toArchive.length} log entries.`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\ntodoCommand\n .command('promote')\n .description('Promote a todo to a full assignment')\n .argument('<id>', 'Todo short ID')\n .requiredOption('--project <slug>', 'Target project slug')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (id: string, options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n const item = findItem(checklist.items, id);\n if (!item) {\n console.error(`Todo [t:${id}] not found.`);\n process.exit(1);\n }\n\n // Mark as completed with promotion note\n item.status = 'completed';\n item.session = null;\n await writeChecklist(todosPath, checklist);\n\n const entry: LogEntry = {\n timestamp: nowISO(),\n itemIds: [id],\n items: item.description,\n session: null,\n branch: null,\n summary: `Promoted to assignment in project: ${options.project}`,\n blockers: null,\n status: null,\n };\n await appendLogEntry(todosPath, workspace, entry);\n\n console.log(`Promoted [t:${id}] to assignment in project \"${options.project}\".`);\n console.log(`Run: syntaur create-assignment --project ${options.project} \"${item.description}\"`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { updateBackupConfig } from '../utils/config.js';\nimport {\n backupToGithub,\n restoreFromGithub,\n getBackupStatus,\n parseCategoriesStrict,\n validateRepoUrl,\n VALID_CATEGORIES,\n type BackupCategory,\n} from '../utils/github-backup.js';\n\nfunction parseCategoryOption(csv: string | undefined): BackupCategory[] | undefined {\n if (!csv) return undefined;\n const parts = csv.split(',').map((s) => s.trim()).filter(Boolean);\n if (parts.length === 0) {\n throw new Error(`No categories provided. Valid: ${VALID_CATEGORIES.join(', ')}`);\n }\n return parseCategoriesStrict(parts);\n}\n\nexport const backupCommand = new Command('backup')\n .description('Back up Syntaur files to a GitHub repository');\n\nbackupCommand\n .command('push')\n .description('Push a backup to the configured GitHub repo')\n .option('--repo <url>', 'Override the configured repo URL')\n .option('--categories <list>', 'Comma-separated categories to back up (projects, playbooks, todos, servers, config)')\n .action(async (options) => {\n try {\n const result = await backupToGithub({\n repo: options.repo,\n categories: parseCategoryOption(options.categories),\n });\n console.log(result.message);\n if (result.committed) {\n console.log(` timestamp: ${result.timestamp}`);\n }\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\nbackupCommand\n .command('pull')\n .description('Restore Syntaur files from the configured GitHub repo')\n .option('--repo <url>', 'Override the configured repo URL')\n .option('--categories <list>', 'Comma-separated categories to restore')\n .action(async (options) => {\n try {\n const result = await restoreFromGithub({\n repo: options.repo,\n categories: parseCategoryOption(options.categories),\n });\n console.log(result.message);\n console.log(` timestamp: ${result.timestamp}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\nbackupCommand\n .command('config')\n .description('Show or update backup configuration')\n .option('--repo <url>', 'Set the backup repo URL')\n .option('--categories <list>', 'Set the default categories (comma-separated)')\n .action(async (options) => {\n try {\n const updates: { repo?: string; categories?: string } = {};\n\n if (options.repo !== undefined) {\n const trimmed = typeof options.repo === 'string' ? options.repo.trim() : options.repo;\n if (!validateRepoUrl(trimmed)) {\n throw new Error(`Invalid repo URL: \"${options.repo}\". Must start with https:// or git@.`);\n }\n updates.repo = trimmed;\n }\n if (options.categories !== undefined) {\n const parts = options.categories.split(',').map((s: string) => s.trim()).filter(Boolean);\n if (parts.length === 0) {\n throw new Error(`No categories provided. Valid: ${VALID_CATEGORIES.join(', ')}`);\n }\n const valid = parseCategoriesStrict(parts);\n updates.categories = valid.join(', ');\n }\n\n if (Object.keys(updates).length > 0) {\n await updateBackupConfig(updates);\n console.log('Backup configuration updated.');\n }\n\n const status = await getBackupStatus();\n console.log('\\nBackup configuration:');\n console.log(` repo: ${status.repo ?? '(not set)'}`);\n console.log(` categories: ${status.categories}`);\n console.log(` lastBackup: ${status.lastBackup ?? '(never)'}`);\n console.log(` lastRestore: ${status.lastRestore ?? '(never)'}`);\n if (status.locked) {\n console.log(' ⚠ locked: a backup operation is in progress or the lock is stale');\n }\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { runChecks } from '../utils/doctor/index.js';\nimport { renderHuman } from '../utils/doctor/output-human.js';\nimport { renderJson } from '../utils/doctor/output-json.js';\nimport { fileExists } from '../utils/fs.js';\nimport { syntaurRoot } from '../utils/paths.js';\n\ninterface DoctorOptions {\n json?: boolean;\n fix?: boolean;\n only?: string;\n verbose?: boolean;\n}\n\nexport const doctorCommand = new Command('doctor')\n .description('Diagnose Syntaur state and surface issues with suggested fixes')\n .option('--json', 'Emit structured JSON for programmatic consumers')\n .option('--fix', 'Apply safe auto-fixes (v1: no-op; reserved for future checks)')\n .option('--only <check-id>', 'Run only the check with this ID')\n .option('--verbose', 'Include passing checks in human output')\n .action(async (options: DoctorOptions) => {\n if (!(await fileExists(syntaurRoot()))) {\n const msg = '~/.syntaur/ does not exist. Run `syntaur init` first.';\n if (options.json) {\n process.stdout.write(\n JSON.stringify(\n {\n version: '1.0',\n error: msg,\n },\n null,\n 2,\n ) + '\\n',\n );\n } else {\n process.stderr.write(msg + '\\n');\n }\n process.exit(2);\n }\n\n try {\n const report = await runChecks({ only: options.only });\n\n if (options.json) {\n process.stdout.write(renderJson(report) + '\\n');\n } else {\n process.stdout.write(renderHuman(report, { verbose: options.verbose ?? false }) + '\\n');\n }\n\n if (options.fix && !options.json) {\n process.stdout.write(\n '\\nnote: --fix is reserved but has no auto-fixable remediations in v1.\\n',\n );\n }\n\n const hasError = report.summary.error > 0;\n process.exit(hasError ? 1 : 0);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (options.json) {\n process.stdout.write(JSON.stringify({ version: '1.0', error: msg }, null, 2) + '\\n');\n } else {\n process.stderr.write(`doctor itself failed: ${msg}\\n`);\n }\n process.exit(2);\n }\n });\n","import { fileURLToPath } from 'node:url';\nimport { readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { buildCheckContext, closeCheckContext } from './context.js';\nimport { allChecks } from './registry.js';\nimport type { Check, CheckContext, CheckResult, DoctorReport } from './types.js';\n\nexport interface RunOptions {\n only?: string;\n cwd?: string;\n}\n\nexport async function runChecks(options: RunOptions = {}): Promise<DoctorReport> {\n const ctx = await buildCheckContext(options.cwd);\n try {\n return await runWithContext(ctx, options);\n } finally {\n closeCheckContext(ctx);\n }\n}\n\nexport async function runWithContext(\n ctx: CheckContext,\n options: RunOptions = {},\n): Promise<DoctorReport> {\n const checks = filterChecks(allChecks(), options.only);\n const results: CheckResult[] = [];\n\n const rootCheck = checks.find((c) => c.id === 'env.syntaur-root-exists');\n if (rootCheck) {\n const res = await safeRun(rootCheck, ctx);\n results.push(...res);\n const rootPassed = res.every((r) => r.status !== 'error');\n if (!rootPassed) {\n for (const c of checks) {\n if (c.id === rootCheck.id) continue;\n results.push(skipped(c, 'skipped: ~/.syntaur/ not initialized'));\n }\n return finalize(results);\n }\n }\n\n for (const check of checks) {\n if (check.id === 'env.syntaur-root-exists') continue;\n const res = await safeRun(check, ctx);\n results.push(...res);\n }\n\n return finalize(results);\n}\n\nfunction filterChecks(checks: Check[], only: string | undefined): Check[] {\n if (!only) return checks;\n return checks.filter((c) => c.id === only);\n}\n\nasync function safeRun(check: Check, ctx: CheckContext): Promise<CheckResult[]> {\n try {\n const res = await check.run(ctx);\n return Array.isArray(res) ? res : [res];\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n return [\n {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'error',\n detail: `check threw: ${detail}`,\n autoFixable: false,\n },\n ];\n }\n}\n\nfunction skipped(check: Check, reason: string): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'skipped',\n detail: reason,\n autoFixable: false,\n };\n}\n\nasync function finalize(checks: CheckResult[]): Promise<DoctorReport> {\n const summary = { pass: 0, warn: 0, error: 0, skipped: 0 };\n for (const c of checks) summary[c.status]++;\n const version = (await readVersion()) ?? '0.0.0';\n return {\n version: '1.0',\n syntaurVersion: version,\n ranAt: new Date().toISOString(),\n summary,\n checks,\n };\n}\n\nasync function readVersion(): Promise<string | null> {\n try {\n const here = fileURLToPath(import.meta.url);\n let dir = dirname(here);\n for (let i = 0; i < 6; i++) {\n try {\n const raw = await readFile(join(dir, 'package.json'), 'utf-8');\n const parsed = JSON.parse(raw) as { version?: unknown };\n return typeof parsed.version === 'string' ? parsed.version : null;\n } catch {\n dir = dirname(dir);\n }\n }\n return null;\n } catch {\n return null;\n }\n}\n","import Database from 'better-sqlite3';\nimport { resolve } from 'node:path';\nimport { readConfig } from '../config.js';\nimport { syntaurRoot } from '../paths.js';\nimport { fileExists } from '../fs.js';\nimport type { CheckContext } from './types.js';\n\nexport async function buildCheckContext(cwd: string = process.cwd()): Promise<CheckContext> {\n const config = await readConfig();\n const root = syntaurRoot();\n const dbPath = resolve(root, 'syntaur.db');\n\n let db: Database.Database | null = null;\n let dbError: string | null = null;\n\n if (await fileExists(dbPath)) {\n try {\n db = new Database(dbPath, { readonly: true, fileMustExist: true });\n } catch (err) {\n dbError = err instanceof Error ? err.message : String(err);\n db = null;\n }\n } else {\n dbError = `database file not found at ${dbPath}`;\n }\n\n return {\n config,\n syntaurRoot: root,\n db,\n dbError,\n cwd,\n now: new Date(),\n };\n}\n\nexport function closeCheckContext(ctx: CheckContext): void {\n if (ctx.db) {\n try {\n ctx.db.close();\n } catch {\n // ignore — read-only close errors are not actionable\n }\n }\n}\n","import { resolve, isAbsolute } from 'node:path';\nimport { readFile, stat } from 'node:fs/promises';\nimport { fileURLToPath } from 'node:url';\nimport { dirname, join } from 'node:path';\nimport { fileExists } from '../../fs.js';\nimport { expandHome } from '../../paths.js';\nimport type { Check, CheckResult } from '../types.js';\n\nconst CATEGORY = 'env';\n\nconst syntaurRootExists: Check = {\n id: 'env.syntaur-root-exists',\n category: CATEGORY,\n title: '~/.syntaur/ directory exists',\n async run(ctx) {\n try {\n const s = await stat(ctx.syntaurRoot);\n if (!s.isDirectory()) {\n return err(this, `${ctx.syntaurRoot} exists but is not a directory`, [\n ctx.syntaurRoot,\n ]);\n }\n return pass(this);\n } catch {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `${ctx.syntaurRoot} does not exist — run 'syntaur init'`,\n affected: [ctx.syntaurRoot],\n remediation: {\n kind: 'manual',\n suggestion: 'Run `syntaur init` to create the Syntaur directory',\n command: 'syntaur init',\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n },\n};\n\nconst configValid: Check = {\n id: 'env.config-valid',\n category: CATEGORY,\n title: '~/.syntaur/config.md is valid',\n async run(ctx) {\n const configPath = resolve(ctx.syntaurRoot, 'config.md');\n if (!(await fileExists(configPath))) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: 'config.md not found; defaults are in use',\n affected: [configPath],\n remediation: {\n kind: 'manual',\n suggestion: 'Run `syntaur init` to regenerate config.md',\n command: 'syntaur init',\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n const content = await readFile(configPath, 'utf-8');\n const fmMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!fmMatch || fmMatch[1].trim() === '') {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: 'config.md has missing or empty frontmatter — readConfig() silently fell back to defaults',\n affected: [configPath],\n remediation: {\n kind: 'manual',\n suggestion: 'Restore config.md from backup or re-run `syntaur init --force`',\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n const fmBlock = fmMatch[1];\n\n const rawProjectDir = readTopLevelField(fmBlock, 'defaultProjectDir');\n if (rawProjectDir === null) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: 'config.md frontmatter is missing required field `defaultProjectDir`',\n affected: [configPath],\n remediation: {\n kind: 'manual',\n suggestion: 'Add `defaultProjectDir: <absolute-path>` to the frontmatter or re-run `syntaur init --force`',\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n\n const expanded = expandHome(rawProjectDir);\n if (!isAbsolute(expanded)) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `config.md defaultProjectDir \"${rawProjectDir}\" is not an absolute path — readConfig() silently fell back to the default`,\n affected: [configPath],\n remediation: {\n kind: 'manual',\n suggestion: 'Set `defaultProjectDir` to an absolute path (or a `~/`-prefixed path)',\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n\n if (ctx.config.defaultProjectDir !== expanded) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `readConfig() returned defaultProjectDir=\"${ctx.config.defaultProjectDir}\" but config.md declares \"${rawProjectDir}\" — a silent fallback occurred`,\n affected: [configPath],\n remediation: {\n kind: 'manual',\n suggestion: 'Fix the raw value in config.md so it parses correctly',\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n\n const nestedMismatch = detectNestedParseMismatch(fmBlock, ctx.config);\n if (nestedMismatch) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `config.md has ${nestedMismatch.field} in raw frontmatter but readConfig() did not load it (parser silently dropped the nested section)`,\n affected: [configPath],\n remediation: {\n kind: 'manual',\n suggestion: `Check indentation under the parent key for ${nestedMismatch.parent}:`,\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n\n return pass(this);\n },\n};\n\ninterface NestedMismatch {\n field: string;\n parent: string;\n}\n\nfunction detectNestedParseMismatch(\n fmBlock: string,\n config: {\n integrations: { claudePluginDir: string | null; codexPluginDir: string | null; codexMarketplacePath: string | null };\n backup: { repo: string | null; categories: string; lastBackup: string | null; lastRestore: string | null } | null;\n },\n): NestedMismatch | null {\n const integrationChecks: Array<[string, string | null]> = [\n ['integrations.claudePluginDir', config.integrations.claudePluginDir],\n ['integrations.codexPluginDir', config.integrations.codexPluginDir],\n ['integrations.codexMarketplacePath', config.integrations.codexMarketplacePath],\n ];\n for (const [dotted, parsedValue] of integrationChecks) {\n const raw = readNestedField(fmBlock, dotted);\n if (raw !== null && raw !== 'null' && raw !== '' && parsedValue === null) {\n return { field: dotted, parent: 'integrations' };\n }\n }\n\n const backupFields: Array<[string, string | null]> = [\n ['backup.repo', config.backup?.repo ?? null],\n ['backup.lastBackup', config.backup?.lastBackup ?? null],\n ['backup.lastRestore', config.backup?.lastRestore ?? null],\n ];\n for (const [dotted, parsedValue] of backupFields) {\n const raw = readNestedField(fmBlock, dotted);\n if (raw !== null && raw !== 'null' && raw !== '' && parsedValue === null) {\n return { field: dotted, parent: 'backup' };\n }\n }\n\n const rawCategories = readNestedField(fmBlock, 'backup.categories');\n if (rawCategories !== null && rawCategories !== '' && config.backup?.categories) {\n const rawNormalized = rawCategories.split(',').map((s) => s.trim()).filter(Boolean).join(',');\n const parsedNormalized = config.backup.categories.split(',').map((s) => s.trim()).filter(Boolean).join(',');\n if (rawNormalized && rawNormalized !== parsedNormalized) {\n return { field: 'backup.categories', parent: 'backup' };\n }\n }\n\n return null;\n}\n\nfunction readNestedField(fmBlock: string, dotted: string): string | null {\n const [parent, key] = dotted.split('.', 2);\n if (!parent || !key) return null;\n const lines = fmBlock.split('\\n');\n const parentPrefix = `${parent}:`;\n let inParent = false;\n for (const line of lines) {\n if (!inParent) {\n if (line.startsWith(parentPrefix)) {\n inParent = true;\n }\n continue;\n }\n const trimmed = line.trimStart();\n const indent = line.length - trimmed.length;\n if (trimmed === '') continue;\n if (indent === 0) {\n // Next top-level key — parent block ended\n return null;\n }\n const stripped = trimmed.startsWith('- ') ? trimmed.slice(2).trimStart() : trimmed;\n const colonIdx = stripped.indexOf(':');\n if (colonIdx < 0) continue;\n const lineKey = stripped.slice(0, colonIdx).trim();\n if (lineKey !== key) continue;\n const raw = stripped.slice(colonIdx + 1).trim();\n if ((raw.startsWith('\"') && raw.endsWith('\"')) || (raw.startsWith(\"'\") && raw.endsWith(\"'\"))) {\n return raw.slice(1, -1);\n }\n return raw;\n }\n return null;\n}\n\nconst nodeVersion: Check = {\n id: 'env.node-version',\n category: CATEGORY,\n title: 'Node.js version meets minimum',\n async run() {\n const current = process.versions.node;\n const min = await readEngineMin();\n if (!min) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'skipped',\n detail: 'could not read engines.node from package.json',\n autoFixable: false,\n } satisfies CheckResult;\n }\n if (!versionGte(current, min)) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `Node ${current} is below required >=${min}`,\n remediation: {\n kind: 'manual',\n suggestion: `Upgrade Node to >=${min}`,\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this, `Node ${current} >= ${min}`);\n },\n};\n\nconst cliVersion: Check = {\n id: 'env.cli-version',\n category: CATEGORY,\n title: 'CLI version matches latest on npm',\n async run() {\n const local = await readLocalVersion();\n if (!local) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'skipped',\n detail: 'could not read local package.json version',\n autoFixable: false,\n } satisfies CheckResult;\n }\n const latest = await fetchLatestNpmVersion('syntaur', 2000);\n if (!latest) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'skipped',\n detail: 'could not reach npm registry (offline or timed out)',\n autoFixable: false,\n } satisfies CheckResult;\n }\n if (local === latest) {\n return pass(this, `syntaur ${local} is latest`);\n }\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'warn',\n detail: `installed syntaur ${local}, latest on npm is ${latest}`,\n remediation: {\n kind: 'manual',\n suggestion: 'Run `npm install -g syntaur@latest` to upgrade',\n command: 'npm install -g syntaur@latest',\n },\n autoFixable: false,\n } satisfies CheckResult;\n },\n};\n\nexport const envChecks: Check[] = [\n syntaurRootExists,\n configValid,\n nodeVersion,\n cliVersion,\n];\n\nfunction pass(check: { id: string; category: string; title: string }, detail?: string): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'pass',\n detail,\n autoFixable: false,\n };\n}\n\nfunction err(\n check: { id: string; category: string; title: string },\n detail: string,\n affected?: string[],\n): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'error',\n detail,\n affected,\n autoFixable: false,\n };\n}\n\nasync function readEngineMin(): Promise<string | null> {\n const raw = await readLocalPkg();\n if (!raw) return null;\n const engine = raw.engines?.node;\n if (typeof engine !== 'string') return null;\n const match = engine.match(/(\\d+(?:\\.\\d+){0,2})/);\n return match ? match[1] : null;\n}\n\nasync function readLocalVersion(): Promise<string | null> {\n const raw = await readLocalPkg();\n return typeof raw?.version === 'string' ? raw.version : null;\n}\n\ninterface LocalPkg {\n version?: unknown;\n engines?: { node?: string };\n}\n\nasync function readLocalPkg(): Promise<LocalPkg | null> {\n try {\n const here = fileURLToPath(import.meta.url);\n let dir = dirname(here);\n for (let i = 0; i < 6; i++) {\n const candidate = join(dir, 'package.json');\n try {\n const text = await readFile(candidate, 'utf-8');\n return JSON.parse(text) as LocalPkg;\n } catch {\n dir = dirname(dir);\n }\n }\n return null;\n } catch {\n return null;\n }\n}\n\nasync function fetchLatestNpmVersion(pkg: string, timeoutMs: number): Promise<string | null> {\n const controller = new AbortController();\n const t = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(`https://registry.npmjs.org/${pkg}/latest`, {\n signal: controller.signal,\n });\n if (!res.ok) return null;\n const body = (await res.json()) as { version?: unknown };\n return typeof body.version === 'string' ? body.version : null;\n } catch {\n return null;\n } finally {\n clearTimeout(t);\n }\n}\n\nfunction readTopLevelField(fmBlock: string, key: string): string | null {\n const match = fmBlock.match(new RegExp(`^${key}:\\\\s*(.*)$`, 'm'));\n if (!match) return null;\n const raw = match[1].trim();\n if (raw === '') return null;\n if ((raw.startsWith('\"') && raw.endsWith('\"')) || (raw.startsWith(\"'\") && raw.endsWith(\"'\"))) {\n return raw.slice(1, -1);\n }\n return raw;\n}\n\nfunction versionGte(a: string, b: string): boolean {\n const pa = a.split('.').map((n) => parseInt(n, 10) || 0);\n const pb = b.split('.').map((n) => parseInt(n, 10) || 0);\n const len = Math.max(pa.length, pb.length);\n for (let i = 0; i < len; i++) {\n const av = pa[i] ?? 0;\n const bv = pb[i] ?? 0;\n if (av > bv) return true;\n if (av < bv) return false;\n }\n return true;\n}\n","import { resolve } from 'node:path';\nimport { readdir, stat } from 'node:fs/promises';\nimport { fileExists } from '../../fs.js';\nimport type { Check, CheckResult } from '../types.js';\n\nconst CATEGORY = 'structure';\n\nconst KNOWN_TOP_LEVEL = new Set<string>([\n 'projects',\n 'playbooks',\n 'todos',\n 'servers',\n 'config.md',\n 'syntaur.db',\n 'syntaur.db-shm',\n 'syntaur.db-wal',\n 'dashboard-port',\n 'workspaces.json',\n]);\n\nconst projectsDir: Check = {\n id: 'structure.projects-dir',\n category: CATEGORY,\n title: 'projects/ directory exists',\n async run(ctx) {\n const p = resolve(ctx.syntaurRoot, 'projects');\n if (!(await fileExists(p))) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: 'projects/ missing under ~/.syntaur/',\n affected: [p],\n remediation: {\n kind: 'manual',\n suggestion: 'Run `syntaur init` to restore the standard layout',\n command: 'syntaur init',\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this);\n },\n};\n\nconst playbooksDir: Check = {\n id: 'structure.playbooks-dir',\n category: CATEGORY,\n title: 'playbooks/ directory exists',\n async run(ctx) {\n const p = resolve(ctx.syntaurRoot, 'playbooks');\n if (!(await fileExists(p))) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: 'playbooks/ missing under ~/.syntaur/',\n affected: [p],\n remediation: {\n kind: 'manual',\n suggestion: 'Run `syntaur init` to restore the standard layout',\n command: 'syntaur init',\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this);\n },\n};\n\nconst todosDirValid: Check = {\n id: 'structure.todos-dir-valid',\n category: CATEGORY,\n title: 'todos/ directory is readable (if present)',\n async run(ctx) {\n const p = resolve(ctx.syntaurRoot, 'todos');\n if (!(await fileExists(p))) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'skipped',\n detail: 'todos/ not present (created lazily on first use)',\n autoFixable: false,\n } satisfies CheckResult;\n }\n const s = await stat(p);\n if (!s.isDirectory()) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: 'todos/ exists but is not a directory',\n affected: [p],\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this);\n },\n};\n\nconst serversDirValid: Check = {\n id: 'structure.servers-dir-valid',\n category: CATEGORY,\n title: 'servers/ directory is readable (if present)',\n async run(ctx) {\n const p = resolve(ctx.syntaurRoot, 'servers');\n if (!(await fileExists(p))) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'skipped',\n detail: 'servers/ not present',\n autoFixable: false,\n } satisfies CheckResult;\n }\n const s = await stat(p);\n if (!s.isDirectory()) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: 'servers/ exists but is not a directory',\n affected: [p],\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this);\n },\n};\n\nconst knownFilesRecognized: Check = {\n id: 'structure.known-files-recognized',\n category: CATEGORY,\n title: 'No unexpected top-level entries under ~/.syntaur/',\n async run(ctx) {\n const entries = await readdir(ctx.syntaurRoot, { withFileTypes: true });\n const unexpected: string[] = [];\n for (const e of entries) {\n if (e.name.startsWith('.')) continue;\n if (KNOWN_TOP_LEVEL.has(e.name)) continue;\n unexpected.push(e.name);\n }\n if (unexpected.length === 0) return pass(this);\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'warn',\n detail: `unexpected top-level entries: ${unexpected.join(', ')}`,\n affected: unexpected.map((n) => resolve(ctx.syntaurRoot, n)),\n remediation: {\n kind: 'manual',\n suggestion: 'Review these entries — they may be leftover state from older versions',\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n },\n};\n\nexport const structureChecks: Check[] = [\n projectsDir,\n playbooksDir,\n todosDirValid,\n serversDirValid,\n knownFilesRecognized,\n];\n\nfunction pass(check: { id: string; category: string; title: string }): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'pass',\n autoFixable: false,\n };\n}\n","import { resolve } from 'node:path';\nimport { readdir, stat } from 'node:fs/promises';\nimport { fileExists } from '../../fs.js';\nimport type { Check, CheckResult } from '../types.js';\n\nconst CATEGORY = 'project';\n\nconst REQUIRED_PROJECT_FILES = [\n 'project.md',\n 'manifest.md',\n '_status.md',\n '_index-assignments.md',\n '_index-plans.md',\n '_index-decisions.md',\n 'resources/_index.md',\n 'memories/_index.md',\n] as const;\n\nconst KNOWN_PROJECT_TOP_LEVEL = new Set<string>([\n 'project.md',\n 'manifest.md',\n '_status.md',\n 'assignments',\n 'resources',\n 'memories',\n]);\n\nconst PROJECT_MARKERS = ['project.md', 'manifest.md', 'assignments'] as const;\n\nasync function listProjects(ctx: { config: { defaultProjectDir: string } }): Promise<string[]> {\n const dir = ctx.config.defaultProjectDir;\n if (!(await fileExists(dir))) return [];\n const entries = await readdir(dir, { withFileTypes: true });\n const result: string[] = [];\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n if (e.name.startsWith('.') || e.name.startsWith('_')) continue;\n const projectDir = resolve(dir, e.name);\n let looksLikeProject = false;\n for (const marker of PROJECT_MARKERS) {\n if (await fileExists(resolve(projectDir, marker))) {\n looksLikeProject = true;\n break;\n }\n }\n if (looksLikeProject) result.push(projectDir);\n }\n return result;\n}\n\nconst requiredFiles: Check = {\n id: 'project.required-files-present',\n category: CATEGORY,\n title: 'Each project has the full required scaffold',\n async run(ctx) {\n const projects = await listProjects(ctx);\n const results: CheckResult[] = [];\n for (const projectDir of projects) {\n const missing: string[] = [];\n for (const rel of REQUIRED_PROJECT_FILES) {\n const p = resolve(projectDir, rel);\n if (!(await fileExists(p))) missing.push(rel);\n }\n if (missing.length === 0) continue;\n results.push({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `project at ${projectDir} is missing: ${missing.join(', ')}`,\n affected: missing.map((m) => resolve(projectDir, m)),\n remediation: {\n kind: 'manual',\n suggestion: 'Recreate the missing scaffold files from templates',\n command: null,\n },\n autoFixable: false,\n });\n }\n if (results.length === 0) {\n return pass(this);\n }\n return results;\n },\n};\n\nconst manifestStale: Check = {\n id: 'project.manifest-stale',\n category: CATEGORY,\n title: 'manifest.md is not older than any assignment change',\n async run(ctx) {\n const projects = await listProjects(ctx);\n const results: CheckResult[] = [];\n for (const projectDir of projects) {\n const manifestPath = resolve(projectDir, 'manifest.md');\n if (!(await fileExists(manifestPath))) continue;\n const manifestMtime = (await stat(manifestPath)).mtimeMs;\n const newestAssignment = await newestAssignmentMtime(projectDir);\n if (newestAssignment === 0) continue;\n if (newestAssignment > manifestMtime) {\n results.push({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'warn',\n detail: `manifest.md in ${projectDir} is older than the newest assignment.md`,\n affected: [manifestPath],\n remediation: {\n kind: 'manual',\n suggestion: 'Rebuild the manifest (no CLI rebuild helper yet — edit manually or wait for v2)',\n command: null,\n },\n autoFixable: false,\n });\n }\n }\n if (results.length === 0) return pass(this);\n return results;\n },\n};\n\nconst orphanFiles: Check = {\n id: 'project.orphan-files',\n category: CATEGORY,\n title: 'No unexpected files at project top level',\n async run(ctx) {\n const projects = await listProjects(ctx);\n const results: CheckResult[] = [];\n for (const projectDir of projects) {\n const entries = await readdir(projectDir, { withFileTypes: true });\n const orphans: string[] = [];\n for (const e of entries) {\n if (e.name.startsWith('.')) continue;\n if (KNOWN_PROJECT_TOP_LEVEL.has(e.name)) continue;\n if (e.name.startsWith('_index-') && e.name.endsWith('.md')) continue;\n orphans.push(e.name);\n }\n if (orphans.length === 0) continue;\n results.push({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'warn',\n detail: `project at ${projectDir} has unexpected entries: ${orphans.join(', ')}`,\n affected: orphans.map((o) => resolve(projectDir, o)),\n autoFixable: false,\n });\n }\n if (results.length === 0) return pass(this);\n return results;\n },\n};\n\nexport const projectChecks: Check[] = [requiredFiles, manifestStale, orphanFiles];\n\nasync function newestAssignmentMtime(projectDir: string): Promise<number> {\n const assignmentsRoot = resolve(projectDir, 'assignments');\n if (!(await fileExists(assignmentsRoot))) return 0;\n let newest = 0;\n let entries;\n try {\n entries = await readdir(assignmentsRoot, { withFileTypes: true });\n } catch {\n return 0;\n }\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n const assignmentMd = resolve(assignmentsRoot, e.name, 'assignment.md');\n try {\n const s = await stat(assignmentMd);\n if (s.mtimeMs > newest) newest = s.mtimeMs;\n } catch {\n // no assignment.md — skip (orphan check covers that)\n }\n }\n return newest;\n}\n\nfunction pass(check: { id: string; category: string; title: string }): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'pass',\n autoFixable: false,\n };\n}\n","import { resolve } from 'node:path';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { fileExists } from '../../fs.js';\nimport { parseAssignmentFull } from '../../../dashboard/parser.js';\nimport { DEFAULT_STATUSES, DEFAULT_TERMINAL_STATUSES } from '../../../lifecycle/types.js';\nimport type { CheckContext, Check, CheckResult } from '../types.js';\n\nconst CATEGORY = 'assignment';\n\nconst STATUSES_REQUIRING_HANDOFF = new Set(['review', 'completed']);\n\ninterface AssignmentEntry {\n projectDir: string;\n projectSlug: string;\n assignmentDir: string;\n assignmentSlug: string;\n}\n\nasync function listAssignments(ctx: CheckContext): Promise<{\n withAssignmentMd: AssignmentEntry[];\n orphanFolders: AssignmentEntry[];\n}> {\n const result = { withAssignmentMd: [] as AssignmentEntry[], orphanFolders: [] as AssignmentEntry[] };\n const projectsDir = ctx.config.defaultProjectDir;\n if (!(await fileExists(projectsDir))) return result;\n\n const projects = await readdir(projectsDir, { withFileTypes: true });\n for (const m of projects) {\n if (!m.isDirectory()) continue;\n if (m.name.startsWith('.') || m.name.startsWith('_')) continue;\n const assignmentsDir = resolve(projectsDir, m.name, 'assignments');\n if (!(await fileExists(assignmentsDir))) continue;\n\n const entries = await readdir(assignmentsDir, { withFileTypes: true });\n for (const a of entries) {\n if (!a.isDirectory()) continue;\n if (a.name.startsWith('.') || a.name.startsWith('_')) continue;\n const assignmentDir = resolve(assignmentsDir, a.name);\n const assignmentMd = resolve(assignmentDir, 'assignment.md');\n const entry: AssignmentEntry = {\n projectDir: resolve(projectsDir, m.name),\n projectSlug: m.name,\n assignmentDir,\n assignmentSlug: a.name,\n };\n if (await fileExists(assignmentMd)) {\n result.withAssignmentMd.push(entry);\n } else {\n result.orphanFolders.push(entry);\n }\n }\n }\n return result;\n}\n\nfunction configuredStatuses(ctx: CheckContext): Set<string> {\n const custom = ctx.config.statuses?.statuses?.map((s) => s.id) ?? [];\n if (custom.length > 0) return new Set(custom);\n return new Set(DEFAULT_STATUSES);\n}\n\nfunction terminalStatuses(ctx: CheckContext): Set<string> {\n const custom = ctx.config.statuses?.statuses?.filter((s) => s.terminal).map((s) => s.id) ?? [];\n if (custom.length > 0) return new Set(custom);\n return new Set(DEFAULT_TERMINAL_STATUSES);\n}\n\nconst requiredFiles: Check = {\n id: 'assignment.required-files',\n category: CATEGORY,\n title: 'Each assignment folder has an assignment.md',\n async run(ctx) {\n const { withAssignmentMd } = await listAssignments(ctx);\n if (withAssignmentMd.length === 0) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'skipped',\n detail: 'no assignments found',\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this, `${withAssignmentMd.length} assignment.md files present`);\n },\n};\n\nconst orphanedFolder: Check = {\n id: 'assignment.orphaned-folder',\n category: CATEGORY,\n title: 'No assignment folders without assignment.md',\n async run(ctx) {\n const { orphanFolders } = await listAssignments(ctx);\n if (orphanFolders.length === 0) return pass(this);\n return orphanFolders.map((o) => ({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error' as const,\n detail: `folder ${o.assignmentDir} has no assignment.md`,\n affected: [o.assignmentDir],\n remediation: {\n kind: 'manual' as const,\n suggestion: 'Either create an assignment.md inside the folder or delete it',\n command: null,\n },\n autoFixable: false,\n }));\n },\n};\n\nconst invalidStatus: Check = {\n id: 'assignment.invalid-status',\n category: CATEGORY,\n title: 'Assignment statuses are valid',\n async run(ctx) {\n const { withAssignmentMd } = await listAssignments(ctx);\n const allowed = configuredStatuses(ctx);\n const results: CheckResult[] = [];\n for (const a of withAssignmentMd) {\n const path = resolve(a.assignmentDir, 'assignment.md');\n const parsed = await parseSafe(path);\n if (!parsed) continue;\n if (!allowed.has(parsed.status)) {\n results.push({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `${a.projectSlug}/${a.assignmentSlug}: status \"${parsed.status}\" is not in configured statuses (${[...allowed].join(', ')})`,\n affected: [path],\n remediation: {\n kind: 'manual',\n suggestion: 'Update the assignment status to a valid value',\n command: null,\n },\n autoFixable: false,\n });\n }\n }\n if (results.length === 0) return pass(this);\n return results;\n },\n};\n\nconst workspaceMissing: Check = {\n id: 'assignment.workspace-missing',\n category: CATEGORY,\n title: 'Non-terminal assignments have workspace fields set',\n async run(ctx) {\n const { withAssignmentMd } = await listAssignments(ctx);\n const terminal = terminalStatuses(ctx);\n const results: CheckResult[] = [];\n for (const a of withAssignmentMd) {\n const path = resolve(a.assignmentDir, 'assignment.md');\n const parsed = await parseSafe(path);\n if (!parsed) continue;\n if (terminal.has(parsed.status)) continue;\n if (parsed.status === 'pending') continue; // workspace not yet expected\n const { repository, worktreePath } = parsed.workspace;\n if (repository === null && worktreePath === null) {\n results.push({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `${a.projectSlug}/${a.assignmentSlug} (status: ${parsed.status}) has no workspace.repository or workspace.worktreePath set — the PreToolUse hook will block implementation work`,\n affected: [path],\n remediation: {\n kind: 'manual',\n suggestion: 'Set workspace.repository and workspace.worktreePath in the assignment frontmatter before continuing implementation',\n command: null,\n },\n autoFixable: false,\n });\n }\n }\n if (results.length === 0) return pass(this);\n return results;\n },\n};\n\nconst requiredFilesByStatus: Check = {\n id: 'assignment.required-files-by-status',\n category: CATEGORY,\n title: 'Handoff file matches assignment status',\n async run(ctx) {\n const allowed = configuredStatuses(ctx);\n const defaultsCovered = Array.from(DEFAULT_STATUSES).every((s) => allowed.has(s));\n if (!defaultsCovered) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'skipped',\n detail: 'custom StatusConfig does not include default statuses; file-by-status mapping not applicable',\n autoFixable: false,\n } satisfies CheckResult;\n }\n const { withAssignmentMd } = await listAssignments(ctx);\n const results: CheckResult[] = [];\n for (const a of withAssignmentMd) {\n const assignmentPath = resolve(a.assignmentDir, 'assignment.md');\n const parsed = await parseSafe(assignmentPath);\n if (!parsed) continue;\n const missing: string[] = [];\n if (STATUSES_REQUIRING_HANDOFF.has(parsed.status)) {\n const handoffPath = resolve(a.assignmentDir, 'handoff.md');\n if (!(await fileExists(handoffPath))) missing.push('handoff.md');\n }\n if (missing.length === 0) continue;\n results.push({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'warn',\n detail: `${a.projectSlug}/${a.assignmentSlug} (status: ${parsed.status}) is missing ${missing.join(', ')}`,\n affected: missing.map((m) => resolve(a.assignmentDir, m)),\n remediation: {\n kind: 'manual',\n suggestion: `Create the missing ${missing.join(' and ')} files for this assignment`,\n command: null,\n },\n autoFixable: false,\n });\n }\n if (results.length === 0) return pass(this);\n return results;\n },\n};\n\nexport const assignmentChecks: Check[] = [\n requiredFiles,\n orphanedFolder,\n invalidStatus,\n workspaceMissing,\n requiredFilesByStatus,\n];\n\nasync function parseSafe(path: string): Promise<ReturnType<typeof parseAssignmentFull> | null> {\n try {\n const content = await readFile(path, 'utf-8');\n return parseAssignmentFull(content);\n } catch {\n return null;\n }\n}\n\nfunction pass(check: { id: string; category: string; title: string }, detail?: string): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'pass',\n detail,\n autoFixable: false,\n };\n}\n","import { resolve } from 'node:path';\nimport { fileExists } from '../../fs.js';\nimport type { Check, CheckResult } from '../types.js';\n\nconst CATEGORY = 'dashboard';\n\nconst dbReachable: Check = {\n id: 'dashboard.db-reachable',\n category: CATEGORY,\n title: 'syntaur.db is readable and has expected schema',\n async run(ctx) {\n if (!ctx.db) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `could not open syntaur.db: ${ctx.dbError ?? 'unknown error'}`,\n affected: [resolve(ctx.syntaurRoot, 'syntaur.db')],\n remediation: {\n kind: 'manual',\n suggestion: 'Start the dashboard once (`syntaur dashboard`) to initialize the DB, or restore it from backup',\n command: 'syntaur dashboard',\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n try {\n const row = ctx.db\n .prepare(\"SELECT name FROM sqlite_master WHERE type='table' AND name='sessions'\")\n .get();\n if (!row) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: 'syntaur.db is missing the expected \"sessions\" table',\n affected: [resolve(ctx.syntaurRoot, 'syntaur.db')],\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this);\n } catch (err) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `syntaur.db query failed: ${err instanceof Error ? err.message : String(err)}`,\n affected: [resolve(ctx.syntaurRoot, 'syntaur.db')],\n autoFixable: false,\n } satisfies CheckResult;\n }\n },\n};\n\nconst ghostSessions: Check = {\n id: 'dashboard.ghost-sessions',\n category: CATEGORY,\n title: 'Session records reference assignments that still exist on disk',\n async run(ctx) {\n if (!ctx.db) {\n return skipped(this, 'skipped: db not reachable');\n }\n let rows: Array<{ session_id: string; project_slug: string | null; assignment_slug: string | null }>;\n try {\n rows = ctx.db\n .prepare(\n 'SELECT session_id, project_slug, assignment_slug FROM sessions WHERE project_slug IS NOT NULL',\n )\n .all() as typeof rows;\n } catch {\n return skipped(this, 'skipped: sessions table unreadable');\n }\n\n const projectsDir = ctx.config.defaultProjectDir;\n const results: CheckResult[] = [];\n for (const row of rows) {\n if (!row.project_slug) continue;\n const projectPath = resolve(projectsDir, row.project_slug, 'project.md');\n if (!(await fileExists(projectPath))) {\n results.push({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'warn',\n detail: `session ${row.session_id} references missing project \"${row.project_slug}\"`,\n affected: [projectPath],\n remediation: {\n kind: 'manual',\n suggestion: 'Remove the session row or restore the project',\n command: null,\n },\n autoFixable: false,\n });\n continue;\n }\n if (row.assignment_slug) {\n const assignmentPath = resolve(\n projectsDir,\n row.project_slug,\n 'assignments',\n row.assignment_slug,\n 'assignment.md',\n );\n if (!(await fileExists(assignmentPath))) {\n results.push({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'warn',\n detail: `session ${row.session_id} references missing assignment \"${row.project_slug}/${row.assignment_slug}\"`,\n affected: [assignmentPath],\n remediation: {\n kind: 'manual',\n suggestion: 'Remove the session row or restore the assignment folder',\n command: null,\n },\n autoFixable: false,\n });\n }\n }\n }\n if (results.length === 0) return pass(this);\n return results;\n },\n};\n\nexport const dashboardChecks: Check[] = [dbReachable, ghostSessions];\n\nfunction pass(check: { id: string; category: string; title: string }): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'pass',\n autoFixable: false,\n };\n}\n\nfunction skipped(check: { id: string; category: string; title: string }, reason: string): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'skipped',\n detail: reason,\n autoFixable: false,\n };\n}\n\n","import { resolve } from 'node:path';\nimport { readdir } from 'node:fs/promises';\nimport { fileExists } from '../../fs.js';\nimport type { Check, CheckResult } from '../types.js';\n\nconst CATEGORY = 'integrations';\n\nconst claudePluginLinked: Check = {\n id: 'integrations.claude-plugin-linked',\n category: CATEGORY,\n title: 'Configured Claude plugin directory exists',\n async run(ctx) {\n const dir = ctx.config.integrations.claudePluginDir;\n if (!dir) return skipped(this, 'claudePluginDir not configured');\n if (!(await fileExists(dir))) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `claudePluginDir points to ${dir} but that directory does not exist`,\n affected: [dir],\n remediation: {\n kind: 'manual',\n suggestion: 'Reinstall the Claude plugin or update the path in ~/.syntaur/config.md',\n command: 'syntaur install-plugin',\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this);\n },\n};\n\nconst codexPluginLinked: Check = {\n id: 'integrations.codex-plugin-linked',\n category: CATEGORY,\n title: 'Configured Codex plugin directory exists',\n async run(ctx) {\n const dir = ctx.config.integrations.codexPluginDir;\n if (!dir) return skipped(this, 'codexPluginDir not configured');\n if (!(await fileExists(dir))) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `codexPluginDir points to ${dir} but that directory does not exist`,\n affected: [dir],\n remediation: {\n kind: 'manual',\n suggestion: 'Reinstall the Codex plugin or update the path in ~/.syntaur/config.md',\n command: 'syntaur install-codex-plugin',\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this);\n },\n};\n\nconst backupConfigured: Check = {\n id: 'integrations.backup-configured',\n category: CATEGORY,\n title: 'GitHub backup is configured (if user has projects)',\n async run(ctx) {\n if (ctx.config.backup?.repo) return pass(this);\n const projectsDir = ctx.config.defaultProjectDir;\n if (!(await fileExists(projectsDir))) return skipped(this, 'no projects dir');\n const entries = await readdir(projectsDir, { withFileTypes: true });\n const hasProjects = entries.some((e) => e.isDirectory() && !e.name.startsWith('.') && !e.name.startsWith('_'));\n if (!hasProjects) return skipped(this, 'no projects yet');\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'warn',\n detail: 'you have projects but no GitHub backup repo configured',\n remediation: {\n kind: 'manual',\n suggestion: 'Run `syntaur backup config --repo <url>` to configure',\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n },\n};\n\nexport const integrationChecks: Check[] = [claudePluginLinked, codexPluginLinked, backupConfigured];\n\nfunction pass(check: { id: string; category: string; title: string }): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'pass',\n autoFixable: false,\n };\n}\n\nfunction skipped(check: { id: string; category: string; title: string }, reason: string): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'skipped',\n detail: reason,\n autoFixable: false,\n };\n}\n","import { resolve } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport { fileExists } from '../../fs.js';\nimport { parseAssignmentFull } from '../../../dashboard/parser.js';\nimport { DEFAULT_TERMINAL_STATUSES } from '../../../lifecycle/types.js';\nimport type { CheckContext, Check, CheckResult } from '../types.js';\n\nconst CATEGORY = 'workspace';\n\ninterface ContextFile {\n sessionId?: string;\n projectSlug?: string;\n assignmentSlug?: string;\n projectDir?: string;\n assignmentDir?: string;\n workspaceRoot?: string;\n}\n\nconst ASSIGNMENT_FIELDS = ['projectSlug', 'assignmentSlug', 'projectDir', 'assignmentDir'] as const;\n\nfunction hasAnyAssignmentField(ctx: ContextFile | null): boolean {\n if (!ctx) return false;\n return ASSIGNMENT_FIELDS.some((k) => typeof ctx[k] === 'string' && ctx[k]!.length > 0);\n}\n\nfunction isStandaloneSession(ctx: ContextFile | null): boolean {\n if (!ctx) return false;\n return !hasAnyAssignmentField(ctx) && typeof ctx.sessionId === 'string' && ctx.sessionId.length > 0;\n}\n\nasync function loadContext(ctx: CheckContext): Promise<{\n data: ContextFile | null;\n path: string;\n exists: boolean;\n parseError: string | null;\n}> {\n const path = resolve(ctx.cwd, '.syntaur', 'context.json');\n if (!(await fileExists(path))) {\n return { data: null, path, exists: false, parseError: null };\n }\n try {\n const raw = await readFile(path, 'utf-8');\n return { data: JSON.parse(raw) as ContextFile, path, exists: true, parseError: null };\n } catch (err) {\n return {\n data: null,\n path,\n exists: true,\n parseError: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nconst contextValid: Check = {\n id: 'workspace.context-valid',\n category: CATEGORY,\n title: '.syntaur/context.json parses and has required fields',\n async run(ctx) {\n const { data, path, exists, parseError } = await loadContext(ctx);\n if (!exists) return skipped(this, 'no .syntaur/context.json in cwd');\n if (parseError) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `.syntaur/context.json is not valid JSON: ${parseError}`,\n affected: [path],\n remediation: {\n kind: 'manual',\n suggestion: 'Fix or regenerate the context file by re-grabbing the assignment',\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n if (isStandaloneSession(data)) {\n return pass(this, 'standalone session context (sessionId only)');\n }\n if (!hasAnyAssignmentField(data)) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: '.syntaur/context.json has no sessionId and no assignment fields',\n affected: [path],\n autoFixable: false,\n } satisfies CheckResult;\n }\n const missing: string[] = [];\n for (const key of ['projectSlug', 'assignmentSlug', 'assignmentDir'] as const) {\n if (!data?.[key]) missing.push(key);\n }\n if (missing.length > 0) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `.syntaur/context.json has partial assignment fields but is missing: ${missing.join(', ')}`,\n affected: [path],\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this);\n },\n};\n\nconst contextAssignmentResolves: Check = {\n id: 'workspace.context-assignment-resolves',\n category: CATEGORY,\n title: 'Context references an assignment that exists on disk',\n async run(ctx) {\n const { data, path, exists } = await loadContext(ctx);\n if (!exists) return skipped(this, 'no context to resolve');\n if (isStandaloneSession(data)) return skipped(this, 'standalone session context — no assignment to resolve');\n if (!data?.assignmentDir) return skipped(this, 'context has no assignmentDir');\n const assignmentMd = resolve(data.assignmentDir, 'assignment.md');\n if (!(await fileExists(assignmentMd))) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `context points to ${data.assignmentDir} but assignment.md is missing`,\n affected: [assignmentMd, path],\n remediation: {\n kind: 'manual',\n suggestion: 'Remove the stale .syntaur/context.json or restore the assignment',\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this);\n },\n};\n\nconst contextTerminal: Check = {\n id: 'workspace.context-terminal',\n category: CATEGORY,\n title: 'Context assignment is not in a terminal status',\n async run(ctx) {\n const { data, exists } = await loadContext(ctx);\n if (!exists) return skipped(this, 'no context to check');\n if (isStandaloneSession(data)) return skipped(this, 'standalone session context — no assignment to check');\n if (!data?.assignmentDir) return skipped(this, 'context has no assignmentDir');\n const assignmentMd = resolve(data.assignmentDir, 'assignment.md');\n if (!(await fileExists(assignmentMd))) return skipped(this, 'assignment file missing');\n try {\n const content = await readFile(assignmentMd, 'utf-8');\n const parsed = parseAssignmentFull(content);\n const terminal = terminalStatuses(ctx);\n if (terminal.has(parsed.status)) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'warn',\n detail: `context references assignment with terminal status \"${parsed.status}\"`,\n affected: [assignmentMd],\n remediation: {\n kind: 'manual',\n suggestion: 'Grab a new assignment or remove the stale .syntaur/context.json',\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this);\n } catch {\n return skipped(this, 'could not parse assignment.md');\n }\n },\n};\n\nfunction terminalStatuses(ctx: CheckContext): Set<string> {\n const custom = ctx.config.statuses?.statuses?.filter((s) => s.terminal).map((s) => s.id) ?? [];\n if (custom.length > 0) return new Set(custom);\n return new Set(DEFAULT_TERMINAL_STATUSES);\n}\n\nexport const workspaceChecks: Check[] = [contextValid, contextAssignmentResolves, contextTerminal];\n\nfunction pass(check: { id: string; category: string; title: string }, detail?: string): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'pass',\n detail,\n autoFixable: false,\n };\n}\n\nfunction skipped(check: { id: string; category: string; title: string }, reason: string): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'skipped',\n detail: reason,\n autoFixable: false,\n };\n}\n","import type { Check } from './types.js';\nimport { envChecks } from './checks/env.js';\nimport { structureChecks } from './checks/structure.js';\nimport { projectChecks } from './checks/project.js';\nimport { assignmentChecks } from './checks/assignment.js';\nimport { dashboardChecks } from './checks/dashboard.js';\nimport { integrationChecks } from './checks/integrations.js';\nimport { workspaceChecks } from './checks/workspace.js';\n\nexport function allChecks(): Check[] {\n return [\n ...envChecks,\n ...structureChecks,\n ...projectChecks,\n ...assignmentChecks,\n ...dashboardChecks,\n ...integrationChecks,\n ...workspaceChecks,\n ];\n}\n","import type { CheckResult, DoctorReport } from './types.js';\n\nconst USE_COLOR = process.stdout.isTTY && process.env.NO_COLOR === undefined;\n\nconst COLOR = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n red: '\\x1b[31m',\n gray: '\\x1b[90m',\n cyan: '\\x1b[36m',\n};\n\nfunction c(code: string, text: string): string {\n return USE_COLOR ? `${code}${text}${COLOR.reset}` : text;\n}\n\nconst STATUS_BADGE: Record<CheckResult['status'], string> = {\n pass: c(COLOR.green, 'PASS '),\n warn: c(COLOR.yellow, 'WARN '),\n error: c(COLOR.red, 'ERROR'),\n skipped: c(COLOR.gray, 'SKIP '),\n};\n\nexport interface HumanRenderOptions {\n verbose: boolean;\n}\n\nexport function renderHuman(report: DoctorReport, options: HumanRenderOptions = { verbose: false }): string {\n const lines: string[] = [];\n lines.push(\n c(COLOR.bold, 'syntaur doctor') +\n c(COLOR.dim, ` (syntaur ${report.syntaurVersion}, ran ${report.ranAt})`),\n );\n lines.push('');\n\n const byCategory = new Map<string, CheckResult[]>();\n for (const check of report.checks) {\n const list = byCategory.get(check.category) ?? [];\n list.push(check);\n byCategory.set(check.category, list);\n }\n\n for (const [category, checks] of byCategory) {\n const visible = options.verbose ? checks : checks.filter((c) => c.status !== 'pass');\n if (visible.length === 0) {\n lines.push(c(COLOR.dim, `[${category}] all passed`));\n continue;\n }\n lines.push(c(COLOR.bold, `[${category}]`));\n for (const check of visible) {\n lines.push(` ${STATUS_BADGE[check.status]} ${c(COLOR.cyan, check.id)} ${check.title}`);\n if (check.detail) lines.push(` ${c(COLOR.dim, check.detail)}`);\n if (check.affected && check.affected.length > 0) {\n for (const path of check.affected.slice(0, 3)) {\n lines.push(` ${c(COLOR.gray, '→ ' + path)}`);\n }\n if (check.affected.length > 3) {\n lines.push(` ${c(COLOR.gray, ` …and ${check.affected.length - 3} more`)}`);\n }\n }\n if (check.remediation && check.remediation.suggestion) {\n lines.push(` ${c(COLOR.dim, 'fix: ' + check.remediation.suggestion)}`);\n if (check.remediation.command) {\n lines.push(` ${c(COLOR.cyan, '$ ' + check.remediation.command)}`);\n }\n }\n }\n lines.push('');\n }\n\n const s = report.summary;\n lines.push(\n c(COLOR.bold, 'summary: ') +\n `${c(COLOR.green, s.pass + ' passed')}, ` +\n `${c(COLOR.yellow, s.warn + ' warnings')}, ` +\n `${c(COLOR.red, s.error + ' errors')}, ` +\n `${c(COLOR.gray, s.skipped + ' skipped')}`,\n );\n return lines.join('\\n');\n}\n","import type { DoctorReport } from './types.js';\n\nexport function renderJson(report: DoctorReport): string {\n return JSON.stringify(report, null, 2);\n}\n","import { resolve } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport { expandHome, assignmentsDir as assignmentsDirFn } from '../utils/paths.js';\nimport { fileExists, writeFileForce } from '../utils/fs.js';\nimport { readConfig } from '../utils/config.js';\nimport { isValidSlug } from '../utils/slug.js';\nimport { generateId } from '../utils/uuid.js';\nimport { nowTimestamp } from '../utils/timestamp.js';\nimport { resolveAssignmentById } from '../utils/assignment-resolver.js';\nimport { renderComments, formatCommentEntry, type Comment, type CommentType } from '../templates/index.js';\n\nexport interface CommentOptions {\n project?: string;\n dir?: string;\n replyTo?: string;\n type?: CommentType;\n author?: string;\n}\n\nfunction shortId(): string {\n return generateId().split('-')[0];\n}\n\nfunction setTopLevelField(content: string, key: string, value: string | number): string {\n const fieldRegex = new RegExp(`^(${key}:)\\\\s*.*$`, 'm');\n if (fieldRegex.test(content)) {\n return content.replace(fieldRegex, `$1 ${value}`);\n }\n return content;\n}\n\nexport async function commentCommand(\n target: string,\n text: string,\n options: CommentOptions = {},\n): Promise<void> {\n if (!text || !text.trim()) {\n throw new Error('Comment text cannot be empty.');\n }\n\n const type: CommentType = options.type ?? 'note';\n if (!['question', 'note', 'feedback'].includes(type)) {\n throw new Error(`Invalid comment type \"${type}\". Must be one of: question, note, feedback.`);\n }\n\n const config = await readConfig();\n const baseDir = options.dir ? expandHome(options.dir) : config.defaultProjectDir;\n\n let assignmentDir: string;\n let assignmentRef: string;\n if (options.project) {\n if (!isValidSlug(options.project)) {\n throw new Error(`Invalid project slug \"${options.project}\".`);\n }\n if (!isValidSlug(target)) {\n throw new Error(`Invalid assignment slug \"${target}\".`);\n }\n assignmentDir = resolve(baseDir, options.project, 'assignments', target);\n assignmentRef = target;\n } else {\n const resolved = await resolveAssignmentById(baseDir, assignmentsDirFn(), target);\n if (!resolved) {\n throw new Error(`Assignment \"${target}\" not found. Provide --project <slug> or a valid standalone UUID.`);\n }\n assignmentDir = resolved.assignmentDir;\n assignmentRef = resolved.standalone ? resolved.id : resolved.assignmentSlug;\n }\n\n const commentsPath = resolve(assignmentDir, 'comments.md');\n const timestamp = nowTimestamp();\n const author = options.author ?? process.env.USER ?? 'unknown';\n\n let currentContent: string;\n let currentCount = 0;\n if (await fileExists(commentsPath)) {\n currentContent = await readFile(commentsPath, 'utf-8');\n const countMatch = currentContent.match(/^entryCount:\\s*(\\d+)/m);\n if (countMatch) currentCount = parseInt(countMatch[1], 10);\n } else {\n currentContent = renderComments({ assignment: assignmentRef, timestamp });\n }\n\n const comment: Comment = {\n id: shortId(),\n timestamp,\n author,\n type,\n body: text,\n replyTo: options.replyTo,\n resolved: type === 'question' ? false : undefined,\n };\n\n const entry = formatCommentEntry(comment);\n const nextCount = currentCount + 1;\n\n let next = setTopLevelField(currentContent, 'entryCount', nextCount);\n next = setTopLevelField(next, 'updated', `\"${timestamp}\"`);\n\n if (next.includes('No comments yet.')) {\n next = next.replace('No comments yet.', entry.trimEnd());\n } else {\n next = `${next.trimEnd()}\\n\\n${entry}`;\n }\n\n await writeFileForce(commentsPath, next);\n\n console.log(`Added ${type} comment ${comment.id} to ${assignmentRef} (${commentsPath})`);\n if (options.replyTo) {\n console.log(` In reply to: ${options.replyTo}`);\n }\n}\n","import { resolve } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport { expandHome, assignmentsDir as assignmentsDirFn } from '../utils/paths.js';\nimport { fileExists, writeFileForce } from '../utils/fs.js';\nimport { readConfig } from '../utils/config.js';\nimport { isValidSlug } from '../utils/slug.js';\nimport { nowTimestamp } from '../utils/timestamp.js';\nimport { resolveAssignmentById } from '../utils/assignment-resolver.js';\n\nexport interface RequestOptions {\n project?: string;\n dir?: string;\n from?: string;\n}\n\nfunction setTopLevelField(content: string, key: string, value: string): string {\n const fieldRegex = new RegExp(`^(${key}:)\\\\s*.*$`, 'm');\n if (fieldRegex.test(content)) {\n return content.replace(fieldRegex, `$1 ${value}`);\n }\n return content;\n}\n\nexport async function requestCommand(\n target: string,\n text: string,\n options: RequestOptions = {},\n): Promise<void> {\n if (!text || !text.trim()) {\n throw new Error('Request text cannot be empty.');\n }\n\n const config = await readConfig();\n const baseDir = options.dir ? expandHome(options.dir) : config.defaultProjectDir;\n\n let assignmentDir: string;\n let targetRef: string;\n if (options.project) {\n if (!isValidSlug(options.project)) {\n throw new Error(`Invalid project slug \"${options.project}\".`);\n }\n if (!isValidSlug(target)) {\n throw new Error(`Invalid assignment slug \"${target}\".`);\n }\n assignmentDir = resolve(baseDir, options.project, 'assignments', target);\n targetRef = target;\n } else {\n const resolved = await resolveAssignmentById(baseDir, assignmentsDirFn(), target);\n if (!resolved) {\n throw new Error(`Target assignment \"${target}\" not found. Provide --project <slug> or a valid UUID.`);\n }\n assignmentDir = resolved.assignmentDir;\n targetRef = resolved.standalone ? resolved.id : resolved.assignmentSlug;\n }\n\n const assignmentMdPath = resolve(assignmentDir, 'assignment.md');\n if (!(await fileExists(assignmentMdPath))) {\n throw new Error(`assignment.md not found at ${assignmentMdPath}`);\n }\n\n const source = options.from\n ?? process.env.SYNTAUR_ASSIGNMENT\n ?? 'unknown';\n\n let content = await readFile(assignmentMdPath, 'utf-8');\n const todoLine = `- [ ] ${text.trim()} (from: ${source})`;\n\n const todosHeading = /^## Todos\\s*$/m;\n if (todosHeading.test(content)) {\n content = content.replace(\n /(^## Todos[\\s\\S]*?)(\\n##\\s|\\n*$)/,\n (_m, section, nextHeading) => {\n return `${section.trimEnd()}\\n${todoLine}\\n${nextHeading}`;\n },\n );\n } else {\n // No Todos section — append one\n content = `${content.trimEnd()}\\n\\n## Todos\\n\\n${todoLine}\\n`;\n }\n\n const timestamp = nowTimestamp();\n content = setTopLevelField(content, 'updated', `\"${timestamp}\"`);\n\n await writeFileForce(assignmentMdPath, content);\n\n console.log(`Added todo to ${targetRef}: ${text.trim()} (from: ${source})`);\n}\n","import { readdir } from 'node:fs/promises';\nimport { readConfig } from './utils/config.js';\nimport {\n getConfiguredOrLegacyManagedPluginDir,\n getConfiguredOrLegacyMarketplacePath,\n isSyntaurDataInstalled,\n} from './utils/install.js';\n\nasync function hasAnyProjectContent(projectsDir: string): Promise<boolean> {\n try {\n const entries = await readdir(projectsDir, { withFileTypes: true });\n return entries.some((entry) => entry.isDirectory());\n } catch {\n return false;\n }\n}\n\nasync function isSetupComplete(): Promise<boolean> {\n const config = await readConfig();\n if (config.onboarding.completed) {\n return true;\n }\n\n const [\n claudePluginDir,\n codexPluginDir,\n codexMarketplacePath,\n hasProjectContent,\n ] = await Promise.all([\n getConfiguredOrLegacyManagedPluginDir('claude'),\n getConfiguredOrLegacyManagedPluginDir('codex'),\n getConfiguredOrLegacyMarketplacePath(),\n hasAnyProjectContent(config.defaultProjectDir),\n ]);\n\n return Boolean(\n claudePluginDir ||\n codexPluginDir ||\n codexMarketplacePath ||\n hasProjectContent,\n );\n}\n\nexport async function getDefaultCommandName(): Promise<'setup' | 'dashboard'> {\n if (!(await isSyntaurDataInstalled())) {\n return 'setup';\n }\n\n return (await isSetupComplete()) ? 'dashboard' : 'setup';\n}\n","import { fileURLToPath } from 'node:url';\nimport { readFile } from 'node:fs/promises';\nimport { dirname, join, resolve } from 'node:path';\nimport { spawn } from 'node:child_process';\nimport { createInterface } from 'node:readline/promises';\nimport { syntaurRoot } from './paths.js';\nimport { fileExists, writeFileForce } from './fs.js';\nimport { readPackageVersion } from './version.js';\n\ninterface NpxPromptState {\n decision: 'never' | 'installed';\n decidedAt: string;\n lastUpgradeHintVersion?: string;\n lastUpgradeHintAt?: string;\n}\n\nconst STATE_FILE = resolve(syntaurRoot(), 'npx-install.json');\nconst META_ARGS = new Set(['-h', '--help', '-V', '--version', 'help']);\nconst GLOBAL_VERSION_TIMEOUT_MS = 2000;\n\nfunction isRunningViaNpx(scriptUrl: string): boolean {\n let scriptPath: string;\n try {\n scriptPath = fileURLToPath(scriptUrl);\n } catch {\n return false;\n }\n const p = scriptPath.replace(/\\\\/g, '/');\n if (p.includes('/_npx/')) return true;\n if (p.includes('/pnpm/dlx/') || p.includes('/dlx-')) return true;\n if (p.includes('/bun/install/cache/bunx-') || p.includes('/bunx-')) return true;\n\n const ua = process.env.npm_config_user_agent ?? '';\n if (ua.includes('npx/')) return true;\n\n return false;\n}\n\nasync function readState(): Promise<NpxPromptState | null> {\n if (!(await fileExists(STATE_FILE))) return null;\n try {\n const raw = await readFile(STATE_FILE, 'utf-8');\n return JSON.parse(raw) as NpxPromptState;\n } catch {\n return null;\n }\n}\n\nasync function writeState(state: NpxPromptState): Promise<void> {\n await writeFileForce(STATE_FILE, `${JSON.stringify(state, null, 2)}\\n`);\n}\n\nasync function resolveNpmBin(): Promise<{ cmd: string; shell: boolean }> {\n const nodeDir = dirname(process.execPath);\n const isWin = process.platform === 'win32';\n const npmName = isWin ? 'npm.cmd' : 'npm';\n const nearNode = join(nodeDir, npmName);\n if (await fileExists(nearNode)) {\n return { cmd: nearNode, shell: false };\n }\n return { cmd: 'npm', shell: isWin };\n}\n\nasync function installGlobally(): Promise<boolean> {\n const { cmd, shell } = await resolveNpmBin();\n return new Promise((resolvePromise) => {\n const child = spawn(cmd, ['install', '-g', 'syntaur'], {\n stdio: 'inherit',\n shell,\n });\n child.on('exit', (code) => resolvePromise(code === 0));\n child.on('error', () => resolvePromise(false));\n });\n}\n\nasync function readGlobalVersion(): Promise<string | null> {\n const { cmd, shell } = await resolveNpmBin();\n const rootPath = await new Promise<string | null>((resolvePromise) => {\n const child = spawn(cmd, ['root', '-g'], {\n shell,\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n let out = '';\n const timer = setTimeout(() => {\n child.kill();\n resolvePromise(null);\n }, GLOBAL_VERSION_TIMEOUT_MS);\n child.stdout?.on('data', (chunk: Buffer) => {\n out += chunk.toString('utf-8');\n });\n child.on('exit', (code) => {\n clearTimeout(timer);\n resolvePromise(code === 0 ? out.trim() : null);\n });\n child.on('error', () => {\n clearTimeout(timer);\n resolvePromise(null);\n });\n });\n if (!rootPath) return null;\n try {\n const manifestPath = join(rootPath, 'syntaur', 'package.json');\n if (!(await fileExists(manifestPath))) return null;\n const raw = await readFile(manifestPath, 'utf-8');\n const parsed = JSON.parse(raw) as { version?: unknown };\n return typeof parsed.version === 'string' ? parsed.version : null;\n } catch {\n return null;\n }\n}\n\nexport function compareSemver(a: string, b: string): number {\n const parse = (v: string): number[] => {\n const core = v.split(/[-+]/)[0];\n const parts = core.split('.').map((p) => parseInt(p, 10));\n if (parts.some((n) => !Number.isFinite(n))) return [];\n while (parts.length < 3) parts.push(0);\n return parts.slice(0, 3);\n };\n const pa = parse(a);\n const pb = parse(b);\n if (pa.length === 0 || pb.length === 0) return 0;\n for (let i = 0; i < 3; i++) {\n if (pa[i] > pb[i]) return 1;\n if (pa[i] < pb[i]) return -1;\n }\n return 0;\n}\n\nasync function askChoice(promptLabel: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const controller = new AbortController();\n const onSigint = () => controller.abort();\n process.once('SIGINT', onSigint);\n try {\n const raw = await rl.question(promptLabel, {\n signal: controller.signal,\n });\n return raw.trim();\n } catch {\n return '';\n } finally {\n process.off('SIGINT', onSigint);\n rl.close();\n }\n}\n\nasync function maybePromptUpgrade(\n scriptUrl: string,\n state: NpxPromptState,\n): Promise<void> {\n const running = await readPackageVersion(scriptUrl);\n if (!running) return;\n if (state.lastUpgradeHintVersion === running) return;\n\n const globalV = await readGlobalVersion();\n if (!globalV) return;\n if (compareSemver(running, globalV) <= 0) return;\n\n console.log('');\n console.log(\n `Your installed syntaur (${globalV}) is behind this one (${running}). Upgrade your global install?`,\n );\n console.log(' 1) Yes — upgrade now');\n console.log(' 2) Not now — just start it for this run');\n const answer = await askChoice('Choose [1/2]: ');\n\n const hintUpdate = {\n lastUpgradeHintVersion: running,\n lastUpgradeHintAt: new Date().toISOString(),\n };\n\n if (answer === '1') {\n console.log('\\nUpgrading syntaur globally...\\n');\n const ok = await installGlobally();\n if (ok) {\n await writeState({ ...state, ...hintUpdate });\n console.log(\n `\\nUpgraded to ${running}. From now on \\`syntaur\\` will use the new version.\\n`,\n );\n } else {\n console.log('\\nUpgrade failed. Continuing with this run.\\n');\n }\n return;\n }\n\n await writeState({ ...state, ...hintUpdate });\n}\n\nexport async function maybePromptInstall(scriptUrl: string): Promise<void> {\n if (!isRunningViaNpx(scriptUrl)) return;\n if (process.env.SYNTAUR_SKIP_INSTALL_PROMPT === '1') return;\n if (!process.stdout.isTTY || !process.stdin.isTTY) return;\n\n const args = process.argv.slice(2);\n if (args.some((a) => META_ARGS.has(a))) return;\n\n const state = await readState();\n if (state?.decision === 'never') return;\n if (state?.decision === 'installed') {\n await maybePromptUpgrade(scriptUrl, state);\n return;\n }\n\n console.log('');\n console.log(\n \"You're running syntaur via npx. Install it globally for faster startup?\",\n );\n console.log(' 1) Yes — install now');\n console.log(' 2) Maybe later — just start it for now');\n console.log(\" 3) Never — don't ask again\");\n const answer = await askChoice('Choose [1/2/3]: ');\n\n if (answer === '1') {\n console.log('\\nInstalling syntaur globally...\\n');\n const ok = await installGlobally();\n if (ok) {\n await writeState({\n decision: 'installed',\n decidedAt: new Date().toISOString(),\n });\n console.log('\\nInstalled. From now on you can run `syntaur` directly.\\n');\n } else {\n console.log('\\nInstall failed. Continuing with this run.\\n');\n }\n } else if (answer === '3') {\n await writeState({\n decision: 'never',\n decidedAt: new Date().toISOString(),\n });\n console.log(\"Got it — won't ask again.\\n\");\n }\n}\n","import { fileURLToPath } from 'node:url';\nimport { readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\n\nexport async function readPackageVersion(\n scriptUrl: string,\n): Promise<string | null> {\n try {\n const scriptPath = fileURLToPath(scriptUrl);\n const pkgRoot = dirname(dirname(scriptPath));\n const raw = await readFile(join(pkgRoot, 'package.json'), 'utf-8');\n const parsed = JSON.parse(raw) as { version?: unknown };\n return typeof parsed.version === 'string' ? parsed.version : null;\n } catch {\n return null;\n }\n}\n"],"mappings":"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","names":["readFile","resolve","init_config","extractFrontmatter","parseSimpleValue","parseExternalIds","getField","resolve","readFile","terminalStatuses","readdir","readFile","resolve","nowTimestamp","resolve","readdir","readFile","output","projectsDir","assignmentsDir","serversDir","readdir","readFile","writeFile","resolve","dirname","c","projectsDir","serversDir","scanAllSessions","assignmentsDir","terminalStatuses","playbooksDir","init_config","appendLogEntry","readFile","resolve","parseStatus","todosDir","init_parser","projectsDir","err","useState","c","useState","useMemo","useMemo","Box","Text","jsx","start","end","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","projectsDir","input","spawn","mkdir","writeFile","resolve","projectsDir","err","Command","resolve","dirname","readdir","readFile","resolve","playbooksDir","projectsDir","resolve","playbooksDir","dirname","readdir","readFile","resolve","init_config","resolve","resolve","init_config","resolve","init_config","resolve","dirname","fileURLToPath","resolve","writeFile","unlink","projectsDir","serversDir","playbooksDir","todosDir","handleServerChange","handlePlaybookChange","handleTodoChange","init_config","resolve","readFile","extractFrontmatter","formatYamlValue","readFile","projectsDir","resolve","Router","serversDir","projectsDir","Router","resolve","randomUUID","readFile","resolve","resolve","readdir","projectsDir","readdir","resolve","readFile","c","db","rows","resolve","readFile","projectsDir","projectsDir","Router","resolve","randomUUID","Router","resolve","readFile","unlink","playbooksDir","Router","resolve","readFile","unlink","init_parser","Router","readdir","todosDir","archivePath","resolve","readFile","writeFileForce","appendLogEntry","init_config","Router","init_config","execFile","promisify","rm","readFile","writeFile","unlink","rename","resolve","join","exec","c","resolve","exec","err","readFile","unlink","join","rm","writeFile","rename","Router","err","err","output","serversDir","projectsDir","projectsDir","serversDir","playbooksDir","todosDir","err","resolve","writeFile","unlink","projectsDir","fileURLToPath","resolve","dirname","err","init_config","resolve","resolve","readdir","readFile","projectsDir","assignmentsDir","resolve","init_config","init_config","cp","readdir","readFile","rm","unlink","writeFile","homedir","dirname","isAbsolute","relative","resolve","dirname","resolve","fileURLToPath","homedir","resolve","readFile","dirname","manifestName","writeFile","cp","rm","unlink","isAbsolute","relative","readdir","rm","resolve","init_config","promptForInstallPath","init_config","resolve","resolve","init_config","resolve","resolve","init_config","resolve","randomUUID","resolve","randomUUID","init_config","projectsDir","React","App","launchAgent","resolve","resolve","readdir","readFile","resolve","init_parser","readFile","resolve","WORKSPACE_REGEX","appendLogEntry","init_config","Command","Command","Command","fileURLToPath","readFile","dirname","join","init_config","Database","resolve","db","err","resolve","isAbsolute","readFile","stat","fileURLToPath","dirname","join","integrationChecks","resolve","readdir","stat","CATEGORY","pass","playbooksDir","resolve","readdir","stat","CATEGORY","listProjects","pass","resolve","readdir","readFile","CATEGORY","projectsDir","assignmentsDir","requiredFiles","pass","resolve","CATEGORY","pass","err","projectsDir","readdir","CATEGORY","skipped","pass","projectsDir","resolve","readFile","CATEGORY","err","skipped","pass","terminalStatuses","c","skipped","err","version","fileURLToPath","dirname","readFile","join","c","Command","err","init_config","resolve","readFile","setTopLevelField","resolve","readFile","init_config","resolve","readFile","setTopLevelField","resolve","readFile","init_config","readdir","projectsDir","readdir","fileURLToPath","readFile","dirname","join","resolve","spawn","createInterface","fileURLToPath","readFile","dirname","join","resolve","fileURLToPath","readFile","dirname","join","spawn","timer","createInterface","Command"]}
1
+ {"version":3,"sources":["../src/utils/paths.ts","../src/utils/fs.ts","../src/templates/config.ts","../src/dashboard/parser.ts","../src/utils/timestamp.ts","../src/utils/fs-migration.ts","../src/utils/config.ts","../src/lifecycle/types.ts","../src/lifecycle/state-machine.ts","../src/lifecycle/frontmatter.ts","../src/lifecycle/transitions.ts","../src/lifecycle/index.ts","../src/utils/assignment-resolver.ts","../src/dashboard/help.ts","../src/dashboard/servers.ts","../src/dashboard/scanner.ts","../src/dashboard/api.ts","../src/todos/parser.ts","../src/tui/hooks/useProjects.ts","../src/tui/hooks/useTreeState.ts","../src/tui/hooks/useSearch.ts","../src/tui/colors.ts","../src/tui/components/TreeItem.tsx","../src/tui/components/TreeView.tsx","../src/tui/components/SearchBar.tsx","../src/tui/components/StatusBar.tsx","../src/tui/App.tsx","../src/tui/launch.ts","../src/index.ts","../src/commands/init.ts","../src/utils/playbooks.ts","../src/commands/create-project.ts","../src/utils/slug.ts","../src/utils/uuid.ts","../src/templates/index.ts","../src/templates/manifest.ts","../src/utils/yaml.ts","../src/templates/project.ts","../src/templates/assignment.ts","../src/templates/scratchpad.ts","../src/templates/handoff.ts","../src/templates/progress.ts","../src/templates/comments.ts","../src/templates/decision-record.ts","../src/templates/index-stubs.ts","../src/templates/playbook.ts","../src/templates/cursor-rules.ts","../src/templates/codex-agents.ts","../src/templates/opencode-config.ts","../src/commands/create-assignment.ts","../src/commands/dashboard.ts","../src/dashboard/server.ts","../src/dashboard/agent-sessions.ts","../src/dashboard/session-db.ts","../src/dashboard/watcher.ts","../src/dashboard/api-write.ts","../src/dashboard/acceptance-criteria.ts","../src/dashboard/api-servers.ts","../src/dashboard/api-agent-sessions.ts","../src/dashboard/api-playbooks.ts","../src/dashboard/api-todos.ts","../src/dashboard/api-backup.ts","../src/utils/github-backup.ts","../src/dashboard/autodiscovery.ts","../src/commands/_lifecycle-helper.ts","../src/commands/assign.ts","../src/commands/start.ts","../src/commands/complete.ts","../src/commands/block.ts","../src/commands/unblock.ts","../src/commands/review.ts","../src/commands/fail.ts","../src/commands/reopen.ts","../src/commands/install-plugin.ts","../src/utils/install.ts","../src/utils/package-root.ts","../src/utils/prompt.ts","../src/commands/install-codex-plugin.ts","../src/commands/setup.ts","../src/commands/uninstall.ts","../src/commands/setup-adapter.ts","../src/commands/track-session.ts","../src/commands/browse.ts","../src/commands/create-playbook.ts","../src/commands/list-playbooks.ts","../src/commands/todo.ts","../src/commands/backup.ts","../src/commands/doctor.ts","../src/utils/doctor/index.ts","../src/utils/doctor/context.ts","../src/utils/doctor/checks/env.ts","../src/utils/doctor/checks/structure.ts","../src/utils/doctor/checks/project.ts","../src/utils/doctor/checks/assignment.ts","../src/utils/doctor/checks/dashboard.ts","../src/utils/doctor/checks/integrations.ts","../src/utils/doctor/checks/workspace.ts","../src/utils/doctor/registry.ts","../src/utils/doctor/output-human.ts","../src/utils/doctor/output-json.ts","../src/commands/comment.ts","../src/commands/request.ts","../src/cli-default-command.ts","../src/utils/npx-prompt.ts","../src/utils/version.ts"],"sourcesContent":["import { homedir } from 'node:os';\nimport { resolve } from 'node:path';\n\nexport function expandHome(p: string): string {\n if (p.startsWith('~/') || p === '~') {\n return resolve(homedir(), p.slice(2));\n }\n return p;\n}\n\nexport function syntaurRoot(): string {\n const override = process.env.SYNTAUR_HOME;\n if (override && override.length > 0) {\n return resolve(expandHome(override));\n }\n return resolve(homedir(), '.syntaur');\n}\n\nexport function defaultProjectDir(): string {\n return resolve(syntaurRoot(), 'projects');\n}\n\nexport function assignmentsDir(): string {\n return resolve(syntaurRoot(), 'assignments');\n}\n\nexport function serversDir(): string {\n return resolve(syntaurRoot(), 'servers');\n}\n\nexport function playbooksDir(): string {\n return resolve(syntaurRoot(), 'playbooks');\n}\n\nexport function todosDir(): string {\n return resolve(syntaurRoot(), 'todos');\n}\n","import { mkdir, writeFile, access, rename } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\n\nexport async function ensureDir(dir: string): Promise<void> {\n await mkdir(dir, { recursive: true });\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function writeFileSafe(\n filePath: string,\n content: string,\n): Promise<boolean> {\n if (await fileExists(filePath)) {\n return false;\n }\n await ensureDir(dirname(filePath));\n await writeFile(filePath, content, 'utf-8');\n return true;\n}\n\nexport async function writeFileForce(\n filePath: string,\n content: string,\n): Promise<void> {\n const dir = dirname(filePath);\n const tempPath = join(\n dir,\n `.${Math.random().toString(36).slice(2)}.${Date.now()}.tmp`,\n );\n await ensureDir(dir);\n await writeFile(tempPath, content, 'utf-8');\n await rename(tempPath, filePath);\n}\n","export interface ConfigParams {\n defaultProjectDir: string;\n}\n\nexport function renderConfig(params: ConfigParams): string {\n return `---\nversion: \"1.0\"\ndefaultProjectDir: ${params.defaultProjectDir}\nonboarding:\n completed: false\nagentDefaults:\n trustLevel: medium\n autoApprove: false\nbackup:\n repo: null\n categories: projects, playbooks, todos, servers, config\n lastBackup: null\n lastRestore: null\n---\n\n# Syntaur Configuration\n\nGlobal configuration for the Syntaur CLI.\n`;\n}\n","/**\n * Generic frontmatter/markdown parser for all Syntaur file types.\n * Pattern copied from src/lifecycle/frontmatter.ts:3-23 (extractFrontmatter + parseSimpleValue).\n */\n\nexport interface ParsedFile {\n frontmatter: Record<string, string>;\n body: string;\n}\n\n/**\n * Split a markdown file into its frontmatter block and body.\n */\nexport function extractFrontmatter(fileContent: string): [string, string] {\n const match = fileContent.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) {\n return ['', fileContent];\n }\n const frontmatterBlock = match[1];\n const body = fileContent.slice(match[0].length).trim();\n return [frontmatterBlock, body];\n}\n\n/**\n * Parse a simple YAML value, handling null and quoted strings.\n */\nfunction parseSimpleValue(raw: string): string | null {\n const trimmed = raw.trim();\n if (trimmed === 'null' || trimmed === '') return null;\n if (\n (trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n ) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n}\n\n/**\n * Extract a top-level scalar field from frontmatter text.\n */\nexport function getField(frontmatter: string, key: string): string | null {\n const match = frontmatter.match(new RegExp(`^${key}:\\\\s*(.*)$`, 'm'));\n if (!match) return null;\n return parseSimpleValue(match[1]);\n}\n\n/**\n * Extract an indented scalar field (one level deep) from frontmatter text.\n */\nexport function getNestedField(frontmatter: string, parent: string, key: string): string | null {\n const parentRegex = new RegExp(`^${parent}:\\\\s*\\\\n((?:\\\\s+.*\\\\n?)*)`, 'm');\n const parentMatch = frontmatter.match(parentRegex);\n if (!parentMatch) return null;\n const block = parentMatch[1];\n const fieldMatch = block.match(new RegExp(`^\\\\s+${key}:\\\\s*(.*)$`, 'm'));\n if (!fieldMatch) return null;\n return parseSimpleValue(fieldMatch[1]);\n}\n\n/**\n * Parse a YAML list field (e.g., tags, dependsOn, relatedAssignments).\n */\nfunction parseListField(frontmatter: string, fieldName: string): string[] {\n const inlineMatch = frontmatter.match(new RegExp(`^${fieldName}:\\\\s*\\\\[\\\\s*\\\\]`, 'm'));\n if (inlineMatch) return [];\n\n const results: string[] = [];\n const blockMatch = frontmatter.match(\n new RegExp(`^${fieldName}:\\\\s*\\\\n((?:\\\\s+-\\\\s+.*\\\\n?)*)`, 'm'),\n );\n if (blockMatch) {\n let item: RegExpExecArray | null;\n const regex = /^\\s+-\\s+(.+)$/gm;\n while ((item = regex.exec(blockMatch[1])) !== null) {\n results.push(item[1].trim());\n }\n }\n return results;\n}\n\n// --- Project Parser ---\n\nexport interface ParsedProject {\n id: string;\n slug: string;\n title: string;\n archived: boolean;\n archivedAt: string | null;\n archivedReason: string | null;\n statusOverride: string | null;\n created: string;\n updated: string;\n tags: string[];\n workspace: string | null;\n body: string;\n}\n\nexport function parseProject(fileContent: string): ParsedProject {\n const [fm, body] = extractFrontmatter(fileContent);\n // Legacy alias: pre-v0.2.0 installs used `mission` as the slug key. The\n // fs-migration helper renames the file but doesn't rewrite user-owned\n // frontmatter. Accept either key.\n const slug = getField(fm, 'slug') ?? getField(fm, 'mission') ?? '';\n return {\n id: getField(fm, 'id') ?? '',\n slug,\n title: getField(fm, 'title') ?? '',\n archived: getField(fm, 'archived') === 'true',\n archivedAt: getField(fm, 'archivedAt'),\n archivedReason: getField(fm, 'archivedReason'),\n statusOverride: getField(fm, 'statusOverride'),\n created: getField(fm, 'created') ?? '',\n updated: getField(fm, 'updated') ?? '',\n tags: parseListField(fm, 'tags'),\n workspace: getField(fm, 'workspace'),\n body,\n };\n}\n\n// --- Status Parser (for _status.md) ---\n\nexport interface ParsedStatus {\n project: string;\n status: string;\n progress: Record<string, number> & { total: number };\n needsAttention: {\n blockedCount: number;\n failedCount: number;\n openQuestions: number;\n };\n body: string;\n}\n\nexport function parseStatus(fileContent: string): ParsedStatus {\n const [fm, body] = extractFrontmatter(fileContent);\n\n // Dynamically parse progress fields\n const progress: Record<string, number> & { total: number } = { total: 0 };\n const progressMatch = fm.match(/^progress:\\s*\\n((?:\\s+.*\\n?)*)/m);\n if (progressMatch) {\n const lines = progressMatch[1].split('\\n');\n for (const line of lines) {\n const kv = line.match(/^\\s+(\\w+):\\s*(\\d+)/);\n if (kv) {\n progress[kv[1]] = parseInt(kv[2], 10);\n }\n }\n }\n\n return {\n project: getField(fm, 'project') ?? '',\n status: getField(fm, 'status') ?? 'pending',\n progress,\n needsAttention: {\n blockedCount: parseInt(getNestedField(fm, 'needsAttention', 'blockedCount') ?? '0', 10),\n failedCount: parseInt(getNestedField(fm, 'needsAttention', 'failedCount') ?? '0', 10),\n openQuestions: parseInt(getNestedField(fm, 'needsAttention', 'openQuestions') ?? '0', 10),\n },\n body,\n };\n}\n\n// --- Assignment Summary Parser ---\n\nexport interface ParsedAssignmentSummary {\n id: string;\n slug: string;\n title: string;\n status: string;\n priority: string;\n assignee: string | null;\n dependsOn: string[];\n links: string[];\n updated: string;\n}\n\nexport function parseAssignmentSummary(fileContent: string): ParsedAssignmentSummary {\n const [fm] = extractFrontmatter(fileContent);\n return {\n id: getField(fm, 'id') ?? '',\n slug: getField(fm, 'slug') ?? '',\n title: getField(fm, 'title') ?? '',\n status: getField(fm, 'status') ?? 'pending',\n priority: getField(fm, 'priority') ?? 'medium',\n assignee: getField(fm, 'assignee'),\n dependsOn: parseListField(fm, 'dependsOn'),\n links: parseListField(fm, 'links'),\n updated: getField(fm, 'updated') ?? '',\n };\n}\n\n// --- Full Assignment Parser ---\n\nexport interface ParsedAssignmentFull {\n id: string;\n slug: string;\n title: string;\n project: string | null;\n type: string | null;\n status: string;\n priority: string;\n assignee: string | null;\n dependsOn: string[];\n links: string[];\n blockedReason: string | null;\n workspace: {\n repository: string | null;\n worktreePath: string | null;\n branch: string | null;\n parentBranch: string | null;\n };\n externalIds: Array<{ system: string; id: string; url: string }>;\n tags: string[];\n created: string;\n updated: string;\n body: string;\n}\n\nfunction parseExternalIds(frontmatter: string): Array<{ system: string; id: string; url: string }> {\n const inlineMatch = frontmatter.match(/^externalIds:\\s*\\[\\s*\\]/m);\n if (inlineMatch) return [];\n\n const results: Array<{ system: string; id: string; url: string }> = [];\n const blockMatch = frontmatter.match(\n /^externalIds:\\s*\\n((?:\\s+-\\s+[\\s\\S]*?)(?=^\\w|\\n---))/m,\n );\n if (!blockMatch) return [];\n\n const itemBlocks = blockMatch[1].split(/\\n\\s+-\\s+/).filter(Boolean);\n for (const block of itemBlocks) {\n const lines = block.split('\\n');\n const entry: Record<string, string> = {};\n for (const line of lines) {\n const colonIdx = line.indexOf(':');\n if (colonIdx < 0) continue;\n const key = line.slice(0, colonIdx).trim().replace(/^-\\s+/, '');\n const value = line.slice(colonIdx + 1).trim();\n if (key && value) {\n entry[key] = value;\n }\n }\n if (entry['system'] && entry['id'] && entry['url']) {\n results.push({\n system: entry['system'],\n id: entry['id'],\n url: entry['url'],\n });\n }\n }\n return results;\n}\n\nexport function parseAssignmentFull(fileContent: string): ParsedAssignmentFull {\n const [fm, body] = extractFrontmatter(fileContent);\n return {\n id: getField(fm, 'id') ?? '',\n slug: getField(fm, 'slug') ?? '',\n title: getField(fm, 'title') ?? '',\n project: getField(fm, 'project'),\n type: getField(fm, 'type'),\n status: getField(fm, 'status') ?? 'pending',\n priority: getField(fm, 'priority') ?? 'medium',\n assignee: getField(fm, 'assignee'),\n dependsOn: parseListField(fm, 'dependsOn'),\n links: parseListField(fm, 'links'),\n blockedReason: getField(fm, 'blockedReason'),\n workspace: {\n repository: getNestedField(fm, 'workspace', 'repository'),\n worktreePath: getNestedField(fm, 'workspace', 'worktreePath'),\n branch: getNestedField(fm, 'workspace', 'branch'),\n parentBranch: getNestedField(fm, 'workspace', 'parentBranch'),\n },\n externalIds: parseExternalIds(fm),\n tags: parseListField(fm, 'tags'),\n created: getField(fm, 'created') ?? '',\n updated: getField(fm, 'updated') ?? '',\n body,\n };\n}\n\n// --- Plan Parser ---\n\nexport interface ParsedPlan {\n assignment: string;\n status: string;\n created: string;\n updated: string;\n body: string;\n}\n\nexport function parsePlan(fileContent: string): ParsedPlan {\n const [fm, body] = extractFrontmatter(fileContent);\n return {\n assignment: getField(fm, 'assignment') ?? '',\n status: getField(fm, 'status') ?? '',\n created: getField(fm, 'created') ?? '',\n updated: getField(fm, 'updated') ?? '',\n body,\n };\n}\n\n// --- Scratchpad Parser ---\n\nexport interface ParsedScratchpad {\n assignment: string;\n updated: string;\n body: string;\n}\n\nexport function parseScratchpad(fileContent: string): ParsedScratchpad {\n const [fm, body] = extractFrontmatter(fileContent);\n return {\n assignment: getField(fm, 'assignment') ?? '',\n updated: getField(fm, 'updated') ?? '',\n body,\n };\n}\n\n// --- Handoff Parser ---\n\nexport interface ParsedHandoff {\n assignment: string;\n handoffCount: number;\n updated: string;\n body: string;\n}\n\nexport function parseHandoff(fileContent: string): ParsedHandoff {\n const [fm, body] = extractFrontmatter(fileContent);\n return {\n assignment: getField(fm, 'assignment') ?? '',\n handoffCount: parseInt(getField(fm, 'handoffCount') ?? '0', 10),\n updated: getField(fm, 'updated') ?? '',\n body,\n };\n}\n\n// --- Decision Record Parser ---\n\nexport interface ParsedDecisionRecord {\n assignment: string;\n decisionCount: number;\n updated: string;\n body: string;\n}\n\nexport function parseDecisionRecord(fileContent: string): ParsedDecisionRecord {\n const [fm, body] = extractFrontmatter(fileContent);\n return {\n assignment: getField(fm, 'assignment') ?? '',\n decisionCount: parseInt(getField(fm, 'decisionCount') ?? '0', 10),\n updated: getField(fm, 'updated') ?? '',\n body,\n };\n}\n\n// --- Comments Parser ---\n\nexport interface ParsedComment {\n id: string;\n timestamp: string;\n author: string;\n type: 'question' | 'note' | 'feedback';\n body: string;\n replyTo?: string;\n resolved?: boolean;\n}\n\nexport interface ParsedComments {\n assignment: string;\n entryCount: number;\n updated: string;\n entries: ParsedComment[];\n body: string;\n}\n\nexport function parseComments(fileContent: string): ParsedComments {\n const [fm, body] = extractFrontmatter(fileContent);\n const entries: ParsedComment[] = [];\n const sections = body.split(/^## /m).slice(1);\n for (const section of sections) {\n const newlineIdx = section.indexOf('\\n');\n if (newlineIdx === -1) continue;\n const id = section.slice(0, newlineIdx).trim();\n const rest = section.slice(newlineIdx + 1);\n const headerMatch = rest.match(\n /^\\s*\\*\\*Recorded:\\*\\*\\s*(.*)\\n\\*\\*Author:\\*\\*\\s*(.*)\\n\\*\\*Type:\\*\\*\\s*(question|note|feedback)(?:\\n\\*\\*Reply to:\\*\\*\\s*(.*))?(?:\\n\\*\\*Resolved:\\*\\*\\s*(true|false))?\\n+([\\s\\S]*)$/,\n );\n if (!headerMatch) continue;\n const [, timestamp, author, type, replyTo, resolvedStr, entryBody] = headerMatch;\n const entry: ParsedComment = {\n id,\n timestamp: timestamp.trim(),\n author: author.trim(),\n type: type as 'question' | 'note' | 'feedback',\n body: entryBody.trim(),\n };\n if (replyTo) entry.replyTo = replyTo.trim();\n if (resolvedStr) entry.resolved = resolvedStr === 'true';\n entries.push(entry);\n }\n return {\n assignment: getField(fm, 'assignment') ?? '',\n entryCount: parseInt(getField(fm, 'entryCount') ?? '0', 10),\n updated: getField(fm, 'updated') ?? '',\n entries,\n body,\n };\n}\n\n// --- Progress Parser ---\n\nexport interface ProgressEntry {\n timestamp: string;\n body: string;\n}\n\nexport interface ParsedProgress {\n assignment: string;\n entryCount: number;\n updated: string;\n entries: ProgressEntry[];\n body: string;\n}\n\nexport function parseProgress(fileContent: string): ParsedProgress {\n const [fm, body] = extractFrontmatter(fileContent);\n const entries: ProgressEntry[] = [];\n const sections = body.split(/^## /m).slice(1);\n for (const section of sections) {\n const newlineIdx = section.indexOf('\\n');\n if (newlineIdx === -1) continue;\n const timestamp = section.slice(0, newlineIdx).trim();\n const entryBody = section.slice(newlineIdx + 1).trim();\n entries.push({ timestamp, body: entryBody });\n }\n return {\n assignment: getField(fm, 'assignment') ?? '',\n entryCount: parseInt(getField(fm, 'entryCount') ?? '0', 10),\n updated: getField(fm, 'updated') ?? '',\n entries,\n body,\n };\n}\n\n// --- Resource Parser ---\n\nexport interface ParsedResource {\n name: string;\n source: string;\n category: string;\n relatedAssignments: string[];\n created: string;\n updated: string;\n body: string;\n}\n\nexport function parseResource(fileContent: string): ParsedResource {\n const [fm, body] = extractFrontmatter(fileContent);\n return {\n name: getField(fm, 'name') ?? '',\n source: getField(fm, 'source') ?? '',\n category: getField(fm, 'category') ?? '',\n relatedAssignments: parseListField(fm, 'relatedAssignments'),\n created: getField(fm, 'created') ?? '',\n updated: getField(fm, 'updated') ?? '',\n body,\n };\n}\n\n// --- Memory Parser ---\n\nexport interface ParsedMemory {\n name: string;\n source: string;\n scope: string;\n sourceAssignment: string | null;\n relatedAssignments: string[];\n created: string;\n updated: string;\n body: string;\n}\n\nexport function parseMemory(fileContent: string): ParsedMemory {\n const [fm, body] = extractFrontmatter(fileContent);\n return {\n name: getField(fm, 'name') ?? '',\n source: getField(fm, 'source') ?? '',\n scope: getField(fm, 'scope') ?? '',\n sourceAssignment: getField(fm, 'sourceAssignment'),\n relatedAssignments: parseListField(fm, 'relatedAssignments'),\n created: getField(fm, 'created') ?? '',\n updated: getField(fm, 'updated') ?? '',\n body,\n };\n}\n\n// --- Playbook Parser ---\n\nexport interface ParsedPlaybook {\n slug: string;\n name: string;\n description: string;\n whenToUse: string;\n created: string;\n updated: string;\n tags: string[];\n body: string;\n}\n\nexport function parsePlaybook(fileContent: string): ParsedPlaybook {\n const [fm, body] = extractFrontmatter(fileContent);\n return {\n slug: getField(fm, 'slug') ?? '',\n name: getField(fm, 'name') ?? '',\n description: getField(fm, 'description') ?? '',\n whenToUse: getField(fm, 'when_to_use') ?? '',\n created: getField(fm, 'created') ?? '',\n updated: getField(fm, 'updated') ?? '',\n tags: parseListField(fm, 'tags'),\n body,\n };\n}\n\n// --- Mermaid Graph Extractor ---\n\n/**\n * Extract the mermaid code block from _status.md body content.\n * Returns null if no mermaid block is found.\n */\nexport function extractMermaidGraph(body: string): string | null {\n const match = body.match(/```mermaid\\n([\\s\\S]*?)```/);\n return match ? match[1].trim() : null;\n}\n","export function nowTimestamp(): string {\n return new Date().toISOString().replace(/\\.\\d{3}Z$/, 'Z');\n}\n","import { readdir, readFile, rename, writeFile } from 'node:fs/promises';\nimport type { Dirent } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { fileExists } from './fs.js';\n\n/**\n * Filesystem-level migrations for users upgrading from pre-v0.2.0 installs,\n * where the product used \"mission\" terminology. v0.2.0 renamed code but\n * shipped no on-disk migration, leaving user state unreadable by the new\n * scanner. These helpers close that gap.\n *\n * All helpers are idempotent, safe on missing paths, and NEVER delete user\n * files. Legacy files that are no longer read (e.g., per-project agent.md,\n * claude.md) are left untouched.\n */\n\nexport interface ProjectFilesMigrationResult {\n /** Relative paths of files that were renamed (e.g. `ai-chat-v2/mission.md`). */\n renamedProjectFiles: string[];\n /** Project slugs that still have stale agent.md / claude.md files. Reported, not deleted. */\n legacyExtras: string[];\n}\n\nexport interface ConfigMigrationResult {\n /** True if `defaultMissionDir` was renamed to `defaultProjectDir`. */\n renamedField: boolean;\n /** True if the on-disk `<root>/missions` dir was renamed to `<root>/projects`. */\n renamedDir: boolean;\n /** The resolved projects dir after migration (absolute, or null if config absent). */\n resolvedProjectsDir: string | null;\n}\n\n/**\n * Walk each project directory under `projectsDir` and rename\n * `mission.md` → `project.md` when the legacy file is present and the new\n * name isn't. Reports stale per-project `agent.md` / `claude.md` files\n * without touching them.\n *\n * Swallows per-entry errors (e.g., EPERM on a single dir) so one bad\n * project can't block the rest. Never throws.\n */\nexport async function migrateLegacyProjectFiles(\n projectsDir: string,\n): Promise<ProjectFilesMigrationResult> {\n const result: ProjectFilesMigrationResult = {\n renamedProjectFiles: [],\n legacyExtras: [],\n };\n\n if (!(await fileExists(projectsDir))) return result;\n\n let entries: Dirent[];\n try {\n entries = (await readdir(projectsDir, { withFileTypes: true })) as Dirent[];\n } catch {\n return result;\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) continue;\n\n const projectDir = resolve(projectsDir, entry.name);\n const legacy = resolve(projectDir, 'mission.md');\n const target = resolve(projectDir, 'project.md');\n\n try {\n if ((await fileExists(legacy)) && !(await fileExists(target))) {\n await rename(legacy, target);\n result.renamedProjectFiles.push(`${entry.name}/mission.md`);\n }\n } catch {\n // Swallow per-project errors (permission denied, racing editor, etc).\n continue;\n }\n\n // Surface stale legacy files without deleting them — caller decides how\n // to present (log once at startup).\n for (const stale of ['agent.md', 'claude.md']) {\n try {\n if (await fileExists(resolve(projectDir, stale))) {\n result.legacyExtras.push(`${entry.name}/${stale}`);\n }\n } catch {\n // Ignore.\n }\n }\n }\n\n return result;\n}\n\n/**\n * Migrate ~/.syntaur/config.md frontmatter and, optionally, the on-disk\n * projects directory, from the pre-v0.2.0 \"mission\" layout.\n *\n * - Renames `defaultMissionDir` → `defaultProjectDir` in frontmatter when\n * the new key isn't already present.\n * - If the resolved projects dir ends in `/missions` AND that dir exists\n * AND its `/projects` sibling does not, renames the directory on disk\n * and updates the config to point at the new path.\n *\n * Only rewrites the config file when an actual change is made.\n */\nexport async function migrateLegacyConfig(\n configPath: string,\n): Promise<ConfigMigrationResult> {\n const result: ConfigMigrationResult = {\n renamedField: false,\n renamedDir: false,\n resolvedProjectsDir: null,\n };\n\n if (!(await fileExists(configPath))) return result;\n\n let content: string;\n try {\n content = await readFile(configPath, 'utf-8');\n } catch {\n return result;\n }\n\n const fmMatch = content.match(/^---\\n([\\s\\S]*?)\\n---\\n?/);\n if (!fmMatch) return result;\n\n const fmBlock = fmMatch[1];\n const afterFm = content.slice(fmMatch[0].length);\n\n // --- Field rename ---\n const missionLineRe = /^(\\s*)defaultMissionDir\\s*:\\s*(.*)$/m;\n const missionLineMatch = fmBlock.match(missionLineRe);\n const hasProjectLine = /^\\s*defaultProjectDir\\s*:/m.test(fmBlock);\n\n let newFmBlock = fmBlock;\n let missionValue: string | null = null;\n if (missionLineMatch) {\n missionValue = missionLineMatch[2].trim();\n if (!hasProjectLine) {\n newFmBlock = fmBlock.replace(\n missionLineRe,\n `$1defaultProjectDir: ${missionValue}`,\n );\n result.renamedField = true;\n } else {\n // Both keys present; strip the legacy one to avoid drift.\n newFmBlock = fmBlock.replace(missionLineRe, '').replace(/\\n{2,}/g, '\\n');\n result.renamedField = true;\n }\n }\n\n // --- Resolve the current projects dir from whatever the frontmatter says. ---\n const projectLineRe = /^\\s*defaultProjectDir\\s*:\\s*(.*)$/m;\n const projectLineMatch = newFmBlock.match(projectLineRe);\n const projectsDirRaw = projectLineMatch\n ? projectLineMatch[1].trim().replace(/^['\"]|['\"]$/g, '')\n : missionValue;\n\n const expand = (p: string): string =>\n p.startsWith('~')\n ? resolve(process.env.HOME ?? '/', p.slice(p.startsWith('~/') ? 2 : 1))\n : p;\n\n let resolvedProjectsDir = projectsDirRaw ? expand(projectsDirRaw) : null;\n\n // --- Directory rename (only if the value still points at a /missions dir). ---\n if (resolvedProjectsDir && resolvedProjectsDir.endsWith('/missions')) {\n const siblingProjectsDir = resolvedProjectsDir.replace(/\\/missions$/, '/projects');\n if (\n (await fileExists(resolvedProjectsDir)) &&\n !(await fileExists(siblingProjectsDir))\n ) {\n try {\n await rename(resolvedProjectsDir, siblingProjectsDir);\n // Update the config line to point at the new dir. Preserve any ~ prefix.\n const newValue = projectsDirRaw!.endsWith('/missions')\n ? projectsDirRaw!.replace(/\\/missions$/, '/projects')\n : siblingProjectsDir;\n newFmBlock = newFmBlock.replace(\n projectLineRe,\n `defaultProjectDir: ${newValue}`,\n );\n resolvedProjectsDir = siblingProjectsDir;\n result.renamedDir = true;\n } catch {\n // If rename fails (permissions, cross-device), leave both config and\n // filesystem alone. Scanner will still hit the legacy dir.\n }\n }\n }\n\n result.resolvedProjectsDir = resolvedProjectsDir;\n\n if (result.renamedField || result.renamedDir) {\n const newContent = `---\\n${newFmBlock.replace(/\\n+$/, '')}\\n---\\n${afterFm.startsWith('\\n') ? afterFm.slice(1) : afterFm}`;\n try {\n await writeFile(configPath, newContent, 'utf-8');\n } catch {\n // If we can't persist the config, revert the flags so the caller\n // doesn't report a fake success.\n result.renamedField = false;\n result.renamedDir = false;\n }\n }\n\n return result;\n}\n\n/**\n * Format a concise summary line for startup logs. Empty string when nothing\n * material happened (caller should skip the log).\n */\nexport function summarizeMigration(\n project: ProjectFilesMigrationResult,\n config?: ConfigMigrationResult,\n): string {\n const parts: string[] = [];\n if (project.renamedProjectFiles.length > 0) {\n const firstThree = project.renamedProjectFiles\n .map((p) => p.split('/')[0])\n .slice(0, 3)\n .join(', ');\n const more =\n project.renamedProjectFiles.length > 3\n ? ` and ${project.renamedProjectFiles.length - 3} more`\n : '';\n parts.push(\n `renamed mission.md → project.md in ${project.renamedProjectFiles.length} project${project.renamedProjectFiles.length === 1 ? '' : 's'} (${firstThree}${more})`,\n );\n }\n if (config?.renamedField) parts.push('updated config defaultMissionDir → defaultProjectDir');\n if (config?.renamedDir) parts.push('renamed projects directory on disk');\n if (project.legacyExtras.length > 0) {\n parts.push(\n `${project.legacyExtras.length} legacy agent.md / claude.md file${project.legacyExtras.length === 1 ? '' : 's'} left in place (no longer read)`,\n );\n }\n return parts.length ? `[syntaur] legacy migration: ${parts.join('; ')}` : '';\n}\n","import { readFile } from 'node:fs/promises';\nimport { resolve, isAbsolute } from 'node:path';\nimport { syntaurRoot, defaultProjectDir, expandHome } from './paths.js';\nimport { fileExists, writeFileForce } from './fs.js';\nimport { renderConfig } from '../templates/config.js';\nimport { migrateLegacyConfig } from './fs-migration.js';\n\nexport interface StatusDefinition {\n id: string;\n label: string;\n description?: string;\n color?: string;\n icon?: string;\n terminal?: boolean;\n}\n\nexport interface StatusTransition {\n from: string;\n command: string;\n to: string;\n label?: string;\n description?: string;\n requiresReason?: boolean;\n}\n\nexport interface StatusConfig {\n statuses: StatusDefinition[];\n order: string[];\n transitions: StatusTransition[];\n}\n\nexport interface TypeDefinition {\n id: string;\n label?: string;\n description?: string;\n color?: string;\n icon?: string;\n}\n\nexport interface TypesConfig {\n definitions: TypeDefinition[];\n default: string;\n}\n\nexport const DEFAULT_ASSIGNMENT_TYPES: TypesConfig = {\n definitions: [\n { id: 'feature', label: 'Feature' },\n { id: 'bug', label: 'Bug' },\n { id: 'refactor', label: 'Refactor' },\n { id: 'research', label: 'Research' },\n { id: 'chore', label: 'Chore' },\n ],\n default: 'feature',\n};\n\nexport interface IntegrationConfig {\n claudePluginDir: string | null;\n codexPluginDir: string | null;\n codexMarketplacePath: string | null;\n}\n\nexport interface OnboardingConfig {\n completed: boolean;\n}\n\nexport interface BackupConfig {\n repo: string | null;\n categories: string;\n lastBackup: string | null;\n lastRestore: string | null;\n}\n\nexport interface SyntaurConfig {\n version: string;\n defaultProjectDir: string;\n onboarding: OnboardingConfig;\n agentDefaults: {\n trustLevel: 'low' | 'medium' | 'high';\n autoApprove: boolean;\n };\n integrations: IntegrationConfig;\n backup: BackupConfig | null;\n statuses: StatusConfig | null;\n types: TypesConfig | null;\n}\n\nconst DEFAULT_CONFIG: SyntaurConfig = {\n version: '2.0',\n defaultProjectDir: defaultProjectDir(),\n onboarding: {\n completed: false,\n },\n agentDefaults: {\n trustLevel: 'medium',\n autoApprove: false,\n },\n integrations: {\n claudePluginDir: null,\n codexPluginDir: null,\n codexMarketplacePath: null,\n },\n backup: null,\n statuses: null,\n types: null,\n};\n\nfunction parseFrontmatter(content: string): Record<string, string> {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return {};\n const result: Record<string, string> = {};\n const lines = match[1].split('\\n');\n let currentParent: string | null = null;\n for (const line of lines) {\n if (line.trim() === '') continue;\n const indent = line.length - line.trimStart().length;\n const colonIndex = line.indexOf(':');\n if (colonIndex < 0) continue;\n const key = line.slice(0, colonIndex).trim();\n const value = line.slice(colonIndex + 1).trim();\n if (indent === 0) {\n if (value === '' || value === undefined) {\n currentParent = key;\n } else {\n currentParent = null;\n result[key] = value.replace(/^[\"']|[\"']$/g, '');\n }\n } else if (indent > 0 && currentParent) {\n result[`${currentParent}.${key}`] = value.replace(/^[\"']|[\"']$/g, '');\n }\n }\n return result;\n}\n\nfunction parseStatusConfig(content: string): StatusConfig | null {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return null;\n const fmBlock = match[1];\n\n // Check if there's a top-level statuses: section\n const statusesStart = fmBlock.match(/^statuses:\\s*$/m);\n if (!statusesStart) return null;\n\n // Extract the statuses block (everything indented after \"statuses:\")\n const startIdx = fmBlock.indexOf(statusesStart[0]) + statusesStart[0].length;\n const remaining = fmBlock.slice(startIdx);\n\n const statuses: StatusDefinition[] = [];\n const order: string[] = [];\n const transitions: StatusTransition[] = [];\n\n // Parse sub-sections: definitions, order, transitions\n let currentSection: 'definitions' | 'order' | 'transitions' | null = null;\n const lines = remaining.split('\\n');\n\n function parseListEntry(lineIdx: number, baseIndent: number): { entry: Record<string, string>; consumed: number } {\n const entry: Record<string, string> = {};\n const firstLine = lines[lineIdx].trimStart().slice(2).trim();\n const colonIdx = firstLine.indexOf(':');\n if (colonIdx > 0) {\n entry[firstLine.slice(0, colonIdx).trim()] = firstLine.slice(colonIdx + 1).trim();\n }\n let consumed = 1;\n for (let i = lineIdx + 1; i < lines.length; i++) {\n const next = lines[i];\n const nextTrimmed = next.trimStart();\n const nextIndent = next.length - nextTrimmed.length;\n if (nextIndent <= baseIndent || nextTrimmed.startsWith('- ')) break;\n const ci = nextTrimmed.indexOf(':');\n if (ci > 0) {\n entry[nextTrimmed.slice(0, ci).trim()] = nextTrimmed.slice(ci + 1).trim();\n }\n consumed++;\n }\n return { entry, consumed };\n }\n\n for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n const line = lines[lineIdx];\n const trimmed = line.trimStart();\n const indent = line.length - trimmed.length;\n\n // Top-level key under statuses (indent 2)\n if (indent === 2 && trimmed.endsWith(':')) {\n const key = trimmed.slice(0, -1).trim();\n if (key === 'definitions') currentSection = 'definitions';\n else if (key === 'order') currentSection = 'order';\n else if (key === 'transitions') currentSection = 'transitions';\n else currentSection = null;\n continue;\n }\n\n // Stop if we hit a new top-level key (no indent)\n if (indent === 0 && trimmed.includes(':')) break;\n\n if (currentSection === 'order' && indent >= 4 && trimmed.startsWith('- ')) {\n order.push(trimmed.slice(2).trim());\n continue;\n }\n\n if (currentSection === 'definitions' && indent >= 4 && trimmed.startsWith('- ')) {\n const { entry, consumed } = parseListEntry(lineIdx, indent);\n if (entry['id']) {\n statuses.push({\n id: entry['id'],\n label: entry['label'] ?? entry['id'],\n description: entry['description'],\n color: entry['color'],\n icon: entry['icon'],\n terminal: entry['terminal'] === 'true',\n });\n }\n lineIdx += consumed - 1; // skip consumed continuation lines\n continue;\n }\n\n if (currentSection === 'transitions' && indent >= 4 && trimmed.startsWith('- ')) {\n const { entry, consumed } = parseListEntry(lineIdx, indent);\n if (entry['from'] && entry['command'] && entry['to']) {\n transitions.push({\n from: entry['from'],\n command: entry['command'],\n to: entry['to'],\n label: entry['label'],\n description: entry['description'],\n requiresReason: entry['requiresReason'] === 'true',\n });\n }\n lineIdx += consumed - 1;\n continue;\n }\n }\n\n if (statuses.length === 0) return null;\n\n return {\n statuses,\n order: order.length > 0 ? order : statuses.map((s) => s.id),\n transitions,\n };\n}\n\nfunction serializeStatusConfig(statuses: StatusConfig): string {\n const lines: string[] = [];\n lines.push('statuses:');\n\n // definitions\n lines.push(' definitions:');\n for (const s of statuses.statuses) {\n lines.push(` - id: ${s.id}`);\n lines.push(` label: ${s.label}`);\n if (s.description) lines.push(` description: ${s.description}`);\n if (s.color) lines.push(` color: ${s.color}`);\n if (s.icon) lines.push(` icon: ${s.icon}`);\n if (s.terminal) lines.push(` terminal: true`);\n }\n\n // order\n lines.push(' order:');\n for (const id of statuses.order) {\n lines.push(` - ${id}`);\n }\n\n // transitions\n if (statuses.transitions.length > 0) {\n lines.push(' transitions:');\n for (const t of statuses.transitions) {\n lines.push(` - from: ${t.from}`);\n lines.push(` command: ${t.command}`);\n lines.push(` to: ${t.to}`);\n if (t.label) lines.push(` label: ${t.label}`);\n if (t.description) lines.push(` description: ${t.description}`);\n if (t.requiresReason) lines.push(` requiresReason: true`);\n }\n }\n\n return lines.join('\\n');\n}\n\nfunction serializeIntegrationConfig(integrations: IntegrationConfig): string | null {\n const lines: string[] = [];\n\n if (integrations.claudePluginDir) {\n lines.push(` claudePluginDir: ${integrations.claudePluginDir}`);\n }\n if (integrations.codexPluginDir) {\n lines.push(` codexPluginDir: ${integrations.codexPluginDir}`);\n }\n if (integrations.codexMarketplacePath) {\n lines.push(` codexMarketplacePath: ${integrations.codexMarketplacePath}`);\n }\n\n if (lines.length === 0) {\n return null;\n }\n\n return ['integrations:', ...lines].join('\\n');\n}\n\nfunction serializeOnboardingConfig(onboarding: OnboardingConfig): string {\n return ['onboarding:', ` completed: ${onboarding.completed ? 'true' : 'false'}`].join('\\n');\n}\n\nfunction serializeBackupConfig(backup: BackupConfig): string {\n const lines: string[] = ['backup:'];\n lines.push(` repo: ${backup.repo ?? 'null'}`);\n lines.push(` categories: ${backup.categories}`);\n lines.push(` lastBackup: ${backup.lastBackup ?? 'null'}`);\n lines.push(` lastRestore: ${backup.lastRestore ?? 'null'}`);\n return lines.join('\\n');\n}\n\nfunction stripTopLevelBlock(fmBlock: string, key: string): string {\n const blockStart = fmBlock.match(new RegExp(`^${key}:\\\\s*$`, 'm'));\n if (!blockStart) {\n return fmBlock.replace(/\\n+$/, '');\n }\n\n const startIdx = fmBlock.indexOf(blockStart[0]);\n const before = fmBlock.slice(0, startIdx);\n const after = fmBlock.slice(startIdx + blockStart[0].length);\n const remaining = after.split('\\n');\n let endIdx = 0;\n\n for (let i = 0; i < remaining.length; i++) {\n const line = remaining[i];\n if (line.trim() === '') {\n endIdx = i + 1;\n continue;\n }\n if (line.length > 0 && line[0] !== ' ') {\n break;\n }\n endIdx = i + 1;\n }\n\n return (before + remaining.slice(endIdx).join('\\n')).replace(/\\n+$/, '');\n}\n\nfunction parseOptionalAbsolutePath(\n value: string | undefined,\n fieldName: string,\n): string | null {\n if (!value) {\n return null;\n }\n\n const expanded = expandHome(String(value));\n if (!isAbsolute(expanded)) {\n console.warn(\n `Warning: config.md ${fieldName} is not an absolute path (\"${value}\"), ignoring it`,\n );\n return null;\n }\n\n return resolve(expanded);\n}\n\nexport async function writeStatusConfig(statuses: StatusConfig): Promise<void> {\n const configPath = resolve(syntaurRoot(), 'config.md');\n const statusBlock = serializeStatusConfig(statuses);\n\n if (!(await fileExists(configPath))) {\n // Create new config file with defaults + statuses\n const content = `---\\nversion: \"2.0\"\\ndefaultProjectDir: ~/projects\\n${statusBlock}\\n---\\n`;\n await writeFileForce(configPath, content);\n return;\n }\n\n const existing = await readFile(configPath, 'utf-8');\n const fmMatch = existing.match(/^(---\\n)([\\s\\S]*?)\\n(---)/);\n if (!fmMatch) {\n // No frontmatter — wrap in new frontmatter\n const content = `---\\nversion: \"2.0\"\\n${statusBlock}\\n---\\n${existing}`;\n await writeFileForce(configPath, content);\n return;\n }\n\n const fmBlock = fmMatch[2];\n const afterFrontmatter = existing.slice(fmMatch[0].length);\n\n // Remove existing statuses: block from frontmatter\n const statusesStart = fmBlock.match(/^statuses:\\s*$/m);\n let cleanedFm: string;\n if (statusesStart) {\n const startIdx = fmBlock.indexOf(statusesStart[0]);\n const before = fmBlock.slice(0, startIdx);\n const after = fmBlock.slice(startIdx + statusesStart[0].length);\n // Skip all indented lines (belonging to statuses block)\n const remaining = after.split('\\n');\n let endIdx = 0;\n for (let i = 0; i < remaining.length; i++) {\n const line = remaining[i];\n if (line.trim() === '') { endIdx = i + 1; continue; }\n if (line.length > 0 && line[0] !== ' ') break;\n endIdx = i + 1;\n }\n cleanedFm = before + remaining.slice(endIdx).join('\\n');\n } else {\n cleanedFm = fmBlock;\n }\n\n // Trim trailing whitespace/newlines from cleaned frontmatter\n cleanedFm = cleanedFm.replace(/\\n+$/, '');\n\n const newContent = `---\\n${cleanedFm}\\n${statusBlock}\\n---${afterFrontmatter}`;\n await writeFileForce(configPath, newContent);\n}\n\nexport async function deleteStatusConfig(): Promise<void> {\n const configPath = resolve(syntaurRoot(), 'config.md');\n if (!(await fileExists(configPath))) return;\n\n const existing = await readFile(configPath, 'utf-8');\n const fmMatch = existing.match(/^(---\\n)([\\s\\S]*?)\\n(---)/);\n if (!fmMatch) return;\n\n const fmBlock = fmMatch[2];\n const afterFrontmatter = existing.slice(fmMatch[0].length);\n const cleanedFm = stripTopLevelBlock(fmBlock, 'statuses');\n\n const newContent = `---\\n${cleanedFm}\\n---${afterFrontmatter}`;\n await writeFileForce(configPath, newContent);\n}\n\nexport async function updateIntegrationConfig(\n integrations: Partial<IntegrationConfig>,\n): Promise<void> {\n const configPath = resolve(syntaurRoot(), 'config.md');\n const nextIntegrations: IntegrationConfig = {\n ...(await readConfig()).integrations,\n ...integrations,\n };\n\n const integrationBlock = serializeIntegrationConfig(nextIntegrations);\n const existing = await fileExists(configPath)\n ? await readFile(configPath, 'utf-8')\n : renderConfig({ defaultProjectDir: defaultProjectDir() });\n\n const fmMatch = existing.match(/^(---\\n)([\\s\\S]*?)\\n(---)/);\n if (!fmMatch) {\n const content = `---\\nversion: \"2.0\"\\ndefaultProjectDir: ${defaultProjectDir()}\\n${integrationBlock ?? ''}\\n---\\n${existing}`;\n await writeFileForce(configPath, content.replace(/\\n\\n---/, '\\n---'));\n return;\n }\n\n const fmBlock = fmMatch[2];\n const afterFrontmatter = existing.slice(fmMatch[0].length);\n const cleanedFm = stripTopLevelBlock(fmBlock, 'integrations');\n const newFm = integrationBlock\n ? `${cleanedFm}\\n${integrationBlock}`.replace(/^\\n+/, '')\n : cleanedFm;\n const normalizedFm = newFm.replace(/\\n+$/, '');\n const newContent = `---\\n${normalizedFm}\\n---${afterFrontmatter}`;\n await writeFileForce(configPath, newContent);\n}\n\nexport async function updateOnboardingConfig(\n onboarding: Partial<OnboardingConfig>,\n): Promise<void> {\n const configPath = resolve(syntaurRoot(), 'config.md');\n const nextOnboarding: OnboardingConfig = {\n ...(await readConfig()).onboarding,\n ...onboarding,\n };\n\n const onboardingBlock = serializeOnboardingConfig(nextOnboarding);\n const existing = await fileExists(configPath)\n ? await readFile(configPath, 'utf-8')\n : renderConfig({ defaultProjectDir: defaultProjectDir() });\n\n const fmMatch = existing.match(/^(---\\n)([\\s\\S]*?)\\n(---)/);\n if (!fmMatch) {\n const content = `---\\nversion: \"2.0\"\\ndefaultProjectDir: ${defaultProjectDir()}\\n${onboardingBlock}\\n---\\n${existing}`;\n await writeFileForce(configPath, content.replace(/\\n\\n---/, '\\n---'));\n return;\n }\n\n const fmBlock = fmMatch[2];\n const afterFrontmatter = existing.slice(fmMatch[0].length);\n const cleanedFm = stripTopLevelBlock(fmBlock, 'onboarding');\n const newFm = `${cleanedFm}\\n${onboardingBlock}`.replace(/^\\n+/, '');\n const normalizedFm = newFm.replace(/\\n+$/, '');\n const newContent = `---\\n${normalizedFm}\\n---${afterFrontmatter}`;\n await writeFileForce(configPath, newContent);\n}\n\nexport async function updateBackupConfig(\n backup: Partial<BackupConfig>,\n): Promise<void> {\n const configPath = resolve(syntaurRoot(), 'config.md');\n const current = (await readConfig()).backup;\n const nextBackup: BackupConfig = {\n repo: current?.repo ?? null,\n categories: current?.categories ?? 'projects, playbooks, todos, servers, config',\n lastBackup: current?.lastBackup ?? null,\n lastRestore: current?.lastRestore ?? null,\n ...backup,\n };\n\n const backupBlock = serializeBackupConfig(nextBackup);\n const existing = await fileExists(configPath)\n ? await readFile(configPath, 'utf-8')\n : renderConfig({ defaultProjectDir: defaultProjectDir() });\n\n const fmMatch = existing.match(/^(---\\n)([\\s\\S]*?)\\n(---)/);\n if (!fmMatch) {\n const content = `---\\nversion: \"2.0\"\\ndefaultProjectDir: ${defaultProjectDir()}\\n${backupBlock}\\n---\\n${existing}`;\n await writeFileForce(configPath, content.replace(/\\n\\n---/, '\\n---'));\n return;\n }\n\n const fmBlock = fmMatch[2];\n const afterFrontmatter = existing.slice(fmMatch[0].length);\n const cleanedFm = stripTopLevelBlock(fmBlock, 'backup');\n const newFm = `${cleanedFm}\\n${backupBlock}`.replace(/^\\n+/, '');\n const normalizedFm = newFm.replace(/\\n+$/, '');\n const newContent = `---\\n${normalizedFm}\\n---${afterFrontmatter}`;\n await writeFileForce(configPath, newContent);\n}\n\n// Guard so the legacy-config migration runs at most once per config path per\n// process lifetime. Keyed by absolute path so tests with multiple sandbox\n// HOMEs still get the migration applied to each.\nconst migratedConfigPaths = new Set<string>();\n\nexport async function readConfig(): Promise<SyntaurConfig> {\n const configPath = resolve(syntaurRoot(), 'config.md');\n if (!(await fileExists(configPath))) {\n return { ...DEFAULT_CONFIG };\n }\n\n if (!migratedConfigPaths.has(configPath)) {\n migratedConfigPaths.add(configPath);\n await migrateLegacyConfig(configPath);\n }\n\n const content = await readFile(configPath, 'utf-8');\n const fm = parseFrontmatter(content);\n\n if (Object.keys(fm).length === 0) {\n console.warn('Warning: ~/.syntaur/config.md has malformed frontmatter, using defaults');\n return { ...DEFAULT_CONFIG };\n }\n\n let projectDir = fm['defaultProjectDir']\n ? expandHome(String(fm['defaultProjectDir']))\n : DEFAULT_CONFIG.defaultProjectDir;\n if (!isAbsolute(projectDir)) {\n console.warn(\n `Warning: config.md defaultProjectDir is not an absolute path (\"${fm['defaultProjectDir']}\"), using default`,\n );\n projectDir = DEFAULT_CONFIG.defaultProjectDir;\n }\n\n return {\n version: fm['version'] || DEFAULT_CONFIG.version,\n defaultProjectDir: projectDir,\n onboarding: {\n completed: fm['onboarding.completed'] === 'true',\n },\n agentDefaults: {\n trustLevel:\n (fm['agentDefaults.trustLevel'] as SyntaurConfig['agentDefaults']['trustLevel']) ||\n DEFAULT_CONFIG.agentDefaults.trustLevel,\n autoApprove:\n fm['agentDefaults.autoApprove'] === 'true' ||\n DEFAULT_CONFIG.agentDefaults.autoApprove,\n },\n integrations: {\n claudePluginDir: parseOptionalAbsolutePath(\n fm['integrations.claudePluginDir'],\n 'integrations.claudePluginDir',\n ),\n codexPluginDir: parseOptionalAbsolutePath(\n fm['integrations.codexPluginDir'],\n 'integrations.codexPluginDir',\n ),\n codexMarketplacePath: parseOptionalAbsolutePath(\n fm['integrations.codexMarketplacePath'],\n 'integrations.codexMarketplacePath',\n ),\n },\n backup: fm['backup.repo'] || fm['backup.categories']\n ? {\n repo: fm['backup.repo'] && fm['backup.repo'] !== 'null' ? fm['backup.repo'] : null,\n categories: fm['backup.categories'] || 'projects, playbooks, todos, servers, config',\n lastBackup: fm['backup.lastBackup'] && fm['backup.lastBackup'] !== 'null' ? fm['backup.lastBackup'] : null,\n lastRestore: fm['backup.lastRestore'] && fm['backup.lastRestore'] !== 'null' ? fm['backup.lastRestore'] : null,\n }\n : null,\n statuses: parseStatusConfig(content),\n types: null,\n };\n}\n\nexport function getAssignmentTypes(config: SyntaurConfig): TypesConfig {\n return config.types ?? DEFAULT_ASSIGNMENT_TYPES;\n}\n","export type AssignmentStatus = string;\n\nexport type TransitionCommand = string;\n\nexport const DEFAULT_STATUSES = [\n 'pending',\n 'in_progress',\n 'blocked',\n 'review',\n 'completed',\n 'failed',\n] as const;\n\nexport const DEFAULT_COMMANDS = [\n 'start',\n 'complete',\n 'block',\n 'unblock',\n 'review',\n 'fail',\n 'reopen',\n 'assign',\n] as const;\n\nexport const DEFAULT_TERMINAL_STATUSES: ReadonlySet<string> = new Set([\n 'completed',\n 'failed',\n]);\n\nexport const TERMINAL_STATUSES: ReadonlySet<string> = DEFAULT_TERMINAL_STATUSES;\n\nexport interface ExternalId {\n system: string;\n id: string;\n url: string;\n}\n\nexport interface Workspace {\n repository: string | null;\n worktreePath: string | null;\n branch: string | null;\n parentBranch: string | null;\n}\n\nexport interface AssignmentFrontmatter {\n id: string;\n slug: string;\n title: string;\n project: string | null;\n type: string | null;\n status: AssignmentStatus;\n priority: 'low' | 'medium' | 'high' | 'critical';\n created: string;\n updated: string;\n assignee: string | null;\n externalIds: ExternalId[];\n dependsOn: string[];\n links: string[];\n blockedReason: string | null;\n workspace: Workspace;\n tags: string[];\n}\n\nexport interface TransitionResult {\n success: boolean;\n message: string;\n fromStatus: AssignmentStatus;\n toStatus?: AssignmentStatus;\n warnings?: string[];\n}\n","import type { AssignmentStatus, TransitionCommand } from './types.js';\nimport { TERMINAL_STATUSES } from './types.js';\n\n/**\n * Maps a command to its target status. Commands always produce the same\n * target regardless of the current status — workflow enforcement is\n * handled via agent prompting, not code guards.\n */\nexport const DEFAULT_COMMAND_TARGETS = new Map<string, string>([\n ['start', 'in_progress'],\n ['block', 'blocked'],\n ['unblock', 'in_progress'],\n ['review', 'review'],\n ['complete', 'completed'],\n ['fail', 'failed'],\n ['reopen', 'in_progress'],\n]);\n\n/** @deprecated Transition guards removed — kept for API compat, always returns true */\nexport const DEFAULT_TRANSITION_TABLE = new Map<string, string>([\n ['pending:start', 'in_progress'],\n ['pending:block', 'blocked'],\n ['in_progress:block', 'blocked'],\n ['in_progress:review', 'review'],\n ['in_progress:complete', 'completed'],\n ['in_progress:fail', 'failed'],\n ['blocked:unblock', 'in_progress'],\n ['review:start', 'in_progress'],\n ['review:complete', 'completed'],\n ['review:fail', 'failed'],\n ['completed:reopen', 'in_progress'],\n ['failed:reopen', 'in_progress'],\n]);\n\nexport function buildTransitionTable(\n transitions: Array<{ from: string; command: string; to: string }>,\n): Map<string, string> {\n const table = new Map<string, string>();\n for (const t of transitions) {\n table.set(`${t.from}:${t.command}`, t.to);\n }\n return table;\n}\n\nexport function buildCommandTargets(\n transitions: Array<{ from: string; command: string; to: string }>,\n): Map<string, string> {\n const targets = new Map<string, string>();\n for (const t of transitions) {\n targets.set(t.command, t.to);\n }\n return targets;\n}\n\nexport function getTargetStatus(\n _from: AssignmentStatus,\n command: TransitionCommand,\n table?: Map<string, string>,\n): AssignmentStatus | null {\n // Try command-only lookup first, fall back to from:command for backwards compat\n if (!table || table === DEFAULT_TRANSITION_TABLE) {\n return DEFAULT_COMMAND_TARGETS.get(command) ?? null;\n }\n // Custom table: try command-only key first, then from:command\n return table.get(command) ?? table.get(`${_from}:${command}`) ?? null;\n}\n\n/** @deprecated Guards removed — always returns true for known commands */\nexport function canTransition(\n _from: AssignmentStatus,\n command: TransitionCommand,\n table?: Map<string, string>,\n): boolean {\n return getTargetStatus(_from, command, table) !== null;\n}\n\nexport function isTerminalStatus(\n status: AssignmentStatus,\n terminalSet?: ReadonlySet<string>,\n): boolean {\n return (terminalSet ?? TERMINAL_STATUSES).has(status);\n}\n","import type { AssignmentFrontmatter, ExternalId, Workspace } from './types.js';\n\nfunction extractFrontmatter(fileContent: string): [string, string] {\n const match = fileContent.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) {\n throw new Error('No frontmatter found in file. Expected --- delimiters.');\n }\n const frontmatterBlock = match[1];\n const body = fileContent.slice(match[0].length);\n return [frontmatterBlock, body];\n}\n\nfunction parseSimpleValue(raw: string): string | null {\n const trimmed = raw.trim();\n if (trimmed === 'null') return null;\n if (\n (trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n ) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n}\n\nfunction parseDependsOn(frontmatter: string): string[] {\n const inlineMatch = frontmatter.match(/^dependsOn:\\s*\\[\\s*\\]/m);\n if (inlineMatch) return [];\n\n const results: string[] = [];\n const blockMatch = frontmatter.match(/^dependsOn:\\s*\\n((?:\\s+-\\s+.*\\n?)*)/m);\n if (blockMatch) {\n const items = blockMatch[1].matchAll(/^\\s+-\\s+(.+)$/gm);\n for (const item of items) {\n results.push(item[1].trim());\n }\n }\n return results;\n}\n\nfunction parseLinks(frontmatter: string): string[] {\n const inlineMatch = frontmatter.match(/^links:\\s*\\[\\s*\\]/m);\n if (inlineMatch) return [];\n\n const results: string[] = [];\n const blockMatch = frontmatter.match(/^links:\\s*\\n((?:\\s+-\\s+.*\\n?)*)/m);\n if (blockMatch) {\n const items = blockMatch[1].matchAll(/^\\s+-\\s+(.+)$/gm);\n for (const item of items) {\n results.push(item[1].trim());\n }\n }\n return results;\n}\n\nfunction parseExternalIds(frontmatter: string): ExternalId[] {\n const inlineMatch = frontmatter.match(/^externalIds:\\s*\\[\\s*\\]/m);\n if (inlineMatch) return [];\n\n const results: ExternalId[] = [];\n const blockMatch = frontmatter.match(\n /^externalIds:\\s*\\n((?:\\s+-\\s+[\\s\\S]*?)(?=^\\w|\\n---))/m,\n );\n if (!blockMatch) return [];\n\n const itemBlocks = blockMatch[1].split(/\\n\\s+-\\s+/).filter(Boolean);\n for (const block of itemBlocks) {\n const lines = block.split('\\n');\n const entry: Record<string, string> = {};\n for (const line of lines) {\n const colonIdx = line.indexOf(':');\n if (colonIdx < 0) continue;\n const key = line.slice(0, colonIdx).trim().replace(/^-\\s+/, '');\n const value = line.slice(colonIdx + 1).trim();\n if (key && value) {\n entry[key] = value;\n }\n }\n if (entry['system'] && entry['id'] && entry['url']) {\n results.push({\n system: entry['system'],\n id: entry['id'],\n url: entry['url'],\n });\n }\n }\n return results;\n}\n\nfunction parseWorkspace(frontmatter: string): Workspace {\n const defaults: Workspace = {\n repository: null,\n worktreePath: null,\n branch: null,\n parentBranch: null,\n };\n\n const fields = ['repository', 'worktreePath', 'branch', 'parentBranch'] as const;\n for (const field of fields) {\n const match = frontmatter.match(new RegExp(`^\\\\s+${field}:\\\\s*(.*)$`, 'm'));\n if (match) {\n defaults[field] = parseSimpleValue(match[1]);\n }\n }\n return defaults;\n}\n\nfunction parseTags(frontmatter: string): string[] {\n const inlineMatch = frontmatter.match(/^tags:\\s*\\[\\s*\\]/m);\n if (inlineMatch) return [];\n\n const results: string[] = [];\n const blockMatch = frontmatter.match(/^tags:\\s*\\n((?:\\s+-\\s+.*\\n?)*)/m);\n if (blockMatch) {\n const items = blockMatch[1].matchAll(/^\\s+-\\s+(.+)$/gm);\n for (const item of items) {\n results.push(item[1].trim());\n }\n }\n return results;\n}\n\nexport function parseAssignmentFrontmatter(fileContent: string): AssignmentFrontmatter {\n const [frontmatter] = extractFrontmatter(fileContent);\n\n function getField(key: string): string | null {\n const match = frontmatter.match(new RegExp(`^${key}:\\\\s*(.*)$`, 'm'));\n if (!match) return null;\n return parseSimpleValue(match[1]);\n }\n\n return {\n id: getField('id') ?? '',\n slug: getField('slug') ?? '',\n title: getField('title') ?? '',\n project: getField('project'),\n type: getField('type'),\n status: getField('status') ?? 'pending',\n priority: (getField('priority') ?? 'medium') as AssignmentFrontmatter['priority'],\n created: getField('created') ?? '',\n updated: getField('updated') ?? '',\n assignee: getField('assignee'),\n externalIds: parseExternalIds(frontmatter),\n dependsOn: parseDependsOn(frontmatter),\n links: parseLinks(frontmatter),\n blockedReason: getField('blockedReason'),\n workspace: parseWorkspace(frontmatter),\n tags: parseTags(frontmatter),\n };\n}\n\nfunction formatYamlValue(value: string | null): string {\n if (value === null) return 'null';\n if (/^\\d{4}-\\d{2}-\\d{2}T/.test(value)) {\n return `\"${value}\"`;\n }\n // Quote values containing YAML-special characters that could cause parse issues\n if (/[:#{}[\\],&*?|>!%@`]/.test(value) || /^\\s|\\s$/.test(value) || value === '') {\n const escaped = value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n return `\"${escaped}\"`;\n }\n return value;\n}\n\nexport function updateAssignmentFile(\n fileContent: string,\n updates: Partial<Pick<AssignmentFrontmatter, 'status' | 'assignee' | 'blockedReason' | 'updated'>>,\n): string {\n let result = fileContent;\n\n for (const [key, value] of Object.entries(updates)) {\n if (value === undefined) continue;\n const formatted = formatYamlValue(value as string | null);\n const fieldRegex = new RegExp(`^(${key}:)\\\\s*.*$`, 'm');\n if (fieldRegex.test(result)) {\n result = result.replace(fieldRegex, `$1 ${formatted}`);\n }\n }\n\n return result;\n}\n","import { resolve } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport { fileExists, writeFileForce } from '../utils/fs.js';\nimport { nowTimestamp } from '../utils/timestamp.js';\nimport { getTargetStatus } from './state-machine.js';\nimport { parseAssignmentFrontmatter, updateAssignmentFile } from './frontmatter.js';\nimport type { TransitionCommand, TransitionResult, AssignmentFrontmatter } from './types.js';\n\nfunction resolveAssignmentPath(projectDir: string, assignmentSlug: string): string {\n return resolve(projectDir, 'assignments', assignmentSlug, 'assignment.md');\n}\n\nasync function readAssignment(\n filePath: string,\n): Promise<{ content: string; frontmatter: AssignmentFrontmatter }> {\n if (!(await fileExists(filePath))) {\n throw new Error(`Assignment file not found: ${filePath}`);\n }\n const content = await readFile(filePath, 'utf-8');\n const frontmatter = parseAssignmentFrontmatter(content);\n return { content, frontmatter };\n}\n\nasync function checkDependencies(\n projectDir: string,\n dependsOn: string[],\n terminalStatuses?: ReadonlySet<string>,\n): Promise<{ satisfied: boolean; unmet: string[] }> {\n const terminals = terminalStatuses ?? new Set(['completed']);\n const unmet: string[] = [];\n for (const depSlug of dependsOn) {\n const depPath = resolveAssignmentPath(projectDir, depSlug);\n if (!(await fileExists(depPath))) {\n unmet.push(`${depSlug} (file not found)`);\n continue;\n }\n const depContent = await readFile(depPath, 'utf-8');\n const depFrontmatter = parseAssignmentFrontmatter(depContent);\n if (!terminals.has(depFrontmatter.status)) {\n unmet.push(`${depSlug} (status: ${depFrontmatter.status})`);\n }\n }\n return { satisfied: unmet.length === 0, unmet };\n}\n\nexport interface TransitionOptions {\n reason?: string;\n agent?: string;\n transitionTable?: Map<string, string>;\n terminalStatuses?: ReadonlySet<string>;\n}\n\nexport async function executeTransition(\n projectDir: string,\n assignmentSlug: string,\n command: Exclude<TransitionCommand, 'assign'>,\n options: TransitionOptions = {},\n): Promise<TransitionResult> {\n const filePath = resolveAssignmentPath(projectDir, assignmentSlug);\n const { content, frontmatter } = await readAssignment(filePath);\n\n const targetStatus = getTargetStatus(frontmatter.status, command, options.transitionTable);\n\n if (!targetStatus) {\n return {\n success: false,\n message: `Unknown command '${command}' for assignment \"${assignmentSlug}\".`,\n fromStatus: frontmatter.status,\n };\n }\n\n const warnings: string[] = [];\n\n if (command === 'start' && frontmatter.dependsOn.length > 0) {\n const depCheck = await checkDependencies(projectDir, frontmatter.dependsOn, options.terminalStatuses);\n if (!depCheck.satisfied) {\n warnings.push(`Starting with unmet dependencies: ${depCheck.unmet.join(', ')}`);\n }\n }\n\n const updates: Partial<Pick<AssignmentFrontmatter, 'status' | 'assignee' | 'blockedReason' | 'updated'>> = {\n status: targetStatus,\n updated: nowTimestamp(),\n };\n\n if (command === 'start' && options.agent && !frontmatter.assignee) {\n updates.assignee = options.agent;\n }\n if (command === 'block') {\n updates.blockedReason = options.reason ?? null;\n }\n if (command === 'unblock') {\n updates.blockedReason = null;\n }\n\n const updatedContent = updateAssignmentFile(content, updates);\n await writeFileForce(filePath, updatedContent);\n\n return {\n success: true,\n message: `Assignment \"${assignmentSlug}\" transitioned: ${frontmatter.status} -> ${targetStatus}`,\n fromStatus: frontmatter.status,\n toStatus: targetStatus,\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n}\n\nexport async function executeAssign(\n projectDir: string,\n assignmentSlug: string,\n agent: string,\n): Promise<TransitionResult> {\n const filePath = resolveAssignmentPath(projectDir, assignmentSlug);\n const { content, frontmatter } = await readAssignment(filePath);\n\n const updates: Partial<Pick<AssignmentFrontmatter, 'status' | 'assignee' | 'blockedReason' | 'updated'>> = {\n assignee: agent,\n updated: nowTimestamp(),\n };\n\n const updatedContent = updateAssignmentFile(content, updates);\n await writeFileForce(filePath, updatedContent);\n\n return {\n success: true,\n message: `Assignment \"${assignmentSlug}\" assigned to '${agent}'.`,\n fromStatus: frontmatter.status,\n };\n}\n\nexport interface TransitionByDirOptions extends TransitionOptions {\n standalone?: boolean;\n}\n\nexport async function executeTransitionByDir(\n assignmentDir: string,\n command: Exclude<TransitionCommand, 'assign'>,\n options: TransitionByDirOptions = {},\n): Promise<TransitionResult> {\n const filePath = resolve(assignmentDir, 'assignment.md');\n const { content, frontmatter } = await readAssignment(filePath);\n\n const targetStatus = getTargetStatus(frontmatter.status, command, options.transitionTable);\n if (!targetStatus) {\n return {\n success: false,\n message: `Unknown command '${command}' for assignment \"${frontmatter.slug || assignmentDir}\".`,\n fromStatus: frontmatter.status,\n };\n }\n\n const warnings: string[] = [];\n\n if (command === 'start' && !options.standalone && frontmatter.dependsOn.length > 0) {\n // Dependency check requires a project context — skip for standalone\n const projectDir = resolve(assignmentDir, '..', '..');\n const depCheck = await checkDependencies(\n projectDir,\n frontmatter.dependsOn,\n options.terminalStatuses,\n );\n if (!depCheck.satisfied) {\n warnings.push(`Starting with unmet dependencies: ${depCheck.unmet.join(', ')}`);\n }\n }\n\n const updates: Partial<Pick<AssignmentFrontmatter, 'status' | 'assignee' | 'blockedReason' | 'updated'>> = {\n status: targetStatus,\n updated: nowTimestamp(),\n };\n\n if (command === 'start' && options.agent && !frontmatter.assignee) {\n updates.assignee = options.agent;\n }\n if (command === 'block') {\n updates.blockedReason = options.reason ?? null;\n }\n if (command === 'unblock') {\n updates.blockedReason = null;\n }\n\n const updatedContent = updateAssignmentFile(content, updates);\n await writeFileForce(filePath, updatedContent);\n\n return {\n success: true,\n message: `Assignment \"${frontmatter.slug || assignmentDir}\" transitioned: ${frontmatter.status} -> ${targetStatus}`,\n fromStatus: frontmatter.status,\n toStatus: targetStatus,\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n}\n\nexport async function executeAssignByDir(\n assignmentDir: string,\n agent: string,\n): Promise<TransitionResult> {\n const filePath = resolve(assignmentDir, 'assignment.md');\n const { content, frontmatter } = await readAssignment(filePath);\n\n const updates: Partial<Pick<AssignmentFrontmatter, 'status' | 'assignee' | 'blockedReason' | 'updated'>> = {\n assignee: agent,\n updated: nowTimestamp(),\n };\n\n const updatedContent = updateAssignmentFile(content, updates);\n await writeFileForce(filePath, updatedContent);\n\n return {\n success: true,\n message: `Assignment \"${frontmatter.slug || assignmentDir}\" assigned to '${agent}'.`,\n fromStatus: frontmatter.status,\n };\n}\n","export type {\n AssignmentStatus,\n TransitionCommand,\n AssignmentFrontmatter,\n ExternalId,\n Workspace,\n TransitionResult,\n} from './types.js';\nexport { TERMINAL_STATUSES, DEFAULT_STATUSES, DEFAULT_COMMANDS, DEFAULT_TERMINAL_STATUSES } from './types.js';\nexport { canTransition, getTargetStatus, isTerminalStatus, DEFAULT_TRANSITION_TABLE, DEFAULT_COMMAND_TARGETS, buildTransitionTable, buildCommandTargets } from './state-machine.js';\nexport { parseAssignmentFrontmatter, updateAssignmentFile } from './frontmatter.js';\nexport { executeTransition, executeAssign, executeTransitionByDir, executeAssignByDir } from './transitions.js';\nexport type { TransitionOptions, TransitionByDirOptions } from './transitions.js';\n","import { resolve } from 'node:path';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { fileExists } from './fs.js';\nimport { extractFrontmatter, getField } from '../dashboard/parser.js';\n\nexport interface ResolvedAssignment {\n assignmentDir: string;\n projectSlug: string | null;\n assignmentSlug: string;\n id: string;\n standalone: boolean;\n}\n\nexport async function resolveAssignmentById(\n projectsDir: string,\n assignmentsDir: string,\n id: string,\n): Promise<ResolvedAssignment | null> {\n let standaloneMatch: ResolvedAssignment | null = null;\n let projectMatch: ResolvedAssignment | null = null;\n\n // 1) Standalone: <assignmentsDir>/<id>/assignment.md\n const standaloneDir = resolve(assignmentsDir, id);\n const standalonePath = resolve(standaloneDir, 'assignment.md');\n if (await fileExists(standalonePath)) {\n standaloneMatch = {\n assignmentDir: standaloneDir,\n projectSlug: null,\n assignmentSlug: id,\n id,\n standalone: true,\n };\n }\n\n // 2) Project-nested: scan <projectsDir>/*/assignments/*/assignment.md and match by frontmatter id\n if (await fileExists(projectsDir)) {\n try {\n const projects = await readdir(projectsDir, { withFileTypes: true });\n for (const p of projects) {\n if (!p.isDirectory()) continue;\n if (p.name.startsWith('.') || p.name.startsWith('_')) continue;\n const assignmentsPath = resolve(projectsDir, p.name, 'assignments');\n if (!(await fileExists(assignmentsPath))) continue;\n\n const entries = await readdir(assignmentsPath, { withFileTypes: true });\n for (const a of entries) {\n if (!a.isDirectory()) continue;\n const aPath = resolve(assignmentsPath, a.name, 'assignment.md');\n if (!(await fileExists(aPath))) continue;\n\n try {\n const content = await readFile(aPath, 'utf-8');\n const [fm] = extractFrontmatter(content);\n const fileId = getField(fm, 'id');\n if (fileId === id) {\n projectMatch = {\n assignmentDir: resolve(assignmentsPath, a.name),\n projectSlug: p.name,\n assignmentSlug: a.name,\n id,\n standalone: false,\n };\n break;\n }\n } catch {\n // skip unreadable\n }\n }\n if (projectMatch) break;\n }\n } catch {\n // projectsDir not readable\n }\n }\n\n if (standaloneMatch && projectMatch) {\n console.warn(\n `Duplicate assignment ID ${id} found in both standalone and project-nested locations; using standalone`,\n );\n return standaloneMatch;\n }\n\n return standaloneMatch ?? projectMatch ?? null;\n}\n","import type {\n HelpChecklistItem,\n HelpCommand,\n HelpResponse,\n HelpStatusGuideEntry,\n} from './types.js';\nimport { getStatusConfig } from './api.js';\n\nconst CLI_COMMANDS: HelpCommand[] = [\n // --- Core setup & scaffolding (indices 0-4) ---\n {\n command: 'syntaur setup',\n description: 'Initialize Syntaur and optionally install plugins or launch the dashboard.',\n example: 'syntaur setup',\n },\n {\n command: 'syntaur init',\n description: 'Initialize the local Syntaur home directory and config scaffolding without any prompts.',\n example: 'syntaur init',\n },\n {\n command: 'syntaur create-project',\n description: 'Create a new project folder with the required source and derived files.',\n example: 'syntaur create-project \"Ship dashboard overhaul\"',\n },\n {\n command: 'syntaur create-assignment',\n description: 'Create a new assignment inside a project.',\n example: 'syntaur create-assignment \"Implement overview API\" --project ui-overhaul',\n },\n {\n command: 'syntaur assign',\n description: 'Set the assignee for an assignment before work begins.',\n example: 'syntaur assign implement-overview --project ui-overhaul --agent codex-1',\n },\n\n // --- Lifecycle transitions (indices 5-11) ---\n {\n command: 'syntaur start',\n description: 'Transition an assignment to in_progress.',\n example: 'syntaur start implement-overview --project ui-overhaul',\n },\n {\n command: 'syntaur review',\n description: 'Move active work into review once implementation is ready for inspection.',\n example: 'syntaur review implement-overview --project ui-overhaul',\n },\n {\n command: 'syntaur complete',\n description: 'Mark an assignment completed after review or direct completion.',\n example: 'syntaur complete implement-overview --project ui-overhaul',\n },\n {\n command: 'syntaur block',\n description: 'Mark an assignment blocked and record the explicit reason.',\n example: 'syntaur block implement-overview --project ui-overhaul --reason \"Waiting on API spec\"',\n },\n {\n command: 'syntaur unblock',\n description: 'Move a blocked assignment back to in_progress after the blocker is cleared.',\n example: 'syntaur unblock implement-overview --project ui-overhaul',\n },\n {\n command: 'syntaur fail',\n description: 'Mark an assignment failed when it cannot be completed as planned.',\n example: 'syntaur fail implement-overview --project ui-overhaul',\n },\n {\n command: 'syntaur reopen',\n description: 'Reopen a completed or failed assignment back to in_progress.',\n example: 'syntaur reopen implement-overview --project ui-overhaul',\n },\n\n // --- Dashboard (index 12) ---\n {\n command: 'syntaur dashboard',\n description: 'Start the local dashboard UI over the project files on disk.',\n example: 'syntaur dashboard --port 4800',\n },\n\n // --- Plugin & adapter setup (indices 13-16) ---\n {\n command: 'syntaur install-plugin',\n description: 'Install the Syntaur Claude Code plugin, detecting the local Claude marketplace when available and prompting for the target directory when interactive.',\n example: 'syntaur install-plugin --target-dir ~/.claude/plugins/marketplaces/user-plugins/plugins/syntaur',\n },\n {\n command: 'syntaur install-codex-plugin',\n description: 'Install the Syntaur Codex plugin and register its marketplace entry, prompting for both paths when interactive.',\n example: 'syntaur install-codex-plugin --target-dir ~/plugins/syntaur --marketplace-path ~/.agents/plugins/marketplace.json',\n },\n {\n command: 'syntaur uninstall',\n description: 'Remove Syntaur plugins and optionally local ~/.syntaur data.',\n example: 'syntaur uninstall --all',\n },\n {\n command: 'syntaur setup-adapter',\n description: 'Generate adapter instruction files for cursor, codex, or opencode in the current directory.',\n example: 'syntaur setup-adapter cursor --project ui-overhaul --assignment implement-overview',\n },\n\n // --- Session & server tracking (index 17) ---\n {\n command: 'syntaur track-session',\n description:\n 'Register an agent session. Requires --session-id from the agent runtime (real, not generated). Pass --transcript-path for the rollout/transcript file. --project and --assignment are optional.',\n example:\n 'syntaur track-session --agent claude --session-id <real-id> --transcript-path <path> --project ui-overhaul --assignment implement-overview',\n },\n\n // --- Browsing & playbooks (indices 18-20) ---\n {\n command: 'syntaur browse',\n description: 'Interactive TUI browser for projects and assignments.',\n example: 'syntaur browse',\n },\n {\n command: 'syntaur create-playbook',\n description: 'Create a new playbook with behavioral rules for agents.',\n example: 'syntaur create-playbook \"Code Review Standards\"',\n },\n {\n command: 'syntaur list-playbooks',\n description: 'List all playbooks in the Syntaur home directory.',\n example: 'syntaur list-playbooks',\n },\n];\n\nconst WORKFLOW: HelpChecklistItem[] = [\n {\n title: 'Initialize the workspace',\n detail: 'Run setup once so Syntaur can initialize its local home directory and offer plugin installation.',\n command: CLI_COMMANDS[0],\n },\n {\n title: 'Create a project',\n detail: 'Use a project for a higher-level objective. Projects group assignments, shared resources, and memories.',\n command: CLI_COMMANDS[2],\n href: '/create/project',\n },\n {\n title: 'Create the first assignment',\n detail: 'Assignments are the execution unit. Create one for each concrete chunk of work inside the project.',\n command: CLI_COMMANDS[3],\n },\n {\n title: 'Assign the work',\n detail: 'Setting an assignee before starting is recommended for clarity, but not required.',\n command: CLI_COMMANDS[4],\n },\n {\n title: 'Start, review, complete, or block through lifecycle actions',\n detail: 'Status changes happen through lifecycle actions, kanban drag-and-drop, or the status override controls.',\n command: CLI_COMMANDS[5],\n },\n {\n title: 'Use the dashboard for triage and context',\n detail: 'Overview shows the current queue, project pages show health, assignment pages show the execution surface.',\n command: CLI_COMMANDS[12],\n href: '/',\n },\n];\n\nconst DEFAULT_STATUS_GUIDE: Record<string, { meaning: string; useWhen: string }> = {\n pending: {\n meaning: 'The assignment has not started yet.',\n useWhen: 'Use pending while waiting to start. If dependencies are unmet, pending is the normal waiting state.',\n },\n in_progress: {\n meaning: 'An assigned agent is actively working the assignment.',\n useWhen: 'Use in_progress once the work has started and dependencies are satisfied.',\n },\n blocked: {\n meaning: 'The assignment hit a manual or runtime obstacle.',\n useWhen: 'Use blocked when work hits an obstacle. Adding a blockedReason is recommended for traceability.',\n },\n review: {\n meaning: 'Implementation is ready for inspection or validation.',\n useWhen: 'Use review after active work is ready to be checked before completion.',\n },\n completed: {\n meaning: 'The assignment is done.',\n useWhen: 'Use completed when the acceptance criteria are satisfied.',\n },\n failed: {\n meaning: 'The assignment could not be completed as planned.',\n useWhen: 'Use failed when the work cannot be recovered within the current assignment.',\n },\n};\n\nasync function buildStatusGuide(): Promise<HelpStatusGuideEntry[]> {\n const config = await getStatusConfig();\n\n return config.statuses.map((s) => {\n const defaults = DEFAULT_STATUS_GUIDE[s.id];\n return {\n status: s.id,\n meaning: s.description ?? defaults?.meaning ?? `The assignment is in the \"${s.label}\" state.`,\n useWhen: defaults?.useWhen ?? `Use ${s.id} when appropriate for the \"${s.label}\" workflow state.`,\n };\n });\n}\n\nexport async function getDashboardHelp(): Promise<HelpResponse> {\n return {\n generatedAt: new Date().toISOString(),\n whatIsSyntaur: {\n summary:\n 'Syntaur is a local-first, markdown-backed agent work system. The dashboard is a live view over project folders and files on disk.',\n bullets: [\n 'Markdown files are the source of truth.',\n 'The UI reads project folders, assignment files, and derived indexes from the local filesystem.',\n 'Derived underscore-prefixed files are projections, not the canonical edit target.',\n ],\n },\n coreConcepts: [\n {\n term: 'Project',\n description:\n 'A project is the higher-level objective. It owns assignments, shared resources, and project memories.',\n },\n {\n term: 'Assignment',\n description:\n 'An assignment is a concrete unit of execution. Assignment frontmatter is the source of truth for status, priority, assignee, and dependencies.',\n },\n {\n term: 'Resource',\n description:\n 'A project-level shared reference file that provides source material or constraints for the work.',\n },\n {\n term: 'Memory',\n description:\n 'A project-level learning or pattern captured during execution so future assignments can reuse it.',\n },\n {\n term: 'Manifest',\n description:\n 'A derived navigation file that points agents at the project overview, indexes, and agent instructions.',\n },\n {\n term: 'Derived file',\n description:\n 'An underscore-prefixed file regenerated from canonical markdown sources. Read it, but do not edit it directly.',\n },\n {\n term: 'Handoff',\n description:\n 'An append-only log that records baton-passes between agents or sessions without rewriting prior history.',\n },\n {\n term: 'Decision record',\n description:\n 'An append-only record of important decisions, rationale, and follow-up consequences.',\n },\n {\n term: 'Playbook',\n description:\n 'A behavioral rule set stored in ~/.syntaur/playbooks/. Playbooks define constraints and conventions that agents must follow during execution. Manage them via the CLI or the Playbooks page.',\n },\n {\n term: 'Workspace',\n description:\n 'The repository context for an assignment, including the repository path, worktree path, branch, and parent branch. Workspace fields connect an assignment to the code being worked on and define write boundaries.',\n },\n {\n term: 'Agent Session',\n description:\n 'A tracked AI session tied to assignment work. Sessions are registered via the track-session CLI command or the Claude Code plugin and visible on the Agent Sessions page.',\n },\n {\n term: 'Server',\n description:\n 'A tracked tmux session with automatic port discovery, branch detection, and assignment linking. The Servers page shows all tracked sessions with their windows, panes, and discovered services.',\n },\n ],\n workflow: WORKFLOW,\n statusGuide: await buildStatusGuide(),\n ownershipRules: [\n {\n label: 'Human-authored files',\n files: ['project.md', 'agent.md', 'claude.md'],\n description:\n 'These files define project intent and instructions. The dashboard treats project status as derived except for the archive fields.',\n },\n {\n label: 'Assignment working files',\n files: ['assignment.md', 'plan*.md (optional, versioned)', 'scratchpad.md'],\n description:\n 'These are agent-writable files. The dashboard lets you edit the source markdown while preserving unsupported frontmatter keys.',\n },\n {\n label: 'Append-only logs',\n files: ['handoff.md', 'decision-record.md'],\n description:\n 'These logs preserve history. The dashboard appends new entries instead of rewriting previous ones.',\n },\n {\n label: 'Derived files',\n files: ['_status.md', '_index-assignments.md', '_index-plans.md', '_index-decisions.md'],\n description:\n 'These files are read-only projections. They can lag behind source files, so the dashboard computes source-first state.',\n },\n ],\n commands: CLI_COMMANDS,\n navigation: [\n {\n label: 'Overview',\n description: 'Triage hub showing current attention items, recent activity, progress stats, and first-run setup guidance.',\n href: '/',\n },\n {\n label: 'Projects',\n description: 'Browse, search, filter, and sort the project directory. Create new projects and drill into project workspaces.',\n href: '/projects',\n },\n {\n label: 'Assignments',\n description: 'Cross-project kanban board of all assignments. Drag cards between columns to change status, or filter by project, assignee, or status.',\n href: '/assignments',\n },\n {\n label: 'Servers',\n description: 'Tracked tmux sessions with auto-discovered ports, URLs, git branches, and links to related assignments. Register sessions manually or let autodiscovery find them.',\n href: '/servers',\n },\n {\n label: 'Agent Sessions',\n description: 'Monitor which AI agents are currently working, what assignments they are linked to, and session duration. Sessions are registered via the Claude Code plugin or track-session CLI command.',\n href: '/agent-sessions',\n },\n {\n label: 'Playbooks',\n description: 'Create, browse, and edit behavioral rules that agents must follow. The playbook manifest at ~/.syntaur/playbooks/manifest.md is auto-generated for inclusion in agent instructions.',\n href: '/playbooks',\n },\n {\n label: 'Attention',\n description: 'Focused queue of assignments that need action: blocked, failed, in review, stale, or with unmet dependencies.',\n href: '/attention',\n },\n {\n label: 'Help',\n description: 'This page. Status guide, CLI quick reference, core concepts, and FAQ.',\n href: '/help',\n },\n {\n label: 'Settings',\n description: 'Customize status definitions, labels, colors, display order, and done states. Changes apply globally across the dashboard and CLI.',\n href: '/settings',\n },\n {\n label: 'Project page',\n description: 'The project workspace shows health stats, assignment list, dependency graph, shared resources, and memories.',\n href: '/projects',\n },\n {\n label: 'Assignment page',\n description: 'The assignment workspace shows lifecycle actions, plan editor, scratchpad, handoff log, decision records, and agent sessions.',\n href: '/projects',\n },\n ],\n faq: [\n {\n question: 'Why are some files read-only in the dashboard?',\n answer:\n 'Underscore-prefixed files are derived projections that can be rebuilt from canonical markdown sources. Editing them would create drift, so the UI treats them as read-only.',\n },\n {\n question: 'Why can an assignment be pending even when nothing looks broken?',\n answer:\n 'Pending often just means the work has not started yet or it is waiting on declared dependencies. Blocked is reserved for exceptional runtime obstacles that need intervention.',\n },\n {\n question: 'How do I change an assignment\\'s status?',\n answer:\n 'Use lifecycle CLI commands (syntaur start, syntaur complete, etc.), drag cards on the kanban board, or use the Override Status dropdown on the assignment page. Any status can be set from any other status.',\n },\n {\n question: 'How do I customize statuses?',\n answer:\n 'Open the Settings page from the sidebar. You can add, remove, rename, recolor, and reorder statuses. You can also mark statuses as done states. Changes are saved to ~/.syntaur/config.md and take effect immediately across the dashboard.',\n },\n {\n question: 'What is a done state?',\n answer:\n 'A done state (also called terminal status) means the assignment is finished. Done states fill the completed portion of progress bars and satisfy dependency requirements. By default, \"completed\" and \"failed\" are done states. You can configure which statuses are done states in Settings.',\n },\n {\n question: 'What are playbooks and how do I use them?',\n answer:\n 'Playbooks are markdown files in ~/.syntaur/playbooks/ that define behavioral rules agents must follow. Create them via the CLI (syntaur create-playbook) or the Playbooks page. The auto-generated manifest at ~/.syntaur/playbooks/manifest.md can be included in your CLAUDE.md so agents pick up the rules.',\n },\n {\n question: 'How does agent session tracking work?',\n answer:\n 'When an AI agent starts working on an assignment, it can register a session via the track-session CLI command or the Claude Code plugin\\'s /track-session command. The Agent Sessions page shows active and completed sessions with their linked assignments and duration.',\n },\n {\n question: 'How does server tracking work?',\n answer:\n 'Syntaur tracks tmux sessions to discover running dev servers, their ports, git branches, and linked assignments. Register sessions on the Servers page or let autodiscovery find them. Pane info refreshes automatically.',\n },\n ],\n firstProjectChecklist: [\n {\n title: 'Create the project',\n detail: 'Describe the overall objective in project.md, then add tags and archive metadata only when needed.',\n command: CLI_COMMANDS[1],\n href: '/create/project',\n },\n {\n title: 'Create at least one assignment',\n detail: 'Break the project into executable work units with explicit priority and dependencies.',\n command: CLI_COMMANDS[2],\n },\n {\n title: 'Assign and start the first assignment',\n detail: 'Set an assignee, then start the assignment once prerequisites are complete.',\n command: CLI_COMMANDS[3],\n },\n {\n title: 'Use the assignment workspace for execution',\n detail: 'Keep the objective and todos in assignment.md, implementation plans in optional versioned plan files (plan.md, plan-v2.md, ...), and transient notes in scratchpad.md.',\n href: '/projects',\n },\n {\n title: 'Record handoffs and decisions without rewriting history',\n detail: 'Append new handoff and decision entries instead of editing prior entries.',\n },\n {\n title: 'Return to Overview for triage',\n detail: 'Overview and Attention show the queue that needs action next.',\n href: '/',\n },\n ],\n links: [\n { label: 'Overview', href: '/' },\n { label: 'Project Directory', href: '/projects' },\n { label: 'Assignments Board', href: '/assignments' },\n { label: 'Attention Queue', href: '/attention' },\n { label: 'Servers', href: '/servers' },\n { label: 'Agent Sessions', href: '/agent-sessions' },\n { label: 'Playbooks', href: '/playbooks' },\n { label: 'Settings', href: '/settings' },\n { label: 'Create Project', href: '/create/project' },\n ],\n };\n}\n\nexport function getHelpCommandNames(): string[] {\n return CLI_COMMANDS.map((command) => command.command.replace(/^syntaur\\s+/, ''));\n}\n","import { readdir, readFile, unlink } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { ensureDir, fileExists, writeFileForce } from '../utils/fs.js';\nimport { extractFrontmatter, getField } from './parser.js';\nimport type { SessionFileData, SessionKind } from './types.js';\n\nexport function sanitizeSessionName(name: string): string {\n return name.replace(/[^a-zA-Z0-9_-]/g, '-');\n}\n\nfunction nowTimestamp(): string {\n return new Date().toISOString();\n}\n\nexport interface BuildSessionOptions {\n session: string;\n registered: string;\n lastRefreshed: string;\n overrides: Record<string, { project: string; assignment: string }>;\n auto?: boolean;\n kind?: SessionKind;\n pid?: number;\n ports?: number[];\n cwd?: string;\n}\n\nexport function buildSessionContent(opts: BuildSessionOptions): string {\n const lines = [\n '---',\n `session: ${opts.session}`,\n `registered: ${opts.registered}`,\n `last_refreshed: ${opts.lastRefreshed}`,\n ];\n\n if (opts.auto != null) {\n lines.push(`auto: ${opts.auto}`);\n }\n if (opts.kind) {\n lines.push(`kind: ${opts.kind}`);\n }\n if (opts.pid != null) {\n lines.push(`pid: ${opts.pid}`);\n }\n if (opts.ports && opts.ports.length > 0) {\n lines.push(`ports: [${opts.ports.join(', ')}]`);\n }\n if (opts.cwd) {\n lines.push(`cwd: ${opts.cwd}`);\n }\n\n if (Object.keys(opts.overrides).length > 0) {\n lines.push('overrides:');\n for (const [key, val] of Object.entries(opts.overrides)) {\n lines.push(` \"${key}\": { project: \"${val.project}\", assignment: \"${val.assignment}\" }`);\n }\n }\n\n lines.push('---', '');\n return lines.join('\\n');\n}\n\nexport async function registerSession(dir: string, rawName: string): Promise<string> {\n const name = sanitizeSessionName(rawName);\n await ensureDir(dir);\n const now = nowTimestamp();\n const content = buildSessionContent({\n session: name, registered: now, lastRefreshed: now, overrides: {},\n });\n await writeFileForce(resolve(dir, `${name}.md`), content);\n return name;\n}\n\nexport async function listSessionFiles(dir: string): Promise<string[]> {\n if (!(await fileExists(dir))) return [];\n const entries = await readdir(dir);\n return entries\n .filter((f) => f.endsWith('.md'))\n .map((f) => f.replace(/\\.md$/, ''));\n}\n\nexport async function readSessionFile(dir: string, name: string): Promise<SessionFileData | null> {\n const filePath = resolve(dir, `${sanitizeSessionName(name)}.md`);\n if (!(await fileExists(filePath))) return null;\n\n const raw = await readFile(filePath, 'utf-8');\n const [frontmatter] = extractFrontmatter(raw);\n if (!frontmatter) return null;\n\n const session = getField(frontmatter, 'session') ?? name;\n const registered = getField(frontmatter, 'registered') ?? '';\n const lastRefreshed = getField(frontmatter, 'last_refreshed') ?? '';\n\n // Parse overrides block\n const overrides: Record<string, { project: string; assignment: string }> = {};\n const overridesMatch = frontmatter.match(/^overrides:\\n((?:\\s+\".+\\n?)*)/m);\n if (overridesMatch) {\n const overrideLines = overridesMatch[1].matchAll(\n /^\\s+\"([^\"]+)\":\\s*\\{\\s*project:\\s*\"([^\"]+)\",\\s*assignment:\\s*\"([^\"]+)\"\\s*\\}/gm,\n );\n for (const m of overrideLines) {\n overrides[m[1]] = { project: m[2], assignment: m[3] };\n }\n }\n\n const autoField = getField(frontmatter, 'auto');\n const auto = autoField === 'true' ? true : autoField === 'false' ? false : undefined;\n const kind = getField(frontmatter, 'kind') as SessionKind | undefined;\n const pidField = getField(frontmatter, 'pid');\n const pid = pidField ? parseInt(pidField, 10) : undefined;\n const cwdField = getField(frontmatter, 'cwd');\n\n let ports: number[] | undefined;\n const portsMatch = frontmatter.match(/^ports:\\s*\\[([^\\]]*)\\]/m);\n if (portsMatch) {\n ports = portsMatch[1].split(',').map((s) => parseInt(s.trim(), 10)).filter((n) => !isNaN(n));\n }\n\n return {\n session, registered, lastRefreshed, overrides,\n ...(auto != null && { auto }),\n ...(kind && { kind }),\n ...(pid != null && !isNaN(pid) && { pid }),\n ...(ports && ports.length > 0 && { ports }),\n ...(cwdField && { cwd: cwdField }),\n };\n}\n\nexport async function removeSession(dir: string, name: string): Promise<void> {\n const filePath = resolve(dir, `${sanitizeSessionName(name)}.md`);\n if (await fileExists(filePath)) {\n await unlink(filePath);\n }\n}\n\nexport async function updateLastRefreshed(dir: string, name: string): Promise<void> {\n const data = await readSessionFile(dir, name);\n if (!data) return;\n const content = buildSessionContent({ ...data, lastRefreshed: nowTimestamp() });\n await writeFileForce(resolve(dir, `${sanitizeSessionName(name)}.md`), content);\n}\n\nexport async function setOverride(\n dir: string,\n sessionName: string,\n windowIndex: number,\n paneIndex: number,\n assignment: { project: string; assignment: string } | null,\n): Promise<void> {\n const data = await readSessionFile(dir, sessionName);\n if (!data) return;\n const key = `${windowIndex}:${paneIndex}`;\n if (assignment) {\n data.overrides[key] = assignment;\n } else {\n delete data.overrides[key];\n }\n const content = buildSessionContent({ ...data });\n await writeFileForce(resolve(dir, `${sanitizeSessionName(sessionName)}.md`), content);\n}\n\nexport interface RegisterAutoOptions {\n kind: SessionKind;\n pid?: number;\n ports?: number[];\n cwd?: string;\n}\n\nexport async function registerAutoSession(\n dir: string,\n rawName: string,\n opts: RegisterAutoOptions,\n): Promise<string> {\n const name = sanitizeSessionName(rawName);\n await ensureDir(dir);\n const now = nowTimestamp();\n const content = buildSessionContent({\n session: name,\n registered: now,\n lastRefreshed: now,\n overrides: {},\n auto: true,\n kind: opts.kind,\n pid: opts.pid,\n ports: opts.ports,\n cwd: opts.cwd,\n });\n await writeFileForce(resolve(dir, `${name}.md`), content);\n return name;\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { resolve } from 'node:path';\nimport { realpath, readdir, readFile } from 'node:fs/promises';\nimport { listProjects } from './api.js';\nimport {\n readSessionFile,\n listSessionFiles,\n} from './servers.js';\nimport { extractFrontmatter, getField, getNestedField } from './parser.js';\nimport type {\n TrackedSession,\n TrackedWindow,\n TrackedPane,\n ServersResponse,\n SessionFileData,\n} from './types.js';\n\nconst exec = promisify(execFile);\n\n// --- Cache ---\nlet cache: { data: ServersResponse; expiry: number } | null = null;\nconst CACHE_TTL_MS = 10_000;\n\nexport function clearScanCache(): void {\n cache = null;\n}\n\n// --- Pure parsing functions (exported for testing) ---\n\nexport interface RawPane {\n windowIndex: number;\n windowName: string;\n paneIndex: number;\n command: string;\n cwd: string;\n pid: number;\n}\n\nexport function parseTmuxPaneOutput(output: string): RawPane[] {\n return output\n .trim()\n .split('\\n')\n .filter((line) => line.length > 0)\n .map((line) => {\n const [wi, wn, pi, cmd, cwd, pid] = line.split('|');\n return {\n windowIndex: parseInt(wi, 10),\n windowName: wn,\n paneIndex: parseInt(pi, 10),\n command: cmd,\n cwd,\n pid: parseInt(pid, 10),\n };\n });\n}\n\nexport function findListeningPorts(lsofOutput: string, pids: Set<number>): number[] {\n const ports: number[] = [];\n for (const line of lsofOutput.split('\\n')) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length < 9) continue;\n const pid = parseInt(parts[1], 10);\n if (!pids.has(pid)) continue;\n const tcpAddr = parts.find((p) => p.includes(':') && /:\\d+$/.test(p));\n if (tcpAddr) {\n const port = parseInt(tcpAddr.split(':').pop()!, 10);\n if (!isNaN(port) && !ports.includes(port)) {\n ports.push(port);\n }\n }\n }\n return ports;\n}\n\n// --- Shell helpers ---\n\nexport async function execQuiet(cmd: string, args: string[]): Promise<string> {\n try {\n const { stdout } = await exec(cmd, args);\n return stdout.trim();\n } catch {\n return '';\n }\n}\n\nexport async function checkTmuxAvailable(): Promise<boolean> {\n const result = await execQuiet('which', ['tmux']);\n return result.length > 0;\n}\n\nexport async function sessionAlive(name: string): Promise<boolean> {\n try {\n await exec('tmux', ['has-session', '-t', name]);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function listTmuxPanes(sessionName: string): Promise<RawPane[]> {\n const output = await execQuiet('tmux', [\n 'list-panes', '-s', '-t', sessionName,\n '-F', '#{window_index}|#{window_name}|#{pane_index}|#{pane_current_command}|#{pane_current_path}|#{pane_pid}',\n ]);\n return parseTmuxPaneOutput(output);\n}\n\nexport async function getDescendantPids(rootPid: number, maxDepth: number = 4): Promise<Set<number>> {\n const all = new Set<number>([rootPid]);\n let frontier = [rootPid];\n\n for (let depth = 0; depth < maxDepth && frontier.length > 0; depth++) {\n const nextFrontier: number[] = [];\n for (const pid of frontier) {\n const output = await execQuiet('pgrep', ['-P', String(pid)]);\n for (const line of output.split('\\n')) {\n const child = parseInt(line, 10);\n if (!isNaN(child) && !all.has(child)) {\n all.add(child);\n nextFrontier.push(child);\n }\n }\n }\n frontier = nextFrontier;\n }\n\n return all;\n}\n\nexport async function getLsofOutput(): Promise<string> {\n return execQuiet('lsof', ['-i', '-P', '-n', '-sTCP:LISTEN']);\n}\n\nexport async function getGitInfo(cwd: string): Promise<{ branch: string | null; worktree: boolean }> {\n const branch = await execQuiet('git', ['-C', cwd, 'rev-parse', '--abbrev-ref', 'HEAD']);\n if (!branch) return { branch: null, worktree: false };\n\n const commonDir = await execQuiet('git', ['-C', cwd, 'rev-parse', '--git-common-dir']);\n const gitDir = await execQuiet('git', ['-C', cwd, 'rev-parse', '--git-dir']);\n\n let isWorktree = false;\n if (commonDir && gitDir && commonDir !== gitDir) {\n try {\n const resolvedCommon = await realpath(resolve(cwd, commonDir));\n const resolvedGit = await realpath(resolve(cwd, gitDir));\n isWorktree = resolvedCommon !== resolvedGit;\n } catch {\n isWorktree = false;\n }\n }\n\n return { branch: branch || null, worktree: isWorktree };\n}\n\n// --- Auto-linking ---\n\nexport interface AssignmentLink {\n project: string | null;\n slug: string;\n title: string;\n}\n\nexport interface WorkspaceRecord {\n projectSlug: string | null;\n /** For project-nested, the slug. For standalone, the UUID. */\n assignmentSlug: string;\n assignmentTitle: string;\n worktreePath: string | null;\n branch: string | null;\n}\n\nexport async function loadWorkspaceRecords(\n projectsDir: string,\n assignmentsDir?: string,\n): Promise<WorkspaceRecord[]> {\n const records: WorkspaceRecord[] = [];\n try {\n const projects = await listProjects(projectsDir);\n\n for (const project of projects) {\n const projectAssignmentsDir = resolve(projectsDir, project.slug, 'assignments');\n let slugs: string[];\n try {\n slugs = await readdir(projectAssignmentsDir);\n } catch {\n continue;\n }\n for (const aslug of slugs) {\n const aFile = resolve(projectAssignmentsDir, aslug, 'assignment.md');\n try {\n const raw = await readFile(aFile, 'utf-8');\n const [fm] = extractFrontmatter(raw);\n if (!fm) continue;\n records.push({\n projectSlug: project.slug,\n assignmentSlug: aslug,\n assignmentTitle: getField(fm, 'title') ?? aslug,\n worktreePath: getNestedField(fm, 'workspace', 'worktreePath') ?? null,\n branch: getNestedField(fm, 'workspace', 'branch') ?? null,\n });\n } catch {\n continue;\n }\n }\n }\n } catch {\n // If projects can't be loaded, auto-linking just returns no matches\n }\n\n if (assignmentsDir) {\n try {\n const entries = await readdir(assignmentsDir);\n for (const id of entries) {\n if (id.startsWith('.') || id.startsWith('_')) continue;\n const aFile = resolve(assignmentsDir, id, 'assignment.md');\n try {\n const raw = await readFile(aFile, 'utf-8');\n const [fm] = extractFrontmatter(raw);\n if (!fm) continue;\n records.push({\n projectSlug: null,\n assignmentSlug: id,\n assignmentTitle: getField(fm, 'title') ?? id,\n worktreePath: getNestedField(fm, 'workspace', 'worktreePath') ?? null,\n branch: getNestedField(fm, 'workspace', 'branch') ?? null,\n });\n } catch {\n continue;\n }\n }\n } catch {\n // standalone dir missing is fine\n }\n }\n\n return records;\n}\n\nexport async function resolveAndNormalize(p: string): Promise<string> {\n try {\n const resolved = await realpath(p);\n return resolved.replace(/\\/+$/, '');\n } catch {\n return p.replace(/\\/+$/, '');\n }\n}\n\nexport async function autoLinkPane(\n cwd: string,\n branch: string | null,\n records: WorkspaceRecord[],\n): Promise<AssignmentLink | null> {\n const normalizedCwd = await resolveAndNormalize(cwd);\n for (const rec of records) {\n if (rec.worktreePath) {\n const normalizedWt = await resolveAndNormalize(rec.worktreePath);\n if (normalizedCwd === normalizedWt) {\n return { project: rec.projectSlug, slug: rec.assignmentSlug, title: rec.assignmentTitle };\n }\n }\n }\n if (branch) {\n for (const rec of records) {\n if (rec.branch && rec.branch === branch) {\n return { project: rec.projectSlug, slug: rec.assignmentSlug, title: rec.assignmentTitle };\n }\n }\n }\n return null;\n}\n\n// --- Main scan function ---\n\nasync function scanSession(\n sessionData: SessionFileData,\n lsofOutput: string,\n workspaceRecords: WorkspaceRecord[],\n): Promise<TrackedSession> {\n const now = new Date().toISOString();\n const alive = await sessionAlive(sessionData.session);\n\n if (!alive) {\n return {\n name: sessionData.session,\n kind: 'tmux',\n registered: sessionData.registered,\n lastRefreshed: sessionData.lastRefreshed,\n scannedAt: now,\n alive: false,\n windows: [],\n };\n }\n\n const rawPanes = await listTmuxPanes(sessionData.session);\n\n // Group panes by window\n const windowMap = new Map<number, { name: string; panes: RawPane[] }>();\n for (const rp of rawPanes) {\n if (!windowMap.has(rp.windowIndex)) {\n windowMap.set(rp.windowIndex, { name: rp.windowName, panes: [] });\n }\n windowMap.get(rp.windowIndex)!.panes.push(rp);\n }\n\n // Get git info per unique cwd\n const cwdSet = new Set(rawPanes.map((p) => p.cwd));\n const gitInfoCache = new Map<string, { branch: string | null; worktree: boolean }>();\n for (const cwd of cwdSet) {\n gitInfoCache.set(cwd, await getGitInfo(cwd));\n }\n\n // Get all descendant PIDs for port lookup\n const pidToPaneKey = new Map<number, string>();\n for (const rp of rawPanes) {\n const descendants = await getDescendantPids(rp.pid);\n const key = `${rp.windowIndex}:${rp.paneIndex}`;\n for (const pid of descendants) {\n pidToPaneKey.set(pid, key);\n }\n }\n\n // Find ports per pane\n const panePorts = new Map<string, number[]>();\n for (const line of lsofOutput.split('\\n')) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length < 9) continue;\n const pid = parseInt(parts[1], 10);\n const paneKey = pidToPaneKey.get(pid);\n if (!paneKey) continue;\n const tcpAddr = parts.find((p) => p.includes(':') && /:\\d+$/.test(p));\n if (tcpAddr) {\n const port = parseInt(tcpAddr.split(':').pop()!, 10);\n if (!isNaN(port)) {\n if (!panePorts.has(paneKey)) panePorts.set(paneKey, []);\n const existing = panePorts.get(paneKey)!;\n if (!existing.includes(port)) existing.push(port);\n }\n }\n }\n\n // Build windows — use for-of loop, NOT .map() with async callback\n const windows: TrackedWindow[] = [];\n for (const [windowIndex, { name, panes: rawPanesInWindow }] of windowMap) {\n const panes: TrackedPane[] = [];\n for (const rp of rawPanesInWindow) {\n const key = `${rp.windowIndex}:${rp.paneIndex}`;\n const gitInfo = gitInfoCache.get(rp.cwd) ?? { branch: null, worktree: false };\n const ports = panePorts.get(key) ?? [];\n const urls = ports.map((p) => `http://localhost:${p}`);\n\n const override = sessionData.overrides[key];\n let assignment: AssignmentLink | null = null;\n if (override) {\n const rec = workspaceRecords.find(\n (r) => r.projectSlug === override.project && r.assignmentSlug === override.assignment,\n );\n assignment = {\n project: override.project,\n slug: override.assignment,\n title: rec?.assignmentTitle ?? override.assignment,\n };\n } else {\n assignment = await autoLinkPane(rp.cwd, gitInfo.branch, workspaceRecords);\n }\n\n panes.push({\n index: rp.paneIndex,\n command: rp.command,\n cwd: rp.cwd,\n branch: gitInfo.branch,\n worktree: gitInfo.worktree,\n ports,\n urls,\n assignment,\n });\n }\n\n windows.push({ index: windowIndex, name, panes });\n }\n\n windows.sort((a, b) => a.index - b.index);\n\n return {\n name: sessionData.session,\n kind: 'tmux' as const,\n registered: sessionData.registered,\n lastRefreshed: sessionData.lastRefreshed,\n scannedAt: now,\n alive: true,\n windows,\n };\n}\n\nasync function scanProcessSession(\n sessionData: SessionFileData,\n lsofOutput: string,\n workspaceRecords: WorkspaceRecord[],\n): Promise<TrackedSession> {\n const now = new Date().toISOString();\n\n // Check if the process is still alive\n let alive = false;\n if (sessionData.pid) {\n try {\n process.kill(sessionData.pid, 0);\n alive = true;\n } catch {\n alive = false;\n }\n }\n\n if (!alive || !sessionData.cwd) {\n return {\n name: sessionData.session,\n kind: 'process',\n registered: sessionData.registered,\n lastRefreshed: sessionData.lastRefreshed,\n scannedAt: now,\n alive: false,\n windows: [],\n };\n }\n\n // Re-resolve ports from lsof for the PID\n const ports = findListeningPorts(lsofOutput, new Set([sessionData.pid!]));\n\n const gitInfo = await getGitInfo(sessionData.cwd);\n\n // Honor manual overrides (process sessions use key \"0:0\")\n const override = sessionData.overrides['0:0'];\n let assignment: AssignmentLink | null = null;\n if (override) {\n const rec = workspaceRecords.find(\n (r) => r.projectSlug === override.project && r.assignmentSlug === override.assignment,\n );\n assignment = {\n project: override.project,\n slug: override.assignment,\n title: rec?.assignmentTitle ?? override.assignment,\n };\n } else {\n assignment = await autoLinkPane(sessionData.cwd, gitInfo.branch, workspaceRecords);\n }\n\n const pane: TrackedPane = {\n index: 0,\n command: sessionData.session,\n cwd: sessionData.cwd,\n branch: gitInfo.branch,\n worktree: gitInfo.worktree,\n ports,\n urls: ports.map((p) => `http://localhost:${p}`),\n assignment,\n };\n\n return {\n name: sessionData.session,\n kind: 'process' as const,\n registered: sessionData.registered,\n lastRefreshed: sessionData.lastRefreshed,\n scannedAt: now,\n alive: true,\n windows: [{ index: 0, name: 'process', panes: [pane] }],\n };\n}\n\nexport async function scanAllSessions(\n serversDir: string,\n projectsDir: string,\n options?: { bypassCache?: boolean; assignmentsDir?: string },\n): Promise<ServersResponse> {\n if (!options?.bypassCache && cache && Date.now() < cache.expiry) {\n return cache.data;\n }\n\n const tmuxAvailable = await checkTmuxAvailable();\n const names = await listSessionFiles(serversDir);\n const lsofOutput = await getLsofOutput();\n const workspaceRecords = await loadWorkspaceRecords(projectsDir, options?.assignmentsDir);\n\n const sessions: TrackedSession[] = [];\n for (const name of names) {\n const data = await readSessionFile(serversDir, name);\n if (!data) continue;\n\n if (data.kind === 'process') {\n sessions.push(await scanProcessSession(data, lsofOutput, workspaceRecords));\n } else if (tmuxAvailable) {\n sessions.push(await scanSession(data, lsofOutput, workspaceRecords));\n }\n // Skip tmux-kind entries when tmux is unavailable\n }\n\n const result: ServersResponse = { sessions, tmuxAvailable };\n cache = { data: result, expiry: Date.now() + CACHE_TTL_MS };\n return result;\n}\n\nexport async function scanSingleSession(\n serversDir: string,\n projectsDir: string,\n name: string,\n options?: { assignmentsDir?: string },\n): Promise<TrackedSession | null> {\n const data = await readSessionFile(serversDir, name);\n if (!data) return null;\n\n const lsofOutput = await getLsofOutput();\n const workspaceRecords = await loadWorkspaceRecords(projectsDir, options?.assignmentsDir);\n\n if (data.kind === 'process') {\n return scanProcessSession(data, lsofOutput, workspaceRecords);\n }\n return scanSession(data, lsofOutput, workspaceRecords);\n}\n","import { readdir, readFile, writeFile } from 'node:fs/promises';\nimport { resolve, dirname } from 'node:path';\nimport { getTargetStatus, DEFAULT_STATUSES, DEFAULT_TRANSITION_TABLE, buildTransitionTable } from '../lifecycle/index.js';\nimport { fileExists } from '../utils/fs.js';\nimport { readConfig, type StatusConfig, type StatusTransition } from '../utils/config.js';\nimport { migrateLegacyProjectFiles } from '../utils/fs-migration.js';\nimport { resolveAssignmentById, type ResolvedAssignment } from '../utils/assignment-resolver.js';\nimport {\n parseProject,\n parseStatus,\n parseAssignmentFull,\n parsePlan,\n parseScratchpad,\n parseHandoff,\n parseDecisionRecord,\n parseResource,\n parseMemory,\n parsePlaybook,\n parseProgress,\n parseComments,\n extractMermaidGraph,\n} from './parser.js';\nimport { getDashboardHelp } from './help.js';\nimport type {\n AssignmentBoardItem,\n AssignmentDetail,\n AssignmentReference,\n AssignmentSummary,\n AssignmentsBoardResponse,\n AssignmentTransitionAction,\n AttentionItem,\n AttentionResponse,\n EditableDocumentResponse,\n EnrichedLink,\n HelpResponse,\n MemorySummary,\n ProjectDetail,\n ProjectSummary,\n OverviewResponse,\n ProgressCounts,\n NeedsAttention,\n RecentActivityItem,\n ResourceSummary,\n PlaybookSummary,\n PlaybookDetail,\n} from './types.js';\n\nconst STALE_ASSIGNMENT_MS = 7 * 24 * 60 * 60 * 1000;\nconst ATTENTION_PAGE_LIMIT = 50;\nconst OVERVIEW_ATTENTION_LIMIT = 6;\nconst RECENT_PROJECTS_LIMIT = 6;\nconst RECENT_ACTIVITY_LIMIT = 12;\n\ntype AssignmentRecord = ReturnType<typeof parseAssignmentFull>;\n\ninterface ProjectRecord {\n projectPath: string;\n project: ReturnType<typeof parseProject>;\n assignments: AssignmentRecord[];\n summary: ProjectSummary;\n dependencyGraph: string | null;\n}\n\n/** A standalone assignment lives at `<assignmentsDir>/<uuid>/` and has no containing project. */\ninterface StandaloneRecord {\n assignmentDir: string;\n /** The UUID (folder name). */\n id: string;\n record: AssignmentRecord;\n}\n\nasync function listStandaloneRecords(assignmentsDir: string | undefined): Promise<StandaloneRecord[]> {\n if (!assignmentsDir) return [];\n if (!(await fileExists(assignmentsDir))) return [];\n\n const entries = await readdir(assignmentsDir, { withFileTypes: true });\n const records: StandaloneRecord[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name.startsWith('.') || entry.name.startsWith('_')) continue;\n const assignmentDir = resolve(assignmentsDir, entry.name);\n const assignmentMdPath = resolve(assignmentDir, 'assignment.md');\n if (!(await fileExists(assignmentMdPath))) continue;\n try {\n const content = await readFile(assignmentMdPath, 'utf-8');\n const record = parseAssignmentFull(content);\n records.push({ assignmentDir, id: entry.name, record });\n } catch {\n // skip unreadable\n }\n }\n\n records.sort((left, right) => compareTimestamps(right.record.updated, left.record.updated));\n return records;\n}\n\ninterface AttentionSeverityCounts {\n critical: number;\n high: number;\n medium: number;\n low: number;\n}\n\nconst DEFAULT_TRANSITION_DEFINITIONS: Array<{\n command: string;\n label: string;\n description: string;\n requiresReason: boolean;\n}> = [\n {\n command: 'start',\n label: 'Start',\n description: 'Move pending or review work into active execution.',\n requiresReason: false,\n },\n {\n command: 'review',\n label: 'Send To Review',\n description: 'Mark the assignment ready for inspection.',\n requiresReason: false,\n },\n {\n command: 'complete',\n label: 'Complete',\n description: 'Mark the assignment done.',\n requiresReason: false,\n },\n {\n command: 'block',\n label: 'Block',\n description: 'Record an exceptional blocker and pause work.',\n requiresReason: true,\n },\n {\n command: 'unblock',\n label: 'Unblock',\n description: 'Resume active work after the blocker is cleared.',\n requiresReason: false,\n },\n {\n command: 'fail',\n label: 'Fail',\n description: 'Mark the assignment as failed when it cannot be completed as planned.',\n requiresReason: false,\n },\n {\n command: 'reopen',\n label: 'Reopen',\n description: 'Reopen a completed or failed assignment to resume work.',\n requiresReason: false,\n },\n];\n\nconst DEFAULT_STATUS_COLORS: Record<string, string> = {\n pending: 'slate',\n in_progress: 'teal',\n blocked: 'amber',\n review: 'violet',\n completed: 'emerald',\n failed: 'rose',\n};\n\nfunction toTitleCase(s: string): string {\n return s.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction getTransitionDefinitions(config: ResolvedStatusConfig) {\n if (!config.custom) return DEFAULT_TRANSITION_DEFINITIONS;\n // Deduplicate commands from transitions\n const seen = new Set<string>();\n return config.transitions\n .filter((t) => {\n if (seen.has(t.command)) return false;\n seen.add(t.command);\n return true;\n })\n .map((t) => ({\n command: t.command,\n label: t.label ?? toTitleCase(t.command),\n description: t.description ?? `Transition via ${t.command}.`,\n requiresReason: t.requiresReason ?? false,\n }));\n}\n\ninterface ResolvedStatusConfig {\n custom: boolean;\n statuses: Array<{ id: string; label: string; description?: string; color?: string; terminal?: boolean }>;\n order: string[];\n transitions: StatusTransition[];\n transitionTable: Map<string, string>;\n terminalStatuses: ReadonlySet<string>;\n}\n\nlet _cachedConfig: ResolvedStatusConfig | null = null;\n\nexport async function getStatusConfig(): Promise<ResolvedStatusConfig> {\n if (_cachedConfig) return _cachedConfig;\n\n const config = await readConfig();\n\n if (config.statuses) {\n const terminalSet = new Set(\n config.statuses.statuses.filter((s) => s.terminal).map((s) => s.id),\n );\n _cachedConfig = {\n custom: true,\n statuses: config.statuses.statuses,\n order: config.statuses.order,\n transitions: config.statuses.transitions,\n transitionTable: buildTransitionTable(config.statuses.transitions),\n terminalStatuses: terminalSet.size > 0 ? terminalSet : new Set(['completed', 'failed']),\n };\n } else {\n _cachedConfig = {\n custom: false,\n statuses: DEFAULT_STATUSES.map((id) => ({\n id,\n label: toTitleCase(id),\n color: DEFAULT_STATUS_COLORS[id] ?? 'gray',\n terminal: id === 'completed' || id === 'failed',\n })),\n order: [...DEFAULT_STATUSES],\n transitions: Array.from(DEFAULT_TRANSITION_TABLE.entries()).map(([key, to]) => {\n const [from, command] = key.split(':');\n return { from, command, to };\n }),\n transitionTable: DEFAULT_TRANSITION_TABLE,\n terminalStatuses: new Set(['completed', 'failed']),\n };\n }\n\n return _cachedConfig;\n}\n\nexport function clearStatusConfigCache(): void {\n _cachedConfig = null;\n}\n\n/**\n * List all projects with source-first summary data.\n * GET /api/projects\n */\nexport async function listProjects(projectsDir: string): Promise<ProjectSummary[]> {\n const projectRecords = await listProjectRecords(projectsDir);\n return projectRecords.map((record) => record.summary);\n}\n\n/**\n * Read the workspace registry file (~/.syntaur/workspaces.json).\n * Returns an array of explicitly registered workspace names.\n */\nasync function readWorkspaceRegistry(projectsDir: string): Promise<string[]> {\n const registryPath = resolve(dirname(projectsDir), 'workspaces.json');\n try {\n const raw = await readFile(registryPath, 'utf-8');\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? parsed.filter((w): w is string => typeof w === 'string') : [];\n } catch {\n return [];\n }\n}\n\nasync function writeWorkspaceRegistry(projectsDir: string, workspaces: string[]): Promise<void> {\n const registryPath = resolve(dirname(projectsDir), 'workspaces.json');\n await writeFile(registryPath, JSON.stringify(workspaces, null, 2) + '\\n', 'utf-8');\n}\n\n/**\n * List all workspaces: merge registry (explicit) with discovered (from projects).\n * GET /api/workspaces\n */\nexport async function listWorkspaces(projectsDir: string): Promise<{ workspaces: string[]; hasUngrouped: boolean }> {\n const [projectRecords, registered] = await Promise.all([\n listProjectRecords(projectsDir),\n readWorkspaceRegistry(projectsDir),\n ]);\n const workspaceSet = new Set<string>(registered);\n let hasUngrouped = false;\n for (const record of projectRecords) {\n if (record.project.workspace) {\n workspaceSet.add(record.project.workspace);\n } else {\n hasUngrouped = true;\n }\n }\n const workspaces = Array.from(workspaceSet).sort();\n return { workspaces, hasUngrouped };\n}\n\n/**\n * Create an empty workspace by registering it.\n * POST /api/workspaces\n */\nexport async function createWorkspace(projectsDir: string, name: string): Promise<void> {\n const registered = await readWorkspaceRegistry(projectsDir);\n if (!registered.includes(name)) {\n registered.push(name);\n registered.sort();\n await writeWorkspaceRegistry(projectsDir, registered);\n }\n}\n\n/**\n * Delete a workspace from the registry.\n * DELETE /api/workspaces/:name\n */\nexport async function deleteWorkspace(projectsDir: string, name: string): Promise<void> {\n const registered = await readWorkspaceRegistry(projectsDir);\n const filtered = registered.filter((w) => w !== name);\n await writeWorkspaceRegistry(projectsDir, filtered);\n}\n\n/**\n * Get overview data used by the app landing page.\n * GET /api/overview\n */\nexport async function getOverview(\n projectsDir: string,\n serversDir?: string,\n assignmentsDir?: string,\n): Promise<OverviewResponse> {\n const projectRecords = await listProjectRecords(projectsDir);\n const standaloneRecords = await listStandaloneRecords(assignmentsDir);\n const attention = buildAttentionItems(projectRecords, standaloneRecords);\n const recentActivity = buildRecentActivity(projectRecords, standaloneRecords);\n\n let serverStats: OverviewResponse['serverStats'];\n if (serversDir) {\n try {\n const { scanAllSessions } = await import('./scanner.js');\n const servers = await scanAllSessions(serversDir, projectsDir, { assignmentsDir });\n if (servers.tmuxAvailable) {\n const alive = servers.sessions.filter(s => s.alive).length;\n const totalPorts = servers.sessions.reduce((sum, s) =>\n sum + s.windows.reduce((ws, w) =>\n ws + w.panes.reduce((ps, p) => ps + p.ports.length, 0), 0), 0);\n serverStats = {\n trackedSessions: servers.sessions.length,\n aliveSessions: alive,\n deadSessions: servers.sessions.length - alive,\n totalPorts,\n };\n }\n } catch {\n // Server scanning failure should not break overview\n }\n }\n\n return {\n generatedAt: new Date().toISOString(),\n firstRun: projectRecords.length === 0 && standaloneRecords.length === 0,\n stats: {\n activeProjects: projectRecords.filter((record) => record.summary.status === 'active').length,\n inProgressAssignments: projectRecords.reduce(\n (total, record) => total + (record.summary.progress['in_progress'] ?? 0),\n 0,\n ),\n blockedAssignments: projectRecords.reduce(\n (total, record) => total + (record.summary.progress['blocked'] ?? 0),\n 0,\n ),\n reviewAssignments: projectRecords.reduce(\n (total, record) => total + (record.summary.progress['review'] ?? 0),\n 0,\n ),\n failedAssignments: projectRecords.reduce(\n (total, record) => total + (record.summary.progress['failed'] ?? 0),\n 0,\n ),\n staleAssignments: projectRecords.reduce(\n (total, record) =>\n total + record.assignments.filter((assignment) => isStale(assignment.updated)).length,\n 0,\n ) + standaloneRecords.filter((sr) => isStale(sr.record.updated)).length,\n },\n attention: attention.slice(0, OVERVIEW_ATTENTION_LIMIT),\n recentProjects: projectRecords\n .map((record) => record.summary)\n .sort((left, right) => compareTimestamps(right.updated, left.updated))\n .slice(0, RECENT_PROJECTS_LIMIT),\n recentActivity: recentActivity.slice(0, RECENT_ACTIVITY_LIMIT),\n serverStats,\n };\n}\n\n/**\n * Get the explicit attention queue.\n * GET /api/attention\n */\nexport async function getAttention(\n projectsDir: string,\n serversDir?: string,\n assignmentsDir?: string,\n): Promise<AttentionResponse> {\n const projectRecords = await listProjectRecords(projectsDir);\n const standaloneRecords = await listStandaloneRecords(assignmentsDir);\n const items = buildAttentionItems(projectRecords, standaloneRecords);\n\n if (serversDir) {\n try {\n const { scanAllSessions } = await import('./scanner.js');\n const servers = await scanAllSessions(serversDir, projectsDir, { assignmentsDir });\n for (const session of servers.sessions) {\n if (!session.alive) {\n items.push({\n id: `server-dead-${session.name}`,\n severity: 'low',\n projectSlug: '',\n projectTitle: '',\n assignmentSlug: '',\n assignmentTitle: `tmux: ${session.name}`,\n status: 'failed',\n reason: 'Tmux session no longer exists but is still registered',\n updated: session.lastRefreshed,\n href: '/servers',\n stale: false,\n blockedReason: null,\n });\n }\n }\n } catch {\n // Server scanning failure should not break attention\n }\n }\n\n const pagedItems = items.slice(0, ATTENTION_PAGE_LIMIT);\n const summary: AttentionSeverityCounts = {\n critical: 0,\n high: 0,\n medium: 0,\n low: 0,\n };\n\n for (const item of pagedItems) {\n summary[item.severity]++;\n }\n\n return {\n generatedAt: new Date().toISOString(),\n summary: {\n total: pagedItems.length,\n critical: summary.critical,\n high: summary.high,\n medium: summary.medium,\n low: summary.low,\n },\n items: pagedItems,\n };\n}\n\n/**\n * Get all assignments across all projects for the global kanban board.\n * GET /api/assignments\n */\nexport async function listAssignmentsBoard(\n projectsDir: string,\n assignmentsDir?: string,\n): Promise<AssignmentsBoardResponse> {\n const projectRecords = await listProjectRecords(projectsDir);\n const projectItems = await Promise.all(\n projectRecords.flatMap(async (record) =>\n Promise.all(\n record.assignments.map(async (assignment) =>\n toAssignmentBoardItem(projectsDir, record, assignment),\n ),\n ),\n ),\n );\n\n const standaloneRecords = await listStandaloneRecords(assignmentsDir);\n const standaloneItems = await Promise.all(\n standaloneRecords.map(async (sr) => toStandaloneBoardItem(sr)),\n );\n\n return {\n generatedAt: new Date().toISOString(),\n assignments: [...projectItems.flat(), ...standaloneItems]\n .sort((left, right) => compareTimestamps(right.updated, left.updated)),\n };\n}\n\nasync function toStandaloneBoardItem(sr: StandaloneRecord): Promise<AssignmentBoardItem> {\n return {\n ...toAssignmentSummary(sr.record),\n projectSlug: null,\n projectTitle: null,\n blockedReason: sr.record.blockedReason,\n projectWorkspace: null,\n availableTransitions: await getStandaloneAvailableTransitions(sr.record),\n };\n}\n\nasync function getStandaloneAvailableTransitions(\n assignment: AssignmentRecord,\n): Promise<AssignmentTransitionAction[]> {\n // Standalone assignments have no dependencies, so skip dependency gating.\n const config = await getStatusConfig();\n const transitionDefs = getTransitionDefinitions(config);\n const actions: AssignmentTransitionAction[] = [];\n\n for (const definition of transitionDefs) {\n let warning: string | null = null;\n if (definition.command === 'start' && !assignment.assignee) {\n warning = 'No assignee set — consider assigning before starting.';\n }\n const target = getTargetStatus(assignment.status, definition.command, config.transitionTable);\n actions.push({\n command: definition.command,\n label: definition.label,\n description: definition.description,\n targetStatus: target ?? definition.command,\n disabled: false,\n disabledReason: null,\n warning,\n requiresReason: definition.requiresReason,\n });\n }\n\n return actions;\n}\n\n/**\n * Get the structured help model used by Help and onboarding surfaces.\n * GET /api/help\n */\nexport async function getHelp(): Promise<HelpResponse> {\n return getDashboardHelp();\n}\n\n/**\n * Get a raw editable document for dashboard editor pages.\n */\nexport async function getEditableDocument(\n projectsDir: string,\n documentType: EditableDocumentResponse['documentType'],\n projectSlug: string,\n assignmentSlug?: string,\n): Promise<EditableDocumentResponse | null> {\n const filePath = getDocumentPath(projectsDir, documentType, projectSlug, assignmentSlug);\n if (!filePath || !(await fileExists(filePath))) {\n return null;\n }\n\n const content = await readFile(filePath, 'utf-8');\n const title = getEditableDocumentTitle(documentType, projectSlug, assignmentSlug);\n\n return {\n documentType,\n title,\n content,\n projectSlug,\n assignmentSlug,\n appendOnly: documentType === 'handoff' || documentType === 'decision-record',\n };\n}\n\n/**\n * Resolve an assignment by UUID (standalone or project-nested) and return its\n * editable document payload for the given type.\n */\nexport async function getEditableDocumentById(\n projectsDir: string,\n assignmentsDir: string,\n documentType: EditableDocumentResponse['documentType'],\n id: string,\n): Promise<EditableDocumentResponse | null> {\n const resolved = await resolveAssignmentById(projectsDir, assignmentsDir, id);\n if (!resolved) return null;\n\n if (!resolved.standalone && resolved.projectSlug) {\n return getEditableDocument(\n projectsDir,\n documentType,\n resolved.projectSlug,\n resolved.assignmentSlug,\n );\n }\n\n const fileName =\n documentType === 'assignment'\n ? 'assignment.md'\n : documentType === 'plan'\n ? 'plan.md'\n : documentType === 'scratchpad'\n ? 'scratchpad.md'\n : documentType === 'handoff'\n ? 'handoff.md'\n : documentType === 'decision-record'\n ? 'decision-record.md'\n : null;\n if (!fileName) return null;\n const filePath = resolve(resolved.assignmentDir, fileName);\n if (!(await fileExists(filePath))) return null;\n\n const content = await readFile(filePath, 'utf-8');\n const label = resolved.id;\n const title =\n documentType === 'assignment'\n ? `Edit Assignment: ${label}`\n : documentType === 'plan'\n ? `Edit Plan: ${label}`\n : documentType === 'scratchpad'\n ? `Edit Scratchpad: ${label}`\n : documentType === 'handoff'\n ? `Append Handoff: ${label}`\n : `Append Decision: ${label}`;\n\n return {\n documentType,\n title,\n content,\n projectSlug: null,\n assignmentSlug: undefined,\n assignmentId: resolved.id,\n appendOnly: documentType === 'handoff' || documentType === 'decision-record',\n };\n}\n\n/**\n * Get full project detail with assignments, resources, and memories.\n * GET /api/projects/:slug\n */\nexport async function getProjectDetail(\n projectsDir: string,\n slug: string,\n): Promise<ProjectDetail | null> {\n const projectPath = resolve(projectsDir, slug);\n const projectMdPath = resolve(projectPath, 'project.md');\n\n if (!(await fileExists(projectMdPath))) {\n return null;\n }\n\n const projectContent = await readFile(projectMdPath, 'utf-8');\n const project = parseProject(projectContent);\n const assignments = await listAssignmentRecords(projectPath);\n const rollup = await buildProjectRollup(projectPath, project, assignments);\n const dependencyGraph = await loadDependencyGraph(projectPath, assignments);\n const resources = await listResources(projectPath);\n const memories = await listMemories(projectPath);\n const updated = getProjectActivityTimestamp(project.updated, assignments);\n\n return {\n slug: project.slug || slug,\n title: project.title,\n status: rollup.status,\n statusOverride: project.statusOverride,\n archived: project.archived,\n archivedAt: project.archivedAt,\n archivedReason: project.archivedReason,\n created: project.created,\n updated,\n tags: project.tags,\n body: project.body,\n progress: rollup.progress,\n needsAttention: rollup.needsAttention,\n assignments: assignments\n .map(toAssignmentSummary)\n .sort((left, right) => compareTimestamps(right.updated, left.updated)),\n resources,\n memories,\n dependencyGraph,\n workspace: project.workspace,\n };\n}\n\n/**\n * Get full assignment detail with plan, scratchpad, handoff, and decision record.\n * GET /api/projects/:slug/assignments/:aslug\n */\nexport async function getAssignmentDetail(\n projectsDir: string,\n projectSlug: string,\n assignmentSlug: string,\n): Promise<AssignmentDetail | null> {\n const assignmentDir = resolve(projectsDir, projectSlug, 'assignments', assignmentSlug);\n const assignmentMdPath = resolve(assignmentDir, 'assignment.md');\n\n if (!(await fileExists(assignmentMdPath))) {\n return null;\n }\n\n const assignmentContent = await readFile(assignmentMdPath, 'utf-8');\n const assignment = parseAssignmentFull(assignmentContent);\n\n let plan: AssignmentDetail['plan'] = null;\n const planPath = resolve(assignmentDir, 'plan.md');\n if (await fileExists(planPath)) {\n const planContent = await readFile(planPath, 'utf-8');\n const parsed = parsePlan(planContent);\n plan = {\n status: parsed.status,\n updated: parsed.updated,\n body: parsed.body,\n };\n }\n\n let scratchpad: AssignmentDetail['scratchpad'] = null;\n const scratchpadPath = resolve(assignmentDir, 'scratchpad.md');\n if (await fileExists(scratchpadPath)) {\n const scratchpadContent = await readFile(scratchpadPath, 'utf-8');\n const parsed = parseScratchpad(scratchpadContent);\n scratchpad = {\n updated: parsed.updated,\n body: parsed.body,\n };\n }\n\n let handoff: AssignmentDetail['handoff'] = null;\n const handoffPath = resolve(assignmentDir, 'handoff.md');\n if (await fileExists(handoffPath)) {\n const handoffContent = await readFile(handoffPath, 'utf-8');\n const parsed = parseHandoff(handoffContent);\n handoff = {\n updated: parsed.updated,\n handoffCount: parsed.handoffCount,\n body: parsed.body,\n };\n }\n\n let decisionRecord: AssignmentDetail['decisionRecord'] = null;\n const decisionRecordPath = resolve(assignmentDir, 'decision-record.md');\n if (await fileExists(decisionRecordPath)) {\n const decisionRecordContent = await readFile(decisionRecordPath, 'utf-8');\n const parsed = parseDecisionRecord(decisionRecordContent);\n decisionRecord = {\n updated: parsed.updated,\n decisionCount: parsed.decisionCount,\n body: parsed.body,\n };\n }\n\n let progress: AssignmentDetail['progress'] = null;\n const progressPath = resolve(assignmentDir, 'progress.md');\n if (await fileExists(progressPath)) {\n const progressContent = await readFile(progressPath, 'utf-8');\n const parsed = parseProgress(progressContent);\n progress = {\n updated: parsed.updated,\n entryCount: parsed.entryCount,\n entries: parsed.entries,\n };\n }\n\n let comments: AssignmentDetail['comments'] = null;\n const commentsPath = resolve(assignmentDir, 'comments.md');\n if (await fileExists(commentsPath)) {\n const commentsContent = await readFile(commentsPath, 'utf-8');\n const parsed = parseComments(commentsContent);\n comments = {\n updated: parsed.updated,\n entryCount: parsed.entryCount,\n entries: parsed.entries,\n };\n }\n\n const detail: AssignmentDetail = {\n id: assignment.id,\n projectSlug,\n slug: assignment.slug || assignmentSlug,\n title: assignment.title,\n status: assignment.status,\n priority: assignment.priority as AssignmentDetail['priority'],\n assignee: assignment.assignee,\n dependsOn: assignment.dependsOn,\n links: assignment.links,\n reverseLinks: [],\n enrichedLinks: [],\n blockedReason: assignment.blockedReason,\n workspace: assignment.workspace,\n externalIds: assignment.externalIds,\n tags: assignment.tags,\n created: assignment.created,\n updated: assignment.updated,\n body: assignment.body,\n plan,\n scratchpad,\n handoff,\n decisionRecord,\n progress,\n comments,\n referencedBy: [],\n availableTransitions: await getAvailableTransitions(\n projectsDir,\n projectSlug,\n assignmentSlug,\n assignment,\n ),\n };\n\n // Compute reverse links and enrich all links\n const selfSlug = `${projectSlug}/${detail.slug}`;\n const projectRecords = await listProjectRecords(projectsDir);\n\n // Find reverse links: assignments across all projects whose links contain this assignment\n const reverseLinks: string[] = [];\n for (const mr of projectRecords) {\n for (const a of mr.assignments) {\n const qualifiedSlug = `${mr.summary.slug}/${a.slug}`;\n if (qualifiedSlug === selfSlug) continue; // skip self\n if (a.links.includes(selfSlug)) {\n reverseLinks.push(qualifiedSlug);\n }\n }\n }\n\n // Filter self-links and malformed links from forward links\n const isValidLinkFormat = (l: string) => {\n const parts = l.split('/');\n return parts.length === 2 && parts[0].length > 0 && parts[1].length > 0;\n };\n const forwardLinks = assignment.links.filter((l) => l !== selfSlug && isValidLinkFormat(l));\n\n // Deduplicate: if a slug is in both forward and reverse, keep in forward only\n const forwardSet = new Set(forwardLinks);\n const dedupedReverseLinks = reverseLinks.filter((l) => !forwardSet.has(l));\n\n detail.links = forwardLinks;\n detail.reverseLinks = dedupedReverseLinks;\n\n // Build enriched links for the frontend\n const allProjectAssignments = new Map<string, { title: string; status: string }>();\n for (const mr of projectRecords) {\n for (const a of mr.assignments) {\n allProjectAssignments.set(`${mr.summary.slug}/${a.slug}`, {\n title: a.title,\n status: a.status,\n });\n }\n }\n\n const enrichedLinks: EnrichedLink[] = [];\n for (const linkSlug of forwardLinks) {\n const [ms, as] = linkSlug.split('/');\n const info = allProjectAssignments.get(linkSlug);\n enrichedLinks.push({\n slug: linkSlug,\n projectSlug: ms,\n assignmentSlug: as,\n title: info?.title ?? linkSlug,\n status: info?.status ?? 'pending',\n isReverse: false,\n });\n }\n for (const linkSlug of dedupedReverseLinks) {\n const [ms, as] = linkSlug.split('/');\n const info = allProjectAssignments.get(linkSlug);\n enrichedLinks.push({\n slug: linkSlug,\n projectSlug: ms,\n assignmentSlug: as,\n title: info?.title ?? linkSlug,\n status: info?.status ?? 'pending',\n isReverse: true,\n });\n }\n\n detail.enrichedLinks = enrichedLinks;\n\n // Populate referencedBy — assignments that mention this one.\n detail.referencedBy = await computeReferencedBy(\n { id: assignment.id, projectSlug, slug: detail.slug },\n projectsDir,\n undefined,\n );\n\n return detail;\n}\n\nconst REFERENCED_BY_LIMIT = 50;\n\ninterface ReferenceTarget {\n id: string;\n projectSlug: string | null;\n slug: string;\n}\n\n/**\n * Scan every *other* assignment's Todos, progress, comments, and handoff bodies\n * for markdown links that resolve to `target`, and return an aggregated per-source\n * count (capped at 50).\n */\nasync function computeReferencedBy(\n target: ReferenceTarget,\n projectsDir: string,\n assignmentsDir: string | undefined,\n): Promise<AssignmentReference[]> {\n const sources: Array<{\n id: string;\n slug: string;\n title: string;\n projectSlug: string | null;\n assignmentDir: string;\n }> = [];\n\n // project-nested\n const projectRecords = await listProjectRecords(projectsDir);\n for (const rec of projectRecords) {\n for (const a of rec.assignments) {\n sources.push({\n id: a.id,\n slug: a.slug,\n title: a.title,\n projectSlug: rec.summary.slug,\n assignmentDir: resolve(rec.projectPath, 'assignments', a.slug),\n });\n }\n }\n // standalone\n const standaloneRecords = await listStandaloneRecords(assignmentsDir);\n for (const sr of standaloneRecords) {\n sources.push({\n id: sr.id,\n slug: sr.record.slug || sr.id,\n title: sr.record.title,\n projectSlug: null,\n assignmentDir: sr.assignmentDir,\n });\n }\n\n const references: AssignmentReference[] = [];\n for (const source of sources) {\n if (source.id === target.id) continue; // skip self\n const mentions = await countMentionsInAssignment(source.assignmentDir, target);\n if (mentions > 0) {\n references.push({\n sourceId: source.id,\n sourceSlug: source.slug,\n sourceTitle: source.title,\n sourceProjectSlug: source.projectSlug,\n mentions,\n });\n }\n if (references.length >= REFERENCED_BY_LIMIT) break;\n }\n\n return references.slice(0, REFERENCED_BY_LIMIT);\n}\n\nasync function countMentionsInAssignment(\n sourceDir: string,\n target: ReferenceTarget,\n): Promise<number> {\n const bodies: string[] = [];\n\n // Todos section (from assignment.md)\n const assignmentMd = resolve(sourceDir, 'assignment.md');\n if (await fileExists(assignmentMd)) {\n const content = await readFile(assignmentMd, 'utf-8');\n const todosMatch = content.match(/^## Todos\\s*$([\\s\\S]*?)(?=^## |$(?![\\r\\n]))/m);\n if (todosMatch) bodies.push(todosMatch[1]);\n }\n\n for (const filename of ['progress.md', 'comments.md', 'handoff.md']) {\n const path = resolve(sourceDir, filename);\n if (await fileExists(path)) {\n try {\n bodies.push(await readFile(path, 'utf-8'));\n } catch {\n // ignore\n }\n }\n }\n\n let total = 0;\n const patterns = buildLinkPatternsForTarget(target);\n for (const body of bodies) {\n for (const pattern of patterns) {\n const matches = body.match(pattern);\n if (matches) total += matches.length;\n }\n }\n return total;\n}\n\nfunction buildLinkPatternsForTarget(target: ReferenceTarget): RegExp[] {\n const patterns: RegExp[] = [];\n // Standalone absolute route\n patterns.push(new RegExp(`/assignments/${escapeRegExpLocal(target.id)}(?:/|\\\\b)`, 'g'));\n if (target.projectSlug) {\n // Project-nested absolute route\n patterns.push(\n new RegExp(\n `/projects/${escapeRegExpLocal(target.projectSlug)}/assignments/${escapeRegExpLocal(target.slug)}(?:/|\\\\b)`,\n 'g',\n ),\n );\n // Project-nested relative route\n patterns.push(\n new RegExp(`\\\\.\\\\./${escapeRegExpLocal(target.slug)}(?:/|\\\\b)`, 'g'),\n );\n }\n return patterns;\n}\n\nfunction escapeRegExpLocal(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Resolve an assignment by UUID (standalone or project-nested) and return its full detail payload.\n * GET /api/assignments/:id\n */\nexport async function getAssignmentDetailById(\n projectsDir: string,\n assignmentsDir: string,\n id: string,\n): Promise<AssignmentDetail | null> {\n const resolved = await resolveAssignmentById(projectsDir, assignmentsDir, id);\n if (!resolved) return null;\n\n if (!resolved.standalone && resolved.projectSlug) {\n // Use the standard detail fetcher, then also scan standalone assignments\n // for backlinks.\n const detail = await getAssignmentDetail(projectsDir, resolved.projectSlug, resolved.assignmentSlug);\n if (!detail) return null;\n detail.referencedBy = await computeReferencedBy(\n { id: detail.id, projectSlug: detail.projectSlug, slug: detail.slug },\n projectsDir,\n assignmentsDir,\n );\n return detail;\n }\n\n // Standalone path — load companion docs directly from the resolved dir.\n const standaloneDetail = await buildStandaloneAssignmentDetail(resolved);\n if (!standaloneDetail) return null;\n standaloneDetail.referencedBy = await computeReferencedBy(\n { id: standaloneDetail.id, projectSlug: null, slug: standaloneDetail.slug },\n projectsDir,\n assignmentsDir,\n );\n return standaloneDetail;\n}\n\nasync function buildStandaloneAssignmentDetail(\n resolved: ResolvedAssignment,\n): Promise<AssignmentDetail | null> {\n const assignmentDir = resolved.assignmentDir;\n const assignmentMdPath = resolve(assignmentDir, 'assignment.md');\n if (!(await fileExists(assignmentMdPath))) return null;\n\n const assignmentContent = await readFile(assignmentMdPath, 'utf-8');\n const assignment = parseAssignmentFull(assignmentContent);\n\n let plan: AssignmentDetail['plan'] = null;\n const planPath = resolve(assignmentDir, 'plan.md');\n if (await fileExists(planPath)) {\n const parsed = parsePlan(await readFile(planPath, 'utf-8'));\n plan = { status: parsed.status, updated: parsed.updated, body: parsed.body };\n }\n\n let scratchpad: AssignmentDetail['scratchpad'] = null;\n const scratchpadPath = resolve(assignmentDir, 'scratchpad.md');\n if (await fileExists(scratchpadPath)) {\n const parsed = parseScratchpad(await readFile(scratchpadPath, 'utf-8'));\n scratchpad = { updated: parsed.updated, body: parsed.body };\n }\n\n let handoff: AssignmentDetail['handoff'] = null;\n const handoffPath = resolve(assignmentDir, 'handoff.md');\n if (await fileExists(handoffPath)) {\n const parsed = parseHandoff(await readFile(handoffPath, 'utf-8'));\n handoff = { updated: parsed.updated, handoffCount: parsed.handoffCount, body: parsed.body };\n }\n\n let decisionRecord: AssignmentDetail['decisionRecord'] = null;\n const decisionRecordPath = resolve(assignmentDir, 'decision-record.md');\n if (await fileExists(decisionRecordPath)) {\n const parsed = parseDecisionRecord(await readFile(decisionRecordPath, 'utf-8'));\n decisionRecord = { updated: parsed.updated, decisionCount: parsed.decisionCount, body: parsed.body };\n }\n\n let progress: AssignmentDetail['progress'] = null;\n const progressPath = resolve(assignmentDir, 'progress.md');\n if (await fileExists(progressPath)) {\n const parsed = parseProgress(await readFile(progressPath, 'utf-8'));\n progress = { updated: parsed.updated, entryCount: parsed.entryCount, entries: parsed.entries };\n }\n\n let comments: AssignmentDetail['comments'] = null;\n const commentsPath = resolve(assignmentDir, 'comments.md');\n if (await fileExists(commentsPath)) {\n const parsed = parseComments(await readFile(commentsPath, 'utf-8'));\n comments = { updated: parsed.updated, entryCount: parsed.entryCount, entries: parsed.entries };\n }\n\n const detail: AssignmentDetail = {\n id: assignment.id,\n projectSlug: null,\n slug: assignment.slug || resolved.id,\n title: assignment.title,\n status: assignment.status,\n priority: assignment.priority as AssignmentDetail['priority'],\n assignee: assignment.assignee,\n dependsOn: [], // standalone cannot declare dependencies\n links: [],\n reverseLinks: [],\n enrichedLinks: [],\n blockedReason: assignment.blockedReason,\n workspace: assignment.workspace,\n externalIds: assignment.externalIds,\n tags: assignment.tags,\n created: assignment.created,\n updated: assignment.updated,\n body: assignment.body,\n plan,\n scratchpad,\n handoff,\n decisionRecord,\n progress,\n comments,\n referencedBy: [],\n availableTransitions: await getStandaloneAvailableTransitions(assignment),\n };\n\n return detail;\n}\n\n// Guard so legacy-file renames run at most once per `projectsDir` per process\n// lifetime. Keyed by absolute path to tolerate test suites that open multiple\n// sandboxes in the same process.\nconst migratedProjectsDirs = new Set<string>();\n\nasync function listProjectRecords(projectsDir: string): Promise<ProjectRecord[]> {\n if (!(await fileExists(projectsDir))) {\n return [];\n }\n\n if (!migratedProjectsDirs.has(projectsDir)) {\n migratedProjectsDirs.add(projectsDir);\n await migrateLegacyProjectFiles(projectsDir);\n }\n\n const entries = await readdir(projectsDir, { withFileTypes: true });\n const projectDirs = entries.filter((entry) => entry.isDirectory() && !entry.name.startsWith('.'));\n const records: ProjectRecord[] = [];\n\n for (const entry of projectDirs) {\n const projectPath = resolve(projectsDir, entry.name);\n const projectMdPath = resolve(projectPath, 'project.md');\n\n if (!(await fileExists(projectMdPath))) {\n continue;\n }\n\n const projectContent = await readFile(projectMdPath, 'utf-8');\n const project = parseProject(projectContent);\n const assignments = await listAssignmentRecords(projectPath);\n const rollup = await buildProjectRollup(projectPath, project, assignments);\n const updated = getProjectActivityTimestamp(project.updated, assignments);\n\n records.push({\n projectPath,\n project,\n assignments,\n dependencyGraph: await loadDependencyGraph(projectPath, assignments),\n summary: {\n slug: project.slug || entry.name,\n title: project.title,\n status: rollup.status,\n statusOverride: project.statusOverride,\n archived: project.archived,\n archivedAt: project.archivedAt,\n archivedReason: project.archivedReason,\n created: project.created,\n updated,\n tags: project.tags,\n progress: rollup.progress,\n needsAttention: rollup.needsAttention,\n workspace: project.workspace,\n },\n });\n }\n\n records.sort((left, right) => compareTimestamps(right.summary.updated, left.summary.updated));\n return records;\n}\n\nasync function listAssignmentRecords(projectPath: string): Promise<AssignmentRecord[]> {\n const assignmentsDir = resolve(projectPath, 'assignments');\n if (!(await fileExists(assignmentsDir))) {\n return [];\n }\n\n const entries = await readdir(assignmentsDir, { withFileTypes: true });\n const records: AssignmentRecord[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n const assignmentMd = resolve(assignmentsDir, entry.name, 'assignment.md');\n if (!(await fileExists(assignmentMd))) {\n continue;\n }\n\n const content = await readFile(assignmentMd, 'utf-8');\n records.push(parseAssignmentFull(content));\n }\n\n records.sort((left, right) => compareTimestamps(right.updated, left.updated));\n return records;\n}\n\nasync function listResources(projectPath: string): Promise<ResourceSummary[]> {\n const resourcesDir = resolve(projectPath, 'resources');\n if (!(await fileExists(resourcesDir))) {\n return [];\n }\n\n const entries = await readdir(resourcesDir, { withFileTypes: true });\n const results: ResourceSummary[] = [];\n\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith('.md') || entry.name.startsWith('_')) {\n continue;\n }\n\n const filePath = resolve(resourcesDir, entry.name);\n const content = await readFile(filePath, 'utf-8');\n const parsed = parseResource(content);\n results.push({\n name: parsed.name,\n slug: entry.name.replace(/\\.md$/, ''),\n category: parsed.category,\n source: parsed.source,\n relatedAssignments: parsed.relatedAssignments,\n updated: parsed.updated,\n });\n }\n\n results.sort((left, right) => compareTimestamps(right.updated, left.updated));\n return results;\n}\n\nasync function listMemories(projectPath: string): Promise<MemorySummary[]> {\n const memoriesDir = resolve(projectPath, 'memories');\n if (!(await fileExists(memoriesDir))) {\n return [];\n }\n\n const entries = await readdir(memoriesDir, { withFileTypes: true });\n const results: MemorySummary[] = [];\n\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith('.md') || entry.name.startsWith('_')) {\n continue;\n }\n\n const filePath = resolve(memoriesDir, entry.name);\n const content = await readFile(filePath, 'utf-8');\n const parsed = parseMemory(content);\n results.push({\n name: parsed.name,\n slug: entry.name.replace(/\\.md$/, ''),\n source: parsed.source,\n scope: parsed.scope,\n sourceAssignment: parsed.sourceAssignment,\n updated: parsed.updated,\n });\n }\n\n results.sort((left, right) => compareTimestamps(right.updated, left.updated));\n return results;\n}\n\nasync function loadDependencyGraph(\n projectPath: string,\n assignments: AssignmentRecord[],\n): Promise<string | null> {\n const statusPath = resolve(projectPath, '_status.md');\n if (await fileExists(statusPath)) {\n const statusContent = await readFile(statusPath, 'utf-8');\n const parsed = parseStatus(statusContent);\n const derivedGraph = extractMermaidGraph(parsed.body);\n if (derivedGraph) {\n return derivedGraph;\n }\n }\n\n return buildDependencyGraph(assignments);\n}\n\nasync function buildProjectRollup(\n projectPath: string,\n project: ReturnType<typeof parseProject>,\n assignments: AssignmentRecord[],\n): Promise<{\n progress: ProgressCounts;\n needsAttention: NeedsAttention;\n status: string;\n}> {\n const progress: ProgressCounts = { total: assignments.length };\n\n let openQuestions = 0;\n for (const assignment of assignments) {\n const s = assignment.status;\n progress[s] = (progress[s] ?? 0) + 1;\n openQuestions += await countOpenQuestions(projectPath, assignment.slug);\n }\n\n const needsAttention: NeedsAttention = {\n blockedCount: progress['blocked'] ?? 0,\n failedCount: progress['failed'] ?? 0,\n openQuestions,\n };\n\n let status = 'pending';\n if (project.statusOverride) {\n status = project.statusOverride;\n } else if (project.archived) {\n status = 'archived';\n } else if (progress.total > 0 && (progress['completed'] ?? 0) === progress.total) {\n status = 'completed';\n } else if ((progress['in_progress'] ?? 0) > 0 || (progress['review'] ?? 0) > 0) {\n status = 'active';\n } else if ((progress['failed'] ?? 0) > 0) {\n status = 'failed';\n } else if ((progress['blocked'] ?? 0) > 0) {\n status = 'blocked';\n } else if (progress.total === 0 || (progress['pending'] ?? 0) === progress.total) {\n status = 'pending';\n } else {\n status = 'active';\n }\n\n return { progress, needsAttention, status };\n}\n\nfunction toAssignmentSummary(assignment: AssignmentRecord): AssignmentSummary {\n return {\n id: assignment.id,\n slug: assignment.slug,\n title: assignment.title,\n status: assignment.status,\n priority: assignment.priority as AssignmentSummary['priority'],\n assignee: assignment.assignee,\n dependsOn: assignment.dependsOn,\n links: assignment.links,\n updated: assignment.updated,\n };\n}\n\nasync function toAssignmentBoardItem(\n projectsDir: string,\n projectRecord: ProjectRecord,\n assignment: AssignmentRecord,\n): Promise<AssignmentBoardItem> {\n return {\n ...toAssignmentSummary(assignment),\n projectSlug: projectRecord.summary.slug,\n projectTitle: projectRecord.summary.title,\n blockedReason: assignment.blockedReason,\n projectWorkspace: projectRecord.project.workspace,\n availableTransitions: await getAvailableTransitions(\n projectsDir,\n projectRecord.summary.slug,\n assignment.slug,\n assignment,\n ),\n };\n}\n\nconst DEFAULT_GRAPH_COLORS: Record<string, string> = {\n completed: 'fill:#4ea84f,stroke:#1f6b29,color:#ffffff',\n in_progress: 'fill:#1e6fd9,stroke:#0f3f8f,color:#ffffff',\n pending: 'fill:#c0ccd9,stroke:#738399,color:#163047',\n blocked: 'fill:#db5a3f,stroke:#8d2815,color:#ffffff',\n failed: 'fill:#9f2d2d,stroke:#651616,color:#ffffff',\n review: 'fill:#c6911e,stroke:#7a5a10,color:#ffffff',\n};\n\nfunction buildDependencyGraph(assignments: AssignmentRecord[]): string | null {\n const edges: string[] = [];\n const usedStatuses = new Set<string>();\n\n for (const assignment of assignments) {\n for (const dependency of assignment.dependsOn) {\n const depStatus = findAssignmentStatus(assignments, dependency);\n usedStatuses.add(depStatus);\n usedStatuses.add(assignment.status);\n edges.push(\n ` ${dependency}:::${depStatus} --> ${assignment.slug}:::${assignment.status}`,\n );\n }\n }\n\n if (edges.length === 0) {\n return null;\n }\n\n const classDefs: string[] = [];\n for (const status of usedStatuses) {\n const colors = DEFAULT_GRAPH_COLORS[status] ?? 'fill:#94a3b8,stroke:#64748b,color:#ffffff';\n classDefs.push(` classDef ${status} ${colors}`);\n }\n\n return ['graph TD', ...edges, ...classDefs].join('\\n');\n}\n\nfunction findAssignmentStatus(assignments: AssignmentRecord[], slug: string): string {\n return assignments.find((assignment) => assignment.slug === slug)?.status ?? 'pending';\n}\n\nasync function getAvailableTransitions(\n projectsDir: string,\n projectSlug: string,\n assignmentSlug: string,\n assignment: AssignmentRecord,\n): Promise<AssignmentTransitionAction[]> {\n const config = await getStatusConfig();\n const transitionDefs = getTransitionDefinitions(config);\n const actions: AssignmentTransitionAction[] = [];\n const projectPath = resolve(projectsDir, projectSlug);\n\n for (const definition of transitionDefs) {\n let warning: string | null = null;\n\n if (definition.command === 'start' && !assignment.assignee) {\n warning = 'No assignee set — consider assigning before starting.';\n }\n\n if (definition.command === 'start' && assignment.dependsOn.length > 0) {\n const unmetDependencies = await getUnmetDependencies(projectPath, assignment.dependsOn, config.terminalStatuses);\n if (unmetDependencies.length > 0) {\n warning = `Unmet dependencies: ${unmetDependencies.join(', ')}.`;\n }\n }\n\n const target = getTargetStatus(assignment.status, definition.command, config.transitionTable);\n\n actions.push({\n command: definition.command,\n label: definition.label,\n description: definition.description,\n targetStatus: target ?? definition.command,\n disabled: false,\n disabledReason: null,\n warning,\n requiresReason: definition.requiresReason,\n });\n }\n\n return actions;\n}\n\nasync function getUnmetDependencies(projectPath: string, dependsOn: string[], terminalStatuses?: ReadonlySet<string>): Promise<string[]> {\n const terminals = terminalStatuses ?? new Set(['completed']);\n const unmet: string[] = [];\n\n for (const dependency of dependsOn) {\n const dependencyPath = resolve(projectPath, 'assignments', dependency, 'assignment.md');\n if (!(await fileExists(dependencyPath))) {\n unmet.push(`${dependency} (missing)`);\n continue;\n }\n\n const content = await readFile(dependencyPath, 'utf-8');\n const parsed = parseAssignmentFull(content);\n if (!terminals.has(parsed.status)) {\n unmet.push(`${dependency} (${parsed.status})`);\n }\n }\n\n return unmet;\n}\n\nfunction buildAttentionItems(\n projectRecords: ProjectRecord[],\n standaloneRecords: StandaloneRecord[] = [],\n): AttentionItem[] {\n const items: AttentionItem[] = [];\n\n for (const record of projectRecords) {\n for (const assignment of record.assignments) {\n const stale = isStale(assignment.updated);\n const base = {\n projectSlug: record.summary.slug,\n projectTitle: record.summary.title,\n assignmentSlug: assignment.slug,\n assignmentTitle: assignment.title,\n status: assignment.status,\n updated: assignment.updated,\n href: `/projects/${record.summary.slug}/assignments/${assignment.slug}`,\n blockedReason: assignment.blockedReason,\n stale,\n };\n\n if (assignment.status === 'failed') {\n items.push({\n id: `${record.summary.slug}:${assignment.slug}:failed`,\n severity: 'critical',\n reason: 'Marked failed and needs a recovery decision.',\n ...base,\n });\n }\n\n if (assignment.status === 'blocked') {\n items.push({\n id: `${record.summary.slug}:${assignment.slug}:blocked`,\n severity: 'high',\n reason: assignment.blockedReason || 'Blocked and waiting for intervention.',\n ...base,\n });\n }\n\n if (assignment.status === 'review') {\n items.push({\n id: `${record.summary.slug}:${assignment.slug}:review`,\n severity: 'medium',\n reason: 'Ready for review.',\n ...base,\n });\n }\n\n if (stale) {\n items.push({\n id: `${record.summary.slug}:${assignment.slug}:stale`,\n severity: 'low',\n reason: 'No source updates have been recorded in the last 7 days.',\n ...base,\n });\n }\n }\n }\n\n for (const sr of standaloneRecords) {\n const assignment = sr.record;\n const stale = isStale(assignment.updated);\n const base = {\n projectSlug: null,\n projectTitle: null,\n assignmentSlug: assignment.slug || sr.id,\n assignmentTitle: assignment.title,\n status: assignment.status,\n updated: assignment.updated,\n href: `/assignments/${sr.id}`,\n blockedReason: assignment.blockedReason,\n stale,\n };\n\n if (assignment.status === 'failed') {\n items.push({ id: `standalone:${sr.id}:failed`, severity: 'critical', reason: 'Marked failed and needs a recovery decision.', ...base });\n }\n if (assignment.status === 'blocked') {\n items.push({ id: `standalone:${sr.id}:blocked`, severity: 'high', reason: assignment.blockedReason || 'Blocked and waiting for intervention.', ...base });\n }\n if (assignment.status === 'review') {\n items.push({ id: `standalone:${sr.id}:review`, severity: 'medium', reason: 'Ready for review.', ...base });\n }\n if (stale) {\n items.push({ id: `standalone:${sr.id}:stale`, severity: 'low', reason: 'No source updates have been recorded in the last 7 days.', ...base });\n }\n }\n\n return items.sort(compareAttentionItems);\n}\n\nfunction buildRecentActivity(\n projectRecords: ProjectRecord[],\n standaloneRecords: StandaloneRecord[] = [],\n): RecentActivityItem[] {\n const activity: RecentActivityItem[] = [];\n\n for (const record of projectRecords) {\n activity.push({\n id: `project:${record.summary.slug}`,\n type: 'project',\n title: record.summary.title,\n updated: record.summary.updated,\n href: `/projects/${record.summary.slug}`,\n projectSlug: record.summary.slug,\n projectTitle: record.summary.title,\n assignmentSlug: null,\n summary: `Project status is ${record.summary.status}.`,\n });\n\n for (const assignment of record.assignments) {\n activity.push({\n id: `assignment:${record.summary.slug}:${assignment.slug}`,\n type: 'assignment',\n title: assignment.title,\n updated: assignment.updated,\n href: `/projects/${record.summary.slug}/assignments/${assignment.slug}`,\n projectSlug: record.summary.slug,\n projectTitle: record.summary.title,\n assignmentSlug: assignment.slug,\n summary: `Assignment is ${assignment.status} with ${assignment.priority} priority.`,\n });\n }\n }\n\n for (const sr of standaloneRecords) {\n const assignment = sr.record;\n activity.push({\n id: `standalone-assignment:${sr.id}`,\n type: 'assignment',\n title: assignment.title,\n updated: assignment.updated,\n href: `/assignments/${sr.id}`,\n projectSlug: null,\n projectTitle: null,\n assignmentSlug: assignment.slug || sr.id,\n summary: `Standalone assignment is ${assignment.status} with ${assignment.priority} priority.`,\n });\n }\n\n activity.sort((left, right) => compareTimestamps(right.updated, left.updated));\n return activity;\n}\n\nfunction compareAttentionItems(left: AttentionItem, right: AttentionItem): number {\n const severityRank = { critical: 0, high: 1, medium: 2, low: 3 };\n const severityDifference = severityRank[left.severity] - severityRank[right.severity];\n if (severityDifference !== 0) {\n return severityDifference;\n }\n return compareTimestamps(right.updated, left.updated);\n}\n\nfunction compareTimestamps(left: string, right: string): number {\n return parseTimestamp(left) - parseTimestamp(right);\n}\n\nfunction parseTimestamp(timestamp: string): number {\n const parsed = Date.parse(timestamp);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction isStale(updated: string): boolean {\n const timestamp = parseTimestamp(updated);\n if (timestamp === 0) {\n return false;\n }\n return Date.now() - timestamp > STALE_ASSIGNMENT_MS;\n}\n\nfunction countPendingAnswers(body: string): number {\n const matches = body.match(/^\\*\\*A:\\*\\*\\s+pending\\s*$/gim);\n return matches ? matches.length : 0;\n}\n\nasync function countOpenQuestions(\n projectPath: string,\n assignmentSlug: string,\n): Promise<number> {\n const commentsPath = resolve(\n projectPath,\n 'assignments',\n assignmentSlug,\n 'comments.md',\n );\n if (!(await fileExists(commentsPath))) {\n return 0;\n }\n try {\n const content = await readFile(commentsPath, 'utf-8');\n const parsed = parseComments(content);\n return parsed.entries.filter(\n (e) => e.type === 'question' && e.resolved !== true,\n ).length;\n } catch {\n return 0;\n }\n}\n\nfunction getProjectActivityTimestamp(projectUpdated: string, assignments: AssignmentRecord[]): string {\n let latest = projectUpdated;\n for (const assignment of assignments) {\n if (compareTimestamps(assignment.updated, latest) > 0) {\n latest = assignment.updated;\n }\n }\n return latest;\n}\n\nfunction getDocumentPath(\n projectsDir: string,\n documentType: EditableDocumentResponse['documentType'],\n projectSlug: string,\n assignmentSlug?: string,\n): string | null {\n switch (documentType) {\n case 'project':\n return resolve(projectsDir, projectSlug, 'project.md');\n case 'assignment':\n return assignmentSlug\n ? resolve(projectsDir, projectSlug, 'assignments', assignmentSlug, 'assignment.md')\n : null;\n case 'plan':\n return assignmentSlug\n ? resolve(projectsDir, projectSlug, 'assignments', assignmentSlug, 'plan.md')\n : null;\n case 'scratchpad':\n return assignmentSlug\n ? resolve(projectsDir, projectSlug, 'assignments', assignmentSlug, 'scratchpad.md')\n : null;\n case 'handoff':\n return assignmentSlug\n ? resolve(projectsDir, projectSlug, 'assignments', assignmentSlug, 'handoff.md')\n : null;\n case 'decision-record':\n return assignmentSlug\n ? resolve(projectsDir, projectSlug, 'assignments', assignmentSlug, 'decision-record.md')\n : null;\n default:\n return null;\n }\n}\n\nfunction getEditableDocumentTitle(\n documentType: EditableDocumentResponse['documentType'],\n projectSlug: string,\n assignmentSlug?: string,\n): string {\n switch (documentType) {\n case 'project':\n return `Edit Project: ${projectSlug}`;\n case 'assignment':\n return `Edit Assignment: ${assignmentSlug || 'assignment'}`;\n case 'plan':\n return `Edit Plan: ${assignmentSlug || 'assignment'}`;\n case 'scratchpad':\n return `Edit Scratchpad: ${assignmentSlug || 'assignment'}`;\n case 'handoff':\n return `Append Handoff: ${assignmentSlug || 'assignment'}`;\n case 'decision-record':\n return `Append Decision: ${assignmentSlug || 'assignment'}`;\n case 'playbook':\n return `Edit Playbook: ${projectSlug}`;\n default:\n return projectSlug;\n }\n}\n\n// --- Playbook API ---\n\nexport async function listPlaybooks(playbooksDir: string): Promise<PlaybookSummary[]> {\n if (!(await fileExists(playbooksDir))) return [];\n\n const entries = await readdir(playbooksDir, { withFileTypes: true });\n const playbooks: PlaybookSummary[] = [];\n\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith('.md') || entry.name.startsWith('_') || entry.name === 'manifest.md') continue;\n\n const filePath = resolve(playbooksDir, entry.name);\n const raw = await readFile(filePath, 'utf-8');\n const parsed = parsePlaybook(raw);\n\n const slug = parsed.slug || entry.name.replace(/\\.md$/, '');\n playbooks.push({\n slug,\n name: parsed.name || slug,\n description: parsed.description,\n whenToUse: parsed.whenToUse,\n tags: parsed.tags,\n created: parsed.created,\n updated: parsed.updated,\n });\n }\n\n return playbooks.sort((a, b) => (b.updated || b.created).localeCompare(a.updated || a.created));\n}\n\nexport async function getPlaybookDetail(\n playbooksDir: string,\n slug: string,\n): Promise<PlaybookDetail | null> {\n const filePath = resolve(playbooksDir, `${slug}.md`);\n if (!(await fileExists(filePath))) return null;\n\n const raw = await readFile(filePath, 'utf-8');\n const parsed = parsePlaybook(raw);\n\n return {\n slug: parsed.slug || slug,\n name: parsed.name || slug,\n description: parsed.description,\n whenToUse: parsed.whenToUse,\n tags: parsed.tags,\n created: parsed.created,\n updated: parsed.updated,\n body: parsed.body,\n };\n}\n","import { randomBytes } from 'node:crypto';\nimport { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { extractFrontmatter, getField } from '../dashboard/parser.js';\nimport { ensureDir, fileExists, writeFileForce } from '../utils/fs.js';\nimport type {\n TodoItem,\n TodoChecklist,\n TodoStatus,\n ArchiveInterval,\n LogEntry,\n TodoLog,\n} from './types.js';\n\n// --- Short ID ---\n\nexport function generateShortId(): string {\n return randomBytes(2).toString('hex');\n}\n\nexport function generateUniqueId(existingIds: Set<string>): string {\n let id = generateShortId();\n let attempts = 0;\n while (existingIds.has(id) && attempts < 100) {\n id = generateShortId();\n attempts++;\n }\n return id;\n}\n\n// --- Checklist parsing ---\n\nconst ITEM_REGEX = /^- \\[([ x!]|>[^\\]]*)\\]\\s+(.+)$/;\nconst ID_REGEX = /\\[t:([a-f0-9]{4})\\]/;\nconst TAG_REGEX = /#([a-zA-Z0-9_-]+)/g;\n\nfunction parseStatus(marker: string): { status: TodoStatus; session: string | null } {\n if (marker === ' ') return { status: 'open', session: null };\n if (marker === 'x') return { status: 'completed', session: null };\n if (marker === '!') return { status: 'blocked', session: null };\n if (marker.startsWith('>:')) return { status: 'in_progress', session: marker.slice(2) };\n if (marker === '>') return { status: 'in_progress', session: null };\n return { status: 'open', session: null };\n}\n\nfunction sanitizeSession(session: string): string {\n // Strip characters that would break the markdown checkbox syntax\n return session.replace(/[\\[\\]]/g, '');\n}\n\nfunction statusToMarker(item: TodoItem): string {\n switch (item.status) {\n case 'open':\n return ' ';\n case 'completed':\n return 'x';\n case 'blocked':\n return '!';\n case 'in_progress':\n return item.session ? `>:${sanitizeSession(item.session)}` : '>';\n }\n}\n\nexport function parseChecklistItem(line: string): TodoItem | null {\n const match = line.match(ITEM_REGEX);\n if (!match) return null;\n\n const marker = match[1];\n const rest = match[2];\n\n const { status, session } = parseStatus(marker);\n\n const idMatch = rest.match(ID_REGEX);\n const id = idMatch ? idMatch[1] : '';\n\n const tags: string[] = [];\n let tagMatch;\n const tagRegex = new RegExp(TAG_REGEX.source, 'g');\n while ((tagMatch = tagRegex.exec(rest)) !== null) {\n tags.push(tagMatch[1]);\n }\n\n // Description is everything before the first #tag or [t:...], trimmed\n let description = rest;\n const firstTagIdx = rest.search(/#[a-zA-Z0-9_-]/);\n const firstIdIdx = rest.search(/\\[t:[a-f0-9]{4}\\]/);\n const cutPoints = [firstTagIdx, firstIdIdx].filter((i) => i >= 0);\n if (cutPoints.length > 0) {\n description = rest.slice(0, Math.min(...cutPoints)).trim();\n }\n\n return { id, description, status, tags, session };\n}\n\nexport function serializeChecklistItem(item: TodoItem): string {\n const marker = statusToMarker(item);\n const tagStr = item.tags.map((t) => `#${t}`).join(' ');\n const parts = [`- [${marker}] ${item.description}`];\n if (tagStr) parts.push(tagStr);\n parts.push(`[t:${item.id}]`);\n return parts.join(' ');\n}\n\nexport function parseChecklist(content: string): TodoChecklist {\n const [fm, body] = extractFrontmatter(content);\n const workspace = getField(fm, 'workspace') || '_global';\n const archiveIntervalRaw = getField(fm, 'archiveInterval') || 'weekly';\n const archiveInterval = (['daily', 'weekly', 'monthly', 'never'].includes(archiveIntervalRaw)\n ? archiveIntervalRaw\n : 'weekly') as ArchiveInterval;\n\n const items: TodoItem[] = [];\n for (const line of body.split('\\n')) {\n const item = parseChecklistItem(line);\n if (item) items.push(item);\n }\n\n return { workspace, archiveInterval, items };\n}\n\nexport function serializeChecklist(checklist: TodoChecklist): string {\n const fm = [\n '---',\n `workspace: ${checklist.workspace}`,\n `archiveInterval: ${checklist.archiveInterval}`,\n '---',\n ].join('\\n');\n\n const header = '# Quick Todos';\n const items = checklist.items.map(serializeChecklistItem).join('\\n');\n\n return `${fm}\\n\\n${header}\\n\\n${items}\\n`;\n}\n\n// --- Log parsing ---\n\nexport function parseLog(content: string): TodoLog {\n const [fm, body] = extractFrontmatter(content);\n const workspace = getField(fm, 'workspace') || '_global';\n\n const entries: LogEntry[] = [];\n const sections = body.split(/^### /m).filter((s) => s.match(/^\\d{4}-/));\n\n for (const section of sections) {\n const lines = section.split('\\n');\n const heading = lines[0]?.trim() || '';\n\n // Heading format: 2026-04-07T14:30:00Z — t:a3f1, t:b7c2\n const headingMatch = heading.match(/^(\\S+)\\s*—?\\s*(.*)/);\n if (!headingMatch) continue;\n\n const timestamp = headingMatch[1];\n const idsPart = headingMatch[2] || '';\n const itemIds = [...idsPart.matchAll(/t:([a-f0-9]{4})/g)].map((m) => m[1]);\n\n const entry: LogEntry = {\n timestamp,\n itemIds,\n items: '',\n session: null,\n branch: null,\n summary: '',\n blockers: null,\n status: null,\n };\n\n for (const line of lines.slice(1)) {\n const fieldMatch = line.match(/^\\*\\*(\\w+):\\*\\*\\s*(.*)/);\n if (!fieldMatch) continue;\n const key = fieldMatch[1].toLowerCase();\n const value = fieldMatch[2].trim();\n switch (key) {\n case 'items':\n entry.items = value;\n break;\n case 'session':\n entry.session = value;\n break;\n case 'branch':\n entry.branch = value;\n break;\n case 'summary':\n entry.summary = value;\n break;\n case 'blockers':\n entry.blockers = value;\n break;\n case 'status':\n entry.status = value;\n break;\n }\n }\n\n entries.push(entry);\n }\n\n return { workspace, entries };\n}\n\nexport function serializeLogEntry(entry: LogEntry): string {\n const idStr = entry.itemIds.map((id) => `t:${id}`).join(', ');\n const lines = [`### ${entry.timestamp} — ${idStr}`];\n if (entry.items) lines.push(`**Items:** ${entry.items}`);\n if (entry.session) lines.push(`**Session:** ${entry.session}`);\n if (entry.branch) lines.push(`**Branch:** ${entry.branch}`);\n if (entry.summary) lines.push(`**Summary:** ${entry.summary}`);\n if (entry.blockers) lines.push(`**Blockers:** ${entry.blockers}`);\n if (entry.status) lines.push(`**Status:** ${entry.status}`);\n return lines.join('\\n');\n}\n\n// --- File I/O ---\n\nexport function checklistPath(todosDir: string, workspace: string): string {\n return resolve(todosDir, `${workspace}.md`);\n}\n\nexport function logPath(todosDir: string, workspace: string): string {\n return resolve(todosDir, `${workspace}-log.md`);\n}\n\nexport function archivePath(\n todosDir: string,\n workspace: string,\n interval: ArchiveInterval,\n now: Date = new Date(),\n): string {\n const year = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const day = String(now.getDate()).padStart(2, '0');\n\n let suffix: string;\n switch (interval) {\n case 'daily':\n suffix = `${year}-${month}-${day}`;\n break;\n case 'weekly': {\n // ISO week number\n const jan1 = new Date(year, 0, 1);\n const days = Math.floor((now.getTime() - jan1.getTime()) / 86400000);\n const week = String(Math.ceil((days + jan1.getDay() + 1) / 7)).padStart(2, '0');\n suffix = `${year}-W${week}`;\n break;\n }\n case 'monthly':\n suffix = `${year}-${month}`;\n break;\n default:\n suffix = `${year}-${month}-${day}`;\n }\n\n return resolve(todosDir, 'archive', `${workspace}-${suffix}.md`);\n}\n\nexport async function readChecklist(todosDir: string, workspace: string): Promise<TodoChecklist> {\n const path = checklistPath(todosDir, workspace);\n if (!(await fileExists(path))) {\n return { workspace, archiveInterval: 'weekly', items: [] };\n }\n const content = await readFile(path, 'utf-8');\n return parseChecklist(content);\n}\n\nexport async function writeChecklist(todosDir: string, checklist: TodoChecklist): Promise<void> {\n await ensureDir(todosDir);\n const path = checklistPath(todosDir, checklist.workspace);\n await writeFileForce(path, serializeChecklist(checklist));\n}\n\nexport async function readLog(todosDir: string, workspace: string): Promise<TodoLog> {\n const path = logPath(todosDir, workspace);\n if (!(await fileExists(path))) {\n return { workspace, entries: [] };\n }\n const content = await readFile(path, 'utf-8');\n return parseLog(content);\n}\n\nexport async function appendLogEntry(\n todosDir: string,\n workspace: string,\n entry: LogEntry,\n): Promise<void> {\n await ensureDir(todosDir);\n const path = logPath(todosDir, workspace);\n let content: string;\n if (await fileExists(path)) {\n content = await readFile(path, 'utf-8');\n content = content.trimEnd() + '\\n\\n' + serializeLogEntry(entry) + '\\n';\n } else {\n const fm = `---\\nworkspace: ${workspace}\\n---\\n\\n# Todo Log\\n\\n`;\n content = fm + serializeLogEntry(entry) + '\\n';\n }\n await writeFileForce(path, content);\n}\n\nexport function computeCounts(items: TodoItem[]) {\n const counts = { open: 0, in_progress: 0, completed: 0, blocked: 0, total: items.length };\n for (const item of items) {\n counts[item.status]++;\n }\n return counts;\n}\n","import { useState, useEffect } from 'react';\nimport { listProjects, getProjectDetail } from '../../dashboard/api.js';\nimport type { ProjectSummary, ProjectDetail } from '../../dashboard/types.js';\nimport type { TreeNode } from '../types.js';\n\nexport function useProjects(projectsDir: string) {\n const [nodes, setNodes] = useState<TreeNode[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n async function load() {\n try {\n const projects = await listProjects(projectsDir);\n const details = await Promise.all(\n projects.map((m) => getProjectDetail(projectsDir, m.slug)),\n );\n\n if (cancelled) return;\n\n const tree: TreeNode[] = projects.map((m, i) => {\n const detail = details[i];\n const children: TreeNode[] = (detail?.assignments ?? []).map((a) => ({\n id: `a:${m.slug}:${a.slug}`,\n kind: 'assignment' as const,\n label: a.title,\n slug: a.slug,\n projectSlug: m.slug,\n status: a.status,\n priority: a.priority,\n assignee: a.assignee,\n }));\n\n return {\n id: `m:${m.slug}`,\n kind: 'project' as const,\n label: m.title,\n slug: m.slug,\n projectSlug: m.slug,\n status: m.status,\n progress: {\n completed: m.progress.completed,\n total: m.progress.total,\n },\n children,\n };\n });\n\n setNodes(tree);\n setLoading(false);\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : String(err));\n setLoading(false);\n }\n }\n }\n\n load();\n return () => {\n cancelled = true;\n };\n }, [projectsDir]);\n\n return { nodes, loading, error };\n}\n","import { useState, useMemo, useCallback } from 'react';\nimport type { TreeNode, FlatNode } from '../types.js';\n\nexport function useTreeState(nodes: TreeNode[], filteredIds: Set<string> | null) {\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\n const [cursor, setCursor] = useState(0);\n\n const flatList = useMemo(() => {\n const result: FlatNode[] = [];\n for (const project of nodes) {\n if (filteredIds && !filteredIds.has(project.id)) {\n const hasMatchingChild = project.children?.some((c) => filteredIds.has(c.id));\n if (!hasMatchingChild) continue;\n }\n\n const isExpanded = expanded.has(project.id) ||\n (filteredIds !== null && project.children?.some((c) => filteredIds.has(c.id)));\n\n result.push({\n ...project,\n depth: 0,\n expanded: isExpanded,\n hasChildren: (project.children?.length ?? 0) > 0,\n });\n\n if (isExpanded && project.children) {\n for (const child of project.children) {\n if (filteredIds && !filteredIds.has(child.id) && !filteredIds.has(project.id)) continue;\n result.push({\n ...child,\n depth: 1,\n expanded: false,\n hasChildren: false,\n });\n }\n }\n }\n return result;\n }, [nodes, expanded, filteredIds]);\n\n const moveUp = useCallback(() => {\n setCursor((c) => Math.max(0, c - 1));\n }, []);\n\n const moveDown = useCallback(() => {\n setCursor((c) => Math.min(flatList.length - 1, c + 1));\n }, [flatList.length]);\n\n const toggle = useCallback(\n (nodeId: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(nodeId)) {\n next.delete(nodeId);\n } else {\n next.add(nodeId);\n }\n return next;\n });\n },\n [],\n );\n\n const expandNode = useCallback((nodeId: string) => {\n setExpanded((prev) => {\n if (prev.has(nodeId)) return prev;\n const next = new Set(prev);\n next.add(nodeId);\n return next;\n });\n }, []);\n\n const collapseNode = useCallback((nodeId: string) => {\n setExpanded((prev) => {\n if (!prev.has(nodeId)) return prev;\n const next = new Set(prev);\n next.delete(nodeId);\n return next;\n });\n }, []);\n\n const currentNode = flatList[cursor] ?? null;\n\n return {\n flatList,\n cursor,\n setCursor,\n moveUp,\n moveDown,\n toggle,\n expandNode,\n collapseNode,\n currentNode,\n };\n}\n","import { useState, useMemo } from 'react';\nimport Fuse from 'fuse.js';\nimport type { TreeNode } from '../types.js';\n\ninterface SearchableItem {\n id: string;\n label: string;\n slug: string;\n status: string;\n assignee: string;\n priority: string;\n projectSlug: string;\n}\n\nexport function useSearch(nodes: TreeNode[]) {\n const [query, setQuery] = useState('');\n const [searchActive, setSearchActive] = useState(false);\n\n const fuse = useMemo(() => {\n const items: SearchableItem[] = [];\n for (const project of nodes) {\n items.push({\n id: project.id,\n label: project.label,\n slug: project.slug,\n status: project.status,\n assignee: '',\n priority: '',\n projectSlug: project.projectSlug,\n });\n if (project.children) {\n for (const child of project.children) {\n items.push({\n id: child.id,\n label: child.label,\n slug: child.slug,\n status: child.status,\n assignee: child.assignee ?? '',\n priority: child.priority ?? '',\n projectSlug: child.projectSlug,\n });\n }\n }\n }\n return new Fuse(items, {\n keys: ['label', 'slug', 'status', 'assignee', 'priority'],\n threshold: 0.4,\n includeScore: true,\n });\n }, [nodes]);\n\n const filteredIds = useMemo<Set<string> | null>(() => {\n if (!query.trim()) return null;\n const results = fuse.search(query);\n return new Set(results.map((r) => r.item.id));\n }, [fuse, query]);\n\n return {\n query,\n setQuery,\n searchActive,\n setSearchActive,\n filteredIds,\n };\n}\n","export const statusColors: Record<string, string> = {\n pending: 'gray',\n in_progress: 'blue',\n blocked: 'red',\n review: 'yellow',\n completed: 'green',\n failed: 'red',\n active: 'blue',\n archived: 'gray',\n};\n\nexport const priorityColors: Record<string, string> = {\n critical: 'red',\n high: 'yellow',\n medium: 'white',\n low: 'gray',\n};\n\nexport function priorityIndicator(priority?: string): string {\n if (priority === 'critical') return '!!';\n if (priority === 'high') return '!';\n return '';\n}\n","import React from 'react';\nimport { Text, Box } from 'ink';\nimport type { FlatNode } from '../types.js';\nimport { statusColors, priorityColors, priorityIndicator } from '../colors.js';\n\ninterface TreeItemProps {\n node: FlatNode;\n isSelected: boolean;\n}\n\nexport function TreeItem({ node, isSelected }: TreeItemProps) {\n const indent = ' '.repeat(node.depth);\n const statusColor = statusColors[node.status] ?? 'white';\n\n if (node.kind === 'project') {\n const chevron = node.expanded ? '▾' : '▸';\n const progressText = node.progress\n ? `${node.progress.completed}/${node.progress.total}`\n : '';\n\n return (\n <Box>\n <Text inverse={isSelected} bold={isSelected}>\n {indent}\n <Text>{chevron} </Text>\n <Text bold>{node.label}</Text>\n <Text> </Text>\n <Text color={statusColor}>{node.status}</Text>\n {progressText ? <Text dimColor> {progressText} done</Text> : null}\n </Text>\n </Box>\n );\n }\n\n const prio = priorityIndicator(node.priority);\n const prioColor = node.priority ? priorityColors[node.priority] : undefined;\n\n return (\n <Box>\n <Text inverse={isSelected} bold={isSelected}>\n {indent}\n <Text dimColor>{'▪ '}</Text>\n <Text>{node.label}</Text>\n <Text> </Text>\n <Text color={statusColor}>{node.status.replace('_', ' ')}</Text>\n {prio ? <Text color={prioColor}> {prio}</Text> : null}\n {node.assignee ? <Text dimColor> @{node.assignee}</Text> : null}\n </Text>\n </Box>\n );\n}\n","import React, { useMemo } from 'react';\nimport { Box, Text } from 'ink';\nimport type { FlatNode } from '../types.js';\nimport { TreeItem } from './TreeItem.js';\n\ninterface TreeViewProps {\n nodes: FlatNode[];\n cursor: number;\n viewportHeight: number;\n}\n\nexport function TreeView({ nodes, cursor, viewportHeight }: TreeViewProps) {\n const { start, end } = useMemo(() => {\n const half = Math.floor(viewportHeight / 2);\n let start = cursor - half;\n if (start < 0) start = 0;\n let end = start + viewportHeight;\n if (end > nodes.length) {\n end = nodes.length;\n start = Math.max(0, end - viewportHeight);\n }\n return { start, end };\n }, [cursor, viewportHeight, nodes.length]);\n\n if (nodes.length === 0) {\n return (\n <Box flexDirection=\"column\" paddingLeft={1}>\n <Text dimColor>No projects found. Run `syntaur create-project` to get started.</Text>\n </Box>\n );\n }\n\n const visible = nodes.slice(start, end);\n\n return (\n <Box flexDirection=\"column\">\n {visible.map((node, i) => (\n <TreeItem\n key={node.id}\n node={node}\n isSelected={start + i === cursor}\n />\n ))}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport TextInput from 'ink-text-input';\n\ninterface SearchBarProps {\n active: boolean;\n query: string;\n onChange: (value: string) => void;\n resultCount: number;\n}\n\nexport function SearchBar({ active, query, onChange, resultCount }: SearchBarProps) {\n if (!active && !query) {\n return (\n <Box paddingLeft={1}>\n <Text dimColor>/ to search</Text>\n </Box>\n );\n }\n\n return (\n <Box paddingLeft={1}>\n <Text color=\"yellow\">/</Text>\n {active ? (\n <TextInput value={query} onChange={onChange} />\n ) : (\n <Text>{query}</Text>\n )}\n {query ? (\n <Text dimColor> ({resultCount} matches)</Text>\n ) : null}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { FlatNode } from '../types.js';\n\ninterface StatusBarProps {\n currentNode: FlatNode | null;\n searchActive: boolean;\n}\n\nexport function StatusBar({ currentNode, searchActive }: StatusBarProps) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"single\" borderTop borderBottom={false} borderLeft={false} borderRight={false} paddingLeft={1}>\n <Box gap={2}>\n <Text dimColor>↑↓ navigate</Text>\n <Text dimColor>←→ expand/collapse</Text>\n <Text dimColor>Enter select</Text>\n {searchActive ? (\n <Text dimColor>Esc clear search</Text>\n ) : (\n <Text dimColor>/ search</Text>\n )}\n <Text dimColor>q quit</Text>\n </Box>\n {currentNode?.kind === 'assignment' && currentNode.workspace?.worktreePath ? (\n <Text dimColor>workspace: {currentNode.workspace.worktreePath}</Text>\n ) : null}\n </Box>\n );\n}\n","import React, { useState, useCallback } from 'react';\nimport { Box, Text, useApp, useInput, useStdout } from 'ink';\nimport { useProjects } from './hooks/useProjects.js';\nimport { useTreeState } from './hooks/useTreeState.js';\nimport { useSearch } from './hooks/useSearch.js';\nimport { TreeView } from './components/TreeView.js';\nimport { SearchBar } from './components/SearchBar.js';\nimport { StatusBar } from './components/StatusBar.js';\nimport type { LaunchOptions } from './launch.js';\n\ninterface AppProps {\n projectsDir: string;\n onLaunch: (options: Omit<LaunchOptions, 'agent'>) => void;\n}\n\nexport function App({ projectsDir, onLaunch }: AppProps) {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const terminalHeight = stdout?.rows ?? 24;\n const viewportHeight = Math.max(5, terminalHeight - 6);\n\n const { nodes, loading, error } = useProjects(projectsDir);\n const { query, setQuery, searchActive, setSearchActive, filteredIds } = useSearch(nodes);\n const {\n flatList,\n cursor,\n setCursor,\n moveUp,\n moveDown,\n toggle,\n expandNode,\n collapseNode,\n currentNode,\n } = useTreeState(nodes, filteredIds);\n\n useInput((input, key) => {\n if (searchActive) {\n if (key.escape) {\n setSearchActive(false);\n setQuery('');\n return;\n }\n if (key.return) {\n setSearchActive(false);\n return;\n }\n // Text input is handled by TextInput component\n return;\n }\n\n // Navigation mode\n if (input === 'q' || key.escape) {\n exit();\n return;\n }\n\n if (input === '/') {\n setSearchActive(true);\n return;\n }\n\n if (key.upArrow || input === 'k') {\n moveUp();\n return;\n }\n\n if (key.downArrow || input === 'j') {\n moveDown();\n return;\n }\n\n if (key.rightArrow && currentNode?.kind === 'project') {\n expandNode(currentNode.id);\n return;\n }\n\n if (key.leftArrow) {\n if (currentNode?.kind === 'project') {\n collapseNode(currentNode.id);\n } else if (currentNode?.kind === 'assignment') {\n // Jump to parent project\n const parentId = `m:${currentNode.projectSlug}`;\n const parentIndex = flatList.findIndex((n) => n.id === parentId);\n if (parentIndex >= 0) {\n setCursor(parentIndex);\n }\n }\n return;\n }\n\n if (key.return && currentNode) {\n if (currentNode.kind === 'project') {\n toggle(currentNode.id);\n } else if (currentNode.kind === 'assignment') {\n onLaunch({\n projectsDir,\n projectSlug: currentNode.projectSlug,\n assignmentSlug: currentNode.slug,\n });\n }\n return;\n }\n });\n\n if (loading) {\n return (\n <Box paddingLeft={1}>\n <Text>Loading projects...</Text>\n </Box>\n );\n }\n\n if (error) {\n return (\n <Box paddingLeft={1}>\n <Text color=\"red\">Error: {error}</Text>\n </Box>\n );\n }\n\n const projectCount = nodes.length;\n const matchCount = filteredIds?.size ?? flatList.length;\n\n return (\n <Box flexDirection=\"column\">\n <Box paddingLeft={1} marginBottom={0}>\n <Text bold color=\"cyan\">Syntaur</Text>\n <Text dimColor> {projectCount} project{projectCount !== 1 ? 's' : ''}</Text>\n </Box>\n <SearchBar\n active={searchActive}\n query={query}\n onChange={setQuery}\n resultCount={matchCount}\n />\n <TreeView\n nodes={flatList}\n cursor={cursor}\n viewportHeight={viewportHeight}\n />\n <StatusBar currentNode={currentNode} searchActive={searchActive} />\n </Box>\n );\n}\n","import { spawn } from 'node:child_process';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { getAssignmentDetail } from '../dashboard/api.js';\n\nexport type AgentType = 'claude' | 'codex';\n\nconst AGENT_COMMANDS: Record<AgentType, string> = {\n claude: 'c',\n codex: 'cx',\n};\n\nexport interface LaunchOptions {\n projectsDir: string;\n projectSlug: string;\n assignmentSlug: string;\n agent: AgentType;\n}\n\nexport async function launchAgent(options: LaunchOptions): Promise<void> {\n const { projectsDir, projectSlug, assignmentSlug, agent } = options;\n const command = AGENT_COMMANDS[agent];\n\n const detail = await getAssignmentDetail(projectsDir, projectSlug, assignmentSlug);\n if (!detail) {\n console.error(`Assignment not found: ${projectSlug}/${assignmentSlug}`);\n process.exit(1);\n }\n\n const workspaceDir =\n detail.workspace.worktreePath ??\n (detail.workspace.repository?.startsWith('/') ? detail.workspace.repository : null) ??\n process.cwd();\n\n const projectDir = resolve(projectsDir, projectSlug);\n const assignmentDir = resolve(projectDir, 'assignments', assignmentSlug);\n\n const contextDir = resolve(workspaceDir, '.syntaur');\n await mkdir(contextDir, { recursive: true });\n\n const context = {\n projectSlug,\n assignmentSlug,\n projectDir,\n assignmentDir,\n workspaceRoot: workspaceDir,\n title: detail.title,\n branch: detail.workspace.branch ?? null,\n grabbedAt: new Date().toISOString(),\n };\n\n await writeFile(\n resolve(contextDir, 'context.json'),\n JSON.stringify(context, null, 2) + '\\n',\n );\n\n return new Promise<void>((resolvePromise, reject) => {\n const initialPrompt =\n `Read the current Syntaur assignment at ${assignmentDir}/assignment.md and give me a brief summary: title, status, priority, objective, and acceptance criteria.`;\n\n const child = spawn(command, [initialPrompt], {\n cwd: workspaceDir,\n stdio: 'inherit',\n });\n\n child.on('error', (err) => {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n console.error(`${agent} CLI not found. Is \\`${command}\\` installed and in your PATH?`);\n } else {\n console.error(`Failed to launch ${agent}:`, err.message);\n }\n process.exit(1);\n });\n\n child.on('exit', (code) => {\n process.exit(code ?? 0);\n });\n });\n}\n","import { Command } from 'commander';\nimport { initCommand } from './commands/init.js';\nimport { createProjectCommand } from './commands/create-project.js';\nimport { createAssignmentCommand } from './commands/create-assignment.js';\nimport { dashboardCommand, didUserSpecifyDashboardPort } from './commands/dashboard.js';\nimport { assignCommand } from './commands/assign.js';\nimport { startCommand } from './commands/start.js';\nimport { completeCommand } from './commands/complete.js';\nimport { blockCommand } from './commands/block.js';\nimport { unblockCommand } from './commands/unblock.js';\nimport { reviewCommand } from './commands/review.js';\nimport { failCommand } from './commands/fail.js';\nimport { reopenCommand } from './commands/reopen.js';\nimport { installPluginCommand } from './commands/install-plugin.js';\nimport { installCodexPluginCommand } from './commands/install-codex-plugin.js';\nimport { setupCommand } from './commands/setup.js';\nimport { uninstallCommand } from './commands/uninstall.js';\nimport { setupAdapterCommand } from './commands/setup-adapter.js';\nimport { trackSessionCommand } from './commands/track-session.js';\nimport { browseCommand } from './commands/browse.js';\nimport { createPlaybookCommand } from './commands/create-playbook.js';\nimport { listPlaybooksCommand } from './commands/list-playbooks.js';\nimport { todoCommand } from './commands/todo.js';\nimport { backupCommand } from './commands/backup.js';\nimport { doctorCommand } from './commands/doctor.js';\nimport { commentCommand } from './commands/comment.js';\nimport { requestCommand } from './commands/request.js';\nimport { getDefaultCommandName } from './cli-default-command.js';\nimport { maybePromptInstall } from './utils/npx-prompt.js';\nimport { readPackageVersion } from './utils/version.js';\n\nawait maybePromptInstall(import.meta.url);\n\nconst program = new Command();\nconst version = (await readPackageVersion(import.meta.url)) ?? '0.0.0';\n\nprogram\n .name('syntaur')\n .description('CLI scaffolding tool for the Syntaur protocol')\n .version(version);\n\nprogram\n .command('init')\n .description('Initialize ~/.syntaur/ directory structure and config')\n .option('--force', 'Overwrite existing config file')\n .action(async (options) => {\n try {\n await initCommand(options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('create-project')\n .description('Create a new project with all required files')\n .argument('<title>', 'Project title')\n .option('--slug <slug>', 'Override auto-generated slug')\n .option('--dir <path>', 'Override default project directory')\n .option('--workspace <workspace>', 'Workspace for organizational grouping')\n .action(async (title, options) => {\n try {\n await createProjectCommand(title, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('create-assignment')\n .description('Create a new assignment within a project')\n .argument('<title>', 'Assignment title')\n .option('--project <slug>', 'Target project slug (required unless --one-off)')\n .option('--one-off', 'Create a standalone assignment at ~/.syntaur/assignments/<uuid>/')\n .option('--slug <slug>', 'Override auto-generated slug (display only for standalone; folder name for project-nested)')\n .option(\n '--priority <level>',\n 'Priority level (low|medium|high|critical)',\n 'medium',\n )\n .option('--type <type>', 'Assignment type (e.g. feature, bug, refactor)')\n .option('--depends-on <slugs>', 'Comma-separated dependency slugs (not allowed with --one-off)')\n .option('--links <slugs>', 'Comma-separated linked assignment slugs (projectSlug/assignmentSlug format)')\n .option('--dir <path>', 'Override default project directory (ignored for --one-off)')\n .action(async (title, options) => {\n try {\n await createAssignmentCommand(title, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('comment')\n .description('Add a comment to an assignment (CLI-mediated, append-only)')\n .argument('<assignment>', 'Target assignment slug (with --project) or UUID (standalone)')\n .argument('<text>', 'Comment body')\n .option('--project <slug>', 'Project slug if the target is project-nested')\n .option('--reply-to <id>', 'ID of the comment this replies to')\n .option('--type <type>', 'Comment type: question | note | feedback', 'note')\n .option('--author <name>', 'Override author (default: $USER or \"unknown\")')\n .option('--dir <path>', 'Override default project directory')\n .action(async (assignment, text, options) => {\n try {\n await commentCommand(assignment, text, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('request')\n .description('Append a todo to another assignment (cross-assignment work request)')\n .argument('<target>', 'Target assignment slug (with --project) or UUID (standalone)')\n .argument('<text>', 'Todo text')\n .option('--project <slug>', 'Project slug if the target is project-nested')\n .option('--from <source>', 'Source assignment (default: $SYNTAUR_ASSIGNMENT)')\n .option('--dir <path>', 'Override default project directory')\n .action(async (target, text, options) => {\n try {\n await requestCommand(target, text, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('dashboard')\n .description('Start the local Syntaur dashboard web UI')\n .option('--port <number>', 'Port to run the dashboard on', '4800')\n .option('--dev', 'Run the dashboard with the Vite dev server', false)\n .option('--server-only', 'Run only the API server without any UI', false)\n .option('--api-only', 'Deprecated alias for --server-only', false)\n .option('--no-open', 'Do not automatically open the browser')\n .action(async (options) => {\n try {\n const autoPort = !didUserSpecifyDashboardPort();\n await dashboardCommand({\n ...options,\n autoPort,\n });\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('assign')\n .description('Set the assignee on an assignment')\n .argument('<assignment>', 'Assignment slug')\n .option('--project <slug>', 'Target project slug')\n .option('--agent <name>', 'Agent name to assign')\n .option('--dir <path>', 'Override default project directory')\n .action(async (assignment, options) => {\n try {\n await assignCommand(assignment, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('start')\n .description('Transition an assignment to in_progress')\n .argument('<assignment>', 'Assignment slug')\n .option('--project <slug>', 'Target project slug')\n .option('--agent <name>', 'Agent name (sets assignee if not already set)')\n .option('--dir <path>', 'Override default project directory')\n .action(async (assignment, options) => {\n try {\n await startCommand(assignment, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('complete')\n .description('Transition an assignment to completed')\n .argument('<assignment>', 'Assignment slug')\n .option('--project <slug>', 'Target project slug')\n .option('--dir <path>', 'Override default project directory')\n .action(async (assignment, options) => {\n try {\n await completeCommand(assignment, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('block')\n .description('Transition an assignment to blocked')\n .argument('<assignment>', 'Assignment slug')\n .option('--project <slug>', 'Target project slug')\n .option('--reason <text>', 'Reason for blocking')\n .option('--dir <path>', 'Override default project directory')\n .action(async (assignment, options) => {\n try {\n await blockCommand(assignment, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('unblock')\n .description('Transition a blocked assignment to in_progress')\n .argument('<assignment>', 'Assignment slug')\n .option('--project <slug>', 'Target project slug')\n .option('--dir <path>', 'Override default project directory')\n .action(async (assignment, options) => {\n try {\n await unblockCommand(assignment, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('review')\n .description('Transition an assignment to review')\n .argument('<assignment>', 'Assignment slug')\n .option('--project <slug>', 'Target project slug')\n .option('--dir <path>', 'Override default project directory')\n .action(async (assignment, options) => {\n try {\n await reviewCommand(assignment, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('fail')\n .description('Transition an assignment to failed')\n .argument('<assignment>', 'Assignment slug')\n .option('--project <slug>', 'Target project slug')\n .option('--dir <path>', 'Override default project directory')\n .action(async (assignment, options) => {\n try {\n await failCommand(assignment, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('reopen')\n .description('Reopen a completed or failed assignment')\n .argument('<assignment>', 'Assignment slug')\n .option('--project <slug>', 'Target project slug')\n .option('--dir <path>', 'Override default project directory')\n .action(async (assignment, options) => {\n try {\n await reopenCommand(assignment, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('setup')\n .description('Initialize Syntaur and optionally install plugins or launch the dashboard')\n .option('--yes', 'Skip interactive prompts and perform only the requested flags')\n .option('--claude', 'Install the Claude Code plugin')\n .option('--codex', 'Install the Codex plugin')\n .option('--claude-dir <path>', 'Install the Claude Code plugin at a specific path')\n .option('--codex-dir <path>', 'Install the Codex plugin at a specific path')\n .option('--codex-marketplace-path <path>', 'Write the Codex marketplace entry to a specific file')\n .option('--dashboard', 'Launch the dashboard after setup')\n .action(async (options) => {\n try {\n await setupCommand(options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('install-plugin')\n .description('Install the Syntaur Claude Code plugin')\n .option('--force', 'Overwrite an existing Syntaur-managed install')\n .option('--target-dir <path>', 'Install the plugin at a specific directory')\n .option('--link', 'Use a symlink instead of copying files (repo-local dev only)')\n .action(async (options) => {\n try {\n await installPluginCommand({ ...options, promptForTarget: true });\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('install-codex-plugin')\n .description('Install the Syntaur Codex plugin and marketplace entry')\n .option('--force', 'Overwrite an existing Syntaur-managed install')\n .option('--target-dir <path>', 'Install the plugin at a specific directory')\n .option('--marketplace-path <path>', 'Write the marketplace entry to a specific file')\n .option('--link', 'Use a symlink instead of copying files (repo-local dev only)')\n .action(async (options) => {\n try {\n await installCodexPluginCommand({ ...options, promptForTarget: true });\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('uninstall')\n .description('Remove Syntaur integrations and optionally local data')\n .option('--claude', 'Remove only the Claude Code plugin')\n .option('--codex', 'Remove only the Codex plugin and marketplace entry')\n .option('--data', 'Remove ~/.syntaur data')\n .option('--all', 'Remove plugins and ~/.syntaur data')\n .option('--yes', 'Skip confirmation prompts')\n .action(async (options) => {\n try {\n await uninstallCommand(options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('setup-adapter')\n .description('Generate adapter instruction files for a framework in the current directory')\n .argument('<framework>', 'Target framework (cursor, codex, opencode)')\n .option('--project <slug>', 'Target project slug (required)')\n .option('--assignment <slug>', 'Target assignment slug (required)')\n .option('--force', 'Overwrite existing adapter files')\n .option('--dir <path>', 'Override default project directory')\n .action(async (framework, options) => {\n try {\n await setupAdapterCommand(framework, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('track-session')\n .description('Register an agent session (optionally linked to a project/assignment)')\n .option('--project <slug>', 'Target project slug')\n .option('--assignment <slug>', 'Assignment slug')\n .option('--agent <name>', 'Agent name, e.g. claude, codex, cursor (required)')\n .requiredOption(\n '--session-id <id>',\n 'Session id from the agent runtime (real, not generated). Claude: read from ~/.claude/sessions/<pid>.json or the SessionStart hook payload. Codex: `payload.id` from the first line of the matching ~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl.',\n )\n .option(\n '--transcript-path <path>',\n 'Absolute path to the agent rollout/transcript file (e.g. the Codex rollout jsonl or Claude transcript jsonl).',\n )\n .option('--path <path>', 'Full path to session on disk (defaults to cwd)')\n .option('--dir <path>', 'Override default project directory')\n .option('--description <text>', 'Description of what this session is for')\n .action(async (options) => {\n try {\n await trackSessionCommand(options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('browse')\n .description('Interactive TUI browser for projects and assignments')\n .option('--agent <type>', 'Agent to launch: claude or codex', 'claude')\n .action(async (options) => {\n try {\n await browseCommand(options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('create-playbook')\n .description('Create a new playbook')\n .argument('<name>', 'Playbook name')\n .option('--slug <slug>', 'Override auto-generated slug')\n .option('--description <desc>', 'Playbook description')\n .action(async (name, options) => {\n try {\n await createPlaybookCommand(name, options);\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('list-playbooks')\n .description('List all playbooks')\n .action(async () => {\n try {\n await listPlaybooksCommand();\n } catch (error) {\n console.error(\n 'Error:',\n error instanceof Error ? error.message : String(error),\n );\n process.exit(1);\n }\n });\n\nprogram.addCommand(todoCommand);\nprogram.addCommand(backupCommand);\nprogram.addCommand(doctorCommand);\n\n// Default to dashboard when no command is given\nif (process.argv.length <= 2) {\n process.argv.push(await getDefaultCommandName());\n}\n\nawait program.parseAsync();\n","import { resolve, dirname } from 'node:path';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { fileURLToPath } from 'node:url';\nimport { syntaurRoot, defaultProjectDir, assignmentsDir } from '../utils/paths.js';\nimport { ensureDir, writeFileSafe, writeFileForce, fileExists } from '../utils/fs.js';\nimport { renderConfig } from '../templates/config.js';\nimport { rebuildPlaybookManifest } from '../utils/playbooks.js';\n\nexport interface InitOptions {\n force?: boolean;\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n const root = syntaurRoot();\n const projectsDir = defaultProjectDir();\n const standaloneAssignmentsDir = assignmentsDir();\n const configPath = resolve(root, 'config.md');\n\n const playbooksDir = resolve(root, 'playbooks');\n\n await ensureDir(root);\n await ensureDir(projectsDir);\n await ensureDir(standaloneAssignmentsDir);\n await ensureDir(playbooksDir);\n\n const configContent = renderConfig({\n defaultProjectDir: projectsDir,\n });\n\n if (options.force) {\n await writeFileForce(configPath, configContent);\n console.log(`Created ${root}/`);\n console.log(`Created ${projectsDir}/`);\n console.log(`Created ${standaloneAssignmentsDir}/`);\n console.log(`Created ${playbooksDir}/`);\n console.log(`Wrote ${configPath} (overwritten)`);\n } else {\n const written = await writeFileSafe(configPath, configContent);\n console.log(`Created ${root}/`);\n console.log(`Created ${projectsDir}/`);\n console.log(`Created ${standaloneAssignmentsDir}/`);\n console.log(`Created ${playbooksDir}/`);\n if (written) {\n console.log(`Wrote ${configPath}`);\n } else {\n console.log(`Skipped ${configPath} (already exists; use --force to overwrite)`);\n }\n }\n\n // Seed default playbooks (only if they don't already exist)\n const seeded = await seedDefaultPlaybooks(playbooksDir);\n if (seeded > 0) {\n console.log(`Seeded ${seeded} default playbook(s) in ${playbooksDir}/`);\n }\n\n // Rebuild playbook index\n await rebuildPlaybookManifest(playbooksDir);\n\n console.log('\\nSyntaur initialized successfully.');\n}\n\nasync function seedDefaultPlaybooks(playbooksDir: string): Promise<number> {\n const __filename = fileURLToPath(import.meta.url);\n const packageRoot = resolve(dirname(__filename), '..');\n const examplesDir = resolve(packageRoot, 'examples', 'playbooks');\n\n if (!(await fileExists(examplesDir))) return 0;\n\n const entries = await readdir(examplesDir, { withFileTypes: true });\n let count = 0;\n\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith('.md')) continue;\n const targetPath = resolve(playbooksDir, entry.name);\n if (await fileExists(targetPath)) continue;\n\n const content = await readFile(resolve(examplesDir, entry.name), 'utf-8');\n await writeFileSafe(targetPath, content);\n count++;\n }\n\n return count;\n}\n","import { resolve } from 'node:path';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { fileExists, writeFileForce } from './fs.js';\nimport { parsePlaybook } from '../dashboard/parser.js';\nimport { nowTimestamp } from './timestamp.js';\n\nexport async function rebuildPlaybookManifest(playbooksDir: string): Promise<void> {\n if (!(await fileExists(playbooksDir))) return;\n\n const entries = await readdir(playbooksDir, { withFileTypes: true });\n const rows: Array<{ name: string; slug: string; description: string; whenToUse: string }> = [];\n\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith('.md') || entry.name.startsWith('_') || entry.name === 'manifest.md') continue;\n\n const raw = await readFile(resolve(playbooksDir, entry.name), 'utf-8');\n const parsed = parsePlaybook(raw);\n const slug = parsed.slug || entry.name.replace(/\\.md$/, '');\n\n rows.push({\n name: parsed.name || slug,\n slug,\n description: parsed.description,\n whenToUse: parsed.whenToUse,\n });\n }\n\n rows.sort((a, b) => a.name.localeCompare(b.name));\n\n const timestamp = nowTimestamp();\n const lines = [\n '---',\n `generated: \"${timestamp}\"`,\n `total: ${rows.length}`,\n '---',\n '',\n '# Playbooks',\n '',\n 'Behavioral rules for AI agents. Read and follow all playbooks before starting work.',\n '',\n ];\n\n for (const row of rows) {\n lines.push(`- **[${row.name}](${row.slug}.md)** — ${row.description}`);\n if (row.whenToUse) {\n lines.push(` _When to use: ${row.whenToUse}_`);\n }\n }\n\n lines.push('');\n\n await writeFileForce(resolve(playbooksDir, 'manifest.md'), lines.join('\\n'));\n}\n","import { resolve } from 'node:path';\nimport { slugify, isValidSlug } from '../utils/slug.js';\nimport { nowTimestamp } from '../utils/timestamp.js';\nimport { generateId } from '../utils/uuid.js';\nimport { expandHome } from '../utils/paths.js';\nimport { ensureDir, writeFileForce, fileExists } from '../utils/fs.js';\nimport { readConfig } from '../utils/config.js';\nimport {\n renderManifest,\n renderProject,\n renderIndexAssignments,\n renderIndexPlans,\n renderIndexDecisions,\n renderStatus,\n renderResourcesIndex,\n renderMemoriesIndex,\n} from '../templates/index.js';\n\nexport interface CreateProjectOptions {\n slug?: string;\n dir?: string;\n workspace?: string;\n}\n\nexport async function createProjectCommand(\n title: string,\n options: CreateProjectOptions,\n): Promise<string> {\n if (!title.trim()) {\n throw new Error('Project title cannot be empty.');\n }\n\n const slug = options.slug || slugify(title);\n if (!isValidSlug(slug)) {\n throw new Error(\n `Invalid slug \"${slug}\". Slugs must be lowercase, hyphen-separated, with no special characters.`,\n );\n }\n\n const config = await readConfig();\n const baseDir = options.dir\n ? expandHome(options.dir)\n : config.defaultProjectDir;\n const projectDir = resolve(baseDir, slug);\n\n if (await fileExists(projectDir)) {\n throw new Error(\n `Project folder already exists: ${projectDir}\\nUse --slug to specify a different slug.`,\n );\n }\n\n const timestamp = nowTimestamp();\n const id = generateId();\n\n await ensureDir(resolve(projectDir, 'assignments'));\n await ensureDir(resolve(projectDir, 'resources'));\n await ensureDir(resolve(projectDir, 'memories'));\n\n const files: Array<[string, string]> = [\n [\n resolve(projectDir, 'manifest.md'),\n renderManifest({ slug, timestamp }),\n ],\n [\n resolve(projectDir, 'project.md'),\n renderProject({ id, slug, title, timestamp, workspace: options.workspace }),\n ],\n [\n resolve(projectDir, '_index-assignments.md'),\n renderIndexAssignments({ slug, title, timestamp }),\n ],\n [\n resolve(projectDir, '_index-plans.md'),\n renderIndexPlans({ slug, title, timestamp }),\n ],\n [\n resolve(projectDir, '_index-decisions.md'),\n renderIndexDecisions({ slug, title, timestamp }),\n ],\n [\n resolve(projectDir, '_status.md'),\n renderStatus({ slug, title, timestamp }),\n ],\n [\n resolve(projectDir, 'resources', '_index.md'),\n renderResourcesIndex({ slug, title, timestamp }),\n ],\n [\n resolve(projectDir, 'memories', '_index.md'),\n renderMemoriesIndex({ slug, title, timestamp }),\n ],\n ];\n\n for (const [filePath, content] of files) {\n await writeFileForce(filePath, content);\n }\n\n console.log(`Created project \"${title}\" at ${projectDir}/`);\n console.log(` Slug: ${slug}`);\n console.log(` Files created:`);\n console.log(` manifest.md`);\n console.log(` project.md`);\n console.log(` _index-assignments.md`);\n console.log(` _index-plans.md`);\n console.log(` _index-decisions.md`);\n console.log(` _status.md`);\n console.log(` resources/_index.md`);\n console.log(` memories/_index.md`);\n\n return slug;\n}\n","export function slugify(title: string): string {\n return title\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\nexport function isValidSlug(slug: string): boolean {\n return /^[a-z0-9]+(-[a-z0-9]+)*$/.test(slug);\n}\n","import { randomUUID } from 'node:crypto';\n\nexport function generateId(): string {\n return randomUUID();\n}\n","export { renderConfig } from './config.js';\nexport type { ConfigParams } from './config.js';\n\nexport { renderManifest } from './manifest.js';\nexport type { ManifestParams } from './manifest.js';\n\nexport { renderProject } from './project.js';\nexport type { ProjectParams } from './project.js';\n\nexport { renderAssignment } from './assignment.js';\nexport type { AssignmentParams } from './assignment.js';\n\nexport { renderPlan } from './plan.js';\nexport type { PlanParams } from './plan.js';\n\nexport { renderScratchpad } from './scratchpad.js';\nexport type { ScratchpadParams } from './scratchpad.js';\n\nexport { renderHandoff } from './handoff.js';\nexport type { HandoffParams } from './handoff.js';\n\nexport { renderProgress, formatProgressEntry } from './progress.js';\nexport type { ProgressParams } from './progress.js';\n\nexport { renderComments, formatCommentEntry } from './comments.js';\nexport type { CommentsParams, Comment, CommentType } from './comments.js';\n\nexport { renderDecisionRecord } from './decision-record.js';\nexport type { DecisionRecordParams } from './decision-record.js';\n\nexport {\n renderIndexAssignments,\n renderIndexPlans,\n renderIndexDecisions,\n renderStatus,\n renderResourcesIndex,\n renderMemoriesIndex,\n} from './index-stubs.js';\nexport type { IndexStubParams } from './index-stubs.js';\n\nexport { renderPlaybook } from './playbook.js';\nexport type { PlaybookParams } from './playbook.js';\n\nexport { renderCursorProtocol, renderCursorAssignment } from './cursor-rules.js';\nexport type { CursorAssignmentParams } from './cursor-rules.js';\n\nexport { renderCodexAgents } from './codex-agents.js';\nexport type { CodexAgentsParams } from './codex-agents.js';\n\nexport { renderOpenCodeConfig } from './opencode-config.js';\nexport type { OpenCodeConfigParams } from './opencode-config.js';\n","export interface ManifestParams {\n slug: string;\n timestamp: string;\n}\n\nexport function renderManifest(params: ManifestParams): string {\n return `---\nversion: \"2.0\"\nproject: ${params.slug}\ngenerated: \"${params.timestamp}\"\n---\n\n# Project: ${params.slug}\n\n## Overview\n- [Project Overview](./project.md)\n\n## Indexes\n- [Assignments](./_index-assignments.md)\n- [Plans](./_index-plans.md)\n- [Decision Records](./_index-decisions.md)\n- [Status](./_status.md)\n- [Resources](./resources/_index.md)\n- [Memories](./memories/_index.md)\n`;\n}\n","export function escapeYamlString(value: string): string {\n if (value.includes('\\n') || value.includes('\\r')) {\n throw new Error(\n `YAML string values must be single-line. Got: \"${value.slice(0, 50)}...\"`,\n );\n }\n const escaped = value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n return `\"${escaped}\"`;\n}\n","import { escapeYamlString } from '../utils/yaml.js';\n\nexport interface ProjectParams {\n id: string;\n slug: string;\n title: string;\n timestamp: string;\n workspace?: string;\n}\n\nexport function renderProject(params: ProjectParams): string {\n const safeTitle = escapeYamlString(params.title);\n const workspaceLine = params.workspace ? `\\nworkspace: ${params.workspace}` : '';\n return `---\nid: ${params.id}\nslug: ${params.slug}\ntitle: ${safeTitle}\narchived: false\narchivedAt: null\narchivedReason: null\ncreated: \"${params.timestamp}\"\nupdated: \"${params.timestamp}\"\nexternalIds: []\ntags: []${workspaceLine}\n---\n\n# ${params.title}\n\n## Overview\n\n<!-- Describe the project goal, context, and success criteria here. -->\n\n## Notes\n\n<!-- Optional human notes, updates, or context. -->\n`;\n}\n","import { escapeYamlString } from '../utils/yaml.js';\n\nexport interface AssignmentParams {\n id: string;\n slug: string;\n title: string;\n timestamp: string;\n priority: 'low' | 'medium' | 'high' | 'critical';\n dependsOn: string[];\n links: string[];\n project?: string | null;\n type?: string;\n}\n\nexport function renderAssignment(params: AssignmentParams): string {\n const safeTitle = escapeYamlString(params.title);\n const dependsOnYaml =\n params.dependsOn.length === 0\n ? 'dependsOn: []'\n : `dependsOn:\\n - ${params.dependsOn.join('\\n - ')}`;\n const linksYaml =\n params.links.length === 0\n ? 'links: []'\n : `links:\\n - ${params.links.join('\\n - ')}`;\n const projectYaml = `project: ${params.project == null ? 'null' : params.project}`;\n const typeYaml = `type: ${params.type ?? 'feature'}`;\n\n return `---\nid: ${params.id}\nslug: ${params.slug}\ntitle: ${safeTitle}\n${projectYaml}\n${typeYaml}\nstatus: pending\npriority: ${params.priority}\ncreated: \"${params.timestamp}\"\nupdated: \"${params.timestamp}\"\nassignee: null\nexternalIds: []\n${dependsOnYaml}\n${linksYaml}\nblockedReason: null\nworkspace:\n repository: null\n worktreePath: null\n branch: null\n parentBranch: null\ntags: []\n---\n\n# ${params.title}\n\n## Objective\n\n<!-- Clear description of what needs to be done and why. -->\n\n## Acceptance Criteria\n\n- [ ] <!-- criterion 1 -->\n- [ ] <!-- criterion 2 -->\n- [ ] <!-- criterion 3 -->\n\n## Todos\n\n<!--\nChecklist of work items for this assignment. Items may be simple tasks\nor a markdown link to a plan file (e.g., \"- [ ] Execute [plan](./plan.md)\").\nWhen a plan is superseded by a new one, mark the old todo as:\n - [x] ~~Execute [old plan](./plan.md)~~ (superseded by plan-v2)\nNever delete superseded todos — preserve the history.\n-->\n\n## Context\n\n<!-- Links to relevant docs, code, or other assignments. -->\n\n## Links\n\n- [Progress](./progress.md)\n- [Comments](./comments.md)\n- [Scratchpad](./scratchpad.md)\n- [Handoff](./handoff.md)\n- [Decision Record](./decision-record.md)\n`;\n}\n","export interface ScratchpadParams {\n assignmentSlug: string;\n timestamp: string;\n}\n\nexport function renderScratchpad(params: ScratchpadParams): string {\n return `---\nassignment: ${params.assignmentSlug}\nupdated: \"${params.timestamp}\"\n---\n\n# Scratchpad\n\nNo working notes yet.\n`;\n}\n","export interface HandoffParams {\n assignmentSlug: string;\n timestamp: string;\n}\n\nexport function renderHandoff(params: HandoffParams): string {\n return `---\nassignment: ${params.assignmentSlug}\nupdated: \"${params.timestamp}\"\nhandoffCount: 0\n---\n\n# Handoff Log\n\nNo handoffs recorded yet.\n`;\n}\n","export interface ProgressParams {\n assignment: string;\n timestamp: string;\n}\n\nexport function renderProgress(params: ProgressParams): string {\n return `---\nassignment: ${params.assignment}\nentryCount: 0\ngenerated: \"${params.timestamp}\"\nupdated: \"${params.timestamp}\"\n---\n\n# Progress\n\nNo progress yet.\n`;\n}\n\nexport function formatProgressEntry(body: string, timestamp: string): string {\n const trimmed = body.trim();\n return `## ${timestamp}\\n\\n${trimmed}\\n`;\n}\n","export interface CommentsParams {\n assignment: string;\n timestamp: string;\n}\n\nexport type CommentType = 'question' | 'note' | 'feedback';\n\nexport interface Comment {\n id: string;\n timestamp: string;\n author: string;\n type: CommentType;\n body: string;\n replyTo?: string;\n resolved?: boolean;\n}\n\nexport function renderComments(params: CommentsParams): string {\n return `---\nassignment: ${params.assignment}\nentryCount: 0\ngenerated: \"${params.timestamp}\"\nupdated: \"${params.timestamp}\"\n---\n\n# Comments\n\nNo comments yet.\n`;\n}\n\nexport function formatCommentEntry(comment: Comment): string {\n const lines: string[] = [];\n lines.push(`## ${comment.id}`);\n lines.push('');\n lines.push(`**Recorded:** ${comment.timestamp}`);\n lines.push(`**Author:** ${comment.author}`);\n lines.push(`**Type:** ${comment.type}`);\n if (comment.replyTo) {\n lines.push(`**Reply to:** ${comment.replyTo}`);\n }\n if (comment.type === 'question') {\n lines.push(`**Resolved:** ${comment.resolved ? 'true' : 'false'}`);\n }\n lines.push('');\n lines.push(comment.body.trim());\n lines.push('');\n return lines.join('\\n');\n}\n","export interface DecisionRecordParams {\n assignmentSlug: string;\n timestamp: string;\n}\n\nexport function renderDecisionRecord(\n params: DecisionRecordParams,\n): string {\n return `---\nassignment: ${params.assignmentSlug}\nupdated: \"${params.timestamp}\"\ndecisionCount: 0\n---\n\n# Decision Record\n\nNo decisions recorded yet.\n`;\n}\n","export interface IndexStubParams {\n slug: string;\n title: string;\n timestamp: string;\n}\n\nexport function renderIndexAssignments(params: IndexStubParams): string {\n return `---\nproject: ${params.slug}\ngenerated: \"${params.timestamp}\"\ntotal: 0\nby_status:\n pending: 0\n in_progress: 0\n blocked: 0\n review: 0\n completed: 0\n failed: 0\n---\n\n# Assignments\n\n| Slug | Title | Status | Priority | Assignee | Dependencies | Updated |\n|------|-------|--------|----------|----------|--------------|---------|\n`;\n}\n\nexport function renderIndexPlans(params: IndexStubParams): string {\n return `---\nproject: ${params.slug}\ngenerated: \"${params.timestamp}\"\n---\n\n# Plans\n\n| Assignment | Plan Status | Updated |\n|------------|-------------|---------|\n`;\n}\n\nexport function renderIndexDecisions(params: IndexStubParams): string {\n return `---\nproject: ${params.slug}\ngenerated: \"${params.timestamp}\"\n---\n\n# Decision Records\n\n| Assignment | Count | Latest Decision | Latest Status | Updated |\n|------------|-------|-----------------|---------------|---------|\n`;\n}\n\nexport function renderStatus(params: IndexStubParams): string {\n return `---\nproject: ${params.slug}\ngenerated: \"${params.timestamp}\"\nstatus: pending\nprogress:\n total: 0\n completed: 0\n in_progress: 0\n blocked: 0\n pending: 0\n review: 0\n failed: 0\nneedsAttention:\n blockedCount: 0\n failedCount: 0\n openQuestions: 0\n---\n\n# Project Status: ${params.title}\n\n**Status:** pending\n**Progress:** 0/0 assignments complete\n\n## Assignments\n\nNo assignments yet.\n\n## Dependency Graph\n\nNo dependencies yet.\n\n## Needs Attention\n\n- **0 blocked** assignments\n- **0 failed** assignments\n- **0 unanswered** questions\n`;\n}\n\nexport function renderResourcesIndex(params: IndexStubParams): string {\n return `---\nproject: ${params.slug}\ngenerated: \"${params.timestamp}\"\ntotal: 0\n---\n\n# Resources\n\n| Name | Category | Source | Related Assignments | Updated |\n|------|----------|--------|---------------------|---------|\n`;\n}\n\nexport function renderMemoriesIndex(params: IndexStubParams): string {\n return `---\nproject: ${params.slug}\ngenerated: \"${params.timestamp}\"\ntotal: 0\n---\n\n# Memories\n\n| Name | Source | Scope | Source Assignment | Updated |\n|------|--------|-------|------------------|---------|\n`;\n}\n","import { escapeYamlString } from '../utils/yaml.js';\n\nexport interface PlaybookParams {\n slug: string;\n name: string;\n description: string;\n whenToUse?: string;\n timestamp: string;\n}\n\nexport function renderPlaybook(params: PlaybookParams): string {\n const whenToUse = params.whenToUse\n ? escapeYamlString(params.whenToUse)\n : 'null';\n return `---\nname: ${escapeYamlString(params.name)}\nslug: ${params.slug}\ndescription: ${escapeYamlString(params.description)}\nwhen_to_use: ${whenToUse}\ncreated: \"${params.timestamp}\"\nupdated: \"${params.timestamp}\"\ntags: []\n---\n\n# ${params.name}\n\n<!-- Write imperative rules and workflows here. Keep it under 50 lines. -->\n`;\n}\n","export interface CursorAssignmentParams {\n projectSlug: string;\n assignmentSlug: string;\n projectDir: string;\n assignmentDir: string;\n}\n\nexport function renderCursorProtocol(): string {\n return `---\ndescription: Syntaur protocol rules for multi-agent coordination\nglobs:\nalwaysApply: true\n---\n\n# Syntaur Protocol\n\nYou are working within the Syntaur protocol for multi-agent project coordination.\n\n## Directory Structure\n\n\\`\\`\\`\n~/.syntaur/\n config.md\n projects/\n <project-slug>/\n manifest.md # Derived: root navigation (read-only)\n project.md # Human-authored: project overview (read-only)\n _index-assignments.md # Derived (read-only)\n _index-plans.md # Derived (read-only)\n _index-decisions.md # Derived (read-only)\n _status.md # Derived (read-only)\n assignments/\n <assignment-slug>/\n assignment.md # Agent-writable: source of truth for state (includes ## Todos)\n plan*.md # Agent-writable: versioned implementation plans (optional, one per ## Todos entry)\n progress.md # Agent-writable, append-only: timestamped progress log\n comments.md # CLI-mediated: threaded questions/notes/feedback (via \\`syntaur comment\\`)\n scratchpad.md # Agent-writable: working notes\n handoff.md # Agent-writable: append-only handoff log\n decision-record.md # Agent-writable: append-only decision log\n resources/\n _index.md # Derived (read-only)\n <resource-slug>.md # Shared-writable\n memories/\n _index.md # Derived (read-only)\n <memory-slug>.md # Shared-writable\n assignments/\n <assignment-id>/ # Standalone assignments — folder = UUID, \\`project: null\\`, slug display-only\n assignment.md\n plan*.md\n progress.md\n comments.md\n scratchpad.md\n handoff.md\n decision-record.md\n\\`\\`\\`\n\n## Write Boundary Rules (CRITICAL)\n\n### Files you may WRITE:\n1. **Your assignment folder** -- only the assignment you are currently working on:\n - \\`assignment.md\\`, \\`plan*.md\\` (0 or more versioned plan files), \\`progress.md\\`, \\`scratchpad.md\\`, \\`handoff.md\\`, \\`decision-record.md\\`\n - Path (project-nested): \\`~/.syntaur/projects/<project>/assignments/<your-assignment>/\\`\n - Path (standalone): \\`~/.syntaur/assignments/<your-assignment-uuid>/\\`\n2. **Shared resources and memories** at the project level:\n - \\`~/.syntaur/projects/<project>/resources/<slug>.md\\`\n - \\`~/.syntaur/projects/<project>/memories/<slug>.md\\`\n3. **Your workspace** -- source code files in the current working directory (the directory where this adapter file lives). If your assignment's frontmatter specifies a \\`workspace\\` field, read it at runtime to determine the exact boundary.\n\n> **Note:** The \\`setup-adapter\\` command does not parse assignment frontmatter for workspace paths. Workspace boundaries are resolved by the agent at runtime by reading \\`assignment.md\\` frontmatter. If no \\`workspace\\` field is set, treat the current working directory as your workspace.\n\n### Files written only via CLI (never edit directly):\n- \\`comments.md\\` (any assignment) -- use \\`syntaur comment <slug-or-uuid> \"body\" [--type question|note|feedback] [--reply-to <id>]\\`\n- Another assignment's \\`## Todos\\` section -- use \\`syntaur request <source> <target> \"text\"\\` to request cross-assignment work\n\n### Files you must NEVER write:\n1. \\`project.md\\` -- human-authored, read-only\n2. \\`manifest.md\\` -- derived, rebuilt by tooling\n3. Any file prefixed with \\`_\\` -- derived\n4. Other agents' assignment folders (except via the CLI-mediated channels above)\n5. Any files outside your workspace boundary\n\n## Assignment Lifecycle\n\n| Status | Meaning |\n|--------|---------|\n| \\`pending\\` | Not yet started |\n| \\`in_progress\\` | Actively being worked on |\n| \\`blocked\\` | Manually blocked (requires blockedReason) |\n| \\`review\\` | Work complete, awaiting review |\n| \\`completed\\` | Done |\n| \\`failed\\` | Could not be completed |\n\n## Valid State Transitions\n\n| From | Command | To |\n|------|---------|-----|\n| pending | start | in_progress |\n| pending | block | blocked |\n| in_progress | block | blocked |\n| in_progress | review | review |\n| in_progress | complete | completed |\n| in_progress | fail | failed |\n| blocked | unblock | in_progress |\n| review | start | in_progress |\n| review | complete | completed |\n| review | fail | failed |\n\n## Lifecycle Commands\n\nUse the \\`syntaur\\` CLI for state transitions and coordination:\n- \\`syntaur assign <slug> --agent <name> --project <project>\\` -- set assignee\n- \\`syntaur start <slug> --project <project>\\` -- pending -> in_progress\n- \\`syntaur review <slug> --project <project>\\` -- in_progress -> review\n- \\`syntaur complete <slug> --project <project>\\` -- in_progress/review -> completed\n- \\`syntaur block <slug> --project <project> --reason <text>\\` -- block an assignment\n- \\`syntaur unblock <slug> --project <project>\\` -- unblock\n- \\`syntaur fail <slug> --project <project>\\` -- mark as failed\n- \\`syntaur create-assignment \"Title\" [--type <type>] [--project <slug> | --one-off]\\` -- create project-nested or standalone assignment\n- \\`syntaur comment <slug-or-uuid> \"body\" --type question|note|feedback [--reply-to <id>]\\` -- append to \\`comments.md\\` (questions support resolve toggle via dashboard)\n- \\`syntaur request <source> <target> \"text\"\\` -- append a todo to another assignment's \\`## Todos\\` annotated \\`(from: <source>)\\`\n\n## Playbooks\n\nPlaybooks are user-defined behavioral rules stored in \\`~/.syntaur/playbooks/\\`. Read the playbook manifest before starting work:\n\n\\`\\`\\`bash\ncat ~/.syntaur/playbooks/manifest.md\n\\`\\`\\`\n\nFollow the rules in each playbook. They take precedence over default conventions when they conflict.\n\n## Conventions\n\n- Assignment frontmatter is the single source of truth for state. \\`project\\` is the containing project slug (\\`null\\` for standalone); \\`type\\` is a classification validated against \\`config.md\\` \\`types.definitions\\` when present.\n- Slugs are lowercase, hyphen-separated. Standalone assignment folders are named by UUID; \\`slug\\` is display-only in that case.\n- Always read \\`project.md\\` at the project level (when project-nested) before starting work.\n- Append timestamped entries to \\`progress.md\\` (never to \\`assignment.md\\`).\n- Record questions, notes, and feedback via \\`syntaur comment\\`. Never edit \\`comments.md\\` directly.\n- To route work to another assignment, use \\`syntaur request\\`.\n- Commit frequently with messages referencing the assignment slug.\n`;\n}\n\nexport function renderCursorAssignment(params: CursorAssignmentParams): string {\n return `---\ndescription: Syntaur assignment context for ${params.projectSlug}/${params.assignmentSlug}\nglobs:\nalwaysApply: true\n---\n\n# Current Assignment Context\n\n- **Project:** ${params.projectSlug}\n- **Assignment:** ${params.assignmentSlug}\n- **Project directory:** ${params.projectDir}\n- **Assignment directory:** ${params.assignmentDir}\n\n## Reading Order\n\nBefore starting work, read these files in order:\n1. \\`${params.projectDir}/project.md\\` -- project overview and goals (project-nested assignments only)\n2. \\`${params.assignmentDir}/assignment.md\\` -- your assignment details, acceptance criteria, todos, current status. Frontmatter includes \\`project: <slug> | null\\` (null for standalone) and \\`type: <classification> | null\\`.\n3. any \\`${params.assignmentDir}/plan*.md\\` files linked from active todos in the \\`## Todos\\` section (may be 0, 1, or many)\n4. \\`${params.assignmentDir}/progress.md\\` -- reverse-chron progress log (if present)\n5. \\`${params.assignmentDir}/comments.md\\` -- threaded questions/notes/feedback (if present)\n6. \\`${params.assignmentDir}/handoff.md\\` -- previous session handoff notes\n\n## Your Writable Files\n\nYou may write directly to these files inside your assignment folder:\n- \\`${params.assignmentDir}/assignment.md\\`\n- \\`${params.assignmentDir}/plan*.md\\` (0 or more versioned plan files, e.g., \\`plan.md\\`, \\`plan-v2.md\\`)\n- \\`${params.assignmentDir}/progress.md\\` (append timestamped entries, newest first)\n- \\`${params.assignmentDir}/scratchpad.md\\`\n- \\`${params.assignmentDir}/handoff.md\\`\n- \\`${params.assignmentDir}/decision-record.md\\`\n\nDo NOT edit \\`${params.assignmentDir}/comments.md\\` directly — use \\`syntaur comment\\`. Do NOT edit other assignments' files — use \\`syntaur request\\` for cross-assignment todos.\n\nAnd source code files in your workspace. Read the \\`workspace\\` field from your assignment's frontmatter to determine the exact boundary. If not set, the current working directory is your workspace.\n`;\n}\n","export interface CodexAgentsParams {\n projectSlug: string;\n assignmentSlug: string;\n projectDir: string;\n assignmentDir: string;\n}\n\nexport function renderCodexAgents(params: CodexAgentsParams): string {\n return `# Syntaur Protocol -- Agent Instructions\n\nThis project uses the Syntaur protocol for multi-agent project coordination.\n\n## Current Assignment\n\n- **Project:** ${params.projectSlug}\n- **Assignment:** ${params.assignmentSlug}\n- **Project directory:** ${params.projectDir}\n- **Assignment directory:** ${params.assignmentDir}\n\n## Preferred Workflow\n\nIf the global Syntaur Codex plugin is installed, prefer these workflows instead of ad hoc protocol edits:\n\n- \\`syntaur-operator\\` agent -- use for broad Syntaur protocol work or when a task spans multiple lifecycle steps\n- \\`syntaur-protocol\\` -- background protocol and write-boundary rules\n- \\`create-project\\` -- scaffold a project\n- \\`create-assignment\\` -- create a new assignment (use \\`--type <bug|feature|chore|...>\\` to classify; use \\`--one-off\\` to create a standalone assignment at \\`~/.syntaur/assignments/<uuid>/\\` with no parent project)\n- \\`grab-assignment\\` -- claim work, create \\`.syntaur/context.json\\`, and register a session\n- \\`plan-assignment\\` -- write a versioned plan file (\\`plan.md\\`, \\`plan-v2.md\\`, ...) and link it from the \\`## Todos\\` section of \\`assignment.md\\`\n- \\`complete-assignment\\` -- append the handoff, append a final entry to \\`progress.md\\`, close the session, and transition state\n- \\`track-session\\` -- manage tracked tmux sessions for the dashboard\n\nIf the plugin is unavailable, follow the same workflow manually with the \\`syntaur\\` CLI and keep the protocol files current yourself.\n\n## Reading Order\n\nBefore starting work, read these files in order:\n1. \\`${params.projectDir}/manifest.md\\` -- root navigation entry point (project-nested assignments only)\n2. \\`${params.projectDir}/project.md\\` -- project overview and goals (project-nested assignments only)\n3. \\`${params.assignmentDir}/assignment.md\\` -- your assignment details, acceptance criteria, todos, current status. Frontmatter now includes \\`project: <slug> | null\\` (null for standalone) and \\`type: <classification> | null\\`.\n4. any \\`${params.assignmentDir}/plan*.md\\` files linked from active todos in the \\`## Todos\\` section (may be 0, 1, or many)\n5. \\`${params.assignmentDir}/progress.md\\` -- reverse-chron progress log (if present)\n6. \\`${params.assignmentDir}/comments.md\\` -- threaded questions/notes/feedback (if present)\n7. \\`${params.assignmentDir}/handoff.md\\` -- previous session handoff notes\n\n## Context File\n\n- Treat \\`.syntaur/context.json\\` in the current working directory as the active assignment context when it exists.\n- Use that file to resolve the workspace boundary, assignment path, project path, and active session ID.\n- If there is no context file yet and you are supposed to work on an assignment, claim or set up the assignment before editing code.\n\n## Directory Structure\n\n\\`\\`\\`\n~/.syntaur/\n config.md\n projects/\n <project-slug>/\n manifest.md # Derived: root navigation (read-only)\n project.md # Human-authored: project overview (read-only)\n _index-assignments.md # Derived (read-only)\n _index-plans.md # Derived (read-only)\n _index-decisions.md # Derived (read-only)\n _status.md # Derived (read-only)\n assignments/\n <assignment-slug>/\n assignment.md # Agent-writable: source of truth for state (includes ## Todos)\n plan*.md # Agent-writable: versioned implementation plans (optional, one per ## Todos entry)\n progress.md # Agent-writable, append-only: timestamped progress log\n comments.md # CLI-mediated: threaded questions/notes/feedback (via \\`syntaur comment\\`)\n scratchpad.md # Agent-writable: working notes\n handoff.md # Agent-writable: append-only handoff log\n decision-record.md # Agent-writable: append-only decision log\n resources/\n _index.md # Derived (read-only)\n <resource-slug>.md # Shared-writable\n memories/\n _index.md # Derived (read-only)\n <memory-slug>.md # Shared-writable\n assignments/\n <assignment-id>/ # Standalone assignments — folder = UUID, \\`project: null\\`, slug display-only\n assignment.md\n plan*.md\n progress.md\n comments.md\n scratchpad.md\n handoff.md\n decision-record.md\n\\`\\`\\`\n\n## Write Boundary Rules (CRITICAL)\n\n### Files you may WRITE:\n1. **Your assignment folder** -- only the assignment you are currently working on:\n - \\`assignment.md\\`, \\`plan*.md\\` (0 or more versioned plan files), \\`progress.md\\`, \\`scratchpad.md\\`, \\`handoff.md\\`, \\`decision-record.md\\`\n - Path: \\`${params.assignmentDir}/\\`\n2. **Shared resources and memories** at the project level:\n - \\`${params.projectDir}/resources/<slug>.md\\`\n - \\`${params.projectDir}/memories/<slug>.md\\`\n3. **Your workspace** -- source code files in the current working directory (the directory where this AGENTS.md lives). If your assignment's frontmatter specifies a \\`workspace\\` field, read it at runtime to determine the exact boundary.\n\n> **Note:** Workspace boundaries are resolved by the agent at runtime by reading \\`assignment.md\\` frontmatter. If no \\`workspace\\` field is set, treat the current working directory as your workspace.\n\n### Files written only via CLI (never edit directly):\n- \\`comments.md\\` (any assignment) -- use \\`syntaur comment <slug-or-uuid> \"body\" [--type question|note|feedback] [--reply-to <id>]\\`\n- Another assignment's \\`## Todos\\` section -- use \\`syntaur request <source> <target> \"text\"\\` to request cross-assignment work\n\n### Files you must NEVER write:\n1. \\`project.md\\` -- human-authored, read-only\n2. \\`manifest.md\\` -- derived, rebuilt by tooling\n3. Any file prefixed with \\`_\\` -- derived\n4. Other agents' assignment folders (except via the CLI-mediated channels above)\n5. Any files outside your workspace boundary\n\n## Assignment Lifecycle\n\n| Status | Meaning |\n|--------|---------|\n| \\`pending\\` | Not yet started |\n| \\`in_progress\\` | Actively being worked on |\n| \\`blocked\\` | Manually blocked (requires blockedReason) |\n| \\`review\\` | Work complete, awaiting review |\n| \\`completed\\` | Done |\n| \\`failed\\` | Could not be completed |\n\n## Valid State Transitions\n\n| From | Command | To |\n|------|---------|-----|\n| pending | start | in_progress |\n| pending | block | blocked |\n| in_progress | block | blocked |\n| in_progress | review | review |\n| in_progress | complete | completed |\n| in_progress | fail | failed |\n| blocked | unblock | in_progress |\n| review | start | in_progress |\n| review | complete | completed |\n| review | fail | failed |\n\n## Lifecycle Commands\n\nUse the \\`syntaur\\` CLI for state transitions and coordination:\n- \\`syntaur assign ${params.assignmentSlug} --agent <name> --project ${params.projectSlug}\\` -- set assignee\n- \\`syntaur start ${params.assignmentSlug} --project ${params.projectSlug}\\` -- pending -> in_progress\n- \\`syntaur review ${params.assignmentSlug} --project ${params.projectSlug}\\` -- in_progress -> review\n- \\`syntaur complete ${params.assignmentSlug} --project ${params.projectSlug}\\` -- in_progress/review -> completed\n- \\`syntaur block ${params.assignmentSlug} --project ${params.projectSlug} --reason <text>\\` -- block\n- \\`syntaur unblock ${params.assignmentSlug} --project ${params.projectSlug}\\` -- unblock\n- \\`syntaur fail ${params.assignmentSlug} --project ${params.projectSlug}\\` -- mark as failed\n- \\`syntaur comment ${params.assignmentSlug} \"body\" --type question|note|feedback [--reply-to <id>]\\` -- append to \\`comments.md\\` (use for all Q&A; questions support resolve toggle)\n- \\`syntaur request ${params.assignmentSlug} <target-slug-or-uuid> \"text\"\\` -- append a todo to another assignment's \\`## Todos\\` annotated \\`(from: ${params.assignmentSlug})\\`\n\n## Troubleshooting\n\nIf Syntaur state looks inconsistent (missing files, stale manifests, unexpected hook blocks), run \\`syntaur doctor\\` to diagnose. Use \\`--json\\` for structured output.\n\n## Playbooks\n\nPlaybooks are user-defined behavioral rules stored in \\`~/.syntaur/playbooks/\\`. Before starting work, read the playbook manifest and then each referenced playbook:\n\n\\`\\`\\`bash\ncat ~/.syntaur/playbooks/manifest.md\n\\`\\`\\`\n\nRead each linked playbook and follow the rules in its body section. The \\`when_to_use\\` field tells you when each playbook applies. Playbooks take precedence over default conventions when they conflict.\n\n## Conventions\n\n- Assignment frontmatter is the single source of truth for state. \\`project\\` is the containing project slug (\\`null\\` for standalone); \\`type\\` is a classification validated against \\`config.md\\` \\`types.definitions\\` when present.\n- Slugs are lowercase, hyphen-separated. For standalone assignments, \\`slug\\` is display-only; the folder is named by the UUID.\n- Always read \\`project.md\\` at the project level (when project-nested) before starting work.\n- Keep \\`assignment.md\\` acceptance criteria and \\`## Todos\\` updated as work lands; append timestamped entries to \\`progress.md\\` (never to \\`assignment.md\\`).\n- Keep active plan file(s) current after planning changes and \\`handoff.md\\` current before leaving the task.\n- When requirements shift, supersede the prior plan todo (\\`- [x] ~~...~~ (superseded by plan-v<N>)\\`) and write a new plan file instead of rewriting the old one.\n- Record questions, notes, and feedback via \\`syntaur comment\\`. Never edit \\`comments.md\\` directly. Resolve questions via the dashboard UI (toggle on the question entry).\n- To route work to another assignment, use \\`syntaur request\\`.\n- Commit frequently with messages referencing the assignment slug.\n`;\n}\n","export interface OpenCodeConfigParams {\n projectDir: string;\n}\n\nexport function renderOpenCodeConfig(params: OpenCodeConfigParams): string {\n const config = {\n instructions: [\n `Read AGENTS.md in this directory for Syntaur protocol (v2.0) instructions.`,\n `Read ${params.projectDir}/project.md for project overview (project-nested assignments only).`,\n `Append timestamped progress entries to the assignment's progress.md (not to assignment.md).`,\n `Use 'syntaur comment <slug-or-uuid> \"body\" --type question|note|feedback' to append to comments.md — never edit it directly.`,\n `Use 'syntaur request <source> <target> \"text\"' to append a todo to another assignment's ## Todos.`,\n `Assignment folders are project-nested at ~/.syntaur/projects/<slug>/assignments/<aslug>/ or standalone at ~/.syntaur/assignments/<uuid>/ (project: null, slug display-only).`,\n ],\n };\n return JSON.stringify(config, null, 2) + '\\n';\n}\n","import { resolve } from 'node:path';\nimport { slugify, isValidSlug } from '../utils/slug.js';\nimport { nowTimestamp } from '../utils/timestamp.js';\nimport { generateId } from '../utils/uuid.js';\nimport { expandHome, assignmentsDir as assignmentsDirFn } from '../utils/paths.js';\nimport { ensureDir, writeFileForce, fileExists } from '../utils/fs.js';\nimport { readConfig } from '../utils/config.js';\nimport {\n renderAssignment,\n renderScratchpad,\n renderHandoff,\n renderDecisionRecord,\n renderProgress,\n renderComments,\n} from '../templates/index.js';\n\nexport interface CreateAssignmentOptions {\n project?: string;\n oneOff?: boolean;\n slug?: string;\n priority?: 'low' | 'medium' | 'high' | 'critical';\n dependsOn?: string;\n links?: string;\n dir?: string;\n type?: string;\n}\n\nexport async function createAssignmentCommand(\n title: string,\n options: CreateAssignmentOptions,\n): Promise<void> {\n if (!title.trim()) {\n throw new Error('Assignment title cannot be empty.');\n }\n\n if (!options.project && !options.oneOff) {\n throw new Error(\n 'Either --project <slug> or --one-off is required.',\n );\n }\n if (options.project && options.oneOff) {\n throw new Error(\n 'Cannot use both --project and --one-off. Use --project to add to an existing project, or --one-off to create a standalone assignment.',\n );\n }\n\n if (options.project && !isValidSlug(options.project)) {\n throw new Error(\n `Invalid project slug \"${options.project}\". Slugs must be lowercase, hyphen-separated, with no special characters.`,\n );\n }\n\n if (options.oneOff && options.dependsOn) {\n throw new Error('Standalone assignments cannot have dependencies (--depends-on is not allowed with --one-off).');\n }\n\n const assignmentSlug = options.slug || slugify(title);\n if (!isValidSlug(assignmentSlug)) {\n throw new Error(\n `Invalid slug \"${assignmentSlug}\". Slugs must be lowercase, hyphen-separated, with no special characters.`,\n );\n }\n\n const dependsOn = options.dependsOn\n ? options.dependsOn.split(',').map((s) => s.trim()).filter(Boolean)\n : [];\n for (const dep of dependsOn) {\n if (!isValidSlug(dep)) {\n throw new Error(\n `Invalid dependency slug \"${dep}\". Slugs must be lowercase, hyphen-separated, with no special characters.`,\n );\n }\n }\n\n const links = options.links\n ? options.links.split(',').map((s) => s.trim()).filter(Boolean)\n : [];\n for (const link of links) {\n const parts = link.split('/');\n if (parts.length !== 2 || !parts.every(isValidSlug)) {\n throw new Error(\n `Invalid link \"${link}\". Links must be in projectSlug/assignmentSlug format (e.g., \"my-project/my-assignment\").`,\n );\n }\n }\n\n const validPriorities = ['low', 'medium', 'high', 'critical'] as const;\n const priority = (options.priority || 'medium') as typeof validPriorities[number];\n if (!validPriorities.includes(priority)) {\n throw new Error(\n `Invalid priority \"${options.priority}\". Must be one of: ${validPriorities.join(', ')}`,\n );\n }\n\n const config = await readConfig();\n const timestamp = nowTimestamp();\n const id = generateId();\n\n let assignmentDir: string;\n let projectSlug: string | null;\n let folderName: string;\n\n if (options.oneOff) {\n // Standalone: folder name = UUID, project: null\n const standaloneRoot = assignmentsDirFn();\n folderName = id;\n assignmentDir = resolve(standaloneRoot, folderName);\n projectSlug = null;\n await ensureDir(standaloneRoot);\n } else {\n const baseDir = options.dir\n ? expandHome(options.dir)\n : config.defaultProjectDir;\n projectSlug = options.project!;\n const projectDir = resolve(baseDir, projectSlug);\n\n const projectMdPath = resolve(projectDir, 'project.md');\n if (!(await fileExists(projectDir)) || !(await fileExists(projectMdPath))) {\n throw new Error(\n `Project \"${projectSlug}\" not found at ${projectDir}.\\nRun 'syntaur create-project' first or use --one-off.`,\n );\n }\n\n if (dependsOn.length > 0) {\n const depDirBase = resolve(projectDir, 'assignments');\n for (const dep of dependsOn) {\n const depDir = resolve(depDirBase, dep);\n if (!(await fileExists(depDir))) {\n console.warn(\n `Warning: dependency \"${dep}\" does not exist in project \"${projectSlug}\" yet.`,\n );\n }\n }\n }\n\n folderName = assignmentSlug;\n assignmentDir = resolve(projectDir, 'assignments', folderName);\n }\n\n if (await fileExists(assignmentDir)) {\n throw new Error(\n `Assignment folder already exists: ${assignmentDir}\\nUse --slug to specify a different slug.`,\n );\n }\n\n await ensureDir(assignmentDir);\n\n const companionAssignmentRef = projectSlug === null ? id : assignmentSlug;\n\n const files: Array<[string, string]> = [\n [\n resolve(assignmentDir, 'assignment.md'),\n renderAssignment({\n id,\n slug: assignmentSlug,\n title,\n timestamp,\n priority,\n dependsOn,\n links,\n project: projectSlug,\n type: options.type,\n }),\n ],\n [\n resolve(assignmentDir, 'scratchpad.md'),\n renderScratchpad({\n assignmentSlug: companionAssignmentRef,\n timestamp,\n }),\n ],\n [\n resolve(assignmentDir, 'handoff.md'),\n renderHandoff({\n assignmentSlug: companionAssignmentRef,\n timestamp,\n }),\n ],\n [\n resolve(assignmentDir, 'decision-record.md'),\n renderDecisionRecord({\n assignmentSlug: companionAssignmentRef,\n timestamp,\n }),\n ],\n [\n resolve(assignmentDir, 'progress.md'),\n renderProgress({\n assignment: companionAssignmentRef,\n timestamp,\n }),\n ],\n [\n resolve(assignmentDir, 'comments.md'),\n renderComments({\n assignment: companionAssignmentRef,\n timestamp,\n }),\n ],\n ];\n\n for (const [filePath, content] of files) {\n await writeFileForce(filePath, content);\n }\n\n if (projectSlug === null) {\n console.log(\n `Created standalone assignment \"${title}\" at ${assignmentDir}/`,\n );\n console.log(` UUID: ${id}`);\n console.log(` Slug: ${assignmentSlug} (display only)`);\n } else {\n console.log(\n `Created assignment \"${title}\" in project \"${projectSlug}\" at ${assignmentDir}/`,\n );\n console.log(` Slug: ${assignmentSlug}`);\n }\n console.log(` Priority: ${priority}`);\n if (options.type) {\n console.log(` Type: ${options.type}`);\n }\n if (dependsOn.length > 0) {\n console.log(` Depends on: ${dependsOn.join(', ')}`);\n }\n if (links.length > 0) {\n console.log(` Links: ${links.join(', ')}`);\n }\n console.log(` Files created:`);\n console.log(` assignment.md`);\n console.log(` scratchpad.md`);\n console.log(` handoff.md`);\n console.log(` decision-record.md`);\n console.log(` progress.md`);\n console.log(` comments.md`);\n console.log(\n ` Plan files (plan.md, plan-v2.md, ...) are created on demand by /plan-assignment.`,\n );\n}\n","import { spawn, type ChildProcess } from 'node:child_process';\nimport { createServer as createNetServer } from 'node:net';\nimport { resolve, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { readConfig } from '../utils/config.js';\nimport { createDashboardServer } from '../dashboard/server.js';\nimport { serversDir as getServersDir, playbooksDir as getPlaybooksDir, todosDir as getTodosDir, assignmentsDir as getAssignmentsDir } from '../utils/paths.js';\nimport { fileExists } from '../utils/fs.js';\n\nexport interface DashboardOptions {\n port: string;\n dev?: boolean;\n serverOnly?: boolean;\n apiOnly: boolean;\n open: boolean;\n autoPort?: boolean;\n}\n\nexport type DashboardRuntimeMode = 'static' | 'dev' | 'server-only';\n\nexport function didUserSpecifyDashboardPort(argv: string[] = process.argv): boolean {\n return argv.some((arg) => arg === '--port' || arg.startsWith('--port='));\n}\n\nexport function resolveDashboardMode(options: DashboardOptions): DashboardRuntimeMode {\n const devMode = Boolean(options.dev);\n const serverOnly = Boolean(options.serverOnly || options.apiOnly);\n\n if (devMode && serverOnly) {\n throw new Error('Use either --dev or --server-only, not both.');\n }\n\n if (devMode) {\n return 'dev';\n }\n\n if (serverOnly) {\n return 'server-only';\n }\n\n return 'static';\n}\n\nasync function isPortAvailable(port: number): Promise<boolean> {\n return new Promise((resolveAvailability) => {\n const tester = createNetServer();\n\n tester.once('error', () => {\n resolveAvailability(false);\n });\n\n tester.once('listening', () => {\n tester.close(() => resolveAvailability(true));\n });\n\n tester.listen(port);\n });\n}\n\nexport async function findAvailablePort(\n startPort: number,\n maxAttempts: number = 20,\n): Promise<number | null> {\n for (let offset = 0; offset < maxAttempts; offset += 1) {\n const candidate = startPort + offset;\n if (candidate > 65535) {\n break;\n }\n if (await isPortAvailable(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nexport async function dashboardCommand(options: DashboardOptions): Promise<void> {\n const config = await readConfig();\n const projectsDir = config.defaultProjectDir;\n const requestedPort = parseInt(options.port, 10);\n\n if (isNaN(requestedPort) || requestedPort < 1 || requestedPort > 65535) {\n throw new Error(`Invalid port \"${options.port}\". Must be a number between 1 and 65535.`);\n }\n\n const mode = resolveDashboardMode(options);\n let port = requestedPort;\n\n if (options.autoPort) {\n const availablePort = await findAvailablePort(requestedPort);\n if (availablePort === null) {\n throw new Error(\n `Could not find an available dashboard port starting at ${requestedPort}. Run \"syntaur dashboard --port <number>\" to choose one manually.`,\n );\n }\n if (availablePort !== requestedPort) {\n console.log(`Port ${requestedPort} is busy. Launching the dashboard on port ${availablePort} instead.`);\n }\n port = availablePort;\n }\n\n // Compute the dashboard dist path relative to this file's location.\n // After tsup bundling, import.meta.url resolves to dist/index.js so we\n // go one level up to the package root, then into dashboard/dist.\n const thisFile = fileURLToPath(import.meta.url);\n const packageRoot = resolve(dirname(thisFile), '..');\n const dashboardDist = resolve(packageRoot, 'dashboard', 'dist');\n\n const server = createDashboardServer({\n port,\n projectsDir,\n assignmentsDir: getAssignmentsDir(),\n serversDir: getServersDir(),\n playbooksDir: getPlaybooksDir(),\n todosDir: getTodosDir(),\n serveStaticUi: mode === 'static',\n dashboardDistPath: dashboardDist,\n });\n\n await server.start();\n\n let viteProcess: ChildProcess | null = null;\n\n if (mode === 'dev') {\n const dashboardDir = resolve(packageRoot, 'dashboard');\n const viteBin = resolve(dashboardDir, 'node_modules', '.bin', 'vite');\n\n if (!(await fileExists(viteBin))) {\n console.error(\n 'Vite not found. Run \"npm ci --prefix dashboard\" first, or use the default bundled dashboard mode.',\n );\n await server.stop();\n process.exit(1);\n }\n\n console.log(`API server running on http://localhost:${port}`);\n console.log('Starting Vite dev server...');\n\n viteProcess = spawn(viteBin, [], {\n cwd: dashboardDir,\n env: {\n ...process.env,\n VITE_API_PORT: String(port),\n },\n stdio: 'inherit',\n });\n\n viteProcess.on('error', (err) => {\n console.error('Failed to start Vite dev server:', err.message);\n });\n } else if (mode === 'server-only') {\n const url = `http://localhost:${port}`;\n console.log(`Syntaur Dashboard API running at ${url}`);\n } else {\n const url = `http://localhost:${port}`;\n console.log(`Syntaur Dashboard running at ${url}`);\n\n if (options.open) {\n try {\n const openModule = await import('open');\n await openModule.default(url);\n } catch {\n console.log(`Open ${url} in your browser to view the dashboard.`);\n }\n }\n }\n\n // Keep the process running\n let shuttingDown = false;\n const forceExit = () => {\n console.log('\\nForce exit.');\n if (viteProcess) {\n try { viteProcess.kill('SIGKILL'); } catch {}\n }\n process.exit(1);\n };\n const shutdown = async () => {\n if (shuttingDown) {\n forceExit();\n return;\n }\n shuttingDown = true;\n console.log('\\nShutting down dashboard... (press Ctrl+C again to force)');\n if (viteProcess) {\n viteProcess.kill();\n }\n try {\n await server.stop();\n } catch (err) {\n console.error('Error during shutdown:', err);\n }\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n","import express from 'express';\nimport { createServer } from 'node:http';\nimport { resolve } from 'node:path';\nimport { writeFile, unlink } from 'node:fs/promises';\nimport { syntaurRoot } from '../utils/paths.js';\nimport { WebSocketServer, WebSocket } from 'ws';\nimport {\n listProjects,\n listAssignmentsBoard,\n getProjectDetail,\n getAssignmentDetail,\n getAssignmentDetailById,\n getOverview,\n getAttention,\n getHelp,\n getStatusConfig,\n clearStatusConfigCache,\n listWorkspaces,\n createWorkspace,\n deleteWorkspace,\n} from './api.js';\nimport { resolveAssignmentById } from '../utils/assignment-resolver.js';\nimport { listSessionsByAssignment, reconcileActiveSessions } from './agent-sessions.js';\nimport { createWatcher } from './watcher.js';\nimport { fileExists } from '../utils/fs.js';\nimport { writeStatusConfig, deleteStatusConfig } from '../utils/config.js';\nimport { createWriteRouter } from './api-write.js';\nimport { createServersRouter } from './api-servers.js';\nimport { createAgentSessionsRouter } from './api-agent-sessions.js';\nimport { createPlaybooksRouter } from './api-playbooks.js';\nimport {\n migrateLegacyProjectFiles,\n migrateLegacyConfig,\n summarizeMigration,\n} from '../utils/fs-migration.js';\nimport { createTodosRouter } from './api-todos.js';\nimport { createBackupRouter } from './api-backup.js';\nimport { initSessionDb, migrateFromMarkdown, closeSessionDb } from './session-db.js';\nimport { startAutodiscovery, stopAutodiscovery } from './autodiscovery.js';\nimport type { WsMessage } from './types.js';\n\nexport interface DashboardServerOptions {\n port: number;\n projectsDir: string;\n /**\n * Absolute path to the standalone assignments directory (`~/.syntaur/assignments/`).\n * Standalone assignments have `project: null` and live in folders named by UUID.\n */\n assignmentsDir: string;\n serversDir: string;\n playbooksDir: string;\n todosDir: string;\n serveStaticUi: boolean;\n /** Absolute path to the built dashboard UI (dashboard/dist). Required when serveStaticUi is true. */\n dashboardDistPath?: string;\n}\n\nexport function createDashboardServer(options: DashboardServerOptions) {\n const { port, projectsDir, assignmentsDir, serversDir, playbooksDir, todosDir, serveStaticUi, dashboardDistPath } = options;\n const app = express();\n const server = createServer(app);\n\n // --- WebSocket ---\n const wss = new WebSocketServer({ noServer: true });\n const clients = new Set<WebSocket>();\n\n server.on('upgrade', (request, socket, head) => {\n if (request.url === '/ws') {\n wss.handleUpgrade(request, socket, head, (ws) => {\n wss.emit('connection', ws, request);\n });\n } else {\n socket.destroy();\n }\n });\n\n wss.on('connection', (ws) => {\n clients.add(ws);\n const connectMsg: WsMessage = {\n type: 'connected',\n timestamp: new Date().toISOString(),\n };\n ws.send(JSON.stringify(connectMsg));\n\n ws.on('close', () => {\n clients.delete(ws);\n });\n });\n\n function broadcast(message: WsMessage): void {\n const data = JSON.stringify(message);\n for (const client of clients) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(data);\n }\n }\n }\n\n // --- Initialize session database ---\n initSessionDb();\n migrateFromMarkdown(projectsDir).catch((err) => {\n console.error('Session migration from markdown failed:', err);\n });\n\n // --- One-shot legacy filesystem migration (pre-v0.2.0 → v0.2.0+) ---\n // Idempotent, non-destructive, reports what it did. Run in the background\n // so startup isn't gated on filesystem work.\n (async () => {\n try {\n const configResult = await migrateLegacyConfig(\n resolve(syntaurRoot(), 'config.md'),\n );\n const projectResult = await migrateLegacyProjectFiles(projectsDir);\n const summary = summarizeMigration(projectResult, configResult);\n if (summary) console.log(summary);\n } catch (err) {\n console.error('Legacy filesystem migration failed:', err);\n }\n })();\n\n // --- JSON body parsing ---\n app.use(express.json());\n\n // --- API Routes ---\n app.get('/api/overview', async (_req, res) => {\n try {\n const overview = await getOverview(projectsDir, serversDir, assignmentsDir);\n res.json(overview);\n } catch (error) {\n console.error('Error getting overview:', error);\n res.status(500).json({ error: 'Failed to get overview' });\n }\n });\n\n app.get('/api/attention', async (_req, res) => {\n try {\n const attention = await getAttention(projectsDir, serversDir, assignmentsDir);\n res.json(attention);\n } catch (error) {\n console.error('Error getting attention queue:', error);\n res.status(500).json({ error: 'Failed to get attention queue' });\n }\n });\n\n app.get('/api/help', async (_req, res) => {\n try {\n const help = await getHelp();\n res.json(help);\n } catch (error) {\n console.error('Error getting help content:', error);\n res.status(500).json({ error: 'Failed to get help content' });\n }\n });\n\n app.get('/api/config/statuses', async (_req, res) => {\n try {\n const config = await getStatusConfig();\n res.json({\n statuses: config.statuses,\n order: config.order,\n transitions: config.transitions,\n custom: config.custom,\n });\n } catch (error) {\n console.error('Error getting status config:', error);\n res.status(500).json({ error: 'Failed to get status config' });\n }\n });\n\n app.post('/api/config/statuses', async (req, res) => {\n try {\n const { statuses, order, transitions } = req.body;\n if (!Array.isArray(statuses) || !Array.isArray(order) || !Array.isArray(transitions)) {\n res.status(400).json({ error: 'Request body must include statuses, order, and transitions arrays' });\n return;\n }\n await writeStatusConfig({ statuses, order, transitions });\n clearStatusConfigCache();\n const config = await getStatusConfig();\n res.json({\n statuses: config.statuses,\n order: config.order,\n transitions: config.transitions,\n custom: config.custom,\n });\n } catch (error) {\n console.error('Error saving status config:', error);\n res.status(500).json({ error: 'Failed to save status config' });\n }\n });\n\n app.delete('/api/config/statuses', async (_req, res) => {\n try {\n await deleteStatusConfig();\n clearStatusConfigCache();\n const config = await getStatusConfig();\n res.json({\n statuses: config.statuses,\n order: config.order,\n transitions: config.transitions,\n custom: config.custom,\n });\n } catch (error) {\n console.error('Error resetting status config:', error);\n res.status(500).json({ error: 'Failed to reset status config' });\n }\n });\n\n app.get('/api/projects', async (req, res) => {\n try {\n let projects = await listProjects(projectsDir);\n const workspaceParam = req.query.workspace as string | undefined;\n if (workspaceParam) {\n if (workspaceParam === '_ungrouped') {\n projects = projects.filter((m) => m.workspace === null);\n } else {\n projects = projects.filter((m) => m.workspace === workspaceParam);\n }\n }\n res.json(projects);\n } catch (error) {\n console.error('Error listing projects:', error);\n res.status(500).json({ error: 'Failed to list projects' });\n }\n });\n\n app.get('/api/workspaces', async (_req, res) => {\n try {\n const result = await listWorkspaces(projectsDir);\n res.json(result);\n } catch (error) {\n console.error('Error listing workspaces:', error);\n res.status(500).json({ error: 'Failed to list workspaces' });\n }\n });\n\n app.post('/api/workspaces', async (req, res) => {\n try {\n const { name } = req.body;\n if (!name || typeof name !== 'string' || !/^[a-z0-9][a-z0-9-]*$/.test(name)) {\n res.status(400).json({ error: 'Invalid workspace name. Use lowercase letters, numbers, and hyphens.' });\n return;\n }\n await createWorkspace(projectsDir, name);\n broadcast({ type: 'project-updated', projectSlug: '', timestamp: new Date().toISOString() });\n res.json({ name });\n } catch (error) {\n console.error('Error creating workspace:', error);\n res.status(500).json({ error: 'Failed to create workspace' });\n }\n });\n\n app.delete('/api/workspaces/:name', async (req, res) => {\n try {\n await deleteWorkspace(projectsDir, req.params.name);\n broadcast({ type: 'project-updated', projectSlug: '', timestamp: new Date().toISOString() });\n res.json({ ok: true });\n } catch (error) {\n console.error('Error deleting workspace:', error);\n res.status(500).json({ error: 'Failed to delete workspace' });\n }\n });\n\n app.get('/api/assignments', async (req, res) => {\n try {\n const result = await listAssignmentsBoard(projectsDir, assignmentsDir);\n const workspaceParam = req.query.workspace as string | undefined;\n if (workspaceParam) {\n if (workspaceParam === '_ungrouped') {\n result.assignments = result.assignments.filter((a) => a.projectWorkspace === null);\n } else {\n result.assignments = result.assignments.filter((a) => a.projectWorkspace === workspaceParam);\n }\n }\n res.json(result);\n } catch (error) {\n console.error('Error listing assignments:', error);\n res.status(500).json({ error: 'Failed to list assignments' });\n }\n });\n\n app.get('/api/projects/:slug', async (req, res) => {\n try {\n const detail = await getProjectDetail(projectsDir, req.params.slug);\n if (!detail) {\n res.status(404).json({ error: `Project \"${req.params.slug}\" not found` });\n return;\n }\n res.json(detail);\n } catch (error) {\n console.error('Error getting project detail:', error);\n res.status(500).json({ error: 'Failed to get project detail' });\n }\n });\n\n app.get('/api/assignments/:id', async (req, res) => {\n try {\n const detail = await getAssignmentDetailById(projectsDir, assignmentsDir, req.params.id);\n if (!detail) {\n res.status(404).json({ error: `Assignment \"${req.params.id}\" not found` });\n return;\n }\n res.json(detail);\n } catch (error) {\n console.error('Error getting assignment by id:', error);\n res.status(500).json({ error: 'Failed to get assignment' });\n }\n });\n\n app.get('/api/assignments/:id/sessions', async (req, res) => {\n try {\n const resolved = await resolveAssignmentById(projectsDir, assignmentsDir, req.params.id);\n if (!resolved) {\n res.status(404).json({ error: `Assignment \"${req.params.id}\" not found` });\n return;\n }\n await reconcileActiveSessions(projectsDir, assignmentsDir);\n const sessions = await listSessionsByAssignment(\n resolved.standalone ? null : resolved.projectSlug,\n resolved.standalone ? resolved.id : resolved.assignmentSlug,\n );\n res.json({ sessions, generatedAt: new Date().toISOString() });\n } catch (error) {\n console.error('Error listing sessions by id:', error);\n res.status(500).json({ error: 'Failed to list sessions' });\n }\n });\n\n app.get('/api/projects/:slug/assignments/:aslug', async (req, res) => {\n try {\n const detail = await getAssignmentDetail(\n projectsDir,\n req.params.slug,\n req.params.aslug,\n );\n if (!detail) {\n res.status(404).json({\n error: `Assignment \"${req.params.aslug}\" not found in project \"${req.params.slug}\"`,\n });\n return;\n }\n res.json(detail);\n } catch (error) {\n console.error('Error getting assignment detail:', error);\n res.status(500).json({ error: 'Failed to get assignment detail' });\n }\n });\n\n // --- Write API (create projects/assignments) ---\n app.use(createWriteRouter(projectsDir, assignmentsDir));\n\n // --- Servers API ---\n app.use('/api/servers', createServersRouter(serversDir, projectsDir, assignmentsDir));\n\n // --- Agent Sessions API ---\n app.use('/api/agent-sessions', createAgentSessionsRouter(projectsDir, broadcast, assignmentsDir));\n\n // --- Playbooks API ---\n app.use('/api/playbooks', createPlaybooksRouter(playbooksDir));\n\n // --- Todos API ---\n app.use('/api/todos', createTodosRouter(todosDir, broadcast));\n\n // --- Backup API ---\n app.use('/api/backup', createBackupRouter());\n\n // --- Static files (production only) ---\n if (serveStaticUi && dashboardDistPath) {\n app.use(express.static(dashboardDistPath));\n\n // SPA fallback: serve index.html for all non-API routes\n // Express 5 requires named wildcards; use '{*path}' instead of '*'\n app.get('{*path}', async (_req: any, res: any) => {\n const indexPath = resolve(dashboardDistPath, 'index.html');\n if (await fileExists(indexPath)) {\n res.sendFile(indexPath);\n } else {\n res.status(503).send(\n 'Dashboard not built. Run \"npm run build:dashboard\" first.',\n );\n }\n });\n }\n\n // --- File watcher ---\n let watcherHandle: { close: () => Promise<void> } | null = null;\n\n return {\n async start(): Promise<void> {\n watcherHandle = createWatcher({\n projectsDir,\n assignmentsDir,\n serversDir,\n playbooksDir,\n todosDir,\n onMessage: broadcast,\n });\n\n startAutodiscovery({ serversDir, projectsDir, assignmentsDir, excludePids: new Set([process.pid]) });\n\n return new Promise<void>((resolvePromise, reject) => {\n server.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n reject(new Error(\n `Port ${port} is already in use. Use --port <number> to specify a different port.`,\n ));\n } else {\n reject(err);\n }\n });\n server.listen(port, () => {\n const portFile = resolve(syntaurRoot(), 'dashboard-port');\n writeFile(portFile, String(port), 'utf-8').catch(() => {});\n resolvePromise();\n });\n });\n },\n\n async stop(): Promise<void> {\n await stopAutodiscovery();\n if (watcherHandle) {\n await watcherHandle.close();\n }\n closeSessionDb();\n for (const client of clients) {\n client.terminate();\n }\n clients.clear();\n const portFile = resolve(syntaurRoot(), 'dashboard-port');\n await unlink(portFile).catch(() => {});\n server.closeAllConnections?.();\n return new Promise<void>((resolvePromise) => {\n server.close(() => resolvePromise());\n });\n },\n\n get port(): number {\n return port;\n },\n };\n}\n","import { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { fileExists } from '../utils/fs.js';\nimport { getSessionDb } from './session-db.js';\nimport type { AgentSession, AgentSessionStatus } from './types.js';\n\ninterface SessionRow {\n session_id: string;\n project_slug: string | null;\n assignment_slug: string | null;\n agent: string;\n started: string;\n ended: string | null;\n status: string;\n path: string | null;\n description: string | null;\n transcript_path: string | null;\n}\n\nfunction rowToSession(row: SessionRow): AgentSession {\n return {\n sessionId: row.session_id,\n projectSlug: row.project_slug ?? null,\n assignmentSlug: row.assignment_slug ?? null,\n agent: row.agent,\n started: row.started,\n ended: row.ended ?? null,\n status: row.status as AgentSessionStatus,\n path: row.path ?? '',\n description: row.description ?? null,\n transcriptPath: row.transcript_path ?? null,\n };\n}\n\n/**\n * Query sessions for a specific project.\n */\nexport async function parseSessionsIndex(\n _projectDir: string,\n projectSlug: string,\n): Promise<AgentSession[]> {\n const db = getSessionDb();\n const rows = db\n .prepare('SELECT * FROM sessions WHERE project_slug = ? ORDER BY started DESC')\n .all(projectSlug) as SessionRow[];\n return rows.map(rowToSession);\n}\n\n/**\n * Upsert a session keyed on `session_id`.\n *\n * On conflict, non-null fields in the new payload fill in missing values on the\n * existing row (COALESCE). `started` / `created_at` from the first insert are\n * preserved. A session already in a terminal state (`completed` / `stopped`)\n * is NOT revived by re-registration — status only moves forward.\n *\n * Makes registration idempotent across SessionStart hooks, `/track-session`,\n * and grab-assignment all touching the same real session ID.\n */\nexport async function appendSession(\n _projectDir: string,\n session: AgentSession,\n): Promise<void> {\n const db = getSessionDb();\n db.prepare(`\n INSERT INTO sessions (session_id, project_slug, assignment_slug, agent, started, status, path, description, transcript_path)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(session_id) DO UPDATE SET\n project_slug = COALESCE(NULLIF(excluded.project_slug, ''), project_slug),\n assignment_slug = COALESCE(NULLIF(excluded.assignment_slug, ''), assignment_slug),\n agent = excluded.agent,\n status = CASE WHEN status IN ('completed','stopped') THEN status ELSE excluded.status END,\n path = COALESCE(NULLIF(excluded.path, ''), path),\n description = COALESCE(NULLIF(excluded.description, ''), description),\n transcript_path = COALESCE(NULLIF(excluded.transcript_path, ''), transcript_path),\n updated_at = datetime('now')\n `).run(\n session.sessionId,\n session.projectSlug ?? null,\n session.assignmentSlug ?? null,\n session.agent,\n session.started,\n session.status,\n session.path,\n session.description ?? null,\n session.transcriptPath ?? null,\n );\n}\n\n/**\n * Update a session's status by sessionId.\n * Sets `ended` timestamp for terminal statuses (completed, stopped).\n */\nexport async function updateSessionStatus(\n _projectDir: string,\n sessionId: string,\n status: AgentSessionStatus,\n): Promise<boolean> {\n const db = getSessionDb();\n const isTerminal = status === 'completed' || status === 'stopped';\n\n const result = isTerminal\n ? db\n .prepare(\n 'UPDATE sessions SET status = ?, ended = datetime(\\'now\\'), updated_at = datetime(\\'now\\') WHERE session_id = ?',\n )\n .run(status, sessionId)\n : db\n .prepare(\n 'UPDATE sessions SET status = ?, updated_at = datetime(\\'now\\') WHERE session_id = ?',\n )\n .run(status, sessionId);\n\n return result.changes > 0;\n}\n\n/**\n * List all sessions across all projects.\n */\nexport async function listAllSessions(_projectsDir: string): Promise<AgentSession[]> {\n const db = getSessionDb();\n const rows = db\n .prepare('SELECT * FROM sessions ORDER BY started DESC')\n .all() as SessionRow[];\n return rows.map(rowToSession);\n}\n\n/**\n * List sessions for a specific project, optionally filtered by assignment.\n */\nexport async function listProjectSessions(\n _projectsDir: string,\n projectSlug: string,\n assignmentSlug?: string,\n): Promise<AgentSession[]> {\n const db = getSessionDb();\n\n if (assignmentSlug) {\n const rows = db\n .prepare(\n 'SELECT * FROM sessions WHERE project_slug = ? AND assignment_slug = ? ORDER BY started DESC',\n )\n .all(projectSlug, assignmentSlug) as SessionRow[];\n return rows.map(rowToSession);\n }\n\n const rows = db\n .prepare('SELECT * FROM sessions WHERE project_slug = ? ORDER BY started DESC')\n .all(projectSlug) as SessionRow[];\n return rows.map(rowToSession);\n}\n\n/**\n * Delete sessions by their IDs. Returns the number of rows deleted.\n */\nexport async function deleteSessions(sessionIds: string[]): Promise<number> {\n if (sessionIds.length === 0) return 0;\n const db = getSessionDb();\n const placeholders = sessionIds.map(() => '?').join(', ');\n const result = db\n .prepare(`DELETE FROM sessions WHERE session_id IN (${placeholders})`)\n .run(...sessionIds);\n return result.changes;\n}\n\n// Statuses that imply the working session is done (review means agent finished)\nconst DONE_ASSIGNMENT_STATUSES = new Set(['completed', 'failed', 'review']);\n\n/**\n * Read the status field from an assignment.md frontmatter without full parsing.\n */\nasync function readAssignmentStatusFromPath(\n assignmentMdPath: string,\n): Promise<string | null> {\n if (!(await fileExists(assignmentMdPath))) return null;\n const raw = await readFile(assignmentMdPath, 'utf-8');\n const match = raw.match(/^status:\\s*(.+)$/m);\n return match ? match[1].trim() : null;\n}\n\nasync function readAssignmentStatus(\n projectDir: string,\n assignmentSlug: string,\n): Promise<string | null> {\n return readAssignmentStatusFromPath(\n resolve(projectDir, 'assignments', assignmentSlug, 'assignment.md'),\n );\n}\n\n/**\n * Reconcile active sessions against assignment statuses.\n * Sessions whose assignments have moved to completed/failed/review are\n * marked as completed (or stopped for failed assignments).\n * Standalone sessions (project_slug NULL) are resolved via assignmentsDir.\n * Returns the number of sessions that were updated.\n */\nexport async function reconcileActiveSessions(\n projectsDir: string,\n assignmentsDir?: string,\n): Promise<number> {\n const db = getSessionDb();\n\n // Include standalone sessions (project_slug NULL) when assignmentsDir is provided.\n const activeSessions = db\n .prepare('SELECT * FROM sessions WHERE status = \\'active\\' AND assignment_slug IS NOT NULL')\n .all() as SessionRow[];\n\n if (activeSessions.length === 0) return 0;\n\n // Read assignment statuses from disk. Key is `${projectSlug ?? '__standalone__'}/${slug}`.\n const assignmentStatuses = new Map<string, string>();\n const seen = new Set<string>();\n for (const session of activeSessions) {\n const aslug = session.assignment_slug;\n if (!aslug) continue;\n\n const projectKey = session.project_slug ?? '__standalone__';\n const key = `${projectKey}/${aslug}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n if (session.project_slug) {\n const status = await readAssignmentStatus(\n resolve(projectsDir, session.project_slug),\n aslug,\n );\n if (status) assignmentStatuses.set(key, status);\n } else if (assignmentsDir) {\n const status = await readAssignmentStatusFromPath(\n resolve(assignmentsDir, aslug, 'assignment.md'),\n );\n if (status) assignmentStatuses.set(key, status);\n }\n }\n\n // Update stale sessions\n let totalUpdated = 0;\n for (const session of activeSessions) {\n const projectKey = session.project_slug ?? '__standalone__';\n const key = `${projectKey}/${session.assignment_slug}`;\n const assignmentStatus = assignmentStatuses.get(key);\n if (!assignmentStatus || !DONE_ASSIGNMENT_STATUSES.has(assignmentStatus)) continue;\n\n const newStatus: AgentSessionStatus =\n assignmentStatus === 'failed' ? 'stopped' : 'completed';\n await updateSessionStatus('', session.session_id, newStatus);\n totalUpdated++;\n }\n\n return totalUpdated;\n}\n\n/**\n * List sessions for a resolved assignment (standalone or project-nested).\n * Standalone: filter by assignment_slug = id AND project_slug IS NULL.\n * Project-nested: filter by project_slug + assignment_slug.\n */\nexport async function listSessionsByAssignment(\n projectSlug: string | null,\n assignmentSlug: string,\n): Promise<AgentSession[]> {\n const db = getSessionDb();\n const rows = projectSlug === null\n ? (db\n .prepare(\n 'SELECT * FROM sessions WHERE assignment_slug = ? AND project_slug IS NULL ORDER BY started DESC',\n )\n .all(assignmentSlug) as SessionRow[])\n : (db\n .prepare(\n 'SELECT * FROM sessions WHERE project_slug = ? AND assignment_slug = ? ORDER BY started DESC',\n )\n .all(projectSlug, assignmentSlug) as SessionRow[]);\n return rows.map(rowToSession);\n}\n","import Database from 'better-sqlite3';\nimport { resolve } from 'node:path';\nimport { readdir } from 'node:fs/promises';\nimport { syntaurRoot } from '../utils/paths.js';\nimport { fileExists } from '../utils/fs.js';\nimport type { AgentSession, AgentSessionStatus } from './types.js';\n\nlet db: Database.Database | null = null;\n\nconst SCHEMA_VERSION = '3';\n\n// The base schema deliberately OMITS the project_slug indexes — they are\n// created after any legacy-schema migrations run below. Older installs may\n// have the `mission_slug` column, and creating an index that references\n// `project_slug` before the rename migration runs would fail.\nconst SCHEMA_SQL = `\nCREATE TABLE IF NOT EXISTS sessions (\n session_id TEXT PRIMARY KEY,\n project_slug TEXT,\n assignment_slug TEXT,\n agent TEXT NOT NULL,\n started TEXT NOT NULL,\n ended TEXT,\n status TEXT NOT NULL DEFAULT 'active',\n path TEXT,\n description TEXT,\n transcript_path TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\nCREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status);\nCREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value TEXT);\n`;\n\nconst POST_MIGRATION_INDEXES_SQL = `\nCREATE INDEX IF NOT EXISTS idx_sessions_project ON sessions(project_slug);\nCREATE INDEX IF NOT EXISTS idx_sessions_assignment ON sessions(project_slug, assignment_slug);\n`;\n\n/**\n * Initialize the SQLite database for session tracking.\n * Creates the database file and schema if they don't exist.\n * @param dbPath Optional override for the database file path (used in tests).\n */\nexport function initSessionDb(dbPath?: string): Database.Database {\n if (db) return db;\n\n const finalPath = dbPath ?? resolve(syntaurRoot(), 'syntaur.db');\n db = new Database(finalPath);\n db.pragma('journal_mode = WAL');\n db.exec(SCHEMA_SQL);\n\n // Track schema version\n db.prepare('INSERT OR IGNORE INTO meta (key, value) VALUES (?, ?)').run(\n 'schema_version',\n SCHEMA_VERSION,\n );\n\n // Run migrations inside an EXCLUSIVE transaction. This closes two races:\n // 1. Crash between `DROP TABLE` / `RENAME` / `UPDATE meta` leaves the db\n // half-upgraded — the transaction rolls back on failure.\n // 2. Two processes (e.g. `syntaur dashboard` + `syntaur track-session`)\n // both calling initSessionDb() at once — EXCLUSIVE serializes the\n // migration and the version is re-checked inside the transaction so\n // the second process becomes a no-op once the first commits.\n // Narrow for the transaction closure — TS doesn't track the module-level\n // `db` assignment across the closure boundary.\n const database = db;\n const runMigrations = database.transaction(() => {\n // --- v1 → v2: make project/assignment nullable, add description ---\n const vBeforeV2 = (\n database\n .prepare(\"SELECT value FROM meta WHERE key = 'schema_version'\")\n .get() as { value: string } | undefined\n )?.value;\n\n if (vBeforeV2 === '1') {\n database.exec(`\n CREATE TABLE sessions_v2 (\n session_id TEXT PRIMARY KEY,\n project_slug TEXT,\n assignment_slug TEXT,\n agent TEXT NOT NULL,\n started TEXT NOT NULL,\n ended TEXT,\n status TEXT NOT NULL DEFAULT 'active',\n path TEXT,\n description TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n INSERT INTO sessions_v2 SELECT session_id, project_slug, assignment_slug, agent, started, ended, status, path, NULL, created_at, updated_at FROM sessions;\n DROP TABLE sessions;\n ALTER TABLE sessions_v2 RENAME TO sessions;\n CREATE INDEX IF NOT EXISTS idx_sessions_project ON sessions(project_slug);\n CREATE INDEX IF NOT EXISTS idx_sessions_assignment ON sessions(project_slug, assignment_slug);\n CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status);\n UPDATE meta SET value = '2' WHERE key = 'schema_version';\n `);\n }\n\n // --- v2 → v3: add transcript_path, normalize legacy mission_slug ---\n // Re-read the version AFTER v1→v2 may have run.\n const vBeforeV3 = (\n database\n .prepare(\"SELECT value FROM meta WHERE key = 'schema_version'\")\n .get() as { value: string } | undefined\n )?.value;\n\n if (vBeforeV3 === '2') {\n const v2Columns = database\n .prepare('PRAGMA table_info(sessions)')\n .all() as Array<{ name: string }>;\n const v2ColNames = v2Columns.map((c) => c.name);\n const hasProject = v2ColNames.includes('project_slug');\n const hasMission = v2ColNames.includes('mission_slug');\n\n // If a db somehow has both columns (e.g. a partially-renamed table),\n // prefer project_slug but fall back to mission_slug so rows that only\n // populated mission_slug aren't dropped.\n const projectSlugExpr =\n hasProject && hasMission\n ? 'COALESCE(project_slug, mission_slug)'\n : hasProject\n ? 'project_slug'\n : hasMission\n ? 'mission_slug'\n : null;\n\n if (!projectSlugExpr) {\n throw new Error(\n 'sessions table has neither project_slug nor mission_slug; cannot migrate from v2 to v3',\n );\n }\n\n database.exec(`\n CREATE TABLE sessions_v3 (\n session_id TEXT PRIMARY KEY,\n project_slug TEXT,\n assignment_slug TEXT,\n agent TEXT NOT NULL,\n started TEXT NOT NULL,\n ended TEXT,\n status TEXT NOT NULL DEFAULT 'active',\n path TEXT,\n description TEXT,\n transcript_path TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n INSERT INTO sessions_v3\n SELECT session_id, ${projectSlugExpr}, assignment_slug, agent, started, ended, status, path, description, NULL, created_at, updated_at\n FROM sessions;\n DROP TABLE sessions;\n ALTER TABLE sessions_v3 RENAME TO sessions;\n CREATE INDEX IF NOT EXISTS idx_sessions_project ON sessions(project_slug);\n CREATE INDEX IF NOT EXISTS idx_sessions_assignment ON sessions(project_slug, assignment_slug);\n CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status);\n UPDATE meta SET value = '3' WHERE key = 'schema_version';\n `);\n }\n });\n runMigrations.exclusive();\n\n // Create project-slug-dependent indexes now that we know the column exists.\n db.exec(POST_MIGRATION_INDEXES_SQL);\n\n return db;\n}\n\n/**\n * Get the initialized database handle.\n * Throws if initSessionDb() has not been called.\n */\nexport function getSessionDb(): Database.Database {\n if (!db) {\n throw new Error(\n 'Session database not initialized. Call initSessionDb() first.',\n );\n }\n return db;\n}\n\n/**\n * Close the database connection.\n */\nexport function closeSessionDb(): void {\n if (db) {\n db.close();\n db = null;\n }\n}\n\n/**\n * Reset the singleton for testing purposes.\n */\nexport function resetSessionDb(): void {\n db = null;\n}\n\n/**\n * One-time migration: import sessions from markdown _index-sessions.md files into SQLite.\n * Only runs if the sessions table is empty and markdown files exist.\n */\nexport async function migrateFromMarkdown(projectsDir: string): Promise<number> {\n const database = getSessionDb();\n\n // Skip if sessions already exist in the database\n const count = database.prepare('SELECT COUNT(*) as count FROM sessions').get() as { count: number };\n if (count.count > 0) return 0;\n\n if (!(await fileExists(projectsDir))) return 0;\n\n const entries = await readdir(projectsDir, { withFileTypes: true });\n const allSessions: AgentSession[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const projectDir = resolve(projectsDir, entry.name);\n const indexPath = resolve(projectDir, '_index-sessions.md');\n if (!(await fileExists(indexPath))) continue;\n\n const sessions = await parseMarkdownSessionsIndex(indexPath, entry.name);\n allSessions.push(...sessions);\n }\n\n if (allSessions.length === 0) return 0;\n\n const insert = database.prepare(`\n INSERT OR IGNORE INTO sessions (session_id, project_slug, assignment_slug, agent, started, status, path)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `);\n\n const insertAll = database.transaction((sessions: AgentSession[]) => {\n for (const s of sessions) {\n insert.run(s.sessionId, s.projectSlug, s.assignmentSlug, s.agent, s.started, s.status, s.path);\n }\n });\n\n insertAll(allSessions);\n console.log(`Migrated ${allSessions.length} sessions from markdown to SQLite.`);\n return allSessions.length;\n}\n\n/**\n * Parse an _index-sessions.md file into AgentSession objects.\n * Used only for one-time migration. This is a copy of the old parsing logic.\n */\nasync function parseMarkdownSessionsIndex(\n filePath: string,\n projectSlug: string,\n): Promise<AgentSession[]> {\n const { readFile } = await import('node:fs/promises');\n const raw = await readFile(filePath, 'utf-8');\n const sessions: AgentSession[] = [];\n\n const lines = raw.split('\\n');\n let inTable = false;\n let headerSeen = false;\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n if (trimmed.startsWith('| Assignment') || trimmed.startsWith('|Assignment')) {\n inTable = true;\n headerSeen = false;\n continue;\n }\n\n if (inTable && !headerSeen && trimmed.match(/^\\|[-\\s|]+\\|$/)) {\n headerSeen = true;\n continue;\n }\n\n if (inTable && headerSeen && trimmed.startsWith('|')) {\n const cells = trimmed\n .split('|')\n .slice(1, -1)\n .map((c) => c.trim());\n\n if (cells.length >= 6) {\n sessions.push({\n assignmentSlug: cells[0],\n agent: cells[1],\n sessionId: cells[2],\n started: cells[3],\n status: (cells[4] as AgentSessionStatus) || 'active',\n path: cells[5],\n projectSlug,\n });\n }\n }\n }\n\n return sessions;\n}\n","import { watch } from 'chokidar';\nimport { relative, sep } from 'node:path';\nimport type { WsMessage } from './types.js';\n\nexport interface WatcherOptions {\n projectsDir: string;\n assignmentsDir?: string;\n serversDir?: string;\n playbooksDir?: string;\n todosDir?: string;\n onMessage: (message: WsMessage) => void;\n debounceMs?: number;\n}\n\nexport function createWatcher(options: WatcherOptions): { close: () => Promise<void> } {\n const { projectsDir, assignmentsDir, serversDir, playbooksDir, todosDir, onMessage, debounceMs = 300 } = options;\n const pendingEvents = new Map<string, NodeJS.Timeout>();\n\n // --- Projects watcher (existing logic) ---\n const projectsWatcher = watch(projectsDir, {\n ignoreInitial: true,\n persistent: true,\n depth: 10,\n ignored: /(^|[\\/\\\\])\\../,\n });\n\n function handleProjectChange(filePath: string): void {\n const rel = relative(projectsDir, filePath);\n const parts = rel.split(sep);\n\n if (parts.length === 0) return;\n\n const projectSlug = parts[0];\n let assignmentSlug: string | undefined;\n\n if (parts.length >= 3 && parts[1] === 'assignments') {\n assignmentSlug = parts[2];\n }\n\n const debounceKey = assignmentSlug\n ? `${projectSlug}/${assignmentSlug}`\n : projectSlug;\n\n const existing = pendingEvents.get(debounceKey);\n if (existing) clearTimeout(existing);\n\n // Session events are now emitted by the API write path, not the file watcher\n const messageType = assignmentSlug\n ? 'assignment-updated'\n : 'project-updated';\n\n pendingEvents.set(\n debounceKey,\n setTimeout(() => {\n pendingEvents.delete(debounceKey);\n const message: WsMessage = {\n type: messageType,\n projectSlug,\n assignmentSlug,\n timestamp: new Date().toISOString(),\n };\n onMessage(message);\n }, debounceMs),\n );\n }\n\n projectsWatcher.on('change', handleProjectChange);\n projectsWatcher.on('add', handleProjectChange);\n projectsWatcher.on('unlink', handleProjectChange);\n\n // --- Standalone assignments watcher ---\n let standaloneWatcher: ReturnType<typeof watch> | null = null;\n\n if (assignmentsDir) {\n standaloneWatcher = watch(assignmentsDir, {\n ignoreInitial: true,\n persistent: true,\n depth: 5,\n ignored: /(^|[\\/\\\\])\\../,\n });\n\n function handleStandaloneChange(filePath: string): void {\n const rel = relative(assignmentsDir!, filePath);\n const parts = rel.split(sep);\n if (parts.length === 0) return;\n const assignmentId = parts[0];\n if (!assignmentId) return;\n\n const debounceKey = `__standalone__/${assignmentId}`;\n const existing = pendingEvents.get(debounceKey);\n if (existing) clearTimeout(existing);\n\n pendingEvents.set(\n debounceKey,\n setTimeout(() => {\n pendingEvents.delete(debounceKey);\n const message: WsMessage = {\n type: 'assignment-updated',\n projectSlug: null,\n assignmentSlug: assignmentId,\n timestamp: new Date().toISOString(),\n };\n onMessage(message);\n }, debounceMs),\n );\n }\n\n standaloneWatcher.on('change', handleStandaloneChange);\n standaloneWatcher.on('add', handleStandaloneChange);\n standaloneWatcher.on('unlink', handleStandaloneChange);\n }\n\n // --- Servers watcher (new) ---\n let serversWatcher: ReturnType<typeof watch> | null = null;\n\n if (serversDir) {\n serversWatcher = watch(serversDir, {\n ignoreInitial: true,\n persistent: true,\n depth: 1,\n ignored: /(^|[\\/\\\\])\\../,\n });\n\n function handleServerChange(): void {\n const debounceKey = '__servers__';\n const existing = pendingEvents.get(debounceKey);\n if (existing) clearTimeout(existing);\n\n pendingEvents.set(\n debounceKey,\n setTimeout(() => {\n pendingEvents.delete(debounceKey);\n const message: WsMessage = {\n type: 'servers-updated',\n timestamp: new Date().toISOString(),\n };\n onMessage(message);\n }, debounceMs),\n );\n }\n\n serversWatcher.on('change', handleServerChange);\n serversWatcher.on('add', handleServerChange);\n serversWatcher.on('unlink', handleServerChange);\n }\n\n // --- Playbooks watcher ---\n let playbooksWatcher: ReturnType<typeof watch> | null = null;\n\n if (playbooksDir) {\n playbooksWatcher = watch(playbooksDir, {\n ignoreInitial: true,\n persistent: true,\n depth: 1,\n ignored: /(^|[\\/\\\\])\\../,\n });\n\n function handlePlaybookChange(): void {\n const debounceKey = '__playbooks__';\n const existing = pendingEvents.get(debounceKey);\n if (existing) clearTimeout(existing);\n\n pendingEvents.set(\n debounceKey,\n setTimeout(() => {\n pendingEvents.delete(debounceKey);\n const message: WsMessage = {\n type: 'playbooks-updated',\n timestamp: new Date().toISOString(),\n };\n onMessage(message);\n }, debounceMs),\n );\n }\n\n playbooksWatcher.on('change', handlePlaybookChange);\n playbooksWatcher.on('add', handlePlaybookChange);\n playbooksWatcher.on('unlink', handlePlaybookChange);\n }\n\n // --- Todos watcher ---\n let todosWatcher: ReturnType<typeof watch> | null = null;\n\n if (todosDir) {\n todosWatcher = watch(todosDir, {\n ignoreInitial: true,\n persistent: true,\n depth: 1,\n ignored: /(^|[\\/\\\\])\\../,\n });\n\n function handleTodoChange(): void {\n const debounceKey = '__todos__';\n const existing = pendingEvents.get(debounceKey);\n if (existing) clearTimeout(existing);\n\n pendingEvents.set(\n debounceKey,\n setTimeout(() => {\n pendingEvents.delete(debounceKey);\n const message: WsMessage = {\n type: 'todos-updated',\n timestamp: new Date().toISOString(),\n };\n onMessage(message);\n }, debounceMs),\n );\n }\n\n todosWatcher.on('change', handleTodoChange);\n todosWatcher.on('add', handleTodoChange);\n todosWatcher.on('unlink', handleTodoChange);\n }\n\n return {\n close: async () => {\n pendingEvents.forEach((timeout) => {\n clearTimeout(timeout);\n });\n pendingEvents.clear();\n await projectsWatcher.close();\n if (standaloneWatcher) await standaloneWatcher.close();\n if (serversWatcher) await serversWatcher.close();\n if (playbooksWatcher) await playbooksWatcher.close();\n if (todosWatcher) await todosWatcher.close();\n },\n };\n}\n","import { Router, type Request, type Response } from 'express';\nimport { resolve } from 'node:path';\nimport { rm, readFile } from 'node:fs/promises';\nimport { executeTransition } from '../lifecycle/index.js';\nimport { isValidSlug } from '../utils/slug.js';\nimport { generateId } from '../utils/uuid.js';\nimport { nowTimestamp } from '../utils/timestamp.js';\nimport { ensureDir, writeFileForce, fileExists } from '../utils/fs.js';\nimport {\n parseAssignmentFull,\n parseDecisionRecord,\n parseHandoff,\n parseProject,\n parsePlan,\n parseScratchpad,\n} from './parser.js';\nimport { toggleAcceptanceCriterion } from './acceptance-criteria.js';\nimport {\n getAssignmentDetail,\n getAssignmentDetailById,\n getEditableDocument,\n getEditableDocumentById,\n getProjectDetail,\n getStatusConfig,\n} from './api.js';\nimport { resolveAssignmentById } from '../utils/assignment-resolver.js';\nimport { renderProgress } from '../templates/index.js';\nimport { executeTransitionByDir } from '../lifecycle/index.js';\nimport {\n renderProject,\n renderManifest,\n renderIndexAssignments,\n renderIndexPlans,\n renderIndexDecisions,\n renderStatus,\n renderResourcesIndex,\n renderMemoriesIndex,\n renderAssignment,\n renderScratchpad,\n renderHandoff,\n renderDecisionRecord,\n renderComments,\n formatCommentEntry,\n type Comment,\n type CommentType,\n} from '../templates/index.js';\nimport { parseComments } from './parser.js';\n\nfunction extractFrontmatter(content: string): Record<string, string> | null {\n const trimmed = content.trimStart();\n if (!trimmed.startsWith('---\\n') && !trimmed.startsWith('---\\r\\n')) {\n return null;\n }\n\n const afterFirst = trimmed.indexOf('\\n') + 1;\n const closingIdx = trimmed.indexOf('\\n---', afterFirst);\n if (closingIdx === -1) {\n return null;\n }\n\n const yamlBlock = trimmed.slice(afterFirst, closingIdx);\n const fields: Record<string, string> = {};\n\n for (const line of yamlBlock.split('\\n')) {\n const match = line.match(/^([a-zA-Z_][a-zA-Z0-9_]*):\\s*(.*)$/);\n if (!match) {\n continue;\n }\n\n let value = match[2].trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n fields[match[1]] = value;\n }\n\n return fields;\n}\n\nfunction validateRequired(\n fields: Record<string, string>,\n required: string[],\n): { valid: true } | { valid: false; missing: string[] } {\n const missing = required.filter((key) => !fields[key] || fields[key] === 'null');\n if (missing.length > 0) {\n return { valid: false, missing };\n }\n return { valid: true };\n}\n\nfunction formatYamlValue(value: boolean | number | string | null): string {\n if (value === null) {\n return 'null';\n }\n if (typeof value === 'boolean' || typeof value === 'number') {\n return String(value);\n }\n if (/^\\d{4}-\\d{2}-\\d{2}T/.test(value)) {\n return `\"${value}\"`;\n }\n if (value === '' || /[:#{}[\\],&*?|>!%@`]/.test(value) || /^\\s|\\s$/.test(value)) {\n return `\"${value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n }\n return value;\n}\n\nfunction setTopLevelField(\n content: string,\n key: string,\n value: boolean | number | string | null,\n): string {\n const formatted = formatYamlValue(value);\n const fieldRegex = new RegExp(`^(${escapeRegExp(key)}:)\\\\s*.*$`, 'm');\n\n if (fieldRegex.test(content)) {\n return content.replace(fieldRegex, `$1 ${formatted}`);\n }\n\n const closingIdx = content.indexOf('\\n---', 4);\n if (closingIdx === -1) {\n return content;\n }\n\n return `${content.slice(0, closingIdx)}\\n${key}: ${formatted}${content.slice(closingIdx)}`;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction appendLogEntry(\n existingContent: string,\n countField: 'handoffCount' | 'decisionCount',\n nextCount: number,\n heading: string,\n body: string,\n emptyPlaceholder: string,\n): string {\n const timestamp = nowTimestamp();\n let next = setTopLevelField(existingContent, 'updated', timestamp);\n next = setTopLevelField(next, countField, nextCount);\n\n const entryBody = body.trim();\n const entry = `## ${heading}\\n\\n**Recorded:** ${timestamp}\\n\\n${entryBody}\\n`;\n\n if (next.includes(emptyPlaceholder)) {\n return next.replace(emptyPlaceholder, entry.trimEnd());\n }\n\n return `${next.trimEnd()}\\n\\n${entry}`;\n}\n\nfunction requireContent(req: Request, res: Response): string | null {\n const { content } = req.body || {};\n if (!content || typeof content !== 'string' || !content.trim()) {\n res.status(400).json({ error: 'content is required' });\n return null;\n }\n return content;\n}\n\nfunction getParam(value: string | string[] | undefined): string {\n if (Array.isArray(value)) {\n return value[0] ?? '';\n }\n return value ?? '';\n}\n\nasync function readCurrentDocument(filePath: string): Promise<string | null> {\n if (!(await fileExists(filePath))) {\n return null;\n }\n return readFile(filePath, 'utf-8');\n}\n\nexport function createWriteRouter(projectsDir: string, assignmentsDir?: string): Router {\n const router = Router();\n\n router.get('/api/templates/project', (_req: Request, res: Response) => {\n const content = renderProject({\n id: generateId(),\n slug: 'my-new-project',\n title: 'My New Project',\n timestamp: nowTimestamp(),\n });\n res.json({ content });\n });\n\n router.get('/api/templates/assignment', (_req: Request, res: Response) => {\n const content = renderAssignment({\n id: generateId(),\n slug: 'my-new-assignment',\n title: 'My New Assignment',\n timestamp: nowTimestamp(),\n priority: 'medium',\n dependsOn: [],\n links: [],\n });\n res.json({ content });\n });\n\n router.get('/api/projects/:slug/edit', async (req: Request, res: Response) => {\n const slug = getParam(req.params.slug);\n const document = await getEditableDocument(projectsDir, 'project', slug);\n if (!document) {\n res.status(404).json({ error: `Project \"${slug}\" not found` });\n return;\n }\n res.json(document);\n });\n\n router.get('/api/projects/:slug/assignments/:aslug/edit', async (req: Request, res: Response) => {\n const slug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const document = await getEditableDocument(\n projectsDir,\n 'assignment',\n slug,\n assignmentSlug,\n );\n if (!document) {\n res.status(404).json({ error: 'Assignment not found' });\n return;\n }\n res.json(document);\n });\n\n router.get('/api/projects/:slug/assignments/:aslug/plan/edit', async (req: Request, res: Response) => {\n const slug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const document = await getEditableDocument(\n projectsDir,\n 'plan',\n slug,\n assignmentSlug,\n );\n if (!document) {\n res.status(404).json({ error: 'Plan not found' });\n return;\n }\n res.json(document);\n });\n\n router.get('/api/projects/:slug/assignments/:aslug/scratchpad/edit', async (req: Request, res: Response) => {\n const slug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const document = await getEditableDocument(\n projectsDir,\n 'scratchpad',\n slug,\n assignmentSlug,\n );\n if (!document) {\n res.status(404).json({ error: 'Scratchpad not found' });\n return;\n }\n res.json(document);\n });\n\n router.get('/api/projects/:slug/assignments/:aslug/handoff/edit', async (req: Request, res: Response) => {\n const slug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const document = await getEditableDocument(\n projectsDir,\n 'handoff',\n slug,\n assignmentSlug,\n );\n if (!document) {\n res.status(404).json({ error: 'Handoff log not found' });\n return;\n }\n res.json(document);\n });\n\n router.get('/api/projects/:slug/assignments/:aslug/decision-record/edit', async (req: Request, res: Response) => {\n const slug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const document = await getEditableDocument(\n projectsDir,\n 'decision-record',\n slug,\n assignmentSlug,\n );\n if (!document) {\n res.status(404).json({ error: 'Decision record not found' });\n return;\n }\n res.json(document);\n });\n\n router.post('/api/projects', async (req: Request, res: Response) => {\n try {\n const content = requireContent(req, res);\n if (!content) {\n return;\n }\n\n const fields = extractFrontmatter(content);\n if (!fields) {\n res.status(400).json({ error: 'Invalid frontmatter: missing --- delimiters' });\n return;\n }\n\n const validation = validateRequired(fields, ['slug', 'title']);\n if (!validation.valid) {\n res.status(400).json({ error: `Missing required fields: ${validation.missing.join(', ')}` });\n return;\n }\n\n const slug = fields.slug;\n if (!isValidSlug(slug)) {\n res.status(400).json({ error: `Invalid slug \"${slug}\". Must be lowercase and hyphen-separated.` });\n return;\n }\n\n const projectDir = resolve(projectsDir, slug);\n if (await fileExists(projectDir)) {\n res.status(409).json({ error: `Project \"${slug}\" already exists` });\n return;\n }\n\n const title = fields.title;\n const timestamp = fields.created || nowTimestamp();\n\n await ensureDir(resolve(projectDir, 'assignments'));\n await ensureDir(resolve(projectDir, 'resources'));\n await ensureDir(resolve(projectDir, 'memories'));\n\n await writeFileForce(resolve(projectDir, 'project.md'), content);\n\n try {\n const companions: Array<[string, string]> = [\n [resolve(projectDir, 'manifest.md'), renderManifest({ slug, timestamp })],\n [resolve(projectDir, '_index-assignments.md'), renderIndexAssignments({ slug, title, timestamp })],\n [resolve(projectDir, '_index-plans.md'), renderIndexPlans({ slug, title, timestamp })],\n [resolve(projectDir, '_index-decisions.md'), renderIndexDecisions({ slug, title, timestamp })],\n [resolve(projectDir, '_status.md'), renderStatus({ slug, title, timestamp })],\n [resolve(projectDir, 'resources', '_index.md'), renderResourcesIndex({ slug, title, timestamp })],\n [resolve(projectDir, 'memories', '_index.md'), renderMemoriesIndex({ slug, title, timestamp })],\n ];\n\n for (const [filePath, fileContent] of companions) {\n await writeFileForce(filePath, fileContent);\n }\n } catch (companionError) {\n try {\n await rm(projectDir, { recursive: true, force: true });\n } catch {\n // Best effort cleanup only.\n }\n throw companionError;\n }\n\n res.status(201).json({ slug });\n } catch (error) {\n console.error('Error creating project:', error);\n res.status(500).json({ error: `Failed to create project: ${(error as Error).message}` });\n }\n });\n\n router.post('/api/projects/:slug/assignments', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const projectDir = resolve(projectsDir, projectSlug);\n const projectMdPath = resolve(projectDir, 'project.md');\n\n if (!(await fileExists(projectMdPath))) {\n res.status(404).json({ error: `Project \"${projectSlug}\" not found` });\n return;\n }\n\n const content = requireContent(req, res);\n if (!content) {\n return;\n }\n\n const fields = extractFrontmatter(content);\n if (!fields) {\n res.status(400).json({ error: 'Invalid frontmatter: missing --- delimiters' });\n return;\n }\n\n const validation = validateRequired(fields, ['slug', 'title']);\n if (!validation.valid) {\n res.status(400).json({ error: `Missing required fields: ${validation.missing.join(', ')}` });\n return;\n }\n\n const assignmentSlug = fields.slug;\n if (!isValidSlug(assignmentSlug)) {\n res.status(400).json({ error: `Invalid slug \"${assignmentSlug}\". Must be lowercase and hyphen-separated.` });\n return;\n }\n\n const validPriorities = ['low', 'medium', 'high', 'critical'];\n const priority = fields.priority || 'medium';\n if (!validPriorities.includes(priority)) {\n res.status(400).json({ error: `Invalid priority \"${priority}\". Must be low, medium, high, or critical.` });\n return;\n }\n\n const assignmentDir = resolve(projectDir, 'assignments', assignmentSlug);\n if (await fileExists(assignmentDir)) {\n res.status(409).json({\n error: `Assignment \"${assignmentSlug}\" already exists in project \"${projectSlug}\"`,\n });\n return;\n }\n\n const timestamp = fields.created || nowTimestamp();\n\n await ensureDir(assignmentDir);\n await writeFileForce(resolve(assignmentDir, 'assignment.md'), content);\n\n try {\n const companions: Array<[string, string]> = [\n [resolve(assignmentDir, 'scratchpad.md'), renderScratchpad({ assignmentSlug, timestamp })],\n [resolve(assignmentDir, 'handoff.md'), renderHandoff({ assignmentSlug, timestamp })],\n [resolve(assignmentDir, 'decision-record.md'), renderDecisionRecord({ assignmentSlug, timestamp })],\n ];\n\n for (const [filePath, fileContent] of companions) {\n await writeFileForce(filePath, fileContent);\n }\n } catch (companionError) {\n try {\n await rm(assignmentDir, { recursive: true, force: true });\n } catch {\n // Best effort cleanup only.\n }\n throw companionError;\n }\n\n res.status(201).json({ slug: assignmentSlug, projectSlug });\n } catch (error) {\n console.error('Error creating assignment:', error);\n res.status(500).json({ error: `Failed to create assignment: ${(error as Error).message}` });\n }\n });\n\n router.patch('/api/projects/:slug', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const projectPath = resolve(projectsDir, projectSlug, 'project.md');\n const currentContent = await readCurrentDocument(projectPath);\n if (!currentContent) {\n res.status(404).json({ error: `Project \"${projectSlug}\" not found` });\n return;\n }\n\n const nextContentRaw = requireContent(req, res);\n if (!nextContentRaw) {\n return;\n }\n\n const current = parseProject(currentContent);\n const next = parseProject(nextContentRaw);\n\n if (!next.slug || !next.title) {\n res.status(400).json({ error: 'Project content must include slug and title.' });\n return;\n }\n\n if (next.slug !== current.slug) {\n res.status(400).json({ error: 'Project slug cannot be changed once created.' });\n return;\n }\n\n const nextContent = setTopLevelField(nextContentRaw, 'updated', nowTimestamp());\n await writeFileForce(projectPath, nextContent);\n\n const project = await getProjectDetail(projectsDir, projectSlug);\n res.json({ project, content: nextContent });\n } catch (error) {\n console.error('Error updating project:', error);\n res.status(500).json({ error: `Failed to update project: ${(error as Error).message}` });\n }\n });\n\n router.patch('/api/projects/:slug/assignments/:aslug', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const assignmentPath = resolve(\n projectsDir,\n projectSlug,\n 'assignments',\n assignmentSlug,\n 'assignment.md',\n );\n const currentContent = await readCurrentDocument(assignmentPath);\n if (!currentContent) {\n res.status(404).json({ error: 'Assignment not found' });\n return;\n }\n\n const nextContentRaw = requireContent(req, res);\n if (!nextContentRaw) {\n return;\n }\n\n const current = parseAssignmentFull(currentContent);\n const next = parseAssignmentFull(nextContentRaw);\n\n if (!next.slug || !next.title) {\n res.status(400).json({ error: 'Assignment content must include slug and title.' });\n return;\n }\n\n if (next.slug !== current.slug) {\n res.status(400).json({ error: 'Assignment slug cannot be changed once created.' });\n return;\n }\n\n let nextContent = nextContentRaw;\n\n // Clear blockedReason when status moves away from blocked\n if (next.status !== current.status && current.status === 'blocked' && next.status !== 'blocked') {\n nextContent = setTopLevelField(nextContent, 'blockedReason', null);\n }\n\n nextContent = setTopLevelField(nextContent, 'updated', nowTimestamp());\n await writeFileForce(assignmentPath, nextContent);\n\n const assignment = await getAssignmentDetail(projectsDir, projectSlug, assignmentSlug);\n res.json({ assignment, content: nextContent });\n } catch (error) {\n console.error('Error updating assignment:', error);\n res.status(500).json({ error: `Failed to update assignment: ${(error as Error).message}` });\n }\n });\n\n router.patch('/api/projects/:slug/assignments/:aslug/acceptance-criteria/:index', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const assignmentPath = resolve(\n projectsDir,\n projectSlug,\n 'assignments',\n assignmentSlug,\n 'assignment.md',\n );\n const currentContent = await readCurrentDocument(assignmentPath);\n if (!currentContent) {\n res.status(404).json({ error: 'Assignment not found' });\n return;\n }\n\n const { checked } = req.body || {};\n if (typeof checked !== 'boolean') {\n res.status(400).json({ error: 'checked must be a boolean' });\n return;\n }\n\n const index = Number.parseInt(getParam(req.params.index), 10);\n const result = toggleAcceptanceCriterion(currentContent, index, checked);\n if ('error' in result) {\n res.status(400).json({ error: result.error });\n return;\n }\n\n const nextContent = setTopLevelField(result.content, 'updated', nowTimestamp());\n await writeFileForce(assignmentPath, nextContent);\n\n const assignment = await getAssignmentDetail(projectsDir, projectSlug, assignmentSlug);\n res.json({ assignment, content: nextContent });\n } catch (error) {\n console.error('Error toggling acceptance criterion:', error);\n res.status(500).json({ error: `Failed to toggle acceptance criterion: ${(error as Error).message}` });\n }\n });\n\n router.patch('/api/projects/:slug/assignments/:aslug/plan', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const planPath = resolve(\n projectsDir,\n projectSlug,\n 'assignments',\n assignmentSlug,\n 'plan.md',\n );\n const currentContent = await readCurrentDocument(planPath);\n if (!currentContent) {\n res.status(404).json({ error: 'Plan not found' });\n return;\n }\n\n const nextContentRaw = requireContent(req, res);\n if (!nextContentRaw) {\n return;\n }\n\n const next = parsePlan(nextContentRaw);\n if (!next.assignment) {\n res.status(400).json({ error: 'Plan content must include the assignment field.' });\n return;\n }\n\n if (next.assignment !== assignmentSlug) {\n res.status(400).json({ error: 'Plan assignment field must match the route assignment slug.' });\n return;\n }\n\n const nextContent = setTopLevelField(nextContentRaw, 'updated', nowTimestamp());\n await writeFileForce(planPath, nextContent);\n\n const assignment = await getAssignmentDetail(projectsDir, projectSlug, assignmentSlug);\n res.json({ assignment, content: nextContent });\n } catch (error) {\n console.error('Error updating plan:', error);\n res.status(500).json({ error: `Failed to update plan: ${(error as Error).message}` });\n }\n });\n\n router.patch('/api/projects/:slug/assignments/:aslug/scratchpad', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const scratchpadPath = resolve(\n projectsDir,\n projectSlug,\n 'assignments',\n assignmentSlug,\n 'scratchpad.md',\n );\n const currentContent = await readCurrentDocument(scratchpadPath);\n if (!currentContent) {\n res.status(404).json({ error: 'Scratchpad not found' });\n return;\n }\n\n const nextContentRaw = requireContent(req, res);\n if (!nextContentRaw) {\n return;\n }\n\n const next = parseScratchpad(nextContentRaw);\n if (!next.assignment) {\n res.status(400).json({ error: 'Scratchpad content must include the assignment field.' });\n return;\n }\n\n if (next.assignment !== assignmentSlug) {\n res.status(400).json({ error: 'Scratchpad assignment field must match the route assignment slug.' });\n return;\n }\n\n const nextContent = setTopLevelField(nextContentRaw, 'updated', nowTimestamp());\n await writeFileForce(scratchpadPath, nextContent);\n\n const assignment = await getAssignmentDetail(projectsDir, projectSlug, assignmentSlug);\n res.json({ assignment, content: nextContent });\n } catch (error) {\n console.error('Error updating scratchpad:', error);\n res.status(500).json({ error: `Failed to update scratchpad: ${(error as Error).message}` });\n }\n });\n\n router.post('/api/projects/:slug/assignments/:aslug/handoff/entries', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const handoffPath = resolve(\n projectsDir,\n projectSlug,\n 'assignments',\n assignmentSlug,\n 'handoff.md',\n );\n const currentContent = await readCurrentDocument(handoffPath);\n if (!currentContent) {\n res.status(404).json({ error: 'Handoff log not found' });\n return;\n }\n\n const { title, body } = req.body || {};\n if (!body || typeof body !== 'string' || !body.trim()) {\n res.status(400).json({ error: 'body is required' });\n return;\n }\n\n const parsed = parseHandoff(currentContent);\n const nextContent = appendLogEntry(\n currentContent,\n 'handoffCount',\n parsed.handoffCount + 1,\n title && typeof title === 'string' && title.trim() ? title.trim() : `Handoff ${parsed.handoffCount + 1}`,\n body,\n 'No handoffs recorded yet.',\n );\n\n await writeFileForce(handoffPath, nextContent);\n const assignment = await getAssignmentDetail(projectsDir, projectSlug, assignmentSlug);\n res.status(201).json({ assignment, content: nextContent });\n } catch (error) {\n console.error('Error appending handoff entry:', error);\n res.status(500).json({ error: `Failed to append handoff entry: ${(error as Error).message}` });\n }\n });\n\n router.post('/api/projects/:slug/assignments/:aslug/decision-record/entries', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const decisionPath = resolve(\n projectsDir,\n projectSlug,\n 'assignments',\n assignmentSlug,\n 'decision-record.md',\n );\n const currentContent = await readCurrentDocument(decisionPath);\n if (!currentContent) {\n res.status(404).json({ error: 'Decision record not found' });\n return;\n }\n\n const { title, body } = req.body || {};\n if (!body || typeof body !== 'string' || !body.trim()) {\n res.status(400).json({ error: 'body is required' });\n return;\n }\n\n const parsed = parseDecisionRecord(currentContent);\n const nextContent = appendLogEntry(\n currentContent,\n 'decisionCount',\n parsed.decisionCount + 1,\n title && typeof title === 'string' && title.trim() ? title.trim() : `Decision ${parsed.decisionCount + 1}`,\n body,\n 'No decisions recorded yet.',\n );\n\n await writeFileForce(decisionPath, nextContent);\n const assignment = await getAssignmentDetail(projectsDir, projectSlug, assignmentSlug);\n res.status(201).json({ assignment, content: nextContent });\n } catch (error) {\n console.error('Error appending decision entry:', error);\n res.status(500).json({ error: `Failed to append decision entry: ${(error as Error).message}` });\n }\n });\n\n // --- Comments Endpoints ---\n\n router.post('/api/projects/:slug/assignments/:aslug/comments', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const commentsPath = resolve(\n projectsDir,\n projectSlug,\n 'assignments',\n assignmentSlug,\n 'comments.md',\n );\n\n const { body, author, type, replyTo } = req.body || {};\n if (!body || typeof body !== 'string' || !body.trim()) {\n res.status(400).json({ error: 'body is required' });\n return;\n }\n const commentType: CommentType = type && ['question', 'note', 'feedback'].includes(type)\n ? type\n : 'note';\n const timestamp = nowTimestamp();\n const entryAuthor = (typeof author === 'string' && author.trim()) ? author.trim() : 'human';\n\n let currentContent: string;\n let currentCount = 0;\n if (await fileExists(commentsPath)) {\n currentContent = await readFile(commentsPath, 'utf-8');\n const countMatch = currentContent.match(/^entryCount:\\s*(\\d+)/m);\n if (countMatch) currentCount = parseInt(countMatch[1], 10);\n } else {\n currentContent = renderComments({\n assignment: assignmentSlug,\n timestamp,\n });\n }\n\n const comment: Comment = {\n id: generateId().split('-')[0],\n timestamp,\n author: entryAuthor,\n type: commentType,\n body,\n replyTo: typeof replyTo === 'string' && replyTo.trim() ? replyTo.trim() : undefined,\n resolved: commentType === 'question' ? false : undefined,\n };\n const entry = formatCommentEntry(comment);\n let next = setTopLevelField(currentContent, 'entryCount', String(currentCount + 1));\n next = setTopLevelField(next, 'updated', `\"${timestamp}\"`);\n if (next.includes('No comments yet.')) {\n next = next.replace('No comments yet.', entry.trimEnd());\n } else {\n next = `${next.trimEnd()}\\n\\n${entry}`;\n }\n\n await writeFileForce(commentsPath, next);\n const assignment = await getAssignmentDetail(projectsDir, projectSlug, assignmentSlug);\n res.status(201).json({ assignment, comment: { id: comment.id } });\n } catch (error) {\n console.error('Error appending comment:', error);\n res.status(500).json({ error: `Failed to append comment: ${(error as Error).message}` });\n }\n });\n\n router.patch('/api/projects/:slug/assignments/:aslug/comments/:commentId/resolved', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const commentId = getParam(req.params.commentId);\n const commentsPath = resolve(\n projectsDir,\n projectSlug,\n 'assignments',\n assignmentSlug,\n 'comments.md',\n );\n if (!(await fileExists(commentsPath))) {\n res.status(404).json({ error: 'Comments file not found' });\n return;\n }\n const { resolved } = req.body || {};\n if (typeof resolved !== 'boolean') {\n res.status(400).json({ error: 'resolved (boolean) is required' });\n return;\n }\n\n const content = await readFile(commentsPath, 'utf-8');\n const parsed = parseComments(content);\n const target = parsed.entries.find((e) => e.id === commentId);\n if (!target) {\n res.status(404).json({ error: `Comment ${commentId} not found` });\n return;\n }\n if (target.type !== 'question') {\n res.status(400).json({ error: 'Only questions can be resolved' });\n return;\n }\n\n // Toggle the `**Resolved:**` line in the entry's block.\n const entryBlockRegex = new RegExp(\n `(^## ${commentId.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}[\\\\s\\\\S]*?)(\\\\*\\\\*Resolved:\\\\*\\\\*\\\\s*(?:true|false))`,\n 'm',\n );\n const next = content.replace(\n entryBlockRegex,\n (_m, preamble) => `${preamble}**Resolved:** ${resolved ? 'true' : 'false'}`,\n );\n if (next === content) {\n res.status(500).json({ error: 'Failed to update resolved flag' });\n return;\n }\n\n const withUpdated = setTopLevelField(next, 'updated', `\"${nowTimestamp()}\"`);\n await writeFileForce(commentsPath, withUpdated);\n const assignment = await getAssignmentDetail(projectsDir, projectSlug, assignmentSlug);\n res.json({ assignment });\n } catch (error) {\n console.error('Error toggling comment resolved flag:', error);\n res.status(500).json({ error: `Failed to toggle resolved: ${(error as Error).message}` });\n }\n });\n\n // --- Move Workspace Endpoint ---\n\n router.post('/api/projects/:slug/move-workspace', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const projectPath = resolve(projectsDir, projectSlug, 'project.md');\n if (!(await fileExists(projectPath))) {\n res.status(404).json({ error: `Project \"${projectSlug}\" not found` });\n return;\n }\n\n const { workspace } = req.body || {};\n if (workspace !== null && (typeof workspace !== 'string' || !workspace.trim())) {\n res.status(400).json({ error: 'workspace must be a non-empty string or null (for ungrouped).' });\n return;\n }\n\n let content = await readFile(projectPath, 'utf-8');\n content = setTopLevelField(content, 'workspace', workspace ?? null);\n content = setTopLevelField(content, 'updated', nowTimestamp());\n await writeFileForce(projectPath, content);\n\n const project = await getProjectDetail(projectsDir, projectSlug);\n res.json({ project });\n } catch (error) {\n console.error('Error moving project workspace:', error);\n res.status(500).json({ error: `Failed to move workspace: ${(error as Error).message}` });\n }\n });\n\n // --- Status Override Endpoints ---\n\n router.post('/api/projects/:slug/status-override', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const projectPath = resolve(projectsDir, projectSlug, 'project.md');\n if (!(await fileExists(projectPath))) {\n res.status(404).json({ error: `Project \"${projectSlug}\" not found` });\n return;\n }\n\n const { status } = req.body || {};\n const config = await getStatusConfig();\n const validStatuses = ['active', 'archived', ...config.statuses.map((s) => s.id)];\n if (status !== null && (typeof status !== 'string' || !validStatuses.includes(status))) {\n res.status(400).json({ error: `Invalid status. Must be one of: ${validStatuses.join(', ')}, or null to clear.` });\n return;\n }\n\n let content = await readFile(projectPath, 'utf-8');\n content = setTopLevelField(content, 'statusOverride', status ?? null);\n content = setTopLevelField(content, 'updated', nowTimestamp());\n await writeFileForce(projectPath, content);\n\n const project = await getProjectDetail(projectsDir, projectSlug);\n res.json({ project });\n } catch (error) {\n console.error('Error setting project status override:', error);\n res.status(500).json({ error: `Failed to set status override: ${(error as Error).message}` });\n }\n });\n\n router.post('/api/projects/:slug/assignments/:aslug/status-override', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const assignmentPath = resolve(\n projectsDir,\n projectSlug,\n 'assignments',\n assignmentSlug,\n 'assignment.md',\n );\n if (!(await fileExists(assignmentPath))) {\n res.status(404).json({ error: 'Assignment not found' });\n return;\n }\n\n const { status } = req.body || {};\n const config = await getStatusConfig();\n const validStatuses = config.statuses.map((s) => s.id);\n if (typeof status !== 'string' || !validStatuses.includes(status)) {\n res.status(400).json({ error: `Invalid status. Must be one of: ${validStatuses.join(', ')}.` });\n return;\n }\n\n let content = await readFile(assignmentPath, 'utf-8');\n content = setTopLevelField(content, 'status', status);\n content = setTopLevelField(content, 'updated', nowTimestamp());\n\n // Clear blockedReason when moving away from blocked\n if (status !== 'blocked') {\n content = setTopLevelField(content, 'blockedReason', null);\n }\n\n await writeFileForce(assignmentPath, content);\n\n const assignment = await getAssignmentDetail(projectsDir, projectSlug, assignmentSlug);\n res.json({ assignment });\n } catch (error) {\n console.error('Error overriding assignment status:', error);\n res.status(500).json({ error: `Failed to override status: ${(error as Error).message}` });\n }\n });\n\n // --- Lifecycle Transitions ---\n\n router.post('/api/projects/:slug/assignments/:aslug/transitions/:command', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const command = req.params.command as Parameters<typeof executeTransition>[2];\n const config = await getStatusConfig();\n const validCommands = [...new Set(config.transitions.map((t) => t.command))];\n if (!validCommands.includes(command)) {\n res.status(400).json({ error: `Unsupported transition command \"${req.params.command}\"` });\n return;\n }\n\n const projectDir = resolve(projectsDir, projectSlug);\n const assignmentPath = resolve(projectDir, 'assignments', assignmentSlug, 'assignment.md');\n if (!(await fileExists(assignmentPath))) {\n res.status(404).json({ error: 'Assignment not found' });\n return;\n }\n\n const { reason } = req.body || {};\n const result = await executeTransition(projectDir, assignmentSlug, command, {\n reason: typeof reason === 'string' ? reason : undefined,\n transitionTable: config.custom ? config.transitionTable : undefined,\n terminalStatuses: config.custom ? config.terminalStatuses : undefined,\n });\n\n if (!result.success) {\n res.status(400).json({ error: result.message });\n return;\n }\n\n const assignment = await getAssignmentDetail(projectsDir, projectSlug, assignmentSlug);\n res.json({ assignment, transition: result });\n } catch (error) {\n console.error('Error running assignment transition:', error);\n res.status(500).json({ error: `Failed to transition assignment: ${(error as Error).message}` });\n }\n });\n\n router.delete('/api/projects/:slug/assignments/:aslug', async (req: Request, res: Response) => {\n try {\n const projectSlug = getParam(req.params.slug);\n const assignmentSlug = getParam(req.params.aslug);\n const assignmentDir = resolve(projectsDir, projectSlug, 'assignments', assignmentSlug);\n const assignmentPath = resolve(assignmentDir, 'assignment.md');\n\n if (!(await fileExists(assignmentPath))) {\n res.status(404).json({ error: `Assignment \"${assignmentSlug}\" not found in project \"${projectSlug}\"` });\n return;\n }\n\n await rm(assignmentDir, { recursive: true, force: true });\n res.json({ deleted: assignmentSlug, projectSlug });\n } catch (error) {\n console.error('Error deleting assignment:', error);\n res.status(500).json({ error: `Failed to delete assignment: ${(error as Error).message}` });\n }\n });\n\n // =========================================================================\n // Standalone (by-id) routes — `~/.syntaur/assignments/<uuid>/`\n // Active only when the write router was constructed with an assignmentsDir.\n // =========================================================================\n\n router.post('/api/assignments', async (req: Request, res: Response) => {\n try {\n if (!assignmentsDir) {\n res.status(501).json({ error: 'Standalone assignments not configured on this server' });\n return;\n }\n const { title, slug, priority, type } = req.body || {};\n if (!title || typeof title !== 'string' || !title.trim()) {\n res.status(400).json({ error: 'title is required' });\n return;\n }\n const { dependsOn } = req.body || {};\n if (Array.isArray(dependsOn) && dependsOn.length > 0) {\n res.status(400).json({ error: 'Standalone assignments cannot declare dependsOn.' });\n return;\n }\n\n const id = generateId();\n const assignmentDir = resolve(assignmentsDir, id);\n if (await fileExists(assignmentDir)) {\n res.status(500).json({ error: 'UUID collision — try again' });\n return;\n }\n\n const timestamp = nowTimestamp();\n const resolvedSlug = typeof slug === 'string' && slug.trim() ? slug.trim() : slugifyLocal(title);\n const resolvedPriority = (typeof priority === 'string' && ['low', 'medium', 'high', 'critical'].includes(priority))\n ? (priority as 'low' | 'medium' | 'high' | 'critical')\n : 'medium';\n\n await ensureDir(assignmentDir);\n const assignmentContent = renderAssignment({\n id,\n slug: resolvedSlug,\n title: title.trim(),\n timestamp,\n priority: resolvedPriority,\n dependsOn: [],\n links: [],\n project: null,\n type: typeof type === 'string' ? type : undefined,\n });\n await writeFileForce(resolve(assignmentDir, 'assignment.md'), assignmentContent);\n await writeFileForce(\n resolve(assignmentDir, 'scratchpad.md'),\n renderScratchpad({ assignmentSlug: id, timestamp }),\n );\n await writeFileForce(\n resolve(assignmentDir, 'handoff.md'),\n renderHandoff({ assignmentSlug: id, timestamp }),\n );\n await writeFileForce(\n resolve(assignmentDir, 'decision-record.md'),\n renderDecisionRecord({ assignmentSlug: id, timestamp }),\n );\n await writeFileForce(\n resolve(assignmentDir, 'progress.md'),\n renderProgress({ assignment: id, timestamp }),\n );\n await writeFileForce(\n resolve(assignmentDir, 'comments.md'),\n renderComments({ assignment: id, timestamp }),\n );\n\n const detail = await getAssignmentDetailById(projectsDir, assignmentsDir, id);\n res.status(201).json({ assignment: detail });\n } catch (error) {\n console.error('Error creating standalone assignment:', error);\n res.status(500).json({ error: `Failed to create standalone assignment: ${(error as Error).message}` });\n }\n });\n\n router.post('/api/assignments/:id/comments', async (req: Request, res: Response) => {\n try {\n if (!assignmentsDir) {\n res.status(501).json({ error: 'Standalone assignments not configured on this server' });\n return;\n }\n const id = getParam(req.params.id);\n const resolved = await resolveAssignmentById(projectsDir, assignmentsDir, id);\n if (!resolved) {\n res.status(404).json({ error: `Assignment \"${id}\" not found` });\n return;\n }\n await appendCommentTo(resolved.assignmentDir, resolved.standalone ? resolved.id : resolved.assignmentSlug, req, res, async () => {\n return resolved.standalone\n ? getAssignmentDetailById(projectsDir, assignmentsDir, id)\n : getAssignmentDetail(projectsDir, resolved.projectSlug!, resolved.assignmentSlug);\n });\n } catch (error) {\n console.error('Error appending comment (by id):', error);\n res.status(500).json({ error: `Failed to append comment: ${(error as Error).message}` });\n }\n });\n\n router.patch('/api/assignments/:id/comments/:commentId/resolved', async (req: Request, res: Response) => {\n try {\n if (!assignmentsDir) {\n res.status(501).json({ error: 'Standalone assignments not configured on this server' });\n return;\n }\n const id = getParam(req.params.id);\n const commentId = getParam(req.params.commentId);\n const resolved = await resolveAssignmentById(projectsDir, assignmentsDir, id);\n if (!resolved) {\n res.status(404).json({ error: `Assignment \"${id}\" not found` });\n return;\n }\n await toggleCommentResolvedAt(resolved.assignmentDir, commentId, req, res, async () => {\n return resolved.standalone\n ? getAssignmentDetailById(projectsDir, assignmentsDir, id)\n : getAssignmentDetail(projectsDir, resolved.projectSlug!, resolved.assignmentSlug);\n });\n } catch (error) {\n console.error('Error toggling comment resolved (by id):', error);\n res.status(500).json({ error: `Failed to toggle resolved: ${(error as Error).message}` });\n }\n });\n\n router.get('/api/assignments/:id/edit', async (req: Request, res: Response) => {\n if (!assignmentsDir) {\n res.status(501).json({ error: 'Standalone assignments not configured on this server' });\n return;\n }\n const id = getParam(req.params.id);\n const doc = await getEditableDocumentById(projectsDir, assignmentsDir, 'assignment', id);\n if (!doc) {\n res.status(404).json({ error: 'Assignment not found' });\n return;\n }\n res.json(doc);\n });\n\n router.get('/api/assignments/:id/plan/edit', async (req: Request, res: Response) => {\n if (!assignmentsDir) {\n res.status(501).json({ error: 'Standalone assignments not configured on this server' });\n return;\n }\n const id = getParam(req.params.id);\n const doc = await getEditableDocumentById(projectsDir, assignmentsDir, 'plan', id);\n if (!doc) {\n res.status(404).json({ error: 'Plan not found' });\n return;\n }\n res.json(doc);\n });\n\n router.get('/api/assignments/:id/scratchpad/edit', async (req: Request, res: Response) => {\n if (!assignmentsDir) {\n res.status(501).json({ error: 'Standalone assignments not configured on this server' });\n return;\n }\n const id = getParam(req.params.id);\n const doc = await getEditableDocumentById(projectsDir, assignmentsDir, 'scratchpad', id);\n if (!doc) {\n res.status(404).json({ error: 'Scratchpad not found' });\n return;\n }\n res.json(doc);\n });\n\n router.get('/api/assignments/:id/handoff/edit', async (req: Request, res: Response) => {\n if (!assignmentsDir) {\n res.status(501).json({ error: 'Standalone assignments not configured on this server' });\n return;\n }\n const id = getParam(req.params.id);\n const doc = await getEditableDocumentById(projectsDir, assignmentsDir, 'handoff', id);\n if (!doc) {\n res.status(404).json({ error: 'Handoff log not found' });\n return;\n }\n res.json(doc);\n });\n\n router.get('/api/assignments/:id/decision-record/edit', async (req: Request, res: Response) => {\n if (!assignmentsDir) {\n res.status(501).json({ error: 'Standalone assignments not configured on this server' });\n return;\n }\n const id = getParam(req.params.id);\n const doc = await getEditableDocumentById(projectsDir, assignmentsDir, 'decision-record', id);\n if (!doc) {\n res.status(404).json({ error: 'Decision record not found' });\n return;\n }\n res.json(doc);\n });\n\n router.patch('/api/assignments/:id', async (req: Request, res: Response) => {\n try {\n if (!assignmentsDir) {\n res.status(501).json({ error: 'Standalone assignments not configured on this server' });\n return;\n }\n const id = getParam(req.params.id);\n const resolved = await resolveAssignmentById(projectsDir, assignmentsDir, id);\n if (!resolved) {\n res.status(404).json({ error: `Assignment \"${id}\" not found` });\n return;\n }\n\n const assignmentPath = resolve(resolved.assignmentDir, 'assignment.md');\n const currentContent = await readCurrentDocument(assignmentPath);\n if (!currentContent) {\n res.status(404).json({ error: 'Assignment not found' });\n return;\n }\n\n const nextContentRaw = requireContent(req, res);\n if (!nextContentRaw) return;\n\n const current = parseAssignmentFull(currentContent);\n const next = parseAssignmentFull(nextContentRaw);\n\n if (!next.title) {\n res.status(400).json({ error: 'Assignment content must include a title.' });\n return;\n }\n\n // Standalone: restore id + project + slug frontmatter (all immutable after create).\n let nextContent = nextContentRaw;\n if (current.id) nextContent = setTopLevelField(nextContent, 'id', current.id);\n nextContent = setTopLevelField(nextContent, 'project', null);\n if (current.slug) nextContent = setTopLevelField(nextContent, 'slug', current.slug);\n\n if (next.status !== current.status && current.status === 'blocked' && next.status !== 'blocked') {\n nextContent = setTopLevelField(nextContent, 'blockedReason', null);\n }\n\n nextContent = setTopLevelField(nextContent, 'updated', nowTimestamp());\n await writeFileForce(assignmentPath, nextContent);\n\n const assignment = await getAssignmentDetailById(projectsDir, assignmentsDir, id);\n res.json({ assignment, content: nextContent });\n } catch (error) {\n console.error('Error updating standalone assignment:', error);\n res.status(500).json({ error: `Failed to update assignment: ${(error as Error).message}` });\n }\n });\n\n router.patch('/api/assignments/:id/plan', async (req: Request, res: Response) => {\n try {\n if (!assignmentsDir) {\n res.status(501).json({ error: 'Standalone assignments not configured on this server' });\n return;\n }\n const id = getParam(req.params.id);\n const resolved = await resolveAssignmentById(projectsDir, assignmentsDir, id);\n if (!resolved) {\n res.status(404).json({ error: `Assignment \"${id}\" not found` });\n return;\n }\n\n const planPath = resolve(resolved.assignmentDir, 'plan.md');\n const currentContent = await readCurrentDocument(planPath);\n if (!currentContent) {\n res.status(404).json({ error: 'Plan not found' });\n return;\n }\n const nextContentRaw = requireContent(req, res);\n if (!nextContentRaw) return;\n\n const parsed = parsePlan(nextContentRaw);\n if (!parsed.assignment) {\n res.status(400).json({ error: 'Plan content must include the assignment field.' });\n return;\n }\n\n const nextContent = setTopLevelField(nextContentRaw, 'updated', nowTimestamp());\n await writeFileForce(planPath, nextContent);\n\n const assignment = await getAssignmentDetailById(projectsDir, assignmentsDir, id);\n res.json({ assignment, content: nextContent });\n } catch (error) {\n console.error('Error updating standalone plan:', error);\n res.status(500).json({ error: `Failed to update plan: ${(error as Error).message}` });\n }\n });\n\n router.patch('/api/assignments/:id/scratchpad', async (req: Request, res: Response) => {\n try {\n if (!assignmentsDir) {\n res.status(501).json({ error: 'Standalone assignments not configured on this server' });\n return;\n }\n const id = getParam(req.params.id);\n const resolved = await resolveAssignmentById(projectsDir, assignmentsDir, id);\n if (!resolved) {\n res.status(404).json({ error: `Assignment \"${id}\" not found` });\n return;\n }\n\n const scratchpadPath = resolve(resolved.assignmentDir, 'scratchpad.md');\n const currentContent = await readCurrentDocument(scratchpadPath);\n if (!currentContent) {\n res.status(404).json({ error: 'Scratchpad not found' });\n return;\n }\n const nextContentRaw = requireContent(req, res);\n if (!nextContentRaw) return;\n\n const parsed = parseScratchpad(nextContentRaw);\n if (!parsed.assignment) {\n res.status(400).json({ error: 'Scratchpad content must include the assignment field.' });\n return;\n }\n\n const nextContent = setTopLevelField(nextContentRaw, 'updated', nowTimestamp());\n await writeFileForce(scratchpadPath, nextContent);\n\n const assignment = await getAssignmentDetailById(projectsDir, assignmentsDir, id);\n res.json({ assignment, content: nextContent });\n } catch (error) {\n console.error('Error updating standalone scratchpad:', error);\n res.status(500).json({ error: `Failed to update scratchpad: ${(error as Error).message}` });\n }\n });\n\n router.post('/api/assignments/:id/handoff/entries', async (req: Request, res: Response) => {\n try {\n if (!assignmentsDir) {\n res.status(501).json({ error: 'Standalone assignments not configured on this server' });\n return;\n }\n const id = getParam(req.params.id);\n const resolved = await resolveAssignmentById(projectsDir, assignmentsDir, id);\n if (!resolved) {\n res.status(404).json({ error: `Assignment \"${id}\" not found` });\n return;\n }\n const handoffPath = resolve(resolved.assignmentDir, 'handoff.md');\n const currentContent = await readCurrentDocument(handoffPath);\n if (!currentContent) {\n res.status(404).json({ error: 'Handoff log not found' });\n return;\n }\n const { title, body } = req.body || {};\n if (!body || typeof body !== 'string' || !body.trim()) {\n res.status(400).json({ error: 'body is required' });\n return;\n }\n const parsed = parseHandoff(currentContent);\n const nextContent = appendLogEntry(\n currentContent,\n 'handoffCount',\n parsed.handoffCount + 1,\n title && typeof title === 'string' && title.trim() ? title.trim() : `Handoff ${parsed.handoffCount + 1}`,\n body,\n 'No handoffs recorded yet.',\n );\n await writeFileForce(handoffPath, nextContent);\n const assignment = await getAssignmentDetailById(projectsDir, assignmentsDir, id);\n res.status(201).json({ assignment, content: nextContent });\n } catch (error) {\n console.error('Error appending standalone handoff entry:', error);\n res.status(500).json({ error: `Failed to append handoff entry: ${(error as Error).message}` });\n }\n });\n\n router.post('/api/assignments/:id/decision-record/entries', async (req: Request, res: Response) => {\n try {\n if (!assignmentsDir) {\n res.status(501).json({ error: 'Standalone assignments not configured on this server' });\n return;\n }\n const id = getParam(req.params.id);\n const resolved = await resolveAssignmentById(projectsDir, assignmentsDir, id);\n if (!resolved) {\n res.status(404).json({ error: `Assignment \"${id}\" not found` });\n return;\n }\n const decisionPath = resolve(resolved.assignmentDir, 'decision-record.md');\n const currentContent = await readCurrentDocument(decisionPath);\n if (!currentContent) {\n res.status(404).json({ error: 'Decision record not found' });\n return;\n }\n const { title, body } = req.body || {};\n if (!body || typeof body !== 'string' || !body.trim()) {\n res.status(400).json({ error: 'body is required' });\n return;\n }\n const parsed = parseDecisionRecord(currentContent);\n const nextContent = appendLogEntry(\n currentContent,\n 'decisionCount',\n parsed.decisionCount + 1,\n title && typeof title === 'string' && title.trim() ? title.trim() : `Decision ${parsed.decisionCount + 1}`,\n body,\n 'No decisions recorded yet.',\n );\n await writeFileForce(decisionPath, nextContent);\n const assignment = await getAssignmentDetailById(projectsDir, assignmentsDir, id);\n res.status(201).json({ assignment, content: nextContent });\n } catch (error) {\n console.error('Error appending standalone decision entry:', error);\n res.status(500).json({ error: `Failed to append decision entry: ${(error as Error).message}` });\n }\n });\n\n router.post('/api/assignments/:id/status-override', async (req: Request, res: Response) => {\n try {\n if (!assignmentsDir) {\n res.status(501).json({ error: 'Standalone assignments not configured on this server' });\n return;\n }\n const id = getParam(req.params.id);\n const resolved = await resolveAssignmentById(projectsDir, assignmentsDir, id);\n if (!resolved) {\n res.status(404).json({ error: `Assignment \"${id}\" not found` });\n return;\n }\n const assignmentPath = resolve(resolved.assignmentDir, 'assignment.md');\n if (!(await fileExists(assignmentPath))) {\n res.status(404).json({ error: 'Assignment not found' });\n return;\n }\n const { status } = req.body || {};\n const config = await getStatusConfig();\n const validStatuses = config.statuses.map((s) => s.id);\n if (typeof status !== 'string' || !validStatuses.includes(status)) {\n res.status(400).json({ error: `Invalid status. Must be one of: ${validStatuses.join(', ')}.` });\n return;\n }\n let content = await readFile(assignmentPath, 'utf-8');\n content = setTopLevelField(content, 'status', status);\n content = setTopLevelField(content, 'updated', nowTimestamp());\n if (status !== 'blocked') {\n content = setTopLevelField(content, 'blockedReason', null);\n }\n await writeFileForce(assignmentPath, content);\n const assignment = await getAssignmentDetailById(projectsDir, assignmentsDir, id);\n res.json({ assignment });\n } catch (error) {\n console.error('Error overriding standalone status:', error);\n res.status(500).json({ error: `Failed to override status: ${(error as Error).message}` });\n }\n });\n\n router.patch('/api/assignments/:id/acceptance-criteria/:index', async (req: Request, res: Response) => {\n try {\n if (!assignmentsDir) {\n res.status(501).json({ error: 'Standalone assignments not configured on this server' });\n return;\n }\n const id = getParam(req.params.id);\n const resolved = await resolveAssignmentById(projectsDir, assignmentsDir, id);\n if (!resolved) {\n res.status(404).json({ error: `Assignment \"${id}\" not found` });\n return;\n }\n const assignmentPath = resolve(resolved.assignmentDir, 'assignment.md');\n const currentContent = await readCurrentDocument(assignmentPath);\n if (!currentContent) {\n res.status(404).json({ error: 'Assignment not found' });\n return;\n }\n const { checked } = req.body || {};\n if (typeof checked !== 'boolean') {\n res.status(400).json({ error: 'checked must be a boolean' });\n return;\n }\n const index = Number.parseInt(getParam(req.params.index), 10);\n const result = toggleAcceptanceCriterion(currentContent, index, checked);\n if ('error' in result) {\n res.status(400).json({ error: result.error });\n return;\n }\n const nextContent = setTopLevelField(result.content, 'updated', nowTimestamp());\n await writeFileForce(assignmentPath, nextContent);\n const assignment = await getAssignmentDetailById(projectsDir, assignmentsDir, id);\n res.json({ assignment, content: nextContent });\n } catch (error) {\n console.error('Error toggling standalone acceptance criterion:', error);\n res.status(500).json({ error: `Failed to toggle acceptance criterion: ${(error as Error).message}` });\n }\n });\n\n router.post('/api/assignments/:id/transitions/:command', async (req: Request, res: Response) => {\n try {\n if (!assignmentsDir) {\n res.status(501).json({ error: 'Standalone assignments not configured on this server' });\n return;\n }\n const id = getParam(req.params.id);\n const command = getParam(req.params.command);\n const resolved = await resolveAssignmentById(projectsDir, assignmentsDir, id);\n if (!resolved) {\n res.status(404).json({ error: `Assignment \"${id}\" not found` });\n return;\n }\n\n const { reason } = req.body || {};\n const transitionResult = await executeTransitionByDir(\n resolved.assignmentDir,\n command as any,\n {\n standalone: resolved.standalone,\n reason: typeof reason === 'string' ? reason : undefined,\n },\n );\n if (!transitionResult.success) {\n res.status(400).json({ error: transitionResult.message, fromStatus: transitionResult.fromStatus });\n return;\n }\n\n const detail = resolved.standalone\n ? await getAssignmentDetailById(projectsDir, assignmentsDir, id)\n : await getAssignmentDetail(projectsDir, resolved.projectSlug!, resolved.assignmentSlug);\n res.json({ assignment: detail, warnings: transitionResult.warnings ?? [] });\n } catch (error) {\n console.error('Error transitioning by id:', error);\n res.status(500).json({ error: `Failed to transition: ${(error as Error).message}` });\n }\n });\n\n return router;\n}\n\nfunction slugifyLocal(input: string): string {\n return input\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'untitled';\n}\n\nasync function appendCommentTo(\n assignmentDir: string,\n assignmentRef: string,\n req: Request,\n res: Response,\n reloadDetail: () => Promise<unknown>,\n): Promise<void> {\n const commentsPath = resolve(assignmentDir, 'comments.md');\n const { body, author, type, replyTo } = req.body || {};\n if (!body || typeof body !== 'string' || !body.trim()) {\n res.status(400).json({ error: 'body is required' });\n return;\n }\n const commentType: CommentType = type && ['question', 'note', 'feedback'].includes(type) ? type : 'note';\n const timestamp = nowTimestamp();\n const entryAuthor = (typeof author === 'string' && author.trim()) ? author.trim() : 'human';\n\n let currentContent: string;\n let currentCount = 0;\n if (await fileExists(commentsPath)) {\n currentContent = await readFile(commentsPath, 'utf-8');\n const countMatch = currentContent.match(/^entryCount:\\s*(\\d+)/m);\n if (countMatch) currentCount = parseInt(countMatch[1], 10);\n } else {\n currentContent = renderComments({ assignment: assignmentRef, timestamp });\n }\n\n const comment: Comment = {\n id: generateId().split('-')[0],\n timestamp,\n author: entryAuthor,\n type: commentType,\n body,\n replyTo: typeof replyTo === 'string' && replyTo.trim() ? replyTo.trim() : undefined,\n resolved: commentType === 'question' ? false : undefined,\n };\n const entry = formatCommentEntry(comment);\n let next = setTopLevelField(currentContent, 'entryCount', String(currentCount + 1));\n next = setTopLevelField(next, 'updated', `\"${timestamp}\"`);\n if (next.includes('No comments yet.')) {\n next = next.replace('No comments yet.', entry.trimEnd());\n } else {\n next = `${next.trimEnd()}\\n\\n${entry}`;\n }\n await writeFileForce(commentsPath, next);\n const assignment = await reloadDetail();\n res.status(201).json({ assignment, comment: { id: comment.id } });\n}\n\nasync function toggleCommentResolvedAt(\n assignmentDir: string,\n commentId: string,\n req: Request,\n res: Response,\n reloadDetail: () => Promise<unknown>,\n): Promise<void> {\n const commentsPath = resolve(assignmentDir, 'comments.md');\n if (!(await fileExists(commentsPath))) {\n res.status(404).json({ error: 'Comments file not found' });\n return;\n }\n const { resolved: desired } = req.body || {};\n if (typeof desired !== 'boolean') {\n res.status(400).json({ error: 'resolved (boolean) is required' });\n return;\n }\n const content = await readFile(commentsPath, 'utf-8');\n const parsed = parseComments(content);\n const target = parsed.entries.find((e) => e.id === commentId);\n if (!target) {\n res.status(404).json({ error: `Comment ${commentId} not found` });\n return;\n }\n if (target.type !== 'question') {\n res.status(400).json({ error: 'Only questions can be resolved' });\n return;\n }\n const entryBlockRegex = new RegExp(\n `(^## ${commentId.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}[\\\\s\\\\S]*?)(\\\\*\\\\*Resolved:\\\\*\\\\*\\\\s*(?:true|false))`,\n 'm',\n );\n const next = content.replace(entryBlockRegex, (_m, preamble) => `${preamble}**Resolved:** ${desired ? 'true' : 'false'}`);\n if (next === content) {\n res.status(500).json({ error: 'Failed to update resolved flag' });\n return;\n }\n const withUpdated = setTopLevelField(next, 'updated', `\"${nowTimestamp()}\"`);\n await writeFileForce(commentsPath, withUpdated);\n const assignment = await reloadDetail();\n res.json({ assignment });\n}\n","export interface ToggleAcceptanceCriterionResult {\n content: string;\n}\n\nexport interface ToggleAcceptanceCriterionError {\n error: string;\n}\n\nfunction splitFrontmatter(content: string): { prefix: string; body: string } {\n const match = content.match(/^(---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?)([\\s\\S]*)$/);\n if (!match) {\n return { prefix: '', body: content };\n }\n\n return {\n prefix: match[1],\n body: match[2],\n };\n}\n\nexport function toggleAcceptanceCriterion(\n content: string,\n index: number,\n checked: boolean,\n): ToggleAcceptanceCriterionResult | ToggleAcceptanceCriterionError {\n if (!Number.isInteger(index) || index < 0) {\n return { error: 'acceptance criteria index must be a non-negative integer' };\n }\n\n const { prefix, body } = splitFrontmatter(content);\n const lines = body.split('\\n');\n const sectionStart = lines.findIndex((line) => /^##\\s+Acceptance Criteria\\s*$/i.test(line.trim()));\n\n if (sectionStart === -1) {\n return { error: 'Acceptance Criteria section not found.' };\n }\n\n let sectionEnd = lines.length;\n for (let lineIndex = sectionStart + 1; lineIndex < lines.length; lineIndex += 1) {\n if (/^#{1,2}\\s+\\S/.test(lines[lineIndex].trim())) {\n sectionEnd = lineIndex;\n break;\n }\n }\n\n const checklistLines = lines\n .map((line, lineIndex) => ({ line, lineIndex }))\n .filter(({ lineIndex, line }) =>\n lineIndex > sectionStart\n && lineIndex < sectionEnd\n && /^\\s*[-*]\\s+\\[( |x|X)\\]\\s+.*$/.test(line),\n );\n\n const target = checklistLines[index];\n if (!target) {\n return { error: `Acceptance criteria item ${index} not found.` };\n }\n\n const nextLine = target.line.replace(\n /^(\\s*[-*]\\s+\\[)( |x|X)(\\]\\s+.*)$/,\n `$1${checked ? 'x' : ' '}$3`,\n );\n\n lines[target.lineIndex] = nextLine;\n return {\n content: `${prefix}${lines.join('\\n')}`,\n };\n}\n","import { Router } from 'express';\nimport {\n registerSession,\n removeSession,\n listSessionFiles,\n readSessionFile,\n updateLastRefreshed,\n setOverride,\n sanitizeSessionName,\n} from './servers.js';\nimport {\n scanAllSessions,\n scanSingleSession,\n clearScanCache,\n} from './scanner.js';\n\nexport function createServersRouter(\n serversDir: string,\n projectsDir: string,\n assignmentsDir?: string,\n): Router {\n const router = Router();\n\n // GET /api/servers — all sessions with cached scan data\n router.get('/', async (_req, res) => {\n try {\n const result = await scanAllSessions(serversDir, projectsDir, { assignmentsDir });\n res.json(result);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Scan failed' });\n }\n });\n\n // GET /api/servers/:name — single session\n router.get('/:name', async (req, res) => {\n try {\n const session = await scanSingleSession(serversDir, projectsDir, req.params.name, { assignmentsDir });\n if (!session) {\n res.status(404).json({ error: 'Session not found' });\n return;\n }\n res.json(session);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Scan failed' });\n }\n });\n\n // POST /api/servers — register a new session\n router.post('/', async (req, res) => {\n try {\n const { name } = req.body;\n if (!name || typeof name !== 'string') {\n res.status(400).json({ error: 'name is required' });\n return;\n }\n const sanitized = sanitizeSessionName(name);\n const existing = await readSessionFile(serversDir, sanitized);\n if (existing) {\n res.status(409).json({ error: `Session \"${sanitized}\" already registered` });\n return;\n }\n await registerSession(serversDir, name);\n clearScanCache();\n res.status(201).json({ name: sanitized });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Registration failed' });\n }\n });\n\n // DELETE /api/servers/:name — unregister\n router.delete('/:name', async (req, res) => {\n try {\n const data = await readSessionFile(serversDir, req.params.name);\n if (!data) {\n res.status(404).json({ error: 'Session not found' });\n return;\n }\n await removeSession(serversDir, req.params.name);\n clearScanCache();\n res.json({ removed: req.params.name });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Removal failed' });\n }\n });\n\n // POST /api/servers/refresh — fresh scan all (must be before /:name/refresh)\n router.post('/refresh', async (_req, res) => {\n try {\n const names = await listSessionFiles(serversDir);\n for (const name of names) {\n await updateLastRefreshed(serversDir, name);\n }\n clearScanCache();\n const result = await scanAllSessions(serversDir, projectsDir, { bypassCache: true, assignmentsDir });\n res.json(result);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Refresh failed' });\n }\n });\n\n // POST /api/servers/:name/refresh — fresh scan one\n router.post('/:name/refresh', async (req, res) => {\n try {\n const data = await readSessionFile(serversDir, req.params.name);\n if (!data) {\n res.status(404).json({ error: 'Session not found' });\n return;\n }\n await updateLastRefreshed(serversDir, req.params.name);\n clearScanCache();\n const session = await scanSingleSession(serversDir, projectsDir, req.params.name, { assignmentsDir });\n res.json(session);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Refresh failed' });\n }\n });\n\n // PATCH /api/servers/:name/panes/:windowIndex/:paneIndex/assignment — manual link\n router.patch('/:name/panes/:windowIndex/:paneIndex/assignment', async (req, res) => {\n try {\n const { name, windowIndex, paneIndex } = req.params;\n const data = await readSessionFile(serversDir, name);\n if (!data) {\n res.status(404).json({ error: 'Session not found' });\n return;\n }\n const body = req.body;\n if (body === null || (body && body.project && body.assignment)) {\n await setOverride(\n serversDir,\n name,\n parseInt(windowIndex, 10),\n parseInt(paneIndex, 10),\n body,\n );\n clearScanCache();\n res.json({ updated: true });\n } else {\n res.status(400).json({ error: 'Body must be { project, assignment } or null' });\n }\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Update failed' });\n }\n });\n\n return router;\n}\n","import { Router } from 'express';\nimport { resolve } from 'node:path';\nimport {\n listAllSessions,\n listProjectSessions,\n appendSession,\n updateSessionStatus,\n deleteSessions,\n reconcileActiveSessions,\n listSessionsByAssignment,\n} from './agent-sessions.js';\nimport { fileExists } from '../utils/fs.js';\nimport { resolveAssignmentById } from '../utils/assignment-resolver.js';\nimport type { AgentSessionStatus, WsMessage } from './types.js';\n\nexport function createAgentSessionsRouter(\n projectsDir: string,\n broadcast?: (msg: WsMessage) => void,\n assignmentsDir?: string,\n): Router {\n const router = Router();\n\n // GET /api/agent-sessions — all sessions across all projects\n router.get('/', async (_req, res) => {\n try {\n await reconcileActiveSessions(projectsDir, assignmentsDir);\n const sessions = await listAllSessions(projectsDir);\n res.json({ sessions, generatedAt: new Date().toISOString() });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to list sessions' });\n }\n });\n\n // GET /api/agent-sessions/:projectSlug — sessions for one project\n router.get('/:projectSlug', async (req, res) => {\n try {\n const { projectSlug } = req.params;\n const assignment = req.query.assignment as string | undefined;\n const projectDir = resolve(projectsDir, projectSlug);\n if (!(await fileExists(projectDir))) {\n res.status(404).json({ error: `Project \"${projectSlug}\" not found` });\n return;\n }\n await reconcileActiveSessions(projectsDir, assignmentsDir);\n const sessions = await listProjectSessions(projectsDir, projectSlug, assignment);\n res.json({ sessions, generatedAt: new Date().toISOString() });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to list sessions' });\n }\n });\n\n // POST /api/agent-sessions — register a new session\n router.post('/', async (req, res) => {\n try {\n const { projectSlug, assignmentSlug, agent, sessionId, path, description, transcriptPath } =\n req.body;\n\n if (!agent) {\n res.status(400).json({ error: 'agent is required' });\n return;\n }\n\n if (!sessionId) {\n res.status(400).json({\n error:\n 'sessionId is required. Pass the real agent-generated session id — do not synthesize one.',\n });\n return;\n }\n\n if (projectSlug) {\n const projectDir = resolve(projectsDir, projectSlug);\n if (!(await fileExists(projectDir))) {\n res.status(404).json({ error: `Project \"${projectSlug}\" not found` });\n return;\n }\n }\n\n const session = {\n projectSlug: projectSlug || null,\n assignmentSlug: assignmentSlug || null,\n agent,\n sessionId,\n started: new Date().toISOString(),\n status: 'active' as AgentSessionStatus,\n path: path || '',\n description: description || null,\n transcriptPath: transcriptPath || null,\n };\n\n await appendSession('', session);\n broadcast?.({ type: 'agent-sessions-updated', timestamp: new Date().toISOString() });\n res.status(201).json({ sessionId });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Registration failed' });\n }\n });\n\n // PATCH /api/agent-sessions/:sessionId/status — update session status\n router.patch('/:sessionId/status', async (req, res) => {\n try {\n const { sessionId } = req.params;\n const { status } = req.body;\n\n if (!status) {\n res.status(400).json({ error: 'status is required' });\n return;\n }\n\n if (!['active', 'completed', 'stopped'].includes(status)) {\n res.status(400).json({ error: 'status must be active, completed, or stopped' });\n return;\n }\n\n const updated = await updateSessionStatus('', sessionId, status);\n if (!updated) {\n res.status(404).json({ error: `Session \"${sessionId}\" not found` });\n return;\n }\n\n broadcast?.({ type: 'agent-sessions-updated', timestamp: new Date().toISOString() });\n res.json({ updated: true });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Update failed' });\n }\n });\n\n // DELETE /api/agent-sessions — delete one or more sessions\n router.delete('/', async (req, res) => {\n try {\n const { sessionIds } = req.body;\n\n if (!Array.isArray(sessionIds) || sessionIds.length === 0) {\n res.status(400).json({ error: 'sessionIds must be a non-empty array' });\n return;\n }\n\n const deleted = await deleteSessions(sessionIds);\n broadcast?.({ type: 'agent-sessions-updated', timestamp: new Date().toISOString() });\n res.json({ deleted });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Delete failed' });\n }\n });\n\n return router;\n}\n","import { Router } from 'express';\nimport { resolve } from 'node:path';\nimport { readFile, unlink } from 'node:fs/promises';\nimport { listPlaybooks, getPlaybookDetail } from './api.js';\nimport { parsePlaybook } from './parser.js';\nimport { isValidSlug } from '../utils/slug.js';\nimport { nowTimestamp } from '../utils/timestamp.js';\nimport { ensureDir, fileExists, writeFileForce } from '../utils/fs.js';\nimport { renderPlaybook } from '../templates/playbook.js';\nimport { rebuildPlaybookManifest } from '../utils/playbooks.js';\n\nexport function createPlaybooksRouter(playbooksDir: string): Router {\n const router = Router();\n\n // GET / — list all playbooks\n router.get('/', async (_req, res) => {\n try {\n const playbooks = await listPlaybooks(playbooksDir);\n res.json({ playbooks, generatedAt: new Date().toISOString() });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to list playbooks' });\n }\n });\n\n // GET /template/new — scaffold template (must be before /:slug to avoid param capture)\n router.get('/template/new', async (_req, res) => {\n try {\n const content = renderPlaybook({\n slug: 'my-playbook',\n name: 'My Playbook',\n description: 'A new playbook',\n timestamp: nowTimestamp(),\n });\n res.json({ content });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to get template' });\n }\n });\n\n // GET /:slug — get playbook detail\n router.get('/:slug', async (req, res) => {\n try {\n const detail = await getPlaybookDetail(playbooksDir, req.params.slug);\n if (!detail) {\n res.status(404).json({ error: `Playbook \"${req.params.slug}\" not found` });\n return;\n }\n res.json(detail);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to get playbook' });\n }\n });\n\n // GET /:slug/edit — raw file content for editor\n router.get('/:slug/edit', async (req, res) => {\n try {\n const filePath = resolve(playbooksDir, `${req.params.slug}.md`);\n if (!(await fileExists(filePath))) {\n res.status(404).json({ error: `Playbook \"${req.params.slug}\" not found` });\n return;\n }\n const content = await readFile(filePath, 'utf-8');\n res.json({\n documentType: 'playbook',\n title: `Edit Playbook: ${req.params.slug}`,\n content,\n slug: req.params.slug,\n });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to get playbook for editing' });\n }\n });\n\n // POST / — create new playbook\n router.post('/', async (req, res) => {\n try {\n const { content } = req.body;\n if (!content || typeof content !== 'string') {\n res.status(400).json({ error: 'content is required' });\n return;\n }\n\n const parsed = parsePlaybook(content);\n const slug = parsed.slug;\n if (!slug || !isValidSlug(slug)) {\n res.status(400).json({ error: `Invalid or missing slug: \"${slug}\"` });\n return;\n }\n\n await ensureDir(playbooksDir);\n const filePath = resolve(playbooksDir, `${slug}.md`);\n if (await fileExists(filePath)) {\n res.status(409).json({ error: `Playbook \"${slug}\" already exists` });\n return;\n }\n\n await writeFileForce(filePath, content);\n await rebuildPlaybookManifest(playbooksDir);\n res.status(201).json({ slug, path: filePath });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to create playbook' });\n }\n });\n\n // PUT /:slug — update playbook content\n router.put('/:slug', async (req, res) => {\n try {\n const { content } = req.body;\n if (!content || typeof content !== 'string') {\n res.status(400).json({ error: 'content is required' });\n return;\n }\n\n const filePath = resolve(playbooksDir, `${req.params.slug}.md`);\n if (!(await fileExists(filePath))) {\n res.status(404).json({ error: `Playbook \"${req.params.slug}\" not found` });\n return;\n }\n\n await writeFileForce(filePath, content);\n await rebuildPlaybookManifest(playbooksDir);\n res.json({ slug: req.params.slug, path: filePath });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to update playbook' });\n }\n });\n\n // DELETE /:slug — delete a playbook\n router.delete('/:slug', async (req, res) => {\n try {\n if (req.params.slug === 'manifest') {\n res.status(403).json({ error: 'The playbook manifest cannot be deleted' });\n return;\n }\n\n const filePath = resolve(playbooksDir, `${req.params.slug}.md`);\n if (!(await fileExists(filePath))) {\n res.status(404).json({ error: `Playbook \"${req.params.slug}\" not found` });\n return;\n }\n\n await unlink(filePath);\n await rebuildPlaybookManifest(playbooksDir);\n res.json({ deleted: req.params.slug });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to delete playbook' });\n }\n });\n\n return router;\n}\n","import { Router, type Request, type Response, type NextFunction } from 'express';\nimport { readdir } from 'node:fs/promises';\nimport {\n readChecklist,\n writeChecklist,\n readLog,\n appendLogEntry,\n generateUniqueId,\n computeCounts,\n} from '../todos/parser.js';\nimport { ensureDir, fileExists } from '../utils/fs.js';\nimport type { TodoItem, LogEntry } from '../todos/types.js';\nimport type { WsMessage } from './types.js';\n\nconst WORKSPACE_REGEX = /^[a-z0-9_][a-z0-9-]*$/;\n\nfunction getWorkspaceParam(value: string | string[] | undefined): string {\n if (Array.isArray(value)) {\n return value[0] ?? '';\n }\n return value ?? '';\n}\n\n// Per-workspace write lock to prevent concurrent read-modify-write races\nconst writeLocks = new Map<string, Promise<void>>();\nfunction withLock<T>(workspace: string, fn: () => Promise<T>): Promise<T> {\n const prev = writeLocks.get(workspace) ?? Promise.resolve();\n const next = prev.then(fn);\n writeLocks.set(workspace, next.then(() => {}, () => {}));\n return next;\n}\n\nexport function createTodosRouter(\n todosDir: string,\n broadcast: (msg: WsMessage) => void,\n): Router {\n const router = Router();\n\n function broadcastUpdate(): void {\n broadcast({ type: 'todos-updated', timestamp: new Date().toISOString() });\n }\n\n // Validate workspace name on all routes that use :workspace\n function validateWorkspace(req: Request, res: Response, next: NextFunction): void {\n const workspace = getWorkspaceParam(req.params.workspace);\n if (workspace && !WORKSPACE_REGEX.test(workspace)) {\n res.status(400).json({ error: `Invalid workspace name: \"${workspace}\". Use lowercase letters, numbers, hyphens, and underscores.` });\n return;\n }\n next();\n }\n\n // Apply workspace validation to all parameterized routes\n router.param('workspace', validateWorkspace as any);\n\n // GET / — aggregate all workspace checklists\n router.get('/', async (_req, res) => {\n try {\n await ensureDir(todosDir);\n const files = await readdir(todosDir).catch(() => []);\n const workspaces: Array<{\n workspace: string;\n archiveInterval: string;\n items: TodoItem[];\n counts: ReturnType<typeof computeCounts>;\n }> = [];\n\n for (const file of files) {\n if (typeof file !== 'string') continue;\n if (!file.endsWith('.md') || file.endsWith('-log.md')) continue;\n const workspace = file.replace('.md', '');\n const checklist = await readChecklist(todosDir, workspace);\n workspaces.push({\n workspace: checklist.workspace,\n archiveInterval: checklist.archiveInterval,\n items: checklist.items,\n counts: computeCounts(checklist.items),\n });\n }\n\n res.json({ workspaces });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to list todos' });\n }\n });\n\n // GET /:workspace — list items for one workspace\n router.get('/:workspace', async (req, res) => {\n try {\n const workspace = getWorkspaceParam(req.params.workspace);\n const checklist = await readChecklist(todosDir, workspace);\n res.json({\n workspace: checklist.workspace,\n archiveInterval: checklist.archiveInterval,\n items: checklist.items,\n counts: computeCounts(checklist.items),\n });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to get todos' });\n }\n });\n\n // POST /:workspace — add item\n router.post('/:workspace', async (req, res) => {\n try {\n const workspace = getWorkspaceParam(req.params.workspace);\n const { description, tags } = req.body;\n if (!description || typeof description !== 'string') {\n res.status(400).json({ error: 'description is required' });\n return;\n }\n\n const item = await withLock(workspace, async () => {\n const checklist = await readChecklist(todosDir, workspace);\n const existingIds = new Set(checklist.items.map((i) => i.id));\n const id = generateUniqueId(existingIds);\n\n const newItem: TodoItem = {\n id,\n description,\n status: 'open',\n tags: Array.isArray(tags) ? tags : [],\n session: null,\n };\n checklist.items.push(newItem);\n await writeChecklist(todosDir, checklist);\n return newItem;\n });\n broadcastUpdate();\n res.status(201).json(item);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to add todo' });\n }\n });\n\n // POST /:workspace/reorder — reorder items\n // Must be before /:workspace/:id to avoid param capture\n router.post('/:workspace/reorder', async (req, res) => {\n try {\n const workspace = getWorkspaceParam(req.params.workspace);\n const { ids } = req.body;\n if (!Array.isArray(ids) || !ids.every((id: unknown) => typeof id === 'string')) {\n res.status(400).json({ error: 'ids must be an array of strings' });\n return;\n }\n\n const items = await withLock(workspace, async () => {\n const checklist = await readChecklist(todosDir, workspace);\n const itemMap = new Map(checklist.items.map((i) => [i.id, i]));\n\n // Build reordered list: requested order first, then any items not in the ids array\n const reordered: TodoItem[] = [];\n for (const id of ids) {\n const item = itemMap.get(id);\n if (item) {\n reordered.push(item);\n itemMap.delete(id);\n }\n }\n // Append any remaining items not mentioned in ids\n for (const item of itemMap.values()) {\n reordered.push(item);\n }\n\n checklist.items = reordered;\n await writeChecklist(todosDir, checklist);\n return reordered;\n });\n broadcastUpdate();\n res.json({ items });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to reorder todos' });\n }\n });\n\n // GET /:workspace/log — full log\n // Must be before /:workspace/:id to avoid param capture\n router.get('/:workspace/log', async (req, res) => {\n try {\n const log = await readLog(todosDir, getWorkspaceParam(req.params.workspace));\n res.json(log);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to get log' });\n }\n });\n\n // POST /:workspace/archive — trigger archive\n router.post('/:workspace/archive', async (req, res) => {\n try {\n // Import archive logic inline to avoid circular deps\n const { archivePath } = await import('../todos/parser.js');\n const { resolve } = await import('node:path');\n const { readFile } = await import('node:fs/promises');\n const { writeFileForce } = await import('../utils/fs.js');\n\n const workspace = getWorkspaceParam(req.params.workspace);\n const checklist = await readChecklist(todosDir, workspace);\n const log = await readLog(todosDir, workspace);\n\n const completedIds = new Set(\n checklist.items.filter((i) => i.status === 'completed').map((i) => i.id),\n );\n\n if (completedIds.size === 0) {\n res.json({ archived: 0, message: 'No completed items to archive' });\n return;\n }\n\n const toArchive = log.entries.filter((e) =>\n e.itemIds.every((id) => completedIds.has(id)),\n );\n\n const archFile = archivePath(todosDir, workspace, checklist.archiveInterval);\n await ensureDir(resolve(todosDir, 'archive'));\n let archContent = '';\n if (await fileExists(archFile)) {\n archContent = await readFile(archFile, 'utf-8');\n archContent = archContent.trimEnd() + '\\n\\n';\n } else {\n archContent = `---\\nworkspace: ${workspace}\\n---\\n\\n# Archive\\n\\n`;\n }\n\n const completedItems = checklist.items.filter((i) => completedIds.has(i.id));\n for (const item of completedItems) {\n archContent += `- [x] ${item.description} ${item.tags.map((t: string) => `#${t}`).join(' ')} [t:${item.id}]\\n`;\n }\n archContent += '\\n';\n for (const entry of toArchive) {\n archContent += `### ${entry.timestamp} — ${entry.itemIds.map((i: string) => `t:${i}`).join(', ')}\\n`;\n if (entry.items) archContent += `**Items:** ${entry.items}\\n`;\n if (entry.session) archContent += `**Session:** ${entry.session}\\n`;\n if (entry.branch) archContent += `**Branch:** ${entry.branch}\\n`;\n if (entry.summary) archContent += `**Summary:** ${entry.summary}\\n`;\n if (entry.blockers) archContent += `**Blockers:** ${entry.blockers}\\n`;\n archContent += '\\n';\n }\n await writeFileForce(archFile, archContent);\n\n checklist.items = checklist.items.filter((i) => !completedIds.has(i.id));\n await writeChecklist(todosDir, checklist);\n\n broadcastUpdate();\n res.json({ archived: completedIds.size, logEntries: toArchive.length });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to archive' });\n }\n });\n\n // GET /:workspace/log/:id — log for specific item\n router.get('/:workspace/log/:id', async (req, res) => {\n try {\n const log = await readLog(todosDir, getWorkspaceParam(req.params.workspace));\n const entries = log.entries.filter((e) => e.itemIds.includes(req.params.id));\n res.json({ workspace: log.workspace, entries });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to get log' });\n }\n });\n\n // GET /:workspace/:id — single item with log\n router.get('/:workspace/:id', async (req, res) => {\n try {\n const workspace = getWorkspaceParam(req.params.workspace);\n const checklist = await readChecklist(todosDir, workspace);\n const item = checklist.items.find((i) => i.id === req.params.id);\n if (!item) {\n res.status(404).json({ error: `Todo \"${req.params.id}\" not found` });\n return;\n }\n const log = await readLog(todosDir, workspace);\n const logEntries = log.entries.filter((e) => e.itemIds.includes(req.params.id));\n res.json({ ...item, log: logEntries });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to get todo' });\n }\n });\n\n // PATCH /:workspace/:id — update description or tags\n router.patch('/:workspace/:id', async (req, res) => {\n try {\n const workspace = getWorkspaceParam(req.params.workspace);\n const result = await withLock(workspace, async () => {\n const checklist = await readChecklist(todosDir, workspace);\n const item = checklist.items.find((i) => i.id === req.params.id);\n if (!item) return null;\n if (req.body.description !== undefined) item.description = req.body.description;\n if (Array.isArray(req.body.tags)) item.tags = req.body.tags;\n await writeChecklist(todosDir, checklist);\n return { ...item };\n });\n if (!result) { res.status(404).json({ error: `Todo \"${req.params.id}\" not found` }); return; }\n broadcastUpdate();\n res.json(result);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to update todo' });\n }\n });\n\n // DELETE /:workspace/:id\n router.delete('/:workspace/:id', async (req, res) => {\n try {\n const workspace = getWorkspaceParam(req.params.workspace);\n const deleted = await withLock(workspace, async () => {\n const checklist = await readChecklist(todosDir, workspace);\n const idx = checklist.items.findIndex((i) => i.id === req.params.id);\n if (idx === -1) return false;\n checklist.items.splice(idx, 1);\n await writeChecklist(todosDir, checklist);\n return true;\n });\n if (!deleted) { res.status(404).json({ error: `Todo \"${req.params.id}\" not found` }); return; }\n broadcastUpdate();\n res.json({ deleted: req.params.id });\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to delete todo' });\n }\n });\n\n // POST /:workspace/:id/start\n router.post('/:workspace/:id/start', async (req, res) => {\n try {\n const workspace = getWorkspaceParam(req.params.workspace);\n const result = await withLock(workspace, async () => {\n const checklist = await readChecklist(todosDir, workspace);\n const item = checklist.items.find((i) => i.id === req.params.id);\n if (!item) return { error: 'not_found' as const };\n if (item.status === 'in_progress') return { error: 'conflict' as const, session: item.session };\n item.status = 'in_progress';\n item.session = req.body.session || null;\n await writeChecklist(todosDir, checklist);\n return { item: { ...item } };\n });\n if ('error' in result) {\n if (result.error === 'not_found') { res.status(404).json({ error: `Todo \"${req.params.id}\" not found` }); return; }\n res.status(409).json({ error: `Todo is already in progress (session: ${result.session})` }); return;\n }\n broadcastUpdate();\n res.json(result.item);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to start todo' });\n }\n });\n\n // POST /:workspace/:id/complete\n router.post('/:workspace/:id/complete', async (req, res) => {\n try {\n const workspace = getWorkspaceParam(req.params.workspace);\n const result = await withLock(workspace, async () => {\n const checklist = await readChecklist(todosDir, workspace);\n const item = checklist.items.find((i) => i.id === req.params.id);\n if (!item) return null;\n item.status = 'completed';\n item.session = null;\n await writeChecklist(todosDir, checklist);\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n itemIds: [item.id],\n items: item.description,\n session: req.body.session || null,\n branch: req.body.branch || null,\n summary: req.body.summary || 'Completed.',\n blockers: null,\n status: null,\n };\n await appendLogEntry(todosDir, workspace, entry);\n return { ...item };\n });\n if (!result) { res.status(404).json({ error: `Todo \"${req.params.id}\" not found` }); return; }\n broadcastUpdate();\n res.json(result);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to complete todo' });\n }\n });\n\n // POST /:workspace/:id/block\n router.post('/:workspace/:id/block', async (req, res) => {\n try {\n const reason = req.body.reason || null;\n const workspace = getWorkspaceParam(req.params.workspace);\n const result = await withLock(workspace, async () => {\n const checklist = await readChecklist(todosDir, workspace);\n const item = checklist.items.find((i) => i.id === req.params.id);\n if (!item) return null;\n item.status = 'blocked';\n item.session = null;\n await writeChecklist(todosDir, checklist);\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n itemIds: [item.id],\n items: item.description,\n session: req.body.session || null,\n branch: null,\n summary: reason || 'Blocked.',\n blockers: reason,\n status: 'blocked',\n };\n await appendLogEntry(todosDir, workspace, entry);\n return { ...item };\n });\n if (!result) { res.status(404).json({ error: `Todo \"${req.params.id}\" not found` }); return; }\n broadcastUpdate();\n res.json(result);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to block todo' });\n }\n });\n\n // POST /:workspace/:id/reopen — move completed back to open\n router.post('/:workspace/:id/reopen', async (req, res) => {\n try {\n const workspace = getWorkspaceParam(req.params.workspace);\n const result = await withLock(workspace, async () => {\n const checklist = await readChecklist(todosDir, workspace);\n const item = checklist.items.find((i) => i.id === req.params.id);\n if (!item) return null;\n item.status = 'open';\n item.session = null;\n await writeChecklist(todosDir, checklist);\n return { ...item };\n });\n if (!result) { res.status(404).json({ error: `Todo \"${req.params.id}\" not found` }); return; }\n broadcastUpdate();\n res.json(result);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to reopen todo' });\n }\n });\n\n // POST /:workspace/:id/unblock\n router.post('/:workspace/:id/unblock', async (req, res) => {\n try {\n const workspace = getWorkspaceParam(req.params.workspace);\n const result = await withLock(workspace, async () => {\n const checklist = await readChecklist(todosDir, workspace);\n const item = checklist.items.find((i) => i.id === req.params.id);\n if (!item) return null;\n item.status = 'open';\n item.session = null;\n await writeChecklist(todosDir, checklist);\n return { ...item };\n });\n if (!result) { res.status(404).json({ error: `Todo \"${req.params.id}\" not found` }); return; }\n broadcastUpdate();\n res.json(result);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to unblock todo' });\n }\n });\n\n return router;\n}\n","import { Router } from 'express';\nimport { updateBackupConfig } from '../utils/config.js';\nimport {\n backupToGithub,\n restoreFromGithub,\n getBackupStatus,\n parseCategoriesStrict,\n validateRepoUrl,\n VALID_CATEGORIES,\n} from '../utils/github-backup.js';\n\nexport function createBackupRouter(): Router {\n const router = Router();\n\n router.get('/', async (_req, res) => {\n try {\n const status = await getBackupStatus();\n res.json(status);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : String(error) });\n }\n });\n\n router.put('/config', async (req, res) => {\n try {\n const body = req.body ?? {};\n const updates: { repo?: string; categories?: string } = {};\n\n if (body.repo !== undefined) {\n const trimmed = typeof body.repo === 'string' ? body.repo.trim() : body.repo;\n if (trimmed !== null && trimmed !== '' && !validateRepoUrl(trimmed)) {\n return res.status(400).json({\n error: `Invalid repo URL. Must start with https:// or git@.`,\n });\n }\n updates.repo = trimmed || null as unknown as string;\n }\n\n if (body.categories !== undefined) {\n let cats: string[];\n if (Array.isArray(body.categories)) {\n cats = body.categories.map((s: unknown) => String(s).trim()).filter(Boolean);\n } else if (typeof body.categories === 'string') {\n cats = body.categories.split(',').map((s: string) => s.trim()).filter(Boolean);\n } else {\n return res.status(400).json({ error: 'categories must be a string or array' });\n }\n if (cats.length === 0) {\n return res.status(400).json({\n error: `No categories provided. Valid: ${VALID_CATEGORIES.join(', ')}`,\n });\n }\n try {\n const valid = parseCategoriesStrict(cats);\n updates.categories = valid.join(', ');\n } catch (err) {\n return res.status(400).json({\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n if (Object.keys(updates).length === 0) {\n return res.status(400).json({ error: 'No fields to update' });\n }\n\n await updateBackupConfig(updates);\n const status = await getBackupStatus();\n res.json(status);\n } catch (error) {\n res.status(500).json({ error: error instanceof Error ? error.message : String(error) });\n }\n });\n\n router.post('/push', async (_req, res) => {\n try {\n const result = await backupToGithub();\n res.json(result);\n } catch (error) {\n res.status(500).json({\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n router.post('/pull', async (_req, res) => {\n try {\n const result = await restoreFromGithub();\n res.json(result);\n } catch (error) {\n res.status(500).json({\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n return router;\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { cp, mkdtemp, rm, readFile, writeFile, unlink, stat, open, rename } from 'node:fs/promises';\nimport { resolve, join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { syntaurRoot, playbooksDir, todosDir, serversDir } from './paths.js';\nimport { ensureDir, fileExists } from './fs.js';\nimport { readConfig, updateBackupConfig, type BackupConfig } from './config.js';\n\nconst exec = promisify(execFile);\n\nexport const VALID_CATEGORIES = ['projects', 'playbooks', 'todos', 'servers', 'config'] as const;\nexport type BackupCategory = (typeof VALID_CATEGORIES)[number];\n\nconst LOCK_FILE_NAME = '.backup-lock';\n\nexport function parseCategories(csv: string): BackupCategory[] {\n return csv\n .split(',')\n .map((s) => s.trim())\n .filter((s): s is BackupCategory => (VALID_CATEGORIES as readonly string[]).includes(s));\n}\n\nexport function validateCategories(cats: string[]): BackupCategory[] {\n const valid: BackupCategory[] = [];\n for (const cat of cats) {\n if ((VALID_CATEGORIES as readonly string[]).includes(cat)) {\n valid.push(cat as BackupCategory);\n } else {\n console.warn(`Warning: unknown backup category \"${cat}\", skipping`);\n }\n }\n return valid;\n}\n\nexport function parseCategoriesStrict(cats: string[]): BackupCategory[] {\n const unknown: string[] = [];\n const valid: BackupCategory[] = [];\n for (const cat of cats) {\n if ((VALID_CATEGORIES as readonly string[]).includes(cat)) {\n valid.push(cat as BackupCategory);\n } else {\n unknown.push(cat);\n }\n }\n if (unknown.length > 0) {\n throw new Error(\n `Unknown categor${unknown.length === 1 ? 'y' : 'ies'}: ${unknown.map((c) => `\"${c}\"`).join(', ')}. Valid: ${VALID_CATEGORIES.join(', ')}`,\n );\n }\n return valid;\n}\n\nexport function validateRepoUrl(url: string): boolean {\n if (!url || typeof url !== 'string') return false;\n const trimmed = url.trim();\n return trimmed.startsWith('https://') || trimmed.startsWith('git@');\n}\n\nexport async function resolveCategoryPath(\n category: BackupCategory,\n): Promise<{ sourcePath: string; repoPath: string; isFile: boolean }> {\n switch (category) {\n case 'projects': {\n const config = await readConfig();\n return { sourcePath: config.defaultProjectDir, repoPath: 'projects', isFile: false };\n }\n case 'playbooks':\n return { sourcePath: playbooksDir(), repoPath: 'playbooks', isFile: false };\n case 'todos':\n return { sourcePath: todosDir(), repoPath: 'todos', isFile: false };\n case 'servers':\n return { sourcePath: serversDir(), repoPath: 'servers', isFile: false };\n case 'config':\n return { sourcePath: resolve(syntaurRoot(), 'config.md'), repoPath: 'config.md', isFile: true };\n }\n}\n\nasync function checkGitInstalled(): Promise<void> {\n try {\n await exec('git', ['--version']);\n } catch {\n throw new Error('git is not installed or not on PATH. Install git and try again.');\n }\n}\n\nasync function acquireLock(): Promise<string> {\n const lockPath = resolve(syntaurRoot(), LOCK_FILE_NAME);\n await ensureDir(syntaurRoot());\n try {\n const handle = await open(lockPath, 'wx');\n await handle.write(String(process.pid));\n await handle.close();\n return lockPath;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'EEXIST') {\n const pid = await readFile(lockPath, 'utf-8').catch(() => '');\n throw new Error(\n `Backup operation already in progress (lock file at ${lockPath}, pid ${pid.trim() || 'unknown'}). If stale, delete the file and retry.`,\n );\n }\n throw err;\n }\n}\n\nasync function releaseLock(lockPath: string): Promise<void> {\n try {\n await unlink(lockPath);\n } catch {\n // ignore\n }\n}\n\nasync function runGit(args: string[], cwd: string): Promise<{ stdout: string; stderr: string }> {\n return exec('git', args, { cwd });\n}\n\nasync function cloneOrInit(repoUrl: string, destDir: string): Promise<void> {\n try {\n await exec('git', ['clone', '--depth', '1', repoUrl, destDir]);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes('Repository not found') || message.includes('does not appear to be a git repository')) {\n throw new Error(`Repository not found or inaccessible: ${repoUrl}. Check URL and credentials.`);\n }\n if (message.includes('Authentication failed') || message.includes('could not read Username')) {\n throw new Error(`Authentication failed for ${repoUrl}. Check SSH keys or credentials.`);\n }\n throw new Error(`git clone failed: ${message}`);\n }\n}\n\nasync function copyRecursive(src: string, dest: string): Promise<void> {\n if (!(await fileExists(src))) return;\n const s = await stat(src);\n if (s.isDirectory()) {\n await ensureDir(dest);\n await cp(src, dest, { recursive: true, force: true });\n } else {\n await ensureDir(resolve(dest, '..'));\n await cp(src, dest, { force: true });\n }\n}\n\nexport interface BackupResult {\n success: boolean;\n timestamp: string;\n message: string;\n committed: boolean;\n}\n\nfunction resolveCategoriesStrict(csv: string): BackupCategory[] {\n const parts = csv.split(',').map((s) => s.trim()).filter(Boolean);\n return parseCategoriesStrict(parts);\n}\n\n/**\n * Read config.md and return a version with lastBackup/lastRestore set to null.\n * This is the copy that goes into the backup repo, so those timestamps — which\n * mutate on every local operation — never cause a self-diff on subsequent backups.\n */\nexport async function readSanitizedConfig(configPath: string): Promise<string> {\n const content = await readFile(configPath, 'utf-8');\n return content\n .replace(/^(\\s*lastBackup:\\s*).*$/m, '$1null')\n .replace(/^(\\s*lastRestore:\\s*).*$/m, '$1null');\n}\n\nexport async function backupToGithub(overrides?: {\n repo?: string;\n categories?: BackupCategory[];\n}): Promise<BackupResult> {\n await checkGitInstalled();\n const config = await readConfig();\n const rawRepo = overrides?.repo ?? config.backup?.repo ?? null;\n if (!rawRepo) {\n throw new Error('No backup repo configured. Set it via `syntaur backup config --repo <url>` or the dashboard.');\n }\n const repo = rawRepo.trim();\n if (!validateRepoUrl(repo)) {\n throw new Error(`Invalid repo URL: \"${rawRepo}\". Must start with https:// or git@.`);\n }\n\n const categoriesCsv = config.backup?.categories ?? 'projects, playbooks, todos, servers, config';\n const categories = overrides?.categories ?? resolveCategoriesStrict(categoriesCsv);\n if (categories.length === 0) {\n throw new Error('No valid backup categories selected.');\n }\n\n const lockPath = await acquireLock();\n let tmpDir: string | null = null;\n const timestamp = new Date().toISOString();\n\n try {\n tmpDir = await mkdtemp(join(tmpdir(), 'syntaur-backup-'));\n await cloneOrInit(repo, tmpDir);\n\n // Copy each selected category into the repo clone.\n // Always clear the destination first so local deletions propagate to the repo.\n for (const category of categories) {\n const { sourcePath, repoPath, isFile } = await resolveCategoryPath(category);\n const destPath = join(tmpDir, repoPath);\n\n if (isFile) {\n await rm(destPath, { force: true });\n } else {\n await rm(destPath, { recursive: true, force: true });\n }\n\n if (!(await fileExists(sourcePath))) {\n console.warn(`Category \"${category}\": no local data at ${sourcePath}; backup will reflect deletion.`);\n continue;\n }\n\n if (category === 'config') {\n // Sanitize config.md before writing to the repo: strip lastBackup/lastRestore\n // timestamps so they don't cause a self-diff on every backup.\n const sanitized = await readSanitizedConfig(sourcePath);\n await ensureDir(resolve(destPath, '..'));\n await writeFile(destPath, sanitized, 'utf-8');\n } else {\n await copyRecursive(sourcePath, destPath);\n }\n }\n\n // Stage and check for changes\n await runGit(['add', '-A'], tmpDir);\n const { stdout: status } = await runGit(['status', '--porcelain'], tmpDir);\n if (!status.trim()) {\n // No-op but successful: persist timestamp so UI reflects the completed check\n await updateBackupConfig({ lastBackup: timestamp }).catch(() => {});\n return {\n success: true,\n timestamp,\n message: 'No changes to back up.',\n committed: false,\n };\n }\n\n // Configure committer if unset (best-effort; user may have global config)\n try {\n await runGit(['config', 'user.email', 'syntaur@local'], tmpDir);\n await runGit(['config', 'user.name', 'Syntaur Backup'], tmpDir);\n } catch {\n // ignore\n }\n\n await runGit(['commit', '-m', `Syntaur backup ${timestamp}`], tmpDir);\n\n try {\n await runGit(['push'], tmpDir);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes('non-fast-forward') || message.includes('rejected')) {\n throw new Error('Push rejected (non-fast-forward). Pull and resolve manually, or delete remote contents.');\n }\n if (message.includes('Authentication') || message.includes('could not read Username')) {\n throw new Error('Push authentication failed. Check SSH keys or credentials.');\n }\n throw new Error(`git push failed: ${message}`);\n }\n\n // Push succeeded: persist timestamp\n await updateBackupConfig({ lastBackup: timestamp }).catch(() => {});\n\n return {\n success: true,\n timestamp,\n message: `Backed up ${categories.length} categor${categories.length === 1 ? 'y' : 'ies'} to ${repo}.`,\n committed: true,\n };\n } finally {\n if (tmpDir) {\n await rm(tmpDir, { recursive: true, force: true }).catch(() => {});\n }\n await releaseLock(lockPath);\n }\n}\n\nexport async function safeRestoreCategory(\n localPath: string,\n repoSrcPath: string,\n isFile: boolean,\n): Promise<void> {\n if (isFile) {\n // Single file: cp handles atomic rename internally. No staging needed.\n await ensureDir(resolve(localPath, '..'));\n await cp(repoSrcPath, localPath, { force: true });\n return;\n }\n\n // Directory: stage, then swap.\n const stagingPath = `${localPath}.syntaur-restore-staging`;\n const backupPath = `${localPath}.syntaur-restore-backup`;\n\n // Stale staging from a crashed run is always safe to discard.\n await rm(stagingPath, { recursive: true, force: true });\n\n // A pre-existing backup dir means a prior run crashed mid-swap and it may contain\n // the only copy of the user's original data. Do NOT delete it blindly.\n const backupExistsBefore = await fileExists(backupPath);\n const localExistsBefore = await fileExists(localPath);\n if (backupExistsBefore) {\n if (!localExistsBefore) {\n // Prior crash left the backup as the only copy. Restore it first.\n await rename(backupPath, localPath);\n } else {\n // Both exist — we can't tell which is authoritative. Bail out.\n throw new Error(\n `Cannot restore \"${localPath}\": a stale crash-recovery backup exists at ${backupPath} while the current path also exists. ` +\n `Inspect both and remove the one you don't need, then retry.`,\n );\n }\n }\n\n let localMovedAside = false;\n try {\n // Copy repo contents into staging. If this fails, local is untouched.\n await cp(repoSrcPath, stagingPath, { recursive: true, force: true });\n\n // Move current local aside (if it exists).\n const localExists = await fileExists(localPath);\n if (localExists) {\n await rename(localPath, backupPath);\n localMovedAside = true;\n }\n\n // Swap staging into place.\n await rename(stagingPath, localPath);\n\n // Success: remove the old data.\n await rm(backupPath, { recursive: true, force: true }).catch(() => {});\n } catch (err) {\n // Roll back: restore original if we moved it aside.\n if (localMovedAside && (await fileExists(backupPath))) {\n await rename(backupPath, localPath).catch(() => {});\n }\n // Always clean up staging (may or may not exist depending on where we failed).\n await rm(stagingPath, { recursive: true, force: true }).catch(() => {});\n throw err;\n }\n}\n\nexport async function restoreFromGithub(overrides?: {\n repo?: string;\n categories?: BackupCategory[];\n}): Promise<BackupResult> {\n await checkGitInstalled();\n const config = await readConfig();\n const rawRepo = overrides?.repo ?? config.backup?.repo ?? null;\n if (!rawRepo) {\n throw new Error('No backup repo configured.');\n }\n const repo = rawRepo.trim();\n if (!validateRepoUrl(repo)) {\n throw new Error(`Invalid repo URL: \"${rawRepo}\".`);\n }\n\n const categoriesCsv = config.backup?.categories ?? 'projects, playbooks, todos, servers, config';\n const categories = overrides?.categories ?? resolveCategoriesStrict(categoriesCsv);\n if (categories.length === 0) {\n throw new Error('No valid restore categories selected.');\n }\n\n const lockPath = await acquireLock();\n let tmpDir: string | null = null;\n const restored: string[] = [];\n const failed: string[] = [];\n const timestamp = new Date().toISOString();\n\n try {\n // Persist timestamp before work so UI reflects the attempt even on partial failure.\n // Inside try so lock is released even if config write fails.\n await updateBackupConfig({ lastRestore: timestamp });\n\n tmpDir = await mkdtemp(join(tmpdir(), 'syntaur-restore-'));\n await cloneOrInit(repo, tmpDir);\n\n for (const category of categories) {\n // Never overwrite config.md on restore — would clobber backup settings\n if (category === 'config') {\n console.warn('Skipping \"config\" on restore (would overwrite local backup settings).');\n continue;\n }\n try {\n const { sourcePath: localPath, repoPath, isFile } = await resolveCategoryPath(category);\n const repoSrcPath = join(tmpDir, repoPath);\n if (!(await fileExists(repoSrcPath))) {\n console.warn(`Category \"${category}\" not found in backup repo, skipping.`);\n continue;\n }\n await safeRestoreCategory(localPath, repoSrcPath, isFile);\n restored.push(category);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error(`Failed to restore \"${category}\": ${msg}`);\n failed.push(category);\n }\n }\n\n const success = failed.length === 0;\n return {\n success,\n timestamp,\n message: success\n ? `Restored ${restored.length} categor${restored.length === 1 ? 'y' : 'ies'} from ${repo}.`\n : `Partial restore: ${restored.length} succeeded, ${failed.length} failed (${failed.join(', ')}).`,\n committed: false,\n };\n } finally {\n if (tmpDir) {\n await rm(tmpDir, { recursive: true, force: true }).catch(() => {});\n }\n await releaseLock(lockPath);\n }\n}\n\nexport async function getBackupStatus(): Promise<{\n repo: string | null;\n categories: string;\n lastBackup: string | null;\n lastRestore: string | null;\n locked: boolean;\n}> {\n const config = await readConfig();\n const lockPath = resolve(syntaurRoot(), LOCK_FILE_NAME);\n const locked = await fileExists(lockPath);\n return {\n repo: config.backup?.repo ?? null,\n categories: config.backup?.categories ?? 'projects, playbooks, todos, servers, config',\n lastBackup: config.backup?.lastBackup ?? null,\n lastRestore: config.backup?.lastRestore ?? null,\n locked,\n };\n}\n","import {\n execQuiet,\n checkTmuxAvailable,\n sessionAlive,\n listTmuxPanes,\n getLsofOutput,\n loadWorkspaceRecords,\n autoLinkPane,\n getGitInfo,\n clearScanCache,\n} from './scanner.js';\nimport {\n readSessionFile,\n listSessionFiles,\n registerAutoSession,\n removeSession,\n sanitizeSessionName,\n} from './servers.js';\nimport type { SessionFileData } from './types.js';\n\n// --- Shared lsof helpers ---\n\nexport function parsePortsForPid(lsofOutput: string, targetPid: number): number[] {\n const ports: number[] = [];\n for (const line of lsofOutput.split('\\n')) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length < 9) continue;\n const pid = parseInt(parts[1], 10);\n if (pid !== targetPid) continue;\n const tcpAddr = parts.find((p) => p.includes(':') && /:\\d+$/.test(p));\n if (tcpAddr) {\n const port = parseInt(tcpAddr.split(':').pop()!, 10);\n if (!isNaN(port) && !ports.includes(port)) ports.push(port);\n }\n }\n return ports;\n}\n\nexport function parseLsofForListeningProcesses(lsofOutput: string): ListeningProcess[] {\n const seen = new Map<number, ListeningProcess>();\n for (const line of lsofOutput.split('\\n')) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length < 9) continue;\n const command = parts[0];\n const pid = parseInt(parts[1], 10);\n if (isNaN(pid)) continue;\n const tcpAddr = parts.find((p) => p.includes(':') && /:\\d+$/.test(p));\n if (!tcpAddr) continue;\n const port = parseInt(tcpAddr.split(':').pop()!, 10);\n if (isNaN(port)) continue;\n\n if (!seen.has(pid)) {\n seen.set(pid, { pid, port, command });\n }\n }\n return Array.from(seen.values());\n}\n\n// --- Singleton lifecycle ---\n\nlet timer: ReturnType<typeof setInterval> | null = null;\nlet activeReconcile: Promise<void> | null = null;\n\nexport interface AutodiscoveryOptions {\n serversDir: string;\n projectsDir: string;\n assignmentsDir?: string;\n intervalMs?: number;\n excludePids?: Set<number>;\n}\n\nlet savedOptions: AutodiscoveryOptions | null = null;\n\nexport function startAutodiscovery(opts: AutodiscoveryOptions): void {\n if (timer) return;\n savedOptions = opts;\n const interval = opts.intervalMs ?? 45_000;\n // Run once immediately, then on interval\n runReconcile();\n timer = setInterval(() => {\n runReconcile();\n }, interval);\n}\n\nexport async function stopAutodiscovery(): Promise<void> {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n // Await in-flight reconcile to prevent overlap\n if (activeReconcile) {\n await activeReconcile;\n activeReconcile = null;\n }\n savedOptions = null;\n}\n\nfunction runReconcile(): void {\n if (activeReconcile || !savedOptions) return;\n const opts = savedOptions;\n activeReconcile = reconcile(opts.serversDir, opts.projectsDir, opts.excludePids, opts.assignmentsDir)\n .catch((err) => {\n console.error('[autodiscovery] reconcile failed:', err);\n })\n .finally(() => {\n activeReconcile = null;\n });\n}\n\n// --- Tmux discovery ---\n\nexport async function listAllTmuxSessions(): Promise<string[]> {\n const output = await execQuiet('tmux', ['list-sessions', '-F', '#{session_name}']);\n if (!output) return [];\n return output.split('\\n').filter((line) => line.length > 0);\n}\n\nasync function discoverTmuxSessions(\n serversDir: string,\n projectsDir: string,\n existingNames: Set<string>,\n assignmentsDir?: string,\n): Promise<boolean> {\n const tmuxAvailable = await checkTmuxAvailable();\n if (!tmuxAvailable) return false;\n\n const workspaceRecords = await loadWorkspaceRecords(projectsDir, assignmentsDir);\n if (workspaceRecords.length === 0) return false;\n\n const sessions = await listAllTmuxSessions();\n let changed = false;\n\n for (const sessionName of sessions) {\n const sanitized = sanitizeSessionName(sessionName);\n if (existingNames.has(sanitized)) {\n // Already tracked (manual or auto) — skip\n continue;\n }\n\n const panes = await listTmuxPanes(sessionName);\n if (panes.length === 0) continue;\n\n // Check if any pane matches a workspace\n let matched = false;\n const cwdGitCache = new Map<string, { branch: string | null; worktree: boolean }>();\n\n for (const pane of panes) {\n if (!cwdGitCache.has(pane.cwd)) {\n cwdGitCache.set(pane.cwd, await getGitInfo(pane.cwd));\n }\n const gitInfo = cwdGitCache.get(pane.cwd)!;\n const link = await autoLinkPane(pane.cwd, gitInfo.branch, workspaceRecords);\n if (link) {\n matched = true;\n break;\n }\n }\n\n if (matched) {\n await registerAutoSession(serversDir, sessionName, { kind: 'tmux' });\n changed = true;\n }\n }\n\n return changed;\n}\n\n// --- Non-tmux process discovery ---\n\ninterface ListeningProcess {\n pid: number;\n port: number;\n command: string;\n}\n\nasync function getProcessCwd(pid: number): Promise<string | null> {\n // macOS: use lsof to get cwd\n const output = await execQuiet('lsof', ['-a', '-d', 'cwd', '-p', String(pid), '-Fn']);\n if (!output) return null;\n // Output format: lines starting with 'n' contain the path\n for (const line of output.split('\\n')) {\n if (line.startsWith('n') && line.length > 1) {\n return line.slice(1);\n }\n }\n return null;\n}\n\nasync function discoverProcesses(\n serversDir: string,\n projectsDir: string,\n existingFiles: Map<string, SessionFileData>,\n excludePids?: Set<number>,\n assignmentsDir?: string,\n): Promise<boolean> {\n const workspaceRecords = await loadWorkspaceRecords(projectsDir, assignmentsDir);\n if (workspaceRecords.length === 0) return false;\n\n const lsofOutput = await getLsofOutput();\n if (!lsofOutput) return false;\n\n const processes = parseLsofForListeningProcesses(lsofOutput);\n let changed = false;\n\n // Track which PIDs are already tracked by existing process-kind entries\n const trackedPids = new Set<number>();\n for (const data of existingFiles.values()) {\n if (data.kind === 'process' && data.pid) {\n trackedPids.add(data.pid);\n }\n }\n\n for (const proc of processes) {\n if (trackedPids.has(proc.pid)) continue;\n if (excludePids?.has(proc.pid)) continue;\n\n const cwd = await getProcessCwd(proc.pid);\n if (!cwd) continue;\n\n const gitInfo = await getGitInfo(cwd);\n const link = await autoLinkPane(cwd, gitInfo.branch, workspaceRecords);\n if (!link) continue;\n\n // Build a session name from the command and port\n const sessionName = `proc-${proc.command}-${proc.port}`;\n const sanitized = sanitizeSessionName(sessionName);\n\n // Skip if already registered under this name\n if (existingFiles.has(sanitized)) continue;\n\n const ports = parsePortsForPid(lsofOutput, proc.pid);\n await registerAutoSession(serversDir, sessionName, {\n kind: 'process',\n pid: proc.pid,\n ports: ports.length > 0 ? ports : [proc.port],\n cwd,\n });\n changed = true;\n }\n\n return changed;\n}\n\n// --- Reconciliation ---\n\nasync function cleanupDeadAutoSessions(\n serversDir: string,\n existingFiles: Map<string, SessionFileData>,\n): Promise<{ changed: boolean; removedNames: Set<string> }> {\n let changed = false;\n const removedNames = new Set<string>();\n\n // Only check tmux liveness if tmux is available\n const tmuxAvailable = await checkTmuxAvailable();\n\n for (const [name, data] of existingFiles) {\n if (!data.auto) continue;\n\n let alive = true; // Default to alive for unknown kinds\n if (data.kind === 'tmux') {\n if (!tmuxAvailable) continue; // Don't delete tmux sessions when tmux is unavailable\n alive = await sessionAlive(data.session);\n } else if (data.kind === 'process' && data.pid) {\n alive = await isProcessAlive(data.pid);\n } else {\n // Unknown kind with auto: true — leave it alone\n continue;\n }\n\n if (!alive) {\n await removeSession(serversDir, name);\n removedNames.add(name);\n changed = true;\n }\n }\n\n return { changed, removedNames };\n}\n\nexport async function isProcessAlive(pid: number): Promise<boolean> {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function reconcile(serversDir: string, projectsDir: string, excludePids?: Set<number>, assignmentsDir?: string): Promise<void> {\n // Load all existing session files\n const names = await listSessionFiles(serversDir);\n const existingFiles = new Map<string, SessionFileData>();\n for (const name of names) {\n const data = await readSessionFile(serversDir, name);\n if (data) existingFiles.set(name, data);\n }\n\n // Clean up dead auto sessions FIRST so discovery can re-register restarted processes\n const { changed: cleanupChanged, removedNames } = await cleanupDeadAutoSessions(serversDir, existingFiles);\n\n // Remove cleaned-up entries from the maps so discovery sees them as available\n for (const name of removedNames) {\n existingFiles.delete(name);\n }\n const existingNames = new Set(existingFiles.keys());\n\n // Discover new sessions\n const tmuxChanged = await discoverTmuxSessions(serversDir, projectsDir, existingNames, assignmentsDir);\n const processChanged = await discoverProcesses(serversDir, projectsDir, existingFiles, excludePids, assignmentsDir);\n\n // Invalidate scan cache if anything changed\n if (tmuxChanged || processChanged || cleanupChanged) {\n clearScanCache();\n }\n}\n\n// --- Exports for testing ---\nexport { reconcile, getProcessCwd };\n","import { resolve } from 'node:path';\nimport { expandHome, assignmentsDir as assignmentsDirFn } from '../utils/paths.js';\nimport { fileExists } from '../utils/fs.js';\nimport { readConfig } from '../utils/config.js';\nimport { isValidSlug } from '../utils/slug.js';\nimport {\n executeTransition,\n executeTransitionByDir,\n executeAssign,\n executeAssignByDir,\n type TransitionCommand,\n type TransitionResult,\n} from '../lifecycle/index.js';\nimport { resolveAssignmentById } from '../utils/assignment-resolver.js';\n\nexport interface LifecycleOptions {\n project?: string;\n dir?: string;\n reason?: string;\n agent?: string;\n}\n\nexport async function runTransition(\n assignment: string,\n command: Exclude<TransitionCommand, 'assign'>,\n options: LifecycleOptions = {},\n): Promise<TransitionResult> {\n const config = await readConfig();\n const baseDir = options.dir ? expandHome(options.dir) : config.defaultProjectDir;\n\n if (options.project) {\n if (!isValidSlug(options.project)) {\n throw new Error(`Invalid project slug \"${options.project}\".`);\n }\n if (!isValidSlug(assignment)) {\n throw new Error(`Invalid assignment slug \"${assignment}\".`);\n }\n const projectDir = resolve(baseDir, options.project);\n const projectMdPath = resolve(projectDir, 'project.md');\n if (!(await fileExists(projectDir)) || !(await fileExists(projectMdPath))) {\n throw new Error(`Project \"${options.project}\" not found at ${projectDir}.`);\n }\n return executeTransition(projectDir, assignment, command, {\n reason: options.reason,\n agent: options.agent,\n });\n }\n\n const resolved = await resolveAssignmentById(baseDir, assignmentsDirFn(), assignment);\n if (!resolved) {\n throw new Error(\n `Assignment \"${assignment}\" not found. Provide --project <slug> or a valid standalone UUID.`,\n );\n }\n return executeTransitionByDir(resolved.assignmentDir, command, {\n reason: options.reason,\n agent: options.agent,\n standalone: resolved.standalone,\n });\n}\n\nexport async function runAssign(\n assignment: string,\n agent: string,\n options: LifecycleOptions = {},\n): Promise<TransitionResult> {\n const config = await readConfig();\n const baseDir = options.dir ? expandHome(options.dir) : config.defaultProjectDir;\n\n if (options.project) {\n if (!isValidSlug(options.project)) {\n throw new Error(`Invalid project slug \"${options.project}\".`);\n }\n if (!isValidSlug(assignment)) {\n throw new Error(`Invalid assignment slug \"${assignment}\".`);\n }\n const projectDir = resolve(baseDir, options.project);\n const projectMdPath = resolve(projectDir, 'project.md');\n if (!(await fileExists(projectDir)) || !(await fileExists(projectMdPath))) {\n throw new Error(`Project \"${options.project}\" not found at ${projectDir}.`);\n }\n return executeAssign(projectDir, assignment, agent);\n }\n\n const resolved = await resolveAssignmentById(baseDir, assignmentsDirFn(), assignment);\n if (!resolved) {\n throw new Error(\n `Assignment \"${assignment}\" not found. Provide --project <slug> or a valid standalone UUID.`,\n );\n }\n return executeAssignByDir(resolved.assignmentDir, agent);\n}\n\nexport function reportResult(result: TransitionResult): void {\n if (!result.success) {\n throw new Error(result.message);\n }\n console.log(result.message);\n for (const warning of result.warnings ?? []) {\n console.warn(`Warning: ${warning}`);\n }\n}\n","import { runAssign, reportResult, type LifecycleOptions } from './_lifecycle-helper.js';\n\nexport interface AssignOptions extends LifecycleOptions {\n agent: string;\n}\n\nexport async function assignCommand(\n assignment: string,\n options: AssignOptions,\n): Promise<void> {\n if (!options.agent) {\n throw new Error('--agent <name> is required.');\n }\n const result = await runAssign(assignment, options.agent, options);\n reportResult(result);\n}\n","import { runTransition, reportResult, type LifecycleOptions } from './_lifecycle-helper.js';\n\nexport interface StartOptions extends LifecycleOptions {\n agent?: string;\n}\n\nexport async function startCommand(\n assignment: string,\n options: StartOptions,\n): Promise<void> {\n const result = await runTransition(assignment, 'start', options);\n reportResult(result);\n}\n","import { runTransition, reportResult, type LifecycleOptions } from './_lifecycle-helper.js';\n\nexport interface CompleteOptions extends LifecycleOptions {}\n\nexport async function completeCommand(\n assignment: string,\n options: CompleteOptions,\n): Promise<void> {\n const result = await runTransition(assignment, 'complete', options);\n reportResult(result);\n}\n","import { runTransition, reportResult, type LifecycleOptions } from './_lifecycle-helper.js';\n\nexport interface BlockOptions extends LifecycleOptions {\n reason?: string;\n}\n\nexport async function blockCommand(\n assignment: string,\n options: BlockOptions,\n): Promise<void> {\n const result = await runTransition(assignment, 'block', options);\n reportResult(result);\n}\n","import { runTransition, reportResult, type LifecycleOptions } from './_lifecycle-helper.js';\n\nexport interface UnblockOptions extends LifecycleOptions {}\n\nexport async function unblockCommand(\n assignment: string,\n options: UnblockOptions,\n): Promise<void> {\n const result = await runTransition(assignment, 'unblock', options);\n reportResult(result);\n}\n","import { runTransition, reportResult, type LifecycleOptions } from './_lifecycle-helper.js';\n\nexport interface ReviewOptions extends LifecycleOptions {}\n\nexport async function reviewCommand(\n assignment: string,\n options: ReviewOptions,\n): Promise<void> {\n const result = await runTransition(assignment, 'review', options);\n reportResult(result);\n}\n","import { runTransition, reportResult, type LifecycleOptions } from './_lifecycle-helper.js';\n\nexport interface FailOptions extends LifecycleOptions {}\n\nexport async function failCommand(\n assignment: string,\n options: FailOptions,\n): Promise<void> {\n const result = await runTransition(assignment, 'fail', options);\n reportResult(result);\n}\n","import { runTransition, reportResult, type LifecycleOptions } from './_lifecycle-helper.js';\n\nexport interface ReopenOptions extends LifecycleOptions {}\n\nexport async function reopenCommand(\n assignment: string,\n options: ReopenOptions,\n): Promise<void> {\n const result = await runTransition(assignment, 'reopen', options);\n reportResult(result);\n}\n","import { updateIntegrationConfig } from '../utils/config.js';\nimport {\n detectClaudeMarketplaceForTarget,\n ensureClaudeMarketplaceEntry,\n getConfiguredOrLegacyManagedPluginDir,\n inspectInstallPath,\n installManagedPlugin,\n normalizeAbsoluteInstallPath,\n removeClaudeMarketplaceEntry,\n recommendPluginTargetDir,\n getDefaultPluginTargetDir,\n uninstallManagedPlugin,\n} from '../utils/install.js';\nimport { confirmPrompt, isInteractiveTerminal, textPrompt } from '../utils/prompt.js';\n\nexport interface InstallPluginOptions {\n force?: boolean;\n link?: boolean;\n targetDir?: string;\n promptForTarget?: boolean;\n}\n\nasync function promptForInstallPath(\n question: string,\n recommendedPath: string,\n): Promise<string> {\n while (true) {\n const answer = await textPrompt(question, recommendedPath);\n try {\n return normalizeAbsoluteInstallPath(answer, question);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n }\n }\n}\n\nexport async function installPluginCommand(\n options: InstallPluginOptions,\n): Promise<void> {\n const shouldPromptForTarget = Boolean(\n options.promptForTarget !== false &&\n isInteractiveTerminal() &&\n !options.targetDir,\n );\n const recommendedTargetDir = await recommendPluginTargetDir('claude');\n const targetDir = options.targetDir\n ? normalizeAbsoluteInstallPath(options.targetDir, 'Claude plugin target')\n : shouldPromptForTarget\n ? await promptForInstallPath('Claude plugin directory', recommendedTargetDir)\n : recommendedTargetDir;\n\n const previousTargetDir = await getConfiguredOrLegacyManagedPluginDir('claude');\n const migrating = Boolean(previousTargetDir && previousTargetDir !== targetDir);\n let previousInstall = previousTargetDir\n ? await inspectInstallPath('claude', previousTargetDir)\n : null;\n const previousMarketplace = previousTargetDir\n ? await detectClaudeMarketplaceForTarget(previousTargetDir)\n : null;\n const legacyTargetDir = getDefaultPluginTargetDir('claude');\n const legacyInstall = targetDir !== legacyTargetDir\n ? await inspectInstallPath('claude', legacyTargetDir)\n : null;\n\n if (migrating && previousInstall?.exists && !previousInstall.managed) {\n throw new Error(\n `${previousTargetDir} exists but is not a Syntaur-managed install. Remove it manually before changing the Claude plugin location.`,\n );\n }\n\n if (\n targetDir !== legacyTargetDir &&\n legacyInstall?.exists &&\n !legacyInstall.managed &&\n (!previousTargetDir || previousTargetDir !== legacyTargetDir)\n ) {\n console.warn(\n `Warning: ${legacyTargetDir} already exists and is not a Syntaur-managed install. Syntaur will use ${targetDir} instead.`,\n );\n }\n\n if (migrating && previousInstall?.exists && previousInstall.managed && isInteractiveTerminal()) {\n const confirmed = await confirmPrompt(\n `Move the Claude Code plugin from ${previousTargetDir} to ${targetDir} and remove the old install?`,\n true,\n );\n if (!confirmed) {\n throw new Error('Install cancelled.');\n }\n }\n\n const result = await installManagedPlugin({\n pluginKind: 'claude',\n force: options.force,\n link: options.link,\n targetDir,\n });\n const currentMarketplace = await detectClaudeMarketplaceForTarget(result.targetDir);\n if (currentMarketplace) {\n await ensureClaudeMarketplaceEntry({\n marketplaceRootDir: currentMarketplace.rootDir,\n manifestPath: currentMarketplace.manifestPath,\n pluginTargetDir: result.targetDir,\n expectedExistingPluginTargetDir:\n previousMarketplace && previousMarketplace.manifestPath === currentMarketplace.manifestPath\n ? previousTargetDir\n : null,\n });\n }\n await updateIntegrationConfig({ claudePluginDir: result.targetDir });\n\n if (\n previousMarketplace &&\n previousTargetDir &&\n (!currentMarketplace || currentMarketplace.manifestPath !== previousMarketplace.manifestPath)\n ) {\n const removedMarketplaceEntry = await removeClaudeMarketplaceEntry({\n manifestPath: previousMarketplace.manifestPath,\n marketplaceRootDir: previousMarketplace.rootDir,\n pluginTargetDir: previousTargetDir,\n });\n if (removedMarketplaceEntry.removed) {\n console.log(`Removed previous Claude marketplace entry from ${removedMarketplaceEntry.manifestPath}`);\n }\n }\n\n if (migrating && previousInstall?.exists && previousInstall.managed && previousTargetDir) {\n const removed = await uninstallManagedPlugin('claude', previousTargetDir);\n if (removed.removed) {\n console.log(`Removed previous Claude Code plugin from ${removed.targetDir}`);\n }\n previousInstall = null;\n }\n\n console.log('Installed Syntaur plugin:');\n console.log(` target: ${result.targetDir}`);\n console.log(` source: ${result.sourceDir}`);\n console.log(` mode: ${result.mode}`);\n if (currentMarketplace) {\n console.log(` marketplace: ${currentMarketplace.manifestPath}`);\n }\n console.log('\\nThe plugin is now available in Claude Code.');\n console.log(' Skills: /grab-assignment, /plan-assignment, /complete-assignment');\n console.log(' Background: syntaur-protocol (auto-invoked)');\n console.log(' Hook: write boundary enforcement (PreToolUse)');\n}\n","import {\n cp,\n readdir,\n symlink,\n lstat,\n readFile,\n readlink,\n rm,\n unlink,\n writeFile,\n} from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { basename, dirname, isAbsolute, relative, resolve } from 'node:path';\nimport { readConfig } from './config.js';\nimport { ensureDir, fileExists } from './fs.js';\nimport { findPackageRoot } from './package-root.js';\nimport { expandHome, syntaurRoot } from './paths.js';\n\nexport type PluginKind = 'claude' | 'codex';\nexport type InstallMode = 'copy' | 'link';\n\nconst INSTALL_MARKER_FILENAME = '.syntaur-install.json';\n\ninterface PackageManifest {\n name: string;\n version: string;\n}\n\ninterface ClaudePluginManifest {\n name?: string;\n description?: string;\n version?: string;\n author?: string | {\n name?: string;\n email?: string;\n };\n}\n\ninterface InstallMetadata {\n packageName: string;\n packageVersion: string;\n pluginKind: PluginKind;\n installMode: InstallMode;\n installedAt: string;\n}\n\nexport interface ManagedPluginInstallOptions {\n pluginKind: PluginKind;\n force?: boolean;\n link?: boolean;\n targetDir?: string;\n}\n\nexport interface PluginPaths {\n packageRoot: string;\n sourceDir: string;\n targetDir: string;\n}\n\nexport interface ManagedPluginInstallResult {\n targetDir: string;\n sourceDir: string;\n mode: InstallMode;\n changed: boolean;\n}\n\nexport interface MarketplaceEntry {\n name: string;\n source: {\n source: 'local';\n path: string;\n };\n policy: {\n installation: 'AVAILABLE';\n authentication: 'ON_INSTALL';\n };\n category: 'Coding';\n}\n\nexport interface MarketplaceFile {\n name: string;\n interface?: {\n displayName?: string;\n };\n plugins: MarketplaceEntry[];\n}\n\ninterface InstallStatus {\n exists: boolean;\n managed: boolean;\n installMode?: InstallMode;\n manifestName?: string;\n symlinkTarget?: string;\n}\n\nexport interface ManagedInstallInspection {\n exists: boolean;\n managed: boolean;\n installMode?: InstallMode;\n targetDir: string;\n}\n\nexport interface EnsureMarketplaceEntryOptions {\n marketplacePath: string;\n pluginTargetDir: string;\n expectedExistingPluginTargetDir?: string | null;\n}\n\nexport interface RemoveMarketplaceEntryOptions {\n marketplacePath: string;\n pluginTargetDir?: string;\n expectedSourcePath?: string | null;\n}\n\ninterface ClaudeMarketplacePluginEntry {\n name?: string;\n description?: string;\n version?: string;\n author?: {\n name?: string;\n email?: string;\n };\n source?: string;\n category?: string;\n}\n\ninterface ClaudeMarketplaceFile {\n name?: string;\n plugins: ClaudeMarketplacePluginEntry[];\n [key: string]: unknown;\n}\n\ninterface KnownClaudeMarketplaceRecord {\n source?: {\n source?: string;\n path?: string;\n };\n installLocation?: string;\n}\n\ninterface ClaudeMarketplaceCandidate {\n name: string;\n rootDir: string;\n manifestPath: string;\n active: boolean;\n hasSyntaur: boolean;\n isUserPlugins: boolean;\n isDirectorySource: boolean;\n}\n\nexport interface ClaudeMarketplaceLocation {\n name: string;\n rootDir: string;\n manifestPath: string;\n targetDir: string;\n}\n\nfunction getPluginRelativePath(pluginKind: PluginKind): string {\n return pluginKind === 'claude' ? 'platforms/claude-code' : 'platforms/codex';\n}\n\nfunction getPluginManifestRelativePath(pluginKind: PluginKind): string {\n return pluginKind === 'claude'\n ? '.claude-plugin/plugin.json'\n : '.codex-plugin/plugin.json';\n}\n\nexport function getDefaultPluginTargetDir(pluginKind: PluginKind): string {\n const home = homedir();\n return pluginKind === 'claude'\n ? resolve(home, '.claude', 'plugins', 'syntaur')\n : resolve(home, 'plugins', 'syntaur');\n}\n\nexport function getDefaultMarketplacePath(): string {\n return resolve(homedir(), '.agents', 'plugins', 'marketplace.json');\n}\n\nfunction getClaudeMarketplacesRoot(): string {\n return resolve(homedir(), '.claude', 'plugins', 'marketplaces');\n}\n\nfunction getClaudeKnownMarketplacesPath(): string {\n return resolve(homedir(), '.claude', 'plugins', 'known_marketplaces.json');\n}\n\nfunction getClaudeInstalledPluginsPath(): string {\n return resolve(homedir(), '.claude', 'plugins', 'installed_plugins.json');\n}\n\nfunction getInstallMarkerPath(targetDir: string): string {\n return resolve(targetDir, INSTALL_MARKER_FILENAME);\n}\n\nasync function readPackageManifest(packageRoot: string): Promise<PackageManifest> {\n const raw = await readFile(resolve(packageRoot, 'package.json'), 'utf-8');\n return JSON.parse(raw) as PackageManifest;\n}\n\nasync function readJsonFileIfExists<T>(pathValue: string): Promise<T | null> {\n if (!(await fileExists(pathValue))) {\n return null;\n }\n\n try {\n const raw = await readFile(pathValue, 'utf-8');\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n}\n\nasync function readClaudePluginManifest(\n pluginDir: string,\n): Promise<ClaudePluginManifest> {\n return (\n await readJsonFileIfExists<ClaudePluginManifest>(\n resolve(pluginDir, '.claude-plugin', 'plugin.json'),\n )\n ) ?? {};\n}\n\nasync function readPluginManifestName(\n targetDir: string,\n pluginKind: PluginKind,\n): Promise<string | undefined> {\n const manifestPath = resolve(targetDir, getPluginManifestRelativePath(pluginKind));\n if (!(await fileExists(manifestPath))) {\n return undefined;\n }\n\n const raw = await readFile(manifestPath, 'utf-8');\n const parsed = JSON.parse(raw) as { name?: string };\n return parsed.name;\n}\n\nasync function readInstallMetadata(targetDir: string): Promise<InstallMetadata | null> {\n const markerPath = getInstallMarkerPath(targetDir);\n if (!(await fileExists(markerPath))) {\n return null;\n }\n\n try {\n const raw = await readFile(markerPath, 'utf-8');\n return JSON.parse(raw) as InstallMetadata;\n } catch {\n return null;\n }\n}\n\nasync function getInstallStatus(\n targetDir: string,\n pluginKind: PluginKind,\n): Promise<InstallStatus> {\n if (!(await fileExists(targetDir))) {\n return { exists: false, managed: false };\n }\n\n const info = await lstat(targetDir);\n if (info.isSymbolicLink()) {\n const symlinkTarget = await readlink(targetDir);\n const resolvedTarget = resolve(dirname(targetDir), symlinkTarget);\n const manifestName = await readPluginManifestName(resolvedTarget, pluginKind);\n return {\n exists: true,\n managed: manifestName === 'syntaur',\n installMode: 'link',\n manifestName,\n symlinkTarget: resolvedTarget,\n };\n }\n\n const metadata = await readInstallMetadata(targetDir);\n const manifestName = await readPluginManifestName(targetDir, pluginKind);\n return {\n exists: true,\n managed: Boolean(\n (metadata && metadata.pluginKind === pluginKind && metadata.packageName === 'syntaur') ||\n manifestName === 'syntaur',\n ),\n installMode: metadata?.installMode ?? 'copy',\n manifestName,\n };\n}\n\nasync function writeInstallMetadata(\n targetDir: string,\n pluginKind: PluginKind,\n installMode: InstallMode,\n packageManifest: PackageManifest,\n): Promise<void> {\n const metadata: InstallMetadata = {\n packageName: packageManifest.name,\n packageVersion: packageManifest.version,\n pluginKind,\n installMode,\n installedAt: new Date().toISOString(),\n };\n\n await writeFile(\n getInstallMarkerPath(targetDir),\n `${JSON.stringify(metadata, null, 2)}\\n`,\n 'utf-8',\n );\n}\n\nasync function installCopy(\n paths: PluginPaths,\n pluginKind: PluginKind,\n): Promise<void> {\n await ensureDir(dirname(paths.targetDir));\n await cp(paths.sourceDir, paths.targetDir, { recursive: true });\n const packageManifest = await readPackageManifest(paths.packageRoot);\n await writeInstallMetadata(paths.targetDir, pluginKind, 'copy', packageManifest);\n}\n\nasync function installLink(paths: PluginPaths): Promise<void> {\n await ensureDir(dirname(paths.targetDir));\n await rm(paths.targetDir, { recursive: true, force: true });\n await ensureDir(dirname(paths.targetDir));\n await symlink(resolve(paths.sourceDir), paths.targetDir, 'dir');\n}\n\nasync function removeInstallMarker(targetDir: string): Promise<void> {\n const markerPath = getInstallMarkerPath(targetDir);\n if (await fileExists(markerPath)) {\n await unlink(markerPath).catch(() => {});\n }\n}\n\nexport function normalizeAbsoluteInstallPath(pathValue: string, label: string): string {\n const expanded = expandHome(pathValue.trim());\n if (!isAbsolute(expanded)) {\n throw new Error(`${label} must be an absolute path.`);\n }\n return resolve(expanded);\n}\n\nexport async function resolvePluginPaths(\n pluginKind: PluginKind,\n targetDir?: string,\n): Promise<PluginPaths> {\n const packageRoot = await findPackageRoot(getPluginRelativePath(pluginKind));\n return {\n packageRoot,\n sourceDir: resolve(packageRoot, getPluginRelativePath(pluginKind)),\n targetDir: targetDir ?? getDefaultPluginTargetDir(pluginKind),\n };\n}\n\nasync function readInstalledClaudeMarketplaceNames(): Promise<Set<string>> {\n const parsed = await readJsonFileIfExists<{\n plugins?: Record<string, unknown>;\n }>(getClaudeInstalledPluginsPath());\n\n const names = new Set<string>();\n for (const key of Object.keys(parsed?.plugins ?? {})) {\n const atIndex = key.lastIndexOf('@');\n if (atIndex > 0 && atIndex < key.length - 1) {\n names.add(key.slice(atIndex + 1));\n }\n }\n return names;\n}\n\nasync function readKnownClaudeMarketplaceRecords(): Promise<Map<string, KnownClaudeMarketplaceRecord>> {\n const parsed = await readJsonFileIfExists<Record<string, KnownClaudeMarketplaceRecord>>(\n getClaudeKnownMarketplacesPath(),\n );\n return new Map(Object.entries(parsed ?? {}));\n}\n\nasync function readClaudeMarketplaceFile(\n manifestPath: string,\n): Promise<ClaudeMarketplaceFile> {\n const parsed = await readJsonFileIfExists<ClaudeMarketplaceFile>(manifestPath);\n if (!parsed || typeof parsed !== 'object') {\n return { plugins: [] };\n }\n\n return {\n ...parsed,\n plugins: Array.isArray(parsed.plugins)\n ? parsed.plugins.filter(\n (plugin): plugin is ClaudeMarketplacePluginEntry =>\n typeof plugin === 'object' && plugin !== null,\n )\n : [],\n };\n}\n\nasync function writeClaudeMarketplaceFile(\n manifestPath: string,\n marketplace: ClaudeMarketplaceFile,\n): Promise<void> {\n await ensureDir(dirname(manifestPath));\n await writeFile(manifestPath, `${JSON.stringify(marketplace, null, 2)}\\n`, 'utf-8');\n}\n\nfunction buildClaudeMarketplaceSourcePath(\n pluginTargetDir: string,\n marketplaceRootDir: string,\n): string {\n const relPath = relative(marketplaceRootDir, pluginTargetDir).replaceAll('\\\\', '/');\n if (relPath === '') {\n return '.';\n }\n return relPath.startsWith('.') ? relPath : `./${relPath}`;\n}\n\nfunction normalizeClaudeAuthor(\n author: ClaudePluginManifest['author'],\n): { name?: string; email?: string } | undefined {\n if (!author) {\n return undefined;\n }\n if (typeof author === 'string') {\n return { name: author };\n }\n return {\n name: author.name,\n email: author.email,\n };\n}\n\nfunction buildClaudeMarketplaceEntry(\n pluginTargetDir: string,\n marketplaceRootDir: string,\n manifest: ClaudePluginManifest,\n): ClaudeMarketplacePluginEntry {\n return {\n name: manifest.name ?? 'syntaur',\n description: manifest.description,\n version: manifest.version,\n author: normalizeClaudeAuthor(manifest.author),\n source: buildClaudeMarketplaceSourcePath(pluginTargetDir, marketplaceRootDir),\n category: 'development',\n };\n}\n\nfunction scoreClaudeMarketplaceCandidate(candidate: ClaudeMarketplaceCandidate): number {\n if (candidate.hasSyntaur) {\n return 100;\n }\n if (candidate.active && candidate.isUserPlugins) {\n return 90;\n }\n if (candidate.isUserPlugins) {\n return 80;\n }\n if (candidate.active && candidate.isDirectorySource) {\n return 70;\n }\n if (candidate.isDirectorySource) {\n return 60;\n }\n if (candidate.active) {\n return 50;\n }\n return 10;\n}\n\nasync function listClaudeMarketplaceCandidates(): Promise<ClaudeMarketplaceCandidate[]> {\n const rootDir = getClaudeMarketplacesRoot();\n if (!(await fileExists(rootDir))) {\n return [];\n }\n\n const [knownMarketplaces, activeMarketplaceNames, entries] = await Promise.all([\n readKnownClaudeMarketplaceRecords(),\n readInstalledClaudeMarketplaceNames(),\n readdir(rootDir, { withFileTypes: true }),\n ]);\n\n const candidates: ClaudeMarketplaceCandidate[] = [];\n const seen = new Set<string>();\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n const candidateRoot = resolve(rootDir, entry.name);\n const manifestPath = resolve(candidateRoot, '.claude-plugin', 'marketplace.json');\n if (!(await fileExists(manifestPath))) {\n continue;\n }\n\n const parsed = await readClaudeMarketplaceFile(manifestPath);\n const candidateName = typeof parsed.name === 'string' && parsed.name.trim() !== ''\n ? parsed.name\n : entry.name;\n const known = knownMarketplaces.get(candidateName);\n const hasSyntaur = parsed.plugins.some(\n (plugin) => plugin.name === 'syntaur' && typeof plugin.source === 'string',\n );\n const isUserPlugins = candidateName === 'user-plugins' || entry.name === 'user-plugins';\n\n candidates.push({\n name: candidateName,\n rootDir: candidateRoot,\n manifestPath,\n active: activeMarketplaceNames.has(candidateName),\n hasSyntaur,\n isUserPlugins,\n isDirectorySource: known?.source?.source === 'directory' || isUserPlugins,\n });\n seen.add(candidateRoot);\n }\n\n for (const [candidateName, known] of knownMarketplaces.entries()) {\n const installLocation = known.installLocation;\n if (!installLocation) {\n continue;\n }\n\n const candidateRoot = resolve(expandHome(installLocation));\n if (seen.has(candidateRoot)) {\n continue;\n }\n\n const manifestPath = resolve(candidateRoot, '.claude-plugin', 'marketplace.json');\n if (!(await fileExists(manifestPath))) {\n continue;\n }\n\n const parsed = await readClaudeMarketplaceFile(manifestPath);\n candidates.push({\n name: typeof parsed.name === 'string' && parsed.name.trim() !== ''\n ? parsed.name\n : candidateName,\n rootDir: candidateRoot,\n manifestPath,\n active: activeMarketplaceNames.has(candidateName),\n hasSyntaur: parsed.plugins.some(\n (plugin) => plugin.name === 'syntaur' && typeof plugin.source === 'string',\n ),\n isUserPlugins: candidateName === 'user-plugins',\n isDirectorySource: known.source?.source === 'directory' || candidateName === 'user-plugins',\n });\n }\n\n return candidates.sort((a, b) => scoreClaudeMarketplaceCandidate(b) - scoreClaudeMarketplaceCandidate(a));\n}\n\nasync function getPreferredClaudeMarketplace(): Promise<ClaudeMarketplaceLocation | null> {\n const candidate = (await listClaudeMarketplaceCandidates())[0];\n if (!candidate) {\n return null;\n }\n\n return {\n name: candidate.name,\n rootDir: candidate.rootDir,\n manifestPath: candidate.manifestPath,\n targetDir: resolve(candidate.rootDir, 'plugins', 'syntaur'),\n };\n}\n\nexport async function detectClaudeMarketplaceForTarget(\n targetDir: string,\n): Promise<ClaudeMarketplaceLocation | null> {\n const normalizedTargetDir = normalizeAbsoluteInstallPath(targetDir, 'Claude plugin target');\n const pluginsDir = dirname(normalizedTargetDir);\n if (basename(pluginsDir) !== 'plugins') {\n return null;\n }\n\n const rootDir = dirname(pluginsDir);\n const manifestPath = resolve(rootDir, '.claude-plugin', 'marketplace.json');\n if (!(await fileExists(manifestPath))) {\n return null;\n }\n\n const marketplace = await readClaudeMarketplaceFile(manifestPath);\n const name = typeof marketplace.name === 'string' && marketplace.name.trim() !== ''\n ? marketplace.name\n : basename(rootDir);\n\n return {\n name,\n rootDir,\n manifestPath,\n targetDir: normalizedTargetDir,\n };\n}\n\nasync function findManagedClaudeMarketplacePluginDir(): Promise<string | null> {\n const marketplaces = await listClaudeMarketplaceCandidates();\n for (const marketplace of marketplaces) {\n const targetDir = resolve(marketplace.rootDir, 'plugins', 'syntaur');\n const status = await getInstallStatus(targetDir, 'claude');\n if (status.exists && status.managed) {\n return targetDir;\n }\n }\n return null;\n}\n\nexport async function ensureClaudeMarketplaceEntry(options: {\n marketplaceRootDir: string;\n manifestPath: string;\n pluginTargetDir: string;\n expectedExistingPluginTargetDir?: string | null;\n}): Promise<{ manifestPath: string; changed: boolean }> {\n const marketplaceRootDir = normalizeAbsoluteInstallPath(\n options.marketplaceRootDir,\n 'Claude marketplace root',\n );\n const manifestPath = normalizeAbsoluteInstallPath(\n options.manifestPath,\n 'Claude marketplace manifest',\n );\n const pluginTargetDir = normalizeAbsoluteInstallPath(\n options.pluginTargetDir,\n 'Claude plugin target',\n );\n const marketplace = await readClaudeMarketplaceFile(manifestPath);\n const pluginManifest = await readClaudePluginManifest(pluginTargetDir);\n const entry = buildClaudeMarketplaceEntry(pluginTargetDir, marketplaceRootDir, pluginManifest);\n const expectedSource = entry.source;\n const existingIndex = marketplace.plugins.findIndex(\n (plugin) => plugin.name === entry.name && plugin.source === expectedSource,\n );\n\n if (existingIndex >= 0) {\n const existing = marketplace.plugins[existingIndex];\n const changed = JSON.stringify(existing) !== JSON.stringify(entry);\n if (changed) {\n marketplace.plugins[existingIndex] = entry;\n await writeClaudeMarketplaceFile(manifestPath, marketplace);\n }\n return { manifestPath, changed };\n }\n\n const conflictingIndex = marketplace.plugins.findIndex((plugin) => plugin.name === entry.name);\n if (conflictingIndex >= 0) {\n const expectedExistingSource = options.expectedExistingPluginTargetDir\n ? buildClaudeMarketplaceSourcePath(\n normalizeAbsoluteInstallPath(\n options.expectedExistingPluginTargetDir,\n 'Existing Claude plugin target',\n ),\n marketplaceRootDir,\n )\n : null;\n const existing = marketplace.plugins[conflictingIndex];\n if (expectedExistingSource && existing.source === expectedExistingSource) {\n marketplace.plugins[conflictingIndex] = entry;\n await writeClaudeMarketplaceFile(manifestPath, marketplace);\n return { manifestPath, changed: true };\n }\n\n throw new Error(\n `Marketplace entry \"${entry.name}\" already exists with different settings in ${manifestPath}. Remove it manually before installing the Claude plugin.`,\n );\n }\n\n marketplace.plugins.push(entry);\n await writeClaudeMarketplaceFile(manifestPath, marketplace);\n return { manifestPath, changed: true };\n}\n\nexport async function removeClaudeMarketplaceEntry(options: {\n manifestPath: string;\n marketplaceRootDir: string;\n pluginTargetDir?: string;\n}): Promise<{ manifestPath: string; removed: boolean }> {\n const manifestPath = normalizeAbsoluteInstallPath(\n options.manifestPath,\n 'Claude marketplace manifest',\n );\n if (!(await fileExists(manifestPath))) {\n return { manifestPath, removed: false };\n }\n\n const marketplaceRootDir = normalizeAbsoluteInstallPath(\n options.marketplaceRootDir,\n 'Claude marketplace root',\n );\n const expectedSource = options.pluginTargetDir\n ? buildClaudeMarketplaceSourcePath(\n normalizeAbsoluteInstallPath(options.pluginTargetDir, 'Claude plugin target'),\n marketplaceRootDir,\n )\n : null;\n const marketplace = await readClaudeMarketplaceFile(manifestPath);\n const beforeCount = marketplace.plugins.length;\n marketplace.plugins = marketplace.plugins.filter((plugin) => {\n if (plugin.name !== 'syntaur') {\n return true;\n }\n if (!expectedSource) {\n return false;\n }\n return plugin.source !== expectedSource;\n });\n\n if (marketplace.plugins.length === beforeCount) {\n return { manifestPath, removed: false };\n }\n\n await writeClaudeMarketplaceFile(manifestPath, marketplace);\n return { manifestPath, removed: true };\n}\n\nexport async function inspectInstallPath(\n pluginKind: PluginKind,\n targetDir: string,\n): Promise<ManagedInstallInspection> {\n const normalizedTarget = normalizeAbsoluteInstallPath(targetDir, `${getPluginDisplayName(pluginKind)} target`);\n const status = await getInstallStatus(normalizedTarget, pluginKind);\n return {\n exists: status.exists,\n managed: status.managed,\n installMode: status.installMode,\n targetDir: normalizedTarget,\n };\n}\n\nexport async function installManagedPlugin(\n options: ManagedPluginInstallOptions,\n): Promise<ManagedPluginInstallResult> {\n const {\n pluginKind,\n force = false,\n link = false,\n targetDir = getDefaultPluginTargetDir(pluginKind),\n } = options;\n const normalizedTargetDir = normalizeAbsoluteInstallPath(\n targetDir,\n `${getPluginDisplayName(pluginKind)} target`,\n );\n const paths = await resolvePluginPaths(pluginKind, normalizedTargetDir);\n\n if (!(await fileExists(paths.sourceDir))) {\n throw new Error(`Plugin source directory not found at ${paths.sourceDir}.`);\n }\n\n const desiredMode: InstallMode = link ? 'link' : 'copy';\n const existing = await getInstallStatus(paths.targetDir, pluginKind);\n\n if (existing.exists && !existing.managed) {\n throw new Error(\n `${paths.targetDir} already exists and is not a Syntaur-managed install. Remove it manually before installing Syntaur there.`,\n );\n }\n\n if (\n desiredMode === 'link' &&\n existing.exists &&\n existing.installMode === 'link' &&\n existing.symlinkTarget === resolve(paths.sourceDir) &&\n !force\n ) {\n return {\n targetDir: paths.targetDir,\n sourceDir: paths.sourceDir,\n mode: desiredMode,\n changed: false,\n };\n }\n\n if (existing.exists) {\n await rm(paths.targetDir, { recursive: true, force: true });\n }\n\n if (desiredMode === 'link') {\n await installLink(paths);\n } else {\n await installCopy(paths, pluginKind);\n }\n\n return {\n targetDir: paths.targetDir,\n sourceDir: paths.sourceDir,\n mode: desiredMode,\n changed: true,\n };\n}\n\nexport function buildMarketplaceSourcePath(\n pluginTargetDir: string,\n marketplacePath: string,\n): string {\n const relPath = relative(dirname(marketplacePath), pluginTargetDir).replaceAll('\\\\', '/');\n if (relPath === '') {\n return '.';\n }\n return relPath.startsWith('.') ? relPath : `./${relPath}`;\n}\n\nexport function buildSyntaurMarketplaceEntry(\n pluginTargetDir: string,\n marketplacePath: string,\n): MarketplaceEntry {\n return {\n name: 'syntaur',\n source: {\n source: 'local',\n path: buildMarketplaceSourcePath(pluginTargetDir, marketplacePath),\n },\n policy: {\n installation: 'AVAILABLE',\n authentication: 'ON_INSTALL',\n },\n category: 'Coding',\n };\n}\n\nexport async function readMarketplaceFile(marketplacePath: string): Promise<MarketplaceFile> {\n if (!(await fileExists(marketplacePath))) {\n return {\n name: 'local',\n interface: { displayName: 'Local Plugins' },\n plugins: [],\n };\n }\n\n const raw = await readFile(marketplacePath, 'utf-8');\n const parsed = JSON.parse(raw) as Partial<MarketplaceFile>;\n return {\n name: parsed.name ?? 'local',\n interface: parsed.interface ?? { displayName: 'Local Plugins' },\n plugins: Array.isArray(parsed.plugins)\n ? (parsed.plugins as MarketplaceEntry[])\n : [],\n };\n}\n\nexport async function writeMarketplaceFile(\n marketplacePath: string,\n marketplace: MarketplaceFile,\n): Promise<void> {\n await ensureDir(dirname(marketplacePath));\n await writeFile(marketplacePath, `${JSON.stringify(marketplace, null, 2)}\\n`, 'utf-8');\n}\n\nexport async function hasAnySyntaurMarketplaceEntry(marketplacePath: string): Promise<boolean> {\n const marketplace = await readMarketplaceFile(marketplacePath);\n return marketplace.plugins.some(\n (plugin) => plugin.name === 'syntaur' && plugin.source?.source === 'local',\n );\n}\n\nexport async function hasSyntaurMarketplaceEntry(\n marketplacePath: string,\n pluginTargetDir: string,\n): Promise<boolean> {\n const marketplace = await readMarketplaceFile(marketplacePath);\n const expectedPath = buildMarketplaceSourcePath(pluginTargetDir, marketplacePath);\n return marketplace.plugins.some(\n (plugin) =>\n plugin.name === 'syntaur' &&\n plugin.source?.source === 'local' &&\n plugin.source?.path === expectedPath,\n );\n}\n\nexport async function ensureMarketplaceEntry(\n options: EnsureMarketplaceEntryOptions,\n): Promise<{ marketplacePath: string; changed: boolean }> {\n const marketplacePath = normalizeAbsoluteInstallPath(\n options.marketplacePath,\n 'Codex marketplace path',\n );\n const pluginTargetDir = normalizeAbsoluteInstallPath(\n options.pluginTargetDir,\n 'Codex plugin target',\n );\n const marketplace = await readMarketplaceFile(marketplacePath);\n const entry = buildSyntaurMarketplaceEntry(pluginTargetDir, marketplacePath);\n const existingIndex = marketplace.plugins.findIndex(\n (plugin) =>\n plugin.name === entry.name &&\n plugin.source?.source === entry.source.source &&\n plugin.source?.path === entry.source.path,\n );\n\n if (existingIndex >= 0) {\n return { marketplacePath, changed: false };\n }\n\n const conflictingIndex = marketplace.plugins.findIndex((plugin) => plugin.name === entry.name);\n if (conflictingIndex >= 0) {\n const existing = marketplace.plugins[conflictingIndex];\n const expectedExistingPath = options.expectedExistingPluginTargetDir\n ? buildMarketplaceSourcePath(\n normalizeAbsoluteInstallPath(\n options.expectedExistingPluginTargetDir,\n 'Existing Codex plugin target',\n ),\n marketplacePath,\n )\n : null;\n\n if (\n existing.source?.source === 'local' &&\n expectedExistingPath &&\n existing.source?.path === expectedExistingPath\n ) {\n marketplace.plugins[conflictingIndex] = entry;\n await writeMarketplaceFile(marketplacePath, marketplace);\n return { marketplacePath, changed: true };\n }\n\n throw new Error(\n `Marketplace entry \"${entry.name}\" already exists with different settings in ${marketplacePath}. Remove it manually before installing the Codex plugin.`,\n );\n }\n\n marketplace.plugins.push(entry);\n await writeMarketplaceFile(marketplacePath, marketplace);\n return { marketplacePath, changed: true };\n}\n\nfunction isDefaultMarketplaceShell(marketplace: MarketplaceFile): boolean {\n return (\n marketplace.name === 'local' &&\n (marketplace.interface?.displayName ?? 'Local Plugins') === 'Local Plugins'\n );\n}\n\nexport async function removeMarketplaceEntry(\n options: RemoveMarketplaceEntryOptions,\n): Promise<{ marketplacePath: string; removed: boolean }> {\n const marketplacePath = normalizeAbsoluteInstallPath(\n options.marketplacePath,\n 'Codex marketplace path',\n );\n\n if (!(await fileExists(marketplacePath))) {\n return { marketplacePath, removed: false };\n }\n\n const expectedSourcePath = options.expectedSourcePath ?? (\n options.pluginTargetDir\n ? buildMarketplaceSourcePath(\n normalizeAbsoluteInstallPath(options.pluginTargetDir, 'Codex plugin target'),\n marketplacePath,\n )\n : null\n );\n const marketplace = await readMarketplaceFile(marketplacePath);\n const beforeCount = marketplace.plugins.length;\n marketplace.plugins = marketplace.plugins.filter((plugin) => {\n if (plugin.name !== 'syntaur' || plugin.source?.source !== 'local') {\n return true;\n }\n if (!expectedSourcePath) {\n return false;\n }\n return plugin.source.path !== expectedSourcePath;\n });\n\n if (marketplace.plugins.length === beforeCount) {\n return { marketplacePath, removed: false };\n }\n\n if (marketplace.plugins.length === 0 && isDefaultMarketplaceShell(marketplace)) {\n await rm(marketplacePath, { force: true });\n return { marketplacePath, removed: true };\n }\n\n await writeMarketplaceFile(marketplacePath, marketplace);\n return { marketplacePath, removed: true };\n}\n\nexport async function uninstallManagedPlugin(\n pluginKind: PluginKind,\n targetDir: string = getDefaultPluginTargetDir(pluginKind),\n): Promise<{ removed: boolean; targetDir: string }> {\n const normalizedTarget = normalizeAbsoluteInstallPath(\n targetDir,\n `${getPluginDisplayName(pluginKind)} target`,\n );\n const existing = await getInstallStatus(normalizedTarget, pluginKind);\n\n if (!existing.exists) {\n return { removed: false, targetDir: normalizedTarget };\n }\n\n if (!existing.managed) {\n throw new Error(\n `${normalizedTarget} exists but is not a Syntaur-managed install. Remove it manually if you want to replace it.`,\n );\n }\n\n await removeInstallMarker(normalizedTarget);\n await rm(normalizedTarget, { recursive: true, force: true });\n return { removed: true, targetDir: normalizedTarget };\n}\n\nexport async function getConfiguredOrLegacyManagedPluginDir(\n pluginKind: PluginKind,\n): Promise<string | null> {\n const config = await readConfig();\n const configuredPath = pluginKind === 'claude'\n ? config.integrations.claudePluginDir\n : config.integrations.codexPluginDir;\n if (configuredPath) {\n return configuredPath;\n }\n\n const defaultTarget = getDefaultPluginTargetDir(pluginKind);\n const status = await getInstallStatus(defaultTarget, pluginKind);\n if (status.exists && status.managed) {\n return defaultTarget;\n }\n\n if (pluginKind === 'claude') {\n return findManagedClaudeMarketplacePluginDir();\n }\n\n return null;\n}\n\nexport async function getConfiguredOrLegacyMarketplacePath(): Promise<string | null> {\n const config = await readConfig();\n if (config.integrations.codexMarketplacePath) {\n return config.integrations.codexMarketplacePath;\n }\n\n const defaultMarketplacePath = getDefaultMarketplacePath();\n return (await hasAnySyntaurMarketplaceEntry(defaultMarketplacePath))\n ? defaultMarketplacePath\n : null;\n}\n\nexport async function recommendPluginTargetDir(pluginKind: PluginKind): Promise<string> {\n const configuredOrManaged = await getConfiguredOrLegacyManagedPluginDir(pluginKind);\n\n if (pluginKind !== 'claude') {\n return configuredOrManaged ?? getDefaultPluginTargetDir(pluginKind);\n }\n\n const preferredMarketplace = await getPreferredClaudeMarketplace();\n const legacyTarget = getDefaultPluginTargetDir('claude');\n\n if (configuredOrManaged) {\n return configuredOrManaged === legacyTarget && preferredMarketplace\n ? preferredMarketplace.targetDir\n : configuredOrManaged;\n }\n\n return preferredMarketplace?.targetDir ?? legacyTarget;\n}\n\nexport async function recommendMarketplacePath(): Promise<string> {\n const configuredOrManaged = await getConfiguredOrLegacyMarketplacePath();\n return configuredOrManaged ?? getDefaultMarketplacePath();\n}\n\nexport async function isSyntaurDataInstalled(): Promise<boolean> {\n return fileExists(resolve(syntaurRoot(), 'config.md'));\n}\n\nexport function isSyntaurDataInstalledSync(): boolean {\n return existsSync(resolve(syntaurRoot(), 'config.md'));\n}\n\nexport async function removeSyntaurData(): Promise<void> {\n await rm(syntaurRoot(), { recursive: true, force: true });\n}\n\nexport async function getConfiguredProjectDir(): Promise<string | null> {\n if (!(await fileExists(resolve(syntaurRoot(), 'config.md')))) {\n return null;\n }\n\n return (await readConfig()).defaultProjectDir;\n}\n\nexport function getPluginDisplayName(pluginKind: PluginKind): string {\n return pluginKind === 'claude' ? 'Claude Code plugin' : 'Codex plugin';\n}\n\nexport function getPluginInstallCommand(pluginKind: PluginKind): string {\n return pluginKind === 'claude'\n ? 'syntaur install-plugin'\n : 'syntaur install-codex-plugin';\n}\n\nexport function getPluginTargetLabel(pluginKind: PluginKind): string {\n return basename(getDefaultPluginTargetDir(pluginKind));\n}\n","import { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { fileExists } from './fs.js';\n\nexport async function findPackageRoot(\n expectedRelativePath: string,\n): Promise<string> {\n let currentDir = dirname(fileURLToPath(import.meta.url));\n\n while (true) {\n const candidate = resolve(currentDir, expectedRelativePath);\n if (await fileExists(candidate)) {\n return currentDir;\n }\n\n const parentDir = resolve(currentDir, '..');\n if (parentDir === currentDir) {\n throw new Error(\n `Could not locate package root containing ${expectedRelativePath}.`,\n );\n }\n currentDir = parentDir;\n }\n}\n","import { stdin as input, stdout as output } from 'node:process';\nimport { createInterface } from 'node:readline/promises';\n\nexport function isInteractiveTerminal(): boolean {\n return Boolean(input.isTTY && output.isTTY);\n}\n\nexport function parseConfirmAnswer(\n answer: string,\n defaultValue: boolean = false,\n): boolean | null {\n const normalized = answer.trim().toLowerCase();\n if (normalized === '') {\n return defaultValue;\n }\n if (normalized === 'y' || normalized === 'yes') {\n return true;\n }\n if (normalized === 'n' || normalized === 'no') {\n return false;\n }\n return null;\n}\n\nexport async function confirmPrompt(\n question: string,\n defaultValue: boolean = false,\n): Promise<boolean> {\n if (!isInteractiveTerminal()) {\n throw new Error('Interactive confirmation requires a TTY.');\n }\n\n const suffix = defaultValue ? ' [Y/n] ' : ' [y/N] ';\n const rl = createInterface({ input, output });\n\n try {\n while (true) {\n const answer = await rl.question(`${question}${suffix}`);\n const parsed = parseConfirmAnswer(answer, defaultValue);\n if (parsed !== null) {\n return parsed;\n }\n console.log('Enter y, yes, n, no, or press Enter for the default.');\n }\n } finally {\n rl.close();\n }\n}\n\nexport async function textPrompt(\n question: string,\n defaultValue?: string,\n): Promise<string> {\n if (!isInteractiveTerminal()) {\n throw new Error('Interactive input requires a TTY.');\n }\n\n const suffix = defaultValue !== undefined ? ` [${defaultValue}] ` : ' ';\n const rl = createInterface({ input, output });\n\n try {\n const answer = (await rl.question(`${question}${suffix}`)).trim();\n if (answer === '' && defaultValue !== undefined) {\n return defaultValue;\n }\n return answer;\n } finally {\n rl.close();\n }\n}\n","import { updateIntegrationConfig } from '../utils/config.js';\nimport {\n ensureMarketplaceEntry,\n getConfiguredOrLegacyManagedPluginDir,\n getConfiguredOrLegacyMarketplacePath,\n hasSyntaurMarketplaceEntry,\n inspectInstallPath,\n installManagedPlugin,\n normalizeAbsoluteInstallPath,\n recommendMarketplacePath,\n recommendPluginTargetDir,\n removeMarketplaceEntry,\n uninstallManagedPlugin,\n} from '../utils/install.js';\nimport { confirmPrompt, isInteractiveTerminal, textPrompt } from '../utils/prompt.js';\n\nexport interface InstallCodexPluginOptions {\n force?: boolean;\n link?: boolean;\n targetDir?: string;\n marketplacePath?: string;\n promptForTarget?: boolean;\n}\n\nasync function promptForInstallPath(\n question: string,\n recommendedPath: string,\n): Promise<string> {\n while (true) {\n const answer = await textPrompt(question, recommendedPath);\n try {\n return normalizeAbsoluteInstallPath(answer, question);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n }\n }\n}\n\nexport async function installCodexPluginCommand(\n options: InstallCodexPluginOptions,\n): Promise<void> {\n const promptForTarget = Boolean(\n options.promptForTarget !== false &&\n isInteractiveTerminal() &&\n (!options.targetDir || !options.marketplacePath),\n );\n const recommendedTargetDir = await recommendPluginTargetDir('codex');\n const recommendedMarketplacePath = await recommendMarketplacePath();\n const targetDir = options.targetDir\n ? normalizeAbsoluteInstallPath(options.targetDir, 'Codex plugin target')\n : promptForTarget\n ? await promptForInstallPath('Codex plugin directory', recommendedTargetDir)\n : recommendedTargetDir;\n const marketplacePath = options.marketplacePath\n ? normalizeAbsoluteInstallPath(options.marketplacePath, 'Codex marketplace path')\n : promptForTarget\n ? await promptForInstallPath('Codex marketplace file path', recommendedMarketplacePath)\n : recommendedMarketplacePath;\n\n const previousTargetDir = await getConfiguredOrLegacyManagedPluginDir('codex');\n const previousMarketplacePath = await getConfiguredOrLegacyMarketplacePath();\n const pluginPathChanged = Boolean(previousTargetDir && previousTargetDir !== targetDir);\n const marketplacePathChanged = Boolean(\n previousMarketplacePath && previousMarketplacePath !== marketplacePath,\n );\n const previousInstall = previousTargetDir\n ? await inspectInstallPath('codex', previousTargetDir)\n : null;\n const previousMarketplaceEntryExists = Boolean(\n previousMarketplacePath &&\n previousTargetDir &&\n await hasSyntaurMarketplaceEntry(previousMarketplacePath, previousTargetDir),\n );\n\n if (pluginPathChanged && previousInstall?.exists && !previousInstall.managed) {\n throw new Error(\n `${previousTargetDir} exists but is not a Syntaur-managed install. Remove it manually before changing the Codex plugin location.`,\n );\n }\n\n if (\n (pluginPathChanged || marketplacePathChanged) &&\n (previousInstall?.exists || previousMarketplaceEntryExists) &&\n isInteractiveTerminal()\n ) {\n const confirmed = await confirmPrompt(\n `Move the Codex integration to ${targetDir} and ${marketplacePath} and remove the previous Syntaur-managed integration?`,\n true,\n );\n if (!confirmed) {\n throw new Error('Install cancelled.');\n }\n }\n\n const result = await installManagedPlugin({\n pluginKind: 'codex',\n force: options.force,\n link: options.link,\n targetDir,\n });\n const marketplace = await ensureMarketplaceEntry({\n marketplacePath,\n pluginTargetDir: result.targetDir,\n expectedExistingPluginTargetDir:\n previousMarketplacePath === marketplacePath ? previousTargetDir : null,\n });\n await updateIntegrationConfig({\n codexPluginDir: result.targetDir,\n codexMarketplacePath: marketplace.marketplacePath,\n });\n\n if (pluginPathChanged && previousInstall?.exists && previousInstall.managed && previousTargetDir) {\n const removed = await uninstallManagedPlugin('codex', previousTargetDir);\n if (removed.removed) {\n console.log(`Removed previous Codex plugin from ${removed.targetDir}`);\n }\n }\n\n if (\n previousMarketplacePath &&\n previousTargetDir &&\n previousMarketplacePath !== marketplace.marketplacePath\n ) {\n const removedMarketplace = await removeMarketplaceEntry({\n marketplacePath: previousMarketplacePath,\n pluginTargetDir: previousTargetDir,\n });\n if (removedMarketplace.removed) {\n console.log(`Removed previous Codex marketplace entry from ${removedMarketplace.marketplacePath}`);\n }\n }\n\n console.log('Installed Syntaur Codex plugin:');\n console.log(` target: ${result.targetDir}`);\n console.log(` source: ${result.sourceDir}`);\n console.log(` mode: ${result.mode}`);\n console.log(` marketplace: ${marketplace.marketplacePath}`);\n console.log('\\nThe plugin is now available to Codex.');\n console.log(\n ' Skills: syntaur-protocol, create-project, create-assignment, grab-assignment, plan-assignment, complete-assignment, track-session',\n );\n console.log(' Command: /track-session');\n console.log(' Hooks: write boundary enforcement, session cleanup');\n}\n","import { execSync } from 'node:child_process';\nimport { initCommand } from './init.js';\nimport { dashboardCommand, findAvailablePort } from './dashboard.js';\nimport { installPluginCommand } from './install-plugin.js';\nimport { installCodexPluginCommand } from './install-codex-plugin.js';\nimport { isSyntaurDataInstalled, getPluginInstallCommand } from '../utils/install.js';\nimport { confirmPrompt, isInteractiveTerminal } from '../utils/prompt.js';\nimport { updateOnboardingConfig } from '../utils/config.js';\n\nfunction isCliInstalled(command: string): boolean {\n try {\n execSync(`which ${command}`, { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface SetupOptions {\n yes?: boolean;\n claude?: boolean;\n codex?: boolean;\n dashboard?: boolean;\n claudeDir?: string;\n codexDir?: string;\n codexMarketplacePath?: string;\n}\n\nfunction printNonInteractiveSetupHelp(): void {\n console.error('Syntaur setup needs confirmation for optional steps when no TTY is available.');\n console.error('Run one of these commands instead:');\n console.error(' npx syntaur@latest setup --yes');\n console.error(' npx syntaur@latest setup --yes --claude');\n console.error(' npx syntaur@latest setup --yes --codex');\n console.error(` npx syntaur@latest setup --yes --dashboard`);\n}\n\nexport async function setupCommand(options: SetupOptions): Promise<void> {\n const initialized = await isSyntaurDataInstalled();\n const interactive = isInteractiveTerminal();\n\n if (!initialized) {\n if (!interactive && !options.yes && !options.claude && !options.codex && !options.dashboard) {\n printNonInteractiveSetupHelp();\n throw new Error('Non-interactive setup requires --yes and any optional follow-up flags.');\n }\n\n await initCommand({});\n } else {\n console.log('Syntaur is already initialized.');\n }\n\n let installClaude = Boolean(options.claude);\n let installCodex = Boolean(options.codex);\n let launchDashboard = Boolean(options.dashboard);\n\n if (interactive && !options.yes) {\n if (!options.claude) {\n const claudeAvailable = isCliInstalled('claude');\n if (!claudeAvailable) {\n console.log('Claude Code CLI not detected. Install it from https://claude.ai/download');\n installClaude = await confirmPrompt('Install the Claude Code plugin anyway?', false);\n } else {\n installClaude = await confirmPrompt('Install the Claude Code plugin?');\n }\n }\n if (!options.codex) {\n const codexAvailable = isCliInstalled('codex');\n if (!codexAvailable) {\n console.log('Codex CLI not detected. Install it from https://platform.openai.com/docs/codex');\n installCodex = await confirmPrompt('Install the Codex plugin anyway?', false);\n } else {\n installCodex = await confirmPrompt('Install the Codex plugin?');\n }\n }\n if (!options.dashboard) {\n launchDashboard = await confirmPrompt('Launch the dashboard now?', true);\n }\n }\n\n if (installClaude) {\n await installPluginCommand({\n targetDir: options.claudeDir,\n promptForTarget: !options.yes,\n });\n } else {\n console.log(`Skip Claude plugin for now. Install later with: ${getPluginInstallCommand('claude')}`);\n }\n\n if (installCodex) {\n await installCodexPluginCommand({\n targetDir: options.codexDir,\n marketplacePath: options.codexMarketplacePath,\n promptForTarget: !options.yes,\n });\n } else {\n console.log(`Skip Codex plugin for now. Install later with: ${getPluginInstallCommand('codex')}`);\n }\n\n if (launchDashboard) {\n const preferredPort = 4800;\n const port = await findAvailablePort(preferredPort);\n if (port === null) {\n throw new Error(\n `Could not find an available dashboard port starting at ${preferredPort}. Run \"syntaur dashboard --port <number>\" to choose one manually.`,\n );\n }\n if (port !== preferredPort) {\n console.log(`Port ${preferredPort} is busy. Launching the dashboard on port ${port} instead.`);\n }\n await updateOnboardingConfig({ completed: true });\n await dashboardCommand({\n port: String(port),\n dev: false,\n serverOnly: false,\n apiOnly: false,\n open: true,\n });\n return;\n }\n\n await updateOnboardingConfig({ completed: true });\n\n if (!initialized) {\n console.log('\\nNext steps:');\n console.log(' npx syntaur@latest create-project \"My First Project\"');\n console.log(' npx syntaur@latest dashboard');\n }\n}\n","import { resolve } from 'node:path';\nimport {\n detectClaudeMarketplaceForTarget,\n getConfiguredOrLegacyManagedPluginDir,\n getConfiguredOrLegacyMarketplacePath,\n getConfiguredProjectDir,\n removeClaudeMarketplaceEntry,\n removeSyntaurData,\n removeMarketplaceEntry,\n uninstallManagedPlugin,\n} from '../utils/install.js';\nimport { syntaurRoot } from '../utils/paths.js';\nimport { confirmPrompt } from '../utils/prompt.js';\n\nexport interface UninstallOptions {\n claude?: boolean;\n codex?: boolean;\n data?: boolean;\n all?: boolean;\n yes?: boolean;\n}\n\nfunction expandTargets(options: UninstallOptions): {\n claude: boolean;\n codex: boolean;\n data: boolean;\n} {\n if (options.all) {\n return { claude: true, codex: true, data: true };\n }\n\n if (options.claude || options.codex || options.data) {\n return {\n claude: Boolean(options.claude),\n codex: Boolean(options.codex),\n data: Boolean(options.data),\n };\n }\n\n return { claude: true, codex: true, data: false };\n}\n\nexport async function uninstallCommand(options: UninstallOptions): Promise<void> {\n const targets = expandTargets(options);\n const actions: string[] = [];\n\n if (targets.claude) actions.push('Claude Code plugin');\n if (targets.codex) actions.push('Codex plugin');\n if (targets.data) actions.push('~/.syntaur data');\n\n if (actions.length === 0) {\n console.log('Nothing selected for uninstall.');\n return;\n }\n\n if (!options.yes) {\n const confirmed = await confirmPrompt(\n `Remove: ${actions.join(', ')}?`,\n false,\n );\n if (!confirmed) {\n console.log('Uninstall cancelled.');\n return;\n }\n }\n\n if (targets.claude) {\n const claudeTargetDir = await getConfiguredOrLegacyManagedPluginDir('claude');\n const claudeMarketplace = claudeTargetDir\n ? await detectClaudeMarketplaceForTarget(claudeTargetDir)\n : null;\n const result = await uninstallManagedPlugin(\n 'claude',\n claudeTargetDir ?? undefined,\n );\n console.log(\n result.removed\n ? `Removed Claude Code plugin from ${result.targetDir}`\n : `Claude Code plugin not installed at ${result.targetDir}`,\n );\n if (claudeMarketplace) {\n const removedMarketplaceEntry = await removeClaudeMarketplaceEntry({\n manifestPath: claudeMarketplace.manifestPath,\n marketplaceRootDir: claudeMarketplace.rootDir,\n pluginTargetDir: claudeTargetDir ?? undefined,\n });\n if (removedMarketplaceEntry.removed) {\n console.log(`Removed Claude marketplace entry from ${removedMarketplaceEntry.manifestPath}`);\n }\n }\n }\n\n if (targets.codex) {\n const codexTargetDir = await getConfiguredOrLegacyManagedPluginDir('codex');\n const marketplacePath = await getConfiguredOrLegacyMarketplacePath();\n const result = await uninstallManagedPlugin(\n 'codex',\n codexTargetDir ?? undefined,\n );\n console.log(\n result.removed\n ? `Removed Codex plugin from ${result.targetDir}`\n : `Codex plugin not installed at ${result.targetDir}`,\n );\n\n if (marketplacePath) {\n const marketplace = await removeMarketplaceEntry({\n marketplacePath,\n pluginTargetDir: codexTargetDir ?? undefined,\n });\n if (marketplace.removed) {\n console.log(`Removed Codex marketplace entry from ${marketplace.marketplacePath}`);\n }\n }\n }\n\n if (targets.data) {\n const configuredProjectDir = await getConfiguredProjectDir();\n await removeSyntaurData();\n console.log(`Removed ${syntaurRoot()}`);\n\n if (\n configuredProjectDir &&\n resolve(configuredProjectDir) !== resolve(syntaurRoot(), 'projects')\n ) {\n console.warn(\n `Warning: config.md pointed to an external project directory (${configuredProjectDir}). That directory was not removed automatically.`,\n );\n }\n }\n\n if (!targets.data) {\n console.log('User project data in ~/.syntaur was kept.');\n }\n}\n","import { resolve } from 'node:path';\nimport { expandHome } from '../utils/paths.js';\nimport { fileExists, writeFileSafe, writeFileForce } from '../utils/fs.js';\nimport { readConfig } from '../utils/config.js';\nimport { isValidSlug } from '../utils/slug.js';\nimport { renderCursorProtocol, renderCursorAssignment } from '../templates/cursor-rules.js';\nimport { renderCodexAgents } from '../templates/codex-agents.js';\nimport { renderOpenCodeConfig } from '../templates/opencode-config.js';\n\nconst SUPPORTED_FRAMEWORKS = ['cursor', 'codex', 'opencode'] as const;\ntype Framework = (typeof SUPPORTED_FRAMEWORKS)[number];\n\nexport interface SetupAdapterOptions {\n project: string;\n assignment: string;\n force?: boolean;\n dir?: string;\n}\n\nexport async function setupAdapterCommand(\n framework: string,\n options: SetupAdapterOptions,\n): Promise<void> {\n // Validate framework\n if (!SUPPORTED_FRAMEWORKS.includes(framework as Framework)) {\n throw new Error(\n `Unsupported framework \"${framework}\". Supported: ${SUPPORTED_FRAMEWORKS.join(', ')}`,\n );\n }\n\n // Validate required options\n if (!options.project) {\n throw new Error('--project <slug> is required.');\n }\n if (!options.assignment) {\n throw new Error('--assignment <slug> is required.');\n }\n if (!isValidSlug(options.project)) {\n throw new Error(\n `Invalid project slug \"${options.project}\". Slugs must be lowercase, hyphen-separated, with no special characters.`,\n );\n }\n if (!isValidSlug(options.assignment)) {\n throw new Error(\n `Invalid assignment slug \"${options.assignment}\". Slugs must be lowercase, hyphen-separated, with no special characters.`,\n );\n }\n\n // Resolve paths\n const config = await readConfig();\n const baseDir = options.dir\n ? expandHome(options.dir)\n : config.defaultProjectDir;\n const projectDir = resolve(baseDir, options.project);\n const assignmentDir = resolve(\n projectDir,\n 'assignments',\n options.assignment,\n );\n\n // Verify project exists\n const projectMdPath = resolve(projectDir, 'project.md');\n if (!(await fileExists(projectDir)) || !(await fileExists(projectMdPath))) {\n throw new Error(\n `Project \"${options.project}\" not found at ${projectDir}.`,\n );\n }\n\n // Verify assignment exists\n const assignmentMdPath = resolve(assignmentDir, 'assignment.md');\n if (!(await fileExists(assignmentDir)) || !(await fileExists(assignmentMdPath))) {\n throw new Error(\n `Assignment \"${options.assignment}\" not found at ${assignmentDir}.`,\n );\n }\n\n const cwd = process.cwd();\n const writtenFiles: string[] = [];\n const skippedFiles: string[] = [];\n\n const rendererParams = {\n projectSlug: options.project,\n assignmentSlug: options.assignment,\n projectDir,\n assignmentDir,\n };\n\n async function writeAdapterFile(filePath: string, content: string): Promise<void> {\n if (options.force) {\n await writeFileForce(filePath, content);\n writtenFiles.push(filePath);\n } else {\n if (await writeFileSafe(filePath, content)) {\n writtenFiles.push(filePath);\n } else {\n skippedFiles.push(filePath);\n }\n }\n }\n\n if (framework === 'cursor') {\n const protocolPath = resolve(cwd, '.cursor', 'rules', 'syntaur-protocol.mdc');\n const assignmentPath = resolve(cwd, '.cursor', 'rules', 'syntaur-assignment.mdc');\n\n await writeAdapterFile(protocolPath, renderCursorProtocol());\n await writeAdapterFile(assignmentPath, renderCursorAssignment(rendererParams));\n } else if (framework === 'codex' || framework === 'opencode') {\n const agentsPath = resolve(cwd, 'AGENTS.md');\n await writeAdapterFile(agentsPath, renderCodexAgents(rendererParams));\n\n if (framework === 'opencode') {\n const configPath = resolve(cwd, 'opencode.json');\n await writeAdapterFile(configPath, renderOpenCodeConfig({ projectDir }));\n }\n }\n\n // Output results\n if (writtenFiles.length > 0) {\n console.log(`Generated ${framework} adapter files:`);\n for (const f of writtenFiles) {\n console.log(` ${f}`);\n }\n }\n if (skippedFiles.length > 0) {\n console.log(`Skipped (already exist, use --force to overwrite):`);\n for (const f of skippedFiles) {\n console.log(` ${f}`);\n }\n }\n if (writtenFiles.length === 0 && skippedFiles.length > 0) {\n console.log(`No files written. All target files already exist.`);\n }\n}\n","import { resolve } from 'node:path';\nimport { expandHome } from '../utils/paths.js';\nimport { fileExists } from '../utils/fs.js';\nimport { readConfig } from '../utils/config.js';\nimport { initSessionDb } from '../dashboard/session-db.js';\nimport { appendSession } from '../dashboard/agent-sessions.js';\nimport type { AgentSessionStatus } from '../dashboard/types.js';\n\nexport interface TrackSessionOptions {\n project?: string;\n assignment?: string;\n agent: string;\n sessionId?: string;\n path?: string;\n dir?: string;\n description?: string;\n transcriptPath?: string;\n}\n\nexport async function trackSessionCommand(\n options: TrackSessionOptions,\n): Promise<void> {\n if (!options.agent) {\n throw new Error('--agent <name> is required.');\n }\n\n if (!options.sessionId) {\n throw new Error(\n '--session-id <id> is required. Pass the real agent-generated session id — do not synthesize one.',\n );\n }\n\n if (options.project) {\n const config = await readConfig();\n const baseDir = options.dir\n ? expandHome(options.dir)\n : config.defaultProjectDir;\n const projectDir = resolve(baseDir, options.project);\n\n if (!(await fileExists(projectDir))) {\n throw new Error(\n `Project \"${options.project}\" not found at ${projectDir}.`,\n );\n }\n }\n\n initSessionDb();\n\n const { sessionId } = options;\n\n await appendSession('', {\n projectSlug: options.project || null,\n assignmentSlug: options.assignment || null,\n agent: options.agent,\n sessionId,\n started: new Date().toISOString(),\n status: 'active' as AgentSessionStatus,\n path: options.path || process.cwd(),\n description: options.description || null,\n transcriptPath: options.transcriptPath ?? null,\n });\n\n if (options.project && options.assignment) {\n console.log(\n `Registered agent session ${sessionId} for ${options.assignment} in ${options.project}.`,\n );\n } else {\n console.log(`Registered standalone agent session ${sessionId}.`);\n }\n}\n","import { readConfig } from '../utils/config.js';\nimport type { AgentType } from '../tui/launch.js';\n\nexport async function browseCommand(options: { agent: AgentType }): Promise<void> {\n const config = await readConfig();\n const projectsDir = config.defaultProjectDir;\n const agent = options.agent;\n\n const { render } = await import('ink');\n const React = await import('react');\n const { App } = await import('../tui/App.js');\n const { launchAgent } = await import('../tui/launch.js');\n\n let unmount: (() => void) | null = null;\n\n const onLaunch = async (launchOpts: { projectsDir: string; projectSlug: string; assignmentSlug: string }) => {\n if (unmount) {\n unmount();\n unmount = null;\n }\n await launchAgent({ ...launchOpts, agent });\n };\n\n const instance = render(\n React.createElement(App, { projectsDir, onLaunch }),\n );\n unmount = instance.unmount;\n\n await instance.waitUntilExit();\n}\n","import { resolve } from 'node:path';\nimport { slugify, isValidSlug } from '../utils/slug.js';\nimport { nowTimestamp } from '../utils/timestamp.js';\nimport { playbooksDir as getPlaybooksDir } from '../utils/paths.js';\nimport { ensureDir, writeFileSafe, fileExists } from '../utils/fs.js';\nimport { renderPlaybook } from '../templates/playbook.js';\nimport { rebuildPlaybookManifest } from '../utils/playbooks.js';\n\nexport interface CreatePlaybookOptions {\n slug?: string;\n description?: string;\n}\n\nexport async function createPlaybookCommand(\n name: string,\n options: CreatePlaybookOptions,\n): Promise<string> {\n if (!name.trim()) {\n throw new Error('Playbook name cannot be empty.');\n }\n\n const slug = options.slug || slugify(name);\n if (!isValidSlug(slug)) {\n throw new Error(\n `Invalid slug \"${slug}\". Slugs must be lowercase, hyphen-separated, with no special characters.`,\n );\n }\n\n const dir = getPlaybooksDir();\n await ensureDir(dir);\n\n const filePath = resolve(dir, `${slug}.md`);\n if (await fileExists(filePath)) {\n throw new Error(\n `Playbook \"${slug}\" already exists at ${filePath}\\nUse --slug to specify a different slug.`,\n );\n }\n\n const timestamp = nowTimestamp();\n const description = options.description || '';\n\n const content = renderPlaybook({ slug, name, description, timestamp });\n await writeFileSafe(filePath, content);\n await rebuildPlaybookManifest(dir);\n\n console.log(`Created playbook \"${name}\" at ${filePath}`);\n console.log(` Slug: ${slug}`);\n\n return slug;\n}\n","import { readdir, readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { playbooksDir as getPlaybooksDir } from '../utils/paths.js';\nimport { fileExists } from '../utils/fs.js';\nimport { parsePlaybook } from '../dashboard/parser.js';\n\nexport async function listPlaybooksCommand(): Promise<void> {\n const dir = getPlaybooksDir();\n\n if (!(await fileExists(dir))) {\n console.log('No playbooks directory found. Run \"syntaur init\" first.');\n return;\n }\n\n const entries = await readdir(dir, { withFileTypes: true });\n const mdFiles = entries.filter((e) => e.isFile() && e.name.endsWith('.md') && !e.name.startsWith('_') && e.name !== 'manifest.md');\n\n if (mdFiles.length === 0) {\n console.log('No playbooks found. Create one with \"syntaur create-playbook <name>\".');\n return;\n }\n\n console.log(`Found ${mdFiles.length} playbook(s):\\n`);\n console.log(`${'Slug'.padEnd(30)} ${'Name'.padEnd(30)} Description`);\n console.log(`${'─'.repeat(30)} ${'─'.repeat(30)} ${'─'.repeat(40)}`);\n\n for (const entry of mdFiles) {\n const filePath = resolve(dir, entry.name);\n const raw = await readFile(filePath, 'utf-8');\n const parsed = parsePlaybook(raw);\n\n const slug = parsed.slug || entry.name.replace(/\\.md$/, '');\n const name = parsed.name || slug;\n const desc = parsed.description || '';\n\n console.log(`${slug.padEnd(30)} ${name.padEnd(30)} ${desc}`);\n }\n}\n","import { Command } from 'commander';\nimport { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { todosDir as getTodosDir } from '../utils/paths.js';\nimport {\n readChecklist,\n writeChecklist,\n readLog,\n appendLogEntry,\n generateUniqueId,\n computeCounts,\n checklistPath,\n logPath,\n archivePath,\n} from '../todos/parser.js';\nimport { ensureDir, fileExists, writeFileForce } from '../utils/fs.js';\nimport type { TodoItem, LogEntry } from '../todos/types.js';\n\nconst WORKSPACE_REGEX = /^[a-z0-9_][a-z0-9-]*$/;\n\nfunction resolveWorkspace(options: { workspace?: string; global?: boolean }): string {\n if (options.global) return '_global';\n if (options.workspace) {\n if (!WORKSPACE_REGEX.test(options.workspace)) {\n throw new Error(`Invalid workspace name: \"${options.workspace}\". Use lowercase letters, numbers, hyphens, and underscores.`);\n }\n return options.workspace;\n }\n return '_global';\n}\n\nfunction nowISO(): string {\n return new Date().toISOString();\n}\n\nexport const todoCommand = new Command('todo')\n .description('Manage quick todos');\n\ntodoCommand\n .command('add')\n .description('Add a new todo item')\n .argument('<description>', 'Todo description')\n .option('--tags <tags>', 'Comma-separated tags')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (description: string, options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n const existingIds = new Set(checklist.items.map((i) => i.id));\n const id = generateUniqueId(existingIds);\n const tags = options.tags ? options.tags.split(',').map((t: string) => t.trim()) : [];\n\n const item: TodoItem = { id, description, status: 'open', tags, session: null };\n checklist.items.push(item);\n await writeChecklist(todosPath, checklist);\n console.log(`Added todo [t:${id}]: ${description}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\ntodoCommand\n .command('list')\n .description('List todo items')\n .option('--tag <tag>', 'Filter by tag')\n .option('--status <status>', 'Filter by status (open|in_progress|completed|blocked)')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n let items = checklist.items;\n\n if (options.tag) {\n items = items.filter((i) => i.tags.includes(options.tag));\n }\n if (options.status) {\n items = items.filter((i) => i.status === options.status);\n }\n\n if (items.length === 0) {\n console.log('No todos found.');\n return;\n }\n\n const statusIcons: Record<string, string> = {\n open: '[ ]',\n in_progress: '[>]',\n completed: '[x]',\n blocked: '[!]',\n };\n\n for (const item of items) {\n const icon = statusIcons[item.status] || '[ ]';\n const tagStr = item.tags.length > 0 ? ` ${item.tags.map((t) => `#${t}`).join(' ')}` : '';\n console.log(`${icon} ${item.description}${tagStr} [t:${item.id}]`);\n }\n\n const counts = computeCounts(items);\n console.log(`\\n${counts.total} items: ${counts.open} open, ${counts.in_progress} active, ${counts.completed} done, ${counts.blocked} blocked`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\nfunction findItem(items: TodoItem[], id: string): TodoItem | undefined {\n return items.find((i) => i.id === id);\n}\n\ntodoCommand\n .command('start')\n .description('Mark a todo as in-progress')\n .argument('<id>', 'Todo short ID (e.g. a3f1)')\n .option('--session <session>', 'Session ID')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (id: string, options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n const item = findItem(checklist.items, id);\n if (!item) {\n console.error(`Todo [t:${id}] not found.`);\n process.exit(1);\n }\n if (item.status === 'in_progress') {\n console.error(`Todo [t:${id}] is already in progress (session: ${item.session}).`);\n process.exit(1);\n }\n item.status = 'in_progress';\n item.session = options.session || null;\n await writeChecklist(todosPath, checklist);\n console.log(`Started [t:${id}]: ${item.description}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\ntodoCommand\n .command('complete')\n .description('Mark a todo as completed')\n .argument('<id>', 'Todo short ID')\n .option('--summary <summary>', 'Completion summary')\n .option('--branch <branch>', 'Git branch name')\n .option('--session <session>', 'Session ID')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (id: string, options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n const item = findItem(checklist.items, id);\n if (!item) {\n console.error(`Todo [t:${id}] not found.`);\n process.exit(1);\n }\n item.status = 'completed';\n item.session = null;\n await writeChecklist(todosPath, checklist);\n\n const entry: LogEntry = {\n timestamp: nowISO(),\n itemIds: [id],\n items: item.description,\n session: options.session || null,\n branch: options.branch || null,\n summary: options.summary || 'Completed.',\n blockers: null,\n status: null,\n };\n await appendLogEntry(todosPath, workspace, entry);\n console.log(`Completed [t:${id}]: ${item.description}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\ntodoCommand\n .command('block')\n .description('Mark a todo as blocked')\n .argument('<id>', 'Todo short ID')\n .requiredOption('--reason <reason>', 'Blocking reason')\n .option('--session <session>', 'Session ID')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (id: string, options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n const item = findItem(checklist.items, id);\n if (!item) {\n console.error(`Todo [t:${id}] not found.`);\n process.exit(1);\n }\n item.status = 'blocked';\n item.session = null;\n await writeChecklist(todosPath, checklist);\n\n const entry: LogEntry = {\n timestamp: nowISO(),\n itemIds: [id],\n items: item.description,\n session: options.session || null,\n branch: null,\n summary: options.reason,\n blockers: options.reason,\n status: 'blocked',\n };\n await appendLogEntry(todosPath, workspace, entry);\n console.log(`Blocked [t:${id}]: ${item.description}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\ntodoCommand\n .command('unblock')\n .description('Return a blocked todo to open')\n .argument('<id>', 'Todo short ID')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (id: string, options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n const item = findItem(checklist.items, id);\n if (!item) {\n console.error(`Todo [t:${id}] not found.`);\n process.exit(1);\n }\n item.status = 'open';\n item.session = null;\n await writeChecklist(todosPath, checklist);\n console.log(`Unblocked [t:${id}]: ${item.description}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\ntodoCommand\n .command('delete')\n .description('Delete a todo item (no log entry)')\n .argument('<id>', 'Todo short ID')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (id: string, options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n const idx = checklist.items.findIndex((i) => i.id === id);\n if (idx === -1) {\n console.error(`Todo [t:${id}] not found.`);\n process.exit(1);\n }\n const item = checklist.items[idx];\n checklist.items.splice(idx, 1);\n await writeChecklist(todosPath, checklist);\n console.log(`Deleted [t:${id}]: ${item.description}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\ntodoCommand\n .command('edit')\n .description('Update a todo description')\n .argument('<id>', 'Todo short ID')\n .argument('<description>', 'New description')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (id: string, description: string, options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n const item = findItem(checklist.items, id);\n if (!item) {\n console.error(`Todo [t:${id}] not found.`);\n process.exit(1);\n }\n item.description = description;\n await writeChecklist(todosPath, checklist);\n console.log(`Updated [t:${id}]: ${description}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\ntodoCommand\n .command('tag')\n .description('Modify tags on a todo')\n .argument('<id>', 'Todo short ID')\n .option('--add <tags>', 'Tags to add (comma-separated)')\n .option('--remove <tags>', 'Tags to remove (comma-separated)')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (id: string, options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n const item = findItem(checklist.items, id);\n if (!item) {\n console.error(`Todo [t:${id}] not found.`);\n process.exit(1);\n }\n if (options.add) {\n const toAdd = options.add.split(',').map((t: string) => t.trim());\n for (const tag of toAdd) {\n if (!item.tags.includes(tag)) item.tags.push(tag);\n }\n }\n if (options.remove) {\n const toRemove = options.remove.split(',').map((t: string) => t.trim());\n item.tags = item.tags.filter((t) => !toRemove.includes(t));\n }\n await writeChecklist(todosPath, checklist);\n console.log(`Tags for [t:${id}]: ${item.tags.map((t) => `#${t}`).join(' ') || '(none)'}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\ntodoCommand\n .command('log')\n .description('Show log entries')\n .argument('[id]', 'Optional todo short ID to filter')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (id: string | undefined, options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const log = await readLog(todosPath, workspace);\n let entries = log.entries;\n\n if (id) {\n entries = entries.filter((e) => e.itemIds.includes(id));\n }\n\n if (entries.length === 0) {\n console.log('No log entries found.');\n return;\n }\n\n for (const entry of entries) {\n console.log(`\\n${entry.timestamp} — ${entry.itemIds.map((i) => `t:${i}`).join(', ')}`);\n if (entry.items) console.log(` Items: ${entry.items}`);\n if (entry.session) console.log(` Session: ${entry.session}`);\n if (entry.branch) console.log(` Branch: ${entry.branch}`);\n console.log(` Summary: ${entry.summary}`);\n if (entry.blockers) console.log(` Blockers: ${entry.blockers}`);\n }\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\ntodoCommand\n .command('archive')\n .description('Archive completed todos and their log entries')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n const log = await readLog(todosPath, workspace);\n\n const completedIds = new Set(\n checklist.items.filter((i) => i.status === 'completed').map((i) => i.id),\n );\n\n if (completedIds.size === 0) {\n console.log('No completed items to archive.');\n return;\n }\n\n // Collect log entries for completed items\n const toArchive = log.entries.filter((e) =>\n e.itemIds.every((id) => completedIds.has(id)),\n );\n\n // Write archive file\n const archFile = archivePath(todosPath, workspace, checklist.archiveInterval);\n await ensureDir(resolve(todosPath, 'archive'));\n let archContent = '';\n if (await fileExists(archFile)) {\n archContent = await readFile(archFile, 'utf-8');\n archContent = archContent.trimEnd() + '\\n\\n';\n } else {\n archContent = `---\\nworkspace: ${workspace}\\n---\\n\\n# Archive\\n\\n`;\n }\n\n // Add completed items as reference\n const completedItems = checklist.items.filter((i) => completedIds.has(i.id));\n for (const item of completedItems) {\n archContent += `- [x] ${item.description} ${item.tags.map((t) => `#${t}`).join(' ')} [t:${item.id}]\\n`;\n }\n archContent += '\\n';\n\n // Add log entries\n for (const entry of toArchive) {\n archContent += `### ${entry.timestamp} — ${entry.itemIds.map((i) => `t:${i}`).join(', ')}\\n`;\n if (entry.items) archContent += `**Items:** ${entry.items}\\n`;\n if (entry.session) archContent += `**Session:** ${entry.session}\\n`;\n if (entry.branch) archContent += `**Branch:** ${entry.branch}\\n`;\n if (entry.summary) archContent += `**Summary:** ${entry.summary}\\n`;\n if (entry.blockers) archContent += `**Blockers:** ${entry.blockers}\\n`;\n archContent += '\\n';\n }\n\n await writeFileForce(archFile, archContent);\n\n // Remove completed items from checklist\n checklist.items = checklist.items.filter((i) => !completedIds.has(i.id));\n await writeChecklist(todosPath, checklist);\n\n // Remove archived entries from log using Set identity (index-based)\n const archivedEntries = new Set(toArchive);\n log.entries = log.entries.filter((e) => !archivedEntries.has(e));\n // Rewrite the log\n if (log.entries.length > 0) {\n let logContent = `---\\nworkspace: ${workspace}\\n---\\n\\n# Todo Log\\n\\n`;\n for (const entry of log.entries) {\n logContent += `### ${entry.timestamp} — ${entry.itemIds.map((i) => `t:${i}`).join(', ')}\\n`;\n if (entry.items) logContent += `**Items:** ${entry.items}\\n`;\n if (entry.session) logContent += `**Session:** ${entry.session}\\n`;\n if (entry.branch) logContent += `**Branch:** ${entry.branch}\\n`;\n if (entry.summary) logContent += `**Summary:** ${entry.summary}\\n`;\n if (entry.blockers) logContent += `**Blockers:** ${entry.blockers}\\n`;\n logContent += '\\n';\n }\n await writeFileForce(logPath(todosPath, workspace), logContent);\n } else {\n await writeFileForce(logPath(todosPath, workspace), `---\\nworkspace: ${workspace}\\n---\\n\\n# Todo Log\\n`);\n }\n\n console.log(`Archived ${completedIds.size} completed items and ${toArchive.length} log entries.`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\ntodoCommand\n .command('promote')\n .description('Promote a todo to a full assignment')\n .argument('<id>', 'Todo short ID')\n .requiredOption('--project <slug>', 'Target project slug')\n .option('--workspace <slug>', 'Workspace slug')\n .option('--global', 'Use global todos')\n .action(async (id: string, options) => {\n try {\n const todosPath = getTodosDir();\n const workspace = resolveWorkspace(options);\n const checklist = await readChecklist(todosPath, workspace);\n const item = findItem(checklist.items, id);\n if (!item) {\n console.error(`Todo [t:${id}] not found.`);\n process.exit(1);\n }\n\n // Mark as completed with promotion note\n item.status = 'completed';\n item.session = null;\n await writeChecklist(todosPath, checklist);\n\n const entry: LogEntry = {\n timestamp: nowISO(),\n itemIds: [id],\n items: item.description,\n session: null,\n branch: null,\n summary: `Promoted to assignment in project: ${options.project}`,\n blockers: null,\n status: null,\n };\n await appendLogEntry(todosPath, workspace, entry);\n\n console.log(`Promoted [t:${id}] to assignment in project \"${options.project}\".`);\n console.log(`Run: syntaur create-assignment --project ${options.project} \"${item.description}\"`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { updateBackupConfig } from '../utils/config.js';\nimport {\n backupToGithub,\n restoreFromGithub,\n getBackupStatus,\n parseCategoriesStrict,\n validateRepoUrl,\n VALID_CATEGORIES,\n type BackupCategory,\n} from '../utils/github-backup.js';\n\nfunction parseCategoryOption(csv: string | undefined): BackupCategory[] | undefined {\n if (!csv) return undefined;\n const parts = csv.split(',').map((s) => s.trim()).filter(Boolean);\n if (parts.length === 0) {\n throw new Error(`No categories provided. Valid: ${VALID_CATEGORIES.join(', ')}`);\n }\n return parseCategoriesStrict(parts);\n}\n\nexport const backupCommand = new Command('backup')\n .description('Back up Syntaur files to a GitHub repository');\n\nbackupCommand\n .command('push')\n .description('Push a backup to the configured GitHub repo')\n .option('--repo <url>', 'Override the configured repo URL')\n .option('--categories <list>', 'Comma-separated categories to back up (projects, playbooks, todos, servers, config)')\n .action(async (options) => {\n try {\n const result = await backupToGithub({\n repo: options.repo,\n categories: parseCategoryOption(options.categories),\n });\n console.log(result.message);\n if (result.committed) {\n console.log(` timestamp: ${result.timestamp}`);\n }\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\nbackupCommand\n .command('pull')\n .description('Restore Syntaur files from the configured GitHub repo')\n .option('--repo <url>', 'Override the configured repo URL')\n .option('--categories <list>', 'Comma-separated categories to restore')\n .action(async (options) => {\n try {\n const result = await restoreFromGithub({\n repo: options.repo,\n categories: parseCategoryOption(options.categories),\n });\n console.log(result.message);\n console.log(` timestamp: ${result.timestamp}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\nbackupCommand\n .command('config')\n .description('Show or update backup configuration')\n .option('--repo <url>', 'Set the backup repo URL')\n .option('--categories <list>', 'Set the default categories (comma-separated)')\n .action(async (options) => {\n try {\n const updates: { repo?: string; categories?: string } = {};\n\n if (options.repo !== undefined) {\n const trimmed = typeof options.repo === 'string' ? options.repo.trim() : options.repo;\n if (!validateRepoUrl(trimmed)) {\n throw new Error(`Invalid repo URL: \"${options.repo}\". Must start with https:// or git@.`);\n }\n updates.repo = trimmed;\n }\n if (options.categories !== undefined) {\n const parts = options.categories.split(',').map((s: string) => s.trim()).filter(Boolean);\n if (parts.length === 0) {\n throw new Error(`No categories provided. Valid: ${VALID_CATEGORIES.join(', ')}`);\n }\n const valid = parseCategoriesStrict(parts);\n updates.categories = valid.join(', ');\n }\n\n if (Object.keys(updates).length > 0) {\n await updateBackupConfig(updates);\n console.log('Backup configuration updated.');\n }\n\n const status = await getBackupStatus();\n console.log('\\nBackup configuration:');\n console.log(` repo: ${status.repo ?? '(not set)'}`);\n console.log(` categories: ${status.categories}`);\n console.log(` lastBackup: ${status.lastBackup ?? '(never)'}`);\n console.log(` lastRestore: ${status.lastRestore ?? '(never)'}`);\n if (status.locked) {\n console.log(' ⚠ locked: a backup operation is in progress or the lock is stale');\n }\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { runChecks } from '../utils/doctor/index.js';\nimport { renderHuman } from '../utils/doctor/output-human.js';\nimport { renderJson } from '../utils/doctor/output-json.js';\nimport { fileExists } from '../utils/fs.js';\nimport { syntaurRoot } from '../utils/paths.js';\n\ninterface DoctorOptions {\n json?: boolean;\n fix?: boolean;\n only?: string;\n verbose?: boolean;\n}\n\nexport const doctorCommand = new Command('doctor')\n .description('Diagnose Syntaur state and surface issues with suggested fixes')\n .option('--json', 'Emit structured JSON for programmatic consumers')\n .option('--fix', 'Apply safe auto-fixes (v1: no-op; reserved for future checks)')\n .option('--only <check-id>', 'Run only the check with this ID')\n .option('--verbose', 'Include passing checks in human output')\n .action(async (options: DoctorOptions) => {\n if (!(await fileExists(syntaurRoot()))) {\n const msg = '~/.syntaur/ does not exist. Run `syntaur init` first.';\n if (options.json) {\n process.stdout.write(\n JSON.stringify(\n {\n version: '1.0',\n error: msg,\n },\n null,\n 2,\n ) + '\\n',\n );\n } else {\n process.stderr.write(msg + '\\n');\n }\n process.exit(2);\n }\n\n try {\n const report = await runChecks({ only: options.only });\n\n if (options.json) {\n process.stdout.write(renderJson(report) + '\\n');\n } else {\n process.stdout.write(renderHuman(report, { verbose: options.verbose ?? false }) + '\\n');\n }\n\n if (options.fix && !options.json) {\n process.stdout.write(\n '\\nnote: --fix is reserved but has no auto-fixable remediations in v1.\\n',\n );\n }\n\n const hasError = report.summary.error > 0;\n process.exit(hasError ? 1 : 0);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (options.json) {\n process.stdout.write(JSON.stringify({ version: '1.0', error: msg }, null, 2) + '\\n');\n } else {\n process.stderr.write(`doctor itself failed: ${msg}\\n`);\n }\n process.exit(2);\n }\n });\n","import { fileURLToPath } from 'node:url';\nimport { readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { buildCheckContext, closeCheckContext } from './context.js';\nimport { allChecks } from './registry.js';\nimport type { Check, CheckContext, CheckResult, DoctorReport } from './types.js';\n\nexport interface RunOptions {\n only?: string;\n cwd?: string;\n}\n\nexport async function runChecks(options: RunOptions = {}): Promise<DoctorReport> {\n const ctx = await buildCheckContext(options.cwd);\n try {\n return await runWithContext(ctx, options);\n } finally {\n closeCheckContext(ctx);\n }\n}\n\nexport async function runWithContext(\n ctx: CheckContext,\n options: RunOptions = {},\n): Promise<DoctorReport> {\n const checks = filterChecks(allChecks(), options.only);\n const results: CheckResult[] = [];\n\n const rootCheck = checks.find((c) => c.id === 'env.syntaur-root-exists');\n if (rootCheck) {\n const res = await safeRun(rootCheck, ctx);\n results.push(...res);\n const rootPassed = res.every((r) => r.status !== 'error');\n if (!rootPassed) {\n for (const c of checks) {\n if (c.id === rootCheck.id) continue;\n results.push(skipped(c, 'skipped: ~/.syntaur/ not initialized'));\n }\n return finalize(results);\n }\n }\n\n for (const check of checks) {\n if (check.id === 'env.syntaur-root-exists') continue;\n const res = await safeRun(check, ctx);\n results.push(...res);\n }\n\n return finalize(results);\n}\n\nfunction filterChecks(checks: Check[], only: string | undefined): Check[] {\n if (!only) return checks;\n return checks.filter((c) => c.id === only);\n}\n\nasync function safeRun(check: Check, ctx: CheckContext): Promise<CheckResult[]> {\n try {\n const res = await check.run(ctx);\n return Array.isArray(res) ? res : [res];\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n return [\n {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'error',\n detail: `check threw: ${detail}`,\n autoFixable: false,\n },\n ];\n }\n}\n\nfunction skipped(check: Check, reason: string): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'skipped',\n detail: reason,\n autoFixable: false,\n };\n}\n\nasync function finalize(checks: CheckResult[]): Promise<DoctorReport> {\n const summary = { pass: 0, warn: 0, error: 0, skipped: 0 };\n for (const c of checks) summary[c.status]++;\n const version = (await readVersion()) ?? '0.0.0';\n return {\n version: '1.0',\n syntaurVersion: version,\n ranAt: new Date().toISOString(),\n summary,\n checks,\n };\n}\n\nasync function readVersion(): Promise<string | null> {\n try {\n const here = fileURLToPath(import.meta.url);\n let dir = dirname(here);\n for (let i = 0; i < 6; i++) {\n try {\n const raw = await readFile(join(dir, 'package.json'), 'utf-8');\n const parsed = JSON.parse(raw) as { version?: unknown };\n return typeof parsed.version === 'string' ? parsed.version : null;\n } catch {\n dir = dirname(dir);\n }\n }\n return null;\n } catch {\n return null;\n }\n}\n","import Database from 'better-sqlite3';\nimport { resolve } from 'node:path';\nimport { readConfig } from '../config.js';\nimport { syntaurRoot } from '../paths.js';\nimport { fileExists } from '../fs.js';\nimport type { CheckContext } from './types.js';\n\nexport async function buildCheckContext(cwd: string = process.cwd()): Promise<CheckContext> {\n const config = await readConfig();\n const root = syntaurRoot();\n const dbPath = resolve(root, 'syntaur.db');\n\n let db: Database.Database | null = null;\n let dbError: string | null = null;\n\n if (await fileExists(dbPath)) {\n try {\n db = new Database(dbPath, { readonly: true, fileMustExist: true });\n } catch (err) {\n dbError = err instanceof Error ? err.message : String(err);\n db = null;\n }\n } else {\n dbError = `database file not found at ${dbPath}`;\n }\n\n return {\n config,\n syntaurRoot: root,\n db,\n dbError,\n cwd,\n now: new Date(),\n };\n}\n\nexport function closeCheckContext(ctx: CheckContext): void {\n if (ctx.db) {\n try {\n ctx.db.close();\n } catch {\n // ignore — read-only close errors are not actionable\n }\n }\n}\n","import { resolve, isAbsolute } from 'node:path';\nimport { readFile, stat } from 'node:fs/promises';\nimport { fileURLToPath } from 'node:url';\nimport { dirname, join } from 'node:path';\nimport { fileExists } from '../../fs.js';\nimport { expandHome } from '../../paths.js';\nimport type { Check, CheckResult } from '../types.js';\n\nconst CATEGORY = 'env';\n\nconst syntaurRootExists: Check = {\n id: 'env.syntaur-root-exists',\n category: CATEGORY,\n title: '~/.syntaur/ directory exists',\n async run(ctx) {\n try {\n const s = await stat(ctx.syntaurRoot);\n if (!s.isDirectory()) {\n return err(this, `${ctx.syntaurRoot} exists but is not a directory`, [\n ctx.syntaurRoot,\n ]);\n }\n return pass(this);\n } catch {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `${ctx.syntaurRoot} does not exist — run 'syntaur init'`,\n affected: [ctx.syntaurRoot],\n remediation: {\n kind: 'manual',\n suggestion: 'Run `syntaur init` to create the Syntaur directory',\n command: 'syntaur init',\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n },\n};\n\nconst configValid: Check = {\n id: 'env.config-valid',\n category: CATEGORY,\n title: '~/.syntaur/config.md is valid',\n async run(ctx) {\n const configPath = resolve(ctx.syntaurRoot, 'config.md');\n if (!(await fileExists(configPath))) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: 'config.md not found; defaults are in use',\n affected: [configPath],\n remediation: {\n kind: 'manual',\n suggestion: 'Run `syntaur init` to regenerate config.md',\n command: 'syntaur init',\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n const content = await readFile(configPath, 'utf-8');\n const fmMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!fmMatch || fmMatch[1].trim() === '') {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: 'config.md has missing or empty frontmatter — readConfig() silently fell back to defaults',\n affected: [configPath],\n remediation: {\n kind: 'manual',\n suggestion: 'Restore config.md from backup or re-run `syntaur init --force`',\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n const fmBlock = fmMatch[1];\n\n const rawProjectDir = readTopLevelField(fmBlock, 'defaultProjectDir');\n if (rawProjectDir === null) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: 'config.md frontmatter is missing required field `defaultProjectDir`',\n affected: [configPath],\n remediation: {\n kind: 'manual',\n suggestion: 'Add `defaultProjectDir: <absolute-path>` to the frontmatter or re-run `syntaur init --force`',\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n\n const expanded = expandHome(rawProjectDir);\n if (!isAbsolute(expanded)) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `config.md defaultProjectDir \"${rawProjectDir}\" is not an absolute path — readConfig() silently fell back to the default`,\n affected: [configPath],\n remediation: {\n kind: 'manual',\n suggestion: 'Set `defaultProjectDir` to an absolute path (or a `~/`-prefixed path)',\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n\n if (ctx.config.defaultProjectDir !== expanded) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `readConfig() returned defaultProjectDir=\"${ctx.config.defaultProjectDir}\" but config.md declares \"${rawProjectDir}\" — a silent fallback occurred`,\n affected: [configPath],\n remediation: {\n kind: 'manual',\n suggestion: 'Fix the raw value in config.md so it parses correctly',\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n\n const nestedMismatch = detectNestedParseMismatch(fmBlock, ctx.config);\n if (nestedMismatch) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `config.md has ${nestedMismatch.field} in raw frontmatter but readConfig() did not load it (parser silently dropped the nested section)`,\n affected: [configPath],\n remediation: {\n kind: 'manual',\n suggestion: `Check indentation under the parent key for ${nestedMismatch.parent}:`,\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n\n return pass(this);\n },\n};\n\ninterface NestedMismatch {\n field: string;\n parent: string;\n}\n\nfunction detectNestedParseMismatch(\n fmBlock: string,\n config: {\n integrations: { claudePluginDir: string | null; codexPluginDir: string | null; codexMarketplacePath: string | null };\n backup: { repo: string | null; categories: string; lastBackup: string | null; lastRestore: string | null } | null;\n },\n): NestedMismatch | null {\n const integrationChecks: Array<[string, string | null]> = [\n ['integrations.claudePluginDir', config.integrations.claudePluginDir],\n ['integrations.codexPluginDir', config.integrations.codexPluginDir],\n ['integrations.codexMarketplacePath', config.integrations.codexMarketplacePath],\n ];\n for (const [dotted, parsedValue] of integrationChecks) {\n const raw = readNestedField(fmBlock, dotted);\n if (raw !== null && raw !== 'null' && raw !== '' && parsedValue === null) {\n return { field: dotted, parent: 'integrations' };\n }\n }\n\n const backupFields: Array<[string, string | null]> = [\n ['backup.repo', config.backup?.repo ?? null],\n ['backup.lastBackup', config.backup?.lastBackup ?? null],\n ['backup.lastRestore', config.backup?.lastRestore ?? null],\n ];\n for (const [dotted, parsedValue] of backupFields) {\n const raw = readNestedField(fmBlock, dotted);\n if (raw !== null && raw !== 'null' && raw !== '' && parsedValue === null) {\n return { field: dotted, parent: 'backup' };\n }\n }\n\n const rawCategories = readNestedField(fmBlock, 'backup.categories');\n if (rawCategories !== null && rawCategories !== '' && config.backup?.categories) {\n const rawNormalized = rawCategories.split(',').map((s) => s.trim()).filter(Boolean).join(',');\n const parsedNormalized = config.backup.categories.split(',').map((s) => s.trim()).filter(Boolean).join(',');\n if (rawNormalized && rawNormalized !== parsedNormalized) {\n return { field: 'backup.categories', parent: 'backup' };\n }\n }\n\n return null;\n}\n\nfunction readNestedField(fmBlock: string, dotted: string): string | null {\n const [parent, key] = dotted.split('.', 2);\n if (!parent || !key) return null;\n const lines = fmBlock.split('\\n');\n const parentPrefix = `${parent}:`;\n let inParent = false;\n for (const line of lines) {\n if (!inParent) {\n if (line.startsWith(parentPrefix)) {\n inParent = true;\n }\n continue;\n }\n const trimmed = line.trimStart();\n const indent = line.length - trimmed.length;\n if (trimmed === '') continue;\n if (indent === 0) {\n // Next top-level key — parent block ended\n return null;\n }\n const stripped = trimmed.startsWith('- ') ? trimmed.slice(2).trimStart() : trimmed;\n const colonIdx = stripped.indexOf(':');\n if (colonIdx < 0) continue;\n const lineKey = stripped.slice(0, colonIdx).trim();\n if (lineKey !== key) continue;\n const raw = stripped.slice(colonIdx + 1).trim();\n if ((raw.startsWith('\"') && raw.endsWith('\"')) || (raw.startsWith(\"'\") && raw.endsWith(\"'\"))) {\n return raw.slice(1, -1);\n }\n return raw;\n }\n return null;\n}\n\nconst nodeVersion: Check = {\n id: 'env.node-version',\n category: CATEGORY,\n title: 'Node.js version meets minimum',\n async run() {\n const current = process.versions.node;\n const min = await readEngineMin();\n if (!min) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'skipped',\n detail: 'could not read engines.node from package.json',\n autoFixable: false,\n } satisfies CheckResult;\n }\n if (!versionGte(current, min)) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `Node ${current} is below required >=${min}`,\n remediation: {\n kind: 'manual',\n suggestion: `Upgrade Node to >=${min}`,\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this, `Node ${current} >= ${min}`);\n },\n};\n\nconst cliVersion: Check = {\n id: 'env.cli-version',\n category: CATEGORY,\n title: 'CLI version matches latest on npm',\n async run() {\n const local = await readLocalVersion();\n if (!local) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'skipped',\n detail: 'could not read local package.json version',\n autoFixable: false,\n } satisfies CheckResult;\n }\n const latest = await fetchLatestNpmVersion('syntaur', 2000);\n if (!latest) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'skipped',\n detail: 'could not reach npm registry (offline or timed out)',\n autoFixable: false,\n } satisfies CheckResult;\n }\n if (local === latest) {\n return pass(this, `syntaur ${local} is latest`);\n }\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'warn',\n detail: `installed syntaur ${local}, latest on npm is ${latest}`,\n remediation: {\n kind: 'manual',\n suggestion: 'Run `npm install -g syntaur@latest` to upgrade',\n command: 'npm install -g syntaur@latest',\n },\n autoFixable: false,\n } satisfies CheckResult;\n },\n};\n\nexport const envChecks: Check[] = [\n syntaurRootExists,\n configValid,\n nodeVersion,\n cliVersion,\n];\n\nfunction pass(check: { id: string; category: string; title: string }, detail?: string): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'pass',\n detail,\n autoFixable: false,\n };\n}\n\nfunction err(\n check: { id: string; category: string; title: string },\n detail: string,\n affected?: string[],\n): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'error',\n detail,\n affected,\n autoFixable: false,\n };\n}\n\nasync function readEngineMin(): Promise<string | null> {\n const raw = await readLocalPkg();\n if (!raw) return null;\n const engine = raw.engines?.node;\n if (typeof engine !== 'string') return null;\n const match = engine.match(/(\\d+(?:\\.\\d+){0,2})/);\n return match ? match[1] : null;\n}\n\nasync function readLocalVersion(): Promise<string | null> {\n const raw = await readLocalPkg();\n return typeof raw?.version === 'string' ? raw.version : null;\n}\n\ninterface LocalPkg {\n version?: unknown;\n engines?: { node?: string };\n}\n\nasync function readLocalPkg(): Promise<LocalPkg | null> {\n try {\n const here = fileURLToPath(import.meta.url);\n let dir = dirname(here);\n for (let i = 0; i < 6; i++) {\n const candidate = join(dir, 'package.json');\n try {\n const text = await readFile(candidate, 'utf-8');\n return JSON.parse(text) as LocalPkg;\n } catch {\n dir = dirname(dir);\n }\n }\n return null;\n } catch {\n return null;\n }\n}\n\nasync function fetchLatestNpmVersion(pkg: string, timeoutMs: number): Promise<string | null> {\n const controller = new AbortController();\n const t = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(`https://registry.npmjs.org/${pkg}/latest`, {\n signal: controller.signal,\n });\n if (!res.ok) return null;\n const body = (await res.json()) as { version?: unknown };\n return typeof body.version === 'string' ? body.version : null;\n } catch {\n return null;\n } finally {\n clearTimeout(t);\n }\n}\n\nfunction readTopLevelField(fmBlock: string, key: string): string | null {\n const match = fmBlock.match(new RegExp(`^${key}:\\\\s*(.*)$`, 'm'));\n if (!match) return null;\n const raw = match[1].trim();\n if (raw === '') return null;\n if ((raw.startsWith('\"') && raw.endsWith('\"')) || (raw.startsWith(\"'\") && raw.endsWith(\"'\"))) {\n return raw.slice(1, -1);\n }\n return raw;\n}\n\nfunction versionGte(a: string, b: string): boolean {\n const pa = a.split('.').map((n) => parseInt(n, 10) || 0);\n const pb = b.split('.').map((n) => parseInt(n, 10) || 0);\n const len = Math.max(pa.length, pb.length);\n for (let i = 0; i < len; i++) {\n const av = pa[i] ?? 0;\n const bv = pb[i] ?? 0;\n if (av > bv) return true;\n if (av < bv) return false;\n }\n return true;\n}\n","import { resolve } from 'node:path';\nimport { readdir, stat } from 'node:fs/promises';\nimport { fileExists } from '../../fs.js';\nimport type { Check, CheckResult } from '../types.js';\n\nconst CATEGORY = 'structure';\n\nconst KNOWN_TOP_LEVEL = new Set<string>([\n 'projects',\n 'playbooks',\n 'todos',\n 'servers',\n 'config.md',\n 'syntaur.db',\n 'syntaur.db-shm',\n 'syntaur.db-wal',\n 'dashboard-port',\n 'workspaces.json',\n]);\n\nconst projectsDir: Check = {\n id: 'structure.projects-dir',\n category: CATEGORY,\n title: 'projects/ directory exists',\n async run(ctx) {\n const p = resolve(ctx.syntaurRoot, 'projects');\n if (!(await fileExists(p))) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: 'projects/ missing under ~/.syntaur/',\n affected: [p],\n remediation: {\n kind: 'manual',\n suggestion: 'Run `syntaur init` to restore the standard layout',\n command: 'syntaur init',\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this);\n },\n};\n\nconst playbooksDir: Check = {\n id: 'structure.playbooks-dir',\n category: CATEGORY,\n title: 'playbooks/ directory exists',\n async run(ctx) {\n const p = resolve(ctx.syntaurRoot, 'playbooks');\n if (!(await fileExists(p))) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: 'playbooks/ missing under ~/.syntaur/',\n affected: [p],\n remediation: {\n kind: 'manual',\n suggestion: 'Run `syntaur init` to restore the standard layout',\n command: 'syntaur init',\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this);\n },\n};\n\nconst todosDirValid: Check = {\n id: 'structure.todos-dir-valid',\n category: CATEGORY,\n title: 'todos/ directory is readable (if present)',\n async run(ctx) {\n const p = resolve(ctx.syntaurRoot, 'todos');\n if (!(await fileExists(p))) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'skipped',\n detail: 'todos/ not present (created lazily on first use)',\n autoFixable: false,\n } satisfies CheckResult;\n }\n const s = await stat(p);\n if (!s.isDirectory()) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: 'todos/ exists but is not a directory',\n affected: [p],\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this);\n },\n};\n\nconst serversDirValid: Check = {\n id: 'structure.servers-dir-valid',\n category: CATEGORY,\n title: 'servers/ directory is readable (if present)',\n async run(ctx) {\n const p = resolve(ctx.syntaurRoot, 'servers');\n if (!(await fileExists(p))) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'skipped',\n detail: 'servers/ not present',\n autoFixable: false,\n } satisfies CheckResult;\n }\n const s = await stat(p);\n if (!s.isDirectory()) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: 'servers/ exists but is not a directory',\n affected: [p],\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this);\n },\n};\n\nconst knownFilesRecognized: Check = {\n id: 'structure.known-files-recognized',\n category: CATEGORY,\n title: 'No unexpected top-level entries under ~/.syntaur/',\n async run(ctx) {\n const entries = await readdir(ctx.syntaurRoot, { withFileTypes: true });\n const unexpected: string[] = [];\n for (const e of entries) {\n if (e.name.startsWith('.')) continue;\n if (KNOWN_TOP_LEVEL.has(e.name)) continue;\n unexpected.push(e.name);\n }\n if (unexpected.length === 0) return pass(this);\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'warn',\n detail: `unexpected top-level entries: ${unexpected.join(', ')}`,\n affected: unexpected.map((n) => resolve(ctx.syntaurRoot, n)),\n remediation: {\n kind: 'manual',\n suggestion: 'Review these entries — they may be leftover state from older versions',\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n },\n};\n\nexport const structureChecks: Check[] = [\n projectsDir,\n playbooksDir,\n todosDirValid,\n serversDirValid,\n knownFilesRecognized,\n];\n\nfunction pass(check: { id: string; category: string; title: string }): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'pass',\n autoFixable: false,\n };\n}\n","import { resolve } from 'node:path';\nimport { readdir, stat } from 'node:fs/promises';\nimport { fileExists } from '../../fs.js';\nimport type { Check, CheckResult } from '../types.js';\n\nconst CATEGORY = 'project';\n\nconst REQUIRED_PROJECT_FILES = [\n 'project.md',\n 'manifest.md',\n '_status.md',\n '_index-assignments.md',\n '_index-plans.md',\n '_index-decisions.md',\n 'resources/_index.md',\n 'memories/_index.md',\n] as const;\n\nconst KNOWN_PROJECT_TOP_LEVEL = new Set<string>([\n 'project.md',\n 'manifest.md',\n '_status.md',\n 'assignments',\n 'resources',\n 'memories',\n]);\n\nconst PROJECT_MARKERS = ['project.md', 'manifest.md', 'assignments'] as const;\n\nasync function listProjects(ctx: { config: { defaultProjectDir: string } }): Promise<string[]> {\n const dir = ctx.config.defaultProjectDir;\n if (!(await fileExists(dir))) return [];\n const entries = await readdir(dir, { withFileTypes: true });\n const result: string[] = [];\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n if (e.name.startsWith('.') || e.name.startsWith('_')) continue;\n const projectDir = resolve(dir, e.name);\n let looksLikeProject = false;\n for (const marker of PROJECT_MARKERS) {\n if (await fileExists(resolve(projectDir, marker))) {\n looksLikeProject = true;\n break;\n }\n }\n if (looksLikeProject) result.push(projectDir);\n }\n return result;\n}\n\nconst requiredFiles: Check = {\n id: 'project.required-files-present',\n category: CATEGORY,\n title: 'Each project has the full required scaffold',\n async run(ctx) {\n const projects = await listProjects(ctx);\n const results: CheckResult[] = [];\n for (const projectDir of projects) {\n const missing: string[] = [];\n for (const rel of REQUIRED_PROJECT_FILES) {\n const p = resolve(projectDir, rel);\n if (!(await fileExists(p))) missing.push(rel);\n }\n if (missing.length === 0) continue;\n results.push({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `project at ${projectDir} is missing: ${missing.join(', ')}`,\n affected: missing.map((m) => resolve(projectDir, m)),\n remediation: {\n kind: 'manual',\n suggestion: 'Recreate the missing scaffold files from templates',\n command: null,\n },\n autoFixable: false,\n });\n }\n if (results.length === 0) {\n return pass(this);\n }\n return results;\n },\n};\n\nconst manifestStale: Check = {\n id: 'project.manifest-stale',\n category: CATEGORY,\n title: 'manifest.md is not older than any assignment change',\n async run(ctx) {\n const projects = await listProjects(ctx);\n const results: CheckResult[] = [];\n for (const projectDir of projects) {\n const manifestPath = resolve(projectDir, 'manifest.md');\n if (!(await fileExists(manifestPath))) continue;\n const manifestMtime = (await stat(manifestPath)).mtimeMs;\n const newestAssignment = await newestAssignmentMtime(projectDir);\n if (newestAssignment === 0) continue;\n if (newestAssignment > manifestMtime) {\n results.push({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'warn',\n detail: `manifest.md in ${projectDir} is older than the newest assignment.md`,\n affected: [manifestPath],\n remediation: {\n kind: 'manual',\n suggestion: 'Rebuild the manifest (no CLI rebuild helper yet — edit manually or wait for v2)',\n command: null,\n },\n autoFixable: false,\n });\n }\n }\n if (results.length === 0) return pass(this);\n return results;\n },\n};\n\nconst orphanFiles: Check = {\n id: 'project.orphan-files',\n category: CATEGORY,\n title: 'No unexpected files at project top level',\n async run(ctx) {\n const projects = await listProjects(ctx);\n const results: CheckResult[] = [];\n for (const projectDir of projects) {\n const entries = await readdir(projectDir, { withFileTypes: true });\n const orphans: string[] = [];\n for (const e of entries) {\n if (e.name.startsWith('.')) continue;\n if (KNOWN_PROJECT_TOP_LEVEL.has(e.name)) continue;\n if (e.name.startsWith('_index-') && e.name.endsWith('.md')) continue;\n orphans.push(e.name);\n }\n if (orphans.length === 0) continue;\n results.push({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'warn',\n detail: `project at ${projectDir} has unexpected entries: ${orphans.join(', ')}`,\n affected: orphans.map((o) => resolve(projectDir, o)),\n autoFixable: false,\n });\n }\n if (results.length === 0) return pass(this);\n return results;\n },\n};\n\nexport const projectChecks: Check[] = [requiredFiles, manifestStale, orphanFiles];\n\nasync function newestAssignmentMtime(projectDir: string): Promise<number> {\n const assignmentsRoot = resolve(projectDir, 'assignments');\n if (!(await fileExists(assignmentsRoot))) return 0;\n let newest = 0;\n let entries;\n try {\n entries = await readdir(assignmentsRoot, { withFileTypes: true });\n } catch {\n return 0;\n }\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n const assignmentMd = resolve(assignmentsRoot, e.name, 'assignment.md');\n try {\n const s = await stat(assignmentMd);\n if (s.mtimeMs > newest) newest = s.mtimeMs;\n } catch {\n // no assignment.md — skip (orphan check covers that)\n }\n }\n return newest;\n}\n\nfunction pass(check: { id: string; category: string; title: string }): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'pass',\n autoFixable: false,\n };\n}\n","import { resolve } from 'node:path';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { fileExists } from '../../fs.js';\nimport { parseAssignmentFull } from '../../../dashboard/parser.js';\nimport { DEFAULT_STATUSES, DEFAULT_TERMINAL_STATUSES } from '../../../lifecycle/types.js';\nimport { DEFAULT_ASSIGNMENT_TYPES } from '../../config.js';\nimport { assignmentsDir as getStandaloneDir } from '../../paths.js';\nimport type { CheckContext, Check, CheckResult } from '../types.js';\n\nconst CATEGORY = 'assignment';\n\nconst STATUSES_REQUIRING_HANDOFF = new Set(['review', 'completed']);\n\ninterface AssignmentEntry {\n projectDir: string;\n /** `null` for standalone assignments (no containing project). */\n projectSlug: string | null;\n assignmentDir: string;\n /** For standalone, this is the UUID folder name. */\n assignmentSlug: string;\n standalone: boolean;\n}\n\nasync function listAssignments(ctx: CheckContext): Promise<{\n withAssignmentMd: AssignmentEntry[];\n orphanFolders: AssignmentEntry[];\n}> {\n const result = { withAssignmentMd: [] as AssignmentEntry[], orphanFolders: [] as AssignmentEntry[] };\n const projectsDir = ctx.config.defaultProjectDir;\n if (await fileExists(projectsDir)) {\n const projects = await readdir(projectsDir, { withFileTypes: true });\n for (const m of projects) {\n if (!m.isDirectory()) continue;\n if (m.name.startsWith('.') || m.name.startsWith('_')) continue;\n const assignmentsDir = resolve(projectsDir, m.name, 'assignments');\n if (!(await fileExists(assignmentsDir))) continue;\n\n const entries = await readdir(assignmentsDir, { withFileTypes: true });\n for (const a of entries) {\n if (!a.isDirectory()) continue;\n if (a.name.startsWith('.') || a.name.startsWith('_')) continue;\n const assignmentDir = resolve(assignmentsDir, a.name);\n const assignmentMd = resolve(assignmentDir, 'assignment.md');\n const entry: AssignmentEntry = {\n projectDir: resolve(projectsDir, m.name),\n projectSlug: m.name,\n assignmentDir,\n assignmentSlug: a.name,\n standalone: false,\n };\n if (await fileExists(assignmentMd)) {\n result.withAssignmentMd.push(entry);\n } else {\n result.orphanFolders.push(entry);\n }\n }\n }\n }\n\n // Walk standalone assignments at ~/.syntaur/assignments/\n const standaloneRoot = getStandaloneDir();\n if (await fileExists(standaloneRoot)) {\n const entries = await readdir(standaloneRoot, { withFileTypes: true });\n for (const a of entries) {\n if (!a.isDirectory()) continue;\n if (a.name.startsWith('.') || a.name.startsWith('_')) continue;\n const assignmentDir = resolve(standaloneRoot, a.name);\n const assignmentMd = resolve(assignmentDir, 'assignment.md');\n const entry: AssignmentEntry = {\n projectDir: standaloneRoot,\n projectSlug: null,\n assignmentDir,\n assignmentSlug: a.name,\n standalone: true,\n };\n if (await fileExists(assignmentMd)) {\n result.withAssignmentMd.push(entry);\n } else {\n result.orphanFolders.push(entry);\n }\n }\n }\n\n return result;\n}\n\nfunction configuredStatuses(ctx: CheckContext): Set<string> {\n const custom = ctx.config.statuses?.statuses?.map((s) => s.id) ?? [];\n if (custom.length > 0) return new Set(custom);\n return new Set(DEFAULT_STATUSES);\n}\n\nfunction terminalStatuses(ctx: CheckContext): Set<string> {\n const custom = ctx.config.statuses?.statuses?.filter((s) => s.terminal).map((s) => s.id) ?? [];\n if (custom.length > 0) return new Set(custom);\n return new Set(DEFAULT_TERMINAL_STATUSES);\n}\n\nconst requiredFiles: Check = {\n id: 'assignment.required-files',\n category: CATEGORY,\n title: 'Each assignment folder has an assignment.md',\n async run(ctx) {\n const { withAssignmentMd } = await listAssignments(ctx);\n if (withAssignmentMd.length === 0) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'skipped',\n detail: 'no assignments found',\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this, `${withAssignmentMd.length} assignment.md files present`);\n },\n};\n\nconst orphanedFolder: Check = {\n id: 'assignment.orphaned-folder',\n category: CATEGORY,\n title: 'No assignment folders without assignment.md',\n async run(ctx) {\n const { orphanFolders } = await listAssignments(ctx);\n if (orphanFolders.length === 0) return pass(this);\n return orphanFolders.map((o) => ({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error' as const,\n detail: `folder ${o.assignmentDir} has no assignment.md`,\n affected: [o.assignmentDir],\n remediation: {\n kind: 'manual' as const,\n suggestion: 'Either create an assignment.md inside the folder or delete it',\n command: null,\n },\n autoFixable: false,\n }));\n },\n};\n\nconst invalidStatus: Check = {\n id: 'assignment.invalid-status',\n category: CATEGORY,\n title: 'Assignment statuses are valid',\n async run(ctx) {\n const { withAssignmentMd } = await listAssignments(ctx);\n const allowed = configuredStatuses(ctx);\n const results: CheckResult[] = [];\n for (const a of withAssignmentMd) {\n const path = resolve(a.assignmentDir, 'assignment.md');\n const parsed = await parseSafe(path);\n if (!parsed) continue;\n if (!allowed.has(parsed.status)) {\n results.push({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `${a.projectSlug}/${a.assignmentSlug}: status \"${parsed.status}\" is not in configured statuses (${[...allowed].join(', ')})`,\n affected: [path],\n remediation: {\n kind: 'manual',\n suggestion: 'Update the assignment status to a valid value',\n command: null,\n },\n autoFixable: false,\n });\n }\n }\n if (results.length === 0) return pass(this);\n return results;\n },\n};\n\nconst workspaceMissing: Check = {\n id: 'assignment.workspace-missing',\n category: CATEGORY,\n title: 'Non-terminal assignments have workspace fields set',\n async run(ctx) {\n const { withAssignmentMd } = await listAssignments(ctx);\n const terminal = terminalStatuses(ctx);\n const results: CheckResult[] = [];\n for (const a of withAssignmentMd) {\n const path = resolve(a.assignmentDir, 'assignment.md');\n const parsed = await parseSafe(path);\n if (!parsed) continue;\n if (terminal.has(parsed.status)) continue;\n if (parsed.status === 'pending') continue; // workspace not yet expected\n const { repository, worktreePath } = parsed.workspace;\n if (repository === null && worktreePath === null) {\n results.push({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `${a.projectSlug}/${a.assignmentSlug} (status: ${parsed.status}) has no workspace.repository or workspace.worktreePath set — the PreToolUse hook will block implementation work`,\n affected: [path],\n remediation: {\n kind: 'manual',\n suggestion: 'Set workspace.repository and workspace.worktreePath in the assignment frontmatter before continuing implementation',\n command: null,\n },\n autoFixable: false,\n });\n }\n }\n if (results.length === 0) return pass(this);\n return results;\n },\n};\n\nconst requiredFilesByStatus: Check = {\n id: 'assignment.required-files-by-status',\n category: CATEGORY,\n title: 'Handoff file matches assignment status',\n async run(ctx) {\n const allowed = configuredStatuses(ctx);\n const defaultsCovered = Array.from(DEFAULT_STATUSES).every((s) => allowed.has(s));\n if (!defaultsCovered) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'skipped',\n detail: 'custom StatusConfig does not include default statuses; file-by-status mapping not applicable',\n autoFixable: false,\n } satisfies CheckResult;\n }\n const { withAssignmentMd } = await listAssignments(ctx);\n const results: CheckResult[] = [];\n for (const a of withAssignmentMd) {\n const assignmentPath = resolve(a.assignmentDir, 'assignment.md');\n const parsed = await parseSafe(assignmentPath);\n if (!parsed) continue;\n const missing: string[] = [];\n if (STATUSES_REQUIRING_HANDOFF.has(parsed.status)) {\n const handoffPath = resolve(a.assignmentDir, 'handoff.md');\n if (!(await fileExists(handoffPath))) missing.push('handoff.md');\n }\n if (missing.length === 0) continue;\n results.push({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'warn',\n detail: `${a.projectSlug}/${a.assignmentSlug} (status: ${parsed.status}) is missing ${missing.join(', ')}`,\n affected: missing.map((m) => resolve(a.assignmentDir, m)),\n remediation: {\n kind: 'manual',\n suggestion: `Create the missing ${missing.join(' and ')} files for this assignment`,\n command: null,\n },\n autoFixable: false,\n });\n }\n if (results.length === 0) return pass(this);\n return results;\n },\n};\n\nconst companionFilesScaffolded: Check = {\n id: 'assignment.companion-files',\n category: CATEGORY,\n title: 'progress.md and comments.md scaffolded (v2.0)',\n async run(ctx) {\n const { withAssignmentMd } = await listAssignments(ctx);\n const results: CheckResult[] = [];\n for (const a of withAssignmentMd) {\n const missing: string[] = [];\n for (const filename of ['progress.md', 'comments.md']) {\n if (!(await fileExists(resolve(a.assignmentDir, filename)))) {\n missing.push(filename);\n }\n }\n if (missing.length === 0) continue;\n const label = a.standalone ? `standalone/${a.assignmentSlug}` : `${a.projectSlug}/${a.assignmentSlug}`;\n results.push({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'warn',\n detail: `${label} is missing ${missing.join(' and ')} (pre-v2.0 assignment — not required, but scaffolding them keeps the dashboard and CLIs consistent)`,\n affected: missing.map((m) => resolve(a.assignmentDir, m)),\n remediation: {\n kind: 'manual',\n suggestion: `Create ${missing.join(' and ')} with the renderProgress/renderComments templates, or re-scaffold via the CLI`,\n command: null,\n },\n autoFixable: false,\n });\n }\n if (results.length === 0) return pass(this);\n return results;\n },\n};\n\nconst typeDefinition: Check = {\n id: 'assignment.type-definition',\n category: CATEGORY,\n title: 'Assignment `type` is in config.types.definitions',\n async run(ctx) {\n const typesConfig = ctx.config.types;\n if (!typesConfig) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'skipped',\n detail: 'config.types is not set; applying defaults — skipping strict validation',\n autoFixable: false,\n } satisfies CheckResult;\n }\n const allowed = new Set(typesConfig.definitions.map((d) => d.id));\n const { withAssignmentMd } = await listAssignments(ctx);\n const results: CheckResult[] = [];\n for (const a of withAssignmentMd) {\n const path = resolve(a.assignmentDir, 'assignment.md');\n const parsed = await parseSafe(path);\n if (!parsed) continue;\n if (!parsed.type) continue; // optional field\n if (!allowed.has(parsed.type)) {\n const label = a.standalone ? `standalone/${a.assignmentSlug}` : `${a.projectSlug}/${a.assignmentSlug}`;\n results.push({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'warn',\n detail: `${label}: type \"${parsed.type}\" is not in config.types.definitions (${[...allowed].join(', ')})`,\n affected: [path],\n remediation: {\n kind: 'manual',\n suggestion: `Either add \"${parsed.type}\" to config.types.definitions or change the assignment's type to one of the configured values`,\n command: null,\n },\n autoFixable: false,\n });\n }\n }\n if (results.length === 0) return pass(this);\n return results;\n },\n};\n\nconst projectFrontmatterMatchesContainer: Check = {\n id: 'assignment.project-matches-container',\n category: CATEGORY,\n title: '`project` frontmatter matches containing project slug (or null for standalone)',\n async run(ctx) {\n const { withAssignmentMd } = await listAssignments(ctx);\n const results: CheckResult[] = [];\n for (const a of withAssignmentMd) {\n const path = resolve(a.assignmentDir, 'assignment.md');\n const parsed = await parseSafe(path);\n if (!parsed) continue;\n if (a.standalone) {\n if (parsed.project !== null) {\n results.push({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `standalone/${a.assignmentSlug}: frontmatter declares project \"${parsed.project}\" but the folder is under ~/.syntaur/assignments/ (project must be null)`,\n affected: [path],\n remediation: {\n kind: 'manual',\n suggestion: 'Set `project: null` in the frontmatter, or move the folder into a project.',\n command: null,\n },\n autoFixable: false,\n });\n }\n } else {\n if (parsed.project !== a.projectSlug) {\n results.push({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `${a.projectSlug}/${a.assignmentSlug}: frontmatter declares project \"${parsed.project ?? 'null'}\" but the folder is inside project \"${a.projectSlug}\"`,\n affected: [path],\n remediation: {\n kind: 'manual',\n suggestion: `Set \\`project: ${a.projectSlug}\\` in the frontmatter.`,\n command: null,\n },\n autoFixable: false,\n });\n }\n }\n }\n if (results.length === 0) return pass(this);\n return results;\n },\n};\n\nexport const assignmentChecks: Check[] = [\n requiredFiles,\n orphanedFolder,\n invalidStatus,\n workspaceMissing,\n requiredFilesByStatus,\n companionFilesScaffolded,\n typeDefinition,\n projectFrontmatterMatchesContainer,\n];\n\nasync function parseSafe(path: string): Promise<ReturnType<typeof parseAssignmentFull> | null> {\n try {\n const content = await readFile(path, 'utf-8');\n return parseAssignmentFull(content);\n } catch {\n return null;\n }\n}\n\nfunction pass(check: { id: string; category: string; title: string }, detail?: string): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'pass',\n detail,\n autoFixable: false,\n };\n}\n","import { resolve } from 'node:path';\nimport { fileExists } from '../../fs.js';\nimport type { Check, CheckResult } from '../types.js';\n\nconst CATEGORY = 'dashboard';\n\nconst dbReachable: Check = {\n id: 'dashboard.db-reachable',\n category: CATEGORY,\n title: 'syntaur.db is readable and has expected schema',\n async run(ctx) {\n if (!ctx.db) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `could not open syntaur.db: ${ctx.dbError ?? 'unknown error'}`,\n affected: [resolve(ctx.syntaurRoot, 'syntaur.db')],\n remediation: {\n kind: 'manual',\n suggestion: 'Start the dashboard once (`syntaur dashboard`) to initialize the DB, or restore it from backup',\n command: 'syntaur dashboard',\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n try {\n const row = ctx.db\n .prepare(\"SELECT name FROM sqlite_master WHERE type='table' AND name='sessions'\")\n .get();\n if (!row) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: 'syntaur.db is missing the expected \"sessions\" table',\n affected: [resolve(ctx.syntaurRoot, 'syntaur.db')],\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this);\n } catch (err) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `syntaur.db query failed: ${err instanceof Error ? err.message : String(err)}`,\n affected: [resolve(ctx.syntaurRoot, 'syntaur.db')],\n autoFixable: false,\n } satisfies CheckResult;\n }\n },\n};\n\nconst ghostSessions: Check = {\n id: 'dashboard.ghost-sessions',\n category: CATEGORY,\n title: 'Session records reference assignments that still exist on disk',\n async run(ctx) {\n if (!ctx.db) {\n return skipped(this, 'skipped: db not reachable');\n }\n let rows: Array<{ session_id: string; project_slug: string | null; assignment_slug: string | null }>;\n try {\n rows = ctx.db\n .prepare(\n 'SELECT session_id, project_slug, assignment_slug FROM sessions WHERE project_slug IS NOT NULL',\n )\n .all() as typeof rows;\n } catch {\n return skipped(this, 'skipped: sessions table unreadable');\n }\n\n const projectsDir = ctx.config.defaultProjectDir;\n const results: CheckResult[] = [];\n for (const row of rows) {\n if (!row.project_slug) continue;\n const projectPath = resolve(projectsDir, row.project_slug, 'project.md');\n if (!(await fileExists(projectPath))) {\n results.push({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'warn',\n detail: `session ${row.session_id} references missing project \"${row.project_slug}\"`,\n affected: [projectPath],\n remediation: {\n kind: 'manual',\n suggestion: 'Remove the session row or restore the project',\n command: null,\n },\n autoFixable: false,\n });\n continue;\n }\n if (row.assignment_slug) {\n const assignmentPath = resolve(\n projectsDir,\n row.project_slug,\n 'assignments',\n row.assignment_slug,\n 'assignment.md',\n );\n if (!(await fileExists(assignmentPath))) {\n results.push({\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'warn',\n detail: `session ${row.session_id} references missing assignment \"${row.project_slug}/${row.assignment_slug}\"`,\n affected: [assignmentPath],\n remediation: {\n kind: 'manual',\n suggestion: 'Remove the session row or restore the assignment folder',\n command: null,\n },\n autoFixable: false,\n });\n }\n }\n }\n if (results.length === 0) return pass(this);\n return results;\n },\n};\n\nexport const dashboardChecks: Check[] = [dbReachable, ghostSessions];\n\nfunction pass(check: { id: string; category: string; title: string }): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'pass',\n autoFixable: false,\n };\n}\n\nfunction skipped(check: { id: string; category: string; title: string }, reason: string): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'skipped',\n detail: reason,\n autoFixable: false,\n };\n}\n\n","import { resolve } from 'node:path';\nimport { readdir } from 'node:fs/promises';\nimport { fileExists } from '../../fs.js';\nimport type { Check, CheckResult } from '../types.js';\n\nconst CATEGORY = 'integrations';\n\nconst claudePluginLinked: Check = {\n id: 'integrations.claude-plugin-linked',\n category: CATEGORY,\n title: 'Configured Claude plugin directory exists',\n async run(ctx) {\n const dir = ctx.config.integrations.claudePluginDir;\n if (!dir) return skipped(this, 'claudePluginDir not configured');\n if (!(await fileExists(dir))) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `claudePluginDir points to ${dir} but that directory does not exist`,\n affected: [dir],\n remediation: {\n kind: 'manual',\n suggestion: 'Reinstall the Claude plugin or update the path in ~/.syntaur/config.md',\n command: 'syntaur install-plugin',\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this);\n },\n};\n\nconst codexPluginLinked: Check = {\n id: 'integrations.codex-plugin-linked',\n category: CATEGORY,\n title: 'Configured Codex plugin directory exists',\n async run(ctx) {\n const dir = ctx.config.integrations.codexPluginDir;\n if (!dir) return skipped(this, 'codexPluginDir not configured');\n if (!(await fileExists(dir))) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `codexPluginDir points to ${dir} but that directory does not exist`,\n affected: [dir],\n remediation: {\n kind: 'manual',\n suggestion: 'Reinstall the Codex plugin or update the path in ~/.syntaur/config.md',\n command: 'syntaur install-codex-plugin',\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this);\n },\n};\n\nconst backupConfigured: Check = {\n id: 'integrations.backup-configured',\n category: CATEGORY,\n title: 'GitHub backup is configured (if user has projects)',\n async run(ctx) {\n if (ctx.config.backup?.repo) return pass(this);\n const projectsDir = ctx.config.defaultProjectDir;\n if (!(await fileExists(projectsDir))) return skipped(this, 'no projects dir');\n const entries = await readdir(projectsDir, { withFileTypes: true });\n const hasProjects = entries.some((e) => e.isDirectory() && !e.name.startsWith('.') && !e.name.startsWith('_'));\n if (!hasProjects) return skipped(this, 'no projects yet');\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'warn',\n detail: 'you have projects but no GitHub backup repo configured',\n remediation: {\n kind: 'manual',\n suggestion: 'Run `syntaur backup config --repo <url>` to configure',\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n },\n};\n\nexport const integrationChecks: Check[] = [claudePluginLinked, codexPluginLinked, backupConfigured];\n\nfunction pass(check: { id: string; category: string; title: string }): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'pass',\n autoFixable: false,\n };\n}\n\nfunction skipped(check: { id: string; category: string; title: string }, reason: string): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'skipped',\n detail: reason,\n autoFixable: false,\n };\n}\n","import { resolve } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport { fileExists } from '../../fs.js';\nimport { parseAssignmentFull } from '../../../dashboard/parser.js';\nimport { DEFAULT_TERMINAL_STATUSES } from '../../../lifecycle/types.js';\nimport type { CheckContext, Check, CheckResult } from '../types.js';\n\nconst CATEGORY = 'workspace';\n\ninterface ContextFile {\n sessionId?: string;\n projectSlug?: string;\n assignmentSlug?: string;\n projectDir?: string;\n assignmentDir?: string;\n workspaceRoot?: string;\n}\n\nconst ASSIGNMENT_FIELDS = ['projectSlug', 'assignmentSlug', 'projectDir', 'assignmentDir'] as const;\n\nfunction hasAnyAssignmentField(ctx: ContextFile | null): boolean {\n if (!ctx) return false;\n return ASSIGNMENT_FIELDS.some((k) => typeof ctx[k] === 'string' && ctx[k]!.length > 0);\n}\n\nfunction isStandaloneSession(ctx: ContextFile | null): boolean {\n if (!ctx) return false;\n return !hasAnyAssignmentField(ctx) && typeof ctx.sessionId === 'string' && ctx.sessionId.length > 0;\n}\n\nasync function loadContext(ctx: CheckContext): Promise<{\n data: ContextFile | null;\n path: string;\n exists: boolean;\n parseError: string | null;\n}> {\n const path = resolve(ctx.cwd, '.syntaur', 'context.json');\n if (!(await fileExists(path))) {\n return { data: null, path, exists: false, parseError: null };\n }\n try {\n const raw = await readFile(path, 'utf-8');\n return { data: JSON.parse(raw) as ContextFile, path, exists: true, parseError: null };\n } catch (err) {\n return {\n data: null,\n path,\n exists: true,\n parseError: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nconst contextValid: Check = {\n id: 'workspace.context-valid',\n category: CATEGORY,\n title: '.syntaur/context.json parses and has required fields',\n async run(ctx) {\n const { data, path, exists, parseError } = await loadContext(ctx);\n if (!exists) return skipped(this, 'no .syntaur/context.json in cwd');\n if (parseError) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `.syntaur/context.json is not valid JSON: ${parseError}`,\n affected: [path],\n remediation: {\n kind: 'manual',\n suggestion: 'Fix or regenerate the context file by re-grabbing the assignment',\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n if (isStandaloneSession(data)) {\n return pass(this, 'standalone session context (sessionId only)');\n }\n if (!hasAnyAssignmentField(data)) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: '.syntaur/context.json has no sessionId and no assignment fields',\n affected: [path],\n autoFixable: false,\n } satisfies CheckResult;\n }\n const missing: string[] = [];\n for (const key of ['projectSlug', 'assignmentSlug', 'assignmentDir'] as const) {\n if (!data?.[key]) missing.push(key);\n }\n if (missing.length > 0) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `.syntaur/context.json has partial assignment fields but is missing: ${missing.join(', ')}`,\n affected: [path],\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this);\n },\n};\n\nconst contextAssignmentResolves: Check = {\n id: 'workspace.context-assignment-resolves',\n category: CATEGORY,\n title: 'Context references an assignment that exists on disk',\n async run(ctx) {\n const { data, path, exists } = await loadContext(ctx);\n if (!exists) return skipped(this, 'no context to resolve');\n if (isStandaloneSession(data)) return skipped(this, 'standalone session context — no assignment to resolve');\n if (!data?.assignmentDir) return skipped(this, 'context has no assignmentDir');\n const assignmentMd = resolve(data.assignmentDir, 'assignment.md');\n if (!(await fileExists(assignmentMd))) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'error',\n detail: `context points to ${data.assignmentDir} but assignment.md is missing`,\n affected: [assignmentMd, path],\n remediation: {\n kind: 'manual',\n suggestion: 'Remove the stale .syntaur/context.json or restore the assignment',\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this);\n },\n};\n\nconst contextTerminal: Check = {\n id: 'workspace.context-terminal',\n category: CATEGORY,\n title: 'Context assignment is not in a terminal status',\n async run(ctx) {\n const { data, exists } = await loadContext(ctx);\n if (!exists) return skipped(this, 'no context to check');\n if (isStandaloneSession(data)) return skipped(this, 'standalone session context — no assignment to check');\n if (!data?.assignmentDir) return skipped(this, 'context has no assignmentDir');\n const assignmentMd = resolve(data.assignmentDir, 'assignment.md');\n if (!(await fileExists(assignmentMd))) return skipped(this, 'assignment file missing');\n try {\n const content = await readFile(assignmentMd, 'utf-8');\n const parsed = parseAssignmentFull(content);\n const terminal = terminalStatuses(ctx);\n if (terminal.has(parsed.status)) {\n return {\n id: this.id,\n category: this.category,\n title: this.title,\n status: 'warn',\n detail: `context references assignment with terminal status \"${parsed.status}\"`,\n affected: [assignmentMd],\n remediation: {\n kind: 'manual',\n suggestion: 'Grab a new assignment or remove the stale .syntaur/context.json',\n command: null,\n },\n autoFixable: false,\n } satisfies CheckResult;\n }\n return pass(this);\n } catch {\n return skipped(this, 'could not parse assignment.md');\n }\n },\n};\n\nfunction terminalStatuses(ctx: CheckContext): Set<string> {\n const custom = ctx.config.statuses?.statuses?.filter((s) => s.terminal).map((s) => s.id) ?? [];\n if (custom.length > 0) return new Set(custom);\n return new Set(DEFAULT_TERMINAL_STATUSES);\n}\n\nexport const workspaceChecks: Check[] = [contextValid, contextAssignmentResolves, contextTerminal];\n\nfunction pass(check: { id: string; category: string; title: string }, detail?: string): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'pass',\n detail,\n autoFixable: false,\n };\n}\n\nfunction skipped(check: { id: string; category: string; title: string }, reason: string): CheckResult {\n return {\n id: check.id,\n category: check.category,\n title: check.title,\n status: 'skipped',\n detail: reason,\n autoFixable: false,\n };\n}\n","import type { Check } from './types.js';\nimport { envChecks } from './checks/env.js';\nimport { structureChecks } from './checks/structure.js';\nimport { projectChecks } from './checks/project.js';\nimport { assignmentChecks } from './checks/assignment.js';\nimport { dashboardChecks } from './checks/dashboard.js';\nimport { integrationChecks } from './checks/integrations.js';\nimport { workspaceChecks } from './checks/workspace.js';\n\nexport function allChecks(): Check[] {\n return [\n ...envChecks,\n ...structureChecks,\n ...projectChecks,\n ...assignmentChecks,\n ...dashboardChecks,\n ...integrationChecks,\n ...workspaceChecks,\n ];\n}\n","import type { CheckResult, DoctorReport } from './types.js';\n\nconst USE_COLOR = process.stdout.isTTY && process.env.NO_COLOR === undefined;\n\nconst COLOR = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n red: '\\x1b[31m',\n gray: '\\x1b[90m',\n cyan: '\\x1b[36m',\n};\n\nfunction c(code: string, text: string): string {\n return USE_COLOR ? `${code}${text}${COLOR.reset}` : text;\n}\n\nconst STATUS_BADGE: Record<CheckResult['status'], string> = {\n pass: c(COLOR.green, 'PASS '),\n warn: c(COLOR.yellow, 'WARN '),\n error: c(COLOR.red, 'ERROR'),\n skipped: c(COLOR.gray, 'SKIP '),\n};\n\nexport interface HumanRenderOptions {\n verbose: boolean;\n}\n\nexport function renderHuman(report: DoctorReport, options: HumanRenderOptions = { verbose: false }): string {\n const lines: string[] = [];\n lines.push(\n c(COLOR.bold, 'syntaur doctor') +\n c(COLOR.dim, ` (syntaur ${report.syntaurVersion}, ran ${report.ranAt})`),\n );\n lines.push('');\n\n const byCategory = new Map<string, CheckResult[]>();\n for (const check of report.checks) {\n const list = byCategory.get(check.category) ?? [];\n list.push(check);\n byCategory.set(check.category, list);\n }\n\n for (const [category, checks] of byCategory) {\n const visible = options.verbose ? checks : checks.filter((c) => c.status !== 'pass');\n if (visible.length === 0) {\n lines.push(c(COLOR.dim, `[${category}] all passed`));\n continue;\n }\n lines.push(c(COLOR.bold, `[${category}]`));\n for (const check of visible) {\n lines.push(` ${STATUS_BADGE[check.status]} ${c(COLOR.cyan, check.id)} ${check.title}`);\n if (check.detail) lines.push(` ${c(COLOR.dim, check.detail)}`);\n if (check.affected && check.affected.length > 0) {\n for (const path of check.affected.slice(0, 3)) {\n lines.push(` ${c(COLOR.gray, '→ ' + path)}`);\n }\n if (check.affected.length > 3) {\n lines.push(` ${c(COLOR.gray, ` …and ${check.affected.length - 3} more`)}`);\n }\n }\n if (check.remediation && check.remediation.suggestion) {\n lines.push(` ${c(COLOR.dim, 'fix: ' + check.remediation.suggestion)}`);\n if (check.remediation.command) {\n lines.push(` ${c(COLOR.cyan, '$ ' + check.remediation.command)}`);\n }\n }\n }\n lines.push('');\n }\n\n const s = report.summary;\n lines.push(\n c(COLOR.bold, 'summary: ') +\n `${c(COLOR.green, s.pass + ' passed')}, ` +\n `${c(COLOR.yellow, s.warn + ' warnings')}, ` +\n `${c(COLOR.red, s.error + ' errors')}, ` +\n `${c(COLOR.gray, s.skipped + ' skipped')}`,\n );\n return lines.join('\\n');\n}\n","import type { DoctorReport } from './types.js';\n\nexport function renderJson(report: DoctorReport): string {\n return JSON.stringify(report, null, 2);\n}\n","import { resolve } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport { expandHome, assignmentsDir as assignmentsDirFn } from '../utils/paths.js';\nimport { fileExists, writeFileForce } from '../utils/fs.js';\nimport { readConfig } from '../utils/config.js';\nimport { isValidSlug } from '../utils/slug.js';\nimport { generateId } from '../utils/uuid.js';\nimport { nowTimestamp } from '../utils/timestamp.js';\nimport { resolveAssignmentById } from '../utils/assignment-resolver.js';\nimport { renderComments, formatCommentEntry, type Comment, type CommentType } from '../templates/index.js';\n\nexport interface CommentOptions {\n project?: string;\n dir?: string;\n replyTo?: string;\n type?: CommentType;\n author?: string;\n}\n\nfunction shortId(): string {\n return generateId().split('-')[0];\n}\n\nfunction setTopLevelField(content: string, key: string, value: string | number): string {\n const fieldRegex = new RegExp(`^(${key}:)\\\\s*.*$`, 'm');\n if (fieldRegex.test(content)) {\n return content.replace(fieldRegex, `$1 ${value}`);\n }\n return content;\n}\n\nexport async function commentCommand(\n target: string,\n text: string,\n options: CommentOptions = {},\n): Promise<void> {\n if (!text || !text.trim()) {\n throw new Error('Comment text cannot be empty.');\n }\n\n const type: CommentType = options.type ?? 'note';\n if (!['question', 'note', 'feedback'].includes(type)) {\n throw new Error(`Invalid comment type \"${type}\". Must be one of: question, note, feedback.`);\n }\n\n const config = await readConfig();\n const baseDir = options.dir ? expandHome(options.dir) : config.defaultProjectDir;\n\n let assignmentDir: string;\n let assignmentRef: string;\n if (options.project) {\n if (!isValidSlug(options.project)) {\n throw new Error(`Invalid project slug \"${options.project}\".`);\n }\n if (!isValidSlug(target)) {\n throw new Error(`Invalid assignment slug \"${target}\".`);\n }\n assignmentDir = resolve(baseDir, options.project, 'assignments', target);\n assignmentRef = target;\n } else {\n const resolved = await resolveAssignmentById(baseDir, assignmentsDirFn(), target);\n if (!resolved) {\n throw new Error(`Assignment \"${target}\" not found. Provide --project <slug> or a valid standalone UUID.`);\n }\n assignmentDir = resolved.assignmentDir;\n assignmentRef = resolved.standalone ? resolved.id : resolved.assignmentSlug;\n }\n\n const commentsPath = resolve(assignmentDir, 'comments.md');\n const timestamp = nowTimestamp();\n const author = options.author ?? process.env.USER ?? 'unknown';\n\n let currentContent: string;\n let currentCount = 0;\n if (await fileExists(commentsPath)) {\n currentContent = await readFile(commentsPath, 'utf-8');\n const countMatch = currentContent.match(/^entryCount:\\s*(\\d+)/m);\n if (countMatch) currentCount = parseInt(countMatch[1], 10);\n } else {\n currentContent = renderComments({ assignment: assignmentRef, timestamp });\n }\n\n const comment: Comment = {\n id: shortId(),\n timestamp,\n author,\n type,\n body: text,\n replyTo: options.replyTo,\n resolved: type === 'question' ? false : undefined,\n };\n\n const entry = formatCommentEntry(comment);\n const nextCount = currentCount + 1;\n\n let next = setTopLevelField(currentContent, 'entryCount', nextCount);\n next = setTopLevelField(next, 'updated', `\"${timestamp}\"`);\n\n if (next.includes('No comments yet.')) {\n next = next.replace('No comments yet.', entry.trimEnd());\n } else {\n next = `${next.trimEnd()}\\n\\n${entry}`;\n }\n\n await writeFileForce(commentsPath, next);\n\n console.log(`Added ${type} comment ${comment.id} to ${assignmentRef} (${commentsPath})`);\n if (options.replyTo) {\n console.log(` In reply to: ${options.replyTo}`);\n }\n}\n","import { resolve } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport { expandHome, assignmentsDir as assignmentsDirFn } from '../utils/paths.js';\nimport { fileExists, writeFileForce } from '../utils/fs.js';\nimport { readConfig } from '../utils/config.js';\nimport { isValidSlug } from '../utils/slug.js';\nimport { nowTimestamp } from '../utils/timestamp.js';\nimport { resolveAssignmentById } from '../utils/assignment-resolver.js';\n\nexport interface RequestOptions {\n project?: string;\n dir?: string;\n from?: string;\n}\n\nfunction setTopLevelField(content: string, key: string, value: string): string {\n const fieldRegex = new RegExp(`^(${key}:)\\\\s*.*$`, 'm');\n if (fieldRegex.test(content)) {\n return content.replace(fieldRegex, `$1 ${value}`);\n }\n return content;\n}\n\nexport async function requestCommand(\n target: string,\n text: string,\n options: RequestOptions = {},\n): Promise<void> {\n if (!text || !text.trim()) {\n throw new Error('Request text cannot be empty.');\n }\n\n const config = await readConfig();\n const baseDir = options.dir ? expandHome(options.dir) : config.defaultProjectDir;\n\n let assignmentDir: string;\n let targetRef: string;\n if (options.project) {\n if (!isValidSlug(options.project)) {\n throw new Error(`Invalid project slug \"${options.project}\".`);\n }\n if (!isValidSlug(target)) {\n throw new Error(`Invalid assignment slug \"${target}\".`);\n }\n assignmentDir = resolve(baseDir, options.project, 'assignments', target);\n targetRef = target;\n } else {\n const resolved = await resolveAssignmentById(baseDir, assignmentsDirFn(), target);\n if (!resolved) {\n throw new Error(`Target assignment \"${target}\" not found. Provide --project <slug> or a valid UUID.`);\n }\n assignmentDir = resolved.assignmentDir;\n targetRef = resolved.standalone ? resolved.id : resolved.assignmentSlug;\n }\n\n const assignmentMdPath = resolve(assignmentDir, 'assignment.md');\n if (!(await fileExists(assignmentMdPath))) {\n throw new Error(`assignment.md not found at ${assignmentMdPath}`);\n }\n\n const source = options.from\n ?? process.env.SYNTAUR_ASSIGNMENT\n ?? 'unknown';\n\n let content = await readFile(assignmentMdPath, 'utf-8');\n const todoLine = `- [ ] ${text.trim()} (from: ${source})`;\n\n const todosHeading = /^## Todos\\s*$/m;\n if (todosHeading.test(content)) {\n content = content.replace(\n /(^## Todos[\\s\\S]*?)(\\n## |\\n*$)/m,\n (_m, section, nextHeading) => {\n return `${section.trimEnd()}\\n${todoLine}\\n${nextHeading}`;\n },\n );\n } else {\n // No Todos section — append one\n content = `${content.trimEnd()}\\n\\n## Todos\\n\\n${todoLine}\\n`;\n }\n\n const timestamp = nowTimestamp();\n content = setTopLevelField(content, 'updated', `\"${timestamp}\"`);\n\n await writeFileForce(assignmentMdPath, content);\n\n console.log(`Added todo to ${targetRef}: ${text.trim()} (from: ${source})`);\n}\n","import { readdir } from 'node:fs/promises';\nimport { readConfig } from './utils/config.js';\nimport {\n getConfiguredOrLegacyManagedPluginDir,\n getConfiguredOrLegacyMarketplacePath,\n isSyntaurDataInstalled,\n} from './utils/install.js';\n\nasync function hasAnyProjectContent(projectsDir: string): Promise<boolean> {\n try {\n const entries = await readdir(projectsDir, { withFileTypes: true });\n return entries.some((entry) => entry.isDirectory());\n } catch {\n return false;\n }\n}\n\nasync function isSetupComplete(): Promise<boolean> {\n const config = await readConfig();\n if (config.onboarding.completed) {\n return true;\n }\n\n const [\n claudePluginDir,\n codexPluginDir,\n codexMarketplacePath,\n hasProjectContent,\n ] = await Promise.all([\n getConfiguredOrLegacyManagedPluginDir('claude'),\n getConfiguredOrLegacyManagedPluginDir('codex'),\n getConfiguredOrLegacyMarketplacePath(),\n hasAnyProjectContent(config.defaultProjectDir),\n ]);\n\n return Boolean(\n claudePluginDir ||\n codexPluginDir ||\n codexMarketplacePath ||\n hasProjectContent,\n );\n}\n\nexport async function getDefaultCommandName(): Promise<'setup' | 'dashboard'> {\n if (!(await isSyntaurDataInstalled())) {\n return 'setup';\n }\n\n return (await isSetupComplete()) ? 'dashboard' : 'setup';\n}\n","import { fileURLToPath } from 'node:url';\nimport { readFile } from 'node:fs/promises';\nimport { dirname, join, resolve } from 'node:path';\nimport { spawn } from 'node:child_process';\nimport { createInterface } from 'node:readline/promises';\nimport { syntaurRoot } from './paths.js';\nimport { fileExists, writeFileForce } from './fs.js';\nimport { readPackageVersion } from './version.js';\n\ninterface NpxPromptState {\n decision: 'never' | 'installed';\n decidedAt: string;\n lastUpgradeHintVersion?: string;\n lastUpgradeHintAt?: string;\n}\n\nconst STATE_FILE = resolve(syntaurRoot(), 'npx-install.json');\nconst META_ARGS = new Set(['-h', '--help', '-V', '--version', 'help']);\nconst GLOBAL_VERSION_TIMEOUT_MS = 2000;\n\nfunction isRunningViaNpx(scriptUrl: string): boolean {\n let scriptPath: string;\n try {\n scriptPath = fileURLToPath(scriptUrl);\n } catch {\n return false;\n }\n const p = scriptPath.replace(/\\\\/g, '/');\n if (p.includes('/_npx/')) return true;\n if (p.includes('/pnpm/dlx/') || p.includes('/dlx-')) return true;\n if (p.includes('/bun/install/cache/bunx-') || p.includes('/bunx-')) return true;\n\n const ua = process.env.npm_config_user_agent ?? '';\n if (ua.includes('npx/')) return true;\n\n return false;\n}\n\nasync function readState(): Promise<NpxPromptState | null> {\n if (!(await fileExists(STATE_FILE))) return null;\n try {\n const raw = await readFile(STATE_FILE, 'utf-8');\n return JSON.parse(raw) as NpxPromptState;\n } catch {\n return null;\n }\n}\n\nasync function writeState(state: NpxPromptState): Promise<void> {\n await writeFileForce(STATE_FILE, `${JSON.stringify(state, null, 2)}\\n`);\n}\n\nasync function resolveNpmBin(): Promise<{ cmd: string; shell: boolean }> {\n const nodeDir = dirname(process.execPath);\n const isWin = process.platform === 'win32';\n const npmName = isWin ? 'npm.cmd' : 'npm';\n const nearNode = join(nodeDir, npmName);\n if (await fileExists(nearNode)) {\n return { cmd: nearNode, shell: false };\n }\n return { cmd: 'npm', shell: isWin };\n}\n\nasync function installGlobally(): Promise<boolean> {\n const { cmd, shell } = await resolveNpmBin();\n return new Promise((resolvePromise) => {\n const child = spawn(cmd, ['install', '-g', 'syntaur'], {\n stdio: 'inherit',\n shell,\n });\n child.on('exit', (code) => resolvePromise(code === 0));\n child.on('error', () => resolvePromise(false));\n });\n}\n\nasync function readGlobalVersion(): Promise<string | null> {\n const { cmd, shell } = await resolveNpmBin();\n const rootPath = await new Promise<string | null>((resolvePromise) => {\n const child = spawn(cmd, ['root', '-g'], {\n shell,\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n let out = '';\n const timer = setTimeout(() => {\n child.kill();\n resolvePromise(null);\n }, GLOBAL_VERSION_TIMEOUT_MS);\n child.stdout?.on('data', (chunk: Buffer) => {\n out += chunk.toString('utf-8');\n });\n child.on('exit', (code) => {\n clearTimeout(timer);\n resolvePromise(code === 0 ? out.trim() : null);\n });\n child.on('error', () => {\n clearTimeout(timer);\n resolvePromise(null);\n });\n });\n if (!rootPath) return null;\n try {\n const manifestPath = join(rootPath, 'syntaur', 'package.json');\n if (!(await fileExists(manifestPath))) return null;\n const raw = await readFile(manifestPath, 'utf-8');\n const parsed = JSON.parse(raw) as { version?: unknown };\n return typeof parsed.version === 'string' ? parsed.version : null;\n } catch {\n return null;\n }\n}\n\nexport function compareSemver(a: string, b: string): number {\n const parse = (v: string): number[] => {\n const core = v.split(/[-+]/)[0];\n const parts = core.split('.').map((p) => parseInt(p, 10));\n if (parts.some((n) => !Number.isFinite(n))) return [];\n while (parts.length < 3) parts.push(0);\n return parts.slice(0, 3);\n };\n const pa = parse(a);\n const pb = parse(b);\n if (pa.length === 0 || pb.length === 0) return 0;\n for (let i = 0; i < 3; i++) {\n if (pa[i] > pb[i]) return 1;\n if (pa[i] < pb[i]) return -1;\n }\n return 0;\n}\n\nasync function askChoice(promptLabel: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const controller = new AbortController();\n const onSigint = () => controller.abort();\n process.once('SIGINT', onSigint);\n try {\n const raw = await rl.question(promptLabel, {\n signal: controller.signal,\n });\n return raw.trim();\n } catch {\n return '';\n } finally {\n process.off('SIGINT', onSigint);\n rl.close();\n }\n}\n\nasync function maybePromptUpgrade(\n scriptUrl: string,\n state: NpxPromptState,\n): Promise<void> {\n const running = await readPackageVersion(scriptUrl);\n if (!running) return;\n if (state.lastUpgradeHintVersion === running) return;\n\n const globalV = await readGlobalVersion();\n if (!globalV) return;\n if (compareSemver(running, globalV) <= 0) return;\n\n console.log('');\n console.log(\n `Your installed syntaur (${globalV}) is behind this one (${running}). Upgrade your global install?`,\n );\n console.log(' 1) Yes — upgrade now');\n console.log(' 2) Not now — just start it for this run');\n const answer = await askChoice('Choose [1/2]: ');\n\n const hintUpdate = {\n lastUpgradeHintVersion: running,\n lastUpgradeHintAt: new Date().toISOString(),\n };\n\n if (answer === '1') {\n console.log('\\nUpgrading syntaur globally...\\n');\n const ok = await installGlobally();\n if (ok) {\n await writeState({ ...state, ...hintUpdate });\n console.log(\n `\\nUpgraded to ${running}. From now on \\`syntaur\\` will use the new version.\\n`,\n );\n } else {\n console.log('\\nUpgrade failed. Continuing with this run.\\n');\n }\n return;\n }\n\n await writeState({ ...state, ...hintUpdate });\n}\n\nexport async function maybePromptInstall(scriptUrl: string): Promise<void> {\n if (!isRunningViaNpx(scriptUrl)) return;\n if (process.env.SYNTAUR_SKIP_INSTALL_PROMPT === '1') return;\n if (!process.stdout.isTTY || !process.stdin.isTTY) return;\n\n const args = process.argv.slice(2);\n if (args.some((a) => META_ARGS.has(a))) return;\n\n const state = await readState();\n if (state?.decision === 'never') return;\n if (state?.decision === 'installed') {\n await maybePromptUpgrade(scriptUrl, state);\n return;\n }\n\n console.log('');\n console.log(\n \"You're running syntaur via npx. Install it globally for faster startup?\",\n );\n console.log(' 1) Yes — install now');\n console.log(' 2) Maybe later — just start it for now');\n console.log(\" 3) Never — don't ask again\");\n const answer = await askChoice('Choose [1/2/3]: ');\n\n if (answer === '1') {\n console.log('\\nInstalling syntaur globally...\\n');\n const ok = await installGlobally();\n if (ok) {\n await writeState({\n decision: 'installed',\n decidedAt: new Date().toISOString(),\n });\n console.log('\\nInstalled. From now on you can run `syntaur` directly.\\n');\n } else {\n console.log('\\nInstall failed. Continuing with this run.\\n');\n }\n } else if (answer === '3') {\n await writeState({\n decision: 'never',\n decidedAt: new Date().toISOString(),\n });\n console.log(\"Got it — won't ask again.\\n\");\n }\n}\n","import { fileURLToPath } from 'node:url';\nimport { readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\n\nexport async function readPackageVersion(\n scriptUrl: string,\n): Promise<string | null> {\n try {\n const scriptPath = fileURLToPath(scriptUrl);\n const pkgRoot = dirname(dirname(scriptPath));\n const raw = await readFile(join(pkgRoot, 'package.json'), 'utf-8');\n const parsed = JSON.parse(raw) as { version?: unknown };\n return typeof parsed.version === 'string' ? parsed.version : null;\n } catch {\n return null;\n }\n}\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,eAAe;AACxB,SAAS,eAAe;AAEjB,SAAS,WAAW,GAAmB;AAC5C,MAAI,EAAE,WAAW,IAAI,KAAK,MAAM,KAAK;AACnC,WAAO,QAAQ,QAAQ,GAAG,EAAE,MAAM,CAAC,CAAC;AAAA,EACtC;AACA,SAAO;AACT;AAEO,SAAS,cAAsB;AACpC,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,YAAY,SAAS,SAAS,GAAG;AACnC,WAAO,QAAQ,WAAW,QAAQ,CAAC;AAAA,EACrC;AACA,SAAO,QAAQ,QAAQ,GAAG,UAAU;AACtC;AAEO,SAAS,oBAA4B;AAC1C,SAAO,QAAQ,YAAY,GAAG,UAAU;AAC1C;AAEO,SAAS,iBAAyB;AACvC,SAAO,QAAQ,YAAY,GAAG,aAAa;AAC7C;AAEO,SAAS,aAAqB;AACnC,SAAO,QAAQ,YAAY,GAAG,SAAS;AACzC;AAEO,SAAS,eAAuB;AACrC,SAAO,QAAQ,YAAY,GAAG,WAAW;AAC3C;AAEO,SAAS,WAAmB;AACjC,SAAO,QAAQ,YAAY,GAAG,OAAO;AACvC;AApCA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,OAAO,WAAW,QAAQ,cAAc;AACjD,SAAS,SAAS,YAAY;AAE9B,eAAsB,UAAU,KAA4B;AAC1D,QAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACtC;AAEA,eAAsB,WAAW,UAAoC;AACnE,MAAI;AACF,UAAM,OAAO,QAAQ;AACrB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,cACpB,UACA,SACkB;AAClB,MAAI,MAAM,WAAW,QAAQ,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,QAAM,UAAU,QAAQ,QAAQ,CAAC;AACjC,QAAM,UAAU,UAAU,SAAS,OAAO;AAC1C,SAAO;AACT;AAEA,eAAsB,eACpB,UACA,SACe;AACf,QAAM,MAAM,QAAQ,QAAQ;AAC5B,QAAM,WAAW;AAAA,IACf;AAAA,IACA,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;AAAA,EACvD;AACA,QAAM,UAAU,GAAG;AACnB,QAAM,UAAU,UAAU,SAAS,OAAO;AAC1C,QAAM,OAAO,UAAU,QAAQ;AACjC;AAxCA;AAAA;AAAA;AAAA;AAAA;;;ACIO,SAAS,aAAa,QAA8B;AACzD,SAAO;AAAA;AAAA,qBAEY,OAAO,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiB7C;AAxBA;AAAA;AAAA;AAAA;AAAA;;;ACaO,SAAS,mBAAmB,aAAuC;AACxE,QAAM,QAAQ,YAAY,MAAM,uBAAuB;AACvD,MAAI,CAAC,OAAO;AACV,WAAO,CAAC,IAAI,WAAW;AAAA,EACzB;AACA,QAAM,mBAAmB,MAAM,CAAC;AAChC,QAAM,OAAO,YAAY,MAAM,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK;AACrD,SAAO,CAAC,kBAAkB,IAAI;AAChC;AAKA,SAAS,iBAAiB,KAA4B;AACpD,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,YAAY,UAAU,YAAY,GAAI,QAAO;AACjD,MACG,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,KAC/C,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAChD;AACA,WAAO,QAAQ,MAAM,GAAG,EAAE;AAAA,EAC5B;AACA,SAAO;AACT;AAKO,SAAS,SAAS,aAAqB,KAA4B;AACxE,QAAM,QAAQ,YAAY,MAAM,IAAI,OAAO,IAAI,GAAG,cAAc,GAAG,CAAC;AACpE,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,iBAAiB,MAAM,CAAC,CAAC;AAClC;AAKO,SAAS,eAAe,aAAqB,QAAgB,KAA4B;AAC9F,QAAM,cAAc,IAAI,OAAO,IAAI,MAAM,6BAA6B,GAAG;AACzE,QAAM,cAAc,YAAY,MAAM,WAAW;AACjD,MAAI,CAAC,YAAa,QAAO;AACzB,QAAM,QAAQ,YAAY,CAAC;AAC3B,QAAM,aAAa,MAAM,MAAM,IAAI,OAAO,QAAQ,GAAG,cAAc,GAAG,CAAC;AACvE,MAAI,CAAC,WAAY,QAAO;AACxB,SAAO,iBAAiB,WAAW,CAAC,CAAC;AACvC;AAKA,SAAS,eAAe,aAAqB,WAA6B;AACxE,QAAM,cAAc,YAAY,MAAM,IAAI,OAAO,IAAI,SAAS,mBAAmB,GAAG,CAAC;AACrF,MAAI,YAAa,QAAO,CAAC;AAEzB,QAAM,UAAoB,CAAC;AAC3B,QAAM,aAAa,YAAY;AAAA,IAC7B,IAAI,OAAO,IAAI,SAAS,kCAAkC,GAAG;AAAA,EAC/D;AACA,MAAI,YAAY;AACd,QAAI;AACJ,UAAM,QAAQ;AACd,YAAQ,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,OAAO,MAAM;AAClD,cAAQ,KAAK,KAAK,CAAC,EAAE,KAAK,CAAC;AAAA,IAC7B;AAAA,EACF;AACA,SAAO;AACT;AAmBO,SAAS,aAAa,aAAoC;AAC/D,QAAM,CAAC,IAAI,IAAI,IAAI,mBAAmB,WAAW;AAIjD,QAAM,OAAO,SAAS,IAAI,MAAM,KAAK,SAAS,IAAI,SAAS,KAAK;AAChE,SAAO;AAAA,IACL,IAAI,SAAS,IAAI,IAAI,KAAK;AAAA,IAC1B;AAAA,IACA,OAAO,SAAS,IAAI,OAAO,KAAK;AAAA,IAChC,UAAU,SAAS,IAAI,UAAU,MAAM;AAAA,IACvC,YAAY,SAAS,IAAI,YAAY;AAAA,IACrC,gBAAgB,SAAS,IAAI,gBAAgB;AAAA,IAC7C,gBAAgB,SAAS,IAAI,gBAAgB;AAAA,IAC7C,SAAS,SAAS,IAAI,SAAS,KAAK;AAAA,IACpC,SAAS,SAAS,IAAI,SAAS,KAAK;AAAA,IACpC,MAAM,eAAe,IAAI,MAAM;AAAA,IAC/B,WAAW,SAAS,IAAI,WAAW;AAAA,IACnC;AAAA,EACF;AACF;AAgBO,SAAS,YAAY,aAAmC;AAC7D,QAAM,CAAC,IAAI,IAAI,IAAI,mBAAmB,WAAW;AAGjD,QAAM,WAAuD,EAAE,OAAO,EAAE;AACxE,QAAM,gBAAgB,GAAG,MAAM,iCAAiC;AAChE,MAAI,eAAe;AACjB,UAAM,QAAQ,cAAc,CAAC,EAAE,MAAM,IAAI;AACzC,eAAW,QAAQ,OAAO;AACxB,YAAM,KAAK,KAAK,MAAM,oBAAoB;AAC1C,UAAI,IAAI;AACN,iBAAS,GAAG,CAAC,CAAC,IAAI,SAAS,GAAG,CAAC,GAAG,EAAE;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,SAAS,IAAI,SAAS,KAAK;AAAA,IACpC,QAAQ,SAAS,IAAI,QAAQ,KAAK;AAAA,IAClC;AAAA,IACA,gBAAgB;AAAA,MACd,cAAc,SAAS,eAAe,IAAI,kBAAkB,cAAc,KAAK,KAAK,EAAE;AAAA,MACtF,aAAa,SAAS,eAAe,IAAI,kBAAkB,aAAa,KAAK,KAAK,EAAE;AAAA,MACpF,eAAe,SAAS,eAAe,IAAI,kBAAkB,eAAe,KAAK,KAAK,EAAE;AAAA,IAC1F;AAAA,IACA;AAAA,EACF;AACF;AA0DA,SAAS,iBAAiB,aAAyE;AACjG,QAAM,cAAc,YAAY,MAAM,0BAA0B;AAChE,MAAI,YAAa,QAAO,CAAC;AAEzB,QAAM,UAA8D,CAAC;AACrE,QAAM,aAAa,YAAY;AAAA,IAC7B;AAAA,EACF;AACA,MAAI,CAAC,WAAY,QAAO,CAAC;AAEzB,QAAM,aAAa,WAAW,CAAC,EAAE,MAAM,WAAW,EAAE,OAAO,OAAO;AAClE,aAAW,SAAS,YAAY;AAC9B,UAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,UAAM,QAAgC,CAAC;AACvC,eAAW,QAAQ,OAAO;AACxB,YAAM,WAAW,KAAK,QAAQ,GAAG;AACjC,UAAI,WAAW,EAAG;AAClB,YAAM,MAAM,KAAK,MAAM,GAAG,QAAQ,EAAE,KAAK,EAAE,QAAQ,SAAS,EAAE;AAC9D,YAAM,QAAQ,KAAK,MAAM,WAAW,CAAC,EAAE,KAAK;AAC5C,UAAI,OAAO,OAAO;AAChB,cAAM,GAAG,IAAI;AAAA,MACf;AAAA,IACF;AACA,QAAI,MAAM,QAAQ,KAAK,MAAM,IAAI,KAAK,MAAM,KAAK,GAAG;AAClD,cAAQ,KAAK;AAAA,QACX,QAAQ,MAAM,QAAQ;AAAA,QACtB,IAAI,MAAM,IAAI;AAAA,QACd,KAAK,MAAM,KAAK;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,oBAAoB,aAA2C;AAC7E,QAAM,CAAC,IAAI,IAAI,IAAI,mBAAmB,WAAW;AACjD,SAAO;AAAA,IACL,IAAI,SAAS,IAAI,IAAI,KAAK;AAAA,IAC1B,MAAM,SAAS,IAAI,MAAM,KAAK;AAAA,IAC9B,OAAO,SAAS,IAAI,OAAO,KAAK;AAAA,IAChC,SAAS,SAAS,IAAI,SAAS;AAAA,IAC/B,MAAM,SAAS,IAAI,MAAM;AAAA,IACzB,QAAQ,SAAS,IAAI,QAAQ,KAAK;AAAA,IAClC,UAAU,SAAS,IAAI,UAAU,KAAK;AAAA,IACtC,UAAU,SAAS,IAAI,UAAU;AAAA,IACjC,WAAW,eAAe,IAAI,WAAW;AAAA,IACzC,OAAO,eAAe,IAAI,OAAO;AAAA,IACjC,eAAe,SAAS,IAAI,eAAe;AAAA,IAC3C,WAAW;AAAA,MACT,YAAY,eAAe,IAAI,aAAa,YAAY;AAAA,MACxD,cAAc,eAAe,IAAI,aAAa,cAAc;AAAA,MAC5D,QAAQ,eAAe,IAAI,aAAa,QAAQ;AAAA,MAChD,cAAc,eAAe,IAAI,aAAa,cAAc;AAAA,IAC9D;AAAA,IACA,aAAa,iBAAiB,EAAE;AAAA,IAChC,MAAM,eAAe,IAAI,MAAM;AAAA,IAC/B,SAAS,SAAS,IAAI,SAAS,KAAK;AAAA,IACpC,SAAS,SAAS,IAAI,SAAS,KAAK;AAAA,IACpC;AAAA,EACF;AACF;AAYO,SAAS,UAAU,aAAiC;AACzD,QAAM,CAAC,IAAI,IAAI,IAAI,mBAAmB,WAAW;AACjD,SAAO;AAAA,IACL,YAAY,SAAS,IAAI,YAAY,KAAK;AAAA,IAC1C,QAAQ,SAAS,IAAI,QAAQ,KAAK;AAAA,IAClC,SAAS,SAAS,IAAI,SAAS,KAAK;AAAA,IACpC,SAAS,SAAS,IAAI,SAAS,KAAK;AAAA,IACpC;AAAA,EACF;AACF;AAUO,SAAS,gBAAgB,aAAuC;AACrE,QAAM,CAAC,IAAI,IAAI,IAAI,mBAAmB,WAAW;AACjD,SAAO;AAAA,IACL,YAAY,SAAS,IAAI,YAAY,KAAK;AAAA,IAC1C,SAAS,SAAS,IAAI,SAAS,KAAK;AAAA,IACpC;AAAA,EACF;AACF;AAWO,SAAS,aAAa,aAAoC;AAC/D,QAAM,CAAC,IAAI,IAAI,IAAI,mBAAmB,WAAW;AACjD,SAAO;AAAA,IACL,YAAY,SAAS,IAAI,YAAY,KAAK;AAAA,IAC1C,cAAc,SAAS,SAAS,IAAI,cAAc,KAAK,KAAK,EAAE;AAAA,IAC9D,SAAS,SAAS,IAAI,SAAS,KAAK;AAAA,IACpC;AAAA,EACF;AACF;AAWO,SAAS,oBAAoB,aAA2C;AAC7E,QAAM,CAAC,IAAI,IAAI,IAAI,mBAAmB,WAAW;AACjD,SAAO;AAAA,IACL,YAAY,SAAS,IAAI,YAAY,KAAK;AAAA,IAC1C,eAAe,SAAS,SAAS,IAAI,eAAe,KAAK,KAAK,EAAE;AAAA,IAChE,SAAS,SAAS,IAAI,SAAS,KAAK;AAAA,IACpC;AAAA,EACF;AACF;AAsBO,SAAS,cAAc,aAAqC;AACjE,QAAM,CAAC,IAAI,IAAI,IAAI,mBAAmB,WAAW;AACjD,QAAM,UAA2B,CAAC;AAClC,QAAM,WAAW,KAAK,MAAM,OAAO,EAAE,MAAM,CAAC;AAC5C,aAAW,WAAW,UAAU;AAC9B,UAAM,aAAa,QAAQ,QAAQ,IAAI;AACvC,QAAI,eAAe,GAAI;AACvB,UAAM,KAAK,QAAQ,MAAM,GAAG,UAAU,EAAE,KAAK;AAC7C,UAAM,OAAO,QAAQ,MAAM,aAAa,CAAC;AACzC,UAAM,cAAc,KAAK;AAAA,MACvB;AAAA,IACF;AACA,QAAI,CAAC,YAAa;AAClB,UAAM,CAAC,EAAE,WAAW,QAAQ,MAAM,SAAS,aAAa,SAAS,IAAI;AACrE,UAAM,QAAuB;AAAA,MAC3B;AAAA,MACA,WAAW,UAAU,KAAK;AAAA,MAC1B,QAAQ,OAAO,KAAK;AAAA,MACpB;AAAA,MACA,MAAM,UAAU,KAAK;AAAA,IACvB;AACA,QAAI,QAAS,OAAM,UAAU,QAAQ,KAAK;AAC1C,QAAI,YAAa,OAAM,WAAW,gBAAgB;AAClD,YAAQ,KAAK,KAAK;AAAA,EACpB;AACA,SAAO;AAAA,IACL,YAAY,SAAS,IAAI,YAAY,KAAK;AAAA,IAC1C,YAAY,SAAS,SAAS,IAAI,YAAY,KAAK,KAAK,EAAE;AAAA,IAC1D,SAAS,SAAS,IAAI,SAAS,KAAK;AAAA,IACpC;AAAA,IACA;AAAA,EACF;AACF;AAiBO,SAAS,cAAc,aAAqC;AACjE,QAAM,CAAC,IAAI,IAAI,IAAI,mBAAmB,WAAW;AACjD,QAAM,UAA2B,CAAC;AAClC,QAAM,WAAW,KAAK,MAAM,OAAO,EAAE,MAAM,CAAC;AAC5C,aAAW,WAAW,UAAU;AAC9B,UAAM,aAAa,QAAQ,QAAQ,IAAI;AACvC,QAAI,eAAe,GAAI;AACvB,UAAM,YAAY,QAAQ,MAAM,GAAG,UAAU,EAAE,KAAK;AACpD,UAAM,YAAY,QAAQ,MAAM,aAAa,CAAC,EAAE,KAAK;AACrD,YAAQ,KAAK,EAAE,WAAW,MAAM,UAAU,CAAC;AAAA,EAC7C;AACA,SAAO;AAAA,IACL,YAAY,SAAS,IAAI,YAAY,KAAK;AAAA,IAC1C,YAAY,SAAS,SAAS,IAAI,YAAY,KAAK,KAAK,EAAE;AAAA,IAC1D,SAAS,SAAS,IAAI,SAAS,KAAK;AAAA,IACpC;AAAA,IACA;AAAA,EACF;AACF;AAcO,SAAS,cAAc,aAAqC;AACjE,QAAM,CAAC,IAAI,IAAI,IAAI,mBAAmB,WAAW;AACjD,SAAO;AAAA,IACL,MAAM,SAAS,IAAI,MAAM,KAAK;AAAA,IAC9B,QAAQ,SAAS,IAAI,QAAQ,KAAK;AAAA,IAClC,UAAU,SAAS,IAAI,UAAU,KAAK;AAAA,IACtC,oBAAoB,eAAe,IAAI,oBAAoB;AAAA,IAC3D,SAAS,SAAS,IAAI,SAAS,KAAK;AAAA,IACpC,SAAS,SAAS,IAAI,SAAS,KAAK;AAAA,IACpC;AAAA,EACF;AACF;AAeO,SAAS,YAAY,aAAmC;AAC7D,QAAM,CAAC,IAAI,IAAI,IAAI,mBAAmB,WAAW;AACjD,SAAO;AAAA,IACL,MAAM,SAAS,IAAI,MAAM,KAAK;AAAA,IAC9B,QAAQ,SAAS,IAAI,QAAQ,KAAK;AAAA,IAClC,OAAO,SAAS,IAAI,OAAO,KAAK;AAAA,IAChC,kBAAkB,SAAS,IAAI,kBAAkB;AAAA,IACjD,oBAAoB,eAAe,IAAI,oBAAoB;AAAA,IAC3D,SAAS,SAAS,IAAI,SAAS,KAAK;AAAA,IACpC,SAAS,SAAS,IAAI,SAAS,KAAK;AAAA,IACpC;AAAA,EACF;AACF;AAeO,SAAS,cAAc,aAAqC;AACjE,QAAM,CAAC,IAAI,IAAI,IAAI,mBAAmB,WAAW;AACjD,SAAO;AAAA,IACL,MAAM,SAAS,IAAI,MAAM,KAAK;AAAA,IAC9B,MAAM,SAAS,IAAI,MAAM,KAAK;AAAA,IAC9B,aAAa,SAAS,IAAI,aAAa,KAAK;AAAA,IAC5C,WAAW,SAAS,IAAI,aAAa,KAAK;AAAA,IAC1C,SAAS,SAAS,IAAI,SAAS,KAAK;AAAA,IACpC,SAAS,SAAS,IAAI,SAAS,KAAK;AAAA,IACpC,MAAM,eAAe,IAAI,MAAM;AAAA,IAC/B;AAAA,EACF;AACF;AAQO,SAAS,oBAAoB,MAA6B;AAC/D,QAAM,QAAQ,KAAK,MAAM,2BAA2B;AACpD,SAAO,QAAQ,MAAM,CAAC,EAAE,KAAK,IAAI;AACnC;AAthBA;AAAA;AAAA;AAAA;AAAA;;;ACAO,SAAS,eAAuB;AACrC,UAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,aAAa,GAAG;AAC1D;AAFA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,WAAAA,UAAS,YAAAC,WAAU,UAAAC,SAAQ,aAAAC,kBAAiB;AAErD,SAAS,WAAAC,gBAAe;AAuCxB,eAAsB,0BACpBC,cACsC;AACtC,QAAM,SAAsC;AAAA,IAC1C,qBAAqB,CAAC;AAAA,IACtB,cAAc,CAAC;AAAA,EACjB;AAEA,MAAI,CAAE,MAAM,WAAWA,YAAW,EAAI,QAAO;AAE7C,MAAI;AACJ,MAAI;AACF,cAAW,MAAML,SAAQK,cAAa,EAAE,eAAe,KAAK,CAAC;AAAA,EAC/D,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY,KAAK,MAAM,KAAK,WAAW,GAAG,EAAG;AAExD,UAAM,aAAaD,SAAQC,cAAa,MAAM,IAAI;AAClD,UAAM,SAASD,SAAQ,YAAY,YAAY;AAC/C,UAAM,SAASA,SAAQ,YAAY,YAAY;AAE/C,QAAI;AACF,UAAK,MAAM,WAAW,MAAM,KAAM,CAAE,MAAM,WAAW,MAAM,GAAI;AAC7D,cAAMF,QAAO,QAAQ,MAAM;AAC3B,eAAO,oBAAoB,KAAK,GAAG,MAAM,IAAI,aAAa;AAAA,MAC5D;AAAA,IACF,QAAQ;AAEN;AAAA,IACF;AAIA,eAAW,SAAS,CAAC,YAAY,WAAW,GAAG;AAC7C,UAAI;AACF,YAAI,MAAM,WAAWE,SAAQ,YAAY,KAAK,CAAC,GAAG;AAChD,iBAAO,aAAa,KAAK,GAAG,MAAM,IAAI,IAAI,KAAK,EAAE;AAAA,QACnD;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAcA,eAAsB,oBACpB,YACgC;AAChC,QAAM,SAAgC;AAAA,IACpC,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,qBAAqB;AAAA,EACvB;AAEA,MAAI,CAAE,MAAM,WAAW,UAAU,EAAI,QAAO;AAE5C,MAAI;AACJ,MAAI;AACF,cAAU,MAAMH,UAAS,YAAY,OAAO;AAAA,EAC9C,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,QAAQ,MAAM,0BAA0B;AACxD,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,UAAU,QAAQ,CAAC;AACzB,QAAM,UAAU,QAAQ,MAAM,QAAQ,CAAC,EAAE,MAAM;AAG/C,QAAM,gBAAgB;AACtB,QAAM,mBAAmB,QAAQ,MAAM,aAAa;AACpD,QAAM,iBAAiB,6BAA6B,KAAK,OAAO;AAEhE,MAAI,aAAa;AACjB,MAAI,eAA8B;AAClC,MAAI,kBAAkB;AACpB,mBAAe,iBAAiB,CAAC,EAAE,KAAK;AACxC,QAAI,CAAC,gBAAgB;AACnB,mBAAa,QAAQ;AAAA,QACnB;AAAA,QACA,wBAAwB,YAAY;AAAA,MACtC;AACA,aAAO,eAAe;AAAA,IACxB,OAAO;AAEL,mBAAa,QAAQ,QAAQ,eAAe,EAAE,EAAE,QAAQ,WAAW,IAAI;AACvE,aAAO,eAAe;AAAA,IACxB;AAAA,EACF;AAGA,QAAM,gBAAgB;AACtB,QAAM,mBAAmB,WAAW,MAAM,aAAa;AACvD,QAAM,iBAAiB,mBACnB,iBAAiB,CAAC,EAAE,KAAK,EAAE,QAAQ,gBAAgB,EAAE,IACrD;AAEJ,QAAM,SAAS,CAAC,MACd,EAAE,WAAW,GAAG,IACZG,SAAQ,QAAQ,IAAI,QAAQ,KAAK,EAAE,MAAM,EAAE,WAAW,IAAI,IAAI,IAAI,CAAC,CAAC,IACpE;AAEN,MAAI,sBAAsB,iBAAiB,OAAO,cAAc,IAAI;AAGpE,MAAI,uBAAuB,oBAAoB,SAAS,WAAW,GAAG;AACpE,UAAM,qBAAqB,oBAAoB,QAAQ,eAAe,WAAW;AACjF,QACG,MAAM,WAAW,mBAAmB,KACrC,CAAE,MAAM,WAAW,kBAAkB,GACrC;AACA,UAAI;AACF,cAAMF,QAAO,qBAAqB,kBAAkB;AAEpD,cAAM,WAAW,eAAgB,SAAS,WAAW,IACjD,eAAgB,QAAQ,eAAe,WAAW,IAClD;AACJ,qBAAa,WAAW;AAAA,UACtB;AAAA,UACA,sBAAsB,QAAQ;AAAA,QAChC;AACA,8BAAsB;AACtB,eAAO,aAAa;AAAA,MACtB,QAAQ;AAAA,MAGR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,sBAAsB;AAE7B,MAAI,OAAO,gBAAgB,OAAO,YAAY;AAC5C,UAAM,aAAa;AAAA,EAAQ,WAAW,QAAQ,QAAQ,EAAE,CAAC;AAAA;AAAA,EAAU,QAAQ,WAAW,IAAI,IAAI,QAAQ,MAAM,CAAC,IAAI,OAAO;AACxH,QAAI;AACF,YAAMC,WAAU,YAAY,YAAY,OAAO;AAAA,IACjD,QAAQ;AAGN,aAAO,eAAe;AACtB,aAAO,aAAa;AAAA,IACtB;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,mBACd,SACA,QACQ;AACR,QAAM,QAAkB,CAAC;AACzB,MAAI,QAAQ,oBAAoB,SAAS,GAAG;AAC1C,UAAM,aAAa,QAAQ,oBACxB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,KAAK,IAAI;AACZ,UAAM,OACJ,QAAQ,oBAAoB,SAAS,IACjC,QAAQ,QAAQ,oBAAoB,SAAS,CAAC,UAC9C;AACN,UAAM;AAAA,MACJ,2CAAsC,QAAQ,oBAAoB,MAAM,WAAW,QAAQ,oBAAoB,WAAW,IAAI,KAAK,GAAG,KAAK,UAAU,GAAG,IAAI;AAAA,IAC9J;AAAA,EACF;AACA,MAAI,QAAQ,aAAc,OAAM,KAAK,2DAAsD;AAC3F,MAAI,QAAQ,WAAY,OAAM,KAAK,oCAAoC;AACvE,MAAI,QAAQ,aAAa,SAAS,GAAG;AACnC,UAAM;AAAA,MACJ,GAAG,QAAQ,aAAa,MAAM,oCAAoC,QAAQ,aAAa,WAAW,IAAI,KAAK,GAAG;AAAA,IAChH;AAAA,EACF;AACA,SAAO,MAAM,SAAS,+BAA+B,MAAM,KAAK,IAAI,CAAC,KAAK;AAC5E;AA5OA;AAAA;AAAA;AAGA;AAAA;AAAA;;;ACHA,SAAS,YAAAG,iBAAgB;AACzB,SAAS,WAAAC,UAAS,kBAAkB;AAyGpC,SAAS,iBAAiB,SAAyC;AACjE,QAAM,QAAQ,QAAQ,MAAM,uBAAuB;AACnD,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,QAAM,SAAiC,CAAC;AACxC,QAAM,QAAQ,MAAM,CAAC,EAAE,MAAM,IAAI;AACjC,MAAI,gBAA+B;AACnC,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,KAAK,MAAM,GAAI;AACxB,UAAM,SAAS,KAAK,SAAS,KAAK,UAAU,EAAE;AAC9C,UAAM,aAAa,KAAK,QAAQ,GAAG;AACnC,QAAI,aAAa,EAAG;AACpB,UAAM,MAAM,KAAK,MAAM,GAAG,UAAU,EAAE,KAAK;AAC3C,UAAM,QAAQ,KAAK,MAAM,aAAa,CAAC,EAAE,KAAK;AAC9C,QAAI,WAAW,GAAG;AAChB,UAAI,UAAU,MAAM,UAAU,QAAW;AACvC,wBAAgB;AAAA,MAClB,OAAO;AACL,wBAAgB;AAChB,eAAO,GAAG,IAAI,MAAM,QAAQ,gBAAgB,EAAE;AAAA,MAChD;AAAA,IACF,WAAW,SAAS,KAAK,eAAe;AACtC,aAAO,GAAG,aAAa,IAAI,GAAG,EAAE,IAAI,MAAM,QAAQ,gBAAgB,EAAE;AAAA,IACtE;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,SAAsC;AAC/D,QAAM,QAAQ,QAAQ,MAAM,uBAAuB;AACnD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,UAAU,MAAM,CAAC;AAGvB,QAAM,gBAAgB,QAAQ,MAAM,iBAAiB;AACrD,MAAI,CAAC,cAAe,QAAO;AAG3B,QAAM,WAAW,QAAQ,QAAQ,cAAc,CAAC,CAAC,IAAI,cAAc,CAAC,EAAE;AACtE,QAAM,YAAY,QAAQ,MAAM,QAAQ;AAExC,QAAM,WAA+B,CAAC;AACtC,QAAM,QAAkB,CAAC;AACzB,QAAM,cAAkC,CAAC;AAGzC,MAAI,iBAAiE;AACrE,QAAM,QAAQ,UAAU,MAAM,IAAI;AAElC,WAAS,eAAe,SAAiB,YAAyE;AAChH,UAAM,QAAgC,CAAC;AACvC,UAAM,YAAY,MAAM,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,KAAK;AAC3D,UAAM,WAAW,UAAU,QAAQ,GAAG;AACtC,QAAI,WAAW,GAAG;AAChB,YAAM,UAAU,MAAM,GAAG,QAAQ,EAAE,KAAK,CAAC,IAAI,UAAU,MAAM,WAAW,CAAC,EAAE,KAAK;AAAA,IAClF;AACA,QAAI,WAAW;AACf,aAAS,IAAI,UAAU,GAAG,IAAI,MAAM,QAAQ,KAAK;AAC/C,YAAM,OAAO,MAAM,CAAC;AACpB,YAAM,cAAc,KAAK,UAAU;AACnC,YAAM,aAAa,KAAK,SAAS,YAAY;AAC7C,UAAI,cAAc,cAAc,YAAY,WAAW,IAAI,EAAG;AAC9D,YAAM,KAAK,YAAY,QAAQ,GAAG;AAClC,UAAI,KAAK,GAAG;AACV,cAAM,YAAY,MAAM,GAAG,EAAE,EAAE,KAAK,CAAC,IAAI,YAAY,MAAM,KAAK,CAAC,EAAE,KAAK;AAAA,MAC1E;AACA;AAAA,IACF;AACA,WAAO,EAAE,OAAO,SAAS;AAAA,EAC3B;AAEA,WAAS,UAAU,GAAG,UAAU,MAAM,QAAQ,WAAW;AACvD,UAAM,OAAO,MAAM,OAAO;AAC1B,UAAM,UAAU,KAAK,UAAU;AAC/B,UAAM,SAAS,KAAK,SAAS,QAAQ;AAGrC,QAAI,WAAW,KAAK,QAAQ,SAAS,GAAG,GAAG;AACzC,YAAM,MAAM,QAAQ,MAAM,GAAG,EAAE,EAAE,KAAK;AACtC,UAAI,QAAQ,cAAe,kBAAiB;AAAA,eACnC,QAAQ,QAAS,kBAAiB;AAAA,eAClC,QAAQ,cAAe,kBAAiB;AAAA,UAC5C,kBAAiB;AACtB;AAAA,IACF;AAGA,QAAI,WAAW,KAAK,QAAQ,SAAS,GAAG,EAAG;AAE3C,QAAI,mBAAmB,WAAW,UAAU,KAAK,QAAQ,WAAW,IAAI,GAAG;AACzE,YAAM,KAAK,QAAQ,MAAM,CAAC,EAAE,KAAK,CAAC;AAClC;AAAA,IACF;AAEA,QAAI,mBAAmB,iBAAiB,UAAU,KAAK,QAAQ,WAAW,IAAI,GAAG;AAC/E,YAAM,EAAE,OAAO,SAAS,IAAI,eAAe,SAAS,MAAM;AAC1D,UAAI,MAAM,IAAI,GAAG;AACf,iBAAS,KAAK;AAAA,UACZ,IAAI,MAAM,IAAI;AAAA,UACd,OAAO,MAAM,OAAO,KAAK,MAAM,IAAI;AAAA,UACnC,aAAa,MAAM,aAAa;AAAA,UAChC,OAAO,MAAM,OAAO;AAAA,UACpB,MAAM,MAAM,MAAM;AAAA,UAClB,UAAU,MAAM,UAAU,MAAM;AAAA,QAClC,CAAC;AAAA,MACH;AACA,iBAAW,WAAW;AACtB;AAAA,IACF;AAEA,QAAI,mBAAmB,iBAAiB,UAAU,KAAK,QAAQ,WAAW,IAAI,GAAG;AAC/E,YAAM,EAAE,OAAO,SAAS,IAAI,eAAe,SAAS,MAAM;AAC1D,UAAI,MAAM,MAAM,KAAK,MAAM,SAAS,KAAK,MAAM,IAAI,GAAG;AACpD,oBAAY,KAAK;AAAA,UACf,MAAM,MAAM,MAAM;AAAA,UAClB,SAAS,MAAM,SAAS;AAAA,UACxB,IAAI,MAAM,IAAI;AAAA,UACd,OAAO,MAAM,OAAO;AAAA,UACpB,aAAa,MAAM,aAAa;AAAA,UAChC,gBAAgB,MAAM,gBAAgB,MAAM;AAAA,QAC9C,CAAC;AAAA,MACH;AACA,iBAAW,WAAW;AACtB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,EAAG,QAAO;AAElC,SAAO;AAAA,IACL;AAAA,IACA,OAAO,MAAM,SAAS,IAAI,QAAQ,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IAC1D;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,UAAgC;AAC7D,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,WAAW;AAGtB,QAAM,KAAK,gBAAgB;AAC3B,aAAW,KAAK,SAAS,UAAU;AACjC,UAAM,KAAK,aAAa,EAAE,EAAE,EAAE;AAC9B,UAAM,KAAK,gBAAgB,EAAE,KAAK,EAAE;AACpC,QAAI,EAAE,YAAa,OAAM,KAAK,sBAAsB,EAAE,WAAW,EAAE;AACnE,QAAI,EAAE,MAAO,OAAM,KAAK,gBAAgB,EAAE,KAAK,EAAE;AACjD,QAAI,EAAE,KAAM,OAAM,KAAK,eAAe,EAAE,IAAI,EAAE;AAC9C,QAAI,EAAE,SAAU,OAAM,KAAK,sBAAsB;AAAA,EACnD;AAGA,QAAM,KAAK,UAAU;AACrB,aAAW,MAAM,SAAS,OAAO;AAC/B,UAAM,KAAK,SAAS,EAAE,EAAE;AAAA,EAC1B;AAGA,MAAI,SAAS,YAAY,SAAS,GAAG;AACnC,UAAM,KAAK,gBAAgB;AAC3B,eAAW,KAAK,SAAS,aAAa;AACpC,YAAM,KAAK,eAAe,EAAE,IAAI,EAAE;AAClC,YAAM,KAAK,kBAAkB,EAAE,OAAO,EAAE;AACxC,YAAM,KAAK,aAAa,EAAE,EAAE,EAAE;AAC9B,UAAI,EAAE,MAAO,OAAM,KAAK,gBAAgB,EAAE,KAAK,EAAE;AACjD,UAAI,EAAE,YAAa,OAAM,KAAK,sBAAsB,EAAE,WAAW,EAAE;AACnE,UAAI,EAAE,eAAgB,OAAM,KAAK,4BAA4B;AAAA,IAC/D;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,2BAA2B,cAAgD;AAClF,QAAM,QAAkB,CAAC;AAEzB,MAAI,aAAa,iBAAiB;AAChC,UAAM,KAAK,sBAAsB,aAAa,eAAe,EAAE;AAAA,EACjE;AACA,MAAI,aAAa,gBAAgB;AAC/B,UAAM,KAAK,qBAAqB,aAAa,cAAc,EAAE;AAAA,EAC/D;AACA,MAAI,aAAa,sBAAsB;AACrC,UAAM,KAAK,2BAA2B,aAAa,oBAAoB,EAAE;AAAA,EAC3E;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,SAAO,CAAC,iBAAiB,GAAG,KAAK,EAAE,KAAK,IAAI;AAC9C;AAEA,SAAS,0BAA0B,YAAsC;AACvE,SAAO,CAAC,eAAe,gBAAgB,WAAW,YAAY,SAAS,OAAO,EAAE,EAAE,KAAK,IAAI;AAC7F;AAEA,SAAS,sBAAsB,QAA8B;AAC3D,QAAM,QAAkB,CAAC,SAAS;AAClC,QAAM,KAAK,WAAW,OAAO,QAAQ,MAAM,EAAE;AAC7C,QAAM,KAAK,iBAAiB,OAAO,UAAU,EAAE;AAC/C,QAAM,KAAK,iBAAiB,OAAO,cAAc,MAAM,EAAE;AACzD,QAAM,KAAK,kBAAkB,OAAO,eAAe,MAAM,EAAE;AAC3D,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,mBAAmB,SAAiB,KAAqB;AAChE,QAAM,aAAa,QAAQ,MAAM,IAAI,OAAO,IAAI,GAAG,UAAU,GAAG,CAAC;AACjE,MAAI,CAAC,YAAY;AACf,WAAO,QAAQ,QAAQ,QAAQ,EAAE;AAAA,EACnC;AAEA,QAAM,WAAW,QAAQ,QAAQ,WAAW,CAAC,CAAC;AAC9C,QAAM,SAAS,QAAQ,MAAM,GAAG,QAAQ;AACxC,QAAM,QAAQ,QAAQ,MAAM,WAAW,WAAW,CAAC,EAAE,MAAM;AAC3D,QAAM,YAAY,MAAM,MAAM,IAAI;AAClC,MAAI,SAAS;AAEb,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,UAAM,OAAO,UAAU,CAAC;AACxB,QAAI,KAAK,KAAK,MAAM,IAAI;AACtB,eAAS,IAAI;AACb;AAAA,IACF;AACA,QAAI,KAAK,SAAS,KAAK,KAAK,CAAC,MAAM,KAAK;AACtC;AAAA,IACF;AACA,aAAS,IAAI;AAAA,EACf;AAEA,UAAQ,SAAS,UAAU,MAAM,MAAM,EAAE,KAAK,IAAI,GAAG,QAAQ,QAAQ,EAAE;AACzE;AAEA,SAAS,0BACP,OACA,WACe;AACf,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,WAAW,OAAO,KAAK,CAAC;AACzC,MAAI,CAAC,WAAW,QAAQ,GAAG;AACzB,YAAQ;AAAA,MACN,sBAAsB,SAAS,8BAA8B,KAAK;AAAA,IACpE;AACA,WAAO;AAAA,EACT;AAEA,SAAOA,SAAQ,QAAQ;AACzB;AAEA,eAAsB,kBAAkB,UAAuC;AAC7E,QAAM,aAAaA,SAAQ,YAAY,GAAG,WAAW;AACrD,QAAM,cAAc,sBAAsB,QAAQ;AAElD,MAAI,CAAE,MAAM,WAAW,UAAU,GAAI;AAEnC,UAAM,UAAU;AAAA;AAAA;AAAA,EAAuD,WAAW;AAAA;AAAA;AAClF,UAAM,eAAe,YAAY,OAAO;AACxC;AAAA,EACF;AAEA,QAAM,WAAW,MAAMD,UAAS,YAAY,OAAO;AACnD,QAAM,UAAU,SAAS,MAAM,2BAA2B;AAC1D,MAAI,CAAC,SAAS;AAEZ,UAAM,UAAU;AAAA;AAAA,EAAwB,WAAW;AAAA;AAAA,EAAU,QAAQ;AACrE,UAAM,eAAe,YAAY,OAAO;AACxC;AAAA,EACF;AAEA,QAAM,UAAU,QAAQ,CAAC;AACzB,QAAM,mBAAmB,SAAS,MAAM,QAAQ,CAAC,EAAE,MAAM;AAGzD,QAAM,gBAAgB,QAAQ,MAAM,iBAAiB;AACrD,MAAI;AACJ,MAAI,eAAe;AACjB,UAAM,WAAW,QAAQ,QAAQ,cAAc,CAAC,CAAC;AACjD,UAAM,SAAS,QAAQ,MAAM,GAAG,QAAQ;AACxC,UAAM,QAAQ,QAAQ,MAAM,WAAW,cAAc,CAAC,EAAE,MAAM;AAE9D,UAAM,YAAY,MAAM,MAAM,IAAI;AAClC,QAAI,SAAS;AACb,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,YAAM,OAAO,UAAU,CAAC;AACxB,UAAI,KAAK,KAAK,MAAM,IAAI;AAAE,iBAAS,IAAI;AAAG;AAAA,MAAU;AACpD,UAAI,KAAK,SAAS,KAAK,KAAK,CAAC,MAAM,IAAK;AACxC,eAAS,IAAI;AAAA,IACf;AACA,gBAAY,SAAS,UAAU,MAAM,MAAM,EAAE,KAAK,IAAI;AAAA,EACxD,OAAO;AACL,gBAAY;AAAA,EACd;AAGA,cAAY,UAAU,QAAQ,QAAQ,EAAE;AAExC,QAAM,aAAa;AAAA,EAAQ,SAAS;AAAA,EAAK,WAAW;AAAA,KAAQ,gBAAgB;AAC5E,QAAM,eAAe,YAAY,UAAU;AAC7C;AAEA,eAAsB,qBAAoC;AACxD,QAAM,aAAaC,SAAQ,YAAY,GAAG,WAAW;AACrD,MAAI,CAAE,MAAM,WAAW,UAAU,EAAI;AAErC,QAAM,WAAW,MAAMD,UAAS,YAAY,OAAO;AACnD,QAAM,UAAU,SAAS,MAAM,2BAA2B;AAC1D,MAAI,CAAC,QAAS;AAEd,QAAM,UAAU,QAAQ,CAAC;AACzB,QAAM,mBAAmB,SAAS,MAAM,QAAQ,CAAC,EAAE,MAAM;AACzD,QAAM,YAAY,mBAAmB,SAAS,UAAU;AAExD,QAAM,aAAa;AAAA,EAAQ,SAAS;AAAA,KAAQ,gBAAgB;AAC5D,QAAM,eAAe,YAAY,UAAU;AAC7C;AAEA,eAAsB,wBACpB,cACe;AACf,QAAM,aAAaC,SAAQ,YAAY,GAAG,WAAW;AACrD,QAAM,mBAAsC;AAAA,IAC1C,IAAI,MAAM,WAAW,GAAG;AAAA,IACxB,GAAG;AAAA,EACL;AAEA,QAAM,mBAAmB,2BAA2B,gBAAgB;AACpE,QAAM,WAAW,MAAM,WAAW,UAAU,IACxC,MAAMD,UAAS,YAAY,OAAO,IAClC,aAAa,EAAE,mBAAmB,kBAAkB,EAAE,CAAC;AAE3D,QAAM,UAAU,SAAS,MAAM,2BAA2B;AAC1D,MAAI,CAAC,SAAS;AACZ,UAAM,UAAU;AAAA;AAAA,qBAA2C,kBAAkB,CAAC;AAAA,EAAK,oBAAoB,EAAE;AAAA;AAAA,EAAU,QAAQ;AAC3H,UAAM,eAAe,YAAY,QAAQ,QAAQ,WAAW,OAAO,CAAC;AACpE;AAAA,EACF;AAEA,QAAM,UAAU,QAAQ,CAAC;AACzB,QAAM,mBAAmB,SAAS,MAAM,QAAQ,CAAC,EAAE,MAAM;AACzD,QAAM,YAAY,mBAAmB,SAAS,cAAc;AAC5D,QAAM,QAAQ,mBACV,GAAG,SAAS;AAAA,EAAK,gBAAgB,GAAG,QAAQ,QAAQ,EAAE,IACtD;AACJ,QAAM,eAAe,MAAM,QAAQ,QAAQ,EAAE;AAC7C,QAAM,aAAa;AAAA,EAAQ,YAAY;AAAA,KAAQ,gBAAgB;AAC/D,QAAM,eAAe,YAAY,UAAU;AAC7C;AAEA,eAAsB,uBACpB,YACe;AACf,QAAM,aAAaC,SAAQ,YAAY,GAAG,WAAW;AACrD,QAAM,iBAAmC;AAAA,IACvC,IAAI,MAAM,WAAW,GAAG;AAAA,IACxB,GAAG;AAAA,EACL;AAEA,QAAM,kBAAkB,0BAA0B,cAAc;AAChE,QAAM,WAAW,MAAM,WAAW,UAAU,IACxC,MAAMD,UAAS,YAAY,OAAO,IAClC,aAAa,EAAE,mBAAmB,kBAAkB,EAAE,CAAC;AAE3D,QAAM,UAAU,SAAS,MAAM,2BAA2B;AAC1D,MAAI,CAAC,SAAS;AACZ,UAAM,UAAU;AAAA;AAAA,qBAA2C,kBAAkB,CAAC;AAAA,EAAK,eAAe;AAAA;AAAA,EAAU,QAAQ;AACpH,UAAM,eAAe,YAAY,QAAQ,QAAQ,WAAW,OAAO,CAAC;AACpE;AAAA,EACF;AAEA,QAAM,UAAU,QAAQ,CAAC;AACzB,QAAM,mBAAmB,SAAS,MAAM,QAAQ,CAAC,EAAE,MAAM;AACzD,QAAM,YAAY,mBAAmB,SAAS,YAAY;AAC1D,QAAM,QAAQ,GAAG,SAAS;AAAA,EAAK,eAAe,GAAG,QAAQ,QAAQ,EAAE;AACnE,QAAM,eAAe,MAAM,QAAQ,QAAQ,EAAE;AAC7C,QAAM,aAAa;AAAA,EAAQ,YAAY;AAAA,KAAQ,gBAAgB;AAC/D,QAAM,eAAe,YAAY,UAAU;AAC7C;AAEA,eAAsB,mBACpB,QACe;AACf,QAAM,aAAaC,SAAQ,YAAY,GAAG,WAAW;AACrD,QAAM,WAAW,MAAM,WAAW,GAAG;AACrC,QAAM,aAA2B;AAAA,IAC/B,MAAM,SAAS,QAAQ;AAAA,IACvB,YAAY,SAAS,cAAc;AAAA,IACnC,YAAY,SAAS,cAAc;AAAA,IACnC,aAAa,SAAS,eAAe;AAAA,IACrC,GAAG;AAAA,EACL;AAEA,QAAM,cAAc,sBAAsB,UAAU;AACpD,QAAM,WAAW,MAAM,WAAW,UAAU,IACxC,MAAMD,UAAS,YAAY,OAAO,IAClC,aAAa,EAAE,mBAAmB,kBAAkB,EAAE,CAAC;AAE3D,QAAM,UAAU,SAAS,MAAM,2BAA2B;AAC1D,MAAI,CAAC,SAAS;AACZ,UAAM,UAAU;AAAA;AAAA,qBAA2C,kBAAkB,CAAC;AAAA,EAAK,WAAW;AAAA;AAAA,EAAU,QAAQ;AAChH,UAAM,eAAe,YAAY,QAAQ,QAAQ,WAAW,OAAO,CAAC;AACpE;AAAA,EACF;AAEA,QAAM,UAAU,QAAQ,CAAC;AACzB,QAAM,mBAAmB,SAAS,MAAM,QAAQ,CAAC,EAAE,MAAM;AACzD,QAAM,YAAY,mBAAmB,SAAS,QAAQ;AACtD,QAAM,QAAQ,GAAG,SAAS;AAAA,EAAK,WAAW,GAAG,QAAQ,QAAQ,EAAE;AAC/D,QAAM,eAAe,MAAM,QAAQ,QAAQ,EAAE;AAC7C,QAAM,aAAa;AAAA,EAAQ,YAAY;AAAA,KAAQ,gBAAgB;AAC/D,QAAM,eAAe,YAAY,UAAU;AAC7C;AAOA,eAAsB,aAAqC;AACzD,QAAM,aAAaC,SAAQ,YAAY,GAAG,WAAW;AACrD,MAAI,CAAE,MAAM,WAAW,UAAU,GAAI;AACnC,WAAO,EAAE,GAAG,eAAe;AAAA,EAC7B;AAEA,MAAI,CAAC,oBAAoB,IAAI,UAAU,GAAG;AACxC,wBAAoB,IAAI,UAAU;AAClC,UAAM,oBAAoB,UAAU;AAAA,EACtC;AAEA,QAAM,UAAU,MAAMD,UAAS,YAAY,OAAO;AAClD,QAAM,KAAK,iBAAiB,OAAO;AAEnC,MAAI,OAAO,KAAK,EAAE,EAAE,WAAW,GAAG;AAChC,YAAQ,KAAK,yEAAyE;AACtF,WAAO,EAAE,GAAG,eAAe;AAAA,EAC7B;AAEA,MAAI,aAAa,GAAG,mBAAmB,IACnC,WAAW,OAAO,GAAG,mBAAmB,CAAC,CAAC,IAC1C,eAAe;AACnB,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,YAAQ;AAAA,MACN,kEAAkE,GAAG,mBAAmB,CAAC;AAAA,IAC3F;AACA,iBAAa,eAAe;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL,SAAS,GAAG,SAAS,KAAK,eAAe;AAAA,IACzC,mBAAmB;AAAA,IACnB,YAAY;AAAA,MACV,WAAW,GAAG,sBAAsB,MAAM;AAAA,IAC5C;AAAA,IACA,eAAe;AAAA,MACb,YACG,GAAG,0BAA0B,KAC9B,eAAe,cAAc;AAAA,MAC/B,aACE,GAAG,2BAA2B,MAAM,UACpC,eAAe,cAAc;AAAA,IACjC;AAAA,IACA,cAAc;AAAA,MACZ,iBAAiB;AAAA,QACf,GAAG,8BAA8B;AAAA,QACjC;AAAA,MACF;AAAA,MACA,gBAAgB;AAAA,QACd,GAAG,6BAA6B;AAAA,QAChC;AAAA,MACF;AAAA,MACA,sBAAsB;AAAA,QACpB,GAAG,mCAAmC;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAAA,IACA,QAAQ,GAAG,aAAa,KAAK,GAAG,mBAAmB,IAC/C;AAAA,MACE,MAAM,GAAG,aAAa,KAAK,GAAG,aAAa,MAAM,SAAS,GAAG,aAAa,IAAI;AAAA,MAC9E,YAAY,GAAG,mBAAmB,KAAK;AAAA,MACvC,YAAY,GAAG,mBAAmB,KAAK,GAAG,mBAAmB,MAAM,SAAS,GAAG,mBAAmB,IAAI;AAAA,MACtG,aAAa,GAAG,oBAAoB,KAAK,GAAG,oBAAoB,MAAM,SAAS,GAAG,oBAAoB,IAAI;AAAA,IAC5G,IACA;AAAA,IACJ,UAAU,kBAAkB,OAAO;AAAA,IACnC,OAAO;AAAA,EACT;AACF;AAjlBA,IAsFM,gBAqbA;AA3gBN,IAAAE,eAAA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AAiFA,IAAM,iBAAgC;AAAA,MACpC,SAAS;AAAA,MACT,mBAAmB,kBAAkB;AAAA,MACrC,YAAY;AAAA,QACV,WAAW;AAAA,MACb;AAAA,MACA,eAAe;AAAA,QACb,YAAY;AAAA,QACZ,aAAa;AAAA,MACf;AAAA,MACA,cAAc;AAAA,QACZ,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,QAChB,sBAAsB;AAAA,MACxB;AAAA,MACA,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,OAAO;AAAA,IACT;AAmaA,IAAM,sBAAsB,oBAAI,IAAY;AAAA;AAAA;;;AC3gB5C,IAIa,kBAoBA;AAxBb;AAAA;AAAA;AAIO,IAAM,mBAAmB;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAaO,IAAM,4BAAiD,oBAAI,IAAI;AAAA,MACpE;AAAA,MACA;AAAA,IACF,CAAC;AAAA;AAAA;;;ACOM,SAAS,qBACd,aACqB;AACrB,QAAM,QAAQ,oBAAI,IAAoB;AACtC,aAAW,KAAK,aAAa;AAC3B,UAAM,IAAI,GAAG,EAAE,IAAI,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE;AAAA,EAC1C;AACA,SAAO;AACT;AAYO,SAAS,gBACd,OACA,SACA,OACyB;AAEzB,MAAI,CAAC,SAAS,UAAU,0BAA0B;AAChD,WAAO,wBAAwB,IAAI,OAAO,KAAK;AAAA,EACjD;AAEA,SAAO,MAAM,IAAI,OAAO,KAAK,MAAM,IAAI,GAAG,KAAK,IAAI,OAAO,EAAE,KAAK;AACnE;AAjEA,IAQa,yBAWA;AAnBb;AAAA;AAAA;AACA;AAOO,IAAM,0BAA0B,oBAAI,IAAoB;AAAA,MAC7D,CAAC,SAAS,aAAa;AAAA,MACvB,CAAC,SAAS,SAAS;AAAA,MACnB,CAAC,WAAW,aAAa;AAAA,MACzB,CAAC,UAAU,QAAQ;AAAA,MACnB,CAAC,YAAY,WAAW;AAAA,MACxB,CAAC,QAAQ,QAAQ;AAAA,MACjB,CAAC,UAAU,aAAa;AAAA,IAC1B,CAAC;AAGM,IAAM,2BAA2B,oBAAI,IAAoB;AAAA,MAC9D,CAAC,iBAAiB,aAAa;AAAA,MAC/B,CAAC,iBAAiB,SAAS;AAAA,MAC3B,CAAC,qBAAqB,SAAS;AAAA,MAC/B,CAAC,sBAAsB,QAAQ;AAAA,MAC/B,CAAC,wBAAwB,WAAW;AAAA,MACpC,CAAC,oBAAoB,QAAQ;AAAA,MAC7B,CAAC,mBAAmB,aAAa;AAAA,MACjC,CAAC,gBAAgB,aAAa;AAAA,MAC9B,CAAC,mBAAmB,WAAW;AAAA,MAC/B,CAAC,eAAe,QAAQ;AAAA,MACxB,CAAC,oBAAoB,aAAa;AAAA,MAClC,CAAC,iBAAiB,aAAa;AAAA,IACjC,CAAC;AAAA;AAAA;;;AC9BD,SAASC,oBAAmB,aAAuC;AACjE,QAAM,QAAQ,YAAY,MAAM,uBAAuB;AACvD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AACA,QAAM,mBAAmB,MAAM,CAAC;AAChC,QAAM,OAAO,YAAY,MAAM,MAAM,CAAC,EAAE,MAAM;AAC9C,SAAO,CAAC,kBAAkB,IAAI;AAChC;AAEA,SAASC,kBAAiB,KAA4B;AACpD,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,YAAY,OAAQ,QAAO;AAC/B,MACG,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,KAC/C,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAChD;AACA,WAAO,QAAQ,MAAM,GAAG,EAAE;AAAA,EAC5B;AACA,SAAO;AACT;AAEA,SAAS,eAAe,aAA+B;AACrD,QAAM,cAAc,YAAY,MAAM,wBAAwB;AAC9D,MAAI,YAAa,QAAO,CAAC;AAEzB,QAAM,UAAoB,CAAC;AAC3B,QAAM,aAAa,YAAY,MAAM,sCAAsC;AAC3E,MAAI,YAAY;AACd,UAAM,QAAQ,WAAW,CAAC,EAAE,SAAS,iBAAiB;AACtD,eAAW,QAAQ,OAAO;AACxB,cAAQ,KAAK,KAAK,CAAC,EAAE,KAAK,CAAC;AAAA,IAC7B;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,aAA+B;AACjD,QAAM,cAAc,YAAY,MAAM,oBAAoB;AAC1D,MAAI,YAAa,QAAO,CAAC;AAEzB,QAAM,UAAoB,CAAC;AAC3B,QAAM,aAAa,YAAY,MAAM,kCAAkC;AACvE,MAAI,YAAY;AACd,UAAM,QAAQ,WAAW,CAAC,EAAE,SAAS,iBAAiB;AACtD,eAAW,QAAQ,OAAO;AACxB,cAAQ,KAAK,KAAK,CAAC,EAAE,KAAK,CAAC;AAAA,IAC7B;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAASC,kBAAiB,aAAmC;AAC3D,QAAM,cAAc,YAAY,MAAM,0BAA0B;AAChE,MAAI,YAAa,QAAO,CAAC;AAEzB,QAAM,UAAwB,CAAC;AAC/B,QAAM,aAAa,YAAY;AAAA,IAC7B;AAAA,EACF;AACA,MAAI,CAAC,WAAY,QAAO,CAAC;AAEzB,QAAM,aAAa,WAAW,CAAC,EAAE,MAAM,WAAW,EAAE,OAAO,OAAO;AAClE,aAAW,SAAS,YAAY;AAC9B,UAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,UAAM,QAAgC,CAAC;AACvC,eAAW,QAAQ,OAAO;AACxB,YAAM,WAAW,KAAK,QAAQ,GAAG;AACjC,UAAI,WAAW,EAAG;AAClB,YAAM,MAAM,KAAK,MAAM,GAAG,QAAQ,EAAE,KAAK,EAAE,QAAQ,SAAS,EAAE;AAC9D,YAAM,QAAQ,KAAK,MAAM,WAAW,CAAC,EAAE,KAAK;AAC5C,UAAI,OAAO,OAAO;AAChB,cAAM,GAAG,IAAI;AAAA,MACf;AAAA,IACF;AACA,QAAI,MAAM,QAAQ,KAAK,MAAM,IAAI,KAAK,MAAM,KAAK,GAAG;AAClD,cAAQ,KAAK;AAAA,QACX,QAAQ,MAAM,QAAQ;AAAA,QACtB,IAAI,MAAM,IAAI;AAAA,QACd,KAAK,MAAM,KAAK;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,aAAgC;AACtD,QAAM,WAAsB;AAAA,IAC1B,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AAEA,QAAM,SAAS,CAAC,cAAc,gBAAgB,UAAU,cAAc;AACtE,aAAW,SAAS,QAAQ;AAC1B,UAAM,QAAQ,YAAY,MAAM,IAAI,OAAO,QAAQ,KAAK,cAAc,GAAG,CAAC;AAC1E,QAAI,OAAO;AACT,eAAS,KAAK,IAAID,kBAAiB,MAAM,CAAC,CAAC;AAAA,IAC7C;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,UAAU,aAA+B;AAChD,QAAM,cAAc,YAAY,MAAM,mBAAmB;AACzD,MAAI,YAAa,QAAO,CAAC;AAEzB,QAAM,UAAoB,CAAC;AAC3B,QAAM,aAAa,YAAY,MAAM,iCAAiC;AACtE,MAAI,YAAY;AACd,UAAM,QAAQ,WAAW,CAAC,EAAE,SAAS,iBAAiB;AACtD,eAAW,QAAQ,OAAO;AACxB,cAAQ,KAAK,KAAK,CAAC,EAAE,KAAK,CAAC;AAAA,IAC7B;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,2BAA2B,aAA4C;AACrF,QAAM,CAAC,WAAW,IAAID,oBAAmB,WAAW;AAEpD,WAASG,UAAS,KAA4B;AAC5C,UAAM,QAAQ,YAAY,MAAM,IAAI,OAAO,IAAI,GAAG,cAAc,GAAG,CAAC;AACpE,QAAI,CAAC,MAAO,QAAO;AACnB,WAAOF,kBAAiB,MAAM,CAAC,CAAC;AAAA,EAClC;AAEA,SAAO;AAAA,IACL,IAAIE,UAAS,IAAI,KAAK;AAAA,IACtB,MAAMA,UAAS,MAAM,KAAK;AAAA,IAC1B,OAAOA,UAAS,OAAO,KAAK;AAAA,IAC5B,SAASA,UAAS,SAAS;AAAA,IAC3B,MAAMA,UAAS,MAAM;AAAA,IACrB,QAAQA,UAAS,QAAQ,KAAK;AAAA,IAC9B,UAAWA,UAAS,UAAU,KAAK;AAAA,IACnC,SAASA,UAAS,SAAS,KAAK;AAAA,IAChC,SAASA,UAAS,SAAS,KAAK;AAAA,IAChC,UAAUA,UAAS,UAAU;AAAA,IAC7B,aAAaD,kBAAiB,WAAW;AAAA,IACzC,WAAW,eAAe,WAAW;AAAA,IACrC,OAAO,WAAW,WAAW;AAAA,IAC7B,eAAeC,UAAS,eAAe;AAAA,IACvC,WAAW,eAAe,WAAW;AAAA,IACrC,MAAM,UAAU,WAAW;AAAA,EAC7B;AACF;AAEA,SAAS,gBAAgB,OAA8B;AACrD,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,sBAAsB,KAAK,KAAK,GAAG;AACrC,WAAO,IAAI,KAAK;AAAA,EAClB;AAEA,MAAI,sBAAsB,KAAK,KAAK,KAAK,UAAU,KAAK,KAAK,KAAK,UAAU,IAAI;AAC9E,UAAM,UAAU,MAAM,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK;AAChE,WAAO,IAAI,OAAO;AAAA,EACpB;AACA,SAAO;AACT;AAEO,SAAS,qBACd,aACA,SACQ;AACR,MAAI,SAAS;AAEb,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,QAAI,UAAU,OAAW;AACzB,UAAM,YAAY,gBAAgB,KAAsB;AACxD,UAAM,aAAa,IAAI,OAAO,KAAK,GAAG,aAAa,GAAG;AACtD,QAAI,WAAW,KAAK,MAAM,GAAG;AAC3B,eAAS,OAAO,QAAQ,YAAY,MAAM,SAAS,EAAE;AAAA,IACvD;AAAA,EACF;AAEA,SAAO;AACT;AAnLA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,WAAAC,gBAAe;AACxB,SAAS,YAAAC,iBAAgB;AAOzB,SAAS,sBAAsB,YAAoB,gBAAgC;AACjF,SAAOD,SAAQ,YAAY,eAAe,gBAAgB,eAAe;AAC3E;AAEA,eAAe,eACb,UACkE;AAClE,MAAI,CAAE,MAAM,WAAW,QAAQ,GAAI;AACjC,UAAM,IAAI,MAAM,8BAA8B,QAAQ,EAAE;AAAA,EAC1D;AACA,QAAM,UAAU,MAAMC,UAAS,UAAU,OAAO;AAChD,QAAM,cAAc,2BAA2B,OAAO;AACtD,SAAO,EAAE,SAAS,YAAY;AAChC;AAEA,eAAe,kBACb,YACA,WACAC,mBACkD;AAClD,QAAM,YAAYA,qBAAoB,oBAAI,IAAI,CAAC,WAAW,CAAC;AAC3D,QAAM,QAAkB,CAAC;AACzB,aAAW,WAAW,WAAW;AAC/B,UAAM,UAAU,sBAAsB,YAAY,OAAO;AACzD,QAAI,CAAE,MAAM,WAAW,OAAO,GAAI;AAChC,YAAM,KAAK,GAAG,OAAO,mBAAmB;AACxC;AAAA,IACF;AACA,UAAM,aAAa,MAAMD,UAAS,SAAS,OAAO;AAClD,UAAM,iBAAiB,2BAA2B,UAAU;AAC5D,QAAI,CAAC,UAAU,IAAI,eAAe,MAAM,GAAG;AACzC,YAAM,KAAK,GAAG,OAAO,aAAa,eAAe,MAAM,GAAG;AAAA,IAC5D;AAAA,EACF;AACA,SAAO,EAAE,WAAW,MAAM,WAAW,GAAG,MAAM;AAChD;AASA,eAAsB,kBACpB,YACA,gBACA,SACA,UAA6B,CAAC,GACH;AAC3B,QAAM,WAAW,sBAAsB,YAAY,cAAc;AACjE,QAAM,EAAE,SAAS,YAAY,IAAI,MAAM,eAAe,QAAQ;AAE9D,QAAM,eAAe,gBAAgB,YAAY,QAAQ,SAAS,QAAQ,eAAe;AAEzF,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,oBAAoB,OAAO,qBAAqB,cAAc;AAAA,MACvE,YAAY,YAAY;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,WAAqB,CAAC;AAE5B,MAAI,YAAY,WAAW,YAAY,UAAU,SAAS,GAAG;AAC3D,UAAM,WAAW,MAAM,kBAAkB,YAAY,YAAY,WAAW,QAAQ,gBAAgB;AACpG,QAAI,CAAC,SAAS,WAAW;AACvB,eAAS,KAAK,qCAAqC,SAAS,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,IAChF;AAAA,EACF;AAEA,QAAM,UAAqG;AAAA,IACzG,QAAQ;AAAA,IACR,SAAS,aAAa;AAAA,EACxB;AAEA,MAAI,YAAY,WAAW,QAAQ,SAAS,CAAC,YAAY,UAAU;AACjE,YAAQ,WAAW,QAAQ;AAAA,EAC7B;AACA,MAAI,YAAY,SAAS;AACvB,YAAQ,gBAAgB,QAAQ,UAAU;AAAA,EAC5C;AACA,MAAI,YAAY,WAAW;AACzB,YAAQ,gBAAgB;AAAA,EAC1B;AAEA,QAAM,iBAAiB,qBAAqB,SAAS,OAAO;AAC5D,QAAM,eAAe,UAAU,cAAc;AAE7C,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS,eAAe,cAAc,mBAAmB,YAAY,MAAM,OAAO,YAAY;AAAA,IAC9F,YAAY,YAAY;AAAA,IACxB,UAAU;AAAA,IACV,UAAU,SAAS,SAAS,IAAI,WAAW;AAAA,EAC7C;AACF;AAEA,eAAsB,cACpB,YACA,gBACA,OAC2B;AAC3B,QAAM,WAAW,sBAAsB,YAAY,cAAc;AACjE,QAAM,EAAE,SAAS,YAAY,IAAI,MAAM,eAAe,QAAQ;AAE9D,QAAM,UAAqG;AAAA,IACzG,UAAU;AAAA,IACV,SAAS,aAAa;AAAA,EACxB;AAEA,QAAM,iBAAiB,qBAAqB,SAAS,OAAO;AAC5D,QAAM,eAAe,UAAU,cAAc;AAE7C,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS,eAAe,cAAc,kBAAkB,KAAK;AAAA,IAC7D,YAAY,YAAY;AAAA,EAC1B;AACF;AAMA,eAAsB,uBACpB,eACA,SACA,UAAkC,CAAC,GACR;AAC3B,QAAM,WAAWD,SAAQ,eAAe,eAAe;AACvD,QAAM,EAAE,SAAS,YAAY,IAAI,MAAM,eAAe,QAAQ;AAE9D,QAAM,eAAe,gBAAgB,YAAY,QAAQ,SAAS,QAAQ,eAAe;AACzF,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,oBAAoB,OAAO,qBAAqB,YAAY,QAAQ,aAAa;AAAA,MAC1F,YAAY,YAAY;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,WAAqB,CAAC;AAE5B,MAAI,YAAY,WAAW,CAAC,QAAQ,cAAc,YAAY,UAAU,SAAS,GAAG;AAElF,UAAM,aAAaA,SAAQ,eAAe,MAAM,IAAI;AACpD,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA,YAAY;AAAA,MACZ,QAAQ;AAAA,IACV;AACA,QAAI,CAAC,SAAS,WAAW;AACvB,eAAS,KAAK,qCAAqC,SAAS,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,IAChF;AAAA,EACF;AAEA,QAAM,UAAqG;AAAA,IACzG,QAAQ;AAAA,IACR,SAAS,aAAa;AAAA,EACxB;AAEA,MAAI,YAAY,WAAW,QAAQ,SAAS,CAAC,YAAY,UAAU;AACjE,YAAQ,WAAW,QAAQ;AAAA,EAC7B;AACA,MAAI,YAAY,SAAS;AACvB,YAAQ,gBAAgB,QAAQ,UAAU;AAAA,EAC5C;AACA,MAAI,YAAY,WAAW;AACzB,YAAQ,gBAAgB;AAAA,EAC1B;AAEA,QAAM,iBAAiB,qBAAqB,SAAS,OAAO;AAC5D,QAAM,eAAe,UAAU,cAAc;AAE7C,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS,eAAe,YAAY,QAAQ,aAAa,mBAAmB,YAAY,MAAM,OAAO,YAAY;AAAA,IACjH,YAAY,YAAY;AAAA,IACxB,UAAU;AAAA,IACV,UAAU,SAAS,SAAS,IAAI,WAAW;AAAA,EAC7C;AACF;AAEA,eAAsB,mBACpB,eACA,OAC2B;AAC3B,QAAM,WAAWA,SAAQ,eAAe,eAAe;AACvD,QAAM,EAAE,SAAS,YAAY,IAAI,MAAM,eAAe,QAAQ;AAE9D,QAAM,UAAqG;AAAA,IACzG,UAAU;AAAA,IACV,SAAS,aAAa;AAAA,EACxB;AAEA,QAAM,iBAAiB,qBAAqB,SAAS,OAAO;AAC5D,QAAM,eAAe,UAAU,cAAc;AAE7C,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS,eAAe,YAAY,QAAQ,aAAa,kBAAkB,KAAK;AAAA,IAChF,YAAY,YAAY;AAAA,EAC1B;AACF;AArNA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AAAA;AAAA;;;ACLA;AAAA;AAAA;AAQA;AACA;AACA;AACA;AAAA;AAAA;;;ACXA,SAAS,WAAAG,gBAAe;AACxB,SAAS,WAAAC,UAAS,YAAAC,iBAAgB;AAYlC,eAAsB,sBACpBC,cACAC,iBACA,IACoC;AACpC,MAAI,kBAA6C;AACjD,MAAI,eAA0C;AAG9C,QAAM,gBAAgBJ,SAAQI,iBAAgB,EAAE;AAChD,QAAM,iBAAiBJ,SAAQ,eAAe,eAAe;AAC7D,MAAI,MAAM,WAAW,cAAc,GAAG;AACpC,sBAAkB;AAAA,MAChB,eAAe;AAAA,MACf,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB;AAAA,MACA,YAAY;AAAA,IACd;AAAA,EACF;AAGA,MAAI,MAAM,WAAWG,YAAW,GAAG;AACjC,QAAI;AACF,YAAM,WAAW,MAAMF,SAAQE,cAAa,EAAE,eAAe,KAAK,CAAC;AACnE,iBAAW,KAAK,UAAU;AACxB,YAAI,CAAC,EAAE,YAAY,EAAG;AACtB,YAAI,EAAE,KAAK,WAAW,GAAG,KAAK,EAAE,KAAK,WAAW,GAAG,EAAG;AACtD,cAAM,kBAAkBH,SAAQG,cAAa,EAAE,MAAM,aAAa;AAClE,YAAI,CAAE,MAAM,WAAW,eAAe,EAAI;AAE1C,cAAM,UAAU,MAAMF,SAAQ,iBAAiB,EAAE,eAAe,KAAK,CAAC;AACtE,mBAAW,KAAK,SAAS;AACvB,cAAI,CAAC,EAAE,YAAY,EAAG;AACtB,gBAAM,QAAQD,SAAQ,iBAAiB,EAAE,MAAM,eAAe;AAC9D,cAAI,CAAE,MAAM,WAAW,KAAK,EAAI;AAEhC,cAAI;AACF,kBAAM,UAAU,MAAME,UAAS,OAAO,OAAO;AAC7C,kBAAM,CAAC,EAAE,IAAI,mBAAmB,OAAO;AACvC,kBAAM,SAAS,SAAS,IAAI,IAAI;AAChC,gBAAI,WAAW,IAAI;AACjB,6BAAe;AAAA,gBACb,eAAeF,SAAQ,iBAAiB,EAAE,IAAI;AAAA,gBAC9C,aAAa,EAAE;AAAA,gBACf,gBAAgB,EAAE;AAAA,gBAClB;AAAA,gBACA,YAAY;AAAA,cACd;AACA;AAAA,YACF;AAAA,UACF,QAAQ;AAAA,UAER;AAAA,QACF;AACA,YAAI,aAAc;AAAA,MACpB;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI,mBAAmB,cAAc;AACnC,YAAQ;AAAA,MACN,2BAA2B,EAAE;AAAA,IAC/B;AACA,WAAO;AAAA,EACT;AAEA,SAAO,mBAAmB,gBAAgB;AAC5C;AAnFA;AAAA;AAAA;AAEA;AACA;AAAA;AAAA;;;AC4LA,eAAe,mBAAoD;AACjE,QAAM,SAAS,MAAM,gBAAgB;AAErC,SAAO,OAAO,SAAS,IAAI,CAAC,MAAM;AAChC,UAAM,WAAW,qBAAqB,EAAE,EAAE;AAC1C,WAAO;AAAA,MACL,QAAQ,EAAE;AAAA,MACV,SAAS,EAAE,eAAe,UAAU,WAAW,6BAA6B,EAAE,KAAK;AAAA,MACnF,SAAS,UAAU,WAAW,OAAO,EAAE,EAAE,8BAA8B,EAAE,KAAK;AAAA,IAChF;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,mBAA0C;AAC9D,SAAO;AAAA,IACL,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,eAAe;AAAA,MACb,SACE;AAAA,MACF,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,cAAc;AAAA,MACZ;AAAA,QACE,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,UAAU;AAAA,IACV,aAAa,MAAM,iBAAiB;AAAA,IACpC,gBAAgB;AAAA,MACd;AAAA,QACE,OAAO;AAAA,QACP,OAAO,CAAC,cAAc,YAAY,WAAW;AAAA,QAC7C,aACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO,CAAC,iBAAiB,kCAAkC,eAAe;AAAA,QAC1E,aACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO,CAAC,cAAc,oBAAoB;AAAA,QAC1C,aACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO,CAAC,cAAc,yBAAyB,mBAAmB,qBAAqB;AAAA,QACvF,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,UAAU;AAAA,IACV,YAAY;AAAA,MACV;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,KAAK;AAAA,MACH;AAAA,QACE,UAAU;AAAA,QACV,QACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,UAAU;AAAA,QACV,QACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,UAAU;AAAA,QACV,QACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,UAAU;AAAA,QACV,QACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,UAAU;AAAA,QACV,QACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,UAAU;AAAA,QACV,QACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,UAAU;AAAA,QACV,QACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,UAAU;AAAA,QACV,QACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,uBAAuB;AAAA,MACrB;AAAA,QACE,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS,aAAa,CAAC;AAAA,QACvB,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS,aAAa,CAAC;AAAA,MACzB;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS,aAAa,CAAC;AAAA,MACzB;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,EAAE,OAAO,YAAY,MAAM,IAAI;AAAA,MAC/B,EAAE,OAAO,qBAAqB,MAAM,YAAY;AAAA,MAChD,EAAE,OAAO,qBAAqB,MAAM,eAAe;AAAA,MACnD,EAAE,OAAO,mBAAmB,MAAM,aAAa;AAAA,MAC/C,EAAE,OAAO,WAAW,MAAM,WAAW;AAAA,MACrC,EAAE,OAAO,kBAAkB,MAAM,kBAAkB;AAAA,MACnD,EAAE,OAAO,aAAa,MAAM,aAAa;AAAA,MACzC,EAAE,OAAO,YAAY,MAAM,YAAY;AAAA,MACvC,EAAE,OAAO,kBAAkB,MAAM,kBAAkB;AAAA,IACrD;AAAA,EACF;AACF;AAlcA,IAQM,cAyHA,UAmCA;AApKN;AAAA;AAAA;AAMA;AAEA,IAAM,eAA8B;AAAA;AAAA,MAElC;AAAA,QACE,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA;AAAA,MAGA;AAAA,QACE,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA;AAAA,MAGA;AAAA,QACE,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA;AAAA,MAGA;AAAA,QACE,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA;AAAA,MAGA;AAAA,QACE,SAAS;AAAA,QACT,aACE;AAAA,QACF,SACE;AAAA,MACJ;AAAA;AAAA,MAGA;AAAA,QACE,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,IACF;AAEA,IAAM,WAAgC;AAAA,MACpC;AAAA,QACE,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS,aAAa,CAAC;AAAA,MACzB;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS,aAAa,CAAC;AAAA,QACvB,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS,aAAa,CAAC;AAAA,MACzB;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS,aAAa,CAAC;AAAA,MACzB;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS,aAAa,CAAC;AAAA,MACzB;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS,aAAa,EAAE;AAAA,QACxB,MAAM;AAAA,MACR;AAAA,IACF;AAEA,IAAM,uBAA6E;AAAA,MACjF,SAAS;AAAA,QACP,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,MACA,aAAa;AAAA,QACX,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,MACA,SAAS;AAAA,QACP,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AAAA;AAAA;;;AC7LA,SAAS,WAAAK,UAAS,YAAAC,WAAU,cAAc;AAC1C,SAAS,WAAAC,iBAAe;AAKjB,SAAS,oBAAoB,MAAsB;AACxD,SAAO,KAAK,QAAQ,mBAAmB,GAAG;AAC5C;AAEA,SAASC,gBAAuB;AAC9B,UAAO,oBAAI,KAAK,GAAE,YAAY;AAChC;AAcO,SAAS,oBAAoB,MAAmC;AACrE,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,YAAY,KAAK,OAAO;AAAA,IACxB,eAAe,KAAK,UAAU;AAAA,IAC9B,mBAAmB,KAAK,aAAa;AAAA,EACvC;AAEA,MAAI,KAAK,QAAQ,MAAM;AACrB,UAAM,KAAK,SAAS,KAAK,IAAI,EAAE;AAAA,EACjC;AACA,MAAI,KAAK,MAAM;AACb,UAAM,KAAK,SAAS,KAAK,IAAI,EAAE;AAAA,EACjC;AACA,MAAI,KAAK,OAAO,MAAM;AACpB,UAAM,KAAK,QAAQ,KAAK,GAAG,EAAE;AAAA,EAC/B;AACA,MAAI,KAAK,SAAS,KAAK,MAAM,SAAS,GAAG;AACvC,UAAM,KAAK,WAAW,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG;AAAA,EAChD;AACA,MAAI,KAAK,KAAK;AACZ,UAAM,KAAK,QAAQ,KAAK,GAAG,EAAE;AAAA,EAC/B;AAEA,MAAI,OAAO,KAAK,KAAK,SAAS,EAAE,SAAS,GAAG;AAC1C,UAAM,KAAK,YAAY;AACvB,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,KAAK,SAAS,GAAG;AACvD,YAAM,KAAK,MAAM,GAAG,kBAAkB,IAAI,OAAO,mBAAmB,IAAI,UAAU,KAAK;AAAA,IACzF;AAAA,EACF;AAEA,QAAM,KAAK,OAAO,EAAE;AACpB,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,eAAsB,gBAAgB,KAAa,SAAkC;AACnF,QAAM,OAAO,oBAAoB,OAAO;AACxC,QAAM,UAAU,GAAG;AACnB,QAAM,MAAMA,cAAa;AACzB,QAAM,UAAU,oBAAoB;AAAA,IAClC,SAAS;AAAA,IAAM,YAAY;AAAA,IAAK,eAAe;AAAA,IAAK,WAAW,CAAC;AAAA,EAClE,CAAC;AACD,QAAM,eAAeD,UAAQ,KAAK,GAAG,IAAI,KAAK,GAAG,OAAO;AACxD,SAAO;AACT;AAEA,eAAsB,iBAAiB,KAAgC;AACrE,MAAI,CAAE,MAAM,WAAW,GAAG,EAAI,QAAO,CAAC;AACtC,QAAM,UAAU,MAAMF,SAAQ,GAAG;AACjC,SAAO,QACJ,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,EAC/B,IAAI,CAAC,MAAM,EAAE,QAAQ,SAAS,EAAE,CAAC;AACtC;AAEA,eAAsB,gBAAgB,KAAa,MAA+C;AAChG,QAAM,WAAWE,UAAQ,KAAK,GAAG,oBAAoB,IAAI,CAAC,KAAK;AAC/D,MAAI,CAAE,MAAM,WAAW,QAAQ,EAAI,QAAO;AAE1C,QAAM,MAAM,MAAMD,UAAS,UAAU,OAAO;AAC5C,QAAM,CAAC,WAAW,IAAI,mBAAmB,GAAG;AAC5C,MAAI,CAAC,YAAa,QAAO;AAEzB,QAAM,UAAU,SAAS,aAAa,SAAS,KAAK;AACpD,QAAM,aAAa,SAAS,aAAa,YAAY,KAAK;AAC1D,QAAM,gBAAgB,SAAS,aAAa,gBAAgB,KAAK;AAGjE,QAAM,YAAqE,CAAC;AAC5E,QAAM,iBAAiB,YAAY,MAAM,gCAAgC;AACzE,MAAI,gBAAgB;AAClB,UAAM,gBAAgB,eAAe,CAAC,EAAE;AAAA,MACtC;AAAA,IACF;AACA,eAAW,KAAK,eAAe;AAC7B,gBAAU,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE;AAAA,IACtD;AAAA,EACF;AAEA,QAAM,YAAY,SAAS,aAAa,MAAM;AAC9C,QAAM,OAAO,cAAc,SAAS,OAAO,cAAc,UAAU,QAAQ;AAC3E,QAAM,OAAO,SAAS,aAAa,MAAM;AACzC,QAAM,WAAW,SAAS,aAAa,KAAK;AAC5C,QAAM,MAAM,WAAW,SAAS,UAAU,EAAE,IAAI;AAChD,QAAM,WAAW,SAAS,aAAa,KAAK;AAE5C,MAAI;AACJ,QAAM,aAAa,YAAY,MAAM,yBAAyB;AAC9D,MAAI,YAAY;AACd,YAAQ,WAAW,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,SAAS,EAAE,KAAK,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAAA,EAC7F;AAEA,SAAO;AAAA,IACL;AAAA,IAAS;AAAA,IAAY;AAAA,IAAe;AAAA,IACpC,GAAI,QAAQ,QAAQ,EAAE,KAAK;AAAA,IAC3B,GAAI,QAAQ,EAAE,KAAK;AAAA,IACnB,GAAI,OAAO,QAAQ,CAAC,MAAM,GAAG,KAAK,EAAE,IAAI;AAAA,IACxC,GAAI,SAAS,MAAM,SAAS,KAAK,EAAE,MAAM;AAAA,IACzC,GAAI,YAAY,EAAE,KAAK,SAAS;AAAA,EAClC;AACF;AAEA,eAAsB,cAAc,KAAa,MAA6B;AAC5E,QAAM,WAAWC,UAAQ,KAAK,GAAG,oBAAoB,IAAI,CAAC,KAAK;AAC/D,MAAI,MAAM,WAAW,QAAQ,GAAG;AAC9B,UAAM,OAAO,QAAQ;AAAA,EACvB;AACF;AAEA,eAAsB,oBAAoB,KAAa,MAA6B;AAClF,QAAM,OAAO,MAAM,gBAAgB,KAAK,IAAI;AAC5C,MAAI,CAAC,KAAM;AACX,QAAM,UAAU,oBAAoB,EAAE,GAAG,MAAM,eAAeC,cAAa,EAAE,CAAC;AAC9E,QAAM,eAAeD,UAAQ,KAAK,GAAG,oBAAoB,IAAI,CAAC,KAAK,GAAG,OAAO;AAC/E;AAEA,eAAsB,YACpB,KACA,aACA,aACA,WACA,YACe;AACf,QAAM,OAAO,MAAM,gBAAgB,KAAK,WAAW;AACnD,MAAI,CAAC,KAAM;AACX,QAAM,MAAM,GAAG,WAAW,IAAI,SAAS;AACvC,MAAI,YAAY;AACd,SAAK,UAAU,GAAG,IAAI;AAAA,EACxB,OAAO;AACL,WAAO,KAAK,UAAU,GAAG;AAAA,EAC3B;AACA,QAAM,UAAU,oBAAoB,EAAE,GAAG,KAAK,CAAC;AAC/C,QAAM,eAAeA,UAAQ,KAAK,GAAG,oBAAoB,WAAW,CAAC,KAAK,GAAG,OAAO;AACtF;AASA,eAAsB,oBACpB,KACA,SACA,MACiB;AACjB,QAAM,OAAO,oBAAoB,OAAO;AACxC,QAAM,UAAU,GAAG;AACnB,QAAM,MAAMC,cAAa;AACzB,QAAM,UAAU,oBAAoB;AAAA,IAClC,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,WAAW,CAAC;AAAA,IACZ,MAAM;AAAA,IACN,MAAM,KAAK;AAAA,IACX,KAAK,KAAK;AAAA,IACV,OAAO,KAAK;AAAA,IACZ,KAAK,KAAK;AAAA,EACZ,CAAC;AACD,QAAM,eAAeD,UAAQ,KAAK,GAAG,IAAI,KAAK,GAAG,OAAO;AACxD,SAAO;AACT;AA5LA;AAAA;AAAA;AAEA;AACA;AAAA;AAAA;;;ACHA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAC1B,SAAS,WAAAE,iBAAe;AACxB,SAAS,UAAU,WAAAC,UAAS,YAAAC,iBAAgB;AAqBrC,SAAS,iBAAuB;AACrC,UAAQ;AACV;AAaO,SAAS,oBAAoBC,SAA2B;AAC7D,SAAOA,QACJ,KAAK,EACL,MAAM,IAAI,EACV,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,EAChC,IAAI,CAAC,SAAS;AACb,UAAM,CAAC,IAAI,IAAI,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,MAAM,GAAG;AAClD,WAAO;AAAA,MACL,aAAa,SAAS,IAAI,EAAE;AAAA,MAC5B,YAAY;AAAA,MACZ,WAAW,SAAS,IAAI,EAAE;AAAA,MAC1B,SAAS;AAAA,MACT;AAAA,MACA,KAAK,SAAS,KAAK,EAAE;AAAA,IACvB;AAAA,EACF,CAAC;AACL;AAEO,SAAS,mBAAmB,YAAoB,MAA6B;AAClF,QAAM,QAAkB,CAAC;AACzB,aAAW,QAAQ,WAAW,MAAM,IAAI,GAAG;AACzC,UAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,KAAK;AACrC,QAAI,MAAM,SAAS,EAAG;AACtB,UAAM,MAAM,SAAS,MAAM,CAAC,GAAG,EAAE;AACjC,QAAI,CAAC,KAAK,IAAI,GAAG,EAAG;AACpB,UAAM,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,KAAK,QAAQ,KAAK,CAAC,CAAC;AACpE,QAAI,SAAS;AACX,YAAM,OAAO,SAAS,QAAQ,MAAM,GAAG,EAAE,IAAI,GAAI,EAAE;AACnD,UAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,SAAS,IAAI,GAAG;AACzC,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAIA,eAAsB,UAAU,KAAa,MAAiC;AAC5E,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,KAAK,KAAK,IAAI;AACvC,WAAO,OAAO,KAAK;AAAA,EACrB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,qBAAuC;AAC3D,QAAM,SAAS,MAAM,UAAU,SAAS,CAAC,MAAM,CAAC;AAChD,SAAO,OAAO,SAAS;AACzB;AAEA,eAAsB,aAAa,MAAgC;AACjE,MAAI;AACF,UAAM,KAAK,QAAQ,CAAC,eAAe,MAAM,IAAI,CAAC;AAC9C,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,cAAc,aAAyC;AAC3E,QAAMA,UAAS,MAAM,UAAU,QAAQ;AAAA,IACrC;AAAA,IAAc;AAAA,IAAM;AAAA,IAAM;AAAA,IAC1B;AAAA,IAAM;AAAA,EACR,CAAC;AACD,SAAO,oBAAoBA,OAAM;AACnC;AAEA,eAAsB,kBAAkB,SAAiB,WAAmB,GAAyB;AACnG,QAAM,MAAM,oBAAI,IAAY,CAAC,OAAO,CAAC;AACrC,MAAI,WAAW,CAAC,OAAO;AAEvB,WAAS,QAAQ,GAAG,QAAQ,YAAY,SAAS,SAAS,GAAG,SAAS;AACpE,UAAM,eAAyB,CAAC;AAChC,eAAW,OAAO,UAAU;AAC1B,YAAMA,UAAS,MAAM,UAAU,SAAS,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AAC3D,iBAAW,QAAQA,QAAO,MAAM,IAAI,GAAG;AACrC,cAAM,QAAQ,SAAS,MAAM,EAAE;AAC/B,YAAI,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,GAAG;AACpC,cAAI,IAAI,KAAK;AACb,uBAAa,KAAK,KAAK;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AACA,eAAW;AAAA,EACb;AAEA,SAAO;AACT;AAEA,eAAsB,gBAAiC;AACrD,SAAO,UAAU,QAAQ,CAAC,MAAM,MAAM,MAAM,cAAc,CAAC;AAC7D;AAEA,eAAsB,WAAW,KAAoE;AACnG,QAAM,SAAS,MAAM,UAAU,OAAO,CAAC,MAAM,KAAK,aAAa,gBAAgB,MAAM,CAAC;AACtF,MAAI,CAAC,OAAQ,QAAO,EAAE,QAAQ,MAAM,UAAU,MAAM;AAEpD,QAAM,YAAY,MAAM,UAAU,OAAO,CAAC,MAAM,KAAK,aAAa,kBAAkB,CAAC;AACrF,QAAM,SAAS,MAAM,UAAU,OAAO,CAAC,MAAM,KAAK,aAAa,WAAW,CAAC;AAE3E,MAAI,aAAa;AACjB,MAAI,aAAa,UAAU,cAAc,QAAQ;AAC/C,QAAI;AACF,YAAM,iBAAiB,MAAM,SAASH,UAAQ,KAAK,SAAS,CAAC;AAC7D,YAAM,cAAc,MAAM,SAASA,UAAQ,KAAK,MAAM,CAAC;AACvD,mBAAa,mBAAmB;AAAA,IAClC,QAAQ;AACN,mBAAa;AAAA,IACf;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,UAAU,MAAM,UAAU,WAAW;AACxD;AAmBA,eAAsB,qBACpBI,cACAC,iBAC4B;AAC5B,QAAM,UAA6B,CAAC;AACpC,MAAI;AACF,UAAM,WAAW,MAAM,aAAaD,YAAW;AAE/C,eAAW,WAAW,UAAU;AAC9B,YAAM,wBAAwBJ,UAAQI,cAAa,QAAQ,MAAM,aAAa;AAC9E,UAAI;AACJ,UAAI;AACF,gBAAQ,MAAMH,SAAQ,qBAAqB;AAAA,MAC7C,QAAQ;AACN;AAAA,MACF;AACA,iBAAW,SAAS,OAAO;AACzB,cAAM,QAAQD,UAAQ,uBAAuB,OAAO,eAAe;AACnE,YAAI;AACF,gBAAM,MAAM,MAAME,UAAS,OAAO,OAAO;AACzC,gBAAM,CAAC,EAAE,IAAI,mBAAmB,GAAG;AACnC,cAAI,CAAC,GAAI;AACT,kBAAQ,KAAK;AAAA,YACX,aAAa,QAAQ;AAAA,YACrB,gBAAgB;AAAA,YAChB,iBAAiB,SAAS,IAAI,OAAO,KAAK;AAAA,YAC1C,cAAc,eAAe,IAAI,aAAa,cAAc,KAAK;AAAA,YACjE,QAAQ,eAAe,IAAI,aAAa,QAAQ,KAAK;AAAA,UACvD,CAAC;AAAA,QACH,QAAQ;AACN;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,MAAIG,iBAAgB;AAClB,QAAI;AACF,YAAM,UAAU,MAAMJ,SAAQI,eAAc;AAC5C,iBAAW,MAAM,SAAS;AACxB,YAAI,GAAG,WAAW,GAAG,KAAK,GAAG,WAAW,GAAG,EAAG;AAC9C,cAAM,QAAQL,UAAQK,iBAAgB,IAAI,eAAe;AACzD,YAAI;AACF,gBAAM,MAAM,MAAMH,UAAS,OAAO,OAAO;AACzC,gBAAM,CAAC,EAAE,IAAI,mBAAmB,GAAG;AACnC,cAAI,CAAC,GAAI;AACT,kBAAQ,KAAK;AAAA,YACX,aAAa;AAAA,YACb,gBAAgB;AAAA,YAChB,iBAAiB,SAAS,IAAI,OAAO,KAAK;AAAA,YAC1C,cAAc,eAAe,IAAI,aAAa,cAAc,KAAK;AAAA,YACjE,QAAQ,eAAe,IAAI,aAAa,QAAQ,KAAK;AAAA,UACvD,CAAC;AAAA,QACH,QAAQ;AACN;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,oBAAoB,GAA4B;AACpE,MAAI;AACF,UAAM,WAAW,MAAM,SAAS,CAAC;AACjC,WAAO,SAAS,QAAQ,QAAQ,EAAE;AAAA,EACpC,QAAQ;AACN,WAAO,EAAE,QAAQ,QAAQ,EAAE;AAAA,EAC7B;AACF;AAEA,eAAsB,aACpB,KACA,QACA,SACgC;AAChC,QAAM,gBAAgB,MAAM,oBAAoB,GAAG;AACnD,aAAW,OAAO,SAAS;AACzB,QAAI,IAAI,cAAc;AACpB,YAAM,eAAe,MAAM,oBAAoB,IAAI,YAAY;AAC/D,UAAI,kBAAkB,cAAc;AAClC,eAAO,EAAE,SAAS,IAAI,aAAa,MAAM,IAAI,gBAAgB,OAAO,IAAI,gBAAgB;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AACA,MAAI,QAAQ;AACV,eAAW,OAAO,SAAS;AACzB,UAAI,IAAI,UAAU,IAAI,WAAW,QAAQ;AACvC,eAAO,EAAE,SAAS,IAAI,aAAa,MAAM,IAAI,gBAAgB,OAAO,IAAI,gBAAgB;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAIA,eAAe,YACb,aACA,YACA,kBACyB;AACzB,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,QAAQ,MAAM,aAAa,YAAY,OAAO;AAEpD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,MAAM,YAAY;AAAA,MAClB,MAAM;AAAA,MACN,YAAY,YAAY;AAAA,MACxB,eAAe,YAAY;AAAA,MAC3B,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS,CAAC;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,cAAc,YAAY,OAAO;AAGxD,QAAM,YAAY,oBAAI,IAAgD;AACtE,aAAW,MAAM,UAAU;AACzB,QAAI,CAAC,UAAU,IAAI,GAAG,WAAW,GAAG;AAClC,gBAAU,IAAI,GAAG,aAAa,EAAE,MAAM,GAAG,YAAY,OAAO,CAAC,EAAE,CAAC;AAAA,IAClE;AACA,cAAU,IAAI,GAAG,WAAW,EAAG,MAAM,KAAK,EAAE;AAAA,EAC9C;AAGA,QAAM,SAAS,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;AACjD,QAAM,eAAe,oBAAI,IAA0D;AACnF,aAAW,OAAO,QAAQ;AACxB,iBAAa,IAAI,KAAK,MAAM,WAAW,GAAG,CAAC;AAAA,EAC7C;AAGA,QAAM,eAAe,oBAAI,IAAoB;AAC7C,aAAW,MAAM,UAAU;AACzB,UAAM,cAAc,MAAM,kBAAkB,GAAG,GAAG;AAClD,UAAM,MAAM,GAAG,GAAG,WAAW,IAAI,GAAG,SAAS;AAC7C,eAAW,OAAO,aAAa;AAC7B,mBAAa,IAAI,KAAK,GAAG;AAAA,IAC3B;AAAA,EACF;AAGA,QAAM,YAAY,oBAAI,IAAsB;AAC5C,aAAW,QAAQ,WAAW,MAAM,IAAI,GAAG;AACzC,UAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,KAAK;AACrC,QAAI,MAAM,SAAS,EAAG;AACtB,UAAM,MAAM,SAAS,MAAM,CAAC,GAAG,EAAE;AACjC,UAAM,UAAU,aAAa,IAAI,GAAG;AACpC,QAAI,CAAC,QAAS;AACd,UAAM,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,KAAK,QAAQ,KAAK,CAAC,CAAC;AACpE,QAAI,SAAS;AACX,YAAM,OAAO,SAAS,QAAQ,MAAM,GAAG,EAAE,IAAI,GAAI,EAAE;AACnD,UAAI,CAAC,MAAM,IAAI,GAAG;AAChB,YAAI,CAAC,UAAU,IAAI,OAAO,EAAG,WAAU,IAAI,SAAS,CAAC,CAAC;AACtD,cAAM,WAAW,UAAU,IAAI,OAAO;AACtC,YAAI,CAAC,SAAS,SAAS,IAAI,EAAG,UAAS,KAAK,IAAI;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAGA,QAAM,UAA2B,CAAC;AAClC,aAAW,CAAC,aAAa,EAAE,MAAM,OAAO,iBAAiB,CAAC,KAAK,WAAW;AACxE,UAAM,QAAuB,CAAC;AAC9B,eAAW,MAAM,kBAAkB;AACjC,YAAM,MAAM,GAAG,GAAG,WAAW,IAAI,GAAG,SAAS;AAC7C,YAAM,UAAU,aAAa,IAAI,GAAG,GAAG,KAAK,EAAE,QAAQ,MAAM,UAAU,MAAM;AAC5E,YAAM,QAAQ,UAAU,IAAI,GAAG,KAAK,CAAC;AACrC,YAAM,OAAO,MAAM,IAAI,CAAC,MAAM,oBAAoB,CAAC,EAAE;AAErD,YAAM,WAAW,YAAY,UAAU,GAAG;AAC1C,UAAI,aAAoC;AACxC,UAAI,UAAU;AACZ,cAAM,MAAM,iBAAiB;AAAA,UAC3B,CAAC,MAAM,EAAE,gBAAgB,SAAS,WAAW,EAAE,mBAAmB,SAAS;AAAA,QAC7E;AACA,qBAAa;AAAA,UACX,SAAS,SAAS;AAAA,UAClB,MAAM,SAAS;AAAA,UACf,OAAO,KAAK,mBAAmB,SAAS;AAAA,QAC1C;AAAA,MACF,OAAO;AACL,qBAAa,MAAM,aAAa,GAAG,KAAK,QAAQ,QAAQ,gBAAgB;AAAA,MAC1E;AAEA,YAAM,KAAK;AAAA,QACT,OAAO,GAAG;AAAA,QACV,SAAS,GAAG;AAAA,QACZ,KAAK,GAAG;AAAA,QACR,QAAQ,QAAQ;AAAA,QAChB,UAAU,QAAQ;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAEA,YAAQ,KAAK,EAAE,OAAO,aAAa,MAAM,MAAM,CAAC;AAAA,EAClD;AAEA,UAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAExC,SAAO;AAAA,IACL,MAAM,YAAY;AAAA,IAClB,MAAM;AAAA,IACN,YAAY,YAAY;AAAA,IACxB,eAAe,YAAY;AAAA,IAC3B,WAAW;AAAA,IACX,OAAO;AAAA,IACP;AAAA,EACF;AACF;AAEA,eAAe,mBACb,aACA,YACA,kBACyB;AACzB,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAGnC,MAAI,QAAQ;AACZ,MAAI,YAAY,KAAK;AACnB,QAAI;AACF,cAAQ,KAAK,YAAY,KAAK,CAAC;AAC/B,cAAQ;AAAA,IACV,QAAQ;AACN,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,CAAC,YAAY,KAAK;AAC9B,WAAO;AAAA,MACL,MAAM,YAAY;AAAA,MAClB,MAAM;AAAA,MACN,YAAY,YAAY;AAAA,MACxB,eAAe,YAAY;AAAA,MAC3B,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS,CAAC;AAAA,IACZ;AAAA,EACF;AAGA,QAAM,QAAQ,mBAAmB,YAAY,oBAAI,IAAI,CAAC,YAAY,GAAI,CAAC,CAAC;AAExE,QAAM,UAAU,MAAM,WAAW,YAAY,GAAG;AAGhD,QAAM,WAAW,YAAY,UAAU,KAAK;AAC5C,MAAI,aAAoC;AACxC,MAAI,UAAU;AACZ,UAAM,MAAM,iBAAiB;AAAA,MAC3B,CAAC,MAAM,EAAE,gBAAgB,SAAS,WAAW,EAAE,mBAAmB,SAAS;AAAA,IAC7E;AACA,iBAAa;AAAA,MACX,SAAS,SAAS;AAAA,MAClB,MAAM,SAAS;AAAA,MACf,OAAO,KAAK,mBAAmB,SAAS;AAAA,IAC1C;AAAA,EACF,OAAO;AACL,iBAAa,MAAM,aAAa,YAAY,KAAK,QAAQ,QAAQ,gBAAgB;AAAA,EACnF;AAEA,QAAM,OAAoB;AAAA,IACxB,OAAO;AAAA,IACP,SAAS,YAAY;AAAA,IACrB,KAAK,YAAY;AAAA,IACjB,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,IAClB;AAAA,IACA,MAAM,MAAM,IAAI,CAAC,MAAM,oBAAoB,CAAC,EAAE;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM,YAAY;AAAA,IAClB,MAAM;AAAA,IACN,YAAY,YAAY;AAAA,IACxB,eAAe,YAAY;AAAA,IAC3B,WAAW;AAAA,IACX,OAAO;AAAA,IACP,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,WAAW,OAAO,CAAC,IAAI,EAAE,CAAC;AAAA,EACxD;AACF;AAEA,eAAsB,gBACpBI,aACAF,cACA,SAC0B;AAC1B,MAAI,CAAC,SAAS,eAAe,SAAS,KAAK,IAAI,IAAI,MAAM,QAAQ;AAC/D,WAAO,MAAM;AAAA,EACf;AAEA,QAAM,gBAAgB,MAAM,mBAAmB;AAC/C,QAAM,QAAQ,MAAM,iBAAiBE,WAAU;AAC/C,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,mBAAmB,MAAM,qBAAqBF,cAAa,SAAS,cAAc;AAExF,QAAM,WAA6B,CAAC;AACpC,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAO,MAAM,gBAAgBE,aAAY,IAAI;AACnD,QAAI,CAAC,KAAM;AAEX,QAAI,KAAK,SAAS,WAAW;AAC3B,eAAS,KAAK,MAAM,mBAAmB,MAAM,YAAY,gBAAgB,CAAC;AAAA,IAC5E,WAAW,eAAe;AACxB,eAAS,KAAK,MAAM,YAAY,MAAM,YAAY,gBAAgB,CAAC;AAAA,IACrE;AAAA,EAEF;AAEA,QAAM,SAA0B,EAAE,UAAU,cAAc;AAC1D,UAAQ,EAAE,MAAM,QAAQ,QAAQ,KAAK,IAAI,IAAI,aAAa;AAC1D,SAAO;AACT;AAEA,eAAsB,kBACpBA,aACAF,cACA,MACA,SACgC;AAChC,QAAM,OAAO,MAAM,gBAAgBE,aAAY,IAAI;AACnD,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,mBAAmB,MAAM,qBAAqBF,cAAa,SAAS,cAAc;AAExF,MAAI,KAAK,SAAS,WAAW;AAC3B,WAAO,mBAAmB,MAAM,YAAY,gBAAgB;AAAA,EAC9D;AACA,SAAO,YAAY,MAAM,YAAY,gBAAgB;AACvD;AAngBA,IAkBM,MAGF,OACE;AAtBN;AAAA;AAAA;AAIA;AACA;AAIA;AASA,IAAM,OAAO,UAAU,QAAQ;AAG/B,IAAI,QAA0D;AAC9D,IAAM,eAAe;AAAA;AAAA;;;ACtBrB,SAAS,WAAAG,UAAS,YAAAC,WAAU,aAAAC,kBAAiB;AAC7C,SAAS,WAAAC,WAAS,WAAAC,gBAAe;AAsEjC,eAAe,sBAAsBC,iBAAiE;AACpG,MAAI,CAACA,gBAAgB,QAAO,CAAC;AAC7B,MAAI,CAAE,MAAM,WAAWA,eAAc,EAAI,QAAO,CAAC;AAEjD,QAAM,UAAU,MAAML,SAAQK,iBAAgB,EAAE,eAAe,KAAK,CAAC;AACrE,QAAM,UAA8B,CAAC;AAErC,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY,KAAK,MAAM,KAAK,WAAW,GAAG,KAAK,MAAM,KAAK,WAAW,GAAG,EAAG;AACtF,UAAM,gBAAgBF,UAAQE,iBAAgB,MAAM,IAAI;AACxD,UAAM,mBAAmBF,UAAQ,eAAe,eAAe;AAC/D,QAAI,CAAE,MAAM,WAAW,gBAAgB,EAAI;AAC3C,QAAI;AACF,YAAM,UAAU,MAAMF,UAAS,kBAAkB,OAAO;AACxD,YAAM,SAAS,oBAAoB,OAAO;AAC1C,cAAQ,KAAK,EAAE,eAAe,IAAI,MAAM,MAAM,OAAO,CAAC;AAAA,IACxD,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,UAAQ,KAAK,CAAC,MAAM,UAAU,kBAAkB,MAAM,OAAO,SAAS,KAAK,OAAO,OAAO,CAAC;AAC1F,SAAO;AACT;AAoEA,SAAS,YAAY,GAAmB;AACtC,SAAO,EAAE,QAAQ,MAAM,GAAG,EAAE,QAAQ,SAAS,CAACK,OAAMA,GAAE,YAAY,CAAC;AACrE;AAEA,SAAS,yBAAyB,QAA8B;AAC9D,MAAI,CAAC,OAAO,OAAQ,QAAO;AAE3B,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,OAAO,YACX,OAAO,CAAC,MAAM;AACb,QAAI,KAAK,IAAI,EAAE,OAAO,EAAG,QAAO;AAChC,SAAK,IAAI,EAAE,OAAO;AAClB,WAAO;AAAA,EACT,CAAC,EACA,IAAI,CAAC,OAAO;AAAA,IACX,SAAS,EAAE;AAAA,IACX,OAAO,EAAE,SAAS,YAAY,EAAE,OAAO;AAAA,IACvC,aAAa,EAAE,eAAe,kBAAkB,EAAE,OAAO;AAAA,IACzD,gBAAgB,EAAE,kBAAkB;AAAA,EACtC,EAAE;AACN;AAaA,eAAsB,kBAAiD;AACrE,MAAI,cAAe,QAAO;AAE1B,QAAM,SAAS,MAAM,WAAW;AAEhC,MAAI,OAAO,UAAU;AACnB,UAAM,cAAc,IAAI;AAAA,MACtB,OAAO,SAAS,SAAS,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IACpE;AACA,oBAAgB;AAAA,MACd,QAAQ;AAAA,MACR,UAAU,OAAO,SAAS;AAAA,MAC1B,OAAO,OAAO,SAAS;AAAA,MACvB,aAAa,OAAO,SAAS;AAAA,MAC7B,iBAAiB,qBAAqB,OAAO,SAAS,WAAW;AAAA,MACjE,kBAAkB,YAAY,OAAO,IAAI,cAAc,oBAAI,IAAI,CAAC,aAAa,QAAQ,CAAC;AAAA,IACxF;AAAA,EACF,OAAO;AACL,oBAAgB;AAAA,MACd,QAAQ;AAAA,MACR,UAAU,iBAAiB,IAAI,CAAC,QAAQ;AAAA,QACtC;AAAA,QACA,OAAO,YAAY,EAAE;AAAA,QACrB,OAAO,sBAAsB,EAAE,KAAK;AAAA,QACpC,UAAU,OAAO,eAAe,OAAO;AAAA,MACzC,EAAE;AAAA,MACF,OAAO,CAAC,GAAG,gBAAgB;AAAA,MAC3B,aAAa,MAAM,KAAK,yBAAyB,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM;AAC7E,cAAM,CAAC,MAAM,OAAO,IAAI,IAAI,MAAM,GAAG;AACrC,eAAO,EAAE,MAAM,SAAS,GAAG;AAAA,MAC7B,CAAC;AAAA,MACD,iBAAiB;AAAA,MACjB,kBAAkB,oBAAI,IAAI,CAAC,aAAa,QAAQ,CAAC;AAAA,IACnD;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,yBAA+B;AAC7C,kBAAgB;AAClB;AAMA,eAAsB,aAAaC,cAAgD;AACjF,QAAM,iBAAiB,MAAM,mBAAmBA,YAAW;AAC3D,SAAO,eAAe,IAAI,CAAC,WAAW,OAAO,OAAO;AACtD;AAMA,eAAe,sBAAsBA,cAAwC;AAC3E,QAAM,eAAeJ,UAAQC,SAAQG,YAAW,GAAG,iBAAiB;AACpE,MAAI;AACF,UAAM,MAAM,MAAMN,UAAS,cAAc,OAAO;AAChD,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,MAAM,QAAQ,MAAM,IAAI,OAAO,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IAAI,CAAC;AAAA,EAC7F,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,uBAAuBM,cAAqB,YAAqC;AAC9F,QAAM,eAAeJ,UAAQC,SAAQG,YAAW,GAAG,iBAAiB;AACpE,QAAML,WAAU,cAAc,KAAK,UAAU,YAAY,MAAM,CAAC,IAAI,MAAM,OAAO;AACnF;AAMA,eAAsB,eAAeK,cAA+E;AAClH,QAAM,CAAC,gBAAgB,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,IACrD,mBAAmBA,YAAW;AAAA,IAC9B,sBAAsBA,YAAW;AAAA,EACnC,CAAC;AACD,QAAM,eAAe,IAAI,IAAY,UAAU;AAC/C,MAAI,eAAe;AACnB,aAAW,UAAU,gBAAgB;AACnC,QAAI,OAAO,QAAQ,WAAW;AAC5B,mBAAa,IAAI,OAAO,QAAQ,SAAS;AAAA,IAC3C,OAAO;AACL,qBAAe;AAAA,IACjB;AAAA,EACF;AACA,QAAM,aAAa,MAAM,KAAK,YAAY,EAAE,KAAK;AACjD,SAAO,EAAE,YAAY,aAAa;AACpC;AAMA,eAAsB,gBAAgBA,cAAqB,MAA6B;AACtF,QAAM,aAAa,MAAM,sBAAsBA,YAAW;AAC1D,MAAI,CAAC,WAAW,SAAS,IAAI,GAAG;AAC9B,eAAW,KAAK,IAAI;AACpB,eAAW,KAAK;AAChB,UAAM,uBAAuBA,cAAa,UAAU;AAAA,EACtD;AACF;AAMA,eAAsB,gBAAgBA,cAAqB,MAA6B;AACtF,QAAM,aAAa,MAAM,sBAAsBA,YAAW;AAC1D,QAAM,WAAW,WAAW,OAAO,CAAC,MAAM,MAAM,IAAI;AACpD,QAAM,uBAAuBA,cAAa,QAAQ;AACpD;AAMA,eAAsB,YACpBA,cACAC,aACAH,iBAC2B;AAC3B,QAAM,iBAAiB,MAAM,mBAAmBE,YAAW;AAC3D,QAAM,oBAAoB,MAAM,sBAAsBF,eAAc;AACpE,QAAM,YAAY,oBAAoB,gBAAgB,iBAAiB;AACvE,QAAM,iBAAiB,oBAAoB,gBAAgB,iBAAiB;AAE5E,MAAI;AACJ,MAAIG,aAAY;AACd,QAAI;AACF,YAAM,EAAE,iBAAAC,iBAAgB,IAAI,MAAM;AAClC,YAAM,UAAU,MAAMA,iBAAgBD,aAAYD,cAAa,EAAE,gBAAAF,gBAAe,CAAC;AACjF,UAAI,QAAQ,eAAe;AACzB,cAAM,QAAQ,QAAQ,SAAS,OAAO,OAAK,EAAE,KAAK,EAAE;AACpD,cAAM,aAAa,QAAQ,SAAS,OAAO,CAAC,KAAK,MAC/C,MAAM,EAAE,QAAQ,OAAO,CAAC,IAAI,MAC1B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,MAAM,KAAK,EAAE,MAAM,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;AACjE,sBAAc;AAAA,UACZ,iBAAiB,QAAQ,SAAS;AAAA,UAClC,eAAe;AAAA,UACf,cAAc,QAAQ,SAAS,SAAS;AAAA,UACxC;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AAAA,IACL,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,UAAU,eAAe,WAAW,KAAK,kBAAkB,WAAW;AAAA,IACtE,OAAO;AAAA,MACL,gBAAgB,eAAe,OAAO,CAAC,WAAW,OAAO,QAAQ,WAAW,QAAQ,EAAE;AAAA,MACtF,uBAAuB,eAAe;AAAA,QACpC,CAAC,OAAO,WAAW,SAAS,OAAO,QAAQ,SAAS,aAAa,KAAK;AAAA,QACtE;AAAA,MACF;AAAA,MACA,oBAAoB,eAAe;AAAA,QACjC,CAAC,OAAO,WAAW,SAAS,OAAO,QAAQ,SAAS,SAAS,KAAK;AAAA,QAClE;AAAA,MACF;AAAA,MACA,mBAAmB,eAAe;AAAA,QAChC,CAAC,OAAO,WAAW,SAAS,OAAO,QAAQ,SAAS,QAAQ,KAAK;AAAA,QACjE;AAAA,MACF;AAAA,MACA,mBAAmB,eAAe;AAAA,QAChC,CAAC,OAAO,WAAW,SAAS,OAAO,QAAQ,SAAS,QAAQ,KAAK;AAAA,QACjE;AAAA,MACF;AAAA,MACA,kBAAkB,eAAe;AAAA,QAC/B,CAAC,OAAO,WACN,QAAQ,OAAO,YAAY,OAAO,CAAC,eAAe,QAAQ,WAAW,OAAO,CAAC,EAAE;AAAA,QACjF;AAAA,MACF,IAAI,kBAAkB,OAAO,CAAC,OAAO,QAAQ,GAAG,OAAO,OAAO,CAAC,EAAE;AAAA,IACnE;AAAA,IACA,WAAW,UAAU,MAAM,GAAG,wBAAwB;AAAA,IACtD,gBAAgB,eACb,IAAI,CAAC,WAAW,OAAO,OAAO,EAC9B,KAAK,CAAC,MAAM,UAAU,kBAAkB,MAAM,SAAS,KAAK,OAAO,CAAC,EACpE,MAAM,GAAG,qBAAqB;AAAA,IACjC,gBAAgB,eAAe,MAAM,GAAG,qBAAqB;AAAA,IAC7D;AAAA,EACF;AACF;AAMA,eAAsB,aACpBE,cACAC,aACAH,iBAC4B;AAC5B,QAAM,iBAAiB,MAAM,mBAAmBE,YAAW;AAC3D,QAAM,oBAAoB,MAAM,sBAAsBF,eAAc;AACpE,QAAM,QAAQ,oBAAoB,gBAAgB,iBAAiB;AAEnE,MAAIG,aAAY;AACd,QAAI;AACF,YAAM,EAAE,iBAAAC,iBAAgB,IAAI,MAAM;AAClC,YAAM,UAAU,MAAMA,iBAAgBD,aAAYD,cAAa,EAAE,gBAAAF,gBAAe,CAAC;AACjF,iBAAW,WAAW,QAAQ,UAAU;AACtC,YAAI,CAAC,QAAQ,OAAO;AAClB,gBAAM,KAAK;AAAA,YACT,IAAI,eAAe,QAAQ,IAAI;AAAA,YAC/B,UAAU;AAAA,YACV,aAAa;AAAA,YACb,cAAc;AAAA,YACd,gBAAgB;AAAA,YAChB,iBAAiB,SAAS,QAAQ,IAAI;AAAA,YACtC,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,SAAS,QAAQ;AAAA,YACjB,MAAM;AAAA,YACN,OAAO;AAAA,YACP,eAAe;AAAA,UACjB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,aAAa,MAAM,MAAM,GAAG,oBAAoB;AACtD,QAAM,UAAmC;AAAA,IACvC,UAAU;AAAA,IACV,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,KAAK;AAAA,EACP;AAEA,aAAW,QAAQ,YAAY;AAC7B,YAAQ,KAAK,QAAQ;AAAA,EACvB;AAEA,SAAO;AAAA,IACL,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,SAAS;AAAA,MACP,OAAO,WAAW;AAAA,MAClB,UAAU,QAAQ;AAAA,MAClB,MAAM,QAAQ;AAAA,MACd,QAAQ,QAAQ;AAAA,MAChB,KAAK,QAAQ;AAAA,IACf;AAAA,IACA,OAAO;AAAA,EACT;AACF;AAMA,eAAsB,qBACpBE,cACAF,iBACmC;AACnC,QAAM,iBAAiB,MAAM,mBAAmBE,YAAW;AAC3D,QAAM,eAAe,MAAM,QAAQ;AAAA,IACjC,eAAe;AAAA,MAAQ,OAAO,WAC5B,QAAQ;AAAA,QACN,OAAO,YAAY;AAAA,UAAI,OAAO,eAC5B,sBAAsBA,cAAa,QAAQ,UAAU;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBAAoB,MAAM,sBAAsBF,eAAc;AACpE,QAAM,kBAAkB,MAAM,QAAQ;AAAA,IACpC,kBAAkB,IAAI,OAAO,OAAO,sBAAsB,EAAE,CAAC;AAAA,EAC/D;AAEA,SAAO;AAAA,IACL,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,aAAa,CAAC,GAAG,aAAa,KAAK,GAAG,GAAG,eAAe,EACrD,KAAK,CAAC,MAAM,UAAU,kBAAkB,MAAM,SAAS,KAAK,OAAO,CAAC;AAAA,EACzE;AACF;AAEA,eAAe,sBAAsB,IAAoD;AACvF,SAAO;AAAA,IACL,GAAG,oBAAoB,GAAG,MAAM;AAAA,IAChC,aAAa;AAAA,IACb,cAAc;AAAA,IACd,eAAe,GAAG,OAAO;AAAA,IACzB,kBAAkB;AAAA,IAClB,sBAAsB,MAAM,kCAAkC,GAAG,MAAM;AAAA,EACzE;AACF;AAEA,eAAe,kCACb,YACuC;AAEvC,QAAM,SAAS,MAAM,gBAAgB;AACrC,QAAM,iBAAiB,yBAAyB,MAAM;AACtD,QAAM,UAAwC,CAAC;AAE/C,aAAW,cAAc,gBAAgB;AACvC,QAAI,UAAyB;AAC7B,QAAI,WAAW,YAAY,WAAW,CAAC,WAAW,UAAU;AAC1D,gBAAU;AAAA,IACZ;AACA,UAAM,SAAS,gBAAgB,WAAW,QAAQ,WAAW,SAAS,OAAO,eAAe;AAC5F,YAAQ,KAAK;AAAA,MACX,SAAS,WAAW;AAAA,MACpB,OAAO,WAAW;AAAA,MAClB,aAAa,WAAW;AAAA,MACxB,cAAc,UAAU,WAAW;AAAA,MACnC,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB;AAAA,MACA,gBAAgB,WAAW;AAAA,IAC7B,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAMA,eAAsB,UAAiC;AACrD,SAAO,iBAAiB;AAC1B;AAKA,eAAsB,oBACpBE,cACA,cACA,aACA,gBAC0C;AAC1C,QAAM,WAAW,gBAAgBA,cAAa,cAAc,aAAa,cAAc;AACvF,MAAI,CAAC,YAAY,CAAE,MAAM,WAAW,QAAQ,GAAI;AAC9C,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAMN,UAAS,UAAU,OAAO;AAChD,QAAM,QAAQ,yBAAyB,cAAc,aAAa,cAAc;AAEhF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,iBAAiB,aAAa,iBAAiB;AAAA,EAC7D;AACF;AAMA,eAAsB,wBACpBM,cACAF,iBACA,cACA,IAC0C;AAC1C,QAAM,WAAW,MAAM,sBAAsBE,cAAaF,iBAAgB,EAAE;AAC5E,MAAI,CAAC,SAAU,QAAO;AAEtB,MAAI,CAAC,SAAS,cAAc,SAAS,aAAa;AAChD,WAAO;AAAA,MACLE;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,WACJ,iBAAiB,eACb,kBACA,iBAAiB,SACf,YACA,iBAAiB,eACf,kBACA,iBAAiB,YACf,eACA,iBAAiB,oBACf,uBACA;AACd,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,WAAWJ,UAAQ,SAAS,eAAe,QAAQ;AACzD,MAAI,CAAE,MAAM,WAAW,QAAQ,EAAI,QAAO;AAE1C,QAAM,UAAU,MAAMF,UAAS,UAAU,OAAO;AAChD,QAAM,QAAQ,SAAS;AACvB,QAAM,QACJ,iBAAiB,eACb,oBAAoB,KAAK,KACzB,iBAAiB,SACf,cAAc,KAAK,KACnB,iBAAiB,eACf,oBAAoB,KAAK,KACzB,iBAAiB,YACf,mBAAmB,KAAK,KACxB,oBAAoB,KAAK;AAErC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,cAAc,SAAS;AAAA,IACvB,YAAY,iBAAiB,aAAa,iBAAiB;AAAA,EAC7D;AACF;AAMA,eAAsB,iBACpBM,cACA,MAC+B;AAC/B,QAAM,cAAcJ,UAAQI,cAAa,IAAI;AAC7C,QAAM,gBAAgBJ,UAAQ,aAAa,YAAY;AAEvD,MAAI,CAAE,MAAM,WAAW,aAAa,GAAI;AACtC,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,MAAMF,UAAS,eAAe,OAAO;AAC5D,QAAM,UAAU,aAAa,cAAc;AAC3C,QAAM,cAAc,MAAM,sBAAsB,WAAW;AAC3D,QAAM,SAAS,MAAM,mBAAmB,aAAa,SAAS,WAAW;AACzE,QAAM,kBAAkB,MAAM,oBAAoB,aAAa,WAAW;AAC1E,QAAM,YAAY,MAAM,cAAc,WAAW;AACjD,QAAM,WAAW,MAAM,aAAa,WAAW;AAC/C,QAAM,UAAU,4BAA4B,QAAQ,SAAS,WAAW;AAExE,SAAO;AAAA,IACL,MAAM,QAAQ,QAAQ;AAAA,IACtB,OAAO,QAAQ;AAAA,IACf,QAAQ,OAAO;AAAA,IACf,gBAAgB,QAAQ;AAAA,IACxB,UAAU,QAAQ;AAAA,IAClB,YAAY,QAAQ;AAAA,IACpB,gBAAgB,QAAQ;AAAA,IACxB,SAAS,QAAQ;AAAA,IACjB;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,IACd,UAAU,OAAO;AAAA,IACjB,gBAAgB,OAAO;AAAA,IACvB,aAAa,YACV,IAAI,mBAAmB,EACvB,KAAK,CAAC,MAAM,UAAU,kBAAkB,MAAM,SAAS,KAAK,OAAO,CAAC;AAAA,IACvE;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,QAAQ;AAAA,EACrB;AACF;AAMA,eAAsB,oBACpBM,cACA,aACA,gBACkC;AAClC,QAAM,gBAAgBJ,UAAQI,cAAa,aAAa,eAAe,cAAc;AACrF,QAAM,mBAAmBJ,UAAQ,eAAe,eAAe;AAE/D,MAAI,CAAE,MAAM,WAAW,gBAAgB,GAAI;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,oBAAoB,MAAMF,UAAS,kBAAkB,OAAO;AAClE,QAAM,aAAa,oBAAoB,iBAAiB;AAExD,MAAI,OAAiC;AACrC,QAAM,WAAWE,UAAQ,eAAe,SAAS;AACjD,MAAI,MAAM,WAAW,QAAQ,GAAG;AAC9B,UAAM,cAAc,MAAMF,UAAS,UAAU,OAAO;AACpD,UAAM,SAAS,UAAU,WAAW;AACpC,WAAO;AAAA,MACL,QAAQ,OAAO;AAAA,MACf,SAAS,OAAO;AAAA,MAChB,MAAM,OAAO;AAAA,IACf;AAAA,EACF;AAEA,MAAI,aAA6C;AACjD,QAAM,iBAAiBE,UAAQ,eAAe,eAAe;AAC7D,MAAI,MAAM,WAAW,cAAc,GAAG;AACpC,UAAM,oBAAoB,MAAMF,UAAS,gBAAgB,OAAO;AAChE,UAAM,SAAS,gBAAgB,iBAAiB;AAChD,iBAAa;AAAA,MACX,SAAS,OAAO;AAAA,MAChB,MAAM,OAAO;AAAA,IACf;AAAA,EACF;AAEA,MAAI,UAAuC;AAC3C,QAAM,cAAcE,UAAQ,eAAe,YAAY;AACvD,MAAI,MAAM,WAAW,WAAW,GAAG;AACjC,UAAM,iBAAiB,MAAMF,UAAS,aAAa,OAAO;AAC1D,UAAM,SAAS,aAAa,cAAc;AAC1C,cAAU;AAAA,MACR,SAAS,OAAO;AAAA,MAChB,cAAc,OAAO;AAAA,MACrB,MAAM,OAAO;AAAA,IACf;AAAA,EACF;AAEA,MAAI,iBAAqD;AACzD,QAAM,qBAAqBE,UAAQ,eAAe,oBAAoB;AACtE,MAAI,MAAM,WAAW,kBAAkB,GAAG;AACxC,UAAM,wBAAwB,MAAMF,UAAS,oBAAoB,OAAO;AACxE,UAAM,SAAS,oBAAoB,qBAAqB;AACxD,qBAAiB;AAAA,MACf,SAAS,OAAO;AAAA,MAChB,eAAe,OAAO;AAAA,MACtB,MAAM,OAAO;AAAA,IACf;AAAA,EACF;AAEA,MAAI,WAAyC;AAC7C,QAAM,eAAeE,UAAQ,eAAe,aAAa;AACzD,MAAI,MAAM,WAAW,YAAY,GAAG;AAClC,UAAM,kBAAkB,MAAMF,UAAS,cAAc,OAAO;AAC5D,UAAM,SAAS,cAAc,eAAe;AAC5C,eAAW;AAAA,MACT,SAAS,OAAO;AAAA,MAChB,YAAY,OAAO;AAAA,MACnB,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,WAAyC;AAC7C,QAAM,eAAeE,UAAQ,eAAe,aAAa;AACzD,MAAI,MAAM,WAAW,YAAY,GAAG;AAClC,UAAM,kBAAkB,MAAMF,UAAS,cAAc,OAAO;AAC5D,UAAM,SAAS,cAAc,eAAe;AAC5C,eAAW;AAAA,MACT,SAAS,OAAO;AAAA,MAChB,YAAY,OAAO;AAAA,MACnB,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,SAA2B;AAAA,IAC/B,IAAI,WAAW;AAAA,IACf;AAAA,IACA,MAAM,WAAW,QAAQ;AAAA,IACzB,OAAO,WAAW;AAAA,IAClB,QAAQ,WAAW;AAAA,IACnB,UAAU,WAAW;AAAA,IACrB,UAAU,WAAW;AAAA,IACrB,WAAW,WAAW;AAAA,IACtB,OAAO,WAAW;AAAA,IAClB,cAAc,CAAC;AAAA,IACf,eAAe,CAAC;AAAA,IAChB,eAAe,WAAW;AAAA,IAC1B,WAAW,WAAW;AAAA,IACtB,aAAa,WAAW;AAAA,IACxB,MAAM,WAAW;AAAA,IACjB,SAAS,WAAW;AAAA,IACpB,SAAS,WAAW;AAAA,IACpB,MAAM,WAAW;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,CAAC;AAAA,IACf,sBAAsB,MAAM;AAAA,MAC1BM;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,WAAW,GAAG,WAAW,IAAI,OAAO,IAAI;AAC9C,QAAM,iBAAiB,MAAM,mBAAmBA,YAAW;AAG3D,QAAM,eAAyB,CAAC;AAChC,aAAW,MAAM,gBAAgB;AAC/B,eAAW,KAAK,GAAG,aAAa;AAC9B,YAAM,gBAAgB,GAAG,GAAG,QAAQ,IAAI,IAAI,EAAE,IAAI;AAClD,UAAI,kBAAkB,SAAU;AAChC,UAAI,EAAE,MAAM,SAAS,QAAQ,GAAG;AAC9B,qBAAa,KAAK,aAAa;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAGA,QAAM,oBAAoB,CAAC,MAAc;AACvC,UAAM,QAAQ,EAAE,MAAM,GAAG;AACzB,WAAO,MAAM,WAAW,KAAK,MAAM,CAAC,EAAE,SAAS,KAAK,MAAM,CAAC,EAAE,SAAS;AAAA,EACxE;AACA,QAAM,eAAe,WAAW,MAAM,OAAO,CAAC,MAAM,MAAM,YAAY,kBAAkB,CAAC,CAAC;AAG1F,QAAM,aAAa,IAAI,IAAI,YAAY;AACvC,QAAM,sBAAsB,aAAa,OAAO,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;AAEzE,SAAO,QAAQ;AACf,SAAO,eAAe;AAGtB,QAAM,wBAAwB,oBAAI,IAA+C;AACjF,aAAW,MAAM,gBAAgB;AAC/B,eAAW,KAAK,GAAG,aAAa;AAC9B,4BAAsB,IAAI,GAAG,GAAG,QAAQ,IAAI,IAAI,EAAE,IAAI,IAAI;AAAA,QACxD,OAAO,EAAE;AAAA,QACT,QAAQ,EAAE;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,gBAAgC,CAAC;AACvC,aAAW,YAAY,cAAc;AACnC,UAAM,CAAC,IAAI,EAAE,IAAI,SAAS,MAAM,GAAG;AACnC,UAAM,OAAO,sBAAsB,IAAI,QAAQ;AAC/C,kBAAc,KAAK;AAAA,MACjB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,OAAO,MAAM,SAAS;AAAA,MACtB,QAAQ,MAAM,UAAU;AAAA,MACxB,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACA,aAAW,YAAY,qBAAqB;AAC1C,UAAM,CAAC,IAAI,EAAE,IAAI,SAAS,MAAM,GAAG;AACnC,UAAM,OAAO,sBAAsB,IAAI,QAAQ;AAC/C,kBAAc,KAAK;AAAA,MACjB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,OAAO,MAAM,SAAS;AAAA,MACtB,QAAQ,MAAM,UAAU;AAAA,MACxB,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAEA,SAAO,gBAAgB;AAGvB,SAAO,eAAe,MAAM;AAAA,IAC1B,EAAE,IAAI,WAAW,IAAI,aAAa,MAAM,OAAO,KAAK;AAAA,IACpDA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AACT;AAeA,eAAe,oBACb,QACAA,cACAF,iBACgC;AAChC,QAAM,UAMD,CAAC;AAGN,QAAM,iBAAiB,MAAM,mBAAmBE,YAAW;AAC3D,aAAW,OAAO,gBAAgB;AAChC,eAAW,KAAK,IAAI,aAAa;AAC/B,cAAQ,KAAK;AAAA,QACX,IAAI,EAAE;AAAA,QACN,MAAM,EAAE;AAAA,QACR,OAAO,EAAE;AAAA,QACT,aAAa,IAAI,QAAQ;AAAA,QACzB,eAAeJ,UAAQ,IAAI,aAAa,eAAe,EAAE,IAAI;AAAA,MAC/D,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,oBAAoB,MAAM,sBAAsBE,eAAc;AACpE,aAAW,MAAM,mBAAmB;AAClC,YAAQ,KAAK;AAAA,MACX,IAAI,GAAG;AAAA,MACP,MAAM,GAAG,OAAO,QAAQ,GAAG;AAAA,MAC3B,OAAO,GAAG,OAAO;AAAA,MACjB,aAAa;AAAA,MACb,eAAe,GAAG;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,QAAM,aAAoC,CAAC;AAC3C,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,OAAO,OAAO,GAAI;AAC7B,UAAM,WAAW,MAAM,0BAA0B,OAAO,eAAe,MAAM;AAC7E,QAAI,WAAW,GAAG;AAChB,iBAAW,KAAK;AAAA,QACd,UAAU,OAAO;AAAA,QACjB,YAAY,OAAO;AAAA,QACnB,aAAa,OAAO;AAAA,QACpB,mBAAmB,OAAO;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,WAAW,UAAU,oBAAqB;AAAA,EAChD;AAEA,SAAO,WAAW,MAAM,GAAG,mBAAmB;AAChD;AAEA,eAAe,0BACb,WACA,QACiB;AACjB,QAAM,SAAmB,CAAC;AAG1B,QAAM,eAAeF,UAAQ,WAAW,eAAe;AACvD,MAAI,MAAM,WAAW,YAAY,GAAG;AAClC,UAAM,UAAU,MAAMF,UAAS,cAAc,OAAO;AACpD,UAAM,aAAa,QAAQ,MAAM,8CAA8C;AAC/E,QAAI,WAAY,QAAO,KAAK,WAAW,CAAC,CAAC;AAAA,EAC3C;AAEA,aAAW,YAAY,CAAC,eAAe,eAAe,YAAY,GAAG;AACnE,UAAM,OAAOE,UAAQ,WAAW,QAAQ;AACxC,QAAI,MAAM,WAAW,IAAI,GAAG;AAC1B,UAAI;AACF,eAAO,KAAK,MAAMF,UAAS,MAAM,OAAO,CAAC;AAAA,MAC3C,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ;AACZ,QAAM,WAAW,2BAA2B,MAAM;AAClD,aAAW,QAAQ,QAAQ;AACzB,eAAW,WAAW,UAAU;AAC9B,YAAM,UAAU,KAAK,MAAM,OAAO;AAClC,UAAI,QAAS,UAAS,QAAQ;AAAA,IAChC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,2BAA2B,QAAmC;AACrE,QAAM,WAAqB,CAAC;AAE5B,WAAS,KAAK,IAAI,OAAO,gBAAgB,kBAAkB,OAAO,EAAE,CAAC,aAAa,GAAG,CAAC;AACtF,MAAI,OAAO,aAAa;AAEtB,aAAS;AAAA,MACP,IAAI;AAAA,QACF,aAAa,kBAAkB,OAAO,WAAW,CAAC,gBAAgB,kBAAkB,OAAO,IAAI,CAAC;AAAA,QAChG;AAAA,MACF;AAAA,IACF;AAEA,aAAS;AAAA,MACP,IAAI,OAAO,UAAU,kBAAkB,OAAO,IAAI,CAAC,aAAa,GAAG;AAAA,IACrE;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAuB;AAChD,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;AAMA,eAAsB,wBACpBM,cACAF,iBACA,IACkC;AAClC,QAAM,WAAW,MAAM,sBAAsBE,cAAaF,iBAAgB,EAAE;AAC5E,MAAI,CAAC,SAAU,QAAO;AAEtB,MAAI,CAAC,SAAS,cAAc,SAAS,aAAa;AAGhD,UAAM,SAAS,MAAM,oBAAoBE,cAAa,SAAS,aAAa,SAAS,cAAc;AACnG,QAAI,CAAC,OAAQ,QAAO;AACpB,WAAO,eAAe,MAAM;AAAA,MAC1B,EAAE,IAAI,OAAO,IAAI,aAAa,OAAO,aAAa,MAAM,OAAO,KAAK;AAAA,MACpEA;AAAA,MACAF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGA,QAAM,mBAAmB,MAAM,gCAAgC,QAAQ;AACvE,MAAI,CAAC,iBAAkB,QAAO;AAC9B,mBAAiB,eAAe,MAAM;AAAA,IACpC,EAAE,IAAI,iBAAiB,IAAI,aAAa,MAAM,MAAM,iBAAiB,KAAK;AAAA,IAC1EE;AAAA,IACAF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,gCACb,UACkC;AAClC,QAAM,gBAAgB,SAAS;AAC/B,QAAM,mBAAmBF,UAAQ,eAAe,eAAe;AAC/D,MAAI,CAAE,MAAM,WAAW,gBAAgB,EAAI,QAAO;AAElD,QAAM,oBAAoB,MAAMF,UAAS,kBAAkB,OAAO;AAClE,QAAM,aAAa,oBAAoB,iBAAiB;AAExD,MAAI,OAAiC;AACrC,QAAM,WAAWE,UAAQ,eAAe,SAAS;AACjD,MAAI,MAAM,WAAW,QAAQ,GAAG;AAC9B,UAAM,SAAS,UAAU,MAAMF,UAAS,UAAU,OAAO,CAAC;AAC1D,WAAO,EAAE,QAAQ,OAAO,QAAQ,SAAS,OAAO,SAAS,MAAM,OAAO,KAAK;AAAA,EAC7E;AAEA,MAAI,aAA6C;AACjD,QAAM,iBAAiBE,UAAQ,eAAe,eAAe;AAC7D,MAAI,MAAM,WAAW,cAAc,GAAG;AACpC,UAAM,SAAS,gBAAgB,MAAMF,UAAS,gBAAgB,OAAO,CAAC;AACtE,iBAAa,EAAE,SAAS,OAAO,SAAS,MAAM,OAAO,KAAK;AAAA,EAC5D;AAEA,MAAI,UAAuC;AAC3C,QAAM,cAAcE,UAAQ,eAAe,YAAY;AACvD,MAAI,MAAM,WAAW,WAAW,GAAG;AACjC,UAAM,SAAS,aAAa,MAAMF,UAAS,aAAa,OAAO,CAAC;AAChE,cAAU,EAAE,SAAS,OAAO,SAAS,cAAc,OAAO,cAAc,MAAM,OAAO,KAAK;AAAA,EAC5F;AAEA,MAAI,iBAAqD;AACzD,QAAM,qBAAqBE,UAAQ,eAAe,oBAAoB;AACtE,MAAI,MAAM,WAAW,kBAAkB,GAAG;AACxC,UAAM,SAAS,oBAAoB,MAAMF,UAAS,oBAAoB,OAAO,CAAC;AAC9E,qBAAiB,EAAE,SAAS,OAAO,SAAS,eAAe,OAAO,eAAe,MAAM,OAAO,KAAK;AAAA,EACrG;AAEA,MAAI,WAAyC;AAC7C,QAAM,eAAeE,UAAQ,eAAe,aAAa;AACzD,MAAI,MAAM,WAAW,YAAY,GAAG;AAClC,UAAM,SAAS,cAAc,MAAMF,UAAS,cAAc,OAAO,CAAC;AAClE,eAAW,EAAE,SAAS,OAAO,SAAS,YAAY,OAAO,YAAY,SAAS,OAAO,QAAQ;AAAA,EAC/F;AAEA,MAAI,WAAyC;AAC7C,QAAM,eAAeE,UAAQ,eAAe,aAAa;AACzD,MAAI,MAAM,WAAW,YAAY,GAAG;AAClC,UAAM,SAAS,cAAc,MAAMF,UAAS,cAAc,OAAO,CAAC;AAClE,eAAW,EAAE,SAAS,OAAO,SAAS,YAAY,OAAO,YAAY,SAAS,OAAO,QAAQ;AAAA,EAC/F;AAEA,QAAM,SAA2B;AAAA,IAC/B,IAAI,WAAW;AAAA,IACf,aAAa;AAAA,IACb,MAAM,WAAW,QAAQ,SAAS;AAAA,IAClC,OAAO,WAAW;AAAA,IAClB,QAAQ,WAAW;AAAA,IACnB,UAAU,WAAW;AAAA,IACrB,UAAU,WAAW;AAAA,IACrB,WAAW,CAAC;AAAA;AAAA,IACZ,OAAO,CAAC;AAAA,IACR,cAAc,CAAC;AAAA,IACf,eAAe,CAAC;AAAA,IAChB,eAAe,WAAW;AAAA,IAC1B,WAAW,WAAW;AAAA,IACtB,aAAa,WAAW;AAAA,IACxB,MAAM,WAAW;AAAA,IACjB,SAAS,WAAW;AAAA,IACpB,SAAS,WAAW;AAAA,IACpB,MAAM,WAAW;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,CAAC;AAAA,IACf,sBAAsB,MAAM,kCAAkC,UAAU;AAAA,EAC1E;AAEA,SAAO;AACT;AAOA,eAAe,mBAAmBM,cAA+C;AAC/E,MAAI,CAAE,MAAM,WAAWA,YAAW,GAAI;AACpC,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,CAAC,qBAAqB,IAAIA,YAAW,GAAG;AAC1C,yBAAqB,IAAIA,YAAW;AACpC,UAAM,0BAA0BA,YAAW;AAAA,EAC7C;AAEA,QAAM,UAAU,MAAMP,SAAQO,cAAa,EAAE,eAAe,KAAK,CAAC;AAClE,QAAM,cAAc,QAAQ,OAAO,CAAC,UAAU,MAAM,YAAY,KAAK,CAAC,MAAM,KAAK,WAAW,GAAG,CAAC;AAChG,QAAM,UAA2B,CAAC;AAElC,aAAW,SAAS,aAAa;AAC/B,UAAM,cAAcJ,UAAQI,cAAa,MAAM,IAAI;AACnD,UAAM,gBAAgBJ,UAAQ,aAAa,YAAY;AAEvD,QAAI,CAAE,MAAM,WAAW,aAAa,GAAI;AACtC;AAAA,IACF;AAEA,UAAM,iBAAiB,MAAMF,UAAS,eAAe,OAAO;AAC5D,UAAM,UAAU,aAAa,cAAc;AAC3C,UAAM,cAAc,MAAM,sBAAsB,WAAW;AAC3D,UAAM,SAAS,MAAM,mBAAmB,aAAa,SAAS,WAAW;AACzE,UAAM,UAAU,4BAA4B,QAAQ,SAAS,WAAW;AAExE,YAAQ,KAAK;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB,MAAM,oBAAoB,aAAa,WAAW;AAAA,MACnE,SAAS;AAAA,QACP,MAAM,QAAQ,QAAQ,MAAM;AAAA,QAC5B,OAAO,QAAQ;AAAA,QACf,QAAQ,OAAO;AAAA,QACf,gBAAgB,QAAQ;AAAA,QACxB,UAAU,QAAQ;AAAA,QAClB,YAAY,QAAQ;AAAA,QACpB,gBAAgB,QAAQ;AAAA,QACxB,SAAS,QAAQ;AAAA,QACjB;AAAA,QACA,MAAM,QAAQ;AAAA,QACd,UAAU,OAAO;AAAA,QACjB,gBAAgB,OAAO;AAAA,QACvB,WAAW,QAAQ;AAAA,MACrB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,UAAQ,KAAK,CAAC,MAAM,UAAU,kBAAkB,MAAM,QAAQ,SAAS,KAAK,QAAQ,OAAO,CAAC;AAC5F,SAAO;AACT;AAEA,eAAe,sBAAsB,aAAkD;AACrF,QAAMI,kBAAiBF,UAAQ,aAAa,aAAa;AACzD,MAAI,CAAE,MAAM,WAAWE,eAAc,GAAI;AACvC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAU,MAAML,SAAQK,iBAAgB,EAAE,eAAe,KAAK,CAAC;AACrE,QAAM,UAA8B,CAAC;AAErC,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY,GAAG;AACxB;AAAA,IACF;AAEA,UAAM,eAAeF,UAAQE,iBAAgB,MAAM,MAAM,eAAe;AACxE,QAAI,CAAE,MAAM,WAAW,YAAY,GAAI;AACrC;AAAA,IACF;AAEA,UAAM,UAAU,MAAMJ,UAAS,cAAc,OAAO;AACpD,YAAQ,KAAK,oBAAoB,OAAO,CAAC;AAAA,EAC3C;AAEA,UAAQ,KAAK,CAAC,MAAM,UAAU,kBAAkB,MAAM,SAAS,KAAK,OAAO,CAAC;AAC5E,SAAO;AACT;AAEA,eAAe,cAAc,aAAiD;AAC5E,QAAM,eAAeE,UAAQ,aAAa,WAAW;AACrD,MAAI,CAAE,MAAM,WAAW,YAAY,GAAI;AACrC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAU,MAAMH,SAAQ,cAAc,EAAE,eAAe,KAAK,CAAC;AACnE,QAAM,UAA6B,CAAC;AAEpC,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,KAAK,KAAK,MAAM,KAAK,WAAW,GAAG,GAAG;AAChF;AAAA,IACF;AAEA,UAAM,WAAWG,UAAQ,cAAc,MAAM,IAAI;AACjD,UAAM,UAAU,MAAMF,UAAS,UAAU,OAAO;AAChD,UAAM,SAAS,cAAc,OAAO;AACpC,YAAQ,KAAK;AAAA,MACX,MAAM,OAAO;AAAA,MACb,MAAM,MAAM,KAAK,QAAQ,SAAS,EAAE;AAAA,MACpC,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,MACf,oBAAoB,OAAO;AAAA,MAC3B,SAAS,OAAO;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,UAAQ,KAAK,CAAC,MAAM,UAAU,kBAAkB,MAAM,SAAS,KAAK,OAAO,CAAC;AAC5E,SAAO;AACT;AAEA,eAAe,aAAa,aAA+C;AACzE,QAAM,cAAcE,UAAQ,aAAa,UAAU;AACnD,MAAI,CAAE,MAAM,WAAW,WAAW,GAAI;AACpC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAU,MAAMH,SAAQ,aAAa,EAAE,eAAe,KAAK,CAAC;AAClE,QAAM,UAA2B,CAAC;AAElC,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,KAAK,KAAK,MAAM,KAAK,WAAW,GAAG,GAAG;AAChF;AAAA,IACF;AAEA,UAAM,WAAWG,UAAQ,aAAa,MAAM,IAAI;AAChD,UAAM,UAAU,MAAMF,UAAS,UAAU,OAAO;AAChD,UAAM,SAAS,YAAY,OAAO;AAClC,YAAQ,KAAK;AAAA,MACX,MAAM,OAAO;AAAA,MACb,MAAM,MAAM,KAAK,QAAQ,SAAS,EAAE;AAAA,MACpC,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO;AAAA,MACd,kBAAkB,OAAO;AAAA,MACzB,SAAS,OAAO;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,UAAQ,KAAK,CAAC,MAAM,UAAU,kBAAkB,MAAM,SAAS,KAAK,OAAO,CAAC;AAC5E,SAAO;AACT;AAEA,eAAe,oBACb,aACA,aACwB;AACxB,QAAM,aAAaE,UAAQ,aAAa,YAAY;AACpD,MAAI,MAAM,WAAW,UAAU,GAAG;AAChC,UAAM,gBAAgB,MAAMF,UAAS,YAAY,OAAO;AACxD,UAAM,SAAS,YAAY,aAAa;AACxC,UAAM,eAAe,oBAAoB,OAAO,IAAI;AACpD,QAAI,cAAc;AAChB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,qBAAqB,WAAW;AACzC;AAEA,eAAe,mBACb,aACA,SACA,aAKC;AACD,QAAM,WAA2B,EAAE,OAAO,YAAY,OAAO;AAE7D,MAAI,gBAAgB;AACpB,aAAW,cAAc,aAAa;AACpC,UAAM,IAAI,WAAW;AACrB,aAAS,CAAC,KAAK,SAAS,CAAC,KAAK,KAAK;AACnC,qBAAiB,MAAM,mBAAmB,aAAa,WAAW,IAAI;AAAA,EACxE;AAEA,QAAM,iBAAiC;AAAA,IACrC,cAAc,SAAS,SAAS,KAAK;AAAA,IACrC,aAAa,SAAS,QAAQ,KAAK;AAAA,IACnC;AAAA,EACF;AAEA,MAAI,SAAS;AACb,MAAI,QAAQ,gBAAgB;AAC1B,aAAS,QAAQ;AAAA,EACnB,WAAW,QAAQ,UAAU;AAC3B,aAAS;AAAA,EACX,WAAW,SAAS,QAAQ,MAAM,SAAS,WAAW,KAAK,OAAO,SAAS,OAAO;AAChF,aAAS;AAAA,EACX,YAAY,SAAS,aAAa,KAAK,KAAK,MAAM,SAAS,QAAQ,KAAK,KAAK,GAAG;AAC9E,aAAS;AAAA,EACX,YAAY,SAAS,QAAQ,KAAK,KAAK,GAAG;AACxC,aAAS;AAAA,EACX,YAAY,SAAS,SAAS,KAAK,KAAK,GAAG;AACzC,aAAS;AAAA,EACX,WAAW,SAAS,UAAU,MAAM,SAAS,SAAS,KAAK,OAAO,SAAS,OAAO;AAChF,aAAS;AAAA,EACX,OAAO;AACL,aAAS;AAAA,EACX;AAEA,SAAO,EAAE,UAAU,gBAAgB,OAAO;AAC5C;AAEA,SAAS,oBAAoB,YAAiD;AAC5E,SAAO;AAAA,IACL,IAAI,WAAW;AAAA,IACf,MAAM,WAAW;AAAA,IACjB,OAAO,WAAW;AAAA,IAClB,QAAQ,WAAW;AAAA,IACnB,UAAU,WAAW;AAAA,IACrB,UAAU,WAAW;AAAA,IACrB,WAAW,WAAW;AAAA,IACtB,OAAO,WAAW;AAAA,IAClB,SAAS,WAAW;AAAA,EACtB;AACF;AAEA,eAAe,sBACbM,cACA,eACA,YAC8B;AAC9B,SAAO;AAAA,IACL,GAAG,oBAAoB,UAAU;AAAA,IACjC,aAAa,cAAc,QAAQ;AAAA,IACnC,cAAc,cAAc,QAAQ;AAAA,IACpC,eAAe,WAAW;AAAA,IAC1B,kBAAkB,cAAc,QAAQ;AAAA,IACxC,sBAAsB,MAAM;AAAA,MAC1BA;AAAA,MACA,cAAc,QAAQ;AAAA,MACtB,WAAW;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;AAWA,SAAS,qBAAqB,aAAgD;AAC5E,QAAM,QAAkB,CAAC;AACzB,QAAM,eAAe,oBAAI,IAAY;AAErC,aAAW,cAAc,aAAa;AACpC,eAAW,cAAc,WAAW,WAAW;AAC7C,YAAM,YAAY,qBAAqB,aAAa,UAAU;AAC9D,mBAAa,IAAI,SAAS;AAC1B,mBAAa,IAAI,WAAW,MAAM;AAClC,YAAM;AAAA,QACJ,OAAO,UAAU,MAAM,SAAS,QAAQ,WAAW,IAAI,MAAM,WAAW,MAAM;AAAA,MAChF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,YAAsB,CAAC;AAC7B,aAAW,UAAU,cAAc;AACjC,UAAM,SAAS,qBAAqB,MAAM,KAAK;AAC/C,cAAU,KAAK,gBAAgB,MAAM,IAAI,MAAM,EAAE;AAAA,EACnD;AAEA,SAAO,CAAC,YAAY,GAAG,OAAO,GAAG,SAAS,EAAE,KAAK,IAAI;AACvD;AAEA,SAAS,qBAAqB,aAAiC,MAAsB;AACnF,SAAO,YAAY,KAAK,CAAC,eAAe,WAAW,SAAS,IAAI,GAAG,UAAU;AAC/E;AAEA,eAAe,wBACbA,cACA,aACA,gBACA,YACuC;AACvC,QAAM,SAAS,MAAM,gBAAgB;AACrC,QAAM,iBAAiB,yBAAyB,MAAM;AACtD,QAAM,UAAwC,CAAC;AAC/C,QAAM,cAAcJ,UAAQI,cAAa,WAAW;AAEpD,aAAW,cAAc,gBAAgB;AACvC,QAAI,UAAyB;AAE7B,QAAI,WAAW,YAAY,WAAW,CAAC,WAAW,UAAU;AAC1D,gBAAU;AAAA,IACZ;AAEA,QAAI,WAAW,YAAY,WAAW,WAAW,UAAU,SAAS,GAAG;AACrE,YAAM,oBAAoB,MAAM,qBAAqB,aAAa,WAAW,WAAW,OAAO,gBAAgB;AAC/G,UAAI,kBAAkB,SAAS,GAAG;AAChC,kBAAU,uBAAuB,kBAAkB,KAAK,IAAI,CAAC;AAAA,MAC/D;AAAA,IACF;AAEA,UAAM,SAAS,gBAAgB,WAAW,QAAQ,WAAW,SAAS,OAAO,eAAe;AAE5F,YAAQ,KAAK;AAAA,MACX,SAAS,WAAW;AAAA,MACpB,OAAO,WAAW;AAAA,MAClB,aAAa,WAAW;AAAA,MACxB,cAAc,UAAU,WAAW;AAAA,MACnC,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB;AAAA,MACA,gBAAgB,WAAW;AAAA,IAC7B,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,eAAe,qBAAqB,aAAqB,WAAqBG,mBAA2D;AACvI,QAAM,YAAYA,qBAAoB,oBAAI,IAAI,CAAC,WAAW,CAAC;AAC3D,QAAM,QAAkB,CAAC;AAEzB,aAAW,cAAc,WAAW;AAClC,UAAM,iBAAiBP,UAAQ,aAAa,eAAe,YAAY,eAAe;AACtF,QAAI,CAAE,MAAM,WAAW,cAAc,GAAI;AACvC,YAAM,KAAK,GAAG,UAAU,YAAY;AACpC;AAAA,IACF;AAEA,UAAM,UAAU,MAAMF,UAAS,gBAAgB,OAAO;AACtD,UAAM,SAAS,oBAAoB,OAAO;AAC1C,QAAI,CAAC,UAAU,IAAI,OAAO,MAAM,GAAG;AACjC,YAAM,KAAK,GAAG,UAAU,KAAK,OAAO,MAAM,GAAG;AAAA,IAC/C;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,oBACP,gBACA,oBAAwC,CAAC,GACxB;AACjB,QAAM,QAAyB,CAAC;AAEhC,aAAW,UAAU,gBAAgB;AACnC,eAAW,cAAc,OAAO,aAAa;AAC3C,YAAM,QAAQ,QAAQ,WAAW,OAAO;AACxC,YAAM,OAAO;AAAA,QACX,aAAa,OAAO,QAAQ;AAAA,QAC5B,cAAc,OAAO,QAAQ;AAAA,QAC7B,gBAAgB,WAAW;AAAA,QAC3B,iBAAiB,WAAW;AAAA,QAC5B,QAAQ,WAAW;AAAA,QACnB,SAAS,WAAW;AAAA,QACpB,MAAM,aAAa,OAAO,QAAQ,IAAI,gBAAgB,WAAW,IAAI;AAAA,QACrE,eAAe,WAAW;AAAA,QAC1B;AAAA,MACF;AAEA,UAAI,WAAW,WAAW,UAAU;AAClC,cAAM,KAAK;AAAA,UACT,IAAI,GAAG,OAAO,QAAQ,IAAI,IAAI,WAAW,IAAI;AAAA,UAC7C,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAEA,UAAI,WAAW,WAAW,WAAW;AACnC,cAAM,KAAK;AAAA,UACT,IAAI,GAAG,OAAO,QAAQ,IAAI,IAAI,WAAW,IAAI;AAAA,UAC7C,UAAU;AAAA,UACV,QAAQ,WAAW,iBAAiB;AAAA,UACpC,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAEA,UAAI,WAAW,WAAW,UAAU;AAClC,cAAM,KAAK;AAAA,UACT,IAAI,GAAG,OAAO,QAAQ,IAAI,IAAI,WAAW,IAAI;AAAA,UAC7C,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAEA,UAAI,OAAO;AACT,cAAM,KAAK;AAAA,UACT,IAAI,GAAG,OAAO,QAAQ,IAAI,IAAI,WAAW,IAAI;AAAA,UAC7C,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,aAAW,MAAM,mBAAmB;AAClC,UAAM,aAAa,GAAG;AACtB,UAAM,QAAQ,QAAQ,WAAW,OAAO;AACxC,UAAM,OAAO;AAAA,MACX,aAAa;AAAA,MACb,cAAc;AAAA,MACd,gBAAgB,WAAW,QAAQ,GAAG;AAAA,MACtC,iBAAiB,WAAW;AAAA,MAC5B,QAAQ,WAAW;AAAA,MACnB,SAAS,WAAW;AAAA,MACpB,MAAM,gBAAgB,GAAG,EAAE;AAAA,MAC3B,eAAe,WAAW;AAAA,MAC1B;AAAA,IACF;AAEA,QAAI,WAAW,WAAW,UAAU;AAClC,YAAM,KAAK,EAAE,IAAI,cAAc,GAAG,EAAE,WAAW,UAAU,YAAY,QAAQ,gDAAgD,GAAG,KAAK,CAAC;AAAA,IACxI;AACA,QAAI,WAAW,WAAW,WAAW;AACnC,YAAM,KAAK,EAAE,IAAI,cAAc,GAAG,EAAE,YAAY,UAAU,QAAQ,QAAQ,WAAW,iBAAiB,yCAAyC,GAAG,KAAK,CAAC;AAAA,IAC1J;AACA,QAAI,WAAW,WAAW,UAAU;AAClC,YAAM,KAAK,EAAE,IAAI,cAAc,GAAG,EAAE,WAAW,UAAU,UAAU,QAAQ,qBAAqB,GAAG,KAAK,CAAC;AAAA,IAC3G;AACA,QAAI,OAAO;AACT,YAAM,KAAK,EAAE,IAAI,cAAc,GAAG,EAAE,UAAU,UAAU,OAAO,QAAQ,4DAA4D,GAAG,KAAK,CAAC;AAAA,IAC9I;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,qBAAqB;AACzC;AAEA,SAAS,oBACP,gBACA,oBAAwC,CAAC,GACnB;AACtB,QAAM,WAAiC,CAAC;AAExC,aAAW,UAAU,gBAAgB;AACnC,aAAS,KAAK;AAAA,MACZ,IAAI,WAAW,OAAO,QAAQ,IAAI;AAAA,MAClC,MAAM;AAAA,MACN,OAAO,OAAO,QAAQ;AAAA,MACtB,SAAS,OAAO,QAAQ;AAAA,MACxB,MAAM,aAAa,OAAO,QAAQ,IAAI;AAAA,MACtC,aAAa,OAAO,QAAQ;AAAA,MAC5B,cAAc,OAAO,QAAQ;AAAA,MAC7B,gBAAgB;AAAA,MAChB,SAAS,qBAAqB,OAAO,QAAQ,MAAM;AAAA,IACrD,CAAC;AAED,eAAW,cAAc,OAAO,aAAa;AAC3C,eAAS,KAAK;AAAA,QACZ,IAAI,cAAc,OAAO,QAAQ,IAAI,IAAI,WAAW,IAAI;AAAA,QACxD,MAAM;AAAA,QACN,OAAO,WAAW;AAAA,QAClB,SAAS,WAAW;AAAA,QACpB,MAAM,aAAa,OAAO,QAAQ,IAAI,gBAAgB,WAAW,IAAI;AAAA,QACrE,aAAa,OAAO,QAAQ;AAAA,QAC5B,cAAc,OAAO,QAAQ;AAAA,QAC7B,gBAAgB,WAAW;AAAA,QAC3B,SAAS,iBAAiB,WAAW,MAAM,SAAS,WAAW,QAAQ;AAAA,MACzE,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,MAAM,mBAAmB;AAClC,UAAM,aAAa,GAAG;AACtB,aAAS,KAAK;AAAA,MACZ,IAAI,yBAAyB,GAAG,EAAE;AAAA,MAClC,MAAM;AAAA,MACN,OAAO,WAAW;AAAA,MAClB,SAAS,WAAW;AAAA,MACpB,MAAM,gBAAgB,GAAG,EAAE;AAAA,MAC3B,aAAa;AAAA,MACb,cAAc;AAAA,MACd,gBAAgB,WAAW,QAAQ,GAAG;AAAA,MACtC,SAAS,4BAA4B,WAAW,MAAM,SAAS,WAAW,QAAQ;AAAA,IACpF,CAAC;AAAA,EACH;AAEA,WAAS,KAAK,CAAC,MAAM,UAAU,kBAAkB,MAAM,SAAS,KAAK,OAAO,CAAC;AAC7E,SAAO;AACT;AAEA,SAAS,sBAAsB,MAAqB,OAA8B;AAChF,QAAM,eAAe,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,EAAE;AAC/D,QAAM,qBAAqB,aAAa,KAAK,QAAQ,IAAI,aAAa,MAAM,QAAQ;AACpF,MAAI,uBAAuB,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,SAAO,kBAAkB,MAAM,SAAS,KAAK,OAAO;AACtD;AAEA,SAAS,kBAAkB,MAAc,OAAuB;AAC9D,SAAO,eAAe,IAAI,IAAI,eAAe,KAAK;AACpD;AAEA,SAAS,eAAe,WAA2B;AACjD,QAAM,SAAS,KAAK,MAAM,SAAS;AACnC,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,QAAQ,SAA0B;AACzC,QAAM,YAAY,eAAe,OAAO;AACxC,MAAI,cAAc,GAAG;AACnB,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,IAAI,YAAY;AAClC;AAOA,eAAe,mBACb,aACA,gBACiB;AACjB,QAAM,eAAeE;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAE,MAAM,WAAW,YAAY,GAAI;AACrC,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,UAAU,MAAMF,UAAS,cAAc,OAAO;AACpD,UAAM,SAAS,cAAc,OAAO;AACpC,WAAO,OAAO,QAAQ;AAAA,MACpB,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,aAAa;AAAA,IACjD,EAAE;AAAA,EACJ,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,4BAA4B,gBAAwB,aAAyC;AACpG,MAAI,SAAS;AACb,aAAW,cAAc,aAAa;AACpC,QAAI,kBAAkB,WAAW,SAAS,MAAM,IAAI,GAAG;AACrD,eAAS,WAAW;AAAA,IACtB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,gBACPM,cACA,cACA,aACA,gBACe;AACf,UAAQ,cAAc;AAAA,IACpB,KAAK;AACH,aAAOJ,UAAQI,cAAa,aAAa,YAAY;AAAA,IACvD,KAAK;AACH,aAAO,iBACHJ,UAAQI,cAAa,aAAa,eAAe,gBAAgB,eAAe,IAChF;AAAA,IACN,KAAK;AACH,aAAO,iBACHJ,UAAQI,cAAa,aAAa,eAAe,gBAAgB,SAAS,IAC1E;AAAA,IACN,KAAK;AACH,aAAO,iBACHJ,UAAQI,cAAa,aAAa,eAAe,gBAAgB,eAAe,IAChF;AAAA,IACN,KAAK;AACH,aAAO,iBACHJ,UAAQI,cAAa,aAAa,eAAe,gBAAgB,YAAY,IAC7E;AAAA,IACN,KAAK;AACH,aAAO,iBACHJ,UAAQI,cAAa,aAAa,eAAe,gBAAgB,oBAAoB,IACrF;AAAA,IACN;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,yBACP,cACA,aACA,gBACQ;AACR,UAAQ,cAAc;AAAA,IACpB,KAAK;AACH,aAAO,iBAAiB,WAAW;AAAA,IACrC,KAAK;AACH,aAAO,oBAAoB,kBAAkB,YAAY;AAAA,IAC3D,KAAK;AACH,aAAO,cAAc,kBAAkB,YAAY;AAAA,IACrD,KAAK;AACH,aAAO,oBAAoB,kBAAkB,YAAY;AAAA,IAC3D,KAAK;AACH,aAAO,mBAAmB,kBAAkB,YAAY;AAAA,IAC1D,KAAK;AACH,aAAO,oBAAoB,kBAAkB,YAAY;AAAA,IAC3D,KAAK;AACH,aAAO,kBAAkB,WAAW;AAAA,IACtC;AACE,aAAO;AAAA,EACX;AACF;AAIA,eAAsB,cAAcI,eAAkD;AACpF,MAAI,CAAE,MAAM,WAAWA,aAAY,EAAI,QAAO,CAAC;AAE/C,QAAM,UAAU,MAAMX,SAAQW,eAAc,EAAE,eAAe,KAAK,CAAC;AACnE,QAAM,YAA+B,CAAC;AAEtC,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,KAAK,KAAK,MAAM,KAAK,WAAW,GAAG,KAAK,MAAM,SAAS,cAAe;AAElH,UAAM,WAAWR,UAAQQ,eAAc,MAAM,IAAI;AACjD,UAAM,MAAM,MAAMV,UAAS,UAAU,OAAO;AAC5C,UAAM,SAAS,cAAc,GAAG;AAEhC,UAAM,OAAO,OAAO,QAAQ,MAAM,KAAK,QAAQ,SAAS,EAAE;AAC1D,cAAU,KAAK;AAAA,MACb;AAAA,MACA,MAAM,OAAO,QAAQ;AAAA,MACrB,aAAa,OAAO;AAAA,MACpB,WAAW,OAAO;AAAA,MAClB,MAAM,OAAO;AAAA,MACb,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,SAAO,UAAU,KAAK,CAAC,GAAG,OAAO,EAAE,WAAW,EAAE,SAAS,cAAc,EAAE,WAAW,EAAE,OAAO,CAAC;AAChG;AAEA,eAAsB,kBACpBU,eACA,MACgC;AAChC,QAAM,WAAWR,UAAQQ,eAAc,GAAG,IAAI,KAAK;AACnD,MAAI,CAAE,MAAM,WAAW,QAAQ,EAAI,QAAO;AAE1C,QAAM,MAAM,MAAMV,UAAS,UAAU,OAAO;AAC5C,QAAM,SAAS,cAAc,GAAG;AAEhC,SAAO;AAAA,IACL,MAAM,OAAO,QAAQ;AAAA,IACrB,MAAM,OAAO,QAAQ;AAAA,IACrB,aAAa,OAAO;AAAA,IACpB,WAAW,OAAO;AAAA,IAClB,MAAM,OAAO;AAAA,IACb,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,IAChB,MAAM,OAAO;AAAA,EACf;AACF;AA3vDA,IA+CM,qBACA,sBACA,0BACA,uBACA,uBAoDA,gCAkDA,uBAwCF,eAoqBE,qBA6PA,sBAmPA;AAr1CN;AAAA;AAAA;AAEA;AACA;AACA,IAAAW;AACA;AACA;AACA;AAeA;AAyBA,IAAM,sBAAsB,IAAI,KAAK,KAAK,KAAK;AAC/C,IAAM,uBAAuB;AAC7B,IAAM,2BAA2B;AACjC,IAAM,wBAAwB;AAC9B,IAAM,wBAAwB;AAoD9B,IAAM,iCAKD;AAAA,MACH;AAAA,QACE,SAAS;AAAA,QACT,OAAO;AAAA,QACP,aAAa;AAAA,QACb,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,OAAO;AAAA,QACP,aAAa;AAAA,QACb,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,OAAO;AAAA,QACP,aAAa;AAAA,QACb,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,OAAO;AAAA,QACP,aAAa;AAAA,QACb,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,OAAO;AAAA,QACP,aAAa;AAAA,QACb,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,OAAO;AAAA,QACP,aAAa;AAAA,QACb,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,OAAO;AAAA,QACP,aAAa;AAAA,QACb,gBAAgB;AAAA,MAClB;AAAA,IACF;AAEA,IAAM,wBAAgD;AAAA,MACpD,SAAS;AAAA,MACT,aAAa;AAAA,MACb,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,QAAQ;AAAA,IACV;AAiCA,IAAI,gBAA6C;AAoqBjD,IAAM,sBAAsB;AA6P5B,IAAM,uBAAuB,oBAAI,IAAY;AAmP7C,IAAM,uBAA+C;AAAA,MACnD,WAAW;AAAA,MACX,aAAa;AAAA,MACb,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA;AAAA;;;AC51CA;AAAA;AAAA,wBAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,mBAAmB;AAC5B,SAAS,YAAAC,kBAAgB;AACzB,SAAS,WAAAC,iBAAe;AAcjB,SAAS,kBAA0B;AACxC,SAAO,YAAY,CAAC,EAAE,SAAS,KAAK;AACtC;AAEO,SAAS,iBAAiB,aAAkC;AACjE,MAAI,KAAK,gBAAgB;AACzB,MAAI,WAAW;AACf,SAAO,YAAY,IAAI,EAAE,KAAK,WAAW,KAAK;AAC5C,SAAK,gBAAgB;AACrB;AAAA,EACF;AACA,SAAO;AACT;AAQA,SAASC,aAAY,QAAgE;AACnF,MAAI,WAAW,IAAK,QAAO,EAAE,QAAQ,QAAQ,SAAS,KAAK;AAC3D,MAAI,WAAW,IAAK,QAAO,EAAE,QAAQ,aAAa,SAAS,KAAK;AAChE,MAAI,WAAW,IAAK,QAAO,EAAE,QAAQ,WAAW,SAAS,KAAK;AAC9D,MAAI,OAAO,WAAW,IAAI,EAAG,QAAO,EAAE,QAAQ,eAAe,SAAS,OAAO,MAAM,CAAC,EAAE;AACtF,MAAI,WAAW,IAAK,QAAO,EAAE,QAAQ,eAAe,SAAS,KAAK;AAClE,SAAO,EAAE,QAAQ,QAAQ,SAAS,KAAK;AACzC;AAEA,SAAS,gBAAgB,SAAyB;AAEhD,SAAO,QAAQ,QAAQ,WAAW,EAAE;AACtC;AAEA,SAAS,eAAe,MAAwB;AAC9C,UAAQ,KAAK,QAAQ;AAAA,IACnB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,KAAK,UAAU,KAAK,gBAAgB,KAAK,OAAO,CAAC,KAAK;AAAA,EACjE;AACF;AAEO,SAAS,mBAAmB,MAA+B;AAChE,QAAM,QAAQ,KAAK,MAAM,UAAU;AACnC,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,SAAS,MAAM,CAAC;AACtB,QAAM,OAAO,MAAM,CAAC;AAEpB,QAAM,EAAE,QAAQ,QAAQ,IAAIA,aAAY,MAAM;AAE9C,QAAM,UAAU,KAAK,MAAM,QAAQ;AACnC,QAAM,KAAK,UAAU,QAAQ,CAAC,IAAI;AAElC,QAAM,OAAiB,CAAC;AACxB,MAAI;AACJ,QAAM,WAAW,IAAI,OAAO,UAAU,QAAQ,GAAG;AACjD,UAAQ,WAAW,SAAS,KAAK,IAAI,OAAO,MAAM;AAChD,SAAK,KAAK,SAAS,CAAC,CAAC;AAAA,EACvB;AAGA,MAAI,cAAc;AAClB,QAAM,cAAc,KAAK,OAAO,gBAAgB;AAChD,QAAM,aAAa,KAAK,OAAO,mBAAmB;AAClD,QAAM,YAAY,CAAC,aAAa,UAAU,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC;AAChE,MAAI,UAAU,SAAS,GAAG;AACxB,kBAAc,KAAK,MAAM,GAAG,KAAK,IAAI,GAAG,SAAS,CAAC,EAAE,KAAK;AAAA,EAC3D;AAEA,SAAO,EAAE,IAAI,aAAa,QAAQ,MAAM,QAAQ;AAClD;AAEO,SAAS,uBAAuB,MAAwB;AAC7D,QAAM,SAAS,eAAe,IAAI;AAClC,QAAM,SAAS,KAAK,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,KAAK,GAAG;AACrD,QAAM,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,WAAW,EAAE;AAClD,MAAI,OAAQ,OAAM,KAAK,MAAM;AAC7B,QAAM,KAAK,MAAM,KAAK,EAAE,GAAG;AAC3B,SAAO,MAAM,KAAK,GAAG;AACvB;AAEO,SAAS,eAAe,SAAgC;AAC7D,QAAM,CAAC,IAAI,IAAI,IAAI,mBAAmB,OAAO;AAC7C,QAAM,YAAY,SAAS,IAAI,WAAW,KAAK;AAC/C,QAAM,qBAAqB,SAAS,IAAI,iBAAiB,KAAK;AAC9D,QAAM,kBAAmB,CAAC,SAAS,UAAU,WAAW,OAAO,EAAE,SAAS,kBAAkB,IACxF,qBACA;AAEJ,QAAM,QAAoB,CAAC;AAC3B,aAAW,QAAQ,KAAK,MAAM,IAAI,GAAG;AACnC,UAAM,OAAO,mBAAmB,IAAI;AACpC,QAAI,KAAM,OAAM,KAAK,IAAI;AAAA,EAC3B;AAEA,SAAO,EAAE,WAAW,iBAAiB,MAAM;AAC7C;AAEO,SAAS,mBAAmB,WAAkC;AACnE,QAAM,KAAK;AAAA,IACT;AAAA,IACA,cAAc,UAAU,SAAS;AAAA,IACjC,oBAAoB,UAAU,eAAe;AAAA,IAC7C;AAAA,EACF,EAAE,KAAK,IAAI;AAEX,QAAM,SAAS;AACf,QAAM,QAAQ,UAAU,MAAM,IAAI,sBAAsB,EAAE,KAAK,IAAI;AAEnE,SAAO,GAAG,EAAE;AAAA;AAAA,EAAO,MAAM;AAAA;AAAA,EAAO,KAAK;AAAA;AACvC;AAIO,SAAS,SAAS,SAA0B;AACjD,QAAM,CAAC,IAAI,IAAI,IAAI,mBAAmB,OAAO;AAC7C,QAAM,YAAY,SAAS,IAAI,WAAW,KAAK;AAE/C,QAAM,UAAsB,CAAC;AAC7B,QAAM,WAAW,KAAK,MAAM,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtE,aAAW,WAAW,UAAU;AAC9B,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,UAAM,UAAU,MAAM,CAAC,GAAG,KAAK,KAAK;AAGpC,UAAM,eAAe,QAAQ,MAAM,oBAAoB;AACvD,QAAI,CAAC,aAAc;AAEnB,UAAM,YAAY,aAAa,CAAC;AAChC,UAAM,UAAU,aAAa,CAAC,KAAK;AACnC,UAAM,UAAU,CAAC,GAAG,QAAQ,SAAS,kBAAkB,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAEzE,UAAM,QAAkB;AAAA,MACtB;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAEA,eAAW,QAAQ,MAAM,MAAM,CAAC,GAAG;AACjC,YAAM,aAAa,KAAK,MAAM,wBAAwB;AACtD,UAAI,CAAC,WAAY;AACjB,YAAM,MAAM,WAAW,CAAC,EAAE,YAAY;AACtC,YAAM,QAAQ,WAAW,CAAC,EAAE,KAAK;AACjC,cAAQ,KAAK;AAAA,QACX,KAAK;AACH,gBAAM,QAAQ;AACd;AAAA,QACF,KAAK;AACH,gBAAM,UAAU;AAChB;AAAA,QACF,KAAK;AACH,gBAAM,SAAS;AACf;AAAA,QACF,KAAK;AACH,gBAAM,UAAU;AAChB;AAAA,QACF,KAAK;AACH,gBAAM,WAAW;AACjB;AAAA,QACF,KAAK;AACH,gBAAM,SAAS;AACf;AAAA,MACJ;AAAA,IACF;AAEA,YAAQ,KAAK,KAAK;AAAA,EACpB;AAEA,SAAO,EAAE,WAAW,QAAQ;AAC9B;AAEO,SAAS,kBAAkB,OAAyB;AACzD,QAAM,QAAQ,MAAM,QAAQ,IAAI,CAAC,OAAO,KAAK,EAAE,EAAE,EAAE,KAAK,IAAI;AAC5D,QAAM,QAAQ,CAAC,OAAO,MAAM,SAAS,WAAM,KAAK,EAAE;AAClD,MAAI,MAAM,MAAO,OAAM,KAAK,cAAc,MAAM,KAAK,EAAE;AACvD,MAAI,MAAM,QAAS,OAAM,KAAK,gBAAgB,MAAM,OAAO,EAAE;AAC7D,MAAI,MAAM,OAAQ,OAAM,KAAK,eAAe,MAAM,MAAM,EAAE;AAC1D,MAAI,MAAM,QAAS,OAAM,KAAK,gBAAgB,MAAM,OAAO,EAAE;AAC7D,MAAI,MAAM,SAAU,OAAM,KAAK,iBAAiB,MAAM,QAAQ,EAAE;AAChE,MAAI,MAAM,OAAQ,OAAM,KAAK,eAAe,MAAM,MAAM,EAAE;AAC1D,SAAO,MAAM,KAAK,IAAI;AACxB;AAIO,SAAS,cAAcC,WAAkB,WAA2B;AACzE,SAAOF,UAAQE,WAAU,GAAG,SAAS,KAAK;AAC5C;AAEO,SAAS,QAAQA,WAAkB,WAA2B;AACnE,SAAOF,UAAQE,WAAU,GAAG,SAAS,SAAS;AAChD;AAEO,SAAS,YACdA,WACA,WACA,UACA,MAAY,oBAAI,KAAK,GACb;AACR,QAAM,OAAO,IAAI,YAAY;AAC7B,QAAM,QAAQ,OAAO,IAAI,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACxD,QAAM,MAAM,OAAO,IAAI,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAEjD,MAAI;AACJ,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,eAAS,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG;AAChC;AAAA,IACF,KAAK,UAAU;AAEb,YAAM,OAAO,IAAI,KAAK,MAAM,GAAG,CAAC;AAChC,YAAM,OAAO,KAAK,OAAO,IAAI,QAAQ,IAAI,KAAK,QAAQ,KAAK,KAAQ;AACnE,YAAM,OAAO,OAAO,KAAK,MAAM,OAAO,KAAK,OAAO,IAAI,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,GAAG;AAC9E,eAAS,GAAG,IAAI,KAAK,IAAI;AACzB;AAAA,IACF;AAAA,IACA,KAAK;AACH,eAAS,GAAG,IAAI,IAAI,KAAK;AACzB;AAAA,IACF;AACE,eAAS,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG;AAAA,EACpC;AAEA,SAAOF,UAAQE,WAAU,WAAW,GAAG,SAAS,IAAI,MAAM,KAAK;AACjE;AAEA,eAAsB,cAAcA,WAAkB,WAA2C;AAC/F,QAAM,OAAO,cAAcA,WAAU,SAAS;AAC9C,MAAI,CAAE,MAAM,WAAW,IAAI,GAAI;AAC7B,WAAO,EAAE,WAAW,iBAAiB,UAAU,OAAO,CAAC,EAAE;AAAA,EAC3D;AACA,QAAM,UAAU,MAAMH,WAAS,MAAM,OAAO;AAC5C,SAAO,eAAe,OAAO;AAC/B;AAEA,eAAsB,eAAeG,WAAkB,WAAyC;AAC9F,QAAM,UAAUA,SAAQ;AACxB,QAAM,OAAO,cAAcA,WAAU,UAAU,SAAS;AACxD,QAAM,eAAe,MAAM,mBAAmB,SAAS,CAAC;AAC1D;AAEA,eAAsB,QAAQA,WAAkB,WAAqC;AACnF,QAAM,OAAO,QAAQA,WAAU,SAAS;AACxC,MAAI,CAAE,MAAM,WAAW,IAAI,GAAI;AAC7B,WAAO,EAAE,WAAW,SAAS,CAAC,EAAE;AAAA,EAClC;AACA,QAAM,UAAU,MAAMH,WAAS,MAAM,OAAO;AAC5C,SAAO,SAAS,OAAO;AACzB;AAEA,eAAsBD,gBACpBI,WACA,WACA,OACe;AACf,QAAM,UAAUA,SAAQ;AACxB,QAAM,OAAO,QAAQA,WAAU,SAAS;AACxC,MAAI;AACJ,MAAI,MAAM,WAAW,IAAI,GAAG;AAC1B,cAAU,MAAMH,WAAS,MAAM,OAAO;AACtC,cAAU,QAAQ,QAAQ,IAAI,SAAS,kBAAkB,KAAK,IAAI;AAAA,EACpE,OAAO;AACL,UAAM,KAAK;AAAA,aAAmB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AACvC,cAAU,KAAK,kBAAkB,KAAK,IAAI;AAAA,EAC5C;AACA,QAAM,eAAe,MAAM,OAAO;AACpC;AAEO,SAAS,cAAc,OAAmB;AAC/C,QAAM,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,MAAM,OAAO;AACxF,aAAW,QAAQ,OAAO;AACxB,WAAO,KAAK,MAAM;AAAA,EACpB;AACA,SAAO;AACT;AA9SA,IAgCM,YACA,UACA;AAlCN,IAAAI,eAAA;AAAA;AAAA;AAGA;AACA;AA4BA,IAAM,aAAa;AACnB,IAAM,WAAW;AACjB,IAAM,YAAY;AAAA;AAAA;;;AClClB,SAAS,UAAU,iBAAiB;AAK7B,SAAS,YAAYC,cAAqB;AAC/C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAqB,CAAC,CAAC;AACjD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AAEtD,YAAU,MAAM;AACd,QAAI,YAAY;AAEhB,mBAAe,OAAO;AACpB,UAAI;AACF,cAAM,WAAW,MAAM,aAAaA,YAAW;AAC/C,cAAM,UAAU,MAAM,QAAQ;AAAA,UAC5B,SAAS,IAAI,CAAC,MAAM,iBAAiBA,cAAa,EAAE,IAAI,CAAC;AAAA,QAC3D;AAEA,YAAI,UAAW;AAEf,cAAM,OAAmB,SAAS,IAAI,CAAC,GAAG,MAAM;AAC9C,gBAAM,SAAS,QAAQ,CAAC;AACxB,gBAAM,YAAwB,QAAQ,eAAe,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,YACnE,IAAI,KAAK,EAAE,IAAI,IAAI,EAAE,IAAI;AAAA,YACzB,MAAM;AAAA,YACN,OAAO,EAAE;AAAA,YACT,MAAM,EAAE;AAAA,YACR,aAAa,EAAE;AAAA,YACf,QAAQ,EAAE;AAAA,YACV,UAAU,EAAE;AAAA,YACZ,UAAU,EAAE;AAAA,UACd,EAAE;AAEF,iBAAO;AAAA,YACL,IAAI,KAAK,EAAE,IAAI;AAAA,YACf,MAAM;AAAA,YACN,OAAO,EAAE;AAAA,YACT,MAAM,EAAE;AAAA,YACR,aAAa,EAAE;AAAA,YACf,QAAQ,EAAE;AAAA,YACV,UAAU;AAAA,cACR,WAAW,EAAE,SAAS;AAAA,cACtB,OAAO,EAAE,SAAS;AAAA,YACpB;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AAED,iBAAS,IAAI;AACb,mBAAW,KAAK;AAAA,MAClB,SAASC,MAAK;AACZ,YAAI,CAAC,WAAW;AACd,mBAASA,gBAAe,QAAQA,KAAI,UAAU,OAAOA,IAAG,CAAC;AACzD,qBAAW,KAAK;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,SAAK;AACL,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAACD,YAAW,CAAC;AAEhB,SAAO,EAAE,OAAO,SAAS,MAAM;AACjC;AAnEA;AAAA;AAAA;AACA;AAAA;AAAA;;;ACDA,SAAS,YAAAE,WAAU,SAAS,mBAAmB;AAGxC,SAAS,aAAa,OAAmB,aAAiC;AAC/E,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAsB,oBAAI,IAAI,CAAC;AAC/D,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,CAAC;AAEtC,QAAM,WAAW,QAAQ,MAAM;AAC7B,UAAM,SAAqB,CAAC;AAC5B,eAAW,WAAW,OAAO;AAC3B,UAAI,eAAe,CAAC,YAAY,IAAI,QAAQ,EAAE,GAAG;AAC/C,cAAM,mBAAmB,QAAQ,UAAU,KAAK,CAACC,OAAM,YAAY,IAAIA,GAAE,EAAE,CAAC;AAC5E,YAAI,CAAC,iBAAkB;AAAA,MACzB;AAEA,YAAM,aAAa,SAAS,IAAI,QAAQ,EAAE,KACvC,gBAAgB,QAAQ,QAAQ,UAAU,KAAK,CAACA,OAAM,YAAY,IAAIA,GAAE,EAAE,CAAC;AAE9E,aAAO,KAAK;AAAA,QACV,GAAG;AAAA,QACH,OAAO;AAAA,QACP,UAAU;AAAA,QACV,cAAc,QAAQ,UAAU,UAAU,KAAK;AAAA,MACjD,CAAC;AAED,UAAI,cAAc,QAAQ,UAAU;AAClC,mBAAW,SAAS,QAAQ,UAAU;AACpC,cAAI,eAAe,CAAC,YAAY,IAAI,MAAM,EAAE,KAAK,CAAC,YAAY,IAAI,QAAQ,EAAE,EAAG;AAC/E,iBAAO,KAAK;AAAA,YACV,GAAG;AAAA,YACH,OAAO;AAAA,YACP,UAAU;AAAA,YACV,aAAa;AAAA,UACf,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,UAAU,WAAW,CAAC;AAEjC,QAAM,SAAS,YAAY,MAAM;AAC/B,cAAU,CAACA,OAAM,KAAK,IAAI,GAAGA,KAAI,CAAC,CAAC;AAAA,EACrC,GAAG,CAAC,CAAC;AAEL,QAAM,WAAW,YAAY,MAAM;AACjC,cAAU,CAACA,OAAM,KAAK,IAAI,SAAS,SAAS,GAAGA,KAAI,CAAC,CAAC;AAAA,EACvD,GAAG,CAAC,SAAS,MAAM,CAAC;AAEpB,QAAM,SAAS;AAAA,IACb,CAAC,WAAmB;AAClB,kBAAY,CAAC,SAAS;AACpB,cAAM,OAAO,IAAI,IAAI,IAAI;AACzB,YAAI,KAAK,IAAI,MAAM,GAAG;AACpB,eAAK,OAAO,MAAM;AAAA,QACpB,OAAO;AACL,eAAK,IAAI,MAAM;AAAA,QACjB;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,aAAa,YAAY,CAAC,WAAmB;AACjD,gBAAY,CAAC,SAAS;AACpB,UAAI,KAAK,IAAI,MAAM,EAAG,QAAO;AAC7B,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,WAAK,IAAI,MAAM;AACf,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe,YAAY,CAAC,WAAmB;AACnD,gBAAY,CAAC,SAAS;AACpB,UAAI,CAAC,KAAK,IAAI,MAAM,EAAG,QAAO;AAC9B,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,WAAK,OAAO,MAAM;AAClB,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,SAAS,MAAM,KAAK;AAExC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AA9FA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,YAAAC,WAAU,WAAAC,gBAAe;AAClC,OAAO,UAAU;AAaV,SAAS,UAAU,OAAmB;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAID,UAAS,EAAE;AACrC,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AAEtD,QAAM,OAAOC,SAAQ,MAAM;AACzB,UAAM,QAA0B,CAAC;AACjC,eAAW,WAAW,OAAO;AAC3B,YAAM,KAAK;AAAA,QACT,IAAI,QAAQ;AAAA,QACZ,OAAO,QAAQ;AAAA,QACf,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,QAChB,UAAU;AAAA,QACV,UAAU;AAAA,QACV,aAAa,QAAQ;AAAA,MACvB,CAAC;AACD,UAAI,QAAQ,UAAU;AACpB,mBAAW,SAAS,QAAQ,UAAU;AACpC,gBAAM,KAAK;AAAA,YACT,IAAI,MAAM;AAAA,YACV,OAAO,MAAM;AAAA,YACb,MAAM,MAAM;AAAA,YACZ,QAAQ,MAAM;AAAA,YACd,UAAU,MAAM,YAAY;AAAA,YAC5B,UAAU,MAAM,YAAY;AAAA,YAC5B,aAAa,MAAM;AAAA,UACrB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,WAAO,IAAI,KAAK,OAAO;AAAA,MACrB,MAAM,CAAC,SAAS,QAAQ,UAAU,YAAY,UAAU;AAAA,MACxD,WAAW;AAAA,MACX,cAAc;AAAA,IAChB,CAAC;AAAA,EACH,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,cAAcA,SAA4B,MAAM;AACpD,QAAI,CAAC,MAAM,KAAK,EAAG,QAAO;AAC1B,UAAM,UAAU,KAAK,OAAO,KAAK;AACjC,WAAO,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;AAAA,EAC9C,GAAG,CAAC,MAAM,KAAK,CAAC;AAEhB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAhEA;AAAA;AAAA;AAAA;AAAA;;;ACkBO,SAAS,kBAAkB,UAA2B;AAC3D,MAAI,aAAa,WAAY,QAAO;AACpC,MAAI,aAAa,OAAQ,QAAO;AAChC,SAAO;AACT;AAtBA,IAAa,cAWA;AAXb;AAAA;AAAA;AAAO,IAAM,eAAuC;AAAA,MAClD,SAAS;AAAA,MACT,aAAa;AAAA,MACb,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AAEO,IAAM,iBAAyC;AAAA,MACpD,UAAU;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,KAAK;AAAA,IACP;AAAA;AAAA;;;ACfA,SAAS,MAAM,WAAW;AAuBhB,SACA,KADA;AAdH,SAAS,SAAS,EAAE,MAAM,WAAW,GAAkB;AAC5D,QAAM,SAAS,KAAK,OAAO,KAAK,KAAK;AACrC,QAAM,cAAc,aAAa,KAAK,MAAM,KAAK;AAEjD,MAAI,KAAK,SAAS,WAAW;AAC3B,UAAM,UAAU,KAAK,WAAW,WAAM;AACtC,UAAM,eAAe,KAAK,WACtB,GAAG,KAAK,SAAS,SAAS,IAAI,KAAK,SAAS,KAAK,KACjD;AAEJ,WACE,oBAAC,OACC,+BAAC,QAAK,SAAS,YAAY,MAAM,YAC9B;AAAA;AAAA,MACD,qBAAC,QAAM;AAAA;AAAA,QAAQ;AAAA,SAAC;AAAA,MAChB,oBAAC,QAAK,MAAI,MAAE,eAAK,OAAM;AAAA,MACvB,oBAAC,QAAK,eAAC;AAAA,MACP,oBAAC,QAAK,OAAO,aAAc,eAAK,QAAO;AAAA,MACtC,eAAe,qBAAC,QAAK,UAAQ,MAAC;AAAA;AAAA,QAAE;AAAA,QAAa;AAAA,SAAK,IAAU;AAAA,OAC/D,GACF;AAAA,EAEJ;AAEA,QAAM,OAAO,kBAAkB,KAAK,QAAQ;AAC5C,QAAM,YAAY,KAAK,WAAW,eAAe,KAAK,QAAQ,IAAI;AAElE,SACE,oBAAC,OACC,+BAAC,QAAK,SAAS,YAAY,MAAM,YAC9B;AAAA;AAAA,IACD,oBAAC,QAAK,UAAQ,MAAE,qBAAK;AAAA,IACrB,oBAAC,QAAM,eAAK,OAAM;AAAA,IAClB,oBAAC,QAAK,eAAC;AAAA,IACP,oBAAC,QAAK,OAAO,aAAc,eAAK,OAAO,QAAQ,KAAK,GAAG,GAAE;AAAA,IACxD,OAAO,qBAAC,QAAK,OAAO,WAAW;AAAA;AAAA,MAAE;AAAA,OAAK,IAAU;AAAA,IAChD,KAAK,WAAW,qBAAC,QAAK,UAAQ,MAAC;AAAA;AAAA,MAAG,KAAK;AAAA,OAAS,IAAU;AAAA,KAC7D,GACF;AAEJ;AAlDA;AAAA;AAAA;AAGA;AAAA;AAAA;;;ACHA,SAAgB,WAAAC,gBAAe;AAC/B,SAAS,OAAAC,MAAK,QAAAC,aAAY;AA0BlB,gBAAAC,YAAA;AAhBD,SAAS,SAAS,EAAE,OAAO,QAAQ,eAAe,GAAkB;AACzE,QAAM,EAAE,OAAO,IAAI,IAAIH,SAAQ,MAAM;AACnC,UAAM,OAAO,KAAK,MAAM,iBAAiB,CAAC;AAC1C,QAAII,SAAQ,SAAS;AACrB,QAAIA,SAAQ,EAAG,CAAAA,SAAQ;AACvB,QAAIC,OAAMD,SAAQ;AAClB,QAAIC,OAAM,MAAM,QAAQ;AACtB,MAAAA,OAAM,MAAM;AACZ,MAAAD,SAAQ,KAAK,IAAI,GAAGC,OAAM,cAAc;AAAA,IAC1C;AACA,WAAO,EAAE,OAAAD,QAAO,KAAAC,KAAI;AAAA,EACtB,GAAG,CAAC,QAAQ,gBAAgB,MAAM,MAAM,CAAC;AAEzC,MAAI,MAAM,WAAW,GAAG;AACtB,WACE,gBAAAF,KAACF,MAAA,EAAI,eAAc,UAAS,aAAa,GACvC,0BAAAE,KAACD,OAAA,EAAK,UAAQ,MAAC,6EAA+D,GAChF;AAAA,EAEJ;AAEA,QAAM,UAAU,MAAM,MAAM,OAAO,GAAG;AAEtC,SACE,gBAAAC,KAACF,MAAA,EAAI,eAAc,UAChB,kBAAQ,IAAI,CAAC,MAAM,MAClB,gBAAAE;AAAA,IAAC;AAAA;AAAA,MAEC;AAAA,MACA,YAAY,QAAQ,MAAM;AAAA;AAAA,IAFrB,KAAK;AAAA,EAGZ,CACD,GACH;AAEJ;AA7CA;AAAA;AAAA;AAGA;AAAA;AAAA;;;ACFA,SAAS,OAAAG,MAAK,QAAAC,aAAY;AAC1B,OAAO,eAAe;AAad,gBAAAC,MAcA,QAAAC,aAdA;AAJD,SAAS,UAAU,EAAE,QAAQ,OAAO,UAAU,YAAY,GAAmB;AAClF,MAAI,CAAC,UAAU,CAAC,OAAO;AACrB,WACE,gBAAAD,KAACF,MAAA,EAAI,aAAa,GAChB,0BAAAE,KAACD,OAAA,EAAK,UAAQ,MAAC,yBAAW,GAC5B;AAAA,EAEJ;AAEA,SACE,gBAAAE,MAACH,MAAA,EAAI,aAAa,GAChB;AAAA,oBAAAE,KAACD,OAAA,EAAK,OAAM,UAAS,eAAC;AAAA,IACrB,SACC,gBAAAC,KAAC,aAAU,OAAO,OAAO,UAAoB,IAE7C,gBAAAA,KAACD,OAAA,EAAM,iBAAM;AAAA,IAEd,QACC,gBAAAE,MAACF,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,MAAG;AAAA,MAAY;AAAA,OAAS,IACrC;AAAA,KACN;AAEJ;AAjCA;AAAA;AAAA;AAAA;AAAA;;;ACCA,SAAS,OAAAG,MAAK,QAAAC,aAAY;AAWpB,SACE,OAAAC,MADF,QAAAC,aAAA;AAHC,SAAS,UAAU,EAAE,aAAa,aAAa,GAAmB;AACvE,SACE,gBAAAA,MAACH,MAAA,EAAI,eAAc,UAAS,aAAY,UAAS,WAAS,MAAC,cAAc,OAAO,YAAY,OAAO,aAAa,OAAO,aAAa,GAClI;AAAA,oBAAAG,MAACH,MAAA,EAAI,KAAK,GACR;AAAA,sBAAAE,KAACD,OAAA,EAAK,UAAQ,MAAC,mCAAW;AAAA,MAC1B,gBAAAC,KAACD,OAAA,EAAK,UAAQ,MAAC,0CAAkB;AAAA,MACjC,gBAAAC,KAACD,OAAA,EAAK,UAAQ,MAAC,0BAAY;AAAA,MAC1B,eACC,gBAAAC,KAACD,OAAA,EAAK,UAAQ,MAAC,8BAAgB,IAE/B,gBAAAC,KAACD,OAAA,EAAK,UAAQ,MAAC,sBAAQ;AAAA,MAEzB,gBAAAC,KAACD,OAAA,EAAK,UAAQ,MAAC,oBAAM;AAAA,OACvB;AAAA,IACC,aAAa,SAAS,gBAAgB,YAAY,WAAW,eAC5D,gBAAAE,MAACF,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,MAAY,YAAY,UAAU;AAAA,OAAa,IAC5D;AAAA,KACN;AAEJ;AA5BA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AACA,SAAS,OAAAG,MAAK,QAAAC,OAAM,QAAQ,UAAU,iBAAiB;AA0G/C,gBAAAC,MAQA,QAAAC,aARA;AA5FD,SAAS,IAAI,EAAE,aAAAC,cAAa,SAAS,GAAa;AACvD,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,iBAAiB,QAAQ,QAAQ;AACvC,QAAM,iBAAiB,KAAK,IAAI,GAAG,iBAAiB,CAAC;AAErD,QAAM,EAAE,OAAO,SAAS,MAAM,IAAI,YAAYA,YAAW;AACzD,QAAM,EAAE,OAAO,UAAU,cAAc,iBAAiB,YAAY,IAAI,UAAU,KAAK;AACvF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,aAAa,OAAO,WAAW;AAEnC,WAAS,CAACC,QAAO,QAAQ;AACvB,QAAI,cAAc;AAChB,UAAI,IAAI,QAAQ;AACd,wBAAgB,KAAK;AACrB,iBAAS,EAAE;AACX;AAAA,MACF;AACA,UAAI,IAAI,QAAQ;AACd,wBAAgB,KAAK;AACrB;AAAA,MACF;AAEA;AAAA,IACF;AAGA,QAAIA,WAAU,OAAO,IAAI,QAAQ;AAC/B,WAAK;AACL;AAAA,IACF;AAEA,QAAIA,WAAU,KAAK;AACjB,sBAAgB,IAAI;AACpB;AAAA,IACF;AAEA,QAAI,IAAI,WAAWA,WAAU,KAAK;AAChC,aAAO;AACP;AAAA,IACF;AAEA,QAAI,IAAI,aAAaA,WAAU,KAAK;AAClC,eAAS;AACT;AAAA,IACF;AAEA,QAAI,IAAI,cAAc,aAAa,SAAS,WAAW;AACrD,iBAAW,YAAY,EAAE;AACzB;AAAA,IACF;AAEA,QAAI,IAAI,WAAW;AACjB,UAAI,aAAa,SAAS,WAAW;AACnC,qBAAa,YAAY,EAAE;AAAA,MAC7B,WAAW,aAAa,SAAS,cAAc;AAE7C,cAAM,WAAW,KAAK,YAAY,WAAW;AAC7C,cAAM,cAAc,SAAS,UAAU,CAAC,MAAM,EAAE,OAAO,QAAQ;AAC/D,YAAI,eAAe,GAAG;AACpB,oBAAU,WAAW;AAAA,QACvB;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,IAAI,UAAU,aAAa;AAC7B,UAAI,YAAY,SAAS,WAAW;AAClC,eAAO,YAAY,EAAE;AAAA,MACvB,WAAW,YAAY,SAAS,cAAc;AAC5C,iBAAS;AAAA,UACP,aAAAD;AAAA,UACA,aAAa,YAAY;AAAA,UACzB,gBAAgB,YAAY;AAAA,QAC9B,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI,SAAS;AACX,WACE,gBAAAF,KAACF,MAAA,EAAI,aAAa,GAChB,0BAAAE,KAACD,OAAA,EAAK,iCAAmB,GAC3B;AAAA,EAEJ;AAEA,MAAI,OAAO;AACT,WACE,gBAAAC,KAACF,MAAA,EAAI,aAAa,GAChB,0BAAAG,MAACF,OAAA,EAAK,OAAM,OAAM;AAAA;AAAA,MAAQ;AAAA,OAAM,GAClC;AAAA,EAEJ;AAEA,QAAM,eAAe,MAAM;AAC3B,QAAM,aAAa,aAAa,QAAQ,SAAS;AAEjD,SACE,gBAAAE,MAACH,MAAA,EAAI,eAAc,UACjB;AAAA,oBAAAG,MAACH,MAAA,EAAI,aAAa,GAAG,cAAc,GACjC;AAAA,sBAAAE,KAACD,OAAA,EAAK,MAAI,MAAC,OAAM,QAAO,qBAAO;AAAA,MAC/B,gBAAAE,MAACF,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,QAAE;AAAA,QAAa;AAAA,QAAS,iBAAiB,IAAI,MAAM;AAAA,SAAG;AAAA,OACvE;AAAA,IACA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR;AAAA,QACA,UAAU;AAAA,QACV,aAAa;AAAA;AAAA,IACf;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP;AAAA,QACA;AAAA;AAAA,IACF;AAAA,IACA,gBAAAA,KAAC,aAAU,aAA0B,cAA4B;AAAA,KACnE;AAEJ;AA/IA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;;;ACPA;AAAA;AAAA;AAAA;AAAA,SAAS,SAAAI,cAAa;AACtB,SAAS,SAAAC,QAAO,aAAAC,kBAAiB;AACjC,SAAS,WAAAC,iBAAe;AAiBxB,eAAsB,YAAY,SAAuC;AACvE,QAAM,EAAE,aAAAC,cAAa,aAAa,gBAAgB,MAAM,IAAI;AAC5D,QAAM,UAAU,eAAe,KAAK;AAEpC,QAAM,SAAS,MAAM,oBAAoBA,cAAa,aAAa,cAAc;AACjF,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,yBAAyB,WAAW,IAAI,cAAc,EAAE;AACtE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,eACJ,OAAO,UAAU,iBAChB,OAAO,UAAU,YAAY,WAAW,GAAG,IAAI,OAAO,UAAU,aAAa,SAC9E,QAAQ,IAAI;AAEd,QAAM,aAAaD,UAAQC,cAAa,WAAW;AACnD,QAAM,gBAAgBD,UAAQ,YAAY,eAAe,cAAc;AAEvE,QAAM,aAAaA,UAAQ,cAAc,UAAU;AACnD,QAAMF,OAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAE3C,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO,UAAU,UAAU;AAAA,IACnC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AAEA,QAAMC;AAAA,IACJC,UAAQ,YAAY,cAAc;AAAA,IAClC,KAAK,UAAU,SAAS,MAAM,CAAC,IAAI;AAAA,EACrC;AAEA,SAAO,IAAI,QAAc,CAAC,gBAAgB,WAAW;AACnD,UAAM,gBACJ,0CAA0C,aAAa;AAEzD,UAAM,QAAQH,OAAM,SAAS,CAAC,aAAa,GAAG;AAAA,MAC5C,KAAK;AAAA,MACL,OAAO;AAAA,IACT,CAAC;AAED,UAAM,GAAG,SAAS,CAACK,SAAQ;AACzB,UAAKA,KAA8B,SAAS,UAAU;AACpD,gBAAQ,MAAM,GAAG,KAAK,wBAAwB,OAAO,gCAAgC;AAAA,MACvF,OAAO;AACL,gBAAQ,MAAM,oBAAoB,KAAK,KAAKA,KAAI,OAAO;AAAA,MACzD;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAED,UAAM,GAAG,QAAQ,CAAC,SAAS;AACzB,cAAQ,KAAK,QAAQ,CAAC;AAAA,IACxB,CAAC;AAAA,EACH,CAAC;AACH;AA9EA,IAOM;AAPN;AAAA;AAAA;AAGA;AAIA,IAAM,iBAA4C;AAAA,MAChD,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA;AAAA;;;ACVA,SAAS,WAAAC,gBAAe;;;ACGxB;AACA;AACA;AALA,SAAS,WAAAC,UAAS,WAAAC,gBAAe;AACjC,SAAS,WAAAC,UAAS,YAAAC,iBAAgB;AAClC,SAAS,qBAAqB;;;ACA9B;AACA;AACA;AAJA,SAAS,WAAAC,gBAAe;AACxB,SAAS,SAAS,gBAAgB;AAKlC,eAAsB,wBAAwBC,eAAqC;AACjF,MAAI,CAAE,MAAM,WAAWA,aAAY,EAAI;AAEvC,QAAM,UAAU,MAAM,QAAQA,eAAc,EAAE,eAAe,KAAK,CAAC;AACnE,QAAM,OAAsF,CAAC;AAE7F,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,KAAK,KAAK,MAAM,KAAK,WAAW,GAAG,KAAK,MAAM,SAAS,cAAe;AAElH,UAAM,MAAM,MAAM,SAASD,SAAQC,eAAc,MAAM,IAAI,GAAG,OAAO;AACrE,UAAM,SAAS,cAAc,GAAG;AAChC,UAAM,OAAO,OAAO,QAAQ,MAAM,KAAK,QAAQ,SAAS,EAAE;AAE1D,SAAK,KAAK;AAAA,MACR,MAAM,OAAO,QAAQ;AAAA,MACrB;AAAA,MACA,aAAa,OAAO;AAAA,MACpB,WAAW,OAAO;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,OAAK,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAEhD,QAAM,YAAY,aAAa;AAC/B,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,eAAe,SAAS;AAAA,IACxB,UAAU,KAAK,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,OAAO,MAAM;AACtB,UAAM,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,iBAAY,IAAI,WAAW,EAAE;AACrE,QAAI,IAAI,WAAW;AACjB,YAAM,KAAK,mBAAmB,IAAI,SAAS,GAAG;AAAA,IAChD;AAAA,EACF;AAEA,QAAM,KAAK,EAAE;AAEb,QAAM,eAAeD,SAAQC,eAAc,aAAa,GAAG,MAAM,KAAK,IAAI,CAAC;AAC7E;;;ADxCA,eAAsB,YAAY,SAAqC;AACrE,QAAM,OAAO,YAAY;AACzB,QAAMC,eAAc,kBAAkB;AACtC,QAAM,2BAA2B,eAAe;AAChD,QAAM,aAAaC,SAAQ,MAAM,WAAW;AAE5C,QAAMC,gBAAeD,SAAQ,MAAM,WAAW;AAE9C,QAAM,UAAU,IAAI;AACpB,QAAM,UAAUD,YAAW;AAC3B,QAAM,UAAU,wBAAwB;AACxC,QAAM,UAAUE,aAAY;AAE5B,QAAM,gBAAgB,aAAa;AAAA,IACjC,mBAAmBF;AAAA,EACrB,CAAC;AAED,MAAI,QAAQ,OAAO;AACjB,UAAM,eAAe,YAAY,aAAa;AAC9C,YAAQ,IAAI,WAAW,IAAI,GAAG;AAC9B,YAAQ,IAAI,WAAWA,YAAW,GAAG;AACrC,YAAQ,IAAI,WAAW,wBAAwB,GAAG;AAClD,YAAQ,IAAI,WAAWE,aAAY,GAAG;AACtC,YAAQ,IAAI,SAAS,UAAU,gBAAgB;AAAA,EACjD,OAAO;AACL,UAAM,UAAU,MAAM,cAAc,YAAY,aAAa;AAC7D,YAAQ,IAAI,WAAW,IAAI,GAAG;AAC9B,YAAQ,IAAI,WAAWF,YAAW,GAAG;AACrC,YAAQ,IAAI,WAAW,wBAAwB,GAAG;AAClD,YAAQ,IAAI,WAAWE,aAAY,GAAG;AACtC,QAAI,SAAS;AACX,cAAQ,IAAI,SAAS,UAAU,EAAE;AAAA,IACnC,OAAO;AACL,cAAQ,IAAI,WAAW,UAAU,6CAA6C;AAAA,IAChF;AAAA,EACF;AAGA,QAAM,SAAS,MAAM,qBAAqBA,aAAY;AACtD,MAAI,SAAS,GAAG;AACd,YAAQ,IAAI,UAAU,MAAM,2BAA2BA,aAAY,GAAG;AAAA,EACxE;AAGA,QAAM,wBAAwBA,aAAY;AAE1C,UAAQ,IAAI,qCAAqC;AACnD;AAEA,eAAe,qBAAqBA,eAAuC;AACzE,QAAM,aAAa,cAAc,YAAY,GAAG;AAChD,QAAM,cAAcD,SAAQE,SAAQ,UAAU,GAAG,IAAI;AACrD,QAAM,cAAcF,SAAQ,aAAa,YAAY,WAAW;AAEhE,MAAI,CAAE,MAAM,WAAW,WAAW,EAAI,QAAO;AAE7C,QAAM,UAAU,MAAMG,SAAQ,aAAa,EAAE,eAAe,KAAK,CAAC;AAClE,MAAI,QAAQ;AAEZ,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,KAAK,EAAG;AACpD,UAAM,aAAaH,SAAQC,eAAc,MAAM,IAAI;AACnD,QAAI,MAAM,WAAW,UAAU,EAAG;AAElC,UAAM,UAAU,MAAMG,UAASJ,SAAQ,aAAa,MAAM,IAAI,GAAG,OAAO;AACxE,UAAM,cAAc,YAAY,OAAO;AACvC;AAAA,EACF;AAEA,SAAO;AACT;;;AElFA,SAAS,WAAAK,gBAAe;;;ACAjB,SAAS,QAAQ,OAAuB;AAC7C,SAAO,MACJ,YAAY,EACZ,KAAK,EACL,QAAQ,iBAAiB,EAAE,EAC3B,QAAQ,QAAQ,GAAG,EACnB,QAAQ,OAAO,GAAG,EAClB,QAAQ,UAAU,EAAE;AACzB;AAEO,SAAS,YAAY,MAAuB;AACjD,SAAO,2BAA2B,KAAK,IAAI;AAC7C;;;ADVA;;;AEFA,SAAS,kBAAkB;AAEpB,SAAS,aAAqB;AACnC,SAAO,WAAW;AACpB;;;AFAA;AACA;AACAC;;;AGNA;;;ACKO,SAAS,eAAe,QAAgC;AAC7D,SAAO;AAAA;AAAA,WAEE,OAAO,IAAI;AAAA,cACR,OAAO,SAAS;AAAA;AAAA;AAAA,aAGjB,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaxB;;;ACzBO,SAAS,iBAAiB,OAAuB;AACtD,MAAI,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,IAAI,GAAG;AAChD,UAAM,IAAI;AAAA,MACR,iDAAiD,MAAM,MAAM,GAAG,EAAE,CAAC;AAAA,IACrE;AAAA,EACF;AACA,QAAM,UAAU,MAAM,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK;AAChE,SAAO,IAAI,OAAO;AACpB;;;ACEO,SAAS,cAAc,QAA+B;AAC3D,QAAM,YAAY,iBAAiB,OAAO,KAAK;AAC/C,QAAM,gBAAgB,OAAO,YAAY;AAAA,aAAgB,OAAO,SAAS,KAAK;AAC9E,SAAO;AAAA,MACH,OAAO,EAAE;AAAA,QACP,OAAO,IAAI;AAAA,SACV,SAAS;AAAA;AAAA;AAAA;AAAA,YAIN,OAAO,SAAS;AAAA,YAChB,OAAO,SAAS;AAAA;AAAA,UAElB,aAAa;AAAA;AAAA;AAAA,IAGnB,OAAO,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUhB;;;ACtBO,SAAS,iBAAiB,QAAkC;AACjE,QAAM,YAAY,iBAAiB,OAAO,KAAK;AAC/C,QAAM,gBACJ,OAAO,UAAU,WAAW,IACxB,kBACA;AAAA,MAAmB,OAAO,UAAU,KAAK,QAAQ,CAAC;AACxD,QAAM,YACJ,OAAO,MAAM,WAAW,IACpB,cACA;AAAA,MAAe,OAAO,MAAM,KAAK,QAAQ,CAAC;AAChD,QAAM,cAAc,YAAY,OAAO,WAAW,OAAO,SAAS,OAAO,OAAO;AAChF,QAAM,WAAW,SAAS,OAAO,QAAQ,SAAS;AAElD,SAAO;AAAA,MACH,OAAO,EAAE;AAAA,QACP,OAAO,IAAI;AAAA,SACV,SAAS;AAAA,EAChB,WAAW;AAAA,EACX,QAAQ;AAAA;AAAA,YAEE,OAAO,QAAQ;AAAA,YACf,OAAO,SAAS;AAAA,YAChB,OAAO,SAAS;AAAA;AAAA;AAAA,EAG1B,aAAa;AAAA,EACb,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUP,OAAO,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;AAkChB;;;AC/EO,SAAS,iBAAiB,QAAkC;AACjE,SAAO;AAAA,cACK,OAAO,cAAc;AAAA,YACvB,OAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAO5B;;;ACVO,SAAS,cAAc,QAA+B;AAC3D,SAAO;AAAA,cACK,OAAO,cAAc;AAAA,YACvB,OAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ5B;;;ACXO,SAAS,eAAe,QAAgC;AAC7D,SAAO;AAAA,cACK,OAAO,UAAU;AAAA;AAAA,cAEjB,OAAO,SAAS;AAAA,YAClB,OAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAO5B;;;ACAO,SAAS,eAAe,QAAgC;AAC7D,SAAO;AAAA,cACK,OAAO,UAAU;AAAA;AAAA,cAEjB,OAAO,SAAS;AAAA,YAClB,OAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAO5B;AAEO,SAAS,mBAAmB,SAA0B;AAC3D,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,MAAM,QAAQ,EAAE,EAAE;AAC7B,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,iBAAiB,QAAQ,SAAS,EAAE;AAC/C,QAAM,KAAK,eAAe,QAAQ,MAAM,EAAE;AAC1C,QAAM,KAAK,aAAa,QAAQ,IAAI,EAAE;AACtC,MAAI,QAAQ,SAAS;AACnB,UAAM,KAAK,iBAAiB,QAAQ,OAAO,EAAE;AAAA,EAC/C;AACA,MAAI,QAAQ,SAAS,YAAY;AAC/B,UAAM,KAAK,iBAAiB,QAAQ,WAAW,SAAS,OAAO,EAAE;AAAA,EACnE;AACA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,QAAQ,KAAK,KAAK,CAAC;AAC9B,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AACxB;;;AC3CO,SAAS,qBACd,QACQ;AACR,SAAO;AAAA,cACK,OAAO,cAAc;AAAA,YACvB,OAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ5B;;;ACZO,SAAS,uBAAuB,QAAiC;AACtE,SAAO;AAAA,WACE,OAAO,IAAI;AAAA,cACR,OAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgB9B;AAEO,SAAS,iBAAiB,QAAiC;AAChE,SAAO;AAAA,WACE,OAAO,IAAI;AAAA,cACR,OAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ9B;AAEO,SAAS,qBAAqB,QAAiC;AACpE,SAAO;AAAA,WACE,OAAO,IAAI;AAAA,cACR,OAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ9B;AAEO,SAAS,aAAa,QAAiC;AAC5D,SAAO;AAAA,WACE,OAAO,IAAI;AAAA,cACR,OAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAgBV,OAAO,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBhC;AAEO,SAAS,qBAAqB,QAAiC;AACpE,SAAO;AAAA,WACE,OAAO,IAAI;AAAA,cACR,OAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAS9B;AAEO,SAAS,oBAAoB,QAAiC;AACnE,SAAO;AAAA,WACE,OAAO,IAAI;AAAA,cACR,OAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAS9B;;;AC7GO,SAAS,eAAe,QAAgC;AAC7D,QAAM,YAAY,OAAO,YACrB,iBAAiB,OAAO,SAAS,IACjC;AACJ,SAAO;AAAA,QACD,iBAAiB,OAAO,IAAI,CAAC;AAAA,QAC7B,OAAO,IAAI;AAAA,eACJ,iBAAiB,OAAO,WAAW,CAAC;AAAA,eACpC,SAAS;AAAA,YACZ,OAAO,SAAS;AAAA,YAChB,OAAO,SAAS;AAAA;AAAA;AAAA;AAAA,IAIxB,OAAO,IAAI;AAAA;AAAA;AAAA;AAIf;;;ACrBO,SAAS,uBAA+B;AAC7C,SAAO;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;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsIT;AAEO,SAAS,uBAAuB,QAAwC;AAC7E,SAAO;AAAA,8CACqC,OAAO,WAAW,IAAI,OAAO,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAOxE,OAAO,WAAW;AAAA,oBACf,OAAO,cAAc;AAAA,2BACd,OAAO,UAAU;AAAA,8BACd,OAAO,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,OAK3C,OAAO,UAAU;AAAA,OACjB,OAAO,aAAa;AAAA,WAChB,OAAO,aAAa;AAAA,OACxB,OAAO,aAAa;AAAA,OACpB,OAAO,aAAa;AAAA,OACpB,OAAO,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,MAKrB,OAAO,aAAa;AAAA,MACpB,OAAO,aAAa;AAAA,MACpB,OAAO,aAAa;AAAA,MACpB,OAAO,aAAa;AAAA,MACpB,OAAO,aAAa;AAAA,MACpB,OAAO,aAAa;AAAA;AAAA,gBAEV,OAAO,aAAa;AAAA;AAAA;AAAA;AAIpC;;;AC/KO,SAAS,kBAAkB,QAAmC;AACnE,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAMQ,OAAO,WAAW;AAAA,oBACf,OAAO,cAAc;AAAA,2BACd,OAAO,UAAU;AAAA,8BACd,OAAO,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAoB3C,OAAO,UAAU;AAAA,OACjB,OAAO,UAAU;AAAA,OACjB,OAAO,aAAa;AAAA,WAChB,OAAO,aAAa;AAAA,OACxB,OAAO,aAAa;AAAA,OACpB,OAAO,aAAa;AAAA,OACpB,OAAO,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,eAoDZ,OAAO,aAAa;AAAA;AAAA,SAE1B,OAAO,UAAU;AAAA,SACjB,OAAO,UAAU;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,qBA6CL,OAAO,cAAc,6BAA6B,OAAO,WAAW;AAAA,oBACrE,OAAO,cAAc,cAAc,OAAO,WAAW;AAAA,qBACpD,OAAO,cAAc,cAAc,OAAO,WAAW;AAAA,uBACnD,OAAO,cAAc,cAAc,OAAO,WAAW;AAAA,oBACxD,OAAO,cAAc,cAAc,OAAO,WAAW;AAAA,sBACnD,OAAO,cAAc,cAAc,OAAO,WAAW;AAAA,mBACxD,OAAO,cAAc,cAAc,OAAO,WAAW;AAAA,sBAClD,OAAO,cAAc;AAAA,sBACrB,OAAO,cAAc,4GAA4G,OAAO,cAAc;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;AA4B5K;;;AC/KO,SAAS,qBAAqB,QAAsC;AACzE,QAAM,SAAS;AAAA,IACb,cAAc;AAAA,MACZ;AAAA,MACA,QAAQ,OAAO,UAAU;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI;AAC3C;;;AjBQA,eAAsB,qBACpB,OACA,SACiB;AACjB,MAAI,CAAC,MAAM,KAAK,GAAG;AACjB,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AAEA,QAAM,OAAO,QAAQ,QAAQ,QAAQ,KAAK;AAC1C,MAAI,CAAC,YAAY,IAAI,GAAG;AACtB,UAAM,IAAI;AAAA,MACR,iBAAiB,IAAI;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,UAAU,QAAQ,MACpB,WAAW,QAAQ,GAAG,IACtB,OAAO;AACX,QAAM,aAAaC,SAAQ,SAAS,IAAI;AAExC,MAAI,MAAM,WAAW,UAAU,GAAG;AAChC,UAAM,IAAI;AAAA,MACR,kCAAkC,UAAU;AAAA;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM,YAAY,aAAa;AAC/B,QAAM,KAAK,WAAW;AAEtB,QAAM,UAAUA,SAAQ,YAAY,aAAa,CAAC;AAClD,QAAM,UAAUA,SAAQ,YAAY,WAAW,CAAC;AAChD,QAAM,UAAUA,SAAQ,YAAY,UAAU,CAAC;AAE/C,QAAM,QAAiC;AAAA,IACrC;AAAA,MACEA,SAAQ,YAAY,aAAa;AAAA,MACjC,eAAe,EAAE,MAAM,UAAU,CAAC;AAAA,IACpC;AAAA,IACA;AAAA,MACEA,SAAQ,YAAY,YAAY;AAAA,MAChC,cAAc,EAAE,IAAI,MAAM,OAAO,WAAW,WAAW,QAAQ,UAAU,CAAC;AAAA,IAC5E;AAAA,IACA;AAAA,MACEA,SAAQ,YAAY,uBAAuB;AAAA,MAC3C,uBAAuB,EAAE,MAAM,OAAO,UAAU,CAAC;AAAA,IACnD;AAAA,IACA;AAAA,MACEA,SAAQ,YAAY,iBAAiB;AAAA,MACrC,iBAAiB,EAAE,MAAM,OAAO,UAAU,CAAC;AAAA,IAC7C;AAAA,IACA;AAAA,MACEA,SAAQ,YAAY,qBAAqB;AAAA,MACzC,qBAAqB,EAAE,MAAM,OAAO,UAAU,CAAC;AAAA,IACjD;AAAA,IACA;AAAA,MACEA,SAAQ,YAAY,YAAY;AAAA,MAChC,aAAa,EAAE,MAAM,OAAO,UAAU,CAAC;AAAA,IACzC;AAAA,IACA;AAAA,MACEA,SAAQ,YAAY,aAAa,WAAW;AAAA,MAC5C,qBAAqB,EAAE,MAAM,OAAO,UAAU,CAAC;AAAA,IACjD;AAAA,IACA;AAAA,MACEA,SAAQ,YAAY,YAAY,WAAW;AAAA,MAC3C,oBAAoB,EAAE,MAAM,OAAO,UAAU,CAAC;AAAA,IAChD;AAAA,EACF;AAEA,aAAW,CAAC,UAAU,OAAO,KAAK,OAAO;AACvC,UAAM,eAAe,UAAU,OAAO;AAAA,EACxC;AAEA,UAAQ,IAAI,oBAAoB,KAAK,QAAQ,UAAU,GAAG;AAC1D,UAAQ,IAAI,WAAW,IAAI,EAAE;AAC7B,UAAQ,IAAI,kBAAkB;AAC9B,UAAQ,IAAI,iBAAiB;AAC7B,UAAQ,IAAI,gBAAgB;AAC5B,UAAQ,IAAI,2BAA2B;AACvC,UAAQ,IAAI,qBAAqB;AACjC,UAAQ,IAAI,yBAAyB;AACrC,UAAQ,IAAI,gBAAgB;AAC5B,UAAQ,IAAI,yBAAyB;AACrC,UAAQ,IAAI,wBAAwB;AAEpC,SAAO;AACT;;;AkB9GA,SAAS,WAAAC,gBAAe;AAExB;AAEA;AACA;AACAC;AAqBA,eAAsB,wBACpB,OACA,SACe;AACf,MAAI,CAAC,MAAM,KAAK,GAAG;AACjB,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAEA,MAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ,QAAQ;AACvC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MAAI,QAAQ,WAAW,QAAQ,QAAQ;AACrC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,CAAC,YAAY,QAAQ,OAAO,GAAG;AACpD,UAAM,IAAI;AAAA,MACR,yBAAyB,QAAQ,OAAO;AAAA,IAC1C;AAAA,EACF;AAEA,MAAI,QAAQ,UAAU,QAAQ,WAAW;AACvC,UAAM,IAAI,MAAM,+FAA+F;AAAA,EACjH;AAEA,QAAM,iBAAiB,QAAQ,QAAQ,QAAQ,KAAK;AACpD,MAAI,CAAC,YAAY,cAAc,GAAG;AAChC,UAAM,IAAI;AAAA,MACR,iBAAiB,cAAc;AAAA,IACjC;AAAA,EACF;AAEA,QAAM,YAAY,QAAQ,YACtB,QAAQ,UAAU,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,IAChE,CAAC;AACL,aAAW,OAAO,WAAW;AAC3B,QAAI,CAAC,YAAY,GAAG,GAAG;AACrB,YAAM,IAAI;AAAA,QACR,4BAA4B,GAAG;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,QAAQ,QAClB,QAAQ,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,IAC5D,CAAC;AACL,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,QAAI,MAAM,WAAW,KAAK,CAAC,MAAM,MAAM,WAAW,GAAG;AACnD,YAAM,IAAI;AAAA,QACR,iBAAiB,IAAI;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,kBAAkB,CAAC,OAAO,UAAU,QAAQ,UAAU;AAC5D,QAAM,WAAY,QAAQ,YAAY;AACtC,MAAI,CAAC,gBAAgB,SAAS,QAAQ,GAAG;AACvC,UAAM,IAAI;AAAA,MACR,qBAAqB,QAAQ,QAAQ,sBAAsB,gBAAgB,KAAK,IAAI,CAAC;AAAA,IACvF;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,YAAY,aAAa;AAC/B,QAAM,KAAK,WAAW;AAEtB,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,MAAI,QAAQ,QAAQ;AAElB,UAAM,iBAAiB,eAAiB;AACxC,iBAAa;AACb,oBAAgBC,SAAQ,gBAAgB,UAAU;AAClD,kBAAc;AACd,UAAM,UAAU,cAAc;AAAA,EAChC,OAAO;AACL,UAAM,UAAU,QAAQ,MACpB,WAAW,QAAQ,GAAG,IACtB,OAAO;AACX,kBAAc,QAAQ;AACtB,UAAM,aAAaA,SAAQ,SAAS,WAAW;AAE/C,UAAM,gBAAgBA,SAAQ,YAAY,YAAY;AACtD,QAAI,CAAE,MAAM,WAAW,UAAU,KAAM,CAAE,MAAM,WAAW,aAAa,GAAI;AACzE,YAAM,IAAI;AAAA,QACR,YAAY,WAAW,kBAAkB,UAAU;AAAA;AAAA,MACrD;AAAA,IACF;AAEA,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,aAAaA,SAAQ,YAAY,aAAa;AACpD,iBAAW,OAAO,WAAW;AAC3B,cAAM,SAASA,SAAQ,YAAY,GAAG;AACtC,YAAI,CAAE,MAAM,WAAW,MAAM,GAAI;AAC/B,kBAAQ;AAAA,YACN,wBAAwB,GAAG,gCAAgC,WAAW;AAAA,UACxE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,iBAAa;AACb,oBAAgBA,SAAQ,YAAY,eAAe,UAAU;AAAA,EAC/D;AAEA,MAAI,MAAM,WAAW,aAAa,GAAG;AACnC,UAAM,IAAI;AAAA,MACR,qCAAqC,aAAa;AAAA;AAAA,IACpD;AAAA,EACF;AAEA,QAAM,UAAU,aAAa;AAE7B,QAAM,yBAAyB,gBAAgB,OAAO,KAAK;AAE3D,QAAM,QAAiC;AAAA,IACrC;AAAA,MACEA,SAAQ,eAAe,eAAe;AAAA,MACtC,iBAAiB;AAAA,QACf;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,MAAM,QAAQ;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACEA,SAAQ,eAAe,eAAe;AAAA,MACtC,iBAAiB;AAAA,QACf,gBAAgB;AAAA,QAChB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACEA,SAAQ,eAAe,YAAY;AAAA,MACnC,cAAc;AAAA,QACZ,gBAAgB;AAAA,QAChB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACEA,SAAQ,eAAe,oBAAoB;AAAA,MAC3C,qBAAqB;AAAA,QACnB,gBAAgB;AAAA,QAChB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACEA,SAAQ,eAAe,aAAa;AAAA,MACpC,eAAe;AAAA,QACb,YAAY;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACEA,SAAQ,eAAe,aAAa;AAAA,MACpC,eAAe;AAAA,QACb,YAAY;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,CAAC,UAAU,OAAO,KAAK,OAAO;AACvC,UAAM,eAAe,UAAU,OAAO;AAAA,EACxC;AAEA,MAAI,gBAAgB,MAAM;AACxB,YAAQ;AAAA,MACN,kCAAkC,KAAK,QAAQ,aAAa;AAAA,IAC9D;AACA,YAAQ,IAAI,WAAW,EAAE,EAAE;AAC3B,YAAQ,IAAI,WAAW,cAAc,iBAAiB;AAAA,EACxD,OAAO;AACL,YAAQ;AAAA,MACN,uBAAuB,KAAK,iBAAiB,WAAW,QAAQ,aAAa;AAAA,IAC/E;AACA,YAAQ,IAAI,WAAW,cAAc,EAAE;AAAA,EACzC;AACA,UAAQ,IAAI,eAAe,QAAQ,EAAE;AACrC,MAAI,QAAQ,MAAM;AAChB,YAAQ,IAAI,WAAW,QAAQ,IAAI,EAAE;AAAA,EACvC;AACA,MAAI,UAAU,SAAS,GAAG;AACxB,YAAQ,IAAI,iBAAiB,UAAU,KAAK,IAAI,CAAC,EAAE;AAAA,EACrD;AACA,MAAI,MAAM,SAAS,GAAG;AACpB,YAAQ,IAAI,YAAY,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,EAC5C;AACA,UAAQ,IAAI,kBAAkB;AAC9B,UAAQ,IAAI,mBAAmB;AAC/B,UAAQ,IAAI,mBAAmB;AAC/B,UAAQ,IAAI,gBAAgB;AAC5B,UAAQ,IAAI,wBAAwB;AACpC,UAAQ,IAAI,iBAAiB;AAC7B,UAAQ,IAAI,iBAAiB;AAC7B,UAAQ;AAAA,IACN;AAAA,EACF;AACF;;;ACzOAC;AAJA,SAAS,aAAgC;AACzC,SAAS,gBAAgB,uBAAuB;AAChD,SAAS,WAAAC,WAAS,WAAAC,gBAAe;AACjC,SAAS,iBAAAC,sBAAqB;;;ACC9B;AAEA;AAeA;AArBA,OAAO,aAAa;AACpB,SAAS,oBAAoB;AAC7B,SAAS,WAAAC,iBAAe;AACxB,SAAS,aAAAC,YAAW,UAAAC,eAAc;AAElC,SAAS,iBAAiB,iBAAiB;;;ACH3C;AAFA,SAAS,YAAAC,kBAAgB;AACzB,SAAS,WAAAC,iBAAe;;;ACExB;AACA;AAJA,OAAO,cAAc;AACrB,SAAS,WAAAC,iBAAe;AACxB,SAAS,WAAAC,gBAAe;AAKxB,IAAI,KAA+B;AAEnC,IAAM,iBAAiB;AAMvB,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBnB,IAAM,6BAA6B;AAAA;AAAA;AAAA;AAU5B,SAAS,cAAc,QAAoC;AAChE,MAAI,GAAI,QAAO;AAEf,QAAM,YAAY,UAAUD,UAAQ,YAAY,GAAG,YAAY;AAC/D,OAAK,IAAI,SAAS,SAAS;AAC3B,KAAG,OAAO,oBAAoB;AAC9B,KAAG,KAAK,UAAU;AAGlB,KAAG,QAAQ,uDAAuD,EAAE;AAAA,IAClE;AAAA,IACA;AAAA,EACF;AAWA,QAAM,WAAW;AACjB,QAAM,gBAAgB,SAAS,YAAY,MAAM;AAE/C,UAAM,YACJ,SACG,QAAQ,qDAAqD,EAC7D,IAAI,GACN;AAEH,QAAI,cAAc,KAAK;AACrB,eAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAqBb;AAAA,IACH;AAIA,UAAM,YACJ,SACG,QAAQ,qDAAqD,EAC7D,IAAI,GACN;AAEH,QAAI,cAAc,KAAK;AACrB,YAAM,YAAY,SACf,QAAQ,6BAA6B,EACrC,IAAI;AACP,YAAM,aAAa,UAAU,IAAI,CAACE,OAAMA,GAAE,IAAI;AAC9C,YAAM,aAAa,WAAW,SAAS,cAAc;AACrD,YAAM,aAAa,WAAW,SAAS,cAAc;AAKrD,YAAM,kBACJ,cAAc,aACV,yCACA,aACE,iBACA,aACE,iBACA;AAEV,UAAI,CAAC,iBAAiB;AACpB,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,eAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAgBW,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAQvC;AAAA,IACH;AAAA,EACF,CAAC;AACD,gBAAc,UAAU;AAGxB,KAAG,KAAK,0BAA0B;AAElC,SAAO;AACT;AAMO,SAAS,eAAkC;AAChD,MAAI,CAAC,IAAI;AACP,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAKO,SAAS,iBAAuB;AACrC,MAAI,IAAI;AACN,OAAG,MAAM;AACT,SAAK;AAAA,EACP;AACF;AAaA,eAAsB,oBAAoBC,cAAsC;AAC9E,QAAM,WAAW,aAAa;AAG9B,QAAM,QAAQ,SAAS,QAAQ,wCAAwC,EAAE,IAAI;AAC7E,MAAI,MAAM,QAAQ,EAAG,QAAO;AAE5B,MAAI,CAAE,MAAM,WAAWA,YAAW,EAAI,QAAO;AAE7C,QAAM,UAAU,MAAMC,SAAQD,cAAa,EAAE,eAAe,KAAK,CAAC;AAClE,QAAM,cAA8B,CAAC;AAErC,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,UAAM,aAAaE,UAAQF,cAAa,MAAM,IAAI;AAClD,UAAM,YAAYE,UAAQ,YAAY,oBAAoB;AAC1D,QAAI,CAAE,MAAM,WAAW,SAAS,EAAI;AAEpC,UAAM,WAAW,MAAM,2BAA2B,WAAW,MAAM,IAAI;AACvE,gBAAY,KAAK,GAAG,QAAQ;AAAA,EAC9B;AAEA,MAAI,YAAY,WAAW,EAAG,QAAO;AAErC,QAAM,SAAS,SAAS,QAAQ;AAAA;AAAA;AAAA,GAG/B;AAED,QAAM,YAAY,SAAS,YAAY,CAAC,aAA6B;AACnE,eAAW,KAAK,UAAU;AACxB,aAAO,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI;AAAA,IAC/F;AAAA,EACF,CAAC;AAED,YAAU,WAAW;AACrB,UAAQ,IAAI,YAAY,YAAY,MAAM,oCAAoC;AAC9E,SAAO,YAAY;AACrB;AAMA,eAAe,2BACb,UACA,aACyB;AACzB,QAAM,EAAE,UAAAC,WAAS,IAAI,MAAM,OAAO,aAAkB;AACpD,QAAM,MAAM,MAAMA,WAAS,UAAU,OAAO;AAC5C,QAAM,WAA2B,CAAC;AAElC,QAAM,QAAQ,IAAI,MAAM,IAAI;AAC5B,MAAI,UAAU;AACd,MAAI,aAAa;AAEjB,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,QAAS;AAEd,QAAI,QAAQ,WAAW,cAAc,KAAK,QAAQ,WAAW,aAAa,GAAG;AAC3E,gBAAU;AACV,mBAAa;AACb;AAAA,IACF;AAEA,QAAI,WAAW,CAAC,cAAc,QAAQ,MAAM,eAAe,GAAG;AAC5D,mBAAa;AACb;AAAA,IACF;AAEA,QAAI,WAAW,cAAc,QAAQ,WAAW,GAAG,GAAG;AACpD,YAAM,QAAQ,QACX,MAAM,GAAG,EACT,MAAM,GAAG,EAAE,EACX,IAAI,CAACC,OAAMA,GAAE,KAAK,CAAC;AAEtB,UAAI,MAAM,UAAU,GAAG;AACrB,iBAAS,KAAK;AAAA,UACZ,gBAAgB,MAAM,CAAC;AAAA,UACvB,OAAO,MAAM,CAAC;AAAA,UACd,WAAW,MAAM,CAAC;AAAA,UAClB,SAAS,MAAM,CAAC;AAAA,UAChB,QAAS,MAAM,CAAC,KAA4B;AAAA,UAC5C,MAAM,MAAM,CAAC;AAAA,UACb;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ADrRA,SAAS,aAAa,KAA+B;AACnD,SAAO;AAAA,IACL,WAAW,IAAI;AAAA,IACf,aAAa,IAAI,gBAAgB;AAAA,IACjC,gBAAgB,IAAI,mBAAmB;AAAA,IACvC,OAAO,IAAI;AAAA,IACX,SAAS,IAAI;AAAA,IACb,OAAO,IAAI,SAAS;AAAA,IACpB,QAAQ,IAAI;AAAA,IACZ,MAAM,IAAI,QAAQ;AAAA,IAClB,aAAa,IAAI,eAAe;AAAA,IAChC,gBAAgB,IAAI,mBAAmB;AAAA,EACzC;AACF;AA2BA,eAAsB,cACpB,aACA,SACe;AACf,QAAMC,MAAK,aAAa;AACxB,EAAAA,IAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAYV,EAAE;AAAA,IACD,QAAQ;AAAA,IACR,QAAQ,eAAe;AAAA,IACvB,QAAQ,kBAAkB;AAAA,IAC1B,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ,eAAe;AAAA,IACvB,QAAQ,kBAAkB;AAAA,EAC5B;AACF;AAMA,eAAsB,oBACpB,aACA,WACA,QACkB;AAClB,QAAMA,MAAK,aAAa;AACxB,QAAM,aAAa,WAAW,eAAe,WAAW;AAExD,QAAM,SAAS,aACXA,IACG;AAAA,IACC;AAAA,EACF,EACC,IAAI,QAAQ,SAAS,IACxBA,IACG;AAAA,IACC;AAAA,EACF,EACC,IAAI,QAAQ,SAAS;AAE5B,SAAO,OAAO,UAAU;AAC1B;AAKA,eAAsB,gBAAgB,cAA+C;AACnF,QAAMA,MAAK,aAAa;AACxB,QAAM,OAAOA,IACV,QAAQ,8CAA8C,EACtD,IAAI;AACP,SAAO,KAAK,IAAI,YAAY;AAC9B;AAKA,eAAsB,oBACpB,cACA,aACA,gBACyB;AACzB,QAAMA,MAAK,aAAa;AAExB,MAAI,gBAAgB;AAClB,UAAMC,QAAOD,IACV;AAAA,MACC;AAAA,IACF,EACC,IAAI,aAAa,cAAc;AAClC,WAAOC,MAAK,IAAI,YAAY;AAAA,EAC9B;AAEA,QAAM,OAAOD,IACV,QAAQ,qEAAqE,EAC7E,IAAI,WAAW;AAClB,SAAO,KAAK,IAAI,YAAY;AAC9B;AAKA,eAAsB,eAAe,YAAuC;AAC1E,MAAI,WAAW,WAAW,EAAG,QAAO;AACpC,QAAMA,MAAK,aAAa;AACxB,QAAM,eAAe,WAAW,IAAI,MAAM,GAAG,EAAE,KAAK,IAAI;AACxD,QAAM,SAASA,IACZ,QAAQ,6CAA6C,YAAY,GAAG,EACpE,IAAI,GAAG,UAAU;AACpB,SAAO,OAAO;AAChB;AAGA,IAAM,2BAA2B,oBAAI,IAAI,CAAC,aAAa,UAAU,QAAQ,CAAC;AAK1E,eAAe,6BACb,kBACwB;AACxB,MAAI,CAAE,MAAM,WAAW,gBAAgB,EAAI,QAAO;AAClD,QAAM,MAAM,MAAME,WAAS,kBAAkB,OAAO;AACpD,QAAM,QAAQ,IAAI,MAAM,mBAAmB;AAC3C,SAAO,QAAQ,MAAM,CAAC,EAAE,KAAK,IAAI;AACnC;AAEA,eAAe,qBACb,YACA,gBACwB;AACxB,SAAO;AAAA,IACLC,UAAQ,YAAY,eAAe,gBAAgB,eAAe;AAAA,EACpE;AACF;AASA,eAAsB,wBACpBC,cACAC,iBACiB;AACjB,QAAML,MAAK,aAAa;AAGxB,QAAM,iBAAiBA,IACpB,QAAQ,gFAAkF,EAC1F,IAAI;AAEP,MAAI,eAAe,WAAW,EAAG,QAAO;AAGxC,QAAM,qBAAqB,oBAAI,IAAoB;AACnD,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,WAAW,gBAAgB;AACpC,UAAM,QAAQ,QAAQ;AACtB,QAAI,CAAC,MAAO;AAEZ,UAAM,aAAa,QAAQ,gBAAgB;AAC3C,UAAM,MAAM,GAAG,UAAU,IAAI,KAAK;AAClC,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AAEZ,QAAI,QAAQ,cAAc;AACxB,YAAM,SAAS,MAAM;AAAA,QACnBG,UAAQC,cAAa,QAAQ,YAAY;AAAA,QACzC;AAAA,MACF;AACA,UAAI,OAAQ,oBAAmB,IAAI,KAAK,MAAM;AAAA,IAChD,WAAWC,iBAAgB;AACzB,YAAM,SAAS,MAAM;AAAA,QACnBF,UAAQE,iBAAgB,OAAO,eAAe;AAAA,MAChD;AACA,UAAI,OAAQ,oBAAmB,IAAI,KAAK,MAAM;AAAA,IAChD;AAAA,EACF;AAGA,MAAI,eAAe;AACnB,aAAW,WAAW,gBAAgB;AACpC,UAAM,aAAa,QAAQ,gBAAgB;AAC3C,UAAM,MAAM,GAAG,UAAU,IAAI,QAAQ,eAAe;AACpD,UAAM,mBAAmB,mBAAmB,IAAI,GAAG;AACnD,QAAI,CAAC,oBAAoB,CAAC,yBAAyB,IAAI,gBAAgB,EAAG;AAE1E,UAAM,YACJ,qBAAqB,WAAW,YAAY;AAC9C,UAAM,oBAAoB,IAAI,QAAQ,YAAY,SAAS;AAC3D;AAAA,EACF;AAEA,SAAO;AACT;AAOA,eAAsB,yBACpB,aACA,gBACyB;AACzB,QAAML,MAAK,aAAa;AACxB,QAAM,OAAO,gBAAgB,OACxBA,IACE;AAAA,IACC;AAAA,EACF,EACC,IAAI,cAAc,IACpBA,IACE;AAAA,IACC;AAAA,EACF,EACC,IAAI,aAAa,cAAc;AACtC,SAAO,KAAK,IAAI,YAAY;AAC9B;;;AElRA,SAAS,aAAa;AACtB,SAAS,UAAU,WAAW;AAavB,SAAS,cAAc,SAAyD;AACrF,QAAM,EAAE,aAAAM,cAAa,gBAAAC,iBAAgB,YAAAC,aAAY,cAAAC,eAAc,UAAAC,WAAU,WAAW,aAAa,IAAI,IAAI;AACzG,QAAM,gBAAgB,oBAAI,IAA4B;AAGtD,QAAM,kBAAkB,MAAMJ,cAAa;AAAA,IACzC,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,SAAS;AAAA,EACX,CAAC;AAED,WAAS,oBAAoB,UAAwB;AACnD,UAAM,MAAM,SAASA,cAAa,QAAQ;AAC1C,UAAM,QAAQ,IAAI,MAAM,GAAG;AAE3B,QAAI,MAAM,WAAW,EAAG;AAExB,UAAM,cAAc,MAAM,CAAC;AAC3B,QAAI;AAEJ,QAAI,MAAM,UAAU,KAAK,MAAM,CAAC,MAAM,eAAe;AACnD,uBAAiB,MAAM,CAAC;AAAA,IAC1B;AAEA,UAAM,cAAc,iBAChB,GAAG,WAAW,IAAI,cAAc,KAChC;AAEJ,UAAM,WAAW,cAAc,IAAI,WAAW;AAC9C,QAAI,SAAU,cAAa,QAAQ;AAGnC,UAAM,cAAc,iBAChB,uBACA;AAEJ,kBAAc;AAAA,MACZ;AAAA,MACA,WAAW,MAAM;AACf,sBAAc,OAAO,WAAW;AAChC,cAAM,UAAqB;AAAA,UACzB,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC;AACA,kBAAU,OAAO;AAAA,MACnB,GAAG,UAAU;AAAA,IACf;AAAA,EACF;AAEA,kBAAgB,GAAG,UAAU,mBAAmB;AAChD,kBAAgB,GAAG,OAAO,mBAAmB;AAC7C,kBAAgB,GAAG,UAAU,mBAAmB;AAGhD,MAAI,oBAAqD;AAEzD,MAAIC,iBAAgB;AAQlB,QAASI,0BAAT,SAAgC,UAAwB;AACtD,YAAM,MAAM,SAASJ,iBAAiB,QAAQ;AAC9C,YAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,UAAI,MAAM,WAAW,EAAG;AACxB,YAAM,eAAe,MAAM,CAAC;AAC5B,UAAI,CAAC,aAAc;AAEnB,YAAM,cAAc,kBAAkB,YAAY;AAClD,YAAM,WAAW,cAAc,IAAI,WAAW;AAC9C,UAAI,SAAU,cAAa,QAAQ;AAEnC,oBAAc;AAAA,QACZ;AAAA,QACA,WAAW,MAAM;AACf,wBAAc,OAAO,WAAW;AAChC,gBAAM,UAAqB;AAAA,YACzB,MAAM;AAAA,YACN,aAAa;AAAA,YACb,gBAAgB;AAAA,YAChB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC;AACA,oBAAU,OAAO;AAAA,QACnB,GAAG,UAAU;AAAA,MACf;AAAA,IACF;AAxBS,iCAAAI;AAPT,wBAAoB,MAAMJ,iBAAgB;AAAA,MACxC,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,IACX,CAAC;AA4BD,sBAAkB,GAAG,UAAUI,uBAAsB;AACrD,sBAAkB,GAAG,OAAOA,uBAAsB;AAClD,sBAAkB,GAAG,UAAUA,uBAAsB;AAAA,EACvD;AAGA,MAAI,iBAAkD;AAEtD,MAAIH,aAAY;AAQd,QAASI,sBAAT,WAAoC;AAClC,YAAM,cAAc;AACpB,YAAM,WAAW,cAAc,IAAI,WAAW;AAC9C,UAAI,SAAU,cAAa,QAAQ;AAEnC,oBAAc;AAAA,QACZ;AAAA,QACA,WAAW,MAAM;AACf,wBAAc,OAAO,WAAW;AAChC,gBAAM,UAAqB;AAAA,YACzB,MAAM;AAAA,YACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC;AACA,oBAAU,OAAO;AAAA,QACnB,GAAG,UAAU;AAAA,MACf;AAAA,IACF;AAhBS,6BAAAA;AAPT,qBAAiB,MAAMJ,aAAY;AAAA,MACjC,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,IACX,CAAC;AAoBD,mBAAe,GAAG,UAAUI,mBAAkB;AAC9C,mBAAe,GAAG,OAAOA,mBAAkB;AAC3C,mBAAe,GAAG,UAAUA,mBAAkB;AAAA,EAChD;AAGA,MAAI,mBAAoD;AAExD,MAAIH,eAAc;AAQhB,QAASI,wBAAT,WAAsC;AACpC,YAAM,cAAc;AACpB,YAAM,WAAW,cAAc,IAAI,WAAW;AAC9C,UAAI,SAAU,cAAa,QAAQ;AAEnC,oBAAc;AAAA,QACZ;AAAA,QACA,WAAW,MAAM;AACf,wBAAc,OAAO,WAAW;AAChC,gBAAM,UAAqB;AAAA,YACzB,MAAM;AAAA,YACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC;AACA,oBAAU,OAAO;AAAA,QACnB,GAAG,UAAU;AAAA,MACf;AAAA,IACF;AAhBS,+BAAAA;AAPT,uBAAmB,MAAMJ,eAAc;AAAA,MACrC,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,IACX,CAAC;AAoBD,qBAAiB,GAAG,UAAUI,qBAAoB;AAClD,qBAAiB,GAAG,OAAOA,qBAAoB;AAC/C,qBAAiB,GAAG,UAAUA,qBAAoB;AAAA,EACpD;AAGA,MAAI,eAAgD;AAEpD,MAAIH,WAAU;AAQZ,QAASI,oBAAT,WAAkC;AAChC,YAAM,cAAc;AACpB,YAAM,WAAW,cAAc,IAAI,WAAW;AAC9C,UAAI,SAAU,cAAa,QAAQ;AAEnC,oBAAc;AAAA,QACZ;AAAA,QACA,WAAW,MAAM;AACf,wBAAc,OAAO,WAAW;AAChC,gBAAM,UAAqB;AAAA,YACzB,MAAM;AAAA,YACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC;AACA,oBAAU,OAAO;AAAA,QACnB,GAAG,UAAU;AAAA,MACf;AAAA,IACF;AAhBS,2BAAAA;AAPT,mBAAe,MAAMJ,WAAU;AAAA,MAC7B,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,IACX,CAAC;AAoBD,iBAAa,GAAG,UAAUI,iBAAgB;AAC1C,iBAAa,GAAG,OAAOA,iBAAgB;AACvC,iBAAa,GAAG,UAAUA,iBAAgB;AAAA,EAC5C;AAEA,SAAO;AAAA,IACL,OAAO,YAAY;AACjB,oBAAc,QAAQ,CAAC,YAAY;AACjC,qBAAa,OAAO;AAAA,MACtB,CAAC;AACD,oBAAc,MAAM;AACpB,YAAM,gBAAgB,MAAM;AAC5B,UAAI,kBAAmB,OAAM,kBAAkB,MAAM;AACrD,UAAI,eAAgB,OAAM,eAAe,MAAM;AAC/C,UAAI,iBAAkB,OAAM,iBAAiB,MAAM;AACnD,UAAI,aAAc,OAAM,aAAa,MAAM;AAAA,IAC7C;AAAA,EACF;AACF;;;AH3MA;AACAC;;;AItBA;AAHA,SAAS,cAA2C;AACpD,SAAS,WAAAC,iBAAe;AACxB,SAAS,IAAI,YAAAC,kBAAgB;AAI7B;AACA;AACA;;;ACAA,SAAS,iBAAiB,SAAmD;AAC3E,QAAM,QAAQ,QAAQ,MAAM,6CAA6C;AACzE,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,QAAQ,IAAI,MAAM,QAAQ;AAAA,EACrC;AAEA,SAAO;AAAA,IACL,QAAQ,MAAM,CAAC;AAAA,IACf,MAAM,MAAM,CAAC;AAAA,EACf;AACF;AAEO,SAAS,0BACd,SACA,OACA,SACkE;AAClE,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG;AACzC,WAAO,EAAE,OAAO,2DAA2D;AAAA,EAC7E;AAEA,QAAM,EAAE,QAAQ,KAAK,IAAI,iBAAiB,OAAO;AACjD,QAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,QAAM,eAAe,MAAM,UAAU,CAAC,SAAS,iCAAiC,KAAK,KAAK,KAAK,CAAC,CAAC;AAEjG,MAAI,iBAAiB,IAAI;AACvB,WAAO,EAAE,OAAO,yCAAyC;AAAA,EAC3D;AAEA,MAAI,aAAa,MAAM;AACvB,WAAS,YAAY,eAAe,GAAG,YAAY,MAAM,QAAQ,aAAa,GAAG;AAC/E,QAAI,eAAe,KAAK,MAAM,SAAS,EAAE,KAAK,CAAC,GAAG;AAChD,mBAAa;AACb;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB,MACpB,IAAI,CAAC,MAAM,eAAe,EAAE,MAAM,UAAU,EAAE,EAC9C;AAAA,IAAO,CAAC,EAAE,WAAW,KAAK,MACzB,YAAY,gBACT,YAAY,cACZ,+BAA+B,KAAK,IAAI;AAAA,EAC7C;AAEF,QAAM,SAAS,eAAe,KAAK;AACnC,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,OAAO,4BAA4B,KAAK,cAAc;AAAA,EACjE;AAEA,QAAM,WAAW,OAAO,KAAK;AAAA,IAC3B;AAAA,IACA,KAAK,UAAU,MAAM,GAAG;AAAA,EAC1B;AAEA,QAAM,OAAO,SAAS,IAAI;AAC1B,SAAO;AAAA,IACL,SAAS,GAAG,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,EACvC;AACF;;;ADlDA;AAQA;AAEA;AAmBA;AAEA,SAASC,oBAAmB,SAAgD;AAC1E,QAAM,UAAU,QAAQ,UAAU;AAClC,MAAI,CAAC,QAAQ,WAAW,OAAO,KAAK,CAAC,QAAQ,WAAW,SAAS,GAAG;AAClE,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,QAAQ,QAAQ,IAAI,IAAI;AAC3C,QAAM,aAAa,QAAQ,QAAQ,SAAS,UAAU;AACtD,MAAI,eAAe,IAAI;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,QAAQ,MAAM,YAAY,UAAU;AACtD,QAAM,SAAiC,CAAC;AAExC,aAAW,QAAQ,UAAU,MAAM,IAAI,GAAG;AACxC,UAAM,QAAQ,KAAK,MAAM,oCAAoC;AAC7D,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AAEA,QAAI,QAAQ,MAAM,CAAC,EAAE,KAAK;AAC1B,QACG,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,KAC3C,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAC5C;AACA,cAAQ,MAAM,MAAM,GAAG,EAAE;AAAA,IAC3B;AACA,WAAO,MAAM,CAAC,CAAC,IAAI;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,SAAS,iBACP,QACA,UACuD;AACvD,QAAM,UAAU,SAAS,OAAO,CAAC,QAAQ,CAAC,OAAO,GAAG,KAAK,OAAO,GAAG,MAAM,MAAM;AAC/E,MAAI,QAAQ,SAAS,GAAG;AACtB,WAAO,EAAE,OAAO,OAAO,QAAQ;AAAA,EACjC;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AAEA,SAASC,iBAAgB,OAAiD;AACxE,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,aAAa,OAAO,UAAU,UAAU;AAC3D,WAAO,OAAO,KAAK;AAAA,EACrB;AACA,MAAI,sBAAsB,KAAK,KAAK,GAAG;AACrC,WAAO,IAAI,KAAK;AAAA,EAClB;AACA,MAAI,UAAU,MAAM,sBAAsB,KAAK,KAAK,KAAK,UAAU,KAAK,KAAK,GAAG;AAC9E,WAAO,IAAI,MAAM,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK,CAAC;AAAA,EAC9D;AACA,SAAO;AACT;AAEA,SAAS,iBACP,SACA,KACA,OACQ;AACR,QAAM,YAAYA,iBAAgB,KAAK;AACvC,QAAM,aAAa,IAAI,OAAO,KAAK,aAAa,GAAG,CAAC,aAAa,GAAG;AAEpE,MAAI,WAAW,KAAK,OAAO,GAAG;AAC5B,WAAO,QAAQ,QAAQ,YAAY,MAAM,SAAS,EAAE;AAAA,EACtD;AAEA,QAAM,aAAa,QAAQ,QAAQ,SAAS,CAAC;AAC7C,MAAI,eAAe,IAAI;AACrB,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,QAAQ,MAAM,GAAG,UAAU,CAAC;AAAA,EAAK,GAAG,KAAK,SAAS,GAAG,QAAQ,MAAM,UAAU,CAAC;AAC1F;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;AAEA,SAAS,eACP,iBACA,YACA,WACA,SACA,MACA,kBACQ;AACR,QAAM,YAAY,aAAa;AAC/B,MAAI,OAAO,iBAAiB,iBAAiB,WAAW,SAAS;AACjE,SAAO,iBAAiB,MAAM,YAAY,SAAS;AAEnD,QAAM,YAAY,KAAK,KAAK;AAC5B,QAAM,QAAQ,MAAM,OAAO;AAAA;AAAA,gBAAqB,SAAS;AAAA;AAAA,EAAO,SAAS;AAAA;AAEzE,MAAI,KAAK,SAAS,gBAAgB,GAAG;AACnC,WAAO,KAAK,QAAQ,kBAAkB,MAAM,QAAQ,CAAC;AAAA,EACvD;AAEA,SAAO,GAAG,KAAK,QAAQ,CAAC;AAAA;AAAA,EAAO,KAAK;AACtC;AAEA,SAAS,eAAe,KAAc,KAA8B;AAClE,QAAM,EAAE,QAAQ,IAAI,IAAI,QAAQ,CAAC;AACjC,MAAI,CAAC,WAAW,OAAO,YAAY,YAAY,CAAC,QAAQ,KAAK,GAAG;AAC9D,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,sBAAsB,CAAC;AACrD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,SAAS,OAA8C;AAC9D,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,CAAC,KAAK;AAAA,EACrB;AACA,SAAO,SAAS;AAClB;AAEA,eAAe,oBAAoB,UAA0C;AAC3E,MAAI,CAAE,MAAM,WAAW,QAAQ,GAAI;AACjC,WAAO;AAAA,EACT;AACA,SAAOC,WAAS,UAAU,OAAO;AACnC;AAEO,SAAS,kBAAkBC,cAAqBC,iBAAiC;AACtF,QAAM,SAAS,OAAO;AAEtB,SAAO,IAAI,0BAA0B,CAAC,MAAe,QAAkB;AACrE,UAAM,UAAU,cAAc;AAAA,MAC5B,IAAI,WAAW;AAAA,MACf,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW,aAAa;AAAA,IAC1B,CAAC;AACD,QAAI,KAAK,EAAE,QAAQ,CAAC;AAAA,EACtB,CAAC;AAED,SAAO,IAAI,6BAA6B,CAAC,MAAe,QAAkB;AACxE,UAAM,UAAU,iBAAiB;AAAA,MAC/B,IAAI,WAAW;AAAA,MACf,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW,aAAa;AAAA,MACxB,UAAU;AAAA,MACV,WAAW,CAAC;AAAA,MACZ,OAAO,CAAC;AAAA,IACV,CAAC;AACD,QAAI,KAAK,EAAE,QAAQ,CAAC;AAAA,EACtB,CAAC;AAED,SAAO,IAAI,4BAA4B,OAAO,KAAc,QAAkB;AAC5E,UAAM,OAAO,SAAS,IAAI,OAAO,IAAI;AACrC,UAAM,WAAW,MAAM,oBAAoBD,cAAa,WAAW,IAAI;AACvE,QAAI,CAAC,UAAU;AACb,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,YAAY,IAAI,cAAc,CAAC;AAC7D;AAAA,IACF;AACA,QAAI,KAAK,QAAQ;AAAA,EACnB,CAAC;AAED,SAAO,IAAI,+CAA+C,OAAO,KAAc,QAAkB;AAC/F,UAAM,OAAO,SAAS,IAAI,OAAO,IAAI;AACrC,UAAM,iBAAiB,SAAS,IAAI,OAAO,KAAK;AAChD,UAAM,WAAW,MAAM;AAAA,MACrBA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,UAAU;AACb,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uBAAuB,CAAC;AACtD;AAAA,IACF;AACA,QAAI,KAAK,QAAQ;AAAA,EACnB,CAAC;AAED,SAAO,IAAI,oDAAoD,OAAO,KAAc,QAAkB;AACpG,UAAM,OAAO,SAAS,IAAI,OAAO,IAAI;AACrC,UAAM,iBAAiB,SAAS,IAAI,OAAO,KAAK;AAChD,UAAM,WAAW,MAAM;AAAA,MACrBA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,UAAU;AACb,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAChD;AAAA,IACF;AACA,QAAI,KAAK,QAAQ;AAAA,EACnB,CAAC;AAED,SAAO,IAAI,0DAA0D,OAAO,KAAc,QAAkB;AAC1G,UAAM,OAAO,SAAS,IAAI,OAAO,IAAI;AACrC,UAAM,iBAAiB,SAAS,IAAI,OAAO,KAAK;AAChD,UAAM,WAAW,MAAM;AAAA,MACrBA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,UAAU;AACb,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uBAAuB,CAAC;AACtD;AAAA,IACF;AACA,QAAI,KAAK,QAAQ;AAAA,EACnB,CAAC;AAED,SAAO,IAAI,uDAAuD,OAAO,KAAc,QAAkB;AACvG,UAAM,OAAO,SAAS,IAAI,OAAO,IAAI;AACrC,UAAM,iBAAiB,SAAS,IAAI,OAAO,KAAK;AAChD,UAAM,WAAW,MAAM;AAAA,MACrBA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,UAAU;AACb,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,wBAAwB,CAAC;AACvD;AAAA,IACF;AACA,QAAI,KAAK,QAAQ;AAAA,EACnB,CAAC;AAED,SAAO,IAAI,+DAA+D,OAAO,KAAc,QAAkB;AAC/G,UAAM,OAAO,SAAS,IAAI,OAAO,IAAI;AACrC,UAAM,iBAAiB,SAAS,IAAI,OAAO,KAAK;AAChD,UAAM,WAAW,MAAM;AAAA,MACrBA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,UAAU;AACb,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,4BAA4B,CAAC;AAC3D;AAAA,IACF;AACA,QAAI,KAAK,QAAQ;AAAA,EACnB,CAAC;AAED,SAAO,KAAK,iBAAiB,OAAO,KAAc,QAAkB;AAClE,QAAI;AACF,YAAM,UAAU,eAAe,KAAK,GAAG;AACvC,UAAI,CAAC,SAAS;AACZ;AAAA,MACF;AAEA,YAAM,SAASH,oBAAmB,OAAO;AACzC,UAAI,CAAC,QAAQ;AACX,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,8CAA8C,CAAC;AAC7E;AAAA,MACF;AAEA,YAAM,aAAa,iBAAiB,QAAQ,CAAC,QAAQ,OAAO,CAAC;AAC7D,UAAI,CAAC,WAAW,OAAO;AACrB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,4BAA4B,WAAW,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC;AAC3F;AAAA,MACF;AAEA,YAAM,OAAO,OAAO;AACpB,UAAI,CAAC,YAAY,IAAI,GAAG;AACtB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,IAAI,6CAA6C,CAAC;AACjG;AAAA,MACF;AAEA,YAAM,aAAaK,UAAQF,cAAa,IAAI;AAC5C,UAAI,MAAM,WAAW,UAAU,GAAG;AAChC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,YAAY,IAAI,mBAAmB,CAAC;AAClE;AAAA,MACF;AAEA,YAAM,QAAQ,OAAO;AACrB,YAAM,YAAY,OAAO,WAAW,aAAa;AAEjD,YAAM,UAAUE,UAAQ,YAAY,aAAa,CAAC;AAClD,YAAM,UAAUA,UAAQ,YAAY,WAAW,CAAC;AAChD,YAAM,UAAUA,UAAQ,YAAY,UAAU,CAAC;AAE/C,YAAM,eAAeA,UAAQ,YAAY,YAAY,GAAG,OAAO;AAE/D,UAAI;AACF,cAAM,aAAsC;AAAA,UAC1C,CAACA,UAAQ,YAAY,aAAa,GAAG,eAAe,EAAE,MAAM,UAAU,CAAC,CAAC;AAAA,UACxE,CAACA,UAAQ,YAAY,uBAAuB,GAAG,uBAAuB,EAAE,MAAM,OAAO,UAAU,CAAC,CAAC;AAAA,UACjG,CAACA,UAAQ,YAAY,iBAAiB,GAAG,iBAAiB,EAAE,MAAM,OAAO,UAAU,CAAC,CAAC;AAAA,UACrF,CAACA,UAAQ,YAAY,qBAAqB,GAAG,qBAAqB,EAAE,MAAM,OAAO,UAAU,CAAC,CAAC;AAAA,UAC7F,CAACA,UAAQ,YAAY,YAAY,GAAG,aAAa,EAAE,MAAM,OAAO,UAAU,CAAC,CAAC;AAAA,UAC5E,CAACA,UAAQ,YAAY,aAAa,WAAW,GAAG,qBAAqB,EAAE,MAAM,OAAO,UAAU,CAAC,CAAC;AAAA,UAChG,CAACA,UAAQ,YAAY,YAAY,WAAW,GAAG,oBAAoB,EAAE,MAAM,OAAO,UAAU,CAAC,CAAC;AAAA,QAChG;AAEA,mBAAW,CAAC,UAAU,WAAW,KAAK,YAAY;AAChD,gBAAM,eAAe,UAAU,WAAW;AAAA,QAC5C;AAAA,MACF,SAAS,gBAAgB;AACvB,YAAI;AACF,gBAAM,GAAG,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,QACvD,QAAQ;AAAA,QAER;AACA,cAAM;AAAA,MACR;AAEA,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC;AAAA,IAC/B,SAAS,OAAO;AACd,cAAQ,MAAM,2BAA2B,KAAK;AAC9C,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,6BAA8B,MAAgB,OAAO,GAAG,CAAC;AAAA,IACzF;AAAA,EACF,CAAC;AAED,SAAO,KAAK,mCAAmC,OAAO,KAAc,QAAkB;AACpF,QAAI;AACF,YAAM,cAAc,SAAS,IAAI,OAAO,IAAI;AAC5C,YAAM,aAAaA,UAAQF,cAAa,WAAW;AACnD,YAAM,gBAAgBE,UAAQ,YAAY,YAAY;AAEtD,UAAI,CAAE,MAAM,WAAW,aAAa,GAAI;AACtC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,YAAY,WAAW,cAAc,CAAC;AACpE;AAAA,MACF;AAEA,YAAM,UAAU,eAAe,KAAK,GAAG;AACvC,UAAI,CAAC,SAAS;AACZ;AAAA,MACF;AAEA,YAAM,SAASL,oBAAmB,OAAO;AACzC,UAAI,CAAC,QAAQ;AACX,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,8CAA8C,CAAC;AAC7E;AAAA,MACF;AAEA,YAAM,aAAa,iBAAiB,QAAQ,CAAC,QAAQ,OAAO,CAAC;AAC7D,UAAI,CAAC,WAAW,OAAO;AACrB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,4BAA4B,WAAW,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC;AAC3F;AAAA,MACF;AAEA,YAAM,iBAAiB,OAAO;AAC9B,UAAI,CAAC,YAAY,cAAc,GAAG;AAChC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,cAAc,6CAA6C,CAAC;AAC3G;AAAA,MACF;AAEA,YAAM,kBAAkB,CAAC,OAAO,UAAU,QAAQ,UAAU;AAC5D,YAAM,WAAW,OAAO,YAAY;AACpC,UAAI,CAAC,gBAAgB,SAAS,QAAQ,GAAG;AACvC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,qBAAqB,QAAQ,6CAA6C,CAAC;AACzG;AAAA,MACF;AAEA,YAAM,gBAAgBK,UAAQ,YAAY,eAAe,cAAc;AACvE,UAAI,MAAM,WAAW,aAAa,GAAG;AACnC,YAAI,OAAO,GAAG,EAAE,KAAK;AAAA,UACnB,OAAO,eAAe,cAAc,gCAAgC,WAAW;AAAA,QACjF,CAAC;AACD;AAAA,MACF;AAEA,YAAM,YAAY,OAAO,WAAW,aAAa;AAEjD,YAAM,UAAU,aAAa;AAC7B,YAAM,eAAeA,UAAQ,eAAe,eAAe,GAAG,OAAO;AAErE,UAAI;AACF,cAAM,aAAsC;AAAA,UAC1C,CAACA,UAAQ,eAAe,eAAe,GAAG,iBAAiB,EAAE,gBAAgB,UAAU,CAAC,CAAC;AAAA,UACzF,CAACA,UAAQ,eAAe,YAAY,GAAG,cAAc,EAAE,gBAAgB,UAAU,CAAC,CAAC;AAAA,UACnF,CAACA,UAAQ,eAAe,oBAAoB,GAAG,qBAAqB,EAAE,gBAAgB,UAAU,CAAC,CAAC;AAAA,QACpG;AAEA,mBAAW,CAAC,UAAU,WAAW,KAAK,YAAY;AAChD,gBAAM,eAAe,UAAU,WAAW;AAAA,QAC5C;AAAA,MACF,SAAS,gBAAgB;AACvB,YAAI;AACF,gBAAM,GAAG,eAAe,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,QAC1D,QAAQ;AAAA,QAER;AACA,cAAM;AAAA,MACR;AAEA,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,MAAM,gBAAgB,YAAY,CAAC;AAAA,IAC5D,SAAS,OAAO;AACd,cAAQ,MAAM,8BAA8B,KAAK;AACjD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,gCAAiC,MAAgB,OAAO,GAAG,CAAC;AAAA,IAC5F;AAAA,EACF,CAAC;AAED,SAAO,MAAM,uBAAuB,OAAO,KAAc,QAAkB;AACzE,QAAI;AACF,YAAM,cAAc,SAAS,IAAI,OAAO,IAAI;AAC5C,YAAM,cAAcA,UAAQF,cAAa,aAAa,YAAY;AAClE,YAAM,iBAAiB,MAAM,oBAAoB,WAAW;AAC5D,UAAI,CAAC,gBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,YAAY,WAAW,cAAc,CAAC;AACpE;AAAA,MACF;AAEA,YAAM,iBAAiB,eAAe,KAAK,GAAG;AAC9C,UAAI,CAAC,gBAAgB;AACnB;AAAA,MACF;AAEA,YAAM,UAAU,aAAa,cAAc;AAC3C,YAAM,OAAO,aAAa,cAAc;AAExC,UAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,OAAO;AAC7B,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,+CAA+C,CAAC;AAC9E;AAAA,MACF;AAEA,UAAI,KAAK,SAAS,QAAQ,MAAM;AAC9B,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,+CAA+C,CAAC;AAC9E;AAAA,MACF;AAEA,YAAM,cAAc,iBAAiB,gBAAgB,WAAW,aAAa,CAAC;AAC9E,YAAM,eAAe,aAAa,WAAW;AAE7C,YAAM,UAAU,MAAM,iBAAiBA,cAAa,WAAW;AAC/D,UAAI,KAAK,EAAE,SAAS,SAAS,YAAY,CAAC;AAAA,IAC5C,SAAS,OAAO;AACd,cAAQ,MAAM,2BAA2B,KAAK;AAC9C,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,6BAA8B,MAAgB,OAAO,GAAG,CAAC;AAAA,IACzF;AAAA,EACF,CAAC;AAED,SAAO,MAAM,0CAA0C,OAAO,KAAc,QAAkB;AAC5F,QAAI;AACF,YAAM,cAAc,SAAS,IAAI,OAAO,IAAI;AAC5C,YAAM,iBAAiB,SAAS,IAAI,OAAO,KAAK;AAChD,YAAM,iBAAiBE;AAAA,QACrBF;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,iBAAiB,MAAM,oBAAoB,cAAc;AAC/D,UAAI,CAAC,gBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uBAAuB,CAAC;AACtD;AAAA,MACF;AAEA,YAAM,iBAAiB,eAAe,KAAK,GAAG;AAC9C,UAAI,CAAC,gBAAgB;AACnB;AAAA,MACF;AAEA,YAAM,UAAU,oBAAoB,cAAc;AAClD,YAAM,OAAO,oBAAoB,cAAc;AAE/C,UAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,OAAO;AAC7B,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,kDAAkD,CAAC;AACjF;AAAA,MACF;AAEA,UAAI,KAAK,SAAS,QAAQ,MAAM;AAC9B,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,kDAAkD,CAAC;AACjF;AAAA,MACF;AAEA,UAAI,cAAc;AAGlB,UAAI,KAAK,WAAW,QAAQ,UAAU,QAAQ,WAAW,aAAa,KAAK,WAAW,WAAW;AAC/F,sBAAc,iBAAiB,aAAa,iBAAiB,IAAI;AAAA,MACnE;AAEA,oBAAc,iBAAiB,aAAa,WAAW,aAAa,CAAC;AACrE,YAAM,eAAe,gBAAgB,WAAW;AAEhD,YAAM,aAAa,MAAM,oBAAoBA,cAAa,aAAa,cAAc;AACrF,UAAI,KAAK,EAAE,YAAY,SAAS,YAAY,CAAC;AAAA,IAC/C,SAAS,OAAO;AACd,cAAQ,MAAM,8BAA8B,KAAK;AACjD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,gCAAiC,MAAgB,OAAO,GAAG,CAAC;AAAA,IAC5F;AAAA,EACF,CAAC;AAED,SAAO,MAAM,qEAAqE,OAAO,KAAc,QAAkB;AACvH,QAAI;AACF,YAAM,cAAc,SAAS,IAAI,OAAO,IAAI;AAC5C,YAAM,iBAAiB,SAAS,IAAI,OAAO,KAAK;AAChD,YAAM,iBAAiBE;AAAA,QACrBF;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,iBAAiB,MAAM,oBAAoB,cAAc;AAC/D,UAAI,CAAC,gBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uBAAuB,CAAC;AACtD;AAAA,MACF;AAEA,YAAM,EAAE,QAAQ,IAAI,IAAI,QAAQ,CAAC;AACjC,UAAI,OAAO,YAAY,WAAW;AAChC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,4BAA4B,CAAC;AAC3D;AAAA,MACF;AAEA,YAAM,QAAQ,OAAO,SAAS,SAAS,IAAI,OAAO,KAAK,GAAG,EAAE;AAC5D,YAAM,SAAS,0BAA0B,gBAAgB,OAAO,OAAO;AACvE,UAAI,WAAW,QAAQ;AACrB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,OAAO,MAAM,CAAC;AAC5C;AAAA,MACF;AAEA,YAAM,cAAc,iBAAiB,OAAO,SAAS,WAAW,aAAa,CAAC;AAC9E,YAAM,eAAe,gBAAgB,WAAW;AAEhD,YAAM,aAAa,MAAM,oBAAoBA,cAAa,aAAa,cAAc;AACrF,UAAI,KAAK,EAAE,YAAY,SAAS,YAAY,CAAC;AAAA,IAC/C,SAAS,OAAO;AACd,cAAQ,MAAM,wCAAwC,KAAK;AAC3D,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,0CAA2C,MAAgB,OAAO,GAAG,CAAC;AAAA,IACtG;AAAA,EACF,CAAC;AAED,SAAO,MAAM,+CAA+C,OAAO,KAAc,QAAkB;AACjG,QAAI;AACF,YAAM,cAAc,SAAS,IAAI,OAAO,IAAI;AAC5C,YAAM,iBAAiB,SAAS,IAAI,OAAO,KAAK;AAChD,YAAM,WAAWE;AAAA,QACfF;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,iBAAiB,MAAM,oBAAoB,QAAQ;AACzD,UAAI,CAAC,gBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAChD;AAAA,MACF;AAEA,YAAM,iBAAiB,eAAe,KAAK,GAAG;AAC9C,UAAI,CAAC,gBAAgB;AACnB;AAAA,MACF;AAEA,YAAM,OAAO,UAAU,cAAc;AACrC,UAAI,CAAC,KAAK,YAAY;AACpB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,kDAAkD,CAAC;AACjF;AAAA,MACF;AAEA,UAAI,KAAK,eAAe,gBAAgB;AACtC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,8DAA8D,CAAC;AAC7F;AAAA,MACF;AAEA,YAAM,cAAc,iBAAiB,gBAAgB,WAAW,aAAa,CAAC;AAC9E,YAAM,eAAe,UAAU,WAAW;AAE1C,YAAM,aAAa,MAAM,oBAAoBA,cAAa,aAAa,cAAc;AACrF,UAAI,KAAK,EAAE,YAAY,SAAS,YAAY,CAAC;AAAA,IAC/C,SAAS,OAAO;AACd,cAAQ,MAAM,wBAAwB,KAAK;AAC3C,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,0BAA2B,MAAgB,OAAO,GAAG,CAAC;AAAA,IACtF;AAAA,EACF,CAAC;AAED,SAAO,MAAM,qDAAqD,OAAO,KAAc,QAAkB;AACvG,QAAI;AACF,YAAM,cAAc,SAAS,IAAI,OAAO,IAAI;AAC5C,YAAM,iBAAiB,SAAS,IAAI,OAAO,KAAK;AAChD,YAAM,iBAAiBE;AAAA,QACrBF;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,iBAAiB,MAAM,oBAAoB,cAAc;AAC/D,UAAI,CAAC,gBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uBAAuB,CAAC;AACtD;AAAA,MACF;AAEA,YAAM,iBAAiB,eAAe,KAAK,GAAG;AAC9C,UAAI,CAAC,gBAAgB;AACnB;AAAA,MACF;AAEA,YAAM,OAAO,gBAAgB,cAAc;AAC3C,UAAI,CAAC,KAAK,YAAY;AACpB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,wDAAwD,CAAC;AACvF;AAAA,MACF;AAEA,UAAI,KAAK,eAAe,gBAAgB;AACtC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,oEAAoE,CAAC;AACnG;AAAA,MACF;AAEA,YAAM,cAAc,iBAAiB,gBAAgB,WAAW,aAAa,CAAC;AAC9E,YAAM,eAAe,gBAAgB,WAAW;AAEhD,YAAM,aAAa,MAAM,oBAAoBA,cAAa,aAAa,cAAc;AACrF,UAAI,KAAK,EAAE,YAAY,SAAS,YAAY,CAAC;AAAA,IAC/C,SAAS,OAAO;AACd,cAAQ,MAAM,8BAA8B,KAAK;AACjD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,gCAAiC,MAAgB,OAAO,GAAG,CAAC;AAAA,IAC5F;AAAA,EACF,CAAC;AAED,SAAO,KAAK,0DAA0D,OAAO,KAAc,QAAkB;AAC3G,QAAI;AACF,YAAM,cAAc,SAAS,IAAI,OAAO,IAAI;AAC5C,YAAM,iBAAiB,SAAS,IAAI,OAAO,KAAK;AAChD,YAAM,cAAcE;AAAA,QAClBF;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,iBAAiB,MAAM,oBAAoB,WAAW;AAC5D,UAAI,CAAC,gBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,wBAAwB,CAAC;AACvD;AAAA,MACF;AAEA,YAAM,EAAE,OAAO,KAAK,IAAI,IAAI,QAAQ,CAAC;AACrC,UAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,CAAC,KAAK,KAAK,GAAG;AACrD,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,mBAAmB,CAAC;AAClD;AAAA,MACF;AAEA,YAAM,SAAS,aAAa,cAAc;AAC1C,YAAM,cAAc;AAAA,QAClB;AAAA,QACA;AAAA,QACA,OAAO,eAAe;AAAA,QACtB,SAAS,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI,WAAW,OAAO,eAAe,CAAC;AAAA,QACtG;AAAA,QACA;AAAA,MACF;AAEA,YAAM,eAAe,aAAa,WAAW;AAC7C,YAAM,aAAa,MAAM,oBAAoBA,cAAa,aAAa,cAAc;AACrF,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,YAAY,SAAS,YAAY,CAAC;AAAA,IAC3D,SAAS,OAAO;AACd,cAAQ,MAAM,kCAAkC,KAAK;AACrD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,mCAAoC,MAAgB,OAAO,GAAG,CAAC;AAAA,IAC/F;AAAA,EACF,CAAC;AAED,SAAO,KAAK,kEAAkE,OAAO,KAAc,QAAkB;AACnH,QAAI;AACF,YAAM,cAAc,SAAS,IAAI,OAAO,IAAI;AAC5C,YAAM,iBAAiB,SAAS,IAAI,OAAO,KAAK;AAChD,YAAM,eAAeE;AAAA,QACnBF;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,iBAAiB,MAAM,oBAAoB,YAAY;AAC7D,UAAI,CAAC,gBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,4BAA4B,CAAC;AAC3D;AAAA,MACF;AAEA,YAAM,EAAE,OAAO,KAAK,IAAI,IAAI,QAAQ,CAAC;AACrC,UAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,CAAC,KAAK,KAAK,GAAG;AACrD,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,mBAAmB,CAAC;AAClD;AAAA,MACF;AAEA,YAAM,SAAS,oBAAoB,cAAc;AACjD,YAAM,cAAc;AAAA,QAClB;AAAA,QACA;AAAA,QACA,OAAO,gBAAgB;AAAA,QACvB,SAAS,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI,YAAY,OAAO,gBAAgB,CAAC;AAAA,QACxG;AAAA,QACA;AAAA,MACF;AAEA,YAAM,eAAe,cAAc,WAAW;AAC9C,YAAM,aAAa,MAAM,oBAAoBA,cAAa,aAAa,cAAc;AACrF,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,YAAY,SAAS,YAAY,CAAC;AAAA,IAC3D,SAAS,OAAO;AACd,cAAQ,MAAM,mCAAmC,KAAK;AACtD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,oCAAqC,MAAgB,OAAO,GAAG,CAAC;AAAA,IAChG;AAAA,EACF,CAAC;AAID,SAAO,KAAK,mDAAmD,OAAO,KAAc,QAAkB;AACpG,QAAI;AACF,YAAM,cAAc,SAAS,IAAI,OAAO,IAAI;AAC5C,YAAM,iBAAiB,SAAS,IAAI,OAAO,KAAK;AAChD,YAAM,eAAeE;AAAA,QACnBF;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,YAAM,EAAE,MAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,QAAQ,CAAC;AACrD,UAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,CAAC,KAAK,KAAK,GAAG;AACrD,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,mBAAmB,CAAC;AAClD;AAAA,MACF;AACA,YAAM,cAA2B,QAAQ,CAAC,YAAY,QAAQ,UAAU,EAAE,SAAS,IAAI,IACnF,OACA;AACJ,YAAM,YAAY,aAAa;AAC/B,YAAM,cAAe,OAAO,WAAW,YAAY,OAAO,KAAK,IAAK,OAAO,KAAK,IAAI;AAEpF,UAAI;AACJ,UAAI,eAAe;AACnB,UAAI,MAAM,WAAW,YAAY,GAAG;AAClC,yBAAiB,MAAMD,WAAS,cAAc,OAAO;AACrD,cAAM,aAAa,eAAe,MAAM,uBAAuB;AAC/D,YAAI,WAAY,gBAAe,SAAS,WAAW,CAAC,GAAG,EAAE;AAAA,MAC3D,OAAO;AACL,yBAAiB,eAAe;AAAA,UAC9B,YAAY;AAAA,UACZ;AAAA,QACF,CAAC;AAAA,MACH;AAEA,YAAM,UAAmB;AAAA,QACvB,IAAI,WAAW,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,QAC7B;AAAA,QACA,QAAQ;AAAA,QACR,MAAM;AAAA,QACN;AAAA,QACA,SAAS,OAAO,YAAY,YAAY,QAAQ,KAAK,IAAI,QAAQ,KAAK,IAAI;AAAA,QAC1E,UAAU,gBAAgB,aAAa,QAAQ;AAAA,MACjD;AACA,YAAM,QAAQ,mBAAmB,OAAO;AACxC,UAAI,OAAO,iBAAiB,gBAAgB,cAAc,OAAO,eAAe,CAAC,CAAC;AAClF,aAAO,iBAAiB,MAAM,WAAW,IAAI,SAAS,GAAG;AACzD,UAAI,KAAK,SAAS,kBAAkB,GAAG;AACrC,eAAO,KAAK,QAAQ,oBAAoB,MAAM,QAAQ,CAAC;AAAA,MACzD,OAAO;AACL,eAAO,GAAG,KAAK,QAAQ,CAAC;AAAA;AAAA,EAAO,KAAK;AAAA,MACtC;AAEA,YAAM,eAAe,cAAc,IAAI;AACvC,YAAM,aAAa,MAAM,oBAAoBC,cAAa,aAAa,cAAc;AACrF,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,YAAY,SAAS,EAAE,IAAI,QAAQ,GAAG,EAAE,CAAC;AAAA,IAClE,SAAS,OAAO;AACd,cAAQ,MAAM,4BAA4B,KAAK;AAC/C,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,6BAA8B,MAAgB,OAAO,GAAG,CAAC;AAAA,IACzF;AAAA,EACF,CAAC;AAED,SAAO,MAAM,uEAAuE,OAAO,KAAc,QAAkB;AACzH,QAAI;AACF,YAAM,cAAc,SAAS,IAAI,OAAO,IAAI;AAC5C,YAAM,iBAAiB,SAAS,IAAI,OAAO,KAAK;AAChD,YAAM,YAAY,SAAS,IAAI,OAAO,SAAS;AAC/C,YAAM,eAAeE;AAAA,QACnBF;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,CAAE,MAAM,WAAW,YAAY,GAAI;AACrC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,0BAA0B,CAAC;AACzD;AAAA,MACF;AACA,YAAM,EAAE,SAAS,IAAI,IAAI,QAAQ,CAAC;AAClC,UAAI,OAAO,aAAa,WAAW;AACjC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iCAAiC,CAAC;AAChE;AAAA,MACF;AAEA,YAAM,UAAU,MAAMD,WAAS,cAAc,OAAO;AACpD,YAAM,SAAS,cAAc,OAAO;AACpC,YAAM,SAAS,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS;AAC5D,UAAI,CAAC,QAAQ;AACX,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,WAAW,SAAS,aAAa,CAAC;AAChE;AAAA,MACF;AACA,UAAI,OAAO,SAAS,YAAY;AAC9B,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iCAAiC,CAAC;AAChE;AAAA,MACF;AAGA,YAAM,kBAAkB,IAAI;AAAA,QAC1B,QAAQ,UAAU,QAAQ,uBAAuB,MAAM,CAAC;AAAA,QACxD;AAAA,MACF;AACA,YAAM,OAAO,QAAQ;AAAA,QACnB;AAAA,QACA,CAAC,IAAI,aAAa,GAAG,QAAQ,iBAAiB,WAAW,SAAS,OAAO;AAAA,MAC3E;AACA,UAAI,SAAS,SAAS;AACpB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iCAAiC,CAAC;AAChE;AAAA,MACF;AAEA,YAAM,cAAc,iBAAiB,MAAM,WAAW,IAAI,aAAa,CAAC,GAAG;AAC3E,YAAM,eAAe,cAAc,WAAW;AAC9C,YAAM,aAAa,MAAM,oBAAoBC,cAAa,aAAa,cAAc;AACrF,UAAI,KAAK,EAAE,WAAW,CAAC;AAAA,IACzB,SAAS,OAAO;AACd,cAAQ,MAAM,yCAAyC,KAAK;AAC5D,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,8BAA+B,MAAgB,OAAO,GAAG,CAAC;AAAA,IAC1F;AAAA,EACF,CAAC;AAID,SAAO,KAAK,sCAAsC,OAAO,KAAc,QAAkB;AACvF,QAAI;AACF,YAAM,cAAc,SAAS,IAAI,OAAO,IAAI;AAC5C,YAAM,cAAcE,UAAQF,cAAa,aAAa,YAAY;AAClE,UAAI,CAAE,MAAM,WAAW,WAAW,GAAI;AACpC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,YAAY,WAAW,cAAc,CAAC;AACpE;AAAA,MACF;AAEA,YAAM,EAAE,UAAU,IAAI,IAAI,QAAQ,CAAC;AACnC,UAAI,cAAc,SAAS,OAAO,cAAc,YAAY,CAAC,UAAU,KAAK,IAAI;AAC9E,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,gEAAgE,CAAC;AAC/F;AAAA,MACF;AAEA,UAAI,UAAU,MAAMD,WAAS,aAAa,OAAO;AACjD,gBAAU,iBAAiB,SAAS,aAAa,aAAa,IAAI;AAClE,gBAAU,iBAAiB,SAAS,WAAW,aAAa,CAAC;AAC7D,YAAM,eAAe,aAAa,OAAO;AAEzC,YAAM,UAAU,MAAM,iBAAiBC,cAAa,WAAW;AAC/D,UAAI,KAAK,EAAE,QAAQ,CAAC;AAAA,IACtB,SAAS,OAAO;AACd,cAAQ,MAAM,mCAAmC,KAAK;AACtD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,6BAA8B,MAAgB,OAAO,GAAG,CAAC;AAAA,IACzF;AAAA,EACF,CAAC;AAID,SAAO,KAAK,uCAAuC,OAAO,KAAc,QAAkB;AACxF,QAAI;AACF,YAAM,cAAc,SAAS,IAAI,OAAO,IAAI;AAC5C,YAAM,cAAcE,UAAQF,cAAa,aAAa,YAAY;AAClE,UAAI,CAAE,MAAM,WAAW,WAAW,GAAI;AACpC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,YAAY,WAAW,cAAc,CAAC;AACpE;AAAA,MACF;AAEA,YAAM,EAAE,OAAO,IAAI,IAAI,QAAQ,CAAC;AAChC,YAAM,SAAS,MAAM,gBAAgB;AACrC,YAAM,gBAAgB,CAAC,UAAU,YAAY,GAAG,OAAO,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAChF,UAAI,WAAW,SAAS,OAAO,WAAW,YAAY,CAAC,cAAc,SAAS,MAAM,IAAI;AACtF,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,mCAAmC,cAAc,KAAK,IAAI,CAAC,sBAAsB,CAAC;AAChH;AAAA,MACF;AAEA,UAAI,UAAU,MAAMD,WAAS,aAAa,OAAO;AACjD,gBAAU,iBAAiB,SAAS,kBAAkB,UAAU,IAAI;AACpE,gBAAU,iBAAiB,SAAS,WAAW,aAAa,CAAC;AAC7D,YAAM,eAAe,aAAa,OAAO;AAEzC,YAAM,UAAU,MAAM,iBAAiBC,cAAa,WAAW;AAC/D,UAAI,KAAK,EAAE,QAAQ,CAAC;AAAA,IACtB,SAAS,OAAO;AACd,cAAQ,MAAM,0CAA0C,KAAK;AAC7D,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,kCAAmC,MAAgB,OAAO,GAAG,CAAC;AAAA,IAC9F;AAAA,EACF,CAAC;AAED,SAAO,KAAK,0DAA0D,OAAO,KAAc,QAAkB;AAC3G,QAAI;AACF,YAAM,cAAc,SAAS,IAAI,OAAO,IAAI;AAC5C,YAAM,iBAAiB,SAAS,IAAI,OAAO,KAAK;AAChD,YAAM,iBAAiBE;AAAA,QACrBF;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,CAAE,MAAM,WAAW,cAAc,GAAI;AACvC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uBAAuB,CAAC;AACtD;AAAA,MACF;AAEA,YAAM,EAAE,OAAO,IAAI,IAAI,QAAQ,CAAC;AAChC,YAAM,SAAS,MAAM,gBAAgB;AACrC,YAAM,gBAAgB,OAAO,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE;AACrD,UAAI,OAAO,WAAW,YAAY,CAAC,cAAc,SAAS,MAAM,GAAG;AACjE,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,mCAAmC,cAAc,KAAK,IAAI,CAAC,IAAI,CAAC;AAC9F;AAAA,MACF;AAEA,UAAI,UAAU,MAAMD,WAAS,gBAAgB,OAAO;AACpD,gBAAU,iBAAiB,SAAS,UAAU,MAAM;AACpD,gBAAU,iBAAiB,SAAS,WAAW,aAAa,CAAC;AAG7D,UAAI,WAAW,WAAW;AACxB,kBAAU,iBAAiB,SAAS,iBAAiB,IAAI;AAAA,MAC3D;AAEA,YAAM,eAAe,gBAAgB,OAAO;AAE5C,YAAM,aAAa,MAAM,oBAAoBC,cAAa,aAAa,cAAc;AACrF,UAAI,KAAK,EAAE,WAAW,CAAC;AAAA,IACzB,SAAS,OAAO;AACd,cAAQ,MAAM,uCAAuC,KAAK;AAC1D,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,8BAA+B,MAAgB,OAAO,GAAG,CAAC;AAAA,IAC1F;AAAA,EACF,CAAC;AAID,SAAO,KAAK,+DAA+D,OAAO,KAAc,QAAkB;AAChH,QAAI;AACF,YAAM,cAAc,SAAS,IAAI,OAAO,IAAI;AAC5C,YAAM,iBAAiB,SAAS,IAAI,OAAO,KAAK;AAChD,YAAM,UAAU,IAAI,OAAO;AAC3B,YAAM,SAAS,MAAM,gBAAgB;AACrC,YAAM,gBAAgB,CAAC,GAAG,IAAI,IAAI,OAAO,YAAY,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC3E,UAAI,CAAC,cAAc,SAAS,OAAO,GAAG;AACpC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,mCAAmC,IAAI,OAAO,OAAO,IAAI,CAAC;AACxF;AAAA,MACF;AAEA,YAAM,aAAaE,UAAQF,cAAa,WAAW;AACnD,YAAM,iBAAiBE,UAAQ,YAAY,eAAe,gBAAgB,eAAe;AACzF,UAAI,CAAE,MAAM,WAAW,cAAc,GAAI;AACvC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uBAAuB,CAAC;AACtD;AAAA,MACF;AAEA,YAAM,EAAE,OAAO,IAAI,IAAI,QAAQ,CAAC;AAChC,YAAM,SAAS,MAAM,kBAAkB,YAAY,gBAAgB,SAAS;AAAA,QAC1E,QAAQ,OAAO,WAAW,WAAW,SAAS;AAAA,QAC9C,iBAAiB,OAAO,SAAS,OAAO,kBAAkB;AAAA,QAC1D,kBAAkB,OAAO,SAAS,OAAO,mBAAmB;AAAA,MAC9D,CAAC;AAED,UAAI,CAAC,OAAO,SAAS;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,OAAO,QAAQ,CAAC;AAC9C;AAAA,MACF;AAEA,YAAM,aAAa,MAAM,oBAAoBF,cAAa,aAAa,cAAc;AACrF,UAAI,KAAK,EAAE,YAAY,YAAY,OAAO,CAAC;AAAA,IAC7C,SAAS,OAAO;AACd,cAAQ,MAAM,wCAAwC,KAAK;AAC3D,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,oCAAqC,MAAgB,OAAO,GAAG,CAAC;AAAA,IAChG;AAAA,EACF,CAAC;AAED,SAAO,OAAO,0CAA0C,OAAO,KAAc,QAAkB;AAC7F,QAAI;AACF,YAAM,cAAc,SAAS,IAAI,OAAO,IAAI;AAC5C,YAAM,iBAAiB,SAAS,IAAI,OAAO,KAAK;AAChD,YAAM,gBAAgBE,UAAQF,cAAa,aAAa,eAAe,cAAc;AACrF,YAAM,iBAAiBE,UAAQ,eAAe,eAAe;AAE7D,UAAI,CAAE,MAAM,WAAW,cAAc,GAAI;AACvC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,eAAe,cAAc,2BAA2B,WAAW,IAAI,CAAC;AACtG;AAAA,MACF;AAEA,YAAM,GAAG,eAAe,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACxD,UAAI,KAAK,EAAE,SAAS,gBAAgB,YAAY,CAAC;AAAA,IACnD,SAAS,OAAO;AACd,cAAQ,MAAM,8BAA8B,KAAK;AACjD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,gCAAiC,MAAgB,OAAO,GAAG,CAAC;AAAA,IAC5F;AAAA,EACF,CAAC;AAOD,SAAO,KAAK,oBAAoB,OAAO,KAAc,QAAkB;AACrE,QAAI;AACF,UAAI,CAACD,iBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uDAAuD,CAAC;AACtF;AAAA,MACF;AACA,YAAM,EAAE,OAAO,MAAM,UAAU,KAAK,IAAI,IAAI,QAAQ,CAAC;AACrD,UAAI,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,GAAG;AACxD,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,oBAAoB,CAAC;AACnD;AAAA,MACF;AACA,YAAM,EAAE,UAAU,IAAI,IAAI,QAAQ,CAAC;AACnC,UAAI,MAAM,QAAQ,SAAS,KAAK,UAAU,SAAS,GAAG;AACpD,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,mDAAmD,CAAC;AAClF;AAAA,MACF;AAEA,YAAM,KAAK,WAAW;AACtB,YAAM,gBAAgBC,UAAQD,iBAAgB,EAAE;AAChD,UAAI,MAAM,WAAW,aAAa,GAAG;AACnC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,kCAA6B,CAAC;AAC5D;AAAA,MACF;AAEA,YAAM,YAAY,aAAa;AAC/B,YAAM,eAAe,OAAO,SAAS,YAAY,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,aAAa,KAAK;AAC/F,YAAM,mBAAoB,OAAO,aAAa,YAAY,CAAC,OAAO,UAAU,QAAQ,UAAU,EAAE,SAAS,QAAQ,IAC5G,WACD;AAEJ,YAAM,UAAU,aAAa;AAC7B,YAAM,oBAAoB,iBAAiB;AAAA,QACzC;AAAA,QACA,MAAM;AAAA,QACN,OAAO,MAAM,KAAK;AAAA,QAClB;AAAA,QACA,UAAU;AAAA,QACV,WAAW,CAAC;AAAA,QACZ,OAAO,CAAC;AAAA,QACR,SAAS;AAAA,QACT,MAAM,OAAO,SAAS,WAAW,OAAO;AAAA,MAC1C,CAAC;AACD,YAAM,eAAeC,UAAQ,eAAe,eAAe,GAAG,iBAAiB;AAC/E,YAAM;AAAA,QACJA,UAAQ,eAAe,eAAe;AAAA,QACtC,iBAAiB,EAAE,gBAAgB,IAAI,UAAU,CAAC;AAAA,MACpD;AACA,YAAM;AAAA,QACJA,UAAQ,eAAe,YAAY;AAAA,QACnC,cAAc,EAAE,gBAAgB,IAAI,UAAU,CAAC;AAAA,MACjD;AACA,YAAM;AAAA,QACJA,UAAQ,eAAe,oBAAoB;AAAA,QAC3C,qBAAqB,EAAE,gBAAgB,IAAI,UAAU,CAAC;AAAA,MACxD;AACA,YAAM;AAAA,QACJA,UAAQ,eAAe,aAAa;AAAA,QACpC,eAAe,EAAE,YAAY,IAAI,UAAU,CAAC;AAAA,MAC9C;AACA,YAAM;AAAA,QACJA,UAAQ,eAAe,aAAa;AAAA,QACpC,eAAe,EAAE,YAAY,IAAI,UAAU,CAAC;AAAA,MAC9C;AAEA,YAAM,SAAS,MAAM,wBAAwBF,cAAaC,iBAAgB,EAAE;AAC5E,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,YAAY,OAAO,CAAC;AAAA,IAC7C,SAAS,OAAO;AACd,cAAQ,MAAM,yCAAyC,KAAK;AAC5D,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,2CAA4C,MAAgB,OAAO,GAAG,CAAC;AAAA,IACvG;AAAA,EACF,CAAC;AAED,SAAO,KAAK,iCAAiC,OAAO,KAAc,QAAkB;AAClF,QAAI;AACF,UAAI,CAACA,iBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uDAAuD,CAAC;AACtF;AAAA,MACF;AACA,YAAM,KAAK,SAAS,IAAI,OAAO,EAAE;AACjC,YAAM,WAAW,MAAM,sBAAsBD,cAAaC,iBAAgB,EAAE;AAC5E,UAAI,CAAC,UAAU;AACb,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,eAAe,EAAE,cAAc,CAAC;AAC9D;AAAA,MACF;AACA,YAAM,gBAAgB,SAAS,eAAe,SAAS,aAAa,SAAS,KAAK,SAAS,gBAAgB,KAAK,KAAK,YAAY;AAC/H,eAAO,SAAS,aACZ,wBAAwBD,cAAaC,iBAAgB,EAAE,IACvD,oBAAoBD,cAAa,SAAS,aAAc,SAAS,cAAc;AAAA,MACrF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,MAAM,oCAAoC,KAAK;AACvD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,6BAA8B,MAAgB,OAAO,GAAG,CAAC;AAAA,IACzF;AAAA,EACF,CAAC;AAED,SAAO,MAAM,qDAAqD,OAAO,KAAc,QAAkB;AACvG,QAAI;AACF,UAAI,CAACC,iBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uDAAuD,CAAC;AACtF;AAAA,MACF;AACA,YAAM,KAAK,SAAS,IAAI,OAAO,EAAE;AACjC,YAAM,YAAY,SAAS,IAAI,OAAO,SAAS;AAC/C,YAAM,WAAW,MAAM,sBAAsBD,cAAaC,iBAAgB,EAAE;AAC5E,UAAI,CAAC,UAAU;AACb,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,eAAe,EAAE,cAAc,CAAC;AAC9D;AAAA,MACF;AACA,YAAM,wBAAwB,SAAS,eAAe,WAAW,KAAK,KAAK,YAAY;AACrF,eAAO,SAAS,aACZ,wBAAwBD,cAAaC,iBAAgB,EAAE,IACvD,oBAAoBD,cAAa,SAAS,aAAc,SAAS,cAAc;AAAA,MACrF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,MAAM,4CAA4C,KAAK;AAC/D,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,8BAA+B,MAAgB,OAAO,GAAG,CAAC;AAAA,IAC1F;AAAA,EACF,CAAC;AAED,SAAO,IAAI,6BAA6B,OAAO,KAAc,QAAkB;AAC7E,QAAI,CAACC,iBAAgB;AACnB,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uDAAuD,CAAC;AACtF;AAAA,IACF;AACA,UAAM,KAAK,SAAS,IAAI,OAAO,EAAE;AACjC,UAAM,MAAM,MAAM,wBAAwBD,cAAaC,iBAAgB,cAAc,EAAE;AACvF,QAAI,CAAC,KAAK;AACR,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uBAAuB,CAAC;AACtD;AAAA,IACF;AACA,QAAI,KAAK,GAAG;AAAA,EACd,CAAC;AAED,SAAO,IAAI,kCAAkC,OAAO,KAAc,QAAkB;AAClF,QAAI,CAACA,iBAAgB;AACnB,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uDAAuD,CAAC;AACtF;AAAA,IACF;AACA,UAAM,KAAK,SAAS,IAAI,OAAO,EAAE;AACjC,UAAM,MAAM,MAAM,wBAAwBD,cAAaC,iBAAgB,QAAQ,EAAE;AACjF,QAAI,CAAC,KAAK;AACR,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAChD;AAAA,IACF;AACA,QAAI,KAAK,GAAG;AAAA,EACd,CAAC;AAED,SAAO,IAAI,wCAAwC,OAAO,KAAc,QAAkB;AACxF,QAAI,CAACA,iBAAgB;AACnB,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uDAAuD,CAAC;AACtF;AAAA,IACF;AACA,UAAM,KAAK,SAAS,IAAI,OAAO,EAAE;AACjC,UAAM,MAAM,MAAM,wBAAwBD,cAAaC,iBAAgB,cAAc,EAAE;AACvF,QAAI,CAAC,KAAK;AACR,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uBAAuB,CAAC;AACtD;AAAA,IACF;AACA,QAAI,KAAK,GAAG;AAAA,EACd,CAAC;AAED,SAAO,IAAI,qCAAqC,OAAO,KAAc,QAAkB;AACrF,QAAI,CAACA,iBAAgB;AACnB,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uDAAuD,CAAC;AACtF;AAAA,IACF;AACA,UAAM,KAAK,SAAS,IAAI,OAAO,EAAE;AACjC,UAAM,MAAM,MAAM,wBAAwBD,cAAaC,iBAAgB,WAAW,EAAE;AACpF,QAAI,CAAC,KAAK;AACR,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,wBAAwB,CAAC;AACvD;AAAA,IACF;AACA,QAAI,KAAK,GAAG;AAAA,EACd,CAAC;AAED,SAAO,IAAI,6CAA6C,OAAO,KAAc,QAAkB;AAC7F,QAAI,CAACA,iBAAgB;AACnB,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uDAAuD,CAAC;AACtF;AAAA,IACF;AACA,UAAM,KAAK,SAAS,IAAI,OAAO,EAAE;AACjC,UAAM,MAAM,MAAM,wBAAwBD,cAAaC,iBAAgB,mBAAmB,EAAE;AAC5F,QAAI,CAAC,KAAK;AACR,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,4BAA4B,CAAC;AAC3D;AAAA,IACF;AACA,QAAI,KAAK,GAAG;AAAA,EACd,CAAC;AAED,SAAO,MAAM,wBAAwB,OAAO,KAAc,QAAkB;AAC1E,QAAI;AACF,UAAI,CAACA,iBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uDAAuD,CAAC;AACtF;AAAA,MACF;AACA,YAAM,KAAK,SAAS,IAAI,OAAO,EAAE;AACjC,YAAM,WAAW,MAAM,sBAAsBD,cAAaC,iBAAgB,EAAE;AAC5E,UAAI,CAAC,UAAU;AACb,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,eAAe,EAAE,cAAc,CAAC;AAC9D;AAAA,MACF;AAEA,YAAM,iBAAiBC,UAAQ,SAAS,eAAe,eAAe;AACtE,YAAM,iBAAiB,MAAM,oBAAoB,cAAc;AAC/D,UAAI,CAAC,gBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uBAAuB,CAAC;AACtD;AAAA,MACF;AAEA,YAAM,iBAAiB,eAAe,KAAK,GAAG;AAC9C,UAAI,CAAC,eAAgB;AAErB,YAAM,UAAU,oBAAoB,cAAc;AAClD,YAAM,OAAO,oBAAoB,cAAc;AAE/C,UAAI,CAAC,KAAK,OAAO;AACf,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,2CAA2C,CAAC;AAC1E;AAAA,MACF;AAGA,UAAI,cAAc;AAClB,UAAI,QAAQ,GAAI,eAAc,iBAAiB,aAAa,MAAM,QAAQ,EAAE;AAC5E,oBAAc,iBAAiB,aAAa,WAAW,IAAI;AAC3D,UAAI,QAAQ,KAAM,eAAc,iBAAiB,aAAa,QAAQ,QAAQ,IAAI;AAElF,UAAI,KAAK,WAAW,QAAQ,UAAU,QAAQ,WAAW,aAAa,KAAK,WAAW,WAAW;AAC/F,sBAAc,iBAAiB,aAAa,iBAAiB,IAAI;AAAA,MACnE;AAEA,oBAAc,iBAAiB,aAAa,WAAW,aAAa,CAAC;AACrE,YAAM,eAAe,gBAAgB,WAAW;AAEhD,YAAM,aAAa,MAAM,wBAAwBF,cAAaC,iBAAgB,EAAE;AAChF,UAAI,KAAK,EAAE,YAAY,SAAS,YAAY,CAAC;AAAA,IAC/C,SAAS,OAAO;AACd,cAAQ,MAAM,yCAAyC,KAAK;AAC5D,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,gCAAiC,MAAgB,OAAO,GAAG,CAAC;AAAA,IAC5F;AAAA,EACF,CAAC;AAED,SAAO,MAAM,6BAA6B,OAAO,KAAc,QAAkB;AAC/E,QAAI;AACF,UAAI,CAACA,iBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uDAAuD,CAAC;AACtF;AAAA,MACF;AACA,YAAM,KAAK,SAAS,IAAI,OAAO,EAAE;AACjC,YAAM,WAAW,MAAM,sBAAsBD,cAAaC,iBAAgB,EAAE;AAC5E,UAAI,CAAC,UAAU;AACb,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,eAAe,EAAE,cAAc,CAAC;AAC9D;AAAA,MACF;AAEA,YAAM,WAAWC,UAAQ,SAAS,eAAe,SAAS;AAC1D,YAAM,iBAAiB,MAAM,oBAAoB,QAAQ;AACzD,UAAI,CAAC,gBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAChD;AAAA,MACF;AACA,YAAM,iBAAiB,eAAe,KAAK,GAAG;AAC9C,UAAI,CAAC,eAAgB;AAErB,YAAM,SAAS,UAAU,cAAc;AACvC,UAAI,CAAC,OAAO,YAAY;AACtB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,kDAAkD,CAAC;AACjF;AAAA,MACF;AAEA,YAAM,cAAc,iBAAiB,gBAAgB,WAAW,aAAa,CAAC;AAC9E,YAAM,eAAe,UAAU,WAAW;AAE1C,YAAM,aAAa,MAAM,wBAAwBF,cAAaC,iBAAgB,EAAE;AAChF,UAAI,KAAK,EAAE,YAAY,SAAS,YAAY,CAAC;AAAA,IAC/C,SAAS,OAAO;AACd,cAAQ,MAAM,mCAAmC,KAAK;AACtD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,0BAA2B,MAAgB,OAAO,GAAG,CAAC;AAAA,IACtF;AAAA,EACF,CAAC;AAED,SAAO,MAAM,mCAAmC,OAAO,KAAc,QAAkB;AACrF,QAAI;AACF,UAAI,CAACA,iBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uDAAuD,CAAC;AACtF;AAAA,MACF;AACA,YAAM,KAAK,SAAS,IAAI,OAAO,EAAE;AACjC,YAAM,WAAW,MAAM,sBAAsBD,cAAaC,iBAAgB,EAAE;AAC5E,UAAI,CAAC,UAAU;AACb,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,eAAe,EAAE,cAAc,CAAC;AAC9D;AAAA,MACF;AAEA,YAAM,iBAAiBC,UAAQ,SAAS,eAAe,eAAe;AACtE,YAAM,iBAAiB,MAAM,oBAAoB,cAAc;AAC/D,UAAI,CAAC,gBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uBAAuB,CAAC;AACtD;AAAA,MACF;AACA,YAAM,iBAAiB,eAAe,KAAK,GAAG;AAC9C,UAAI,CAAC,eAAgB;AAErB,YAAM,SAAS,gBAAgB,cAAc;AAC7C,UAAI,CAAC,OAAO,YAAY;AACtB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,wDAAwD,CAAC;AACvF;AAAA,MACF;AAEA,YAAM,cAAc,iBAAiB,gBAAgB,WAAW,aAAa,CAAC;AAC9E,YAAM,eAAe,gBAAgB,WAAW;AAEhD,YAAM,aAAa,MAAM,wBAAwBF,cAAaC,iBAAgB,EAAE;AAChF,UAAI,KAAK,EAAE,YAAY,SAAS,YAAY,CAAC;AAAA,IAC/C,SAAS,OAAO;AACd,cAAQ,MAAM,yCAAyC,KAAK;AAC5D,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,gCAAiC,MAAgB,OAAO,GAAG,CAAC;AAAA,IAC5F;AAAA,EACF,CAAC;AAED,SAAO,KAAK,wCAAwC,OAAO,KAAc,QAAkB;AACzF,QAAI;AACF,UAAI,CAACA,iBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uDAAuD,CAAC;AACtF;AAAA,MACF;AACA,YAAM,KAAK,SAAS,IAAI,OAAO,EAAE;AACjC,YAAM,WAAW,MAAM,sBAAsBD,cAAaC,iBAAgB,EAAE;AAC5E,UAAI,CAAC,UAAU;AACb,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,eAAe,EAAE,cAAc,CAAC;AAC9D;AAAA,MACF;AACA,YAAM,cAAcC,UAAQ,SAAS,eAAe,YAAY;AAChE,YAAM,iBAAiB,MAAM,oBAAoB,WAAW;AAC5D,UAAI,CAAC,gBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,wBAAwB,CAAC;AACvD;AAAA,MACF;AACA,YAAM,EAAE,OAAO,KAAK,IAAI,IAAI,QAAQ,CAAC;AACrC,UAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,CAAC,KAAK,KAAK,GAAG;AACrD,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,mBAAmB,CAAC;AAClD;AAAA,MACF;AACA,YAAM,SAAS,aAAa,cAAc;AAC1C,YAAM,cAAc;AAAA,QAClB;AAAA,QACA;AAAA,QACA,OAAO,eAAe;AAAA,QACtB,SAAS,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI,WAAW,OAAO,eAAe,CAAC;AAAA,QACtG;AAAA,QACA;AAAA,MACF;AACA,YAAM,eAAe,aAAa,WAAW;AAC7C,YAAM,aAAa,MAAM,wBAAwBF,cAAaC,iBAAgB,EAAE;AAChF,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,YAAY,SAAS,YAAY,CAAC;AAAA,IAC3D,SAAS,OAAO;AACd,cAAQ,MAAM,6CAA6C,KAAK;AAChE,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,mCAAoC,MAAgB,OAAO,GAAG,CAAC;AAAA,IAC/F;AAAA,EACF,CAAC;AAED,SAAO,KAAK,gDAAgD,OAAO,KAAc,QAAkB;AACjG,QAAI;AACF,UAAI,CAACA,iBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uDAAuD,CAAC;AACtF;AAAA,MACF;AACA,YAAM,KAAK,SAAS,IAAI,OAAO,EAAE;AACjC,YAAM,WAAW,MAAM,sBAAsBD,cAAaC,iBAAgB,EAAE;AAC5E,UAAI,CAAC,UAAU;AACb,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,eAAe,EAAE,cAAc,CAAC;AAC9D;AAAA,MACF;AACA,YAAM,eAAeC,UAAQ,SAAS,eAAe,oBAAoB;AACzE,YAAM,iBAAiB,MAAM,oBAAoB,YAAY;AAC7D,UAAI,CAAC,gBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,4BAA4B,CAAC;AAC3D;AAAA,MACF;AACA,YAAM,EAAE,OAAO,KAAK,IAAI,IAAI,QAAQ,CAAC;AACrC,UAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,CAAC,KAAK,KAAK,GAAG;AACrD,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,mBAAmB,CAAC;AAClD;AAAA,MACF;AACA,YAAM,SAAS,oBAAoB,cAAc;AACjD,YAAM,cAAc;AAAA,QAClB;AAAA,QACA;AAAA,QACA,OAAO,gBAAgB;AAAA,QACvB,SAAS,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI,YAAY,OAAO,gBAAgB,CAAC;AAAA,QACxG;AAAA,QACA;AAAA,MACF;AACA,YAAM,eAAe,cAAc,WAAW;AAC9C,YAAM,aAAa,MAAM,wBAAwBF,cAAaC,iBAAgB,EAAE;AAChF,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,YAAY,SAAS,YAAY,CAAC;AAAA,IAC3D,SAAS,OAAO;AACd,cAAQ,MAAM,8CAA8C,KAAK;AACjE,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,oCAAqC,MAAgB,OAAO,GAAG,CAAC;AAAA,IAChG;AAAA,EACF,CAAC;AAED,SAAO,KAAK,wCAAwC,OAAO,KAAc,QAAkB;AACzF,QAAI;AACF,UAAI,CAACA,iBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uDAAuD,CAAC;AACtF;AAAA,MACF;AACA,YAAM,KAAK,SAAS,IAAI,OAAO,EAAE;AACjC,YAAM,WAAW,MAAM,sBAAsBD,cAAaC,iBAAgB,EAAE;AAC5E,UAAI,CAAC,UAAU;AACb,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,eAAe,EAAE,cAAc,CAAC;AAC9D;AAAA,MACF;AACA,YAAM,iBAAiBC,UAAQ,SAAS,eAAe,eAAe;AACtE,UAAI,CAAE,MAAM,WAAW,cAAc,GAAI;AACvC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uBAAuB,CAAC;AACtD;AAAA,MACF;AACA,YAAM,EAAE,OAAO,IAAI,IAAI,QAAQ,CAAC;AAChC,YAAM,SAAS,MAAM,gBAAgB;AACrC,YAAM,gBAAgB,OAAO,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE;AACrD,UAAI,OAAO,WAAW,YAAY,CAAC,cAAc,SAAS,MAAM,GAAG;AACjE,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,mCAAmC,cAAc,KAAK,IAAI,CAAC,IAAI,CAAC;AAC9F;AAAA,MACF;AACA,UAAI,UAAU,MAAMH,WAAS,gBAAgB,OAAO;AACpD,gBAAU,iBAAiB,SAAS,UAAU,MAAM;AACpD,gBAAU,iBAAiB,SAAS,WAAW,aAAa,CAAC;AAC7D,UAAI,WAAW,WAAW;AACxB,kBAAU,iBAAiB,SAAS,iBAAiB,IAAI;AAAA,MAC3D;AACA,YAAM,eAAe,gBAAgB,OAAO;AAC5C,YAAM,aAAa,MAAM,wBAAwBC,cAAaC,iBAAgB,EAAE;AAChF,UAAI,KAAK,EAAE,WAAW,CAAC;AAAA,IACzB,SAAS,OAAO;AACd,cAAQ,MAAM,uCAAuC,KAAK;AAC1D,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,8BAA+B,MAAgB,OAAO,GAAG,CAAC;AAAA,IAC1F;AAAA,EACF,CAAC;AAED,SAAO,MAAM,mDAAmD,OAAO,KAAc,QAAkB;AACrG,QAAI;AACF,UAAI,CAACA,iBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uDAAuD,CAAC;AACtF;AAAA,MACF;AACA,YAAM,KAAK,SAAS,IAAI,OAAO,EAAE;AACjC,YAAM,WAAW,MAAM,sBAAsBD,cAAaC,iBAAgB,EAAE;AAC5E,UAAI,CAAC,UAAU;AACb,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,eAAe,EAAE,cAAc,CAAC;AAC9D;AAAA,MACF;AACA,YAAM,iBAAiBC,UAAQ,SAAS,eAAe,eAAe;AACtE,YAAM,iBAAiB,MAAM,oBAAoB,cAAc;AAC/D,UAAI,CAAC,gBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uBAAuB,CAAC;AACtD;AAAA,MACF;AACA,YAAM,EAAE,QAAQ,IAAI,IAAI,QAAQ,CAAC;AACjC,UAAI,OAAO,YAAY,WAAW;AAChC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,4BAA4B,CAAC;AAC3D;AAAA,MACF;AACA,YAAM,QAAQ,OAAO,SAAS,SAAS,IAAI,OAAO,KAAK,GAAG,EAAE;AAC5D,YAAM,SAAS,0BAA0B,gBAAgB,OAAO,OAAO;AACvE,UAAI,WAAW,QAAQ;AACrB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,OAAO,MAAM,CAAC;AAC5C;AAAA,MACF;AACA,YAAM,cAAc,iBAAiB,OAAO,SAAS,WAAW,aAAa,CAAC;AAC9E,YAAM,eAAe,gBAAgB,WAAW;AAChD,YAAM,aAAa,MAAM,wBAAwBF,cAAaC,iBAAgB,EAAE;AAChF,UAAI,KAAK,EAAE,YAAY,SAAS,YAAY,CAAC;AAAA,IAC/C,SAAS,OAAO;AACd,cAAQ,MAAM,mDAAmD,KAAK;AACtE,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,0CAA2C,MAAgB,OAAO,GAAG,CAAC;AAAA,IACtG;AAAA,EACF,CAAC;AAED,SAAO,KAAK,6CAA6C,OAAO,KAAc,QAAkB;AAC9F,QAAI;AACF,UAAI,CAACA,iBAAgB;AACnB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uDAAuD,CAAC;AACtF;AAAA,MACF;AACA,YAAM,KAAK,SAAS,IAAI,OAAO,EAAE;AACjC,YAAM,UAAU,SAAS,IAAI,OAAO,OAAO;AAC3C,YAAM,WAAW,MAAM,sBAAsBD,cAAaC,iBAAgB,EAAE;AAC5E,UAAI,CAAC,UAAU;AACb,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,eAAe,EAAE,cAAc,CAAC;AAC9D;AAAA,MACF;AAEA,YAAM,EAAE,OAAO,IAAI,IAAI,QAAQ,CAAC;AAChC,YAAM,mBAAmB,MAAM;AAAA,QAC7B,SAAS;AAAA,QACT;AAAA,QACA;AAAA,UACE,YAAY,SAAS;AAAA,UACrB,QAAQ,OAAO,WAAW,WAAW,SAAS;AAAA,QAChD;AAAA,MACF;AACA,UAAI,CAAC,iBAAiB,SAAS;AAC7B,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,SAAS,YAAY,iBAAiB,WAAW,CAAC;AACjG;AAAA,MACF;AAEA,YAAM,SAAS,SAAS,aACpB,MAAM,wBAAwBD,cAAaC,iBAAgB,EAAE,IAC7D,MAAM,oBAAoBD,cAAa,SAAS,aAAc,SAAS,cAAc;AACzF,UAAI,KAAK,EAAE,YAAY,QAAQ,UAAU,iBAAiB,YAAY,CAAC,EAAE,CAAC;AAAA,IAC5E,SAAS,OAAO;AACd,cAAQ,MAAM,8BAA8B,KAAK;AACjD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,yBAA0B,MAAgB,OAAO,GAAG,CAAC;AAAA,IACrF;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,aAAaG,QAAuB;AAC3C,SAAOA,OACJ,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,KAAK;AAChC;AAEA,eAAe,gBACb,eACA,eACA,KACA,KACA,cACe;AACf,QAAM,eAAeD,UAAQ,eAAe,aAAa;AACzD,QAAM,EAAE,MAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,QAAQ,CAAC;AACrD,MAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,CAAC,KAAK,KAAK,GAAG;AACrD,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,mBAAmB,CAAC;AAClD;AAAA,EACF;AACA,QAAM,cAA2B,QAAQ,CAAC,YAAY,QAAQ,UAAU,EAAE,SAAS,IAAI,IAAI,OAAO;AAClG,QAAM,YAAY,aAAa;AAC/B,QAAM,cAAe,OAAO,WAAW,YAAY,OAAO,KAAK,IAAK,OAAO,KAAK,IAAI;AAEpF,MAAI;AACJ,MAAI,eAAe;AACnB,MAAI,MAAM,WAAW,YAAY,GAAG;AAClC,qBAAiB,MAAMH,WAAS,cAAc,OAAO;AACrD,UAAM,aAAa,eAAe,MAAM,uBAAuB;AAC/D,QAAI,WAAY,gBAAe,SAAS,WAAW,CAAC,GAAG,EAAE;AAAA,EAC3D,OAAO;AACL,qBAAiB,eAAe,EAAE,YAAY,eAAe,UAAU,CAAC;AAAA,EAC1E;AAEA,QAAM,UAAmB;AAAA,IACvB,IAAI,WAAW,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,IAC7B;AAAA,IACA,QAAQ;AAAA,IACR,MAAM;AAAA,IACN;AAAA,IACA,SAAS,OAAO,YAAY,YAAY,QAAQ,KAAK,IAAI,QAAQ,KAAK,IAAI;AAAA,IAC1E,UAAU,gBAAgB,aAAa,QAAQ;AAAA,EACjD;AACA,QAAM,QAAQ,mBAAmB,OAAO;AACxC,MAAI,OAAO,iBAAiB,gBAAgB,cAAc,OAAO,eAAe,CAAC,CAAC;AAClF,SAAO,iBAAiB,MAAM,WAAW,IAAI,SAAS,GAAG;AACzD,MAAI,KAAK,SAAS,kBAAkB,GAAG;AACrC,WAAO,KAAK,QAAQ,oBAAoB,MAAM,QAAQ,CAAC;AAAA,EACzD,OAAO;AACL,WAAO,GAAG,KAAK,QAAQ,CAAC;AAAA;AAAA,EAAO,KAAK;AAAA,EACtC;AACA,QAAM,eAAe,cAAc,IAAI;AACvC,QAAM,aAAa,MAAM,aAAa;AACtC,MAAI,OAAO,GAAG,EAAE,KAAK,EAAE,YAAY,SAAS,EAAE,IAAI,QAAQ,GAAG,EAAE,CAAC;AAClE;AAEA,eAAe,wBACb,eACA,WACA,KACA,KACA,cACe;AACf,QAAM,eAAeG,UAAQ,eAAe,aAAa;AACzD,MAAI,CAAE,MAAM,WAAW,YAAY,GAAI;AACrC,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,0BAA0B,CAAC;AACzD;AAAA,EACF;AACA,QAAM,EAAE,UAAU,QAAQ,IAAI,IAAI,QAAQ,CAAC;AAC3C,MAAI,OAAO,YAAY,WAAW;AAChC,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iCAAiC,CAAC;AAChE;AAAA,EACF;AACA,QAAM,UAAU,MAAMH,WAAS,cAAc,OAAO;AACpD,QAAM,SAAS,cAAc,OAAO;AACpC,QAAM,SAAS,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS;AAC5D,MAAI,CAAC,QAAQ;AACX,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,WAAW,SAAS,aAAa,CAAC;AAChE;AAAA,EACF;AACA,MAAI,OAAO,SAAS,YAAY;AAC9B,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iCAAiC,CAAC;AAChE;AAAA,EACF;AACA,QAAM,kBAAkB,IAAI;AAAA,IAC1B,QAAQ,UAAU,QAAQ,uBAAuB,MAAM,CAAC;AAAA,IACxD;AAAA,EACF;AACA,QAAM,OAAO,QAAQ,QAAQ,iBAAiB,CAAC,IAAI,aAAa,GAAG,QAAQ,iBAAiB,UAAU,SAAS,OAAO,EAAE;AACxH,MAAI,SAAS,SAAS;AACpB,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iCAAiC,CAAC;AAChE;AAAA,EACF;AACA,QAAM,cAAc,iBAAiB,MAAM,WAAW,IAAI,aAAa,CAAC,GAAG;AAC3E,QAAM,eAAe,cAAc,WAAW;AAC9C,QAAM,aAAa,MAAM,aAAa;AACtC,MAAI,KAAK,EAAE,WAAW,CAAC;AACzB;;;AE3nDA;AASA;AAVA,SAAS,UAAAK,eAAc;AAgBhB,SAAS,oBACdC,aACAC,cACAC,iBACQ;AACR,QAAM,SAASH,QAAO;AAGtB,SAAO,IAAI,KAAK,OAAO,MAAM,QAAQ;AACnC,QAAI;AACF,YAAM,SAAS,MAAM,gBAAgBC,aAAYC,cAAa,EAAE,gBAAAC,gBAAe,CAAC;AAChF,UAAI,KAAK,MAAM;AAAA,IACjB,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,cAAc,CAAC;AAAA,IACxF;AAAA,EACF,CAAC;AAGD,SAAO,IAAI,UAAU,OAAO,KAAK,QAAQ;AACvC,QAAI;AACF,YAAM,UAAU,MAAM,kBAAkBF,aAAYC,cAAa,IAAI,OAAO,MAAM,EAAE,gBAAAC,gBAAe,CAAC;AACpG,UAAI,CAAC,SAAS;AACZ,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,oBAAoB,CAAC;AACnD;AAAA,MACF;AACA,UAAI,KAAK,OAAO;AAAA,IAClB,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,cAAc,CAAC;AAAA,IACxF;AAAA,EACF,CAAC;AAGD,SAAO,KAAK,KAAK,OAAO,KAAK,QAAQ;AACnC,QAAI;AACF,YAAM,EAAE,KAAK,IAAI,IAAI;AACrB,UAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,mBAAmB,CAAC;AAClD;AAAA,MACF;AACA,YAAM,YAAY,oBAAoB,IAAI;AAC1C,YAAM,WAAW,MAAM,gBAAgBF,aAAY,SAAS;AAC5D,UAAI,UAAU;AACZ,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,YAAY,SAAS,uBAAuB,CAAC;AAC3E;AAAA,MACF;AACA,YAAM,gBAAgBA,aAAY,IAAI;AACtC,qBAAe;AACf,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAAA,IAC1C,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,sBAAsB,CAAC;AAAA,IAChG;AAAA,EACF,CAAC;AAGD,SAAO,OAAO,UAAU,OAAO,KAAK,QAAQ;AAC1C,QAAI;AACF,YAAM,OAAO,MAAM,gBAAgBA,aAAY,IAAI,OAAO,IAAI;AAC9D,UAAI,CAAC,MAAM;AACT,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,oBAAoB,CAAC;AACnD;AAAA,MACF;AACA,YAAM,cAAcA,aAAY,IAAI,OAAO,IAAI;AAC/C,qBAAe;AACf,UAAI,KAAK,EAAE,SAAS,IAAI,OAAO,KAAK,CAAC;AAAA,IACvC,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,iBAAiB,CAAC;AAAA,IAC3F;AAAA,EACF,CAAC;AAGD,SAAO,KAAK,YAAY,OAAO,MAAM,QAAQ;AAC3C,QAAI;AACF,YAAM,QAAQ,MAAM,iBAAiBA,WAAU;AAC/C,iBAAW,QAAQ,OAAO;AACxB,cAAM,oBAAoBA,aAAY,IAAI;AAAA,MAC5C;AACA,qBAAe;AACf,YAAM,SAAS,MAAM,gBAAgBA,aAAYC,cAAa,EAAE,aAAa,MAAM,gBAAAC,gBAAe,CAAC;AACnG,UAAI,KAAK,MAAM;AAAA,IACjB,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,iBAAiB,CAAC;AAAA,IAC3F;AAAA,EACF,CAAC;AAGD,SAAO,KAAK,kBAAkB,OAAO,KAAK,QAAQ;AAChD,QAAI;AACF,YAAM,OAAO,MAAM,gBAAgBF,aAAY,IAAI,OAAO,IAAI;AAC9D,UAAI,CAAC,MAAM;AACT,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,oBAAoB,CAAC;AACnD;AAAA,MACF;AACA,YAAM,oBAAoBA,aAAY,IAAI,OAAO,IAAI;AACrD,qBAAe;AACf,YAAM,UAAU,MAAM,kBAAkBA,aAAYC,cAAa,IAAI,OAAO,MAAM,EAAE,gBAAAC,gBAAe,CAAC;AACpG,UAAI,KAAK,OAAO;AAAA,IAClB,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,iBAAiB,CAAC;AAAA,IAC3F;AAAA,EACF,CAAC;AAGD,SAAO,MAAM,mDAAmD,OAAO,KAAK,QAAQ;AAClF,QAAI;AACF,YAAM,EAAE,MAAM,aAAa,UAAU,IAAI,IAAI;AAC7C,YAAM,OAAO,MAAM,gBAAgBF,aAAY,IAAI;AACnD,UAAI,CAAC,MAAM;AACT,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,oBAAoB,CAAC;AACnD;AAAA,MACF;AACA,YAAM,OAAO,IAAI;AACjB,UAAI,SAAS,QAAS,QAAQ,KAAK,WAAW,KAAK,YAAa;AAC9D,cAAM;AAAA,UACJA;AAAA,UACA;AAAA,UACA,SAAS,aAAa,EAAE;AAAA,UACxB,SAAS,WAAW,EAAE;AAAA,UACtB;AAAA,QACF;AACA,uBAAe;AACf,YAAI,KAAK,EAAE,SAAS,KAAK,CAAC;AAAA,MAC5B,OAAO;AACL,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,+CAA+C,CAAC;AAAA,MAChF;AAAA,IACF,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,gBAAgB,CAAC;AAAA,IAC1F;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AClJA,SAAS,UAAAG,eAAc;AACvB,SAAS,WAAAC,iBAAe;AAUxB;AAIO,SAAS,0BACdC,cACA,WACAC,iBACQ;AACR,QAAM,SAASC,QAAO;AAGtB,SAAO,IAAI,KAAK,OAAO,MAAM,QAAQ;AACnC,QAAI;AACF,YAAM,wBAAwBF,cAAaC,eAAc;AACzD,YAAM,WAAW,MAAM,gBAAgBD,YAAW;AAClD,UAAI,KAAK,EAAE,UAAU,cAAa,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAAA,IAC9D,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,0BAA0B,CAAC;AAAA,IACpG;AAAA,EACF,CAAC;AAGD,SAAO,IAAI,iBAAiB,OAAO,KAAK,QAAQ;AAC9C,QAAI;AACF,YAAM,EAAE,YAAY,IAAI,IAAI;AAC5B,YAAM,aAAa,IAAI,MAAM;AAC7B,YAAM,aAAaG,UAAQH,cAAa,WAAW;AACnD,UAAI,CAAE,MAAM,WAAW,UAAU,GAAI;AACnC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,YAAY,WAAW,cAAc,CAAC;AACpE;AAAA,MACF;AACA,YAAM,wBAAwBA,cAAaC,eAAc;AACzD,YAAM,WAAW,MAAM,oBAAoBD,cAAa,aAAa,UAAU;AAC/E,UAAI,KAAK,EAAE,UAAU,cAAa,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAAA,IAC9D,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,0BAA0B,CAAC;AAAA,IACpG;AAAA,EACF,CAAC;AAGD,SAAO,KAAK,KAAK,OAAO,KAAK,QAAQ;AACnC,QAAI;AACF,YAAM,EAAE,aAAa,gBAAgB,OAAO,WAAW,MAAM,aAAa,eAAe,IACvF,IAAI;AAEN,UAAI,CAAC,OAAO;AACV,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,oBAAoB,CAAC;AACnD;AAAA,MACF;AAEA,UAAI,CAAC,WAAW;AACd,YAAI,OAAO,GAAG,EAAE,KAAK;AAAA,UACnB,OACE;AAAA,QACJ,CAAC;AACD;AAAA,MACF;AAEA,UAAI,aAAa;AACf,cAAM,aAAaG,UAAQH,cAAa,WAAW;AACnD,YAAI,CAAE,MAAM,WAAW,UAAU,GAAI;AACnC,cAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,YAAY,WAAW,cAAc,CAAC;AACpE;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAU;AAAA,QACd,aAAa,eAAe;AAAA,QAC5B,gBAAgB,kBAAkB;AAAA,QAClC;AAAA,QACA;AAAA,QACA,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,QAChC,QAAQ;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,aAAa,eAAe;AAAA,QAC5B,gBAAgB,kBAAkB;AAAA,MACpC;AAEA,YAAM,cAAc,IAAI,OAAO;AAC/B,kBAAY,EAAE,MAAM,0BAA0B,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AACnF,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC;AAAA,IACpC,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,sBAAsB,CAAC;AAAA,IAChG;AAAA,EACF,CAAC;AAGD,SAAO,MAAM,sBAAsB,OAAO,KAAK,QAAQ;AACrD,QAAI;AACF,YAAM,EAAE,UAAU,IAAI,IAAI;AAC1B,YAAM,EAAE,OAAO,IAAI,IAAI;AAEvB,UAAI,CAAC,QAAQ;AACX,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,qBAAqB,CAAC;AACpD;AAAA,MACF;AAEA,UAAI,CAAC,CAAC,UAAU,aAAa,SAAS,EAAE,SAAS,MAAM,GAAG;AACxD,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,+CAA+C,CAAC;AAC9E;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,oBAAoB,IAAI,WAAW,MAAM;AAC/D,UAAI,CAAC,SAAS;AACZ,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,YAAY,SAAS,cAAc,CAAC;AAClE;AAAA,MACF;AAEA,kBAAY,EAAE,MAAM,0BAA0B,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AACnF,UAAI,KAAK,EAAE,SAAS,KAAK,CAAC;AAAA,IAC5B,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,gBAAgB,CAAC;AAAA,IAC1F;AAAA,EACF,CAAC;AAGD,SAAO,OAAO,KAAK,OAAO,KAAK,QAAQ;AACrC,QAAI;AACF,YAAM,EAAE,WAAW,IAAI,IAAI;AAE3B,UAAI,CAAC,MAAM,QAAQ,UAAU,KAAK,WAAW,WAAW,GAAG;AACzD,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uCAAuC,CAAC;AACtE;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,eAAe,UAAU;AAC/C,kBAAY,EAAE,MAAM,0BAA0B,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AACnF,UAAI,KAAK,EAAE,QAAQ,CAAC;AAAA,IACtB,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,gBAAgB,CAAC;AAAA,IAC1F;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AC/IA;AACA;AAJA,SAAS,UAAAI,eAAc;AACvB,SAAS,WAAAC,iBAAe;AACxB,SAAS,YAAAC,YAAU,UAAAC,eAAc;AAIjC;AACA;AAIO,SAAS,sBAAsBC,eAA8B;AAClE,QAAM,SAASC,QAAO;AAGtB,SAAO,IAAI,KAAK,OAAO,MAAM,QAAQ;AACnC,QAAI;AACF,YAAM,YAAY,MAAM,cAAcD,aAAY;AAClD,UAAI,KAAK,EAAE,WAAW,cAAa,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAAA,IAC/D,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,2BAA2B,CAAC;AAAA,IACrG;AAAA,EACF,CAAC;AAGD,SAAO,IAAI,iBAAiB,OAAO,MAAM,QAAQ;AAC/C,QAAI;AACF,YAAM,UAAU,eAAe;AAAA,QAC7B,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,QACb,WAAW,aAAa;AAAA,MAC1B,CAAC;AACD,UAAI,KAAK,EAAE,QAAQ,CAAC;AAAA,IACtB,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,yBAAyB,CAAC;AAAA,IACnG;AAAA,EACF,CAAC;AAGD,SAAO,IAAI,UAAU,OAAO,KAAK,QAAQ;AACvC,QAAI;AACF,YAAM,SAAS,MAAM,kBAAkBA,eAAc,IAAI,OAAO,IAAI;AACpE,UAAI,CAAC,QAAQ;AACX,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,aAAa,IAAI,OAAO,IAAI,cAAc,CAAC;AACzE;AAAA,MACF;AACA,UAAI,KAAK,MAAM;AAAA,IACjB,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,yBAAyB,CAAC;AAAA,IACnG;AAAA,EACF,CAAC;AAGD,SAAO,IAAI,eAAe,OAAO,KAAK,QAAQ;AAC5C,QAAI;AACF,YAAM,WAAWE,UAAQF,eAAc,GAAG,IAAI,OAAO,IAAI,KAAK;AAC9D,UAAI,CAAE,MAAM,WAAW,QAAQ,GAAI;AACjC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,aAAa,IAAI,OAAO,IAAI,cAAc,CAAC;AACzE;AAAA,MACF;AACA,YAAM,UAAU,MAAMG,WAAS,UAAU,OAAO;AAChD,UAAI,KAAK;AAAA,QACP,cAAc;AAAA,QACd,OAAO,kBAAkB,IAAI,OAAO,IAAI;AAAA,QACxC;AAAA,QACA,MAAM,IAAI,OAAO;AAAA,MACnB,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,qCAAqC,CAAC;AAAA,IAC/G;AAAA,EACF,CAAC;AAGD,SAAO,KAAK,KAAK,OAAO,KAAK,QAAQ;AACnC,QAAI;AACF,YAAM,EAAE,QAAQ,IAAI,IAAI;AACxB,UAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,sBAAsB,CAAC;AACrD;AAAA,MACF;AAEA,YAAM,SAAS,cAAc,OAAO;AACpC,YAAM,OAAO,OAAO;AACpB,UAAI,CAAC,QAAQ,CAAC,YAAY,IAAI,GAAG;AAC/B,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,6BAA6B,IAAI,IAAI,CAAC;AACpE;AAAA,MACF;AAEA,YAAM,UAAUH,aAAY;AAC5B,YAAM,WAAWE,UAAQF,eAAc,GAAG,IAAI,KAAK;AACnD,UAAI,MAAM,WAAW,QAAQ,GAAG;AAC9B,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,aAAa,IAAI,mBAAmB,CAAC;AACnE;AAAA,MACF;AAEA,YAAM,eAAe,UAAU,OAAO;AACtC,YAAM,wBAAwBA,aAAY;AAC1C,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,MAAM,MAAM,SAAS,CAAC;AAAA,IAC/C,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,4BAA4B,CAAC;AAAA,IACtG;AAAA,EACF,CAAC;AAGD,SAAO,IAAI,UAAU,OAAO,KAAK,QAAQ;AACvC,QAAI;AACF,YAAM,EAAE,QAAQ,IAAI,IAAI;AACxB,UAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,sBAAsB,CAAC;AACrD;AAAA,MACF;AAEA,YAAM,WAAWE,UAAQF,eAAc,GAAG,IAAI,OAAO,IAAI,KAAK;AAC9D,UAAI,CAAE,MAAM,WAAW,QAAQ,GAAI;AACjC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,aAAa,IAAI,OAAO,IAAI,cAAc,CAAC;AACzE;AAAA,MACF;AAEA,YAAM,eAAe,UAAU,OAAO;AACtC,YAAM,wBAAwBA,aAAY;AAC1C,UAAI,KAAK,EAAE,MAAM,IAAI,OAAO,MAAM,MAAM,SAAS,CAAC;AAAA,IACpD,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,4BAA4B,CAAC;AAAA,IACtG;AAAA,EACF,CAAC;AAGD,SAAO,OAAO,UAAU,OAAO,KAAK,QAAQ;AAC1C,QAAI;AACF,UAAI,IAAI,OAAO,SAAS,YAAY;AAClC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,0CAA0C,CAAC;AACzE;AAAA,MACF;AAEA,YAAM,WAAWE,UAAQF,eAAc,GAAG,IAAI,OAAO,IAAI,KAAK;AAC9D,UAAI,CAAE,MAAM,WAAW,QAAQ,GAAI;AACjC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,aAAa,IAAI,OAAO,IAAI,cAAc,CAAC;AACzE;AAAA,MACF;AAEA,YAAMI,QAAO,QAAQ;AACrB,YAAM,wBAAwBJ,aAAY;AAC1C,UAAI,KAAK,EAAE,SAAS,IAAI,OAAO,KAAK,CAAC;AAAA,IACvC,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,4BAA4B,CAAC;AAAA,IACtG;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;ARxHA;;;AS5BAK;AAQA;AAVA,SAAS,UAAAC,eAA8D;AACvE,SAAS,WAAAC,gBAAe;AAaxB,IAAM,kBAAkB;AAExB,SAAS,kBAAkB,OAA8C;AACvE,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,CAAC,KAAK;AAAA,EACrB;AACA,SAAO,SAAS;AAClB;AAGA,IAAM,aAAa,oBAAI,IAA2B;AAClD,SAAS,SAAY,WAAmB,IAAkC;AACxE,QAAM,OAAO,WAAW,IAAI,SAAS,KAAK,QAAQ,QAAQ;AAC1D,QAAM,OAAO,KAAK,KAAK,EAAE;AACzB,aAAW,IAAI,WAAW,KAAK,KAAK,MAAM;AAAA,EAAC,GAAG,MAAM;AAAA,EAAC,CAAC,CAAC;AACvD,SAAO;AACT;AAEO,SAAS,kBACdC,WACA,WACQ;AACR,QAAM,SAASF,QAAO;AAEtB,WAAS,kBAAwB;AAC/B,cAAU,EAAE,MAAM,iBAAiB,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAAA,EAC1E;AAGA,WAAS,kBAAkB,KAAc,KAAe,MAA0B;AAChF,UAAM,YAAY,kBAAkB,IAAI,OAAO,SAAS;AACxD,QAAI,aAAa,CAAC,gBAAgB,KAAK,SAAS,GAAG;AACjD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,4BAA4B,SAAS,+DAA+D,CAAC;AACnI;AAAA,IACF;AACA,SAAK;AAAA,EACP;AAGA,SAAO,MAAM,aAAa,iBAAwB;AAGlD,SAAO,IAAI,KAAK,OAAO,MAAM,QAAQ;AACnC,QAAI;AACF,YAAM,UAAUE,SAAQ;AACxB,YAAM,QAAQ,MAAMD,SAAQC,SAAQ,EAAE,MAAM,MAAM,CAAC,CAAC;AACpD,YAAM,aAKD,CAAC;AAEN,iBAAW,QAAQ,OAAO;AACxB,YAAI,OAAO,SAAS,SAAU;AAC9B,YAAI,CAAC,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,SAAS,EAAG;AACvD,cAAM,YAAY,KAAK,QAAQ,OAAO,EAAE;AACxC,cAAM,YAAY,MAAM,cAAcA,WAAU,SAAS;AACzD,mBAAW,KAAK;AAAA,UACd,WAAW,UAAU;AAAA,UACrB,iBAAiB,UAAU;AAAA,UAC3B,OAAO,UAAU;AAAA,UACjB,QAAQ,cAAc,UAAU,KAAK;AAAA,QACvC,CAAC;AAAA,MACH;AAEA,UAAI,KAAK,EAAE,WAAW,CAAC;AAAA,IACzB,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,uBAAuB,CAAC;AAAA,IACjG;AAAA,EACF,CAAC;AAGD,SAAO,IAAI,eAAe,OAAO,KAAK,QAAQ;AAC5C,QAAI;AACF,YAAM,YAAY,kBAAkB,IAAI,OAAO,SAAS;AACxD,YAAM,YAAY,MAAM,cAAcA,WAAU,SAAS;AACzD,UAAI,KAAK;AAAA,QACP,WAAW,UAAU;AAAA,QACrB,iBAAiB,UAAU;AAAA,QAC3B,OAAO,UAAU;AAAA,QACjB,QAAQ,cAAc,UAAU,KAAK;AAAA,MACvC,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,sBAAsB,CAAC;AAAA,IAChG;AAAA,EACF,CAAC;AAGD,SAAO,KAAK,eAAe,OAAO,KAAK,QAAQ;AAC7C,QAAI;AACF,YAAM,YAAY,kBAAkB,IAAI,OAAO,SAAS;AACxD,YAAM,EAAE,aAAa,KAAK,IAAI,IAAI;AAClC,UAAI,CAAC,eAAe,OAAO,gBAAgB,UAAU;AACnD,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,0BAA0B,CAAC;AACzD;AAAA,MACF;AAEA,YAAM,OAAO,MAAM,SAAS,WAAW,YAAY;AACjD,cAAM,YAAY,MAAM,cAAcA,WAAU,SAAS;AACzD,cAAM,cAAc,IAAI,IAAI,UAAU,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC5D,cAAM,KAAK,iBAAiB,WAAW;AAEvC,cAAM,UAAoB;AAAA,UACxB;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,MAAM,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC;AAAA,UACpC,SAAS;AAAA,QACX;AACA,kBAAU,MAAM,KAAK,OAAO;AAC5B,cAAM,eAAeA,WAAU,SAAS;AACxC,eAAO;AAAA,MACT,CAAC;AACD,sBAAgB;AAChB,UAAI,OAAO,GAAG,EAAE,KAAK,IAAI;AAAA,IAC3B,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,qBAAqB,CAAC;AAAA,IAC/F;AAAA,EACF,CAAC;AAID,SAAO,KAAK,uBAAuB,OAAO,KAAK,QAAQ;AACrD,QAAI;AACF,YAAM,YAAY,kBAAkB,IAAI,OAAO,SAAS;AACxD,YAAM,EAAE,IAAI,IAAI,IAAI;AACpB,UAAI,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,MAAM,CAAC,OAAgB,OAAO,OAAO,QAAQ,GAAG;AAC9E,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,kCAAkC,CAAC;AACjE;AAAA,MACF;AAEA,YAAM,QAAQ,MAAM,SAAS,WAAW,YAAY;AAClD,cAAM,YAAY,MAAM,cAAcA,WAAU,SAAS;AACzD,cAAM,UAAU,IAAI,IAAI,UAAU,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAG7D,cAAM,YAAwB,CAAC;AAC/B,mBAAW,MAAM,KAAK;AACpB,gBAAM,OAAO,QAAQ,IAAI,EAAE;AAC3B,cAAI,MAAM;AACR,sBAAU,KAAK,IAAI;AACnB,oBAAQ,OAAO,EAAE;AAAA,UACnB;AAAA,QACF;AAEA,mBAAW,QAAQ,QAAQ,OAAO,GAAG;AACnC,oBAAU,KAAK,IAAI;AAAA,QACrB;AAEA,kBAAU,QAAQ;AAClB,cAAM,eAAeA,WAAU,SAAS;AACxC,eAAO;AAAA,MACT,CAAC;AACD,sBAAgB;AAChB,UAAI,KAAK,EAAE,MAAM,CAAC;AAAA,IACpB,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,0BAA0B,CAAC;AAAA,IACpG;AAAA,EACF,CAAC;AAID,SAAO,IAAI,mBAAmB,OAAO,KAAK,QAAQ;AAChD,QAAI;AACF,YAAM,MAAM,MAAM,QAAQA,WAAU,kBAAkB,IAAI,OAAO,SAAS,CAAC;AAC3E,UAAI,KAAK,GAAG;AAAA,IACd,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,oBAAoB,CAAC;AAAA,IAC9F;AAAA,EACF,CAAC;AAGD,SAAO,KAAK,uBAAuB,OAAO,KAAK,QAAQ;AACrD,QAAI;AAEF,YAAM,EAAE,aAAAC,aAAY,IAAI,MAAM;AAC9B,YAAM,EAAE,SAAAC,UAAQ,IAAI,MAAM,OAAO,MAAW;AAC5C,YAAM,EAAE,UAAAC,WAAS,IAAI,MAAM,OAAO,aAAkB;AACpD,YAAM,EAAE,gBAAAC,gBAAe,IAAI,MAAM;AAEjC,YAAM,YAAY,kBAAkB,IAAI,OAAO,SAAS;AACxD,YAAM,YAAY,MAAM,cAAcJ,WAAU,SAAS;AACzD,YAAM,MAAM,MAAM,QAAQA,WAAU,SAAS;AAE7C,YAAM,eAAe,IAAI;AAAA,QACvB,UAAU,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,MACzE;AAEA,UAAI,aAAa,SAAS,GAAG;AAC3B,YAAI,KAAK,EAAE,UAAU,GAAG,SAAS,gCAAgC,CAAC;AAClE;AAAA,MACF;AAEA,YAAM,YAAY,IAAI,QAAQ;AAAA,QAAO,CAAC,MACpC,EAAE,QAAQ,MAAM,CAAC,OAAO,aAAa,IAAI,EAAE,CAAC;AAAA,MAC9C;AAEA,YAAM,WAAWC,aAAYD,WAAU,WAAW,UAAU,eAAe;AAC3E,YAAM,UAAUE,UAAQF,WAAU,SAAS,CAAC;AAC5C,UAAI,cAAc;AAClB,UAAI,MAAM,WAAW,QAAQ,GAAG;AAC9B,sBAAc,MAAMG,WAAS,UAAU,OAAO;AAC9C,sBAAc,YAAY,QAAQ,IAAI;AAAA,MACxC,OAAO;AACL,sBAAc;AAAA,aAAmB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAC5C;AAEA,YAAM,iBAAiB,UAAU,MAAM,OAAO,CAAC,MAAM,aAAa,IAAI,EAAE,EAAE,CAAC;AAC3E,iBAAW,QAAQ,gBAAgB;AACjC,uBAAe,SAAS,KAAK,WAAW,IAAI,KAAK,KAAK,IAAI,CAAC,MAAc,IAAI,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,OAAO,KAAK,EAAE;AAAA;AAAA,MAC3G;AACA,qBAAe;AACf,iBAAW,SAAS,WAAW;AAC7B,uBAAe,OAAO,MAAM,SAAS,WAAM,MAAM,QAAQ,IAAI,CAAC,MAAc,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAChG,YAAI,MAAM,MAAO,gBAAe,cAAc,MAAM,KAAK;AAAA;AACzD,YAAI,MAAM,QAAS,gBAAe,gBAAgB,MAAM,OAAO;AAAA;AAC/D,YAAI,MAAM,OAAQ,gBAAe,eAAe,MAAM,MAAM;AAAA;AAC5D,YAAI,MAAM,QAAS,gBAAe,gBAAgB,MAAM,OAAO;AAAA;AAC/D,YAAI,MAAM,SAAU,gBAAe,iBAAiB,MAAM,QAAQ;AAAA;AAClE,uBAAe;AAAA,MACjB;AACA,YAAMC,gBAAe,UAAU,WAAW;AAE1C,gBAAU,QAAQ,UAAU,MAAM,OAAO,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC;AACvE,YAAM,eAAeJ,WAAU,SAAS;AAExC,sBAAgB;AAChB,UAAI,KAAK,EAAE,UAAU,aAAa,MAAM,YAAY,UAAU,OAAO,CAAC;AAAA,IACxE,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,oBAAoB,CAAC;AAAA,IAC9F;AAAA,EACF,CAAC;AAGD,SAAO,IAAI,uBAAuB,OAAO,KAAK,QAAQ;AACpD,QAAI;AACF,YAAM,MAAM,MAAM,QAAQA,WAAU,kBAAkB,IAAI,OAAO,SAAS,CAAC;AAC3E,YAAM,UAAU,IAAI,QAAQ,OAAO,CAAC,MAAM,EAAE,QAAQ,SAAS,IAAI,OAAO,EAAE,CAAC;AAC3E,UAAI,KAAK,EAAE,WAAW,IAAI,WAAW,QAAQ,CAAC;AAAA,IAChD,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,oBAAoB,CAAC;AAAA,IAC9F;AAAA,EACF,CAAC;AAGD,SAAO,IAAI,mBAAmB,OAAO,KAAK,QAAQ;AAChD,QAAI;AACF,YAAM,YAAY,kBAAkB,IAAI,OAAO,SAAS;AACxD,YAAM,YAAY,MAAM,cAAcA,WAAU,SAAS;AACzD,YAAM,OAAO,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,OAAO,EAAE;AAC/D,UAAI,CAAC,MAAM;AACT,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,SAAS,IAAI,OAAO,EAAE,cAAc,CAAC;AACnE;AAAA,MACF;AACA,YAAM,MAAM,MAAM,QAAQA,WAAU,SAAS;AAC7C,YAAM,aAAa,IAAI,QAAQ,OAAO,CAAC,MAAM,EAAE,QAAQ,SAAS,IAAI,OAAO,EAAE,CAAC;AAC9E,UAAI,KAAK,EAAE,GAAG,MAAM,KAAK,WAAW,CAAC;AAAA,IACvC,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,qBAAqB,CAAC;AAAA,IAC/F;AAAA,EACF,CAAC;AAGD,SAAO,MAAM,mBAAmB,OAAO,KAAK,QAAQ;AAClD,QAAI;AACF,YAAM,YAAY,kBAAkB,IAAI,OAAO,SAAS;AACxD,YAAM,SAAS,MAAM,SAAS,WAAW,YAAY;AACnD,cAAM,YAAY,MAAM,cAAcA,WAAU,SAAS;AACzD,cAAM,OAAO,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,OAAO,EAAE;AAC/D,YAAI,CAAC,KAAM,QAAO;AAClB,YAAI,IAAI,KAAK,gBAAgB,OAAW,MAAK,cAAc,IAAI,KAAK;AACpE,YAAI,MAAM,QAAQ,IAAI,KAAK,IAAI,EAAG,MAAK,OAAO,IAAI,KAAK;AACvD,cAAM,eAAeA,WAAU,SAAS;AACxC,eAAO,EAAE,GAAG,KAAK;AAAA,MACnB,CAAC;AACD,UAAI,CAAC,QAAQ;AAAE,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,SAAS,IAAI,OAAO,EAAE,cAAc,CAAC;AAAG;AAAA,MAAQ;AAC7F,sBAAgB;AAChB,UAAI,KAAK,MAAM;AAAA,IACjB,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,wBAAwB,CAAC;AAAA,IAClG;AAAA,EACF,CAAC;AAGD,SAAO,OAAO,mBAAmB,OAAO,KAAK,QAAQ;AACnD,QAAI;AACF,YAAM,YAAY,kBAAkB,IAAI,OAAO,SAAS;AACxD,YAAM,UAAU,MAAM,SAAS,WAAW,YAAY;AACpD,cAAM,YAAY,MAAM,cAAcA,WAAU,SAAS;AACzD,cAAM,MAAM,UAAU,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,IAAI,OAAO,EAAE;AACnE,YAAI,QAAQ,GAAI,QAAO;AACvB,kBAAU,MAAM,OAAO,KAAK,CAAC;AAC7B,cAAM,eAAeA,WAAU,SAAS;AACxC,eAAO;AAAA,MACT,CAAC;AACD,UAAI,CAAC,SAAS;AAAE,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,SAAS,IAAI,OAAO,EAAE,cAAc,CAAC;AAAG;AAAA,MAAQ;AAC9F,sBAAgB;AAChB,UAAI,KAAK,EAAE,SAAS,IAAI,OAAO,GAAG,CAAC;AAAA,IACrC,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,wBAAwB,CAAC;AAAA,IAClG;AAAA,EACF,CAAC;AAGD,SAAO,KAAK,yBAAyB,OAAO,KAAK,QAAQ;AACvD,QAAI;AACF,YAAM,YAAY,kBAAkB,IAAI,OAAO,SAAS;AACxD,YAAM,SAAS,MAAM,SAAS,WAAW,YAAY;AACnD,cAAM,YAAY,MAAM,cAAcA,WAAU,SAAS;AACzD,cAAM,OAAO,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,OAAO,EAAE;AAC/D,YAAI,CAAC,KAAM,QAAO,EAAE,OAAO,YAAqB;AAChD,YAAI,KAAK,WAAW,cAAe,QAAO,EAAE,OAAO,YAAqB,SAAS,KAAK,QAAQ;AAC9F,aAAK,SAAS;AACd,aAAK,UAAU,IAAI,KAAK,WAAW;AACnC,cAAM,eAAeA,WAAU,SAAS;AACxC,eAAO,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE;AAAA,MAC7B,CAAC;AACD,UAAI,WAAW,QAAQ;AACrB,YAAI,OAAO,UAAU,aAAa;AAAE,cAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,SAAS,IAAI,OAAO,EAAE,cAAc,CAAC;AAAG;AAAA,QAAQ;AAClH,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,yCAAyC,OAAO,OAAO,IAAI,CAAC;AAAG;AAAA,MAC/F;AACA,sBAAgB;AAChB,UAAI,KAAK,OAAO,IAAI;AAAA,IACtB,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,uBAAuB,CAAC;AAAA,IACjG;AAAA,EACF,CAAC;AAGD,SAAO,KAAK,4BAA4B,OAAO,KAAK,QAAQ;AAC1D,QAAI;AACF,YAAM,YAAY,kBAAkB,IAAI,OAAO,SAAS;AACxD,YAAM,SAAS,MAAM,SAAS,WAAW,YAAY;AACnD,cAAM,YAAY,MAAM,cAAcA,WAAU,SAAS;AACzD,cAAM,OAAO,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,OAAO,EAAE;AAC/D,YAAI,CAAC,KAAM,QAAO;AAClB,aAAK,SAAS;AACd,aAAK,UAAU;AACf,cAAM,eAAeA,WAAU,SAAS;AAExC,cAAM,QAAkB;AAAA,UACtB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UAClC,SAAS,CAAC,KAAK,EAAE;AAAA,UACjB,OAAO,KAAK;AAAA,UACZ,SAAS,IAAI,KAAK,WAAW;AAAA,UAC7B,QAAQ,IAAI,KAAK,UAAU;AAAA,UAC3B,SAAS,IAAI,KAAK,WAAW;AAAA,UAC7B,UAAU;AAAA,UACV,QAAQ;AAAA,QACV;AACA,cAAMK,gBAAeL,WAAU,WAAW,KAAK;AAC/C,eAAO,EAAE,GAAG,KAAK;AAAA,MACnB,CAAC;AACD,UAAI,CAAC,QAAQ;AAAE,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,SAAS,IAAI,OAAO,EAAE,cAAc,CAAC;AAAG;AAAA,MAAQ;AAC7F,sBAAgB;AAChB,UAAI,KAAK,MAAM;AAAA,IACjB,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,0BAA0B,CAAC;AAAA,IACpG;AAAA,EACF,CAAC;AAGD,SAAO,KAAK,yBAAyB,OAAO,KAAK,QAAQ;AACvD,QAAI;AACF,YAAM,SAAS,IAAI,KAAK,UAAU;AAClC,YAAM,YAAY,kBAAkB,IAAI,OAAO,SAAS;AACxD,YAAM,SAAS,MAAM,SAAS,WAAW,YAAY;AACnD,cAAM,YAAY,MAAM,cAAcA,WAAU,SAAS;AACzD,cAAM,OAAO,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,OAAO,EAAE;AAC/D,YAAI,CAAC,KAAM,QAAO;AAClB,aAAK,SAAS;AACd,aAAK,UAAU;AACf,cAAM,eAAeA,WAAU,SAAS;AAExC,cAAM,QAAkB;AAAA,UACtB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UAClC,SAAS,CAAC,KAAK,EAAE;AAAA,UACjB,OAAO,KAAK;AAAA,UACZ,SAAS,IAAI,KAAK,WAAW;AAAA,UAC7B,QAAQ;AAAA,UACR,SAAS,UAAU;AAAA,UACnB,UAAU;AAAA,UACV,QAAQ;AAAA,QACV;AACA,cAAMK,gBAAeL,WAAU,WAAW,KAAK;AAC/C,eAAO,EAAE,GAAG,KAAK;AAAA,MACnB,CAAC;AACD,UAAI,CAAC,QAAQ;AAAE,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,SAAS,IAAI,OAAO,EAAE,cAAc,CAAC;AAAG;AAAA,MAAQ;AAC7F,sBAAgB;AAChB,UAAI,KAAK,MAAM;AAAA,IACjB,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,uBAAuB,CAAC;AAAA,IACjG;AAAA,EACF,CAAC;AAGD,SAAO,KAAK,0BAA0B,OAAO,KAAK,QAAQ;AACxD,QAAI;AACF,YAAM,YAAY,kBAAkB,IAAI,OAAO,SAAS;AACxD,YAAM,SAAS,MAAM,SAAS,WAAW,YAAY;AACnD,cAAM,YAAY,MAAM,cAAcA,WAAU,SAAS;AACzD,cAAM,OAAO,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,OAAO,EAAE;AAC/D,YAAI,CAAC,KAAM,QAAO;AAClB,aAAK,SAAS;AACd,aAAK,UAAU;AACf,cAAM,eAAeA,WAAU,SAAS;AACxC,eAAO,EAAE,GAAG,KAAK;AAAA,MACnB,CAAC;AACD,UAAI,CAAC,QAAQ;AAAE,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,SAAS,IAAI,OAAO,EAAE,cAAc,CAAC;AAAG;AAAA,MAAQ;AAC7F,sBAAgB;AAChB,UAAI,KAAK,MAAM;AAAA,IACjB,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,wBAAwB,CAAC;AAAA,IAClG;AAAA,EACF,CAAC;AAGD,SAAO,KAAK,2BAA2B,OAAO,KAAK,QAAQ;AACzD,QAAI;AACF,YAAM,YAAY,kBAAkB,IAAI,OAAO,SAAS;AACxD,YAAM,SAAS,MAAM,SAAS,WAAW,YAAY;AACnD,cAAM,YAAY,MAAM,cAAcA,WAAU,SAAS;AACzD,cAAM,OAAO,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,OAAO,EAAE;AAC/D,YAAI,CAAC,KAAM,QAAO;AAClB,aAAK,SAAS;AACd,aAAK,UAAU;AACf,cAAM,eAAeA,WAAU,SAAS;AACxC,eAAO,EAAE,GAAG,KAAK;AAAA,MACnB,CAAC;AACD,UAAI,CAAC,QAAQ;AAAE,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,SAAS,IAAI,OAAO,EAAE,cAAc,CAAC;AAAG;AAAA,MAAQ;AAC7F,sBAAgB;AAChB,UAAI,KAAK,MAAM;AAAA,IACjB,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,yBAAyB,CAAC;AAAA,IACnG;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;ACpcAM;AADA,SAAS,UAAAC,eAAc;;;ACKvB;AACA;AACAC;AAPA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,IAAI,SAAS,MAAAC,KAAI,YAAAC,YAAU,aAAAC,YAAW,UAAAC,SAAQ,MAAM,MAAM,UAAAC,eAAc;AACjF,SAAS,WAAAC,WAAS,QAAAC,aAAY;AAC9B,SAAS,cAAc;AAKvB,IAAMC,QAAOR,WAAUD,SAAQ;AAExB,IAAM,mBAAmB,CAAC,YAAY,aAAa,SAAS,WAAW,QAAQ;AAGtF,IAAM,iBAAiB;AAqBhB,SAAS,sBAAsB,MAAkC;AACtE,QAAM,UAAoB,CAAC;AAC3B,QAAM,QAA0B,CAAC;AACjC,aAAW,OAAO,MAAM;AACtB,QAAK,iBAAuC,SAAS,GAAG,GAAG;AACzD,YAAM,KAAK,GAAqB;AAAA,IAClC,OAAO;AACL,cAAQ,KAAK,GAAG;AAAA,IAClB;AAAA,EACF;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,IAAI;AAAA,MACR,kBAAkB,QAAQ,WAAW,IAAI,MAAM,KAAK,KAAK,QAAQ,IAAI,CAACU,OAAM,IAAIA,EAAC,GAAG,EAAE,KAAK,IAAI,CAAC,YAAY,iBAAiB,KAAK,IAAI,CAAC;AAAA,IACzI;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,KAAsB;AACpD,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,QAAM,UAAU,IAAI,KAAK;AACzB,SAAO,QAAQ,WAAW,UAAU,KAAK,QAAQ,WAAW,MAAM;AACpE;AAEA,eAAsB,oBACpB,UACoE;AACpE,UAAQ,UAAU;AAAA,IAChB,KAAK,YAAY;AACf,YAAM,SAAS,MAAM,WAAW;AAChC,aAAO,EAAE,YAAY,OAAO,mBAAmB,UAAU,YAAY,QAAQ,MAAM;AAAA,IACrF;AAAA,IACA,KAAK;AACH,aAAO,EAAE,YAAY,aAAa,GAAG,UAAU,aAAa,QAAQ,MAAM;AAAA,IAC5E,KAAK;AACH,aAAO,EAAE,YAAY,SAAS,GAAG,UAAU,SAAS,QAAQ,MAAM;AAAA,IACpE,KAAK;AACH,aAAO,EAAE,YAAY,WAAW,GAAG,UAAU,WAAW,QAAQ,MAAM;AAAA,IACxE,KAAK;AACH,aAAO,EAAE,YAAYC,UAAQ,YAAY,GAAG,WAAW,GAAG,UAAU,aAAa,QAAQ,KAAK;AAAA,EAClG;AACF;AAEA,eAAe,oBAAmC;AAChD,MAAI;AACF,UAAMC,MAAK,OAAO,CAAC,WAAW,CAAC;AAAA,EACjC,QAAQ;AACN,UAAM,IAAI,MAAM,iEAAiE;AAAA,EACnF;AACF;AAEA,eAAe,cAA+B;AAC5C,QAAM,WAAWD,UAAQ,YAAY,GAAG,cAAc;AACtD,QAAM,UAAU,YAAY,CAAC;AAC7B,MAAI;AACF,UAAM,SAAS,MAAM,KAAK,UAAU,IAAI;AACxC,UAAM,OAAO,MAAM,OAAO,QAAQ,GAAG,CAAC;AACtC,UAAM,OAAO,MAAM;AACnB,WAAO;AAAA,EACT,SAASE,MAAK;AACZ,QAAKA,KAA8B,SAAS,UAAU;AACpD,YAAM,MAAM,MAAMC,WAAS,UAAU,OAAO,EAAE,MAAM,MAAM,EAAE;AAC5D,YAAM,IAAI;AAAA,QACR,sDAAsD,QAAQ,SAAS,IAAI,KAAK,KAAK,SAAS;AAAA,MAChG;AAAA,IACF;AACA,UAAMD;AAAA,EACR;AACF;AAEA,eAAe,YAAY,UAAiC;AAC1D,MAAI;AACF,UAAME,QAAO,QAAQ;AAAA,EACvB,QAAQ;AAAA,EAER;AACF;AAEA,eAAe,OAAO,MAAgB,KAA0D;AAC9F,SAAOH,MAAK,OAAO,MAAM,EAAE,IAAI,CAAC;AAClC;AAEA,eAAe,YAAY,SAAiB,SAAgC;AAC1E,MAAI;AACF,UAAMA,MAAK,OAAO,CAAC,SAAS,WAAW,KAAK,SAAS,OAAO,CAAC;AAAA,EAC/D,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,QAAI,QAAQ,SAAS,sBAAsB,KAAK,QAAQ,SAAS,wCAAwC,GAAG;AAC1G,YAAM,IAAI,MAAM,yCAAyC,OAAO,8BAA8B;AAAA,IAChG;AACA,QAAI,QAAQ,SAAS,uBAAuB,KAAK,QAAQ,SAAS,yBAAyB,GAAG;AAC5F,YAAM,IAAI,MAAM,6BAA6B,OAAO,kCAAkC;AAAA,IACxF;AACA,UAAM,IAAI,MAAM,qBAAqB,OAAO,EAAE;AAAA,EAChD;AACF;AAEA,eAAe,cAAc,KAAa,MAA6B;AACrE,MAAI,CAAE,MAAM,WAAW,GAAG,EAAI;AAC9B,QAAM,IAAI,MAAM,KAAK,GAAG;AACxB,MAAI,EAAE,YAAY,GAAG;AACnB,UAAM,UAAU,IAAI;AACpB,UAAM,GAAG,KAAK,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACtD,OAAO;AACL,UAAM,UAAUD,UAAQ,MAAM,IAAI,CAAC;AACnC,UAAM,GAAG,KAAK,MAAM,EAAE,OAAO,KAAK,CAAC;AAAA,EACrC;AACF;AASA,SAAS,wBAAwB,KAA+B;AAC9D,QAAM,QAAQ,IAAI,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAChE,SAAO,sBAAsB,KAAK;AACpC;AAOA,eAAsB,oBAAoB,YAAqC;AAC7E,QAAM,UAAU,MAAMG,WAAS,YAAY,OAAO;AAClD,SAAO,QACJ,QAAQ,4BAA4B,QAAQ,EAC5C,QAAQ,6BAA6B,QAAQ;AAClD;AAEA,eAAsB,eAAe,WAGX;AACxB,QAAM,kBAAkB;AACxB,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,UAAU,WAAW,QAAQ,OAAO,QAAQ,QAAQ;AAC1D,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,8FAA8F;AAAA,EAChH;AACA,QAAM,OAAO,QAAQ,KAAK;AAC1B,MAAI,CAAC,gBAAgB,IAAI,GAAG;AAC1B,UAAM,IAAI,MAAM,sBAAsB,OAAO,sCAAsC;AAAA,EACrF;AAEA,QAAM,gBAAgB,OAAO,QAAQ,cAAc;AACnD,QAAM,aAAa,WAAW,cAAc,wBAAwB,aAAa;AACjF,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AAEA,QAAM,WAAW,MAAM,YAAY;AACnC,MAAI,SAAwB;AAC5B,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AAEzC,MAAI;AACF,aAAS,MAAM,QAAQE,MAAK,OAAO,GAAG,iBAAiB,CAAC;AACxD,UAAM,YAAY,MAAM,MAAM;AAI9B,eAAW,YAAY,YAAY;AACjC,YAAM,EAAE,YAAY,UAAU,OAAO,IAAI,MAAM,oBAAoB,QAAQ;AAC3E,YAAM,WAAWA,MAAK,QAAQ,QAAQ;AAEtC,UAAI,QAAQ;AACV,cAAMC,IAAG,UAAU,EAAE,OAAO,KAAK,CAAC;AAAA,MACpC,OAAO;AACL,cAAMA,IAAG,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MACrD;AAEA,UAAI,CAAE,MAAM,WAAW,UAAU,GAAI;AACnC,gBAAQ,KAAK,aAAa,QAAQ,uBAAuB,UAAU,iCAAiC;AACpG;AAAA,MACF;AAEA,UAAI,aAAa,UAAU;AAGzB,cAAM,YAAY,MAAM,oBAAoB,UAAU;AACtD,cAAM,UAAUN,UAAQ,UAAU,IAAI,CAAC;AACvC,cAAMO,WAAU,UAAU,WAAW,OAAO;AAAA,MAC9C,OAAO;AACL,cAAM,cAAc,YAAY,QAAQ;AAAA,MAC1C;AAAA,IACF;AAGA,UAAM,OAAO,CAAC,OAAO,IAAI,GAAG,MAAM;AAClC,UAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,OAAO,CAAC,UAAU,aAAa,GAAG,MAAM;AACzE,QAAI,CAAC,OAAO,KAAK,GAAG;AAElB,YAAM,mBAAmB,EAAE,YAAY,UAAU,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAClE,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAGA,QAAI;AACF,YAAM,OAAO,CAAC,UAAU,cAAc,eAAe,GAAG,MAAM;AAC9D,YAAM,OAAO,CAAC,UAAU,aAAa,gBAAgB,GAAG,MAAM;AAAA,IAChE,QAAQ;AAAA,IAER;AAEA,UAAM,OAAO,CAAC,UAAU,MAAM,kBAAkB,SAAS,EAAE,GAAG,MAAM;AAEpE,QAAI;AACF,YAAM,OAAO,CAAC,MAAM,GAAG,MAAM;AAAA,IAC/B,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAI,QAAQ,SAAS,kBAAkB,KAAK,QAAQ,SAAS,UAAU,GAAG;AACxE,cAAM,IAAI,MAAM,yFAAyF;AAAA,MAC3G;AACA,UAAI,QAAQ,SAAS,gBAAgB,KAAK,QAAQ,SAAS,yBAAyB,GAAG;AACrF,cAAM,IAAI,MAAM,4DAA4D;AAAA,MAC9E;AACA,YAAM,IAAI,MAAM,oBAAoB,OAAO,EAAE;AAAA,IAC/C;AAGA,UAAM,mBAAmB,EAAE,YAAY,UAAU,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAElE,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,SAAS,aAAa,WAAW,MAAM,WAAW,WAAW,WAAW,IAAI,MAAM,KAAK,OAAO,IAAI;AAAA,MAClG,WAAW;AAAA,IACb;AAAA,EACF,UAAE;AACA,QAAI,QAAQ;AACV,YAAMD,IAAG,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACnE;AACA,UAAM,YAAY,QAAQ;AAAA,EAC5B;AACF;AAEA,eAAsB,oBACpB,WACA,aACA,QACe;AACf,MAAI,QAAQ;AAEV,UAAM,UAAUN,UAAQ,WAAW,IAAI,CAAC;AACxC,UAAM,GAAG,aAAa,WAAW,EAAE,OAAO,KAAK,CAAC;AAChD;AAAA,EACF;AAGA,QAAM,cAAc,GAAG,SAAS;AAChC,QAAM,aAAa,GAAG,SAAS;AAG/B,QAAMM,IAAG,aAAa,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAItD,QAAM,qBAAqB,MAAM,WAAW,UAAU;AACtD,QAAM,oBAAoB,MAAM,WAAW,SAAS;AACpD,MAAI,oBAAoB;AACtB,QAAI,CAAC,mBAAmB;AAEtB,YAAME,QAAO,YAAY,SAAS;AAAA,IACpC,OAAO;AAEL,YAAM,IAAI;AAAA,QACR,mBAAmB,SAAS,8CAA8C,UAAU;AAAA,MAEtF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,kBAAkB;AACtB,MAAI;AAEF,UAAM,GAAG,aAAa,aAAa,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAGnE,UAAM,cAAc,MAAM,WAAW,SAAS;AAC9C,QAAI,aAAa;AACf,YAAMA,QAAO,WAAW,UAAU;AAClC,wBAAkB;AAAA,IACpB;AAGA,UAAMA,QAAO,aAAa,SAAS;AAGnC,UAAMF,IAAG,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACvE,SAASJ,MAAK;AAEZ,QAAI,mBAAoB,MAAM,WAAW,UAAU,GAAI;AACrD,YAAMM,QAAO,YAAY,SAAS,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACpD;AAEA,UAAMF,IAAG,aAAa,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACtE,UAAMJ;AAAA,EACR;AACF;AAEA,eAAsB,kBAAkB,WAGd;AACxB,QAAM,kBAAkB;AACxB,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,UAAU,WAAW,QAAQ,OAAO,QAAQ,QAAQ;AAC1D,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AACA,QAAM,OAAO,QAAQ,KAAK;AAC1B,MAAI,CAAC,gBAAgB,IAAI,GAAG;AAC1B,UAAM,IAAI,MAAM,sBAAsB,OAAO,IAAI;AAAA,EACnD;AAEA,QAAM,gBAAgB,OAAO,QAAQ,cAAc;AACnD,QAAM,aAAa,WAAW,cAAc,wBAAwB,aAAa;AACjF,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,IAAI,MAAM,uCAAuC;AAAA,EACzD;AAEA,QAAM,WAAW,MAAM,YAAY;AACnC,MAAI,SAAwB;AAC5B,QAAM,WAAqB,CAAC;AAC5B,QAAM,SAAmB,CAAC;AAC1B,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AAEzC,MAAI;AAGF,UAAM,mBAAmB,EAAE,aAAa,UAAU,CAAC;AAEnD,aAAS,MAAM,QAAQG,MAAK,OAAO,GAAG,kBAAkB,CAAC;AACzD,UAAM,YAAY,MAAM,MAAM;AAE9B,eAAW,YAAY,YAAY;AAEjC,UAAI,aAAa,UAAU;AACzB,gBAAQ,KAAK,uEAAuE;AACpF;AAAA,MACF;AACA,UAAI;AACF,cAAM,EAAE,YAAY,WAAW,UAAU,OAAO,IAAI,MAAM,oBAAoB,QAAQ;AACtF,cAAM,cAAcA,MAAK,QAAQ,QAAQ;AACzC,YAAI,CAAE,MAAM,WAAW,WAAW,GAAI;AACpC,kBAAQ,KAAK,aAAa,QAAQ,uCAAuC;AACzE;AAAA,QACF;AACA,cAAM,oBAAoB,WAAW,aAAa,MAAM;AACxD,iBAAS,KAAK,QAAQ;AAAA,MACxB,SAAS,OAAO;AACd,cAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACjE,gBAAQ,MAAM,sBAAsB,QAAQ,MAAM,GAAG,EAAE;AACvD,eAAO,KAAK,QAAQ;AAAA,MACtB;AAAA,IACF;AAEA,UAAM,UAAU,OAAO,WAAW;AAClC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS,UACL,YAAY,SAAS,MAAM,WAAW,SAAS,WAAW,IAAI,MAAM,KAAK,SAAS,IAAI,MACtF,oBAAoB,SAAS,MAAM,eAAe,OAAO,MAAM,YAAY,OAAO,KAAK,IAAI,CAAC;AAAA,MAChG,WAAW;AAAA,IACb;AAAA,EACF,UAAE;AACA,QAAI,QAAQ;AACV,YAAMC,IAAG,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACnE;AACA,UAAM,YAAY,QAAQ;AAAA,EAC5B;AACF;AAEA,eAAsB,kBAMnB;AACD,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,WAAWN,UAAQ,YAAY,GAAG,cAAc;AACtD,QAAM,SAAS,MAAM,WAAW,QAAQ;AACxC,SAAO;AAAA,IACL,MAAM,OAAO,QAAQ,QAAQ;AAAA,IAC7B,YAAY,OAAO,QAAQ,cAAc;AAAA,IACzC,YAAY,OAAO,QAAQ,cAAc;AAAA,IACzC,aAAa,OAAO,QAAQ,eAAe;AAAA,IAC3C;AAAA,EACF;AACF;;;ADvaO,SAAS,qBAA6B;AAC3C,QAAM,SAASS,QAAO;AAEtB,SAAO,IAAI,KAAK,OAAO,MAAM,QAAQ;AACnC,QAAI;AACF,YAAM,SAAS,MAAM,gBAAgB;AACrC,UAAI,KAAK,MAAM;AAAA,IACjB,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,CAAC;AAAA,IACxF;AAAA,EACF,CAAC;AAED,SAAO,IAAI,WAAW,OAAO,KAAK,QAAQ;AACxC,QAAI;AACF,YAAM,OAAO,IAAI,QAAQ,CAAC;AAC1B,YAAM,UAAkD,CAAC;AAEzD,UAAI,KAAK,SAAS,QAAW;AAC3B,cAAM,UAAU,OAAO,KAAK,SAAS,WAAW,KAAK,KAAK,KAAK,IAAI,KAAK;AACxE,YAAI,YAAY,QAAQ,YAAY,MAAM,CAAC,gBAAgB,OAAO,GAAG;AACnE,iBAAO,IAAI,OAAO,GAAG,EAAE,KAAK;AAAA,YAC1B,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AACA,gBAAQ,OAAO,WAAW;AAAA,MAC5B;AAEA,UAAI,KAAK,eAAe,QAAW;AACjC,YAAI;AACJ,YAAI,MAAM,QAAQ,KAAK,UAAU,GAAG;AAClC,iBAAO,KAAK,WAAW,IAAI,CAAC,MAAe,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAAA,QAC7E,WAAW,OAAO,KAAK,eAAe,UAAU;AAC9C,iBAAO,KAAK,WAAW,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAAA,QAC/E,OAAO;AACL,iBAAO,IAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uCAAuC,CAAC;AAAA,QAC/E;AACA,YAAI,KAAK,WAAW,GAAG;AACrB,iBAAO,IAAI,OAAO,GAAG,EAAE,KAAK;AAAA,YAC1B,OAAO,kCAAkC,iBAAiB,KAAK,IAAI,CAAC;AAAA,UACtE,CAAC;AAAA,QACH;AACA,YAAI;AACF,gBAAM,QAAQ,sBAAsB,IAAI;AACxC,kBAAQ,aAAa,MAAM,KAAK,IAAI;AAAA,QACtC,SAASC,MAAK;AACZ,iBAAO,IAAI,OAAO,GAAG,EAAE,KAAK;AAAA,YAC1B,OAAOA,gBAAe,QAAQA,KAAI,UAAU,OAAOA,IAAG;AAAA,UACxD,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACrC,eAAO,IAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,sBAAsB,CAAC;AAAA,MAC9D;AAEA,YAAM,mBAAmB,OAAO;AAChC,YAAM,SAAS,MAAM,gBAAgB;AACrC,UAAI,KAAK,MAAM;AAAA,IACjB,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,CAAC;AAAA,IACxF;AAAA,EACF,CAAC;AAED,SAAO,KAAK,SAAS,OAAO,MAAM,QAAQ;AACxC,QAAI;AACF,YAAM,SAAS,MAAM,eAAe;AACpC,UAAI,KAAK,MAAM;AAAA,IACjB,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK;AAAA,QACnB,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO,KAAK,SAAS,OAAO,MAAM,QAAQ;AACxC,QAAI;AACF,YAAM,SAAS,MAAM,kBAAkB;AACvC,UAAI,KAAK,MAAM;AAAA,IACjB,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK;AAAA,QACnB,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AEnGA;AAWA;AAWO,SAAS,iBAAiB,YAAoB,WAA6B;AAChF,QAAM,QAAkB,CAAC;AACzB,aAAW,QAAQ,WAAW,MAAM,IAAI,GAAG;AACzC,UAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,KAAK;AACrC,QAAI,MAAM,SAAS,EAAG;AACtB,UAAM,MAAM,SAAS,MAAM,CAAC,GAAG,EAAE;AACjC,QAAI,QAAQ,UAAW;AACvB,UAAM,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,KAAK,QAAQ,KAAK,CAAC,CAAC;AACpE,QAAI,SAAS;AACX,YAAM,OAAO,SAAS,QAAQ,MAAM,GAAG,EAAE,IAAI,GAAI,EAAE;AACnD,UAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,SAAS,IAAI,EAAG,OAAM,KAAK,IAAI;AAAA,IAC5D;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,+BAA+B,YAAwC;AACrF,QAAM,OAAO,oBAAI,IAA8B;AAC/C,aAAW,QAAQ,WAAW,MAAM,IAAI,GAAG;AACzC,UAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,KAAK;AACrC,QAAI,MAAM,SAAS,EAAG;AACtB,UAAM,UAAU,MAAM,CAAC;AACvB,UAAM,MAAM,SAAS,MAAM,CAAC,GAAG,EAAE;AACjC,QAAI,MAAM,GAAG,EAAG;AAChB,UAAM,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,KAAK,QAAQ,KAAK,CAAC,CAAC;AACpE,QAAI,CAAC,QAAS;AACd,UAAM,OAAO,SAAS,QAAQ,MAAM,GAAG,EAAE,IAAI,GAAI,EAAE;AACnD,QAAI,MAAM,IAAI,EAAG;AAEjB,QAAI,CAAC,KAAK,IAAI,GAAG,GAAG;AAClB,WAAK,IAAI,KAAK,EAAE,KAAK,MAAM,QAAQ,CAAC;AAAA,IACtC;AAAA,EACF;AACA,SAAO,MAAM,KAAK,KAAK,OAAO,CAAC;AACjC;AAIA,IAAI,QAA+C;AACnD,IAAI,kBAAwC;AAU5C,IAAI,eAA4C;AAEzC,SAAS,mBAAmB,MAAkC;AACnE,MAAI,MAAO;AACX,iBAAe;AACf,QAAM,WAAW,KAAK,cAAc;AAEpC,eAAa;AACb,UAAQ,YAAY,MAAM;AACxB,iBAAa;AAAA,EACf,GAAG,QAAQ;AACb;AAEA,eAAsB,oBAAmC;AACvD,MAAI,OAAO;AACT,kBAAc,KAAK;AACnB,YAAQ;AAAA,EACV;AAEA,MAAI,iBAAiB;AACnB,UAAM;AACN,sBAAkB;AAAA,EACpB;AACA,iBAAe;AACjB;AAEA,SAAS,eAAqB;AAC5B,MAAI,mBAAmB,CAAC,aAAc;AACtC,QAAM,OAAO;AACb,oBAAkB,UAAU,KAAK,YAAY,KAAK,aAAa,KAAK,aAAa,KAAK,cAAc,EACjG,MAAM,CAACC,SAAQ;AACd,YAAQ,MAAM,qCAAqCA,IAAG;AAAA,EACxD,CAAC,EACA,QAAQ,MAAM;AACb,sBAAkB;AAAA,EACpB,CAAC;AACL;AAIA,eAAsB,sBAAyC;AAC7D,QAAMC,UAAS,MAAM,UAAU,QAAQ,CAAC,iBAAiB,MAAM,iBAAiB,CAAC;AACjF,MAAI,CAACA,QAAQ,QAAO,CAAC;AACrB,SAAOA,QAAO,MAAM,IAAI,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAC5D;AAEA,eAAe,qBACbC,aACAC,cACA,eACAC,iBACkB;AAClB,QAAM,gBAAgB,MAAM,mBAAmB;AAC/C,MAAI,CAAC,cAAe,QAAO;AAE3B,QAAM,mBAAmB,MAAM,qBAAqBD,cAAaC,eAAc;AAC/E,MAAI,iBAAiB,WAAW,EAAG,QAAO;AAE1C,QAAM,WAAW,MAAM,oBAAoB;AAC3C,MAAI,UAAU;AAEd,aAAW,eAAe,UAAU;AAClC,UAAM,YAAY,oBAAoB,WAAW;AACjD,QAAI,cAAc,IAAI,SAAS,GAAG;AAEhC;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,cAAc,WAAW;AAC7C,QAAI,MAAM,WAAW,EAAG;AAGxB,QAAI,UAAU;AACd,UAAM,cAAc,oBAAI,IAA0D;AAElF,eAAW,QAAQ,OAAO;AACxB,UAAI,CAAC,YAAY,IAAI,KAAK,GAAG,GAAG;AAC9B,oBAAY,IAAI,KAAK,KAAK,MAAM,WAAW,KAAK,GAAG,CAAC;AAAA,MACtD;AACA,YAAM,UAAU,YAAY,IAAI,KAAK,GAAG;AACxC,YAAM,OAAO,MAAM,aAAa,KAAK,KAAK,QAAQ,QAAQ,gBAAgB;AAC1E,UAAI,MAAM;AACR,kBAAU;AACV;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS;AACX,YAAM,oBAAoBF,aAAY,aAAa,EAAE,MAAM,OAAO,CAAC;AACnE,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO;AACT;AAUA,eAAe,cAAc,KAAqC;AAEhE,QAAMD,UAAS,MAAM,UAAU,QAAQ,CAAC,MAAM,MAAM,OAAO,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC;AACpF,MAAI,CAACA,QAAQ,QAAO;AAEpB,aAAW,QAAQA,QAAO,MAAM,IAAI,GAAG;AACrC,QAAI,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG;AAC3C,aAAO,KAAK,MAAM,CAAC;AAAA,IACrB;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,kBACbC,aACAC,cACA,eACA,aACAC,iBACkB;AAClB,QAAM,mBAAmB,MAAM,qBAAqBD,cAAaC,eAAc;AAC/E,MAAI,iBAAiB,WAAW,EAAG,QAAO;AAE1C,QAAM,aAAa,MAAM,cAAc;AACvC,MAAI,CAAC,WAAY,QAAO;AAExB,QAAM,YAAY,+BAA+B,UAAU;AAC3D,MAAI,UAAU;AAGd,QAAM,cAAc,oBAAI,IAAY;AACpC,aAAW,QAAQ,cAAc,OAAO,GAAG;AACzC,QAAI,KAAK,SAAS,aAAa,KAAK,KAAK;AACvC,kBAAY,IAAI,KAAK,GAAG;AAAA,IAC1B;AAAA,EACF;AAEA,aAAW,QAAQ,WAAW;AAC5B,QAAI,YAAY,IAAI,KAAK,GAAG,EAAG;AAC/B,QAAI,aAAa,IAAI,KAAK,GAAG,EAAG;AAEhC,UAAM,MAAM,MAAM,cAAc,KAAK,GAAG;AACxC,QAAI,CAAC,IAAK;AAEV,UAAM,UAAU,MAAM,WAAW,GAAG;AACpC,UAAM,OAAO,MAAM,aAAa,KAAK,QAAQ,QAAQ,gBAAgB;AACrE,QAAI,CAAC,KAAM;AAGX,UAAM,cAAc,QAAQ,KAAK,OAAO,IAAI,KAAK,IAAI;AACrD,UAAM,YAAY,oBAAoB,WAAW;AAGjD,QAAI,cAAc,IAAI,SAAS,EAAG;AAElC,UAAM,QAAQ,iBAAiB,YAAY,KAAK,GAAG;AACnD,UAAM,oBAAoBF,aAAY,aAAa;AAAA,MACjD,MAAM;AAAA,MACN,KAAK,KAAK;AAAA,MACV,OAAO,MAAM,SAAS,IAAI,QAAQ,CAAC,KAAK,IAAI;AAAA,MAC5C;AAAA,IACF,CAAC;AACD,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAIA,eAAe,wBACbA,aACA,eAC0D;AAC1D,MAAI,UAAU;AACd,QAAM,eAAe,oBAAI,IAAY;AAGrC,QAAM,gBAAgB,MAAM,mBAAmB;AAE/C,aAAW,CAAC,MAAM,IAAI,KAAK,eAAe;AACxC,QAAI,CAAC,KAAK,KAAM;AAEhB,QAAI,QAAQ;AACZ,QAAI,KAAK,SAAS,QAAQ;AACxB,UAAI,CAAC,cAAe;AACpB,cAAQ,MAAM,aAAa,KAAK,OAAO;AAAA,IACzC,WAAW,KAAK,SAAS,aAAa,KAAK,KAAK;AAC9C,cAAQ,MAAM,eAAe,KAAK,GAAG;AAAA,IACvC,OAAO;AAEL;AAAA,IACF;AAEA,QAAI,CAAC,OAAO;AACV,YAAM,cAAcA,aAAY,IAAI;AACpC,mBAAa,IAAI,IAAI;AACrB,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,aAAa;AACjC;AAEA,eAAsB,eAAe,KAA+B;AAClE,MAAI;AACF,YAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,UAAUA,aAAoBC,cAAqB,aAA2BC,iBAAwC;AAEnI,QAAM,QAAQ,MAAM,iBAAiBF,WAAU;AAC/C,QAAM,gBAAgB,oBAAI,IAA6B;AACvD,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAO,MAAM,gBAAgBA,aAAY,IAAI;AACnD,QAAI,KAAM,eAAc,IAAI,MAAM,IAAI;AAAA,EACxC;AAGA,QAAM,EAAE,SAAS,gBAAgB,aAAa,IAAI,MAAM,wBAAwBA,aAAY,aAAa;AAGzG,aAAW,QAAQ,cAAc;AAC/B,kBAAc,OAAO,IAAI;AAAA,EAC3B;AACA,QAAM,gBAAgB,IAAI,IAAI,cAAc,KAAK,CAAC;AAGlD,QAAM,cAAc,MAAM,qBAAqBA,aAAYC,cAAa,eAAeC,eAAc;AACrG,QAAM,iBAAiB,MAAM,kBAAkBF,aAAYC,cAAa,eAAe,aAAaC,eAAc;AAGlH,MAAI,eAAe,kBAAkB,gBAAgB;AACnD,mBAAe;AAAA,EACjB;AACF;;;AZjQO,SAAS,sBAAsB,SAAiC;AACrE,QAAM,EAAE,MAAM,aAAAC,cAAa,gBAAAC,iBAAgB,YAAAC,aAAY,cAAAC,eAAc,UAAAC,WAAU,eAAe,kBAAkB,IAAI;AACpH,QAAM,MAAM,QAAQ;AACpB,QAAM,SAAS,aAAa,GAAG;AAG/B,QAAM,MAAM,IAAI,gBAAgB,EAAE,UAAU,KAAK,CAAC;AAClD,QAAM,UAAU,oBAAI,IAAe;AAEnC,SAAO,GAAG,WAAW,CAAC,SAAS,QAAQ,SAAS;AAC9C,QAAI,QAAQ,QAAQ,OAAO;AACzB,UAAI,cAAc,SAAS,QAAQ,MAAM,CAAC,OAAO;AAC/C,YAAI,KAAK,cAAc,IAAI,OAAO;AAAA,MACpC,CAAC;AAAA,IACH,OAAO;AACL,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF,CAAC;AAED,MAAI,GAAG,cAAc,CAAC,OAAO;AAC3B,YAAQ,IAAI,EAAE;AACd,UAAM,aAAwB;AAAA,MAC5B,MAAM;AAAA,MACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AACA,OAAG,KAAK,KAAK,UAAU,UAAU,CAAC;AAElC,OAAG,GAAG,SAAS,MAAM;AACnB,cAAQ,OAAO,EAAE;AAAA,IACnB,CAAC;AAAA,EACH,CAAC;AAED,WAAS,UAAU,SAA0B;AAC3C,UAAM,OAAO,KAAK,UAAU,OAAO;AACnC,eAAW,UAAU,SAAS;AAC5B,UAAI,OAAO,eAAe,UAAU,MAAM;AACxC,eAAO,KAAK,IAAI;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAGA,gBAAc;AACd,sBAAoBJ,YAAW,EAAE,MAAM,CAACK,SAAQ;AAC9C,YAAQ,MAAM,2CAA2CA,IAAG;AAAA,EAC9D,CAAC;AAKD,GAAC,YAAY;AACX,QAAI;AACF,YAAM,eAAe,MAAM;AAAA,QACzBC,UAAQ,YAAY,GAAG,WAAW;AAAA,MACpC;AACA,YAAM,gBAAgB,MAAM,0BAA0BN,YAAW;AACjE,YAAM,UAAU,mBAAmB,eAAe,YAAY;AAC9D,UAAI,QAAS,SAAQ,IAAI,OAAO;AAAA,IAClC,SAASK,MAAK;AACZ,cAAQ,MAAM,uCAAuCA,IAAG;AAAA,IAC1D;AAAA,EACF,GAAG;AAGH,MAAI,IAAI,QAAQ,KAAK,CAAC;AAGtB,MAAI,IAAI,iBAAiB,OAAO,MAAM,QAAQ;AAC5C,QAAI;AACF,YAAM,WAAW,MAAM,YAAYL,cAAaE,aAAYD,eAAc;AAC1E,UAAI,KAAK,QAAQ;AAAA,IACnB,SAAS,OAAO;AACd,cAAQ,MAAM,2BAA2B,KAAK;AAC9C,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,yBAAyB,CAAC;AAAA,IAC1D;AAAA,EACF,CAAC;AAED,MAAI,IAAI,kBAAkB,OAAO,MAAM,QAAQ;AAC7C,QAAI;AACF,YAAM,YAAY,MAAM,aAAaD,cAAaE,aAAYD,eAAc;AAC5E,UAAI,KAAK,SAAS;AAAA,IACpB,SAAS,OAAO;AACd,cAAQ,MAAM,kCAAkC,KAAK;AACrD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,gCAAgC,CAAC;AAAA,IACjE;AAAA,EACF,CAAC;AAED,MAAI,IAAI,aAAa,OAAO,MAAM,QAAQ;AACxC,QAAI;AACF,YAAM,OAAO,MAAM,QAAQ;AAC3B,UAAI,KAAK,IAAI;AAAA,IACf,SAAS,OAAO;AACd,cAAQ,MAAM,+BAA+B,KAAK;AAClD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,6BAA6B,CAAC;AAAA,IAC9D;AAAA,EACF,CAAC;AAED,MAAI,IAAI,wBAAwB,OAAO,MAAM,QAAQ;AACnD,QAAI;AACF,YAAM,SAAS,MAAM,gBAAgB;AACrC,UAAI,KAAK;AAAA,QACP,UAAU,OAAO;AAAA,QACjB,OAAO,OAAO;AAAA,QACd,aAAa,OAAO;AAAA,QACpB,QAAQ,OAAO;AAAA,MACjB,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,MAAM,gCAAgC,KAAK;AACnD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,8BAA8B,CAAC;AAAA,IAC/D;AAAA,EACF,CAAC;AAED,MAAI,KAAK,wBAAwB,OAAO,KAAK,QAAQ;AACnD,QAAI;AACF,YAAM,EAAE,UAAU,OAAO,YAAY,IAAI,IAAI;AAC7C,UAAI,CAAC,MAAM,QAAQ,QAAQ,KAAK,CAAC,MAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,QAAQ,WAAW,GAAG;AACpF,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,oEAAoE,CAAC;AACnG;AAAA,MACF;AACA,YAAM,kBAAkB,EAAE,UAAU,OAAO,YAAY,CAAC;AACxD,6BAAuB;AACvB,YAAM,SAAS,MAAM,gBAAgB;AACrC,UAAI,KAAK;AAAA,QACP,UAAU,OAAO;AAAA,QACjB,OAAO,OAAO;AAAA,QACd,aAAa,OAAO;AAAA,QACpB,QAAQ,OAAO;AAAA,MACjB,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,MAAM,+BAA+B,KAAK;AAClD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,+BAA+B,CAAC;AAAA,IAChE;AAAA,EACF,CAAC;AAED,MAAI,OAAO,wBAAwB,OAAO,MAAM,QAAQ;AACtD,QAAI;AACF,YAAM,mBAAmB;AACzB,6BAAuB;AACvB,YAAM,SAAS,MAAM,gBAAgB;AACrC,UAAI,KAAK;AAAA,QACP,UAAU,OAAO;AAAA,QACjB,OAAO,OAAO;AAAA,QACd,aAAa,OAAO;AAAA,QACpB,QAAQ,OAAO;AAAA,MACjB,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,MAAM,kCAAkC,KAAK;AACrD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,gCAAgC,CAAC;AAAA,IACjE;AAAA,EACF,CAAC;AAED,MAAI,IAAI,iBAAiB,OAAO,KAAK,QAAQ;AAC3C,QAAI;AACF,UAAI,WAAW,MAAM,aAAaD,YAAW;AAC7C,YAAM,iBAAiB,IAAI,MAAM;AACjC,UAAI,gBAAgB;AAClB,YAAI,mBAAmB,cAAc;AACnC,qBAAW,SAAS,OAAO,CAAC,MAAM,EAAE,cAAc,IAAI;AAAA,QACxD,OAAO;AACL,qBAAW,SAAS,OAAO,CAAC,MAAM,EAAE,cAAc,cAAc;AAAA,QAClE;AAAA,MACF;AACA,UAAI,KAAK,QAAQ;AAAA,IACnB,SAAS,OAAO;AACd,cAAQ,MAAM,2BAA2B,KAAK;AAC9C,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,0BAA0B,CAAC;AAAA,IAC3D;AAAA,EACF,CAAC;AAED,MAAI,IAAI,mBAAmB,OAAO,MAAM,QAAQ;AAC9C,QAAI;AACF,YAAM,SAAS,MAAM,eAAeA,YAAW;AAC/C,UAAI,KAAK,MAAM;AAAA,IACjB,SAAS,OAAO;AACd,cAAQ,MAAM,6BAA6B,KAAK;AAChD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,4BAA4B,CAAC;AAAA,IAC7D;AAAA,EACF,CAAC;AAED,MAAI,KAAK,mBAAmB,OAAO,KAAK,QAAQ;AAC9C,QAAI;AACF,YAAM,EAAE,KAAK,IAAI,IAAI;AACrB,UAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,CAAC,uBAAuB,KAAK,IAAI,GAAG;AAC3E,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uEAAuE,CAAC;AACtG;AAAA,MACF;AACA,YAAM,gBAAgBA,cAAa,IAAI;AACvC,gBAAU,EAAE,MAAM,mBAAmB,aAAa,IAAI,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAC3F,UAAI,KAAK,EAAE,KAAK,CAAC;AAAA,IACnB,SAAS,OAAO;AACd,cAAQ,MAAM,6BAA6B,KAAK;AAChD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,6BAA6B,CAAC;AAAA,IAC9D;AAAA,EACF,CAAC;AAED,MAAI,OAAO,yBAAyB,OAAO,KAAK,QAAQ;AACtD,QAAI;AACF,YAAM,gBAAgBA,cAAa,IAAI,OAAO,IAAI;AAClD,gBAAU,EAAE,MAAM,mBAAmB,aAAa,IAAI,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAC3F,UAAI,KAAK,EAAE,IAAI,KAAK,CAAC;AAAA,IACvB,SAAS,OAAO;AACd,cAAQ,MAAM,6BAA6B,KAAK;AAChD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,6BAA6B,CAAC;AAAA,IAC9D;AAAA,EACF,CAAC;AAED,MAAI,IAAI,oBAAoB,OAAO,KAAK,QAAQ;AAC9C,QAAI;AACF,YAAM,SAAS,MAAM,qBAAqBA,cAAaC,eAAc;AACrE,YAAM,iBAAiB,IAAI,MAAM;AACjC,UAAI,gBAAgB;AAClB,YAAI,mBAAmB,cAAc;AACnC,iBAAO,cAAc,OAAO,YAAY,OAAO,CAAC,MAAM,EAAE,qBAAqB,IAAI;AAAA,QACnF,OAAO;AACL,iBAAO,cAAc,OAAO,YAAY,OAAO,CAAC,MAAM,EAAE,qBAAqB,cAAc;AAAA,QAC7F;AAAA,MACF;AACA,UAAI,KAAK,MAAM;AAAA,IACjB,SAAS,OAAO;AACd,cAAQ,MAAM,8BAA8B,KAAK;AACjD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,6BAA6B,CAAC;AAAA,IAC9D;AAAA,EACF,CAAC;AAED,MAAI,IAAI,uBAAuB,OAAO,KAAK,QAAQ;AACjD,QAAI;AACF,YAAM,SAAS,MAAM,iBAAiBD,cAAa,IAAI,OAAO,IAAI;AAClE,UAAI,CAAC,QAAQ;AACX,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,YAAY,IAAI,OAAO,IAAI,cAAc,CAAC;AACxE;AAAA,MACF;AACA,UAAI,KAAK,MAAM;AAAA,IACjB,SAAS,OAAO;AACd,cAAQ,MAAM,iCAAiC,KAAK;AACpD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,+BAA+B,CAAC;AAAA,IAChE;AAAA,EACF,CAAC;AAED,MAAI,IAAI,wBAAwB,OAAO,KAAK,QAAQ;AAClD,QAAI;AACF,YAAM,SAAS,MAAM,wBAAwBA,cAAaC,iBAAgB,IAAI,OAAO,EAAE;AACvF,UAAI,CAAC,QAAQ;AACX,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,eAAe,IAAI,OAAO,EAAE,cAAc,CAAC;AACzE;AAAA,MACF;AACA,UAAI,KAAK,MAAM;AAAA,IACjB,SAAS,OAAO;AACd,cAAQ,MAAM,mCAAmC,KAAK;AACtD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,2BAA2B,CAAC;AAAA,IAC5D;AAAA,EACF,CAAC;AAED,MAAI,IAAI,iCAAiC,OAAO,KAAK,QAAQ;AAC3D,QAAI;AACF,YAAM,WAAW,MAAM,sBAAsBD,cAAaC,iBAAgB,IAAI,OAAO,EAAE;AACvF,UAAI,CAAC,UAAU;AACb,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,eAAe,IAAI,OAAO,EAAE,cAAc,CAAC;AACzE;AAAA,MACF;AACA,YAAM,wBAAwBD,cAAaC,eAAc;AACzD,YAAM,WAAW,MAAM;AAAA,QACrB,SAAS,aAAa,OAAO,SAAS;AAAA,QACtC,SAAS,aAAa,SAAS,KAAK,SAAS;AAAA,MAC/C;AACA,UAAI,KAAK,EAAE,UAAU,cAAa,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAAA,IAC9D,SAAS,OAAO;AACd,cAAQ,MAAM,iCAAiC,KAAK;AACpD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,0BAA0B,CAAC;AAAA,IAC3D;AAAA,EACF,CAAC;AAED,MAAI,IAAI,0CAA0C,OAAO,KAAK,QAAQ;AACpE,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,QACnBD;AAAA,QACA,IAAI,OAAO;AAAA,QACX,IAAI,OAAO;AAAA,MACb;AACA,UAAI,CAAC,QAAQ;AACX,YAAI,OAAO,GAAG,EAAE,KAAK;AAAA,UACnB,OAAO,eAAe,IAAI,OAAO,KAAK,2BAA2B,IAAI,OAAO,IAAI;AAAA,QAClF,CAAC;AACD;AAAA,MACF;AACA,UAAI,KAAK,MAAM;AAAA,IACjB,SAAS,OAAO;AACd,cAAQ,MAAM,oCAAoC,KAAK;AACvD,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,kCAAkC,CAAC;AAAA,IACnE;AAAA,EACF,CAAC;AAGD,MAAI,IAAI,kBAAkBA,cAAaC,eAAc,CAAC;AAGtD,MAAI,IAAI,gBAAgB,oBAAoBC,aAAYF,cAAaC,eAAc,CAAC;AAGpF,MAAI,IAAI,uBAAuB,0BAA0BD,cAAa,WAAWC,eAAc,CAAC;AAGhG,MAAI,IAAI,kBAAkB,sBAAsBE,aAAY,CAAC;AAG7D,MAAI,IAAI,cAAc,kBAAkBC,WAAU,SAAS,CAAC;AAG5D,MAAI,IAAI,eAAe,mBAAmB,CAAC;AAG3C,MAAI,iBAAiB,mBAAmB;AACtC,QAAI,IAAI,QAAQ,OAAO,iBAAiB,CAAC;AAIzC,QAAI,IAAI,WAAW,OAAO,MAAW,QAAa;AAChD,YAAM,YAAYE,UAAQ,mBAAmB,YAAY;AACzD,UAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,YAAI,SAAS,SAAS;AAAA,MACxB,OAAO;AACL,YAAI,OAAO,GAAG,EAAE;AAAA,UACd;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,gBAAuD;AAE3D,SAAO;AAAA,IACL,MAAM,QAAuB;AAC3B,sBAAgB,cAAc;AAAA,QAC5B,aAAAN;AAAA,QACA,gBAAAC;AAAA,QACA,YAAAC;AAAA,QACA,cAAAC;AAAA,QACA,UAAAC;AAAA,QACA,WAAW;AAAA,MACb,CAAC;AAED,yBAAmB,EAAE,YAAAF,aAAY,aAAAF,cAAa,gBAAAC,iBAAgB,aAAa,oBAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;AAEnG,aAAO,IAAI,QAAc,CAAC,gBAAgB,WAAW;AACnD,eAAO,GAAG,SAAS,CAACI,SAA+B;AACjD,cAAIA,KAAI,SAAS,cAAc;AAC7B,mBAAO,IAAI;AAAA,cACT,QAAQ,IAAI;AAAA,YACd,CAAC;AAAA,UACH,OAAO;AACL,mBAAOA,IAAG;AAAA,UACZ;AAAA,QACF,CAAC;AACD,eAAO,OAAO,MAAM,MAAM;AACxB,gBAAM,WAAWC,UAAQ,YAAY,GAAG,gBAAgB;AACxD,UAAAC,WAAU,UAAU,OAAO,IAAI,GAAG,OAAO,EAAE,MAAM,MAAM;AAAA,UAAC,CAAC;AACzD,yBAAe;AAAA,QACjB,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,OAAsB;AAC1B,YAAM,kBAAkB;AACxB,UAAI,eAAe;AACjB,cAAM,cAAc,MAAM;AAAA,MAC5B;AACA,qBAAe;AACf,iBAAW,UAAU,SAAS;AAC5B,eAAO,UAAU;AAAA,MACnB;AACA,cAAQ,MAAM;AACd,YAAM,WAAWD,UAAQ,YAAY,GAAG,gBAAgB;AACxD,YAAME,QAAO,QAAQ,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AACrC,aAAO,sBAAsB;AAC7B,aAAO,IAAI,QAAc,CAAC,mBAAmB;AAC3C,eAAO,MAAM,MAAM,eAAe,CAAC;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,IAEA,IAAI,OAAe;AACjB,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ADlbA;AACA;AAaO,SAAS,4BAA4B,OAAiB,QAAQ,MAAe;AAClF,SAAO,KAAK,KAAK,CAAC,QAAQ,QAAQ,YAAY,IAAI,WAAW,SAAS,CAAC;AACzE;AAEO,SAAS,qBAAqB,SAAiD;AACpF,QAAM,UAAU,QAAQ,QAAQ,GAAG;AACnC,QAAM,aAAa,QAAQ,QAAQ,cAAc,QAAQ,OAAO;AAEhE,MAAI,WAAW,YAAY;AACzB,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,MAAI,SAAS;AACX,WAAO;AAAA,EACT;AAEA,MAAI,YAAY;AACd,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAe,gBAAgB,MAAgC;AAC7D,SAAO,IAAI,QAAQ,CAAC,wBAAwB;AAC1C,UAAM,SAAS,gBAAgB;AAE/B,WAAO,KAAK,SAAS,MAAM;AACzB,0BAAoB,KAAK;AAAA,IAC3B,CAAC;AAED,WAAO,KAAK,aAAa,MAAM;AAC7B,aAAO,MAAM,MAAM,oBAAoB,IAAI,CAAC;AAAA,IAC9C,CAAC;AAED,WAAO,OAAO,IAAI;AAAA,EACpB,CAAC;AACH;AAEA,eAAsB,kBACpB,WACA,cAAsB,IACE;AACxB,WAAS,SAAS,GAAG,SAAS,aAAa,UAAU,GAAG;AACtD,UAAM,YAAY,YAAY;AAC9B,QAAI,YAAY,OAAO;AACrB;AAAA,IACF;AACA,QAAI,MAAM,gBAAgB,SAAS,GAAG;AACpC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,iBAAiB,SAA0C;AAC/E,QAAM,SAAS,MAAM,WAAW;AAChC,QAAMC,eAAc,OAAO;AAC3B,QAAM,gBAAgB,SAAS,QAAQ,MAAM,EAAE;AAE/C,MAAI,MAAM,aAAa,KAAK,gBAAgB,KAAK,gBAAgB,OAAO;AACtE,UAAM,IAAI,MAAM,iBAAiB,QAAQ,IAAI,0CAA0C;AAAA,EACzF;AAEA,QAAM,OAAO,qBAAqB,OAAO;AACzC,MAAI,OAAO;AAEX,MAAI,QAAQ,UAAU;AACpB,UAAM,gBAAgB,MAAM,kBAAkB,aAAa;AAC3D,QAAI,kBAAkB,MAAM;AAC1B,YAAM,IAAI;AAAA,QACR,0DAA0D,aAAa;AAAA,MACzE;AAAA,IACF;AACA,QAAI,kBAAkB,eAAe;AACnC,cAAQ,IAAI,QAAQ,aAAa,6CAA6C,aAAa,WAAW;AAAA,IACxG;AACA,WAAO;AAAA,EACT;AAKA,QAAM,WAAWC,eAAc,YAAY,GAAG;AAC9C,QAAM,cAAcC,UAAQC,SAAQ,QAAQ,GAAG,IAAI;AACnD,QAAM,gBAAgBD,UAAQ,aAAa,aAAa,MAAM;AAE9D,QAAM,SAAS,sBAAsB;AAAA,IACnC;AAAA,IACA,aAAAF;AAAA,IACA,gBAAgB,eAAkB;AAAA,IAClC,YAAY,WAAc;AAAA,IAC1B,cAAc,aAAgB;AAAA,IAC9B,UAAU,SAAY;AAAA,IACtB,eAAe,SAAS;AAAA,IACxB,mBAAmB;AAAA,EACrB,CAAC;AAED,QAAM,OAAO,MAAM;AAEnB,MAAI,cAAmC;AAEvC,MAAI,SAAS,OAAO;AAClB,UAAM,eAAeE,UAAQ,aAAa,WAAW;AACrD,UAAM,UAAUA,UAAQ,cAAc,gBAAgB,QAAQ,MAAM;AAEpE,QAAI,CAAE,MAAM,WAAW,OAAO,GAAI;AAChC,cAAQ;AAAA,QACN;AAAA,MACF;AACA,YAAM,OAAO,KAAK;AAClB,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,YAAQ,IAAI,0CAA0C,IAAI,EAAE;AAC5D,YAAQ,IAAI,6BAA6B;AAEzC,kBAAc,MAAM,SAAS,CAAC,GAAG;AAAA,MAC/B,KAAK;AAAA,MACL,KAAK;AAAA,QACH,GAAG,QAAQ;AAAA,QACX,eAAe,OAAO,IAAI;AAAA,MAC5B;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AAED,gBAAY,GAAG,SAAS,CAACE,SAAQ;AAC/B,cAAQ,MAAM,oCAAoCA,KAAI,OAAO;AAAA,IAC/D,CAAC;AAAA,EACH,WAAW,SAAS,eAAe;AACjC,UAAM,MAAM,oBAAoB,IAAI;AACpC,YAAQ,IAAI,oCAAoC,GAAG,EAAE;AAAA,EACvD,OAAO;AACL,UAAM,MAAM,oBAAoB,IAAI;AACpC,YAAQ,IAAI,gCAAgC,GAAG,EAAE;AAEjD,QAAI,QAAQ,MAAM;AAChB,UAAI;AACF,cAAM,aAAa,MAAM,OAAO,MAAM;AACtC,cAAM,WAAW,QAAQ,GAAG;AAAA,MAC9B,QAAQ;AACN,gBAAQ,IAAI,QAAQ,GAAG,yCAAyC;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAGA,MAAI,eAAe;AACnB,QAAM,YAAY,MAAM;AACtB,YAAQ,IAAI,eAAe;AAC3B,QAAI,aAAa;AACf,UAAI;AAAE,oBAAY,KAAK,SAAS;AAAA,MAAG,QAAQ;AAAA,MAAC;AAAA,IAC9C;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,WAAW,YAAY;AAC3B,QAAI,cAAc;AAChB,gBAAU;AACV;AAAA,IACF;AACA,mBAAe;AACf,YAAQ,IAAI,4DAA4D;AACxE,QAAI,aAAa;AACf,kBAAY,KAAK;AAAA,IACnB;AACA,QAAI;AACF,YAAM,OAAO,KAAK;AAAA,IACpB,SAASA,MAAK;AACZ,cAAQ,MAAM,0BAA0BA,IAAG;AAAA,IAC7C;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,GAAG,UAAU,QAAQ;AAC7B,UAAQ,GAAG,WAAW,QAAQ;AAChC;;;AclMA;AACA;AACAC;AAHA,SAAS,WAAAC,iBAAe;AAKxB;AAQA;AASA,eAAsB,cACpB,YACA,SACA,UAA4B,CAAC,GACF;AAC3B,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,UAAU,QAAQ,MAAM,WAAW,QAAQ,GAAG,IAAI,OAAO;AAE/D,MAAI,QAAQ,SAAS;AACnB,QAAI,CAAC,YAAY,QAAQ,OAAO,GAAG;AACjC,YAAM,IAAI,MAAM,yBAAyB,QAAQ,OAAO,IAAI;AAAA,IAC9D;AACA,QAAI,CAAC,YAAY,UAAU,GAAG;AAC5B,YAAM,IAAI,MAAM,4BAA4B,UAAU,IAAI;AAAA,IAC5D;AACA,UAAM,aAAaC,UAAQ,SAAS,QAAQ,OAAO;AACnD,UAAM,gBAAgBA,UAAQ,YAAY,YAAY;AACtD,QAAI,CAAE,MAAM,WAAW,UAAU,KAAM,CAAE,MAAM,WAAW,aAAa,GAAI;AACzE,YAAM,IAAI,MAAM,YAAY,QAAQ,OAAO,kBAAkB,UAAU,GAAG;AAAA,IAC5E;AACA,WAAO,kBAAkB,YAAY,YAAY,SAAS;AAAA,MACxD,QAAQ,QAAQ;AAAA,MAChB,OAAO,QAAQ;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,MAAM,sBAAsB,SAAS,eAAiB,GAAG,UAAU;AACpF,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR,eAAe,UAAU;AAAA,IAC3B;AAAA,EACF;AACA,SAAO,uBAAuB,SAAS,eAAe,SAAS;AAAA,IAC7D,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ;AAAA,IACf,YAAY,SAAS;AAAA,EACvB,CAAC;AACH;AAEA,eAAsB,UACpB,YACA,OACA,UAA4B,CAAC,GACF;AAC3B,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,UAAU,QAAQ,MAAM,WAAW,QAAQ,GAAG,IAAI,OAAO;AAE/D,MAAI,QAAQ,SAAS;AACnB,QAAI,CAAC,YAAY,QAAQ,OAAO,GAAG;AACjC,YAAM,IAAI,MAAM,yBAAyB,QAAQ,OAAO,IAAI;AAAA,IAC9D;AACA,QAAI,CAAC,YAAY,UAAU,GAAG;AAC5B,YAAM,IAAI,MAAM,4BAA4B,UAAU,IAAI;AAAA,IAC5D;AACA,UAAM,aAAaA,UAAQ,SAAS,QAAQ,OAAO;AACnD,UAAM,gBAAgBA,UAAQ,YAAY,YAAY;AACtD,QAAI,CAAE,MAAM,WAAW,UAAU,KAAM,CAAE,MAAM,WAAW,aAAa,GAAI;AACzE,YAAM,IAAI,MAAM,YAAY,QAAQ,OAAO,kBAAkB,UAAU,GAAG;AAAA,IAC5E;AACA,WAAO,cAAc,YAAY,YAAY,KAAK;AAAA,EACpD;AAEA,QAAM,WAAW,MAAM,sBAAsB,SAAS,eAAiB,GAAG,UAAU;AACpF,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR,eAAe,UAAU;AAAA,IAC3B;AAAA,EACF;AACA,SAAO,mBAAmB,SAAS,eAAe,KAAK;AACzD;AAEO,SAAS,aAAa,QAAgC;AAC3D,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI,MAAM,OAAO,OAAO;AAAA,EAChC;AACA,UAAQ,IAAI,OAAO,OAAO;AAC1B,aAAW,WAAW,OAAO,YAAY,CAAC,GAAG;AAC3C,YAAQ,KAAK,YAAY,OAAO,EAAE;AAAA,EACpC;AACF;;;AC/FA,eAAsB,cACpB,YACA,SACe;AACf,MAAI,CAAC,QAAQ,OAAO;AAClB,UAAM,IAAI,MAAM,6BAA6B;AAAA,EAC/C;AACA,QAAM,SAAS,MAAM,UAAU,YAAY,QAAQ,OAAO,OAAO;AACjE,eAAa,MAAM;AACrB;;;ACTA,eAAsB,aACpB,YACA,SACe;AACf,QAAM,SAAS,MAAM,cAAc,YAAY,SAAS,OAAO;AAC/D,eAAa,MAAM;AACrB;;;ACRA,eAAsB,gBACpB,YACA,SACe;AACf,QAAM,SAAS,MAAM,cAAc,YAAY,YAAY,OAAO;AAClE,eAAa,MAAM;AACrB;;;ACJA,eAAsB,aACpB,YACA,SACe;AACf,QAAM,SAAS,MAAM,cAAc,YAAY,SAAS,OAAO;AAC/D,eAAa,MAAM;AACrB;;;ACRA,eAAsB,eACpB,YACA,SACe;AACf,QAAM,SAAS,MAAM,cAAc,YAAY,WAAW,OAAO;AACjE,eAAa,MAAM;AACrB;;;ACNA,eAAsB,cACpB,YACA,SACe;AACf,QAAM,SAAS,MAAM,cAAc,YAAY,UAAU,OAAO;AAChE,eAAa,MAAM;AACrB;;;ACNA,eAAsB,YACpB,YACA,SACe;AACf,QAAM,SAAS,MAAM,cAAc,YAAY,QAAQ,OAAO;AAC9D,eAAa,MAAM;AACrB;;;ACNA,eAAsB,cACpB,YACA,SACe;AACf,QAAM,SAAS,MAAM,cAAc,YAAY,UAAU,OAAO;AAChE,eAAa,MAAM;AACrB;;;ACVAC;;;ACcAC;AACA;AAfA;AAAA,EACE,MAAAC;AAAA,EACA,WAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAAC;AAAA,EACA;AAAA,EACA,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC;AAAA,OACK;AACP,SAAS,kBAAkB;AAC3B,SAAS,WAAAC,gBAAe;AACxB,SAAS,UAAU,WAAAC,UAAS,cAAAC,aAAY,YAAAC,WAAU,WAAAC,iBAAe;;;ACXjE;AAFA,SAAS,WAAAC,UAAS,WAAAC,iBAAe;AACjC,SAAS,iBAAAC,sBAAqB;AAG9B,eAAsB,gBACpB,sBACiB;AACjB,MAAI,aAAaF,SAAQE,eAAc,YAAY,GAAG,CAAC;AAEvD,SAAO,MAAM;AACX,UAAM,YAAYD,UAAQ,YAAY,oBAAoB;AAC1D,QAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,aAAO;AAAA,IACT;AAEA,UAAM,YAAYA,UAAQ,YAAY,IAAI;AAC1C,QAAI,cAAc,YAAY;AAC5B,YAAM,IAAI;AAAA,QACR,4CAA4C,oBAAoB;AAAA,MAClE;AAAA,IACF;AACA,iBAAa;AAAA,EACf;AACF;;;ADNA;AAKA,IAAM,0BAA0B;AAwIhC,SAAS,sBAAsB,YAAgC;AAC7D,SAAO,eAAe,WAAW,0BAA0B;AAC7D;AAEA,SAAS,8BAA8B,YAAgC;AACrE,SAAO,eAAe,WAClB,+BACA;AACN;AAEO,SAAS,0BAA0B,YAAgC;AACxE,QAAM,OAAOE,SAAQ;AACrB,SAAO,eAAe,WAClBC,UAAQ,MAAM,WAAW,WAAW,SAAS,IAC7CA,UAAQ,MAAM,WAAW,SAAS;AACxC;AAEO,SAAS,4BAAoC;AAClD,SAAOA,UAAQD,SAAQ,GAAG,WAAW,WAAW,kBAAkB;AACpE;AAEA,SAAS,4BAAoC;AAC3C,SAAOC,UAAQD,SAAQ,GAAG,WAAW,WAAW,cAAc;AAChE;AAEA,SAAS,iCAAyC;AAChD,SAAOC,UAAQD,SAAQ,GAAG,WAAW,WAAW,yBAAyB;AAC3E;AAEA,SAAS,gCAAwC;AAC/C,SAAOC,UAAQD,SAAQ,GAAG,WAAW,WAAW,wBAAwB;AAC1E;AAEA,SAAS,qBAAqB,WAA2B;AACvD,SAAOC,UAAQ,WAAW,uBAAuB;AACnD;AAEA,eAAe,oBAAoB,aAA+C;AAChF,QAAM,MAAM,MAAMC,WAASD,UAAQ,aAAa,cAAc,GAAG,OAAO;AACxE,SAAO,KAAK,MAAM,GAAG;AACvB;AAEA,eAAe,qBAAwB,WAAsC;AAC3E,MAAI,CAAE,MAAM,WAAW,SAAS,GAAI;AAClC,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,MAAM,MAAMC,WAAS,WAAW,OAAO;AAC7C,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,yBACb,WAC+B;AAC/B,SACE,MAAM;AAAA,IACJD,UAAQ,WAAW,kBAAkB,aAAa;AAAA,EACpD,KACG,CAAC;AACR;AAEA,eAAe,uBACb,WACA,YAC6B;AAC7B,QAAM,eAAeA,UAAQ,WAAW,8BAA8B,UAAU,CAAC;AACjF,MAAI,CAAE,MAAM,WAAW,YAAY,GAAI;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,MAAMC,WAAS,cAAc,OAAO;AAChD,QAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,SAAO,OAAO;AAChB;AAEA,eAAe,oBAAoB,WAAoD;AACrF,QAAM,aAAa,qBAAqB,SAAS;AACjD,MAAI,CAAE,MAAM,WAAW,UAAU,GAAI;AACnC,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,MAAM,MAAMA,WAAS,YAAY,OAAO;AAC9C,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,iBACb,WACA,YACwB;AACxB,MAAI,CAAE,MAAM,WAAW,SAAS,GAAI;AAClC,WAAO,EAAE,QAAQ,OAAO,SAAS,MAAM;AAAA,EACzC;AAEA,QAAM,OAAO,MAAM,MAAM,SAAS;AAClC,MAAI,KAAK,eAAe,GAAG;AACzB,UAAM,gBAAgB,MAAM,SAAS,SAAS;AAC9C,UAAM,iBAAiBD,UAAQE,SAAQ,SAAS,GAAG,aAAa;AAChE,UAAMC,gBAAe,MAAM,uBAAuB,gBAAgB,UAAU;AAC5E,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAASA,kBAAiB;AAAA,MAC1B,aAAa;AAAA,MACb,cAAAA;AAAA,MACA,eAAe;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,oBAAoB,SAAS;AACpD,QAAM,eAAe,MAAM,uBAAuB,WAAW,UAAU;AACvE,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,SAAS;AAAA,MACN,YAAY,SAAS,eAAe,cAAc,SAAS,gBAAgB,aAC1E,iBAAiB;AAAA,IACrB;AAAA,IACA,aAAa,UAAU,eAAe;AAAA,IACtC;AAAA,EACF;AACF;AAEA,eAAe,qBACb,WACA,YACA,aACA,iBACe;AACf,QAAM,WAA4B;AAAA,IAChC,aAAa,gBAAgB;AAAA,IAC7B,gBAAgB,gBAAgB;AAAA,IAChC;AAAA,IACA;AAAA,IACA,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,EACtC;AAEA,QAAMC;AAAA,IACJ,qBAAqB,SAAS;AAAA,IAC9B,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA;AAAA,IACpC;AAAA,EACF;AACF;AAEA,eAAe,YACb,OACA,YACe;AACf,QAAM,UAAUF,SAAQ,MAAM,SAAS,CAAC;AACxC,QAAMG,IAAG,MAAM,WAAW,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC9D,QAAM,kBAAkB,MAAM,oBAAoB,MAAM,WAAW;AACnE,QAAM,qBAAqB,MAAM,WAAW,YAAY,QAAQ,eAAe;AACjF;AAEA,eAAe,YAAY,OAAmC;AAC5D,QAAM,UAAUH,SAAQ,MAAM,SAAS,CAAC;AACxC,QAAMI,IAAG,MAAM,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC1D,QAAM,UAAUJ,SAAQ,MAAM,SAAS,CAAC;AACxC,QAAM,QAAQF,UAAQ,MAAM,SAAS,GAAG,MAAM,WAAW,KAAK;AAChE;AAEA,eAAe,oBAAoB,WAAkC;AACnE,QAAM,aAAa,qBAAqB,SAAS;AACjD,MAAI,MAAM,WAAW,UAAU,GAAG;AAChC,UAAMO,QAAO,UAAU,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACzC;AACF;AAEO,SAAS,6BAA6B,WAAmB,OAAuB;AACrF,QAAM,WAAW,WAAW,UAAU,KAAK,CAAC;AAC5C,MAAI,CAACC,YAAW,QAAQ,GAAG;AACzB,UAAM,IAAI,MAAM,GAAG,KAAK,4BAA4B;AAAA,EACtD;AACA,SAAOR,UAAQ,QAAQ;AACzB;AAEA,eAAsB,mBACpB,YACA,WACsB;AACtB,QAAM,cAAc,MAAM,gBAAgB,sBAAsB,UAAU,CAAC;AAC3E,SAAO;AAAA,IACL;AAAA,IACA,WAAWA,UAAQ,aAAa,sBAAsB,UAAU,CAAC;AAAA,IACjE,WAAW,aAAa,0BAA0B,UAAU;AAAA,EAC9D;AACF;AAEA,eAAe,sCAA4D;AACzE,QAAM,SAAS,MAAM,qBAElB,8BAA8B,CAAC;AAElC,QAAM,QAAQ,oBAAI,IAAY;AAC9B,aAAW,OAAO,OAAO,KAAK,QAAQ,WAAW,CAAC,CAAC,GAAG;AACpD,UAAM,UAAU,IAAI,YAAY,GAAG;AACnC,QAAI,UAAU,KAAK,UAAU,IAAI,SAAS,GAAG;AAC3C,YAAM,IAAI,IAAI,MAAM,UAAU,CAAC,CAAC;AAAA,IAClC;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,oCAAwF;AACrG,QAAM,SAAS,MAAM;AAAA,IACnB,+BAA+B;AAAA,EACjC;AACA,SAAO,IAAI,IAAI,OAAO,QAAQ,UAAU,CAAC,CAAC,CAAC;AAC7C;AAEA,eAAe,0BACb,cACgC;AAChC,QAAM,SAAS,MAAM,qBAA4C,YAAY;AAC7E,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO,EAAE,SAAS,CAAC,EAAE;AAAA,EACvB;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS,MAAM,QAAQ,OAAO,OAAO,IACjC,OAAO,QAAQ;AAAA,MACb,CAAC,WACC,OAAO,WAAW,YAAY,WAAW;AAAA,IAC7C,IACA,CAAC;AAAA,EACP;AACF;AAEA,eAAe,2BACb,cACA,aACe;AACf,QAAM,UAAUE,SAAQ,YAAY,CAAC;AACrC,QAAME,WAAU,cAAc,GAAG,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AAAA,GAAM,OAAO;AACpF;AAEA,SAAS,iCACP,iBACA,oBACQ;AACR,QAAM,UAAUK,UAAS,oBAAoB,eAAe,EAAE,WAAW,MAAM,GAAG;AAClF,MAAI,YAAY,IAAI;AAClB,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,WAAW,GAAG,IAAI,UAAU,KAAK,OAAO;AACzD;AAEA,SAAS,sBACP,QAC+C;AAC/C,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,EAAE,MAAM,OAAO;AAAA,EACxB;AACA,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,OAAO,OAAO;AAAA,EAChB;AACF;AAEA,SAAS,4BACP,iBACA,oBACA,UAC8B;AAC9B,SAAO;AAAA,IACL,MAAM,SAAS,QAAQ;AAAA,IACvB,aAAa,SAAS;AAAA,IACtB,SAAS,SAAS;AAAA,IAClB,QAAQ,sBAAsB,SAAS,MAAM;AAAA,IAC7C,QAAQ,iCAAiC,iBAAiB,kBAAkB;AAAA,IAC5E,UAAU;AAAA,EACZ;AACF;AAEA,SAAS,gCAAgC,WAA+C;AACtF,MAAI,UAAU,YAAY;AACxB,WAAO;AAAA,EACT;AACA,MAAI,UAAU,UAAU,UAAU,eAAe;AAC/C,WAAO;AAAA,EACT;AACA,MAAI,UAAU,eAAe;AAC3B,WAAO;AAAA,EACT;AACA,MAAI,UAAU,UAAU,UAAU,mBAAmB;AACnD,WAAO;AAAA,EACT;AACA,MAAI,UAAU,mBAAmB;AAC/B,WAAO;AAAA,EACT;AACA,MAAI,UAAU,QAAQ;AACpB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,eAAe,kCAAyE;AACtF,QAAM,UAAU,0BAA0B;AAC1C,MAAI,CAAE,MAAM,WAAW,OAAO,GAAI;AAChC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,CAAC,mBAAmB,wBAAwB,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC7E,kCAAkC;AAAA,IAClC,oCAAoC;AAAA,IACpCC,UAAQ,SAAS,EAAE,eAAe,KAAK,CAAC;AAAA,EAC1C,CAAC;AAED,QAAM,aAA2C,CAAC;AAClD,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY,GAAG;AACxB;AAAA,IACF;AAEA,UAAM,gBAAgBV,UAAQ,SAAS,MAAM,IAAI;AACjD,UAAM,eAAeA,UAAQ,eAAe,kBAAkB,kBAAkB;AAChF,QAAI,CAAE,MAAM,WAAW,YAAY,GAAI;AACrC;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,0BAA0B,YAAY;AAC3D,UAAM,gBAAgB,OAAO,OAAO,SAAS,YAAY,OAAO,KAAK,KAAK,MAAM,KAC5E,OAAO,OACP,MAAM;AACV,UAAM,QAAQ,kBAAkB,IAAI,aAAa;AACjD,UAAM,aAAa,OAAO,QAAQ;AAAA,MAChC,CAAC,WAAW,OAAO,SAAS,aAAa,OAAO,OAAO,WAAW;AAAA,IACpE;AACA,UAAM,gBAAgB,kBAAkB,kBAAkB,MAAM,SAAS;AAEzE,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,SAAS;AAAA,MACT;AAAA,MACA,QAAQ,uBAAuB,IAAI,aAAa;AAAA,MAChD;AAAA,MACA;AAAA,MACA,mBAAmB,OAAO,QAAQ,WAAW,eAAe;AAAA,IAC9D,CAAC;AACD,SAAK,IAAI,aAAa;AAAA,EACxB;AAEA,aAAW,CAAC,eAAe,KAAK,KAAK,kBAAkB,QAAQ,GAAG;AAChE,UAAM,kBAAkB,MAAM;AAC9B,QAAI,CAAC,iBAAiB;AACpB;AAAA,IACF;AAEA,UAAM,gBAAgBA,UAAQ,WAAW,eAAe,CAAC;AACzD,QAAI,KAAK,IAAI,aAAa,GAAG;AAC3B;AAAA,IACF;AAEA,UAAM,eAAeA,UAAQ,eAAe,kBAAkB,kBAAkB;AAChF,QAAI,CAAE,MAAM,WAAW,YAAY,GAAI;AACrC;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,0BAA0B,YAAY;AAC3D,eAAW,KAAK;AAAA,MACd,MAAM,OAAO,OAAO,SAAS,YAAY,OAAO,KAAK,KAAK,MAAM,KAC5D,OAAO,OACP;AAAA,MACJ,SAAS;AAAA,MACT;AAAA,MACA,QAAQ,uBAAuB,IAAI,aAAa;AAAA,MAChD,YAAY,OAAO,QAAQ;AAAA,QACzB,CAAC,WAAW,OAAO,SAAS,aAAa,OAAO,OAAO,WAAW;AAAA,MACpE;AAAA,MACA,eAAe,kBAAkB;AAAA,MACjC,mBAAmB,MAAM,QAAQ,WAAW,eAAe,kBAAkB;AAAA,IAC/E,CAAC;AAAA,EACH;AAEA,SAAO,WAAW,KAAK,CAAC,GAAG,MAAM,gCAAgC,CAAC,IAAI,gCAAgC,CAAC,CAAC;AAC1G;AAEA,eAAe,gCAA2E;AACxF,QAAM,aAAa,MAAM,gCAAgC,GAAG,CAAC;AAC7D,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM,UAAU;AAAA,IAChB,SAAS,UAAU;AAAA,IACnB,cAAc,UAAU;AAAA,IACxB,WAAWA,UAAQ,UAAU,SAAS,WAAW,SAAS;AAAA,EAC5D;AACF;AAEA,eAAsB,iCACpB,WAC2C;AAC3C,QAAM,sBAAsB,6BAA6B,WAAW,sBAAsB;AAC1F,QAAM,aAAaE,SAAQ,mBAAmB;AAC9C,MAAI,SAAS,UAAU,MAAM,WAAW;AACtC,WAAO;AAAA,EACT;AAEA,QAAM,UAAUA,SAAQ,UAAU;AAClC,QAAM,eAAeF,UAAQ,SAAS,kBAAkB,kBAAkB;AAC1E,MAAI,CAAE,MAAM,WAAW,YAAY,GAAI;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,MAAM,0BAA0B,YAAY;AAChE,QAAM,OAAO,OAAO,YAAY,SAAS,YAAY,YAAY,KAAK,KAAK,MAAM,KAC7E,YAAY,OACZ,SAAS,OAAO;AAEpB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACb;AACF;AAEA,eAAe,wCAAgE;AAC7E,QAAM,eAAe,MAAM,gCAAgC;AAC3D,aAAW,eAAe,cAAc;AACtC,UAAM,YAAYA,UAAQ,YAAY,SAAS,WAAW,SAAS;AACnE,UAAM,SAAS,MAAM,iBAAiB,WAAW,QAAQ;AACzD,QAAI,OAAO,UAAU,OAAO,SAAS;AACnC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,6BAA6B,SAKK;AACtD,QAAM,qBAAqB;AAAA,IACzB,QAAQ;AAAA,IACR;AAAA,EACF;AACA,QAAM,eAAe;AAAA,IACnB,QAAQ;AAAA,IACR;AAAA,EACF;AACA,QAAM,kBAAkB;AAAA,IACtB,QAAQ;AAAA,IACR;AAAA,EACF;AACA,QAAM,cAAc,MAAM,0BAA0B,YAAY;AAChE,QAAM,iBAAiB,MAAM,yBAAyB,eAAe;AACrE,QAAM,QAAQ,4BAA4B,iBAAiB,oBAAoB,cAAc;AAC7F,QAAM,iBAAiB,MAAM;AAC7B,QAAM,gBAAgB,YAAY,QAAQ;AAAA,IACxC,CAAC,WAAW,OAAO,SAAS,MAAM,QAAQ,OAAO,WAAW;AAAA,EAC9D;AAEA,MAAI,iBAAiB,GAAG;AACtB,UAAM,WAAW,YAAY,QAAQ,aAAa;AAClD,UAAM,UAAU,KAAK,UAAU,QAAQ,MAAM,KAAK,UAAU,KAAK;AACjE,QAAI,SAAS;AACX,kBAAY,QAAQ,aAAa,IAAI;AACrC,YAAM,2BAA2B,cAAc,WAAW;AAAA,IAC5D;AACA,WAAO,EAAE,cAAc,QAAQ;AAAA,EACjC;AAEA,QAAM,mBAAmB,YAAY,QAAQ,UAAU,CAAC,WAAW,OAAO,SAAS,MAAM,IAAI;AAC7F,MAAI,oBAAoB,GAAG;AACzB,UAAM,yBAAyB,QAAQ,kCACnC;AAAA,MACE;AAAA,QACE,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,IACF,IACA;AACJ,UAAM,WAAW,YAAY,QAAQ,gBAAgB;AACrD,QAAI,0BAA0B,SAAS,WAAW,wBAAwB;AACxE,kBAAY,QAAQ,gBAAgB,IAAI;AACxC,YAAM,2BAA2B,cAAc,WAAW;AAC1D,aAAO,EAAE,cAAc,SAAS,KAAK;AAAA,IACvC;AAEA,UAAM,IAAI;AAAA,MACR,sBAAsB,MAAM,IAAI,+CAA+C,YAAY;AAAA,IAC7F;AAAA,EACF;AAEA,cAAY,QAAQ,KAAK,KAAK;AAC9B,QAAM,2BAA2B,cAAc,WAAW;AAC1D,SAAO,EAAE,cAAc,SAAS,KAAK;AACvC;AAEA,eAAsB,6BAA6B,SAIK;AACtD,QAAM,eAAe;AAAA,IACnB,QAAQ;AAAA,IACR;AAAA,EACF;AACA,MAAI,CAAE,MAAM,WAAW,YAAY,GAAI;AACrC,WAAO,EAAE,cAAc,SAAS,MAAM;AAAA,EACxC;AAEA,QAAM,qBAAqB;AAAA,IACzB,QAAQ;AAAA,IACR;AAAA,EACF;AACA,QAAM,iBAAiB,QAAQ,kBAC3B;AAAA,IACE,6BAA6B,QAAQ,iBAAiB,sBAAsB;AAAA,IAC5E;AAAA,EACF,IACA;AACJ,QAAM,cAAc,MAAM,0BAA0B,YAAY;AAChE,QAAM,cAAc,YAAY,QAAQ;AACxC,cAAY,UAAU,YAAY,QAAQ,OAAO,CAAC,WAAW;AAC3D,QAAI,OAAO,SAAS,WAAW;AAC7B,aAAO;AAAA,IACT;AACA,QAAI,CAAC,gBAAgB;AACnB,aAAO;AAAA,IACT;AACA,WAAO,OAAO,WAAW;AAAA,EAC3B,CAAC;AAED,MAAI,YAAY,QAAQ,WAAW,aAAa;AAC9C,WAAO,EAAE,cAAc,SAAS,MAAM;AAAA,EACxC;AAEA,QAAM,2BAA2B,cAAc,WAAW;AAC1D,SAAO,EAAE,cAAc,SAAS,KAAK;AACvC;AAEA,eAAsB,mBACpB,YACA,WACmC;AACnC,QAAM,mBAAmB,6BAA6B,WAAW,GAAG,qBAAqB,UAAU,CAAC,SAAS;AAC7G,QAAM,SAAS,MAAM,iBAAiB,kBAAkB,UAAU;AAClE,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,SAAS,OAAO;AAAA,IAChB,aAAa,OAAO;AAAA,IACpB,WAAW;AAAA,EACb;AACF;AAEA,eAAsB,qBACpB,SACqC;AACrC,QAAM;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,YAAY,0BAA0B,UAAU;AAAA,EAClD,IAAI;AACJ,QAAM,sBAAsB;AAAA,IAC1B;AAAA,IACA,GAAG,qBAAqB,UAAU,CAAC;AAAA,EACrC;AACA,QAAM,QAAQ,MAAM,mBAAmB,YAAY,mBAAmB;AAEtE,MAAI,CAAE,MAAM,WAAW,MAAM,SAAS,GAAI;AACxC,UAAM,IAAI,MAAM,wCAAwC,MAAM,SAAS,GAAG;AAAA,EAC5E;AAEA,QAAM,cAA2B,OAAO,SAAS;AACjD,QAAM,WAAW,MAAM,iBAAiB,MAAM,WAAW,UAAU;AAEnE,MAAI,SAAS,UAAU,CAAC,SAAS,SAAS;AACxC,UAAM,IAAI;AAAA,MACR,GAAG,MAAM,SAAS;AAAA,IACpB;AAAA,EACF;AAEA,MACE,gBAAgB,UAChB,SAAS,UACT,SAAS,gBAAgB,UACzB,SAAS,kBAAkBA,UAAQ,MAAM,SAAS,KAClD,CAAC,OACD;AACA,WAAO;AAAA,MACL,WAAW,MAAM;AAAA,MACjB,WAAW,MAAM;AAAA,MACjB,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,SAAS,QAAQ;AACnB,UAAMM,IAAG,MAAM,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EAC5D;AAEA,MAAI,gBAAgB,QAAQ;AAC1B,UAAM,YAAY,KAAK;AAAA,EACzB,OAAO;AACL,UAAM,YAAY,OAAO,UAAU;AAAA,EACrC;AAEA,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB,WAAW,MAAM;AAAA,IACjB,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;AAEO,SAAS,2BACd,iBACA,iBACQ;AACR,QAAM,UAAUG,UAASP,SAAQ,eAAe,GAAG,eAAe,EAAE,WAAW,MAAM,GAAG;AACxF,MAAI,YAAY,IAAI;AAClB,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,WAAW,GAAG,IAAI,UAAU,KAAK,OAAO;AACzD;AAEO,SAAS,6BACd,iBACA,iBACkB;AAClB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,QAAQ;AAAA,MACR,MAAM,2BAA2B,iBAAiB,eAAe;AAAA,IACnE;AAAA,IACA,QAAQ;AAAA,MACN,cAAc;AAAA,MACd,gBAAgB;AAAA,IAClB;AAAA,IACA,UAAU;AAAA,EACZ;AACF;AAEA,eAAsB,oBAAoB,iBAAmD;AAC3F,MAAI,CAAE,MAAM,WAAW,eAAe,GAAI;AACxC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW,EAAE,aAAa,gBAAgB;AAAA,MAC1C,SAAS,CAAC;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,MAAM,MAAMD,WAAS,iBAAiB,OAAO;AACnD,QAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,SAAO;AAAA,IACL,MAAM,OAAO,QAAQ;AAAA,IACrB,WAAW,OAAO,aAAa,EAAE,aAAa,gBAAgB;AAAA,IAC9D,SAAS,MAAM,QAAQ,OAAO,OAAO,IAChC,OAAO,UACR,CAAC;AAAA,EACP;AACF;AAEA,eAAsB,qBACpB,iBACA,aACe;AACf,QAAM,UAAUC,SAAQ,eAAe,CAAC;AACxC,QAAME,WAAU,iBAAiB,GAAG,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AAAA,GAAM,OAAO;AACvF;AAEA,eAAsB,8BAA8B,iBAA2C;AAC7F,QAAM,cAAc,MAAM,oBAAoB,eAAe;AAC7D,SAAO,YAAY,QAAQ;AAAA,IACzB,CAAC,WAAW,OAAO,SAAS,aAAa,OAAO,QAAQ,WAAW;AAAA,EACrE;AACF;AAEA,eAAsB,2BACpB,iBACA,iBACkB;AAClB,QAAM,cAAc,MAAM,oBAAoB,eAAe;AAC7D,QAAM,eAAe,2BAA2B,iBAAiB,eAAe;AAChF,SAAO,YAAY,QAAQ;AAAA,IACzB,CAAC,WACC,OAAO,SAAS,aAChB,OAAO,QAAQ,WAAW,WAC1B,OAAO,QAAQ,SAAS;AAAA,EAC5B;AACF;AAEA,eAAsB,uBACpB,SACwD;AACxD,QAAM,kBAAkB;AAAA,IACtB,QAAQ;AAAA,IACR;AAAA,EACF;AACA,QAAM,kBAAkB;AAAA,IACtB,QAAQ;AAAA,IACR;AAAA,EACF;AACA,QAAM,cAAc,MAAM,oBAAoB,eAAe;AAC7D,QAAM,QAAQ,6BAA6B,iBAAiB,eAAe;AAC3E,QAAM,gBAAgB,YAAY,QAAQ;AAAA,IACxC,CAAC,WACC,OAAO,SAAS,MAAM,QACtB,OAAO,QAAQ,WAAW,MAAM,OAAO,UACvC,OAAO,QAAQ,SAAS,MAAM,OAAO;AAAA,EACzC;AAEA,MAAI,iBAAiB,GAAG;AACtB,WAAO,EAAE,iBAAiB,SAAS,MAAM;AAAA,EAC3C;AAEA,QAAM,mBAAmB,YAAY,QAAQ,UAAU,CAAC,WAAW,OAAO,SAAS,MAAM,IAAI;AAC7F,MAAI,oBAAoB,GAAG;AACzB,UAAM,WAAW,YAAY,QAAQ,gBAAgB;AACrD,UAAM,uBAAuB,QAAQ,kCACjC;AAAA,MACE;AAAA,QACE,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,IACF,IACA;AAEJ,QACE,SAAS,QAAQ,WAAW,WAC5B,wBACA,SAAS,QAAQ,SAAS,sBAC1B;AACA,kBAAY,QAAQ,gBAAgB,IAAI;AACxC,YAAM,qBAAqB,iBAAiB,WAAW;AACvD,aAAO,EAAE,iBAAiB,SAAS,KAAK;AAAA,IAC1C;AAEA,UAAM,IAAI;AAAA,MACR,sBAAsB,MAAM,IAAI,+CAA+C,eAAe;AAAA,IAChG;AAAA,EACF;AAEA,cAAY,QAAQ,KAAK,KAAK;AAC9B,QAAM,qBAAqB,iBAAiB,WAAW;AACvD,SAAO,EAAE,iBAAiB,SAAS,KAAK;AAC1C;AAEA,SAAS,0BAA0B,aAAuC;AACxE,SACE,YAAY,SAAS,YACpB,YAAY,WAAW,eAAe,qBAAqB;AAEhE;AAEA,eAAsB,uBACpB,SACwD;AACxD,QAAM,kBAAkB;AAAA,IACtB,QAAQ;AAAA,IACR;AAAA,EACF;AAEA,MAAI,CAAE,MAAM,WAAW,eAAe,GAAI;AACxC,WAAO,EAAE,iBAAiB,SAAS,MAAM;AAAA,EAC3C;AAEA,QAAM,qBAAqB,QAAQ,uBACjC,QAAQ,kBACJ;AAAA,IACE,6BAA6B,QAAQ,iBAAiB,qBAAqB;AAAA,IAC3E;AAAA,EACF,IACA;AAEN,QAAM,cAAc,MAAM,oBAAoB,eAAe;AAC7D,QAAM,cAAc,YAAY,QAAQ;AACxC,cAAY,UAAU,YAAY,QAAQ,OAAO,CAAC,WAAW;AAC3D,QAAI,OAAO,SAAS,aAAa,OAAO,QAAQ,WAAW,SAAS;AAClE,aAAO;AAAA,IACT;AACA,QAAI,CAAC,oBAAoB;AACvB,aAAO;AAAA,IACT;AACA,WAAO,OAAO,OAAO,SAAS;AAAA,EAChC,CAAC;AAED,MAAI,YAAY,QAAQ,WAAW,aAAa;AAC9C,WAAO,EAAE,iBAAiB,SAAS,MAAM;AAAA,EAC3C;AAEA,MAAI,YAAY,QAAQ,WAAW,KAAK,0BAA0B,WAAW,GAAG;AAC9E,UAAME,IAAG,iBAAiB,EAAE,OAAO,KAAK,CAAC;AACzC,WAAO,EAAE,iBAAiB,SAAS,KAAK;AAAA,EAC1C;AAEA,QAAM,qBAAqB,iBAAiB,WAAW;AACvD,SAAO,EAAE,iBAAiB,SAAS,KAAK;AAC1C;AAEA,eAAsB,uBACpB,YACA,YAAoB,0BAA0B,UAAU,GACN;AAClD,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA,GAAG,qBAAqB,UAAU,CAAC;AAAA,EACrC;AACA,QAAM,WAAW,MAAM,iBAAiB,kBAAkB,UAAU;AAEpE,MAAI,CAAC,SAAS,QAAQ;AACpB,WAAO,EAAE,SAAS,OAAO,WAAW,iBAAiB;AAAA,EACvD;AAEA,MAAI,CAAC,SAAS,SAAS;AACrB,UAAM,IAAI;AAAA,MACR,GAAG,gBAAgB;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,oBAAoB,gBAAgB;AAC1C,QAAMA,IAAG,kBAAkB,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC3D,SAAO,EAAE,SAAS,MAAM,WAAW,iBAAiB;AACtD;AAEA,eAAsB,sCACpB,YACwB;AACxB,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,iBAAiB,eAAe,WAClC,OAAO,aAAa,kBACpB,OAAO,aAAa;AACxB,MAAI,gBAAgB;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,0BAA0B,UAAU;AAC1D,QAAM,SAAS,MAAM,iBAAiB,eAAe,UAAU;AAC/D,MAAI,OAAO,UAAU,OAAO,SAAS;AACnC,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,UAAU;AAC3B,WAAO,sCAAsC;AAAA,EAC/C;AAEA,SAAO;AACT;AAEA,eAAsB,uCAA+D;AACnF,QAAM,SAAS,MAAM,WAAW;AAChC,MAAI,OAAO,aAAa,sBAAsB;AAC5C,WAAO,OAAO,aAAa;AAAA,EAC7B;AAEA,QAAM,yBAAyB,0BAA0B;AACzD,SAAQ,MAAM,8BAA8B,sBAAsB,IAC9D,yBACA;AACN;AAEA,eAAsB,yBAAyB,YAAyC;AACtF,QAAM,sBAAsB,MAAM,sCAAsC,UAAU;AAElF,MAAI,eAAe,UAAU;AAC3B,WAAO,uBAAuB,0BAA0B,UAAU;AAAA,EACpE;AAEA,QAAM,uBAAuB,MAAM,8BAA8B;AACjE,QAAM,eAAe,0BAA0B,QAAQ;AAEvD,MAAI,qBAAqB;AACvB,WAAO,wBAAwB,gBAAgB,uBAC3C,qBAAqB,YACrB;AAAA,EACN;AAEA,SAAO,sBAAsB,aAAa;AAC5C;AAEA,eAAsB,2BAA4C;AAChE,QAAM,sBAAsB,MAAM,qCAAqC;AACvE,SAAO,uBAAuB,0BAA0B;AAC1D;AAEA,eAAsB,yBAA2C;AAC/D,SAAO,WAAWN,UAAQ,YAAY,GAAG,WAAW,CAAC;AACvD;AAMA,eAAsB,oBAAmC;AACvD,QAAMW,IAAG,YAAY,GAAG,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC1D;AAEA,eAAsB,0BAAkD;AACtE,MAAI,CAAE,MAAM,WAAWC,UAAQ,YAAY,GAAG,WAAW,CAAC,GAAI;AAC5D,WAAO;AAAA,EACT;AAEA,UAAQ,MAAM,WAAW,GAAG;AAC9B;AAEO,SAAS,qBAAqB,YAAgC;AACnE,SAAO,eAAe,WAAW,uBAAuB;AAC1D;AAEO,SAAS,wBAAwB,YAAgC;AACtE,SAAO,eAAe,WAClB,2BACA;AACN;;;AE1jCA,SAAS,SAAS,OAAO,UAAU,cAAc;AACjD,SAAS,uBAAuB;AAEzB,SAAS,wBAAiC;AAC/C,SAAO,QAAQ,MAAM,SAAS,OAAO,KAAK;AAC5C;AAEO,SAAS,mBACd,QACA,eAAwB,OACR;AAChB,QAAM,aAAa,OAAO,KAAK,EAAE,YAAY;AAC7C,MAAI,eAAe,IAAI;AACrB,WAAO;AAAA,EACT;AACA,MAAI,eAAe,OAAO,eAAe,OAAO;AAC9C,WAAO;AAAA,EACT;AACA,MAAI,eAAe,OAAO,eAAe,MAAM;AAC7C,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,eAAsB,cACpB,UACA,eAAwB,OACN;AAClB,MAAI,CAAC,sBAAsB,GAAG;AAC5B,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AAEA,QAAM,SAAS,eAAe,YAAY;AAC1C,QAAM,KAAK,gBAAgB,EAAE,OAAO,OAAO,CAAC;AAE5C,MAAI;AACF,WAAO,MAAM;AACX,YAAM,SAAS,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,EAAE;AACvD,YAAM,SAAS,mBAAmB,QAAQ,YAAY;AACtD,UAAI,WAAW,MAAM;AACnB,eAAO;AAAA,MACT;AACA,cAAQ,IAAI,sDAAsD;AAAA,IACpE;AAAA,EACF,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;AAEA,eAAsB,WACpB,UACA,cACiB;AACjB,MAAI,CAAC,sBAAsB,GAAG;AAC5B,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAEA,QAAM,SAAS,iBAAiB,SAAY,KAAK,YAAY,OAAO;AACpE,QAAM,KAAK,gBAAgB,EAAE,OAAO,OAAO,CAAC;AAE5C,MAAI;AACF,UAAM,UAAU,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,EAAE,GAAG,KAAK;AAChE,QAAI,WAAW,MAAM,iBAAiB,QAAW;AAC/C,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;;;AH/CA,eAAe,qBACb,UACA,iBACiB;AACjB,SAAO,MAAM;AACX,UAAM,SAAS,MAAM,WAAW,UAAU,eAAe;AACzD,QAAI;AACF,aAAO,6BAA6B,QAAQ,QAAQ;AAAA,IACtD,SAAS,OAAO;AACd,cAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACtE;AAAA,EACF;AACF;AAEA,eAAsB,qBACpB,SACe;AACf,QAAM,wBAAwB;AAAA,IAC5B,QAAQ,oBAAoB,SAC1B,sBAAsB,KACtB,CAAC,QAAQ;AAAA,EACb;AACA,QAAM,uBAAuB,MAAM,yBAAyB,QAAQ;AACpE,QAAM,YAAY,QAAQ,YACtB,6BAA6B,QAAQ,WAAW,sBAAsB,IACtE,wBACE,MAAM,qBAAqB,2BAA2B,oBAAoB,IAC1E;AAEN,QAAM,oBAAoB,MAAM,sCAAsC,QAAQ;AAC9E,QAAM,YAAY,QAAQ,qBAAqB,sBAAsB,SAAS;AAC9E,MAAI,kBAAkB,oBAClB,MAAM,mBAAmB,UAAU,iBAAiB,IACpD;AACJ,QAAM,sBAAsB,oBACxB,MAAM,iCAAiC,iBAAiB,IACxD;AACJ,QAAM,kBAAkB,0BAA0B,QAAQ;AAC1D,QAAM,gBAAgB,cAAc,kBAChC,MAAM,mBAAmB,UAAU,eAAe,IAClD;AAEJ,MAAI,aAAa,iBAAiB,UAAU,CAAC,gBAAgB,SAAS;AACpE,UAAM,IAAI;AAAA,MACR,GAAG,iBAAiB;AAAA,IACtB;AAAA,EACF;AAEA,MACE,cAAc,mBACd,eAAe,UACf,CAAC,cAAc,YACd,CAAC,qBAAqB,sBAAsB,kBAC7C;AACA,YAAQ;AAAA,MACN,YAAY,eAAe,0EAA0E,SAAS;AAAA,IAChH;AAAA,EACF;AAEA,MAAI,aAAa,iBAAiB,UAAU,gBAAgB,WAAW,sBAAsB,GAAG;AAC9F,UAAM,YAAY,MAAM;AAAA,MACtB,oCAAoC,iBAAiB,OAAO,SAAS;AAAA,MACrE;AAAA,IACF;AACA,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACtC;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,qBAAqB;AAAA,IACxC,YAAY;AAAA,IACZ,OAAO,QAAQ;AAAA,IACf,MAAM,QAAQ;AAAA,IACd;AAAA,EACF,CAAC;AACD,QAAM,qBAAqB,MAAM,iCAAiC,OAAO,SAAS;AAClF,MAAI,oBAAoB;AACtB,UAAM,6BAA6B;AAAA,MACjC,oBAAoB,mBAAmB;AAAA,MACvC,cAAc,mBAAmB;AAAA,MACjC,iBAAiB,OAAO;AAAA,MACxB,iCACE,uBAAuB,oBAAoB,iBAAiB,mBAAmB,eAC3E,oBACA;AAAA,IACR,CAAC;AAAA,EACH;AACA,QAAM,wBAAwB,EAAE,iBAAiB,OAAO,UAAU,CAAC;AAEnE,MACE,uBACA,sBACC,CAAC,sBAAsB,mBAAmB,iBAAiB,oBAAoB,eAChF;AACA,UAAM,0BAA0B,MAAM,6BAA6B;AAAA,MACjE,cAAc,oBAAoB;AAAA,MAClC,oBAAoB,oBAAoB;AAAA,MACxC,iBAAiB;AAAA,IACnB,CAAC;AACD,QAAI,wBAAwB,SAAS;AACnC,cAAQ,IAAI,kDAAkD,wBAAwB,YAAY,EAAE;AAAA,IACtG;AAAA,EACF;AAEA,MAAI,aAAa,iBAAiB,UAAU,gBAAgB,WAAW,mBAAmB;AACxF,UAAM,UAAU,MAAM,uBAAuB,UAAU,iBAAiB;AACxE,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,4CAA4C,QAAQ,SAAS,EAAE;AAAA,IAC7E;AACA,sBAAkB;AAAA,EACpB;AAEA,UAAQ,IAAI,2BAA2B;AACvC,UAAQ,IAAI,aAAa,OAAO,SAAS,EAAE;AAC3C,UAAQ,IAAI,aAAa,OAAO,SAAS,EAAE;AAC3C,UAAQ,IAAI,WAAW,OAAO,IAAI,EAAE;AACpC,MAAI,oBAAoB;AACtB,YAAQ,IAAI,kBAAkB,mBAAmB,YAAY,EAAE;AAAA,EACjE;AACA,UAAQ,IAAI,+CAA+C;AAC3D,UAAQ,IAAI,oEAAoE;AAChF,UAAQ,IAAI,+CAA+C;AAC3D,UAAQ,IAAI,iDAAiD;AAC/D;;;AIjJAC;AAwBA,eAAeC,sBACb,UACA,iBACiB;AACjB,SAAO,MAAM;AACX,UAAM,SAAS,MAAM,WAAW,UAAU,eAAe;AACzD,QAAI;AACF,aAAO,6BAA6B,QAAQ,QAAQ;AAAA,IACtD,SAAS,OAAO;AACd,cAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACtE;AAAA,EACF;AACF;AAEA,eAAsB,0BACpB,SACe;AACf,QAAM,kBAAkB;AAAA,IACtB,QAAQ,oBAAoB,SAC1B,sBAAsB,MACrB,CAAC,QAAQ,aAAa,CAAC,QAAQ;AAAA,EACpC;AACA,QAAM,uBAAuB,MAAM,yBAAyB,OAAO;AACnE,QAAM,6BAA6B,MAAM,yBAAyB;AAClE,QAAM,YAAY,QAAQ,YACtB,6BAA6B,QAAQ,WAAW,qBAAqB,IACrE,kBACE,MAAMA,sBAAqB,0BAA0B,oBAAoB,IACzE;AACN,QAAM,kBAAkB,QAAQ,kBAC5B,6BAA6B,QAAQ,iBAAiB,wBAAwB,IAC9E,kBACE,MAAMA,sBAAqB,+BAA+B,0BAA0B,IACpF;AAEN,QAAM,oBAAoB,MAAM,sCAAsC,OAAO;AAC7E,QAAM,0BAA0B,MAAM,qCAAqC;AAC3E,QAAM,oBAAoB,QAAQ,qBAAqB,sBAAsB,SAAS;AACtF,QAAM,yBAAyB;AAAA,IAC7B,2BAA2B,4BAA4B;AAAA,EACzD;AACA,QAAM,kBAAkB,oBACpB,MAAM,mBAAmB,SAAS,iBAAiB,IACnD;AACJ,QAAM,iCAAiC;AAAA,IACrC,2BACE,qBACA,MAAM,2BAA2B,yBAAyB,iBAAiB;AAAA,EAC/E;AAEA,MAAI,qBAAqB,iBAAiB,UAAU,CAAC,gBAAgB,SAAS;AAC5E,UAAM,IAAI;AAAA,MACR,GAAG,iBAAiB;AAAA,IACtB;AAAA,EACF;AAEA,OACG,qBAAqB,4BACrB,iBAAiB,UAAU,mCAC5B,sBAAsB,GACtB;AACA,UAAM,YAAY,MAAM;AAAA,MACtB,iCAAiC,SAAS,QAAQ,eAAe;AAAA,MACjE;AAAA,IACF;AACA,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACtC;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,qBAAqB;AAAA,IACxC,YAAY;AAAA,IACZ,OAAO,QAAQ;AAAA,IACf,MAAM,QAAQ;AAAA,IACd;AAAA,EACF,CAAC;AACD,QAAM,cAAc,MAAM,uBAAuB;AAAA,IAC/C;AAAA,IACA,iBAAiB,OAAO;AAAA,IACxB,iCACE,4BAA4B,kBAAkB,oBAAoB;AAAA,EACtE,CAAC;AACD,QAAM,wBAAwB;AAAA,IAC5B,gBAAgB,OAAO;AAAA,IACvB,sBAAsB,YAAY;AAAA,EACpC,CAAC;AAED,MAAI,qBAAqB,iBAAiB,UAAU,gBAAgB,WAAW,mBAAmB;AAChG,UAAM,UAAU,MAAM,uBAAuB,SAAS,iBAAiB;AACvE,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,sCAAsC,QAAQ,SAAS,EAAE;AAAA,IACvE;AAAA,EACF;AAEA,MACE,2BACA,qBACA,4BAA4B,YAAY,iBACxC;AACA,UAAM,qBAAqB,MAAM,uBAAuB;AAAA,MACtD,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB,CAAC;AACD,QAAI,mBAAmB,SAAS;AAC9B,cAAQ,IAAI,iDAAiD,mBAAmB,eAAe,EAAE;AAAA,IACnG;AAAA,EACF;AAEA,UAAQ,IAAI,iCAAiC;AAC7C,UAAQ,IAAI,aAAa,OAAO,SAAS,EAAE;AAC3C,UAAQ,IAAI,aAAa,OAAO,SAAS,EAAE;AAC3C,UAAQ,IAAI,WAAW,OAAO,IAAI,EAAE;AACpC,UAAQ,IAAI,kBAAkB,YAAY,eAAe,EAAE;AAC3D,UAAQ,IAAI,yCAAyC;AACrD,UAAQ;AAAA,IACN;AAAA,EACF;AACA,UAAQ,IAAI,2BAA2B;AACvC,UAAQ,IAAI,sDAAsD;AACpE;;;AC/IA,SAAS,gBAAgB;AAOzBC;AAEA,SAAS,eAAe,SAA0B;AAChD,MAAI;AACF,aAAS,SAAS,OAAO,IAAI,EAAE,OAAO,SAAS,CAAC;AAChD,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAYA,SAAS,+BAAqC;AAC5C,UAAQ,MAAM,+EAA+E;AAC7F,UAAQ,MAAM,oCAAoC;AAClD,UAAQ,MAAM,kCAAkC;AAChD,UAAQ,MAAM,2CAA2C;AACzD,UAAQ,MAAM,0CAA0C;AACxD,UAAQ,MAAM,8CAA8C;AAC9D;AAEA,eAAsB,aAAa,SAAsC;AACvE,QAAM,cAAc,MAAM,uBAAuB;AACjD,QAAM,cAAc,sBAAsB;AAE1C,MAAI,CAAC,aAAa;AAChB,QAAI,CAAC,eAAe,CAAC,QAAQ,OAAO,CAAC,QAAQ,UAAU,CAAC,QAAQ,SAAS,CAAC,QAAQ,WAAW;AAC3F,mCAA6B;AAC7B,YAAM,IAAI,MAAM,wEAAwE;AAAA,IAC1F;AAEA,UAAM,YAAY,CAAC,CAAC;AAAA,EACtB,OAAO;AACL,YAAQ,IAAI,iCAAiC;AAAA,EAC/C;AAEA,MAAI,gBAAgB,QAAQ,QAAQ,MAAM;AAC1C,MAAI,eAAe,QAAQ,QAAQ,KAAK;AACxC,MAAI,kBAAkB,QAAQ,QAAQ,SAAS;AAE/C,MAAI,eAAe,CAAC,QAAQ,KAAK;AAC/B,QAAI,CAAC,QAAQ,QAAQ;AACnB,YAAM,kBAAkB,eAAe,QAAQ;AAC/C,UAAI,CAAC,iBAAiB;AACpB,gBAAQ,IAAI,0EAA0E;AACtF,wBAAgB,MAAM,cAAc,0CAA0C,KAAK;AAAA,MACrF,OAAO;AACL,wBAAgB,MAAM,cAAc,iCAAiC;AAAA,MACvE;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,OAAO;AAClB,YAAM,iBAAiB,eAAe,OAAO;AAC7C,UAAI,CAAC,gBAAgB;AACnB,gBAAQ,IAAI,gFAAgF;AAC5F,uBAAe,MAAM,cAAc,oCAAoC,KAAK;AAAA,MAC9E,OAAO;AACL,uBAAe,MAAM,cAAc,2BAA2B;AAAA,MAChE;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,WAAW;AACtB,wBAAkB,MAAM,cAAc,6BAA6B,IAAI;AAAA,IACzE;AAAA,EACF;AAEA,MAAI,eAAe;AACjB,UAAM,qBAAqB;AAAA,MACzB,WAAW,QAAQ;AAAA,MACnB,iBAAiB,CAAC,QAAQ;AAAA,IAC5B,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,IAAI,mDAAmD,wBAAwB,QAAQ,CAAC,EAAE;AAAA,EACpG;AAEA,MAAI,cAAc;AAChB,UAAM,0BAA0B;AAAA,MAC9B,WAAW,QAAQ;AAAA,MACnB,iBAAiB,QAAQ;AAAA,MACzB,iBAAiB,CAAC,QAAQ;AAAA,IAC5B,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,IAAI,kDAAkD,wBAAwB,OAAO,CAAC,EAAE;AAAA,EAClG;AAEA,MAAI,iBAAiB;AACnB,UAAM,gBAAgB;AACtB,UAAM,OAAO,MAAM,kBAAkB,aAAa;AAClD,QAAI,SAAS,MAAM;AACjB,YAAM,IAAI;AAAA,QACR,0DAA0D,aAAa;AAAA,MACzE;AAAA,IACF;AACA,QAAI,SAAS,eAAe;AAC1B,cAAQ,IAAI,QAAQ,aAAa,6CAA6C,IAAI,WAAW;AAAA,IAC/F;AACA,UAAM,uBAAuB,EAAE,WAAW,KAAK,CAAC;AAChD,UAAM,iBAAiB;AAAA,MACrB,MAAM,OAAO,IAAI;AAAA,MACjB,KAAK;AAAA,MACL,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AACD;AAAA,EACF;AAEA,QAAM,uBAAuB,EAAE,WAAW,KAAK,CAAC;AAEhD,MAAI,CAAC,aAAa;AAChB,YAAQ,IAAI,eAAe;AAC3B,YAAQ,IAAI,wDAAwD;AACpE,YAAQ,IAAI,gCAAgC;AAAA,EAC9C;AACF;;;AChIA,SAAS,WAAAC,iBAAe;AAWxB;AAWA,SAAS,cAAc,SAIrB;AACA,MAAI,QAAQ,KAAK;AACf,WAAO,EAAE,QAAQ,MAAM,OAAO,MAAM,MAAM,KAAK;AAAA,EACjD;AAEA,MAAI,QAAQ,UAAU,QAAQ,SAAS,QAAQ,MAAM;AACnD,WAAO;AAAA,MACL,QAAQ,QAAQ,QAAQ,MAAM;AAAA,MAC9B,OAAO,QAAQ,QAAQ,KAAK;AAAA,MAC5B,MAAM,QAAQ,QAAQ,IAAI;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,MAAM,OAAO,MAAM,MAAM,MAAM;AAClD;AAEA,eAAsB,iBAAiB,SAA0C;AAC/E,QAAM,UAAU,cAAc,OAAO;AACrC,QAAM,UAAoB,CAAC;AAE3B,MAAI,QAAQ,OAAQ,SAAQ,KAAK,oBAAoB;AACrD,MAAI,QAAQ,MAAO,SAAQ,KAAK,cAAc;AAC9C,MAAI,QAAQ,KAAM,SAAQ,KAAK,iBAAiB;AAEhD,MAAI,QAAQ,WAAW,GAAG;AACxB,YAAQ,IAAI,iCAAiC;AAC7C;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,KAAK;AAChB,UAAM,YAAY,MAAM;AAAA,MACtB,WAAW,QAAQ,KAAK,IAAI,CAAC;AAAA,MAC7B;AAAA,IACF;AACA,QAAI,CAAC,WAAW;AACd,cAAQ,IAAI,sBAAsB;AAClC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ;AAClB,UAAM,kBAAkB,MAAM,sCAAsC,QAAQ;AAC5E,UAAM,oBAAoB,kBACtB,MAAM,iCAAiC,eAAe,IACtD;AACJ,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,mBAAmB;AAAA,IACrB;AACA,YAAQ;AAAA,MACN,OAAO,UACH,mCAAmC,OAAO,SAAS,KACnD,uCAAuC,OAAO,SAAS;AAAA,IAC7D;AACA,QAAI,mBAAmB;AACrB,YAAM,0BAA0B,MAAM,6BAA6B;AAAA,QACjE,cAAc,kBAAkB;AAAA,QAChC,oBAAoB,kBAAkB;AAAA,QACtC,iBAAiB,mBAAmB;AAAA,MACtC,CAAC;AACD,UAAI,wBAAwB,SAAS;AACnC,gBAAQ,IAAI,yCAAyC,wBAAwB,YAAY,EAAE;AAAA,MAC7F;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,OAAO;AACjB,UAAM,iBAAiB,MAAM,sCAAsC,OAAO;AAC1E,UAAM,kBAAkB,MAAM,qCAAqC;AACnE,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,kBAAkB;AAAA,IACpB;AACA,YAAQ;AAAA,MACN,OAAO,UACH,6BAA6B,OAAO,SAAS,KAC7C,iCAAiC,OAAO,SAAS;AAAA,IACvD;AAEA,QAAI,iBAAiB;AACnB,YAAM,cAAc,MAAM,uBAAuB;AAAA,QAC/C;AAAA,QACA,iBAAiB,kBAAkB;AAAA,MACrC,CAAC;AACD,UAAI,YAAY,SAAS;AACvB,gBAAQ,IAAI,wCAAwC,YAAY,eAAe,EAAE;AAAA,MACnF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,MAAM;AAChB,UAAM,uBAAuB,MAAM,wBAAwB;AAC3D,UAAM,kBAAkB;AACxB,YAAQ,IAAI,WAAW,YAAY,CAAC,EAAE;AAEtC,QACE,wBACAC,UAAQ,oBAAoB,MAAMA,UAAQ,YAAY,GAAG,UAAU,GACnE;AACA,cAAQ;AAAA,QACN,gEAAgE,oBAAoB;AAAA,MACtF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,MAAM;AACjB,YAAQ,IAAI,2CAA2C;AAAA,EACzD;AACF;;;ACrIA;AACA;AACAC;AAHA,SAAS,WAAAC,iBAAe;AASxB,IAAM,uBAAuB,CAAC,UAAU,SAAS,UAAU;AAU3D,eAAsB,oBACpB,WACA,SACe;AAEf,MAAI,CAAC,qBAAqB,SAAS,SAAsB,GAAG;AAC1D,UAAM,IAAI;AAAA,MACR,0BAA0B,SAAS,iBAAiB,qBAAqB,KAAK,IAAI,CAAC;AAAA,IACrF;AAAA,EACF;AAGA,MAAI,CAAC,QAAQ,SAAS;AACpB,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AACA,MAAI,CAAC,QAAQ,YAAY;AACvB,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AACA,MAAI,CAAC,YAAY,QAAQ,OAAO,GAAG;AACjC,UAAM,IAAI;AAAA,MACR,yBAAyB,QAAQ,OAAO;AAAA,IAC1C;AAAA,EACF;AACA,MAAI,CAAC,YAAY,QAAQ,UAAU,GAAG;AACpC,UAAM,IAAI;AAAA,MACR,4BAA4B,QAAQ,UAAU;AAAA,IAChD;AAAA,EACF;AAGA,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,UAAU,QAAQ,MACpB,WAAW,QAAQ,GAAG,IACtB,OAAO;AACX,QAAM,aAAaC,UAAQ,SAAS,QAAQ,OAAO;AACnD,QAAM,gBAAgBA;AAAA,IACpB;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AAGA,QAAM,gBAAgBA,UAAQ,YAAY,YAAY;AACtD,MAAI,CAAE,MAAM,WAAW,UAAU,KAAM,CAAE,MAAM,WAAW,aAAa,GAAI;AACzE,UAAM,IAAI;AAAA,MACR,YAAY,QAAQ,OAAO,kBAAkB,UAAU;AAAA,IACzD;AAAA,EACF;AAGA,QAAM,mBAAmBA,UAAQ,eAAe,eAAe;AAC/D,MAAI,CAAE,MAAM,WAAW,aAAa,KAAM,CAAE,MAAM,WAAW,gBAAgB,GAAI;AAC/E,UAAM,IAAI;AAAA,MACR,eAAe,QAAQ,UAAU,kBAAkB,aAAa;AAAA,IAClE;AAAA,EACF;AAEA,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,eAAyB,CAAC;AAChC,QAAM,eAAyB,CAAC;AAEhC,QAAM,iBAAiB;AAAA,IACrB,aAAa,QAAQ;AAAA,IACrB,gBAAgB,QAAQ;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AAEA,iBAAe,iBAAiB,UAAkB,SAAgC;AAChF,QAAI,QAAQ,OAAO;AACjB,YAAM,eAAe,UAAU,OAAO;AACtC,mBAAa,KAAK,QAAQ;AAAA,IAC5B,OAAO;AACL,UAAI,MAAM,cAAc,UAAU,OAAO,GAAG;AAC1C,qBAAa,KAAK,QAAQ;AAAA,MAC5B,OAAO;AACL,qBAAa,KAAK,QAAQ;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,cAAc,UAAU;AAC1B,UAAM,eAAeA,UAAQ,KAAK,WAAW,SAAS,sBAAsB;AAC5E,UAAM,iBAAiBA,UAAQ,KAAK,WAAW,SAAS,wBAAwB;AAEhF,UAAM,iBAAiB,cAAc,qBAAqB,CAAC;AAC3D,UAAM,iBAAiB,gBAAgB,uBAAuB,cAAc,CAAC;AAAA,EAC/E,WAAW,cAAc,WAAW,cAAc,YAAY;AAC5D,UAAM,aAAaA,UAAQ,KAAK,WAAW;AAC3C,UAAM,iBAAiB,YAAY,kBAAkB,cAAc,CAAC;AAEpE,QAAI,cAAc,YAAY;AAC5B,YAAM,aAAaA,UAAQ,KAAK,eAAe;AAC/C,YAAM,iBAAiB,YAAY,qBAAqB,EAAE,WAAW,CAAC,CAAC;AAAA,IACzE;AAAA,EACF;AAGA,MAAI,aAAa,SAAS,GAAG;AAC3B,YAAQ,IAAI,aAAa,SAAS,iBAAiB;AACnD,eAAW,KAAK,cAAc;AAC5B,cAAQ,IAAI,KAAK,CAAC,EAAE;AAAA,IACtB;AAAA,EACF;AACA,MAAI,aAAa,SAAS,GAAG;AAC3B,YAAQ,IAAI,oDAAoD;AAChE,eAAW,KAAK,cAAc;AAC5B,cAAQ,IAAI,KAAK,CAAC,EAAE;AAAA,IACtB;AAAA,EACF;AACA,MAAI,aAAa,WAAW,KAAK,aAAa,SAAS,GAAG;AACxD,YAAQ,IAAI,mDAAmD;AAAA,EACjE;AACF;;;ACnIA;AACA;AACAC;AAHA,SAAS,WAAAC,iBAAe;AAmBxB,eAAsB,oBACpB,SACe;AACf,MAAI,CAAC,QAAQ,OAAO;AAClB,UAAM,IAAI,MAAM,6BAA6B;AAAA,EAC/C;AAEA,MAAI,CAAC,QAAQ,WAAW;AACtB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS;AACnB,UAAM,SAAS,MAAM,WAAW;AAChC,UAAM,UAAU,QAAQ,MACpB,WAAW,QAAQ,GAAG,IACtB,OAAO;AACX,UAAM,aAAaC,UAAQ,SAAS,QAAQ,OAAO;AAEnD,QAAI,CAAE,MAAM,WAAW,UAAU,GAAI;AACnC,YAAM,IAAI;AAAA,QACR,YAAY,QAAQ,OAAO,kBAAkB,UAAU;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAEA,gBAAc;AAEd,QAAM,EAAE,UAAU,IAAI;AAEtB,QAAM,cAAc,IAAI;AAAA,IACtB,aAAa,QAAQ,WAAW;AAAA,IAChC,gBAAgB,QAAQ,cAAc;AAAA,IACtC,OAAO,QAAQ;AAAA,IACf;AAAA,IACA,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,IAChC,QAAQ;AAAA,IACR,MAAM,QAAQ,QAAQ,QAAQ,IAAI;AAAA,IAClC,aAAa,QAAQ,eAAe;AAAA,IACpC,gBAAgB,QAAQ,kBAAkB;AAAA,EAC5C,CAAC;AAED,MAAI,QAAQ,WAAW,QAAQ,YAAY;AACzC,YAAQ;AAAA,MACN,4BAA4B,SAAS,QAAQ,QAAQ,UAAU,OAAO,QAAQ,OAAO;AAAA,IACvF;AAAA,EACF,OAAO;AACL,YAAQ,IAAI,uCAAuC,SAAS,GAAG;AAAA,EACjE;AACF;;;ACrEAC;AAGA,eAAsB,cAAc,SAA8C;AAChF,QAAM,SAAS,MAAM,WAAW;AAChC,QAAMC,eAAc,OAAO;AAC3B,QAAM,QAAQ,QAAQ;AAEtB,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,KAAK;AACrC,QAAMC,SAAQ,MAAM,OAAO,OAAO;AAClC,QAAM,EAAE,KAAAC,KAAI,IAAI,MAAM;AACtB,QAAM,EAAE,aAAAC,aAAY,IAAI,MAAM;AAE9B,MAAI,UAA+B;AAEnC,QAAM,WAAW,OAAO,eAAqF;AAC3G,QAAI,SAAS;AACX,cAAQ;AACR,gBAAU;AAAA,IACZ;AACA,UAAMA,aAAY,EAAE,GAAG,YAAY,MAAM,CAAC;AAAA,EAC5C;AAEA,QAAM,WAAW;AAAA,IACfF,OAAM,cAAcC,MAAK,EAAE,aAAAF,cAAa,SAAS,CAAC;AAAA,EACpD;AACA,YAAU,SAAS;AAEnB,QAAM,SAAS,cAAc;AAC/B;;;AC7BA,SAAS,WAAAI,iBAAe;AAExB;AACA;AACA;AASA,eAAsB,sBACpB,MACA,SACiB;AACjB,MAAI,CAAC,KAAK,KAAK,GAAG;AAChB,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AAEA,QAAM,OAAO,QAAQ,QAAQ,QAAQ,IAAI;AACzC,MAAI,CAAC,YAAY,IAAI,GAAG;AACtB,UAAM,IAAI;AAAA,MACR,iBAAiB,IAAI;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,MAAM,aAAgB;AAC5B,QAAM,UAAU,GAAG;AAEnB,QAAM,WAAWC,UAAQ,KAAK,GAAG,IAAI,KAAK;AAC1C,MAAI,MAAM,WAAW,QAAQ,GAAG;AAC9B,UAAM,IAAI;AAAA,MACR,aAAa,IAAI,uBAAuB,QAAQ;AAAA;AAAA,IAClD;AAAA,EACF;AAEA,QAAM,YAAY,aAAa;AAC/B,QAAM,cAAc,QAAQ,eAAe;AAE3C,QAAM,UAAU,eAAe,EAAE,MAAM,MAAM,aAAa,UAAU,CAAC;AACrE,QAAM,cAAc,UAAU,OAAO;AACrC,QAAM,wBAAwB,GAAG;AAEjC,UAAQ,IAAI,qBAAqB,IAAI,QAAQ,QAAQ,EAAE;AACvD,UAAQ,IAAI,WAAW,IAAI,EAAE;AAE7B,SAAO;AACT;;;AC/CA;AACA;AACA;AAJA,SAAS,WAAAC,WAAS,YAAAC,kBAAgB;AAClC,SAAS,WAAAC,iBAAe;AAKxB,eAAsB,uBAAsC;AAC1D,QAAM,MAAM,aAAgB;AAE5B,MAAI,CAAE,MAAM,WAAW,GAAG,GAAI;AAC5B,YAAQ,IAAI,yDAAyD;AACrE;AAAA,EACF;AAEA,QAAM,UAAU,MAAMF,UAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAC1D,QAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,KAAK,SAAS,KAAK,KAAK,CAAC,EAAE,KAAK,WAAW,GAAG,KAAK,EAAE,SAAS,aAAa;AAEjI,MAAI,QAAQ,WAAW,GAAG;AACxB,YAAQ,IAAI,uEAAuE;AACnF;AAAA,EACF;AAEA,UAAQ,IAAI,SAAS,QAAQ,MAAM;AAAA,CAAiB;AACpD,UAAQ,IAAI,GAAG,OAAO,OAAO,EAAE,CAAC,IAAI,OAAO,OAAO,EAAE,CAAC,cAAc;AACnE,UAAQ,IAAI,GAAG,SAAI,OAAO,EAAE,CAAC,IAAI,SAAI,OAAO,EAAE,CAAC,IAAI,SAAI,OAAO,EAAE,CAAC,EAAE;AAEnE,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAWE,UAAQ,KAAK,MAAM,IAAI;AACxC,UAAM,MAAM,MAAMD,WAAS,UAAU,OAAO;AAC5C,UAAM,SAAS,cAAc,GAAG;AAEhC,UAAM,OAAO,OAAO,QAAQ,MAAM,KAAK,QAAQ,SAAS,EAAE;AAC1D,UAAM,OAAO,OAAO,QAAQ;AAC5B,UAAM,OAAO,OAAO,eAAe;AAEnC,YAAQ,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC,IAAI,IAAI,EAAE;AAAA,EAC7D;AACF;;;AClCA;AACAE;AAWA;AAfA,SAAS,eAAe;AACxB,SAAS,YAAAC,kBAAgB;AACzB,SAAS,WAAAC,iBAAe;AAgBxB,IAAMC,mBAAkB;AAExB,SAAS,iBAAiB,SAA2D;AACnF,MAAI,QAAQ,OAAQ,QAAO;AAC3B,MAAI,QAAQ,WAAW;AACrB,QAAI,CAACA,iBAAgB,KAAK,QAAQ,SAAS,GAAG;AAC5C,YAAM,IAAI,MAAM,4BAA4B,QAAQ,SAAS,8DAA8D;AAAA,IAC7H;AACA,WAAO,QAAQ;AAAA,EACjB;AACA,SAAO;AACT;AAEA,SAAS,SAAiB;AACxB,UAAO,oBAAI,KAAK,GAAE,YAAY;AAChC;AAEO,IAAM,cAAc,IAAI,QAAQ,MAAM,EAC1C,YAAY,oBAAoB;AAEnC,YACG,QAAQ,KAAK,EACb,YAAY,qBAAqB,EACjC,SAAS,iBAAiB,kBAAkB,EAC5C,OAAO,iBAAiB,sBAAsB,EAC9C,OAAO,sBAAsB,gBAAgB,EAC7C,OAAO,YAAY,kBAAkB,EACrC,OAAO,OAAO,aAAqB,YAAY;AAC9C,MAAI;AACF,UAAM,YAAY,SAAY;AAC9B,UAAM,YAAY,iBAAiB,OAAO;AAC1C,UAAM,YAAY,MAAM,cAAc,WAAW,SAAS;AAC1D,UAAM,cAAc,IAAI,IAAI,UAAU,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC5D,UAAM,KAAK,iBAAiB,WAAW;AACvC,UAAM,OAAO,QAAQ,OAAO,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC,IAAI,CAAC;AAEpF,UAAM,OAAiB,EAAE,IAAI,aAAa,QAAQ,QAAQ,MAAM,SAAS,KAAK;AAC9E,cAAU,MAAM,KAAK,IAAI;AACzB,UAAM,eAAe,WAAW,SAAS;AACzC,YAAQ,IAAI,iBAAiB,EAAE,MAAM,WAAW,EAAE;AAAA,EACpD,SAAS,OAAO;AACd,YAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,YACG,QAAQ,MAAM,EACd,YAAY,iBAAiB,EAC7B,OAAO,eAAe,eAAe,EACrC,OAAO,qBAAqB,uDAAuD,EACnF,OAAO,sBAAsB,gBAAgB,EAC7C,OAAO,YAAY,kBAAkB,EACrC,OAAO,OAAO,YAAY;AACzB,MAAI;AACF,UAAM,YAAY,SAAY;AAC9B,UAAM,YAAY,iBAAiB,OAAO;AAC1C,UAAM,YAAY,MAAM,cAAc,WAAW,SAAS;AAC1D,QAAI,QAAQ,UAAU;AAEtB,QAAI,QAAQ,KAAK;AACf,cAAQ,MAAM,OAAO,CAAC,MAAM,EAAE,KAAK,SAAS,QAAQ,GAAG,CAAC;AAAA,IAC1D;AACA,QAAI,QAAQ,QAAQ;AAClB,cAAQ,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,MAAM;AAAA,IACzD;AAEA,QAAI,MAAM,WAAW,GAAG;AACtB,cAAQ,IAAI,iBAAiB;AAC7B;AAAA,IACF;AAEA,UAAM,cAAsC;AAAA,MAC1C,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,MACX,SAAS;AAAA,IACX;AAEA,eAAW,QAAQ,OAAO;AACxB,YAAM,OAAO,YAAY,KAAK,MAAM,KAAK;AACzC,YAAM,SAAS,KAAK,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,KAAK;AACtF,cAAQ,IAAI,GAAG,IAAI,IAAI,KAAK,WAAW,GAAG,MAAM,OAAO,KAAK,EAAE,GAAG;AAAA,IACnE;AAEA,UAAM,SAAS,cAAc,KAAK;AAClC,YAAQ,IAAI;AAAA,EAAK,OAAO,KAAK,WAAW,OAAO,IAAI,UAAU,OAAO,WAAW,YAAY,OAAO,SAAS,UAAU,OAAO,OAAO,UAAU;AAAA,EAC/I,SAAS,OAAO;AACd,YAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,SAAS,SAAS,OAAmB,IAAkC;AACrE,SAAO,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACtC;AAEA,YACG,QAAQ,OAAO,EACf,YAAY,4BAA4B,EACxC,SAAS,QAAQ,2BAA2B,EAC5C,OAAO,uBAAuB,YAAY,EAC1C,OAAO,sBAAsB,gBAAgB,EAC7C,OAAO,YAAY,kBAAkB,EACrC,OAAO,OAAO,IAAY,YAAY;AACrC,MAAI;AACF,UAAM,YAAY,SAAY;AAC9B,UAAM,YAAY,iBAAiB,OAAO;AAC1C,UAAM,YAAY,MAAM,cAAc,WAAW,SAAS;AAC1D,UAAM,OAAO,SAAS,UAAU,OAAO,EAAE;AACzC,QAAI,CAAC,MAAM;AACT,cAAQ,MAAM,WAAW,EAAE,cAAc;AACzC,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI,KAAK,WAAW,eAAe;AACjC,cAAQ,MAAM,WAAW,EAAE,sCAAsC,KAAK,OAAO,IAAI;AACjF,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,SAAK,SAAS;AACd,SAAK,UAAU,QAAQ,WAAW;AAClC,UAAM,eAAe,WAAW,SAAS;AACzC,YAAQ,IAAI,cAAc,EAAE,MAAM,KAAK,WAAW,EAAE;AAAA,EACtD,SAAS,OAAO;AACd,YAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,YACG,QAAQ,UAAU,EAClB,YAAY,0BAA0B,EACtC,SAAS,QAAQ,eAAe,EAChC,OAAO,uBAAuB,oBAAoB,EAClD,OAAO,qBAAqB,iBAAiB,EAC7C,OAAO,uBAAuB,YAAY,EAC1C,OAAO,sBAAsB,gBAAgB,EAC7C,OAAO,YAAY,kBAAkB,EACrC,OAAO,OAAO,IAAY,YAAY;AACrC,MAAI;AACF,UAAM,YAAY,SAAY;AAC9B,UAAM,YAAY,iBAAiB,OAAO;AAC1C,UAAM,YAAY,MAAM,cAAc,WAAW,SAAS;AAC1D,UAAM,OAAO,SAAS,UAAU,OAAO,EAAE;AACzC,QAAI,CAAC,MAAM;AACT,cAAQ,MAAM,WAAW,EAAE,cAAc;AACzC,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,SAAK,SAAS;AACd,SAAK,UAAU;AACf,UAAM,eAAe,WAAW,SAAS;AAEzC,UAAM,QAAkB;AAAA,MACtB,WAAW,OAAO;AAAA,MAClB,SAAS,CAAC,EAAE;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,SAAS,QAAQ,WAAW;AAAA,MAC5B,QAAQ,QAAQ,UAAU;AAAA,MAC1B,SAAS,QAAQ,WAAW;AAAA,MAC5B,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AACA,UAAMC,gBAAe,WAAW,WAAW,KAAK;AAChD,YAAQ,IAAI,gBAAgB,EAAE,MAAM,KAAK,WAAW,EAAE;AAAA,EACxD,SAAS,OAAO;AACd,YAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,YACG,QAAQ,OAAO,EACf,YAAY,wBAAwB,EACpC,SAAS,QAAQ,eAAe,EAChC,eAAe,qBAAqB,iBAAiB,EACrD,OAAO,uBAAuB,YAAY,EAC1C,OAAO,sBAAsB,gBAAgB,EAC7C,OAAO,YAAY,kBAAkB,EACrC,OAAO,OAAO,IAAY,YAAY;AACrC,MAAI;AACF,UAAM,YAAY,SAAY;AAC9B,UAAM,YAAY,iBAAiB,OAAO;AAC1C,UAAM,YAAY,MAAM,cAAc,WAAW,SAAS;AAC1D,UAAM,OAAO,SAAS,UAAU,OAAO,EAAE;AACzC,QAAI,CAAC,MAAM;AACT,cAAQ,MAAM,WAAW,EAAE,cAAc;AACzC,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,SAAK,SAAS;AACd,SAAK,UAAU;AACf,UAAM,eAAe,WAAW,SAAS;AAEzC,UAAM,QAAkB;AAAA,MACtB,WAAW,OAAO;AAAA,MAClB,SAAS,CAAC,EAAE;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,SAAS,QAAQ,WAAW;AAAA,MAC5B,QAAQ;AAAA,MACR,SAAS,QAAQ;AAAA,MACjB,UAAU,QAAQ;AAAA,MAClB,QAAQ;AAAA,IACV;AACA,UAAMA,gBAAe,WAAW,WAAW,KAAK;AAChD,YAAQ,IAAI,cAAc,EAAE,MAAM,KAAK,WAAW,EAAE;AAAA,EACtD,SAAS,OAAO;AACd,YAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,YACG,QAAQ,SAAS,EACjB,YAAY,+BAA+B,EAC3C,SAAS,QAAQ,eAAe,EAChC,OAAO,sBAAsB,gBAAgB,EAC7C,OAAO,YAAY,kBAAkB,EACrC,OAAO,OAAO,IAAY,YAAY;AACrC,MAAI;AACF,UAAM,YAAY,SAAY;AAC9B,UAAM,YAAY,iBAAiB,OAAO;AAC1C,UAAM,YAAY,MAAM,cAAc,WAAW,SAAS;AAC1D,UAAM,OAAO,SAAS,UAAU,OAAO,EAAE;AACzC,QAAI,CAAC,MAAM;AACT,cAAQ,MAAM,WAAW,EAAE,cAAc;AACzC,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,SAAK,SAAS;AACd,SAAK,UAAU;AACf,UAAM,eAAe,WAAW,SAAS;AACzC,YAAQ,IAAI,gBAAgB,EAAE,MAAM,KAAK,WAAW,EAAE;AAAA,EACxD,SAAS,OAAO;AACd,YAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,YACG,QAAQ,QAAQ,EAChB,YAAY,mCAAmC,EAC/C,SAAS,QAAQ,eAAe,EAChC,OAAO,sBAAsB,gBAAgB,EAC7C,OAAO,YAAY,kBAAkB,EACrC,OAAO,OAAO,IAAY,YAAY;AACrC,MAAI;AACF,UAAM,YAAY,SAAY;AAC9B,UAAM,YAAY,iBAAiB,OAAO;AAC1C,UAAM,YAAY,MAAM,cAAc,WAAW,SAAS;AAC1D,UAAM,MAAM,UAAU,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;AACxD,QAAI,QAAQ,IAAI;AACd,cAAQ,MAAM,WAAW,EAAE,cAAc;AACzC,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,OAAO,UAAU,MAAM,GAAG;AAChC,cAAU,MAAM,OAAO,KAAK,CAAC;AAC7B,UAAM,eAAe,WAAW,SAAS;AACzC,YAAQ,IAAI,cAAc,EAAE,MAAM,KAAK,WAAW,EAAE;AAAA,EACtD,SAAS,OAAO;AACd,YAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,YACG,QAAQ,MAAM,EACd,YAAY,2BAA2B,EACvC,SAAS,QAAQ,eAAe,EAChC,SAAS,iBAAiB,iBAAiB,EAC3C,OAAO,sBAAsB,gBAAgB,EAC7C,OAAO,YAAY,kBAAkB,EACrC,OAAO,OAAO,IAAY,aAAqB,YAAY;AAC1D,MAAI;AACF,UAAM,YAAY,SAAY;AAC9B,UAAM,YAAY,iBAAiB,OAAO;AAC1C,UAAM,YAAY,MAAM,cAAc,WAAW,SAAS;AAC1D,UAAM,OAAO,SAAS,UAAU,OAAO,EAAE;AACzC,QAAI,CAAC,MAAM;AACT,cAAQ,MAAM,WAAW,EAAE,cAAc;AACzC,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,SAAK,cAAc;AACnB,UAAM,eAAe,WAAW,SAAS;AACzC,YAAQ,IAAI,cAAc,EAAE,MAAM,WAAW,EAAE;AAAA,EACjD,SAAS,OAAO;AACd,YAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,YACG,QAAQ,KAAK,EACb,YAAY,uBAAuB,EACnC,SAAS,QAAQ,eAAe,EAChC,OAAO,gBAAgB,+BAA+B,EACtD,OAAO,mBAAmB,kCAAkC,EAC5D,OAAO,sBAAsB,gBAAgB,EAC7C,OAAO,YAAY,kBAAkB,EACrC,OAAO,OAAO,IAAY,YAAY;AACrC,MAAI;AACF,UAAM,YAAY,SAAY;AAC9B,UAAM,YAAY,iBAAiB,OAAO;AAC1C,UAAM,YAAY,MAAM,cAAc,WAAW,SAAS;AAC1D,UAAM,OAAO,SAAS,UAAU,OAAO,EAAE;AACzC,QAAI,CAAC,MAAM;AACT,cAAQ,MAAM,WAAW,EAAE,cAAc;AACzC,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI,QAAQ,KAAK;AACf,YAAM,QAAQ,QAAQ,IAAI,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC;AAChE,iBAAW,OAAO,OAAO;AACvB,YAAI,CAAC,KAAK,KAAK,SAAS,GAAG,EAAG,MAAK,KAAK,KAAK,GAAG;AAAA,MAClD;AAAA,IACF;AACA,QAAI,QAAQ,QAAQ;AAClB,YAAM,WAAW,QAAQ,OAAO,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC;AACtE,WAAK,OAAO,KAAK,KAAK,OAAO,CAAC,MAAM,CAAC,SAAS,SAAS,CAAC,CAAC;AAAA,IAC3D;AACA,UAAM,eAAe,WAAW,SAAS;AACzC,YAAQ,IAAI,eAAe,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,KAAK,GAAG,KAAK,QAAQ,EAAE;AAAA,EAC1F,SAAS,OAAO;AACd,YAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,YACG,QAAQ,KAAK,EACb,YAAY,kBAAkB,EAC9B,SAAS,QAAQ,kCAAkC,EACnD,OAAO,sBAAsB,gBAAgB,EAC7C,OAAO,YAAY,kBAAkB,EACrC,OAAO,OAAO,IAAwB,YAAY;AACjD,MAAI;AACF,UAAM,YAAY,SAAY;AAC9B,UAAM,YAAY,iBAAiB,OAAO;AAC1C,UAAM,MAAM,MAAM,QAAQ,WAAW,SAAS;AAC9C,QAAI,UAAU,IAAI;AAElB,QAAI,IAAI;AACN,gBAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,QAAQ,SAAS,EAAE,CAAC;AAAA,IACxD;AAEA,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,IAAI,uBAAuB;AACnC;AAAA,IACF;AAEA,eAAW,SAAS,SAAS;AAC3B,cAAQ,IAAI;AAAA,EAAK,MAAM,SAAS,WAAM,MAAM,QAAQ,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE;AACrF,UAAI,MAAM,MAAO,SAAQ,IAAI,YAAY,MAAM,KAAK,EAAE;AACtD,UAAI,MAAM,QAAS,SAAQ,IAAI,cAAc,MAAM,OAAO,EAAE;AAC5D,UAAI,MAAM,OAAQ,SAAQ,IAAI,aAAa,MAAM,MAAM,EAAE;AACzD,cAAQ,IAAI,cAAc,MAAM,OAAO,EAAE;AACzC,UAAI,MAAM,SAAU,SAAQ,IAAI,eAAe,MAAM,QAAQ,EAAE;AAAA,IACjE;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,YACG,QAAQ,SAAS,EACjB,YAAY,+CAA+C,EAC3D,OAAO,sBAAsB,gBAAgB,EAC7C,OAAO,YAAY,kBAAkB,EACrC,OAAO,OAAO,YAAY;AACzB,MAAI;AACF,UAAM,YAAY,SAAY;AAC9B,UAAM,YAAY,iBAAiB,OAAO;AAC1C,UAAM,YAAY,MAAM,cAAc,WAAW,SAAS;AAC1D,UAAM,MAAM,MAAM,QAAQ,WAAW,SAAS;AAE9C,UAAM,eAAe,IAAI;AAAA,MACvB,UAAU,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IACzE;AAEA,QAAI,aAAa,SAAS,GAAG;AAC3B,cAAQ,IAAI,gCAAgC;AAC5C;AAAA,IACF;AAGA,UAAM,YAAY,IAAI,QAAQ;AAAA,MAAO,CAAC,MACpC,EAAE,QAAQ,MAAM,CAAC,OAAO,aAAa,IAAI,EAAE,CAAC;AAAA,IAC9C;AAGA,UAAM,WAAW,YAAY,WAAW,WAAW,UAAU,eAAe;AAC5E,UAAM,UAAUF,UAAQ,WAAW,SAAS,CAAC;AAC7C,QAAI,cAAc;AAClB,QAAI,MAAM,WAAW,QAAQ,GAAG;AAC9B,oBAAc,MAAMD,WAAS,UAAU,OAAO;AAC9C,oBAAc,YAAY,QAAQ,IAAI;AAAA,IACxC,OAAO;AACL,oBAAc;AAAA,aAAmB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAC5C;AAGA,UAAM,iBAAiB,UAAU,MAAM,OAAO,CAAC,MAAM,aAAa,IAAI,EAAE,EAAE,CAAC;AAC3E,eAAW,QAAQ,gBAAgB;AACjC,qBAAe,SAAS,KAAK,WAAW,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,OAAO,KAAK,EAAE;AAAA;AAAA,IACnG;AACA,mBAAe;AAGf,eAAW,SAAS,WAAW;AAC7B,qBAAe,OAAO,MAAM,SAAS,WAAM,MAAM,QAAQ,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AACxF,UAAI,MAAM,MAAO,gBAAe,cAAc,MAAM,KAAK;AAAA;AACzD,UAAI,MAAM,QAAS,gBAAe,gBAAgB,MAAM,OAAO;AAAA;AAC/D,UAAI,MAAM,OAAQ,gBAAe,eAAe,MAAM,MAAM;AAAA;AAC5D,UAAI,MAAM,QAAS,gBAAe,gBAAgB,MAAM,OAAO;AAAA;AAC/D,UAAI,MAAM,SAAU,gBAAe,iBAAiB,MAAM,QAAQ;AAAA;AAClE,qBAAe;AAAA,IACjB;AAEA,UAAM,eAAe,UAAU,WAAW;AAG1C,cAAU,QAAQ,UAAU,MAAM,OAAO,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC;AACvE,UAAM,eAAe,WAAW,SAAS;AAGzC,UAAM,kBAAkB,IAAI,IAAI,SAAS;AACzC,QAAI,UAAU,IAAI,QAAQ,OAAO,CAAC,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC;AAE/D,QAAI,IAAI,QAAQ,SAAS,GAAG;AAC1B,UAAI,aAAa;AAAA,aAAmB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAC7C,iBAAW,SAAS,IAAI,SAAS;AAC/B,sBAAc,OAAO,MAAM,SAAS,WAAM,MAAM,QAAQ,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AACvF,YAAI,MAAM,MAAO,eAAc,cAAc,MAAM,KAAK;AAAA;AACxD,YAAI,MAAM,QAAS,eAAc,gBAAgB,MAAM,OAAO;AAAA;AAC9D,YAAI,MAAM,OAAQ,eAAc,eAAe,MAAM,MAAM;AAAA;AAC3D,YAAI,MAAM,QAAS,eAAc,gBAAgB,MAAM,OAAO;AAAA;AAC9D,YAAI,MAAM,SAAU,eAAc,iBAAiB,MAAM,QAAQ;AAAA;AACjE,sBAAc;AAAA,MAChB;AACA,YAAM,eAAe,QAAQ,WAAW,SAAS,GAAG,UAAU;AAAA,IAChE,OAAO;AACL,YAAM,eAAe,QAAQ,WAAW,SAAS,GAAG;AAAA,aAAmB,SAAS;AAAA;AAAA;AAAA;AAAA,CAAuB;AAAA,IACzG;AAEA,YAAQ,IAAI,YAAY,aAAa,IAAI,wBAAwB,UAAU,MAAM,eAAe;AAAA,EAClG,SAAS,OAAO;AACd,YAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,YACG,QAAQ,SAAS,EACjB,YAAY,qCAAqC,EACjD,SAAS,QAAQ,eAAe,EAChC,eAAe,oBAAoB,qBAAqB,EACxD,OAAO,sBAAsB,gBAAgB,EAC7C,OAAO,YAAY,kBAAkB,EACrC,OAAO,OAAO,IAAY,YAAY;AACrC,MAAI;AACF,UAAM,YAAY,SAAY;AAC9B,UAAM,YAAY,iBAAiB,OAAO;AAC1C,UAAM,YAAY,MAAM,cAAc,WAAW,SAAS;AAC1D,UAAM,OAAO,SAAS,UAAU,OAAO,EAAE;AACzC,QAAI,CAAC,MAAM;AACT,cAAQ,MAAM,WAAW,EAAE,cAAc;AACzC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,SAAK,SAAS;AACd,SAAK,UAAU;AACf,UAAM,eAAe,WAAW,SAAS;AAEzC,UAAM,QAAkB;AAAA,MACtB,WAAW,OAAO;AAAA,MAClB,SAAS,CAAC,EAAE;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,SAAS,sCAAsC,QAAQ,OAAO;AAAA,MAC9D,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AACA,UAAMG,gBAAe,WAAW,WAAW,KAAK;AAEhD,YAAQ,IAAI,eAAe,EAAE,+BAA+B,QAAQ,OAAO,IAAI;AAC/E,YAAQ,IAAI,4CAA4C,QAAQ,OAAO,KAAK,KAAK,WAAW,GAAG;AAAA,EACjG,SAAS,OAAO;AACd,YAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;;;ACzfHC;AADA,SAAS,WAAAC,gBAAe;AAYxB,SAAS,oBAAoB,KAAuD;AAClF,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,QAAQ,IAAI,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAChE,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI,MAAM,kCAAkC,iBAAiB,KAAK,IAAI,CAAC,EAAE;AAAA,EACjF;AACA,SAAO,sBAAsB,KAAK;AACpC;AAEO,IAAM,gBAAgB,IAAIC,SAAQ,QAAQ,EAC9C,YAAY,8CAA8C;AAE7D,cACG,QAAQ,MAAM,EACd,YAAY,6CAA6C,EACzD,OAAO,gBAAgB,kCAAkC,EACzD,OAAO,uBAAuB,qFAAqF,EACnH,OAAO,OAAO,YAAY;AACzB,MAAI;AACF,UAAM,SAAS,MAAM,eAAe;AAAA,MAClC,MAAM,QAAQ;AAAA,MACd,YAAY,oBAAoB,QAAQ,UAAU;AAAA,IACpD,CAAC;AACD,YAAQ,IAAI,OAAO,OAAO;AAC1B,QAAI,OAAO,WAAW;AACpB,cAAQ,IAAI,gBAAgB,OAAO,SAAS,EAAE;AAAA,IAChD;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,cACG,QAAQ,MAAM,EACd,YAAY,uDAAuD,EACnE,OAAO,gBAAgB,kCAAkC,EACzD,OAAO,uBAAuB,uCAAuC,EACrE,OAAO,OAAO,YAAY;AACzB,MAAI;AACF,UAAM,SAAS,MAAM,kBAAkB;AAAA,MACrC,MAAM,QAAQ;AAAA,MACd,YAAY,oBAAoB,QAAQ,UAAU;AAAA,IACpD,CAAC;AACD,YAAQ,IAAI,OAAO,OAAO;AAC1B,YAAQ,IAAI,gBAAgB,OAAO,SAAS,EAAE;AAAA,EAChD,SAAS,OAAO;AACd,YAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,cACG,QAAQ,QAAQ,EAChB,YAAY,qCAAqC,EACjD,OAAO,gBAAgB,yBAAyB,EAChD,OAAO,uBAAuB,8CAA8C,EAC5E,OAAO,OAAO,YAAY;AACzB,MAAI;AACF,UAAM,UAAkD,CAAC;AAEzD,QAAI,QAAQ,SAAS,QAAW;AAC9B,YAAM,UAAU,OAAO,QAAQ,SAAS,WAAW,QAAQ,KAAK,KAAK,IAAI,QAAQ;AACjF,UAAI,CAAC,gBAAgB,OAAO,GAAG;AAC7B,cAAM,IAAI,MAAM,sBAAsB,QAAQ,IAAI,sCAAsC;AAAA,MAC1F;AACA,cAAQ,OAAO;AAAA,IACjB;AACA,QAAI,QAAQ,eAAe,QAAW;AACpC,YAAM,QAAQ,QAAQ,WAAW,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AACvF,UAAI,MAAM,WAAW,GAAG;AACtB,cAAM,IAAI,MAAM,kCAAkC,iBAAiB,KAAK,IAAI,CAAC,EAAE;AAAA,MACjF;AACA,YAAM,QAAQ,sBAAsB,KAAK;AACzC,cAAQ,aAAa,MAAM,KAAK,IAAI;AAAA,IACtC;AAEA,QAAI,OAAO,KAAK,OAAO,EAAE,SAAS,GAAG;AACnC,YAAM,mBAAmB,OAAO;AAChC,cAAQ,IAAI,+BAA+B;AAAA,IAC7C;AAEA,UAAM,SAAS,MAAM,gBAAgB;AACrC,YAAQ,IAAI,yBAAyB;AACrC,YAAQ,IAAI,kBAAkB,OAAO,QAAQ,WAAW,EAAE;AAC1D,YAAQ,IAAI,kBAAkB,OAAO,UAAU,EAAE;AACjD,YAAQ,IAAI,kBAAkB,OAAO,cAAc,SAAS,EAAE;AAC9D,YAAQ,IAAI,kBAAkB,OAAO,eAAe,SAAS,EAAE;AAC/D,QAAI,OAAO,QAAQ;AACjB,cAAQ,IAAI,4EAAuE;AAAA,IACrF;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;;;AC3GH,SAAS,WAAAC,gBAAe;;;ACAxB,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,YAAAC,kBAAgB;AACzB,SAAS,WAAAC,UAAS,QAAAC,aAAY;;;ACA9BC;AACA;AACA;AAJA,OAAOC,eAAc;AACrB,SAAS,WAAAC,iBAAe;AAMxB,eAAsB,kBAAkB,MAAc,QAAQ,IAAI,GAA0B;AAC1F,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,OAAO,YAAY;AACzB,QAAM,SAASA,UAAQ,MAAM,YAAY;AAEzC,MAAIC,MAA+B;AACnC,MAAI,UAAyB;AAE7B,MAAI,MAAM,WAAW,MAAM,GAAG;AAC5B,QAAI;AACF,MAAAA,MAAK,IAAIF,UAAS,QAAQ,EAAE,UAAU,MAAM,eAAe,KAAK,CAAC;AAAA,IACnE,SAASG,MAAK;AACZ,gBAAUA,gBAAe,QAAQA,KAAI,UAAU,OAAOA,IAAG;AACzD,MAAAD,MAAK;AAAA,IACP;AAAA,EACF,OAAO;AACL,cAAU,8BAA8B,MAAM;AAAA,EAChD;AAEA,SAAO;AAAA,IACL;AAAA,IACA,aAAa;AAAA,IACb,IAAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,oBAAI,KAAK;AAAA,EAChB;AACF;AAEO,SAAS,kBAAkB,KAAyB;AACzD,MAAI,IAAI,IAAI;AACV,QAAI;AACF,UAAI,GAAG,MAAM;AAAA,IACf,QAAQ;AAAA,IAER;AAAA,EACF;AACF;;;ACxCA;AACA;AALA,SAAS,WAAAE,WAAS,cAAAC,mBAAkB;AACpC,SAAS,YAAAC,YAAU,QAAAC,aAAY;AAC/B,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAK9B,IAAM,WAAW;AAEjB,IAAM,oBAA2B;AAAA,EAC/B,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,QAAI;AACF,YAAM,IAAI,MAAMH,MAAK,IAAI,WAAW;AACpC,UAAI,CAAC,EAAE,YAAY,GAAG;AACpB,eAAO,IAAI,MAAM,GAAG,IAAI,WAAW,kCAAkC;AAAA,UACnE,IAAI;AAAA,QACN,CAAC;AAAA,MACH;AACA,aAAO,KAAK,IAAI;AAAA,IAClB,QAAQ;AACN,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ,GAAG,IAAI,WAAW;AAAA,QAC1B,UAAU,CAAC,IAAI,WAAW;AAAA,QAC1B,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,SAAS;AAAA,QACX;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,cAAqB;AAAA,EACzB,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,aAAaH,UAAQ,IAAI,aAAa,WAAW;AACvD,QAAI,CAAE,MAAM,WAAW,UAAU,GAAI;AACnC,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU,CAAC,UAAU;AAAA,QACrB,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,SAAS;AAAA,QACX;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AACA,UAAM,UAAU,MAAME,WAAS,YAAY,OAAO;AAClD,UAAM,UAAU,QAAQ,MAAM,uBAAuB;AACrD,QAAI,CAAC,WAAW,QAAQ,CAAC,EAAE,KAAK,MAAM,IAAI;AACxC,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU,CAAC,UAAU;AAAA,QACrB,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,SAAS;AAAA,QACX;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AACA,UAAM,UAAU,QAAQ,CAAC;AAEzB,UAAM,gBAAgB,kBAAkB,SAAS,mBAAmB;AACpE,QAAI,kBAAkB,MAAM;AAC1B,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU,CAAC,UAAU;AAAA,QACrB,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,SAAS;AAAA,QACX;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AAEA,UAAM,WAAW,WAAW,aAAa;AACzC,QAAI,CAACD,YAAW,QAAQ,GAAG;AACzB,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ,gCAAgC,aAAa;AAAA,QACrD,UAAU,CAAC,UAAU;AAAA,QACrB,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,SAAS;AAAA,QACX;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AAEA,QAAI,IAAI,OAAO,sBAAsB,UAAU;AAC7C,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ,4CAA4C,IAAI,OAAO,iBAAiB,6BAA6B,aAAa;AAAA,QAC1H,UAAU,CAAC,UAAU;AAAA,QACrB,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,SAAS;AAAA,QACX;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AAEA,UAAM,iBAAiB,0BAA0B,SAAS,IAAI,MAAM;AACpE,QAAI,gBAAgB;AAClB,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ,iBAAiB,eAAe,KAAK;AAAA,QAC7C,UAAU,CAAC,UAAU;AAAA,QACrB,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY,8CAA8C,eAAe,MAAM;AAAA,UAC/E,SAAS;AAAA,QACX;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AAEA,WAAO,KAAK,IAAI;AAAA,EAClB;AACF;AAOA,SAAS,0BACP,SACA,QAIuB;AACvB,QAAMM,qBAAoD;AAAA,IACxD,CAAC,gCAAgC,OAAO,aAAa,eAAe;AAAA,IACpE,CAAC,+BAA+B,OAAO,aAAa,cAAc;AAAA,IAClE,CAAC,qCAAqC,OAAO,aAAa,oBAAoB;AAAA,EAChF;AACA,aAAW,CAAC,QAAQ,WAAW,KAAKA,oBAAmB;AACrD,UAAM,MAAM,gBAAgB,SAAS,MAAM;AAC3C,QAAI,QAAQ,QAAQ,QAAQ,UAAU,QAAQ,MAAM,gBAAgB,MAAM;AACxE,aAAO,EAAE,OAAO,QAAQ,QAAQ,eAAe;AAAA,IACjD;AAAA,EACF;AAEA,QAAM,eAA+C;AAAA,IACnD,CAAC,eAAe,OAAO,QAAQ,QAAQ,IAAI;AAAA,IAC3C,CAAC,qBAAqB,OAAO,QAAQ,cAAc,IAAI;AAAA,IACvD,CAAC,sBAAsB,OAAO,QAAQ,eAAe,IAAI;AAAA,EAC3D;AACA,aAAW,CAAC,QAAQ,WAAW,KAAK,cAAc;AAChD,UAAM,MAAM,gBAAgB,SAAS,MAAM;AAC3C,QAAI,QAAQ,QAAQ,QAAQ,UAAU,QAAQ,MAAM,gBAAgB,MAAM;AACxE,aAAO,EAAE,OAAO,QAAQ,QAAQ,SAAS;AAAA,IAC3C;AAAA,EACF;AAEA,QAAM,gBAAgB,gBAAgB,SAAS,mBAAmB;AAClE,MAAI,kBAAkB,QAAQ,kBAAkB,MAAM,OAAO,QAAQ,YAAY;AAC/E,UAAM,gBAAgB,cAAc,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAC5F,UAAM,mBAAmB,OAAO,OAAO,WAAW,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAC1G,QAAI,iBAAiB,kBAAkB,kBAAkB;AACvD,aAAO,EAAE,OAAO,qBAAqB,QAAQ,SAAS;AAAA,IACxD;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,SAAiB,QAA+B;AACvE,QAAM,CAAC,QAAQ,GAAG,IAAI,OAAO,MAAM,KAAK,CAAC;AACzC,MAAI,CAAC,UAAU,CAAC,IAAK,QAAO;AAC5B,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAM,eAAe,GAAG,MAAM;AAC9B,MAAI,WAAW;AACf,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,UAAU;AACb,UAAI,KAAK,WAAW,YAAY,GAAG;AACjC,mBAAW;AAAA,MACb;AACA;AAAA,IACF;AACA,UAAM,UAAU,KAAK,UAAU;AAC/B,UAAM,SAAS,KAAK,SAAS,QAAQ;AACrC,QAAI,YAAY,GAAI;AACpB,QAAI,WAAW,GAAG;AAEhB,aAAO;AAAA,IACT;AACA,UAAM,WAAW,QAAQ,WAAW,IAAI,IAAI,QAAQ,MAAM,CAAC,EAAE,UAAU,IAAI;AAC3E,UAAM,WAAW,SAAS,QAAQ,GAAG;AACrC,QAAI,WAAW,EAAG;AAClB,UAAM,UAAU,SAAS,MAAM,GAAG,QAAQ,EAAE,KAAK;AACjD,QAAI,YAAY,IAAK;AACrB,UAAM,MAAM,SAAS,MAAM,WAAW,CAAC,EAAE,KAAK;AAC9C,QAAK,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,KAAO,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,GAAI;AAC5F,aAAO,IAAI,MAAM,GAAG,EAAE;AAAA,IACxB;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,IAAM,cAAqB;AAAA,EACzB,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM,MAAM;AACV,UAAM,UAAU,QAAQ,SAAS;AACjC,UAAM,MAAM,MAAM,cAAc;AAChC,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,aAAa;AAAA,MACf;AAAA,IACF;AACA,QAAI,CAAC,WAAW,SAAS,GAAG,GAAG;AAC7B,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ,QAAQ,OAAO,wBAAwB,GAAG;AAAA,QAClD,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY,qBAAqB,GAAG;AAAA,UACpC,SAAS;AAAA,QACX;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AACA,WAAO,KAAK,MAAM,QAAQ,OAAO,OAAO,GAAG,EAAE;AAAA,EAC/C;AACF;AAEA,IAAM,aAAoB;AAAA,EACxB,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM,MAAM;AACV,UAAM,QAAQ,MAAM,iBAAiB;AACrC,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,aAAa;AAAA,MACf;AAAA,IACF;AACA,UAAM,SAAS,MAAM,sBAAsB,WAAW,GAAI;AAC1D,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,aAAa;AAAA,MACf;AAAA,IACF;AACA,QAAI,UAAU,QAAQ;AACpB,aAAO,KAAK,MAAM,WAAW,KAAK,YAAY;AAAA,IAChD;AACA,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,UAAU,KAAK;AAAA,MACf,OAAO,KAAK;AAAA,MACZ,QAAQ;AAAA,MACR,QAAQ,qBAAqB,KAAK,sBAAsB,MAAM;AAAA,MAC9D,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,SAAS;AAAA,MACX;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EACF;AACF;AAEO,IAAM,YAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,KAAK,OAAwD,QAA8B;AAClG,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,UAAU,MAAM;AAAA,IAChB,OAAO,MAAM;AAAA,IACb,QAAQ;AAAA,IACR;AAAA,IACA,aAAa;AAAA,EACf;AACF;AAEA,SAAS,IACP,OACA,QACA,UACa;AACb,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,UAAU,MAAM;AAAA,IAChB,OAAO,MAAM;AAAA,IACb,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,aAAa;AAAA,EACf;AACF;AAEA,eAAe,gBAAwC;AACrD,QAAM,MAAM,MAAM,aAAa;AAC/B,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,SAAS,IAAI,SAAS;AAC5B,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,QAAM,QAAQ,OAAO,MAAM,qBAAqB;AAChD,SAAO,QAAQ,MAAM,CAAC,IAAI;AAC5B;AAEA,eAAe,mBAA2C;AACxD,QAAM,MAAM,MAAM,aAAa;AAC/B,SAAO,OAAO,KAAK,YAAY,WAAW,IAAI,UAAU;AAC1D;AAOA,eAAe,eAAyC;AACtD,MAAI;AACF,UAAM,OAAOH,eAAc,YAAY,GAAG;AAC1C,QAAI,MAAMC,SAAQ,IAAI;AACtB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,YAAYC,MAAK,KAAK,cAAc;AAC1C,UAAI;AACF,cAAM,OAAO,MAAMJ,WAAS,WAAW,OAAO;AAC9C,eAAO,KAAK,MAAM,IAAI;AAAA,MACxB,QAAQ;AACN,cAAMG,SAAQ,GAAG;AAAA,MACnB;AAAA,IACF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,sBAAsB,KAAa,WAA2C;AAC3F,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,IAAI,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AACxD,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,8BAA8B,GAAG,WAAW;AAAA,MAClE,QAAQ,WAAW;AAAA,IACrB,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,QAAO;AACpB,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,WAAO,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU;AAAA,EAC3D,QAAQ;AACN,WAAO;AAAA,EACT,UAAE;AACA,iBAAa,CAAC;AAAA,EAChB;AACF;AAEA,SAAS,kBAAkB,SAAiB,KAA4B;AACtE,QAAM,QAAQ,QAAQ,MAAM,IAAI,OAAO,IAAI,GAAG,cAAc,GAAG,CAAC;AAChE,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,MAAM,MAAM,CAAC,EAAE,KAAK;AAC1B,MAAI,QAAQ,GAAI,QAAO;AACvB,MAAK,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,KAAO,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,GAAI;AAC5F,WAAO,IAAI,MAAM,GAAG,EAAE;AAAA,EACxB;AACA,SAAO;AACT;AAEA,SAAS,WAAW,GAAW,GAAoB;AACjD,QAAM,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,SAAS,GAAG,EAAE,KAAK,CAAC;AACvD,QAAM,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,SAAS,GAAG,EAAE,KAAK,CAAC;AACvD,QAAM,MAAM,KAAK,IAAI,GAAG,QAAQ,GAAG,MAAM;AACzC,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,UAAM,KAAK,GAAG,CAAC,KAAK;AACpB,UAAM,KAAK,GAAG,CAAC,KAAK;AACpB,QAAI,KAAK,GAAI,QAAO;AACpB,QAAI,KAAK,GAAI,QAAO;AAAA,EACtB;AACA,SAAO;AACT;;;AChbA;AAFA,SAAS,WAAAG,iBAAe;AACxB,SAAS,WAAAC,WAAS,QAAAC,aAAY;AAI9B,IAAMC,YAAW;AAEjB,IAAM,kBAAkB,oBAAI,IAAY;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,cAAqB;AAAA,EACzB,IAAI;AAAA,EACJ,UAAUA;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,IAAIH,UAAQ,IAAI,aAAa,UAAU;AAC7C,QAAI,CAAE,MAAM,WAAW,CAAC,GAAI;AAC1B,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU,CAAC,CAAC;AAAA,QACZ,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,SAAS;AAAA,QACX;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AACA,WAAOI,MAAK,IAAI;AAAA,EAClB;AACF;AAEA,IAAMC,gBAAsB;AAAA,EAC1B,IAAI;AAAA,EACJ,UAAUF;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,IAAIH,UAAQ,IAAI,aAAa,WAAW;AAC9C,QAAI,CAAE,MAAM,WAAW,CAAC,GAAI;AAC1B,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU,CAAC,CAAC;AAAA,QACZ,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,SAAS;AAAA,QACX;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AACA,WAAOI,MAAK,IAAI;AAAA,EAClB;AACF;AAEA,IAAM,gBAAuB;AAAA,EAC3B,IAAI;AAAA,EACJ,UAAUD;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,IAAIH,UAAQ,IAAI,aAAa,OAAO;AAC1C,QAAI,CAAE,MAAM,WAAW,CAAC,GAAI;AAC1B,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,aAAa;AAAA,MACf;AAAA,IACF;AACA,UAAM,IAAI,MAAME,MAAK,CAAC;AACtB,QAAI,CAAC,EAAE,YAAY,GAAG;AACpB,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU,CAAC,CAAC;AAAA,QACZ,aAAa;AAAA,MACf;AAAA,IACF;AACA,WAAOE,MAAK,IAAI;AAAA,EAClB;AACF;AAEA,IAAM,kBAAyB;AAAA,EAC7B,IAAI;AAAA,EACJ,UAAUD;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,IAAIH,UAAQ,IAAI,aAAa,SAAS;AAC5C,QAAI,CAAE,MAAM,WAAW,CAAC,GAAI;AAC1B,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,aAAa;AAAA,MACf;AAAA,IACF;AACA,UAAM,IAAI,MAAME,MAAK,CAAC;AACtB,QAAI,CAAC,EAAE,YAAY,GAAG;AACpB,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU,CAAC,CAAC;AAAA,QACZ,aAAa;AAAA,MACf;AAAA,IACF;AACA,WAAOE,MAAK,IAAI;AAAA,EAClB;AACF;AAEA,IAAM,uBAA8B;AAAA,EAClC,IAAI;AAAA,EACJ,UAAUD;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,UAAU,MAAMF,UAAQ,IAAI,aAAa,EAAE,eAAe,KAAK,CAAC;AACtE,UAAM,aAAuB,CAAC;AAC9B,eAAW,KAAK,SAAS;AACvB,UAAI,EAAE,KAAK,WAAW,GAAG,EAAG;AAC5B,UAAI,gBAAgB,IAAI,EAAE,IAAI,EAAG;AACjC,iBAAW,KAAK,EAAE,IAAI;AAAA,IACxB;AACA,QAAI,WAAW,WAAW,EAAG,QAAOG,MAAK,IAAI;AAC7C,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,UAAU,KAAK;AAAA,MACf,OAAO,KAAK;AAAA,MACZ,QAAQ;AAAA,MACR,QAAQ,iCAAiC,WAAW,KAAK,IAAI,CAAC;AAAA,MAC9D,UAAU,WAAW,IAAI,CAAC,MAAMJ,UAAQ,IAAI,aAAa,CAAC,CAAC;AAAA,MAC3D,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,SAAS;AAAA,MACX;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EACF;AACF;AAEO,IAAM,kBAA2B;AAAA,EACtC;AAAA,EACAK;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAASD,MAAK,OAAqE;AACjF,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,UAAU,MAAM;AAAA,IAChB,OAAO,MAAM;AAAA,IACb,QAAQ;AAAA,IACR,aAAa;AAAA,EACf;AACF;;;ACpLA;AAFA,SAAS,WAAAE,iBAAe;AACxB,SAAS,WAAAC,WAAS,QAAAC,aAAY;AAI9B,IAAMC,YAAW;AAEjB,IAAM,yBAAyB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,0BAA0B,oBAAI,IAAY;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,kBAAkB,CAAC,cAAc,eAAe,aAAa;AAEnE,eAAeC,cAAa,KAAmE;AAC7F,QAAM,MAAM,IAAI,OAAO;AACvB,MAAI,CAAE,MAAM,WAAW,GAAG,EAAI,QAAO,CAAC;AACtC,QAAM,UAAU,MAAMH,UAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAC1D,QAAM,SAAmB,CAAC;AAC1B,aAAW,KAAK,SAAS;AACvB,QAAI,CAAC,EAAE,YAAY,EAAG;AACtB,QAAI,EAAE,KAAK,WAAW,GAAG,KAAK,EAAE,KAAK,WAAW,GAAG,EAAG;AACtD,UAAM,aAAaD,UAAQ,KAAK,EAAE,IAAI;AACtC,QAAI,mBAAmB;AACvB,eAAW,UAAU,iBAAiB;AACpC,UAAI,MAAM,WAAWA,UAAQ,YAAY,MAAM,CAAC,GAAG;AACjD,2BAAmB;AACnB;AAAA,MACF;AAAA,IACF;AACA,QAAI,iBAAkB,QAAO,KAAK,UAAU;AAAA,EAC9C;AACA,SAAO;AACT;AAEA,IAAM,gBAAuB;AAAA,EAC3B,IAAI;AAAA,EACJ,UAAUG;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,WAAW,MAAMC,cAAa,GAAG;AACvC,UAAM,UAAyB,CAAC;AAChC,eAAW,cAAc,UAAU;AACjC,YAAM,UAAoB,CAAC;AAC3B,iBAAW,OAAO,wBAAwB;AACxC,cAAM,IAAIJ,UAAQ,YAAY,GAAG;AACjC,YAAI,CAAE,MAAM,WAAW,CAAC,EAAI,SAAQ,KAAK,GAAG;AAAA,MAC9C;AACA,UAAI,QAAQ,WAAW,EAAG;AAC1B,cAAQ,KAAK;AAAA,QACX,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ,cAAc,UAAU,gBAAgB,QAAQ,KAAK,IAAI,CAAC;AAAA,QAClE,UAAU,QAAQ,IAAI,CAAC,MAAMA,UAAQ,YAAY,CAAC,CAAC;AAAA,QACnD,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,SAAS;AAAA,QACX;AAAA,QACA,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAOK,MAAK,IAAI;AAAA,IAClB;AACA,WAAO;AAAA,EACT;AACF;AAEA,IAAM,gBAAuB;AAAA,EAC3B,IAAI;AAAA,EACJ,UAAUF;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,WAAW,MAAMC,cAAa,GAAG;AACvC,UAAM,UAAyB,CAAC;AAChC,eAAW,cAAc,UAAU;AACjC,YAAM,eAAeJ,UAAQ,YAAY,aAAa;AACtD,UAAI,CAAE,MAAM,WAAW,YAAY,EAAI;AACvC,YAAM,iBAAiB,MAAME,MAAK,YAAY,GAAG;AACjD,YAAM,mBAAmB,MAAM,sBAAsB,UAAU;AAC/D,UAAI,qBAAqB,EAAG;AAC5B,UAAI,mBAAmB,eAAe;AACpC,gBAAQ,KAAK;AAAA,UACX,IAAI,KAAK;AAAA,UACT,UAAU,KAAK;AAAA,UACf,OAAO,KAAK;AAAA,UACZ,QAAQ;AAAA,UACR,QAAQ,kBAAkB,UAAU;AAAA,UACpC,UAAU,CAAC,YAAY;AAAA,UACvB,aAAa;AAAA,YACX,MAAM;AAAA,YACN,YAAY;AAAA,YACZ,SAAS;AAAA,UACX;AAAA,UACA,aAAa;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,EAAG,QAAOG,MAAK,IAAI;AAC1C,WAAO;AAAA,EACT;AACF;AAEA,IAAM,cAAqB;AAAA,EACzB,IAAI;AAAA,EACJ,UAAUF;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,WAAW,MAAMC,cAAa,GAAG;AACvC,UAAM,UAAyB,CAAC;AAChC,eAAW,cAAc,UAAU;AACjC,YAAM,UAAU,MAAMH,UAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AACjE,YAAM,UAAoB,CAAC;AAC3B,iBAAW,KAAK,SAAS;AACvB,YAAI,EAAE,KAAK,WAAW,GAAG,EAAG;AAC5B,YAAI,wBAAwB,IAAI,EAAE,IAAI,EAAG;AACzC,YAAI,EAAE,KAAK,WAAW,SAAS,KAAK,EAAE,KAAK,SAAS,KAAK,EAAG;AAC5D,gBAAQ,KAAK,EAAE,IAAI;AAAA,MACrB;AACA,UAAI,QAAQ,WAAW,EAAG;AAC1B,cAAQ,KAAK;AAAA,QACX,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ,cAAc,UAAU,4BAA4B,QAAQ,KAAK,IAAI,CAAC;AAAA,QAC9E,UAAU,QAAQ,IAAI,CAAC,MAAMD,UAAQ,YAAY,CAAC,CAAC;AAAA,QACnD,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,QAAI,QAAQ,WAAW,EAAG,QAAOK,MAAK,IAAI;AAC1C,WAAO;AAAA,EACT;AACF;AAEO,IAAM,gBAAyB,CAAC,eAAe,eAAe,WAAW;AAEhF,eAAe,sBAAsB,YAAqC;AACxE,QAAM,kBAAkBL,UAAQ,YAAY,aAAa;AACzD,MAAI,CAAE,MAAM,WAAW,eAAe,EAAI,QAAO;AACjD,MAAI,SAAS;AACb,MAAI;AACJ,MAAI;AACF,cAAU,MAAMC,UAAQ,iBAAiB,EAAE,eAAe,KAAK,CAAC;AAAA,EAClE,QAAQ;AACN,WAAO;AAAA,EACT;AACA,aAAW,KAAK,SAAS;AACvB,QAAI,CAAC,EAAE,YAAY,EAAG;AACtB,UAAM,eAAeD,UAAQ,iBAAiB,EAAE,MAAM,eAAe;AACrE,QAAI;AACF,YAAM,IAAI,MAAME,MAAK,YAAY;AACjC,UAAI,EAAE,UAAU,OAAQ,UAAS,EAAE;AAAA,IACrC,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAASG,MAAK,OAAqE;AACjF,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,UAAU,MAAM;AAAA,IAChB,OAAO,MAAM;AAAA,IACb,QAAQ;AAAA,IACR,aAAa;AAAA,EACf;AACF;;;ACxLA;AACA;AACA;AAEA;AANA,SAAS,WAAAC,iBAAe;AACxB,SAAS,WAAAC,WAAS,YAAAC,kBAAgB;AAQlC,IAAMC,YAAW;AAEjB,IAAM,6BAA6B,oBAAI,IAAI,CAAC,UAAU,WAAW,CAAC;AAYlE,eAAe,gBAAgB,KAG5B;AACD,QAAM,SAAS,EAAE,kBAAkB,CAAC,GAAwB,eAAe,CAAC,EAAuB;AACnG,QAAMC,eAAc,IAAI,OAAO;AAC/B,MAAI,MAAM,WAAWA,YAAW,GAAG;AACjC,UAAM,WAAW,MAAMH,UAAQG,cAAa,EAAE,eAAe,KAAK,CAAC;AACnE,eAAW,KAAK,UAAU;AACxB,UAAI,CAAC,EAAE,YAAY,EAAG;AACtB,UAAI,EAAE,KAAK,WAAW,GAAG,KAAK,EAAE,KAAK,WAAW,GAAG,EAAG;AACtD,YAAMC,kBAAiBL,UAAQI,cAAa,EAAE,MAAM,aAAa;AACjE,UAAI,CAAE,MAAM,WAAWC,eAAc,EAAI;AAEzC,YAAM,UAAU,MAAMJ,UAAQI,iBAAgB,EAAE,eAAe,KAAK,CAAC;AACrE,iBAAW,KAAK,SAAS;AACvB,YAAI,CAAC,EAAE,YAAY,EAAG;AACtB,YAAI,EAAE,KAAK,WAAW,GAAG,KAAK,EAAE,KAAK,WAAW,GAAG,EAAG;AACtD,cAAM,gBAAgBL,UAAQK,iBAAgB,EAAE,IAAI;AACpD,cAAM,eAAeL,UAAQ,eAAe,eAAe;AAC3D,cAAM,QAAyB;AAAA,UAC7B,YAAYA,UAAQI,cAAa,EAAE,IAAI;AAAA,UACvC,aAAa,EAAE;AAAA,UACf;AAAA,UACA,gBAAgB,EAAE;AAAA,UAClB,YAAY;AAAA,QACd;AACA,YAAI,MAAM,WAAW,YAAY,GAAG;AAClC,iBAAO,iBAAiB,KAAK,KAAK;AAAA,QACpC,OAAO;AACL,iBAAO,cAAc,KAAK,KAAK;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,iBAAiB,eAAiB;AACxC,MAAI,MAAM,WAAW,cAAc,GAAG;AACpC,UAAM,UAAU,MAAMH,UAAQ,gBAAgB,EAAE,eAAe,KAAK,CAAC;AACrE,eAAW,KAAK,SAAS;AACvB,UAAI,CAAC,EAAE,YAAY,EAAG;AACtB,UAAI,EAAE,KAAK,WAAW,GAAG,KAAK,EAAE,KAAK,WAAW,GAAG,EAAG;AACtD,YAAM,gBAAgBD,UAAQ,gBAAgB,EAAE,IAAI;AACpD,YAAM,eAAeA,UAAQ,eAAe,eAAe;AAC3D,YAAM,QAAyB;AAAA,QAC7B,YAAY;AAAA,QACZ,aAAa;AAAA,QACb;AAAA,QACA,gBAAgB,EAAE;AAAA,QAClB,YAAY;AAAA,MACd;AACA,UAAI,MAAM,WAAW,YAAY,GAAG;AAClC,eAAO,iBAAiB,KAAK,KAAK;AAAA,MACpC,OAAO;AACL,eAAO,cAAc,KAAK,KAAK;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,KAAgC;AAC1D,QAAM,SAAS,IAAI,OAAO,UAAU,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC;AACnE,MAAI,OAAO,SAAS,EAAG,QAAO,IAAI,IAAI,MAAM;AAC5C,SAAO,IAAI,IAAI,gBAAgB;AACjC;AAEA,SAAS,iBAAiB,KAAgC;AACxD,QAAM,SAAS,IAAI,OAAO,UAAU,UAAU,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC;AAC7F,MAAI,OAAO,SAAS,EAAG,QAAO,IAAI,IAAI,MAAM;AAC5C,SAAO,IAAI,IAAI,yBAAyB;AAC1C;AAEA,IAAMM,iBAAuB;AAAA,EAC3B,IAAI;AAAA,EACJ,UAAUH;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,EAAE,iBAAiB,IAAI,MAAM,gBAAgB,GAAG;AACtD,QAAI,iBAAiB,WAAW,GAAG;AACjC,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,aAAa;AAAA,MACf;AAAA,IACF;AACA,WAAOI,MAAK,MAAM,GAAG,iBAAiB,MAAM,8BAA8B;AAAA,EAC5E;AACF;AAEA,IAAM,iBAAwB;AAAA,EAC5B,IAAI;AAAA,EACJ,UAAUJ;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,EAAE,cAAc,IAAI,MAAM,gBAAgB,GAAG;AACnD,QAAI,cAAc,WAAW,EAAG,QAAOI,MAAK,IAAI;AAChD,WAAO,cAAc,IAAI,CAAC,OAAO;AAAA,MAC/B,IAAI,KAAK;AAAA,MACT,UAAU,KAAK;AAAA,MACf,OAAO,KAAK;AAAA,MACZ,QAAQ;AAAA,MACR,QAAQ,UAAU,EAAE,aAAa;AAAA,MACjC,UAAU,CAAC,EAAE,aAAa;AAAA,MAC1B,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,SAAS;AAAA,MACX;AAAA,MACA,aAAa;AAAA,IACf,EAAE;AAAA,EACJ;AACF;AAEA,IAAM,gBAAuB;AAAA,EAC3B,IAAI;AAAA,EACJ,UAAUJ;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,EAAE,iBAAiB,IAAI,MAAM,gBAAgB,GAAG;AACtD,UAAM,UAAU,mBAAmB,GAAG;AACtC,UAAM,UAAyB,CAAC;AAChC,eAAW,KAAK,kBAAkB;AAChC,YAAM,OAAOH,UAAQ,EAAE,eAAe,eAAe;AACrD,YAAM,SAAS,MAAM,UAAU,IAAI;AACnC,UAAI,CAAC,OAAQ;AACb,UAAI,CAAC,QAAQ,IAAI,OAAO,MAAM,GAAG;AAC/B,gBAAQ,KAAK;AAAA,UACX,IAAI,KAAK;AAAA,UACT,UAAU,KAAK;AAAA,UACf,OAAO,KAAK;AAAA,UACZ,QAAQ;AAAA,UACR,QAAQ,GAAG,EAAE,WAAW,IAAI,EAAE,cAAc,aAAa,OAAO,MAAM,oCAAoC,CAAC,GAAG,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,UACjI,UAAU,CAAC,IAAI;AAAA,UACf,aAAa;AAAA,YACX,MAAM;AAAA,YACN,YAAY;AAAA,YACZ,SAAS;AAAA,UACX;AAAA,UACA,aAAa;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,EAAG,QAAOO,MAAK,IAAI;AAC1C,WAAO;AAAA,EACT;AACF;AAEA,IAAM,mBAA0B;AAAA,EAC9B,IAAI;AAAA,EACJ,UAAUJ;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,EAAE,iBAAiB,IAAI,MAAM,gBAAgB,GAAG;AACtD,UAAM,WAAW,iBAAiB,GAAG;AACrC,UAAM,UAAyB,CAAC;AAChC,eAAW,KAAK,kBAAkB;AAChC,YAAM,OAAOH,UAAQ,EAAE,eAAe,eAAe;AACrD,YAAM,SAAS,MAAM,UAAU,IAAI;AACnC,UAAI,CAAC,OAAQ;AACb,UAAI,SAAS,IAAI,OAAO,MAAM,EAAG;AACjC,UAAI,OAAO,WAAW,UAAW;AACjC,YAAM,EAAE,YAAY,aAAa,IAAI,OAAO;AAC5C,UAAI,eAAe,QAAQ,iBAAiB,MAAM;AAChD,gBAAQ,KAAK;AAAA,UACX,IAAI,KAAK;AAAA,UACT,UAAU,KAAK;AAAA,UACf,OAAO,KAAK;AAAA,UACZ,QAAQ;AAAA,UACR,QAAQ,GAAG,EAAE,WAAW,IAAI,EAAE,cAAc,aAAa,OAAO,MAAM;AAAA,UACtE,UAAU,CAAC,IAAI;AAAA,UACf,aAAa;AAAA,YACX,MAAM;AAAA,YACN,YAAY;AAAA,YACZ,SAAS;AAAA,UACX;AAAA,UACA,aAAa;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,EAAG,QAAOO,MAAK,IAAI;AAC1C,WAAO;AAAA,EACT;AACF;AAEA,IAAM,wBAA+B;AAAA,EACnC,IAAI;AAAA,EACJ,UAAUJ;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,UAAU,mBAAmB,GAAG;AACtC,UAAM,kBAAkB,MAAM,KAAK,gBAAgB,EAAE,MAAM,CAAC,MAAM,QAAQ,IAAI,CAAC,CAAC;AAChF,QAAI,CAAC,iBAAiB;AACpB,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,aAAa;AAAA,MACf;AAAA,IACF;AACA,UAAM,EAAE,iBAAiB,IAAI,MAAM,gBAAgB,GAAG;AACtD,UAAM,UAAyB,CAAC;AAChC,eAAW,KAAK,kBAAkB;AAChC,YAAM,iBAAiBH,UAAQ,EAAE,eAAe,eAAe;AAC/D,YAAM,SAAS,MAAM,UAAU,cAAc;AAC7C,UAAI,CAAC,OAAQ;AACb,YAAM,UAAoB,CAAC;AAC3B,UAAI,2BAA2B,IAAI,OAAO,MAAM,GAAG;AACjD,cAAM,cAAcA,UAAQ,EAAE,eAAe,YAAY;AACzD,YAAI,CAAE,MAAM,WAAW,WAAW,EAAI,SAAQ,KAAK,YAAY;AAAA,MACjE;AACA,UAAI,QAAQ,WAAW,EAAG;AAC1B,cAAQ,KAAK;AAAA,QACX,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ,GAAG,EAAE,WAAW,IAAI,EAAE,cAAc,aAAa,OAAO,MAAM,gBAAgB,QAAQ,KAAK,IAAI,CAAC;AAAA,QACxG,UAAU,QAAQ,IAAI,CAAC,MAAMA,UAAQ,EAAE,eAAe,CAAC,CAAC;AAAA,QACxD,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY,sBAAsB,QAAQ,KAAK,OAAO,CAAC;AAAA,UACvD,SAAS;AAAA,QACX;AAAA,QACA,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,QAAI,QAAQ,WAAW,EAAG,QAAOO,MAAK,IAAI;AAC1C,WAAO;AAAA,EACT;AACF;AAEA,IAAM,2BAAkC;AAAA,EACtC,IAAI;AAAA,EACJ,UAAUJ;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,EAAE,iBAAiB,IAAI,MAAM,gBAAgB,GAAG;AACtD,UAAM,UAAyB,CAAC;AAChC,eAAW,KAAK,kBAAkB;AAChC,YAAM,UAAoB,CAAC;AAC3B,iBAAW,YAAY,CAAC,eAAe,aAAa,GAAG;AACrD,YAAI,CAAE,MAAM,WAAWH,UAAQ,EAAE,eAAe,QAAQ,CAAC,GAAI;AAC3D,kBAAQ,KAAK,QAAQ;AAAA,QACvB;AAAA,MACF;AACA,UAAI,QAAQ,WAAW,EAAG;AAC1B,YAAM,QAAQ,EAAE,aAAa,cAAc,EAAE,cAAc,KAAK,GAAG,EAAE,WAAW,IAAI,EAAE,cAAc;AACpG,cAAQ,KAAK;AAAA,QACX,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ,GAAG,KAAK,eAAe,QAAQ,KAAK,OAAO,CAAC;AAAA,QACpD,UAAU,QAAQ,IAAI,CAAC,MAAMA,UAAQ,EAAE,eAAe,CAAC,CAAC;AAAA,QACxD,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY,UAAU,QAAQ,KAAK,OAAO,CAAC;AAAA,UAC3C,SAAS;AAAA,QACX;AAAA,QACA,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,QAAI,QAAQ,WAAW,EAAG,QAAOO,MAAK,IAAI;AAC1C,WAAO;AAAA,EACT;AACF;AAEA,IAAM,iBAAwB;AAAA,EAC5B,IAAI;AAAA,EACJ,UAAUJ;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,cAAc,IAAI,OAAO;AAC/B,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,aAAa;AAAA,MACf;AAAA,IACF;AACA,UAAM,UAAU,IAAI,IAAI,YAAY,YAAY,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAChE,UAAM,EAAE,iBAAiB,IAAI,MAAM,gBAAgB,GAAG;AACtD,UAAM,UAAyB,CAAC;AAChC,eAAW,KAAK,kBAAkB;AAChC,YAAM,OAAOH,UAAQ,EAAE,eAAe,eAAe;AACrD,YAAM,SAAS,MAAM,UAAU,IAAI;AACnC,UAAI,CAAC,OAAQ;AACb,UAAI,CAAC,OAAO,KAAM;AAClB,UAAI,CAAC,QAAQ,IAAI,OAAO,IAAI,GAAG;AAC7B,cAAM,QAAQ,EAAE,aAAa,cAAc,EAAE,cAAc,KAAK,GAAG,EAAE,WAAW,IAAI,EAAE,cAAc;AACpG,gBAAQ,KAAK;AAAA,UACX,IAAI,KAAK;AAAA,UACT,UAAU,KAAK;AAAA,UACf,OAAO,KAAK;AAAA,UACZ,QAAQ;AAAA,UACR,QAAQ,GAAG,KAAK,WAAW,OAAO,IAAI,yCAAyC,CAAC,GAAG,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,UACtG,UAAU,CAAC,IAAI;AAAA,UACf,aAAa;AAAA,YACX,MAAM;AAAA,YACN,YAAY,eAAe,OAAO,IAAI;AAAA,YACtC,SAAS;AAAA,UACX;AAAA,UACA,aAAa;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,EAAG,QAAOO,MAAK,IAAI;AAC1C,WAAO;AAAA,EACT;AACF;AAEA,IAAM,qCAA4C;AAAA,EAChD,IAAI;AAAA,EACJ,UAAUJ;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,EAAE,iBAAiB,IAAI,MAAM,gBAAgB,GAAG;AACtD,UAAM,UAAyB,CAAC;AAChC,eAAW,KAAK,kBAAkB;AAChC,YAAM,OAAOH,UAAQ,EAAE,eAAe,eAAe;AACrD,YAAM,SAAS,MAAM,UAAU,IAAI;AACnC,UAAI,CAAC,OAAQ;AACb,UAAI,EAAE,YAAY;AAChB,YAAI,OAAO,YAAY,MAAM;AAC3B,kBAAQ,KAAK;AAAA,YACX,IAAI,KAAK;AAAA,YACT,UAAU,KAAK;AAAA,YACf,OAAO,KAAK;AAAA,YACZ,QAAQ;AAAA,YACR,QAAQ,cAAc,EAAE,cAAc,mCAAmC,OAAO,OAAO;AAAA,YACvF,UAAU,CAAC,IAAI;AAAA,YACf,aAAa;AAAA,cACX,MAAM;AAAA,cACN,YAAY;AAAA,cACZ,SAAS;AAAA,YACX;AAAA,YACA,aAAa;AAAA,UACf,CAAC;AAAA,QACH;AAAA,MACF,OAAO;AACL,YAAI,OAAO,YAAY,EAAE,aAAa;AACpC,kBAAQ,KAAK;AAAA,YACX,IAAI,KAAK;AAAA,YACT,UAAU,KAAK;AAAA,YACf,OAAO,KAAK;AAAA,YACZ,QAAQ;AAAA,YACR,QAAQ,GAAG,EAAE,WAAW,IAAI,EAAE,cAAc,mCAAmC,OAAO,WAAW,MAAM,uCAAuC,EAAE,WAAW;AAAA,YAC3J,UAAU,CAAC,IAAI;AAAA,YACf,aAAa;AAAA,cACX,MAAM;AAAA,cACN,YAAY,kBAAkB,EAAE,WAAW;AAAA,cAC3C,SAAS;AAAA,YACX;AAAA,YACA,aAAa;AAAA,UACf,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,EAAG,QAAOO,MAAK,IAAI;AAC1C,WAAO;AAAA,EACT;AACF;AAEO,IAAM,mBAA4B;AAAA,EACvCD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,eAAe,UAAU,MAAsE;AAC7F,MAAI;AACF,UAAM,UAAU,MAAMJ,WAAS,MAAM,OAAO;AAC5C,WAAO,oBAAoB,OAAO;AAAA,EACpC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASK,MAAK,OAAwD,QAA8B;AAClG,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,UAAU,MAAM;AAAA,IAChB,OAAO,MAAM;AAAA,IACb,QAAQ;AAAA,IACR;AAAA,IACA,aAAa;AAAA,EACf;AACF;;;ACzaA;AADA,SAAS,WAAAC,iBAAe;AAIxB,IAAMC,YAAW;AAEjB,IAAM,cAAqB;AAAA,EACzB,IAAI;AAAA,EACJ,UAAUA;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,QAAI,CAAC,IAAI,IAAI;AACX,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ,8BAA8B,IAAI,WAAW,eAAe;AAAA,QACpE,UAAU,CAACD,UAAQ,IAAI,aAAa,YAAY,CAAC;AAAA,QACjD,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,SAAS;AAAA,QACX;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AACA,QAAI;AACF,YAAM,MAAM,IAAI,GACb,QAAQ,uEAAuE,EAC/E,IAAI;AACP,UAAI,CAAC,KAAK;AACR,eAAO;AAAA,UACL,IAAI,KAAK;AAAA,UACT,UAAU,KAAK;AAAA,UACf,OAAO,KAAK;AAAA,UACZ,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,UAAU,CAACA,UAAQ,IAAI,aAAa,YAAY,CAAC;AAAA,UACjD,aAAa;AAAA,QACf;AAAA,MACF;AACA,aAAOE,MAAK,IAAI;AAAA,IAClB,SAASC,MAAK;AACZ,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ,4BAA4BA,gBAAe,QAAQA,KAAI,UAAU,OAAOA,IAAG,CAAC;AAAA,QACpF,UAAU,CAACH,UAAQ,IAAI,aAAa,YAAY,CAAC;AAAA,QACjD,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,gBAAuB;AAAA,EAC3B,IAAI;AAAA,EACJ,UAAUC;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,QAAI,CAAC,IAAI,IAAI;AACX,aAAO,QAAQ,MAAM,2BAA2B;AAAA,IAClD;AACA,QAAI;AACJ,QAAI;AACF,aAAO,IAAI,GACR;AAAA,QACC;AAAA,MACF,EACC,IAAI;AAAA,IACT,QAAQ;AACN,aAAO,QAAQ,MAAM,oCAAoC;AAAA,IAC3D;AAEA,UAAMG,eAAc,IAAI,OAAO;AAC/B,UAAM,UAAyB,CAAC;AAChC,eAAW,OAAO,MAAM;AACtB,UAAI,CAAC,IAAI,aAAc;AACvB,YAAM,cAAcJ,UAAQI,cAAa,IAAI,cAAc,YAAY;AACvE,UAAI,CAAE,MAAM,WAAW,WAAW,GAAI;AACpC,gBAAQ,KAAK;AAAA,UACX,IAAI,KAAK;AAAA,UACT,UAAU,KAAK;AAAA,UACf,OAAO,KAAK;AAAA,UACZ,QAAQ;AAAA,UACR,QAAQ,WAAW,IAAI,UAAU,gCAAgC,IAAI,YAAY;AAAA,UACjF,UAAU,CAAC,WAAW;AAAA,UACtB,aAAa;AAAA,YACX,MAAM;AAAA,YACN,YAAY;AAAA,YACZ,SAAS;AAAA,UACX;AAAA,UACA,aAAa;AAAA,QACf,CAAC;AACD;AAAA,MACF;AACA,UAAI,IAAI,iBAAiB;AACvB,cAAM,iBAAiBJ;AAAA,UACrBI;AAAA,UACA,IAAI;AAAA,UACJ;AAAA,UACA,IAAI;AAAA,UACJ;AAAA,QACF;AACA,YAAI,CAAE,MAAM,WAAW,cAAc,GAAI;AACvC,kBAAQ,KAAK;AAAA,YACX,IAAI,KAAK;AAAA,YACT,UAAU,KAAK;AAAA,YACf,OAAO,KAAK;AAAA,YACZ,QAAQ;AAAA,YACR,QAAQ,WAAW,IAAI,UAAU,mCAAmC,IAAI,YAAY,IAAI,IAAI,eAAe;AAAA,YAC3G,UAAU,CAAC,cAAc;AAAA,YACzB,aAAa;AAAA,cACX,MAAM;AAAA,cACN,YAAY;AAAA,cACZ,SAAS;AAAA,YACX;AAAA,YACA,aAAa;AAAA,UACf,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,EAAG,QAAOF,MAAK,IAAI;AAC1C,WAAO;AAAA,EACT;AACF;AAEO,IAAM,kBAA2B,CAAC,aAAa,aAAa;AAEnE,SAASA,MAAK,OAAqE;AACjF,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,UAAU,MAAM;AAAA,IAChB,OAAO,MAAM;AAAA,IACb,QAAQ;AAAA,IACR,aAAa;AAAA,EACf;AACF;AAEA,SAAS,QAAQ,OAAwD,QAA6B;AACpG,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,UAAU,MAAM;AAAA,IAChB,OAAO,MAAM;AAAA,IACb,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,aAAa;AAAA,EACf;AACF;;;ACpJA;AADA,SAAS,WAAAG,iBAAe;AAIxB,IAAMC,YAAW;AAEjB,IAAM,qBAA4B;AAAA,EAChC,IAAI;AAAA,EACJ,UAAUA;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,MAAM,IAAI,OAAO,aAAa;AACpC,QAAI,CAAC,IAAK,QAAOC,SAAQ,MAAM,gCAAgC;AAC/D,QAAI,CAAE,MAAM,WAAW,GAAG,GAAI;AAC5B,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ,6BAA6B,GAAG;AAAA,QACxC,UAAU,CAAC,GAAG;AAAA,QACd,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,SAAS;AAAA,QACX;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AACA,WAAOC,MAAK,IAAI;AAAA,EAClB;AACF;AAEA,IAAM,oBAA2B;AAAA,EAC/B,IAAI;AAAA,EACJ,UAAUF;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,MAAM,IAAI,OAAO,aAAa;AACpC,QAAI,CAAC,IAAK,QAAOC,SAAQ,MAAM,+BAA+B;AAC9D,QAAI,CAAE,MAAM,WAAW,GAAG,GAAI;AAC5B,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ,4BAA4B,GAAG;AAAA,QACvC,UAAU,CAAC,GAAG;AAAA,QACd,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,SAAS;AAAA,QACX;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AACA,WAAOC,MAAK,IAAI;AAAA,EAClB;AACF;AAEA,IAAM,mBAA0B;AAAA,EAC9B,IAAI;AAAA,EACJ,UAAUF;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,QAAI,IAAI,OAAO,QAAQ,KAAM,QAAOE,MAAK,IAAI;AAC7C,UAAMC,eAAc,IAAI,OAAO;AAC/B,QAAI,CAAE,MAAM,WAAWA,YAAW,EAAI,QAAOF,SAAQ,MAAM,iBAAiB;AAC5E,UAAM,UAAU,MAAMF,UAAQI,cAAa,EAAE,eAAe,KAAK,CAAC;AAClE,UAAM,cAAc,QAAQ,KAAK,CAAC,MAAM,EAAE,YAAY,KAAK,CAAC,EAAE,KAAK,WAAW,GAAG,KAAK,CAAC,EAAE,KAAK,WAAW,GAAG,CAAC;AAC7G,QAAI,CAAC,YAAa,QAAOF,SAAQ,MAAM,iBAAiB;AACxD,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,UAAU,KAAK;AAAA,MACf,OAAO,KAAK;AAAA,MACZ,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,SAAS;AAAA,MACX;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EACF;AACF;AAEO,IAAM,oBAA6B,CAAC,oBAAoB,mBAAmB,gBAAgB;AAElG,SAASC,MAAK,OAAqE;AACjF,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,UAAU,MAAM;AAAA,IAChB,OAAO,MAAM;AAAA,IACb,QAAQ;AAAA,IACR,aAAa;AAAA,EACf;AACF;AAEA,SAASD,SAAQ,OAAwD,QAA6B;AACpG,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,UAAU,MAAM;AAAA,IAChB,OAAO,MAAM;AAAA,IACb,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,aAAa;AAAA,EACf;AACF;;;AC3GA;AACA;AACA;AAJA,SAAS,WAAAG,iBAAe;AACxB,SAAS,YAAAC,kBAAgB;AAMzB,IAAMC,YAAW;AAWjB,IAAM,oBAAoB,CAAC,eAAe,kBAAkB,cAAc,eAAe;AAEzF,SAAS,sBAAsB,KAAkC;AAC/D,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,kBAAkB,KAAK,CAAC,MAAM,OAAO,IAAI,CAAC,MAAM,YAAY,IAAI,CAAC,EAAG,SAAS,CAAC;AACvF;AAEA,SAAS,oBAAoB,KAAkC;AAC7D,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,CAAC,sBAAsB,GAAG,KAAK,OAAO,IAAI,cAAc,YAAY,IAAI,UAAU,SAAS;AACpG;AAEA,eAAe,YAAY,KAKxB;AACD,QAAM,OAAOF,UAAQ,IAAI,KAAK,YAAY,cAAc;AACxD,MAAI,CAAE,MAAM,WAAW,IAAI,GAAI;AAC7B,WAAO,EAAE,MAAM,MAAM,MAAM,QAAQ,OAAO,YAAY,KAAK;AAAA,EAC7D;AACA,MAAI;AACF,UAAM,MAAM,MAAMC,WAAS,MAAM,OAAO;AACxC,WAAO,EAAE,MAAM,KAAK,MAAM,GAAG,GAAkB,MAAM,QAAQ,MAAM,YAAY,KAAK;AAAA,EACtF,SAASE,MAAK;AACZ,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,MACR,YAAYA,gBAAe,QAAQA,KAAI,UAAU,OAAOA,IAAG;AAAA,IAC7D;AAAA,EACF;AACF;AAEA,IAAM,eAAsB;AAAA,EAC1B,IAAI;AAAA,EACJ,UAAUD;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,EAAE,MAAM,MAAM,QAAQ,WAAW,IAAI,MAAM,YAAY,GAAG;AAChE,QAAI,CAAC,OAAQ,QAAOE,SAAQ,MAAM,iCAAiC;AACnE,QAAI,YAAY;AACd,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ,4CAA4C,UAAU;AAAA,QAC9D,UAAU,CAAC,IAAI;AAAA,QACf,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,SAAS;AAAA,QACX;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AACA,QAAI,oBAAoB,IAAI,GAAG;AAC7B,aAAOC,MAAK,MAAM,6CAA6C;AAAA,IACjE;AACA,QAAI,CAAC,sBAAsB,IAAI,GAAG;AAChC,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU,CAAC,IAAI;AAAA,QACf,aAAa;AAAA,MACf;AAAA,IACF;AACA,UAAM,UAAoB,CAAC;AAC3B,eAAW,OAAO,CAAC,eAAe,kBAAkB,eAAe,GAAY;AAC7E,UAAI,CAAC,OAAO,GAAG,EAAG,SAAQ,KAAK,GAAG;AAAA,IACpC;AACA,QAAI,QAAQ,SAAS,GAAG;AACtB,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ,uEAAuE,QAAQ,KAAK,IAAI,CAAC;AAAA,QACjG,UAAU,CAAC,IAAI;AAAA,QACf,aAAa;AAAA,MACf;AAAA,IACF;AACA,WAAOA,MAAK,IAAI;AAAA,EAClB;AACF;AAEA,IAAM,4BAAmC;AAAA,EACvC,IAAI;AAAA,EACJ,UAAUH;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,EAAE,MAAM,MAAM,OAAO,IAAI,MAAM,YAAY,GAAG;AACpD,QAAI,CAAC,OAAQ,QAAOE,SAAQ,MAAM,uBAAuB;AACzD,QAAI,oBAAoB,IAAI,EAAG,QAAOA,SAAQ,MAAM,4DAAuD;AAC3G,QAAI,CAAC,MAAM,cAAe,QAAOA,SAAQ,MAAM,8BAA8B;AAC7E,UAAM,eAAeJ,UAAQ,KAAK,eAAe,eAAe;AAChE,QAAI,CAAE,MAAM,WAAW,YAAY,GAAI;AACrC,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ,qBAAqB,KAAK,aAAa;AAAA,QAC/C,UAAU,CAAC,cAAc,IAAI;AAAA,QAC7B,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,SAAS;AAAA,QACX;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AACA,WAAOK,MAAK,IAAI;AAAA,EAClB;AACF;AAEA,IAAM,kBAAyB;AAAA,EAC7B,IAAI;AAAA,EACJ,UAAUH;AAAA,EACV,OAAO;AAAA,EACP,MAAM,IAAI,KAAK;AACb,UAAM,EAAE,MAAM,OAAO,IAAI,MAAM,YAAY,GAAG;AAC9C,QAAI,CAAC,OAAQ,QAAOE,SAAQ,MAAM,qBAAqB;AACvD,QAAI,oBAAoB,IAAI,EAAG,QAAOA,SAAQ,MAAM,0DAAqD;AACzG,QAAI,CAAC,MAAM,cAAe,QAAOA,SAAQ,MAAM,8BAA8B;AAC7E,UAAM,eAAeJ,UAAQ,KAAK,eAAe,eAAe;AAChE,QAAI,CAAE,MAAM,WAAW,YAAY,EAAI,QAAOI,SAAQ,MAAM,yBAAyB;AACrF,QAAI;AACF,YAAM,UAAU,MAAMH,WAAS,cAAc,OAAO;AACpD,YAAM,SAAS,oBAAoB,OAAO;AAC1C,YAAM,WAAWK,kBAAiB,GAAG;AACrC,UAAI,SAAS,IAAI,OAAO,MAAM,GAAG;AAC/B,eAAO;AAAA,UACL,IAAI,KAAK;AAAA,UACT,UAAU,KAAK;AAAA,UACf,OAAO,KAAK;AAAA,UACZ,QAAQ;AAAA,UACR,QAAQ,uDAAuD,OAAO,MAAM;AAAA,UAC5E,UAAU,CAAC,YAAY;AAAA,UACvB,aAAa;AAAA,YACX,MAAM;AAAA,YACN,YAAY;AAAA,YACZ,SAAS;AAAA,UACX;AAAA,UACA,aAAa;AAAA,QACf;AAAA,MACF;AACA,aAAOD,MAAK,IAAI;AAAA,IAClB,QAAQ;AACN,aAAOD,SAAQ,MAAM,+BAA+B;AAAA,IACtD;AAAA,EACF;AACF;AAEA,SAASE,kBAAiB,KAAgC;AACxD,QAAM,SAAS,IAAI,OAAO,UAAU,UAAU,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC;AAC7F,MAAI,OAAO,SAAS,EAAG,QAAO,IAAI,IAAI,MAAM;AAC5C,SAAO,IAAI,IAAI,yBAAyB;AAC1C;AAEO,IAAM,kBAA2B,CAAC,cAAc,2BAA2B,eAAe;AAEjG,SAASD,MAAK,OAAwD,QAA8B;AAClG,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,UAAU,MAAM;AAAA,IAChB,OAAO,MAAM;AAAA,IACb,QAAQ;AAAA,IACR;AAAA,IACA,aAAa;AAAA,EACf;AACF;AAEA,SAASD,SAAQ,OAAwD,QAA6B;AACpG,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,UAAU,MAAM;AAAA,IAChB,OAAO,MAAM;AAAA,IACb,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,aAAa;AAAA,EACf;AACF;;;ACpMO,SAAS,YAAqB;AACnC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;;;ATPA,eAAsB,UAAU,UAAsB,CAAC,GAA0B;AAC/E,QAAM,MAAM,MAAM,kBAAkB,QAAQ,GAAG;AAC/C,MAAI;AACF,WAAO,MAAM,eAAe,KAAK,OAAO;AAAA,EAC1C,UAAE;AACA,sBAAkB,GAAG;AAAA,EACvB;AACF;AAEA,eAAsB,eACpB,KACA,UAAsB,CAAC,GACA;AACvB,QAAM,SAAS,aAAa,UAAU,GAAG,QAAQ,IAAI;AACrD,QAAM,UAAyB,CAAC;AAEhC,QAAM,YAAY,OAAO,KAAK,CAACG,OAAMA,GAAE,OAAO,yBAAyB;AACvE,MAAI,WAAW;AACb,UAAM,MAAM,MAAM,QAAQ,WAAW,GAAG;AACxC,YAAQ,KAAK,GAAG,GAAG;AACnB,UAAM,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,OAAO;AACxD,QAAI,CAAC,YAAY;AACf,iBAAWA,MAAK,QAAQ;AACtB,YAAIA,GAAE,OAAO,UAAU,GAAI;AAC3B,gBAAQ,KAAKC,SAAQD,IAAG,sCAAsC,CAAC;AAAA,MACjE;AACA,aAAO,SAAS,OAAO;AAAA,IACzB;AAAA,EACF;AAEA,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,OAAO,0BAA2B;AAC5C,UAAM,MAAM,MAAM,QAAQ,OAAO,GAAG;AACpC,YAAQ,KAAK,GAAG,GAAG;AAAA,EACrB;AAEA,SAAO,SAAS,OAAO;AACzB;AAEA,SAAS,aAAa,QAAiB,MAAmC;AACxE,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,OAAO,OAAO,CAACA,OAAMA,GAAE,OAAO,IAAI;AAC3C;AAEA,eAAe,QAAQ,OAAc,KAA2C;AAC9E,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,IAAI,GAAG;AAC/B,WAAO,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,GAAG;AAAA,EACxC,SAASE,MAAK;AACZ,UAAM,SAASA,gBAAe,QAAQA,KAAI,UAAU,OAAOA,IAAG;AAC9D,WAAO;AAAA,MACL;AAAA,QACE,IAAI,MAAM;AAAA,QACV,UAAU,MAAM;AAAA,QAChB,OAAO,MAAM;AAAA,QACb,QAAQ;AAAA,QACR,QAAQ,gBAAgB,MAAM;AAAA,QAC9B,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAASD,SAAQ,OAAc,QAA6B;AAC1D,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,UAAU,MAAM;AAAA,IAChB,OAAO,MAAM;AAAA,IACb,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,aAAa;AAAA,EACf;AACF;AAEA,eAAe,SAAS,QAA8C;AACpE,QAAM,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,EAAE;AACzD,aAAWD,MAAK,OAAQ,SAAQA,GAAE,MAAM;AACxC,QAAMG,WAAW,MAAM,YAAY,KAAM;AACzC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,gBAAgBA;AAAA,IAChB,QAAO,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC9B;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,cAAsC;AACnD,MAAI;AACF,UAAM,OAAOC,eAAc,YAAY,GAAG;AAC1C,QAAI,MAAMC,SAAQ,IAAI;AACtB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAI;AACF,cAAM,MAAM,MAAMC,WAASC,MAAK,KAAK,cAAc,GAAG,OAAO;AAC7D,cAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,eAAO,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU;AAAA,MAC/D,QAAQ;AACN,cAAMF,SAAQ,GAAG;AAAA,MACnB;AAAA,IACF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AUlHA,IAAM,YAAY,QAAQ,OAAO,SAAS,QAAQ,IAAI,aAAa;AAEnE,IAAM,QAAQ;AAAA,EACZ,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AACR;AAEA,SAAS,EAAE,MAAc,MAAsB;AAC7C,SAAO,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,KAAK,KAAK;AACtD;AAEA,IAAM,eAAsD;AAAA,EAC1D,MAAM,EAAE,MAAM,OAAO,OAAO;AAAA,EAC5B,MAAM,EAAE,MAAM,QAAQ,OAAO;AAAA,EAC7B,OAAO,EAAE,MAAM,KAAK,OAAO;AAAA,EAC3B,SAAS,EAAE,MAAM,MAAM,OAAO;AAChC;AAMO,SAAS,YAAY,QAAsB,UAA8B,EAAE,SAAS,MAAM,GAAW;AAC1G,QAAM,QAAkB,CAAC;AACzB,QAAM;AAAA,IACJ,EAAE,MAAM,MAAM,gBAAgB,IAC5B,EAAE,MAAM,KAAK,cAAc,OAAO,cAAc,SAAS,OAAO,KAAK,GAAG;AAAA,EAC5E;AACA,QAAM,KAAK,EAAE;AAEb,QAAM,aAAa,oBAAI,IAA2B;AAClD,aAAW,SAAS,OAAO,QAAQ;AACjC,UAAM,OAAO,WAAW,IAAI,MAAM,QAAQ,KAAK,CAAC;AAChD,SAAK,KAAK,KAAK;AACf,eAAW,IAAI,MAAM,UAAU,IAAI;AAAA,EACrC;AAEA,aAAW,CAAC,UAAU,MAAM,KAAK,YAAY;AAC3C,UAAM,UAAU,QAAQ,UAAU,SAAS,OAAO,OAAO,CAACG,OAAMA,GAAE,WAAW,MAAM;AACnF,QAAI,QAAQ,WAAW,GAAG;AACxB,YAAM,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,cAAc,CAAC;AACnD;AAAA,IACF;AACA,UAAM,KAAK,EAAE,MAAM,MAAM,IAAI,QAAQ,GAAG,CAAC;AACzC,eAAW,SAAS,SAAS;AAC3B,YAAM,KAAK,KAAK,aAAa,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,MAAM,MAAM,EAAE,CAAC,KAAK,MAAM,KAAK,EAAE;AACxF,UAAI,MAAM,OAAQ,OAAM,KAAK,YAAY,EAAE,MAAM,KAAK,MAAM,MAAM,CAAC,EAAE;AACrE,UAAI,MAAM,YAAY,MAAM,SAAS,SAAS,GAAG;AAC/C,mBAAW,QAAQ,MAAM,SAAS,MAAM,GAAG,CAAC,GAAG;AAC7C,gBAAM,KAAK,YAAY,EAAE,MAAM,MAAM,YAAO,IAAI,CAAC,EAAE;AAAA,QACrD;AACA,YAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,gBAAM,KAAK,YAAY,EAAE,MAAM,MAAM,eAAU,MAAM,SAAS,SAAS,CAAC,OAAO,CAAC,EAAE;AAAA,QACpF;AAAA,MACF;AACA,UAAI,MAAM,eAAe,MAAM,YAAY,YAAY;AACrD,cAAM,KAAK,YAAY,EAAE,MAAM,KAAK,UAAU,MAAM,YAAY,UAAU,CAAC,EAAE;AAC7E,YAAI,MAAM,YAAY,SAAS;AAC7B,gBAAM,KAAK,YAAY,EAAE,MAAM,MAAM,OAAO,MAAM,YAAY,OAAO,CAAC,EAAE;AAAA,QAC1E;AAAA,MACF;AAAA,IACF;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,QAAM,IAAI,OAAO;AACjB,QAAM;AAAA,IACJ,EAAE,MAAM,MAAM,WAAW,IACvB,GAAG,EAAE,MAAM,OAAO,EAAE,OAAO,SAAS,CAAC,KAClC,EAAE,MAAM,QAAQ,EAAE,OAAO,WAAW,CAAC,KACrC,EAAE,MAAM,KAAK,EAAE,QAAQ,SAAS,CAAC,KACjC,EAAE,MAAM,MAAM,EAAE,UAAU,UAAU,CAAC;AAAA,EAC5C;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;;;AChFO,SAAS,WAAW,QAA8B;AACvD,SAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AACvC;;;AZAA;AACA;AASO,IAAM,gBAAgB,IAAIC,SAAQ,QAAQ,EAC9C,YAAY,gEAAgE,EAC5E,OAAO,UAAU,iDAAiD,EAClE,OAAO,SAAS,+DAA+D,EAC/E,OAAO,qBAAqB,iCAAiC,EAC7D,OAAO,aAAa,wCAAwC,EAC5D,OAAO,OAAO,YAA2B;AACxC,MAAI,CAAE,MAAM,WAAW,YAAY,CAAC,GAAI;AACtC,UAAM,MAAM;AACZ,QAAI,QAAQ,MAAM;AAChB,cAAQ,OAAO;AAAA,QACb,KAAK;AAAA,UACH;AAAA,YACE,SAAS;AAAA,YACT,OAAO;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF,IAAI;AAAA,MACN;AAAA,IACF,OAAO;AACL,cAAQ,OAAO,MAAM,MAAM,IAAI;AAAA,IACjC;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,UAAU,EAAE,MAAM,QAAQ,KAAK,CAAC;AAErD,QAAI,QAAQ,MAAM;AAChB,cAAQ,OAAO,MAAM,WAAW,MAAM,IAAI,IAAI;AAAA,IAChD,OAAO;AACL,cAAQ,OAAO,MAAM,YAAY,QAAQ,EAAE,SAAS,QAAQ,WAAW,MAAM,CAAC,IAAI,IAAI;AAAA,IACxF;AAEA,QAAI,QAAQ,OAAO,CAAC,QAAQ,MAAM;AAChC,cAAQ,OAAO;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,OAAO,QAAQ,QAAQ;AACxC,YAAQ,KAAK,WAAW,IAAI,CAAC;AAAA,EAC/B,SAASC,MAAK;AACZ,UAAM,MAAMA,gBAAe,QAAQA,KAAI,UAAU,OAAOA,IAAG;AAC3D,QAAI,QAAQ,MAAM;AAChB,cAAQ,OAAO,MAAM,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI;AAAA,IACrF,OAAO;AACL,cAAQ,OAAO,MAAM,yBAAyB,GAAG;AAAA,CAAI;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;;;AahEH;AACA;AACAC;AAJA,SAAS,WAAAC,iBAAe;AACxB,SAAS,YAAAC,kBAAgB;AAMzB;AACA;AAWA,SAAS,UAAkB;AACzB,SAAO,WAAW,EAAE,MAAM,GAAG,EAAE,CAAC;AAClC;AAEA,SAASC,kBAAiB,SAAiB,KAAa,OAAgC;AACtF,QAAM,aAAa,IAAI,OAAO,KAAK,GAAG,aAAa,GAAG;AACtD,MAAI,WAAW,KAAK,OAAO,GAAG;AAC5B,WAAO,QAAQ,QAAQ,YAAY,MAAM,KAAK,EAAE;AAAA,EAClD;AACA,SAAO;AACT;AAEA,eAAsB,eACpB,QACA,MACA,UAA0B,CAAC,GACZ;AACf,MAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,GAAG;AACzB,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AAEA,QAAM,OAAoB,QAAQ,QAAQ;AAC1C,MAAI,CAAC,CAAC,YAAY,QAAQ,UAAU,EAAE,SAAS,IAAI,GAAG;AACpD,UAAM,IAAI,MAAM,yBAAyB,IAAI,8CAA8C;AAAA,EAC7F;AAEA,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,UAAU,QAAQ,MAAM,WAAW,QAAQ,GAAG,IAAI,OAAO;AAE/D,MAAI;AACJ,MAAI;AACJ,MAAI,QAAQ,SAAS;AACnB,QAAI,CAAC,YAAY,QAAQ,OAAO,GAAG;AACjC,YAAM,IAAI,MAAM,yBAAyB,QAAQ,OAAO,IAAI;AAAA,IAC9D;AACA,QAAI,CAAC,YAAY,MAAM,GAAG;AACxB,YAAM,IAAI,MAAM,4BAA4B,MAAM,IAAI;AAAA,IACxD;AACA,oBAAgBC,UAAQ,SAAS,QAAQ,SAAS,eAAe,MAAM;AACvE,oBAAgB;AAAA,EAClB,OAAO;AACL,UAAM,WAAW,MAAM,sBAAsB,SAAS,eAAiB,GAAG,MAAM;AAChF,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,eAAe,MAAM,mEAAmE;AAAA,IAC1G;AACA,oBAAgB,SAAS;AACzB,oBAAgB,SAAS,aAAa,SAAS,KAAK,SAAS;AAAA,EAC/D;AAEA,QAAM,eAAeA,UAAQ,eAAe,aAAa;AACzD,QAAM,YAAY,aAAa;AAC/B,QAAM,SAAS,QAAQ,UAAU,QAAQ,IAAI,QAAQ;AAErD,MAAI;AACJ,MAAI,eAAe;AACnB,MAAI,MAAM,WAAW,YAAY,GAAG;AAClC,qBAAiB,MAAMC,WAAS,cAAc,OAAO;AACrD,UAAM,aAAa,eAAe,MAAM,uBAAuB;AAC/D,QAAI,WAAY,gBAAe,SAAS,WAAW,CAAC,GAAG,EAAE;AAAA,EAC3D,OAAO;AACL,qBAAiB,eAAe,EAAE,YAAY,eAAe,UAAU,CAAC;AAAA,EAC1E;AAEA,QAAM,UAAmB;AAAA,IACvB,IAAI,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,SAAS,QAAQ;AAAA,IACjB,UAAU,SAAS,aAAa,QAAQ;AAAA,EAC1C;AAEA,QAAM,QAAQ,mBAAmB,OAAO;AACxC,QAAM,YAAY,eAAe;AAEjC,MAAI,OAAOF,kBAAiB,gBAAgB,cAAc,SAAS;AACnE,SAAOA,kBAAiB,MAAM,WAAW,IAAI,SAAS,GAAG;AAEzD,MAAI,KAAK,SAAS,kBAAkB,GAAG;AACrC,WAAO,KAAK,QAAQ,oBAAoB,MAAM,QAAQ,CAAC;AAAA,EACzD,OAAO;AACL,WAAO,GAAG,KAAK,QAAQ,CAAC;AAAA;AAAA,EAAO,KAAK;AAAA,EACtC;AAEA,QAAM,eAAe,cAAc,IAAI;AAEvC,UAAQ,IAAI,SAAS,IAAI,YAAY,QAAQ,EAAE,OAAO,aAAa,KAAK,YAAY,GAAG;AACvF,MAAI,QAAQ,SAAS;AACnB,YAAQ,IAAI,kBAAkB,QAAQ,OAAO,EAAE;AAAA,EACjD;AACF;;;AC5GA;AACA;AACAG;AAJA,SAAS,WAAAC,iBAAe;AACxB,SAAS,YAAAC,kBAAgB;AAKzB;AACA;AAQA,SAASC,kBAAiB,SAAiB,KAAa,OAAuB;AAC7E,QAAM,aAAa,IAAI,OAAO,KAAK,GAAG,aAAa,GAAG;AACtD,MAAI,WAAW,KAAK,OAAO,GAAG;AAC5B,WAAO,QAAQ,QAAQ,YAAY,MAAM,KAAK,EAAE;AAAA,EAClD;AACA,SAAO;AACT;AAEA,eAAsB,eACpB,QACA,MACA,UAA0B,CAAC,GACZ;AACf,MAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,GAAG;AACzB,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AAEA,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,UAAU,QAAQ,MAAM,WAAW,QAAQ,GAAG,IAAI,OAAO;AAE/D,MAAI;AACJ,MAAI;AACJ,MAAI,QAAQ,SAAS;AACnB,QAAI,CAAC,YAAY,QAAQ,OAAO,GAAG;AACjC,YAAM,IAAI,MAAM,yBAAyB,QAAQ,OAAO,IAAI;AAAA,IAC9D;AACA,QAAI,CAAC,YAAY,MAAM,GAAG;AACxB,YAAM,IAAI,MAAM,4BAA4B,MAAM,IAAI;AAAA,IACxD;AACA,oBAAgBC,UAAQ,SAAS,QAAQ,SAAS,eAAe,MAAM;AACvE,gBAAY;AAAA,EACd,OAAO;AACL,UAAM,WAAW,MAAM,sBAAsB,SAAS,eAAiB,GAAG,MAAM;AAChF,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,sBAAsB,MAAM,wDAAwD;AAAA,IACtG;AACA,oBAAgB,SAAS;AACzB,gBAAY,SAAS,aAAa,SAAS,KAAK,SAAS;AAAA,EAC3D;AAEA,QAAM,mBAAmBA,UAAQ,eAAe,eAAe;AAC/D,MAAI,CAAE,MAAM,WAAW,gBAAgB,GAAI;AACzC,UAAM,IAAI,MAAM,8BAA8B,gBAAgB,EAAE;AAAA,EAClE;AAEA,QAAM,SAAS,QAAQ,QAClB,QAAQ,IAAI,sBACZ;AAEL,MAAI,UAAU,MAAMC,WAAS,kBAAkB,OAAO;AACtD,QAAM,WAAW,SAAS,KAAK,KAAK,CAAC,WAAW,MAAM;AAEtD,QAAM,eAAe;AACrB,MAAI,aAAa,KAAK,OAAO,GAAG;AAC9B,cAAU,QAAQ;AAAA,MAChB;AAAA,MACA,CAAC,IAAI,SAAS,gBAAgB;AAC5B,eAAO,GAAG,QAAQ,QAAQ,CAAC;AAAA,EAAK,QAAQ;AAAA,EAAK,WAAW;AAAA,MAC1D;AAAA,IACF;AAAA,EACF,OAAO;AAEL,cAAU,GAAG,QAAQ,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA,EAAmB,QAAQ;AAAA;AAAA,EAC3D;AAEA,QAAM,YAAY,aAAa;AAC/B,YAAUF,kBAAiB,SAAS,WAAW,IAAI,SAAS,GAAG;AAE/D,QAAM,eAAe,kBAAkB,OAAO;AAE9C,UAAQ,IAAI,iBAAiB,SAAS,KAAK,KAAK,KAAK,CAAC,WAAW,MAAM,GAAG;AAC5E;;;ACrFAG;AADA,SAAS,WAAAC,iBAAe;AAQxB,eAAe,qBAAqBC,cAAuC;AACzE,MAAI;AACF,UAAM,UAAU,MAAMC,UAAQD,cAAa,EAAE,eAAe,KAAK,CAAC;AAClE,WAAO,QAAQ,KAAK,CAAC,UAAU,MAAM,YAAY,CAAC;AAAA,EACpD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,kBAAoC;AACjD,QAAM,SAAS,MAAM,WAAW;AAChC,MAAI,OAAO,WAAW,WAAW;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,MAAM,QAAQ,IAAI;AAAA,IACpB,sCAAsC,QAAQ;AAAA,IAC9C,sCAAsC,OAAO;AAAA,IAC7C,qCAAqC;AAAA,IACrC,qBAAqB,OAAO,iBAAiB;AAAA,EAC/C,CAAC;AAED,SAAO;AAAA,IACL,mBACE,kBACA,wBACA;AAAA,EACJ;AACF;AAEA,eAAsB,wBAAwD;AAC5E,MAAI,CAAE,MAAM,uBAAuB,GAAI;AACrC,WAAO;AAAA,EACT;AAEA,SAAQ,MAAM,gBAAgB,IAAK,cAAc;AACnD;;;AC5CA;AACA;AANA,SAAS,iBAAAE,sBAAqB;AAC9B,SAAS,YAAAC,kBAAgB;AACzB,SAAS,WAAAC,WAAS,QAAAC,OAAM,WAAAC,iBAAe;AACvC,SAAS,SAAAC,cAAa;AACtB,SAAS,mBAAAC,wBAAuB;;;ACJhC,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,YAAAC,kBAAgB;AACzB,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAE9B,eAAsB,mBACpB,WACwB;AACxB,MAAI;AACF,UAAM,aAAaH,eAAc,SAAS;AAC1C,UAAM,UAAUE,SAAQA,SAAQ,UAAU,CAAC;AAC3C,UAAM,MAAM,MAAMD,WAASE,MAAK,SAAS,cAAc,GAAG,OAAO;AACjE,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU;AAAA,EAC/D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ADAA,IAAM,aAAaC,UAAQ,YAAY,GAAG,kBAAkB;AAC5D,IAAM,YAAY,oBAAI,IAAI,CAAC,MAAM,UAAU,MAAM,aAAa,MAAM,CAAC;AACrE,IAAM,4BAA4B;AAElC,SAAS,gBAAgB,WAA4B;AACnD,MAAI;AACJ,MAAI;AACF,iBAAaC,eAAc,SAAS;AAAA,EACtC,QAAQ;AACN,WAAO;AAAA,EACT;AACA,QAAM,IAAI,WAAW,QAAQ,OAAO,GAAG;AACvC,MAAI,EAAE,SAAS,QAAQ,EAAG,QAAO;AACjC,MAAI,EAAE,SAAS,YAAY,KAAK,EAAE,SAAS,OAAO,EAAG,QAAO;AAC5D,MAAI,EAAE,SAAS,0BAA0B,KAAK,EAAE,SAAS,QAAQ,EAAG,QAAO;AAE3E,QAAM,KAAK,QAAQ,IAAI,yBAAyB;AAChD,MAAI,GAAG,SAAS,MAAM,EAAG,QAAO;AAEhC,SAAO;AACT;AAEA,eAAe,YAA4C;AACzD,MAAI,CAAE,MAAM,WAAW,UAAU,EAAI,QAAO;AAC5C,MAAI;AACF,UAAM,MAAM,MAAMC,WAAS,YAAY,OAAO;AAC9C,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,WAAW,OAAsC;AAC9D,QAAM,eAAe,YAAY,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,CAAI;AACxE;AAEA,eAAe,gBAA0D;AACvE,QAAM,UAAUC,UAAQ,QAAQ,QAAQ;AACxC,QAAM,QAAQ,QAAQ,aAAa;AACnC,QAAM,UAAU,QAAQ,YAAY;AACpC,QAAM,WAAWC,MAAK,SAAS,OAAO;AACtC,MAAI,MAAM,WAAW,QAAQ,GAAG;AAC9B,WAAO,EAAE,KAAK,UAAU,OAAO,MAAM;AAAA,EACvC;AACA,SAAO,EAAE,KAAK,OAAO,OAAO,MAAM;AACpC;AAEA,eAAe,kBAAoC;AACjD,QAAM,EAAE,KAAK,MAAM,IAAI,MAAM,cAAc;AAC3C,SAAO,IAAI,QAAQ,CAAC,mBAAmB;AACrC,UAAM,QAAQC,OAAM,KAAK,CAAC,WAAW,MAAM,SAAS,GAAG;AAAA,MACrD,OAAO;AAAA,MACP;AAAA,IACF,CAAC;AACD,UAAM,GAAG,QAAQ,CAAC,SAAS,eAAe,SAAS,CAAC,CAAC;AACrD,UAAM,GAAG,SAAS,MAAM,eAAe,KAAK,CAAC;AAAA,EAC/C,CAAC;AACH;AAEA,eAAe,oBAA4C;AACzD,QAAM,EAAE,KAAK,MAAM,IAAI,MAAM,cAAc;AAC3C,QAAM,WAAW,MAAM,IAAI,QAAuB,CAAC,mBAAmB;AACpE,UAAM,QAAQA,OAAM,KAAK,CAAC,QAAQ,IAAI,GAAG;AAAA,MACvC;AAAA,MACA,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,IACpC,CAAC;AACD,QAAI,MAAM;AACV,UAAMC,SAAQ,WAAW,MAAM;AAC7B,YAAM,KAAK;AACX,qBAAe,IAAI;AAAA,IACrB,GAAG,yBAAyB;AAC5B,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC1C,aAAO,MAAM,SAAS,OAAO;AAAA,IAC/B,CAAC;AACD,UAAM,GAAG,QAAQ,CAAC,SAAS;AACzB,mBAAaA,MAAK;AAClB,qBAAe,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI;AAAA,IAC/C,CAAC;AACD,UAAM,GAAG,SAAS,MAAM;AACtB,mBAAaA,MAAK;AAClB,qBAAe,IAAI;AAAA,IACrB,CAAC;AAAA,EACH,CAAC;AACD,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI;AACF,UAAM,eAAeF,MAAK,UAAU,WAAW,cAAc;AAC7D,QAAI,CAAE,MAAM,WAAW,YAAY,EAAI,QAAO;AAC9C,UAAM,MAAM,MAAMF,WAAS,cAAc,OAAO;AAChD,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU;AAAA,EAC/D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,cAAc,GAAW,GAAmB;AAC1D,QAAM,QAAQ,CAAC,MAAwB;AACrC,UAAM,OAAO,EAAE,MAAM,MAAM,EAAE,CAAC;AAC9B,UAAM,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AACxD,QAAI,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,SAAS,CAAC,CAAC,EAAG,QAAO,CAAC;AACpD,WAAO,MAAM,SAAS,EAAG,OAAM,KAAK,CAAC;AACrC,WAAO,MAAM,MAAM,GAAG,CAAC;AAAA,EACzB;AACA,QAAM,KAAK,MAAM,CAAC;AAClB,QAAM,KAAK,MAAM,CAAC;AAClB,MAAI,GAAG,WAAW,KAAK,GAAG,WAAW,EAAG,QAAO;AAC/C,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,QAAI,GAAG,CAAC,IAAI,GAAG,CAAC,EAAG,QAAO;AAC1B,QAAI,GAAG,CAAC,IAAI,GAAG,CAAC,EAAG,QAAO;AAAA,EAC5B;AACA,SAAO;AACT;AAEA,eAAe,UAAU,aAAsC;AAC7D,QAAM,KAAKK,iBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC3E,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,WAAW,MAAM,WAAW,MAAM;AACxC,UAAQ,KAAK,UAAU,QAAQ;AAC/B,MAAI;AACF,UAAM,MAAM,MAAM,GAAG,SAAS,aAAa;AAAA,MACzC,QAAQ,WAAW;AAAA,IACrB,CAAC;AACD,WAAO,IAAI,KAAK;AAAA,EAClB,QAAQ;AACN,WAAO;AAAA,EACT,UAAE;AACA,YAAQ,IAAI,UAAU,QAAQ;AAC9B,OAAG,MAAM;AAAA,EACX;AACF;AAEA,eAAe,mBACb,WACA,OACe;AACf,QAAM,UAAU,MAAM,mBAAmB,SAAS;AAClD,MAAI,CAAC,QAAS;AACd,MAAI,MAAM,2BAA2B,QAAS;AAE9C,QAAM,UAAU,MAAM,kBAAkB;AACxC,MAAI,CAAC,QAAS;AACd,MAAI,cAAc,SAAS,OAAO,KAAK,EAAG;AAE1C,UAAQ,IAAI,EAAE;AACd,UAAQ;AAAA,IACN,2BAA2B,OAAO,yBAAyB,OAAO;AAAA,EACpE;AACA,UAAQ,IAAI,6BAAwB;AACpC,UAAQ,IAAI,gDAA2C;AACvD,QAAM,SAAS,MAAM,UAAU,gBAAgB;AAE/C,QAAM,aAAa;AAAA,IACjB,wBAAwB;AAAA,IACxB,oBAAmB,oBAAI,KAAK,GAAE,YAAY;AAAA,EAC5C;AAEA,MAAI,WAAW,KAAK;AAClB,YAAQ,IAAI,mCAAmC;AAC/C,UAAM,KAAK,MAAM,gBAAgB;AACjC,QAAI,IAAI;AACN,YAAM,WAAW,EAAE,GAAG,OAAO,GAAG,WAAW,CAAC;AAC5C,cAAQ;AAAA,QACN;AAAA,cAAiB,OAAO;AAAA;AAAA,MAC1B;AAAA,IACF,OAAO;AACL,cAAQ,IAAI,+CAA+C;AAAA,IAC7D;AACA;AAAA,EACF;AAEA,QAAM,WAAW,EAAE,GAAG,OAAO,GAAG,WAAW,CAAC;AAC9C;AAEA,eAAsB,mBAAmB,WAAkC;AACzE,MAAI,CAAC,gBAAgB,SAAS,EAAG;AACjC,MAAI,QAAQ,IAAI,gCAAgC,IAAK;AACrD,MAAI,CAAC,QAAQ,OAAO,SAAS,CAAC,QAAQ,MAAM,MAAO;AAEnD,QAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,MAAI,KAAK,KAAK,CAAC,MAAM,UAAU,IAAI,CAAC,CAAC,EAAG;AAExC,QAAM,QAAQ,MAAM,UAAU;AAC9B,MAAI,OAAO,aAAa,QAAS;AACjC,MAAI,OAAO,aAAa,aAAa;AACnC,UAAM,mBAAmB,WAAW,KAAK;AACzC;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ;AAAA,IACN;AAAA,EACF;AACA,UAAQ,IAAI,6BAAwB;AACpC,UAAQ,IAAI,+CAA0C;AACtD,UAAQ,IAAI,mCAA8B;AAC1C,QAAM,SAAS,MAAM,UAAU,kBAAkB;AAEjD,MAAI,WAAW,KAAK;AAClB,YAAQ,IAAI,oCAAoC;AAChD,UAAM,KAAK,MAAM,gBAAgB;AACjC,QAAI,IAAI;AACN,YAAM,WAAW;AAAA,QACf,UAAU;AAAA,QACV,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AACD,cAAQ,IAAI,4DAA4D;AAAA,IAC1E,OAAO;AACL,cAAQ,IAAI,+CAA+C;AAAA,IAC7D;AAAA,EACF,WAAW,WAAW,KAAK;AACzB,UAAM,WAAW;AAAA,MACf,UAAU;AAAA,MACV,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AACD,YAAQ,IAAI,kCAA6B;AAAA,EAC3C;AACF;;;A3EzMA,MAAM,mBAAmB,YAAY,GAAG;AAExC,IAAM,UAAU,IAAIC,SAAQ;AAC5B,IAAM,UAAW,MAAM,mBAAmB,YAAY,GAAG,KAAM;AAE/D,QACG,KAAK,SAAS,EACd,YAAY,+CAA+C,EAC3D,QAAQ,OAAO;AAElB,QACG,QAAQ,MAAM,EACd,YAAY,uDAAuD,EACnE,OAAO,WAAW,gCAAgC,EAClD,OAAO,OAAO,YAAY;AACzB,MAAI;AACF,UAAM,YAAY,OAAO;AAAA,EAC3B,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,gBAAgB,EACxB,YAAY,8CAA8C,EAC1D,SAAS,WAAW,eAAe,EACnC,OAAO,iBAAiB,8BAA8B,EACtD,OAAO,gBAAgB,oCAAoC,EAC3D,OAAO,2BAA2B,uCAAuC,EACzE,OAAO,OAAO,OAAO,YAAY;AAChC,MAAI;AACF,UAAM,qBAAqB,OAAO,OAAO;AAAA,EAC3C,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,mBAAmB,EAC3B,YAAY,0CAA0C,EACtD,SAAS,WAAW,kBAAkB,EACtC,OAAO,oBAAoB,iDAAiD,EAC5E,OAAO,aAAa,kEAAkE,EACtF,OAAO,iBAAiB,4FAA4F,EACpH;AAAA,EACC;AAAA,EACA;AAAA,EACA;AACF,EACC,OAAO,iBAAiB,+CAA+C,EACvE,OAAO,wBAAwB,+DAA+D,EAC9F,OAAO,mBAAmB,6EAA6E,EACvG,OAAO,gBAAgB,4DAA4D,EACnF,OAAO,OAAO,OAAO,YAAY;AAChC,MAAI;AACF,UAAM,wBAAwB,OAAO,OAAO;AAAA,EAC9C,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,SAAS,EACjB,YAAY,4DAA4D,EACxE,SAAS,gBAAgB,8DAA8D,EACvF,SAAS,UAAU,cAAc,EACjC,OAAO,oBAAoB,8CAA8C,EACzE,OAAO,mBAAmB,mCAAmC,EAC7D,OAAO,iBAAiB,4CAA4C,MAAM,EAC1E,OAAO,mBAAmB,+CAA+C,EACzE,OAAO,gBAAgB,oCAAoC,EAC3D,OAAO,OAAO,YAAY,MAAM,YAAY;AAC3C,MAAI;AACF,UAAM,eAAe,YAAY,MAAM,OAAO;AAAA,EAChD,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,SAAS,EACjB,YAAY,qEAAqE,EACjF,SAAS,YAAY,8DAA8D,EACnF,SAAS,UAAU,WAAW,EAC9B,OAAO,oBAAoB,8CAA8C,EACzE,OAAO,mBAAmB,kDAAkD,EAC5E,OAAO,gBAAgB,oCAAoC,EAC3D,OAAO,OAAO,QAAQ,MAAM,YAAY;AACvC,MAAI;AACF,UAAM,eAAe,QAAQ,MAAM,OAAO;AAAA,EAC5C,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,WAAW,EACnB,YAAY,0CAA0C,EACtD,OAAO,mBAAmB,gCAAgC,MAAM,EAChE,OAAO,SAAS,8CAA8C,KAAK,EACnE,OAAO,iBAAiB,0CAA0C,KAAK,EACvE,OAAO,cAAc,sCAAsC,KAAK,EAChE,OAAO,aAAa,uCAAuC,EAC3D,OAAO,OAAO,YAAY;AACzB,MAAI;AACF,UAAM,WAAW,CAAC,4BAA4B;AAC9C,UAAM,iBAAiB;AAAA,MACrB,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,mCAAmC,EAC/C,SAAS,gBAAgB,iBAAiB,EAC1C,OAAO,oBAAoB,qBAAqB,EAChD,OAAO,kBAAkB,sBAAsB,EAC/C,OAAO,gBAAgB,oCAAoC,EAC3D,OAAO,OAAO,YAAY,YAAY;AACrC,MAAI;AACF,UAAM,cAAc,YAAY,OAAO;AAAA,EACzC,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,yCAAyC,EACrD,SAAS,gBAAgB,iBAAiB,EAC1C,OAAO,oBAAoB,qBAAqB,EAChD,OAAO,kBAAkB,+CAA+C,EACxE,OAAO,gBAAgB,oCAAoC,EAC3D,OAAO,OAAO,YAAY,YAAY;AACrC,MAAI;AACF,UAAM,aAAa,YAAY,OAAO;AAAA,EACxC,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,UAAU,EAClB,YAAY,uCAAuC,EACnD,SAAS,gBAAgB,iBAAiB,EAC1C,OAAO,oBAAoB,qBAAqB,EAChD,OAAO,gBAAgB,oCAAoC,EAC3D,OAAO,OAAO,YAAY,YAAY;AACrC,MAAI;AACF,UAAM,gBAAgB,YAAY,OAAO;AAAA,EAC3C,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,qCAAqC,EACjD,SAAS,gBAAgB,iBAAiB,EAC1C,OAAO,oBAAoB,qBAAqB,EAChD,OAAO,mBAAmB,qBAAqB,EAC/C,OAAO,gBAAgB,oCAAoC,EAC3D,OAAO,OAAO,YAAY,YAAY;AACrC,MAAI;AACF,UAAM,aAAa,YAAY,OAAO;AAAA,EACxC,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,SAAS,EACjB,YAAY,gDAAgD,EAC5D,SAAS,gBAAgB,iBAAiB,EAC1C,OAAO,oBAAoB,qBAAqB,EAChD,OAAO,gBAAgB,oCAAoC,EAC3D,OAAO,OAAO,YAAY,YAAY;AACrC,MAAI;AACF,UAAM,eAAe,YAAY,OAAO;AAAA,EAC1C,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,oCAAoC,EAChD,SAAS,gBAAgB,iBAAiB,EAC1C,OAAO,oBAAoB,qBAAqB,EAChD,OAAO,gBAAgB,oCAAoC,EAC3D,OAAO,OAAO,YAAY,YAAY;AACrC,MAAI;AACF,UAAM,cAAc,YAAY,OAAO;AAAA,EACzC,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,oCAAoC,EAChD,SAAS,gBAAgB,iBAAiB,EAC1C,OAAO,oBAAoB,qBAAqB,EAChD,OAAO,gBAAgB,oCAAoC,EAC3D,OAAO,OAAO,YAAY,YAAY;AACrC,MAAI;AACF,UAAM,YAAY,YAAY,OAAO;AAAA,EACvC,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,yCAAyC,EACrD,SAAS,gBAAgB,iBAAiB,EAC1C,OAAO,oBAAoB,qBAAqB,EAChD,OAAO,gBAAgB,oCAAoC,EAC3D,OAAO,OAAO,YAAY,YAAY;AACrC,MAAI;AACF,UAAM,cAAc,YAAY,OAAO;AAAA,EACzC,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,2EAA2E,EACvF,OAAO,SAAS,+DAA+D,EAC/E,OAAO,YAAY,gCAAgC,EACnD,OAAO,WAAW,0BAA0B,EAC5C,OAAO,uBAAuB,mDAAmD,EACjF,OAAO,sBAAsB,6CAA6C,EAC1E,OAAO,mCAAmC,sDAAsD,EAChG,OAAO,eAAe,kCAAkC,EACxD,OAAO,OAAO,YAAY;AACzB,MAAI;AACF,UAAM,aAAa,OAAO;AAAA,EAC5B,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,gBAAgB,EACxB,YAAY,wCAAwC,EACpD,OAAO,WAAW,+CAA+C,EACjE,OAAO,uBAAuB,4CAA4C,EAC1E,OAAO,UAAU,8DAA8D,EAC/E,OAAO,OAAO,YAAY;AACzB,MAAI;AACF,UAAM,qBAAqB,EAAE,GAAG,SAAS,iBAAiB,KAAK,CAAC;AAAA,EAClE,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,sBAAsB,EAC9B,YAAY,wDAAwD,EACpE,OAAO,WAAW,+CAA+C,EACjE,OAAO,uBAAuB,4CAA4C,EAC1E,OAAO,6BAA6B,gDAAgD,EACpF,OAAO,UAAU,8DAA8D,EAC/E,OAAO,OAAO,YAAY;AACzB,MAAI;AACF,UAAM,0BAA0B,EAAE,GAAG,SAAS,iBAAiB,KAAK,CAAC;AAAA,EACvE,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,WAAW,EACnB,YAAY,uDAAuD,EACnE,OAAO,YAAY,oCAAoC,EACvD,OAAO,WAAW,oDAAoD,EACtE,OAAO,UAAU,wBAAwB,EACzC,OAAO,SAAS,oCAAoC,EACpD,OAAO,SAAS,2BAA2B,EAC3C,OAAO,OAAO,YAAY;AACzB,MAAI;AACF,UAAM,iBAAiB,OAAO;AAAA,EAChC,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,eAAe,EACvB,YAAY,6EAA6E,EACzF,SAAS,eAAe,4CAA4C,EACpE,OAAO,oBAAoB,gCAAgC,EAC3D,OAAO,uBAAuB,mCAAmC,EACjE,OAAO,WAAW,kCAAkC,EACpD,OAAO,gBAAgB,oCAAoC,EAC3D,OAAO,OAAO,WAAW,YAAY;AACpC,MAAI;AACF,UAAM,oBAAoB,WAAW,OAAO;AAAA,EAC9C,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,eAAe,EACvB,YAAY,uEAAuE,EACnF,OAAO,oBAAoB,qBAAqB,EAChD,OAAO,uBAAuB,iBAAiB,EAC/C,OAAO,kBAAkB,mDAAmD,EAC5E;AAAA,EACC;AAAA,EACA;AACF,EACC;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,iBAAiB,gDAAgD,EACxE,OAAO,gBAAgB,oCAAoC,EAC3D,OAAO,wBAAwB,yCAAyC,EACxE,OAAO,OAAO,YAAY;AACzB,MAAI;AACF,UAAM,oBAAoB,OAAO;AAAA,EACnC,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,sDAAsD,EAClE,OAAO,kBAAkB,oCAAoC,QAAQ,EACrE,OAAO,OAAO,YAAY;AACzB,MAAI;AACF,UAAM,cAAc,OAAO;AAAA,EAC7B,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,iBAAiB,EACzB,YAAY,uBAAuB,EACnC,SAAS,UAAU,eAAe,EAClC,OAAO,iBAAiB,8BAA8B,EACtD,OAAO,wBAAwB,sBAAsB,EACrD,OAAO,OAAO,MAAM,YAAY;AAC/B,MAAI;AACF,UAAM,sBAAsB,MAAM,OAAO;AAAA,EAC3C,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,gBAAgB,EACxB,YAAY,oBAAoB,EAChC,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,qBAAqB;AAAA,EAC7B,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QAAQ,WAAW,WAAW;AAC9B,QAAQ,WAAW,aAAa;AAChC,QAAQ,WAAW,aAAa;AAGhC,IAAI,QAAQ,KAAK,UAAU,GAAG;AAC5B,UAAQ,KAAK,KAAK,MAAM,sBAAsB,CAAC;AACjD;AAEA,MAAM,QAAQ,WAAW;","names":["readdir","readFile","rename","writeFile","resolve","projectsDir","readFile","resolve","init_config","extractFrontmatter","parseSimpleValue","parseExternalIds","getField","resolve","readFile","terminalStatuses","resolve","readdir","readFile","projectsDir","assignmentsDir","readdir","readFile","resolve","nowTimestamp","resolve","readdir","readFile","output","projectsDir","assignmentsDir","serversDir","readdir","readFile","writeFile","resolve","dirname","assignmentsDir","c","projectsDir","serversDir","scanAllSessions","terminalStatuses","playbooksDir","init_config","appendLogEntry","readFile","resolve","parseStatus","todosDir","init_parser","projectsDir","err","useState","c","useState","useMemo","useMemo","Box","Text","jsx","start","end","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","projectsDir","input","spawn","mkdir","writeFile","resolve","projectsDir","err","Command","resolve","dirname","readdir","readFile","resolve","playbooksDir","projectsDir","resolve","playbooksDir","dirname","readdir","readFile","resolve","init_config","resolve","resolve","init_config","resolve","init_config","resolve","dirname","fileURLToPath","resolve","writeFile","unlink","readFile","resolve","resolve","readdir","c","projectsDir","readdir","resolve","readFile","c","db","rows","readFile","resolve","projectsDir","assignmentsDir","projectsDir","assignmentsDir","serversDir","playbooksDir","todosDir","handleStandaloneChange","handleServerChange","handlePlaybookChange","handleTodoChange","init_config","resolve","readFile","extractFrontmatter","formatYamlValue","readFile","projectsDir","assignmentsDir","resolve","input","Router","serversDir","projectsDir","assignmentsDir","Router","resolve","projectsDir","assignmentsDir","Router","resolve","Router","resolve","readFile","unlink","playbooksDir","Router","resolve","readFile","unlink","init_parser","Router","readdir","todosDir","archivePath","resolve","readFile","writeFileForce","appendLogEntry","init_config","Router","init_config","execFile","promisify","rm","readFile","writeFile","unlink","rename","resolve","join","exec","c","resolve","exec","err","readFile","unlink","join","rm","writeFile","rename","Router","err","err","output","serversDir","projectsDir","assignmentsDir","projectsDir","assignmentsDir","serversDir","playbooksDir","todosDir","err","resolve","writeFile","unlink","projectsDir","fileURLToPath","resolve","dirname","err","init_config","resolve","resolve","init_config","init_config","cp","readdir","readFile","rm","unlink","writeFile","homedir","dirname","isAbsolute","relative","resolve","dirname","resolve","fileURLToPath","homedir","resolve","readFile","dirname","manifestName","writeFile","cp","rm","unlink","isAbsolute","relative","readdir","rm","resolve","init_config","promptForInstallPath","init_config","resolve","resolve","init_config","resolve","resolve","init_config","resolve","resolve","init_config","projectsDir","React","App","launchAgent","resolve","resolve","readdir","readFile","resolve","init_parser","readFile","resolve","WORKSPACE_REGEX","appendLogEntry","init_config","Command","Command","Command","fileURLToPath","readFile","dirname","join","init_config","Database","resolve","db","err","resolve","isAbsolute","readFile","stat","fileURLToPath","dirname","join","integrationChecks","resolve","readdir","stat","CATEGORY","pass","playbooksDir","resolve","readdir","stat","CATEGORY","listProjects","pass","resolve","readdir","readFile","CATEGORY","projectsDir","assignmentsDir","requiredFiles","pass","resolve","CATEGORY","pass","err","projectsDir","readdir","CATEGORY","skipped","pass","projectsDir","resolve","readFile","CATEGORY","err","skipped","pass","terminalStatuses","c","skipped","err","version","fileURLToPath","dirname","readFile","join","c","Command","err","init_config","resolve","readFile","setTopLevelField","resolve","readFile","init_config","resolve","readFile","setTopLevelField","resolve","readFile","init_config","readdir","projectsDir","readdir","fileURLToPath","readFile","dirname","join","resolve","spawn","createInterface","fileURLToPath","readFile","dirname","join","resolve","fileURLToPath","readFile","dirname","join","spawn","timer","createInterface","Command"]}